diff --git a/Cargo.lock b/Cargo.lock index 53d54bc9..5b2738fd 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -20,94 +20,72 @@ checksum = "366ffbaa4442f4684d91e2cd7c5ea7c4ed8add41959a31447066e279e432b618" [[package]] name = "accesskit" -version = "0.17.1" +version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3d3b8f9bae46a948369bc4a03e815d4ed6d616bd00de4051133a5019dc31c5a" +checksum = "5351dcebb14b579ccab05f288596b2ae097005be7ee50a7c3d4ca9d0d5a66f6a" +dependencies = [ + "uuid", +] [[package]] -name = "accesskit_atspi_common" -version = "0.10.1" +name = "accesskit_consumer" +version = "0.35.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c5dd55e6e94949498698daf4d48fb5659e824d7abec0d394089656ceaf99d4f" +checksum = "53cf47daed85312e763fbf85ceca136e0d7abc68e0a7e12abe11f48172bc3b10" dependencies = [ "accesskit", - "accesskit_consumer", - "atspi-common", - "serde", - "thiserror 1.0.69", - "zvariant", + "hashbrown 0.16.1", ] [[package]] name = "accesskit_consumer" -version = "0.26.0" +version = "0.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f47983a1084940ba9a39c077a8c63e55c619388be5476ac04c804cfbd1e63459" +checksum = "25e0d7e25d06f4dc21d1774d67146e9e80d6789216cbd4d1e88185b0095dba60" dependencies = [ "accesskit", - "hashbrown 0.15.5", - "immutable-chunkmap", + "hashbrown 0.16.1", ] [[package]] name = "accesskit_macos" -version = "0.18.1" +version = "0.26.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7329821f3bd1101e03a7d2e03bd339e3ac0dc64c70b4c9f9ae1949e3ba8dece1" +checksum = "4c5c87e8d94f2ec10cce590aadff24c76f576dab5502d45d0aed9fc3065d4451" dependencies = [ "accesskit", - "accesskit_consumer", - "hashbrown 0.15.5", + "accesskit_consumer 0.36.0", + "hashbrown 0.16.1", "objc2 0.5.2", "objc2-app-kit 0.2.2", "objc2-foundation 0.2.2", ] -[[package]] -name = "accesskit_unix" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcee751cc20d88678c33edaf9c07e8b693cd02819fe89053776f5313492273f5" -dependencies = [ - "accesskit", - "accesskit_atspi_common", - "async-channel", - "async-executor", - "async-task", - "atspi", - "futures-lite", - "futures-util", - "serde", - "zbus", -] - [[package]] name = "accesskit_windows" -version = "0.24.1" +version = "0.32.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24fcd5d23d70670992b823e735e859374d694a3d12bfd8dd32bd3bd8bedb5d81" +checksum = "eff7009f1a532e917d66970a1e80c965140c6cfbbabbdde3d64e5431e6c78e21" dependencies = [ "accesskit", - "accesskit_consumer", - "hashbrown 0.15.5", - "paste", + "accesskit_consumer 0.35.0", + "hashbrown 0.16.1", "static_assertions", - "windows 0.58.0", - "windows-core 0.58.0", + "windows 0.62.2", + "windows-core 0.62.2", ] [[package]] -name = "accesskit_winit" -version = "0.23.1" +name = "accesskit_xplat" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6a48dad5530b6deb9fc7a52cc6c3bf72cdd9eb8157ac9d32d69f2427a5e879" +checksum = "bbb69cd9e9ca89e4bb0ac98821c509849d5e51c6ae8c96bddf7b0c97579b839a" dependencies = [ "accesskit", "accesskit_macos", - "accesskit_unix", "accesskit_windows", + "android-activity", "raw-window-handle 0.6.2", - "winit", ] [[package]] @@ -147,6 +125,21 @@ dependencies = [ "equator", ] +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + [[package]] name = "allocator-api2" version = "0.2.21" @@ -169,7 +162,7 @@ dependencies = [ "log", "ndk", "ndk-context", - "ndk-sys 0.6.0+11769913", + "ndk-sys", "num_enum", "thiserror 1.0.69", ] @@ -197,58 +190,62 @@ checksum = "7f202df86484c868dbad7eaa557ef785d5c66295e41b460ef922eca0723b842c" [[package]] name = "anyrender" -version = "0.6.2" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e2c6900aa6fa601379c17b824d0882c5c4ffd2f974124b273ba083b64f76077" +checksum = "74dcad75fbef1209804ee5d1cfd7409665c5a7987865c758e45f8c5553f9a75f" dependencies = [ - "kurbo 0.12.0", + "kurbo", "peniko", "raw-window-handle 0.6.2", ] [[package]] name = "anyrender_svg" -version = "0.6.3" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f40554c3b19e6298c6210d21902796cb02f4dd1a472f393bb94a067c2c9562bc" +checksum = "bb301bceaa7b9089211acb35f15b46aad96c433e63043d4a2ec4f2f83c4818df" dependencies = [ "anyrender", "image", - "kurbo 0.12.0", + "kurbo", "peniko", - "thiserror 2.0.18", "usvg", ] [[package]] -name = "anyrender_vello" -version = "0.6.2" +name = "anyrender_vello_cpu" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd9574a872584fa9c7be06ed8be1c4875aeae37e74a567597125f3ec4579bd3" +checksum = "379caa953b953149c002c4a956443e09771b432b74e1c7074af26a8854a93ae7" dependencies = [ "anyrender", "debug_timer", - "kurbo 0.12.0", + "glifo", + "kurbo", "peniko", - "pollster 0.4.0", - "rustc-hash 2.1.2", - "vello", - "wgpu 26.0.1", - "wgpu_context", + "pixels_window_renderer", + "vello_cpu", ] [[package]] -name = "anyrender_vello_cpu" -version = "0.8.1" +name = "anyrender_vello_hybrid" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53ab47fd3c17dd144010b079f07e106b9d5d982c2916dcf73e8ad2f611d5becd" +checksum = "61b6de3eb188f15d7782e37d086b1a06bc835043e52c2f836e64a1de0e1a2ee6" dependencies = [ "anyrender", "debug_timer", - "kurbo 0.12.0", + "futures-channel", + "glifo", + "kurbo", "peniko", - "pixels_window_renderer", - "vello_cpu", + "pollster", + "rustc-hash 2.1.2", + "vello_common", + "vello_hybrid", + "wasm-bindgen-futures", + "wgpu", + "wgpu_context", ] [[package]] @@ -399,15 +396,6 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" -[[package]] -name = "ash" -version = "0.37.3+1.3.251" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" -dependencies = [ - "libloading 0.7.4", -] - [[package]] name = "ash" version = "0.38.0+1.3.281" @@ -423,131 +411,6 @@ version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3df27b8d5ddb458c5fb1bbc1ce172d4a38c614a97d550b0ac89003897fb01de4" -[[package]] -name = "async-broadcast" -version = "0.7.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" -dependencies = [ - "event-listener", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-channel" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" -dependencies = [ - "concurrent-queue", - "event-listener-strategy", - "futures-core", - "pin-project-lite", -] - -[[package]] -name = "async-executor" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" -dependencies = [ - "async-task", - "concurrent-queue", - "fastrand", - "futures-lite", - "pin-project-lite", - "slab", -] - -[[package]] -name = "async-fs" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" -dependencies = [ - "async-lock", - "blocking", - "futures-lite", -] - -[[package]] -name = "async-io" -version = "2.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" -dependencies = [ - "autocfg", - "cfg-if", - "concurrent-queue", - "futures-io", - "futures-lite", - "parking", - "polling", - "rustix 1.1.4", - "slab", - "windows-sys 0.61.2", -] - -[[package]] -name = "async-lock" -version = "3.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" -dependencies = [ - "event-listener", - "event-listener-strategy", - "pin-project-lite", -] - -[[package]] -name = "async-process" -version = "2.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" -dependencies = [ - "async-channel", - "async-io", - "async-lock", - "async-signal", - "async-task", - "blocking", - "cfg-if", - "event-listener", - "futures-lite", - "rustix 1.1.4", -] - -[[package]] -name = "async-recursion" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - -[[package]] -name = "async-signal" -version = "0.2.13" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" -dependencies = [ - "async-io", - "async-lock", - "atomic-waker", - "cfg-if", - "futures-core", - "futures-io", - "rustix 1.1.4", - "signal-hook-registry", - "slab", - "windows-sys 0.61.2", -] - [[package]] name = "async-stream" version = "0.3.6" @@ -570,12 +433,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "async-task" -version = "4.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" - [[package]] name = "async-trait" version = "0.1.89" @@ -638,57 +495,6 @@ version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "21e4227379beff4205943696e6c3e0cd809bacdf3f0edd6e3dd153e2269571a4" -[[package]] -name = "atspi" -version = "0.22.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be534b16650e35237bb1ed189ba2aab86ce65e88cc84c66f4935ba38575cecbf" -dependencies = [ - "atspi-common", - "atspi-connection", - "atspi-proxies", -] - -[[package]] -name = "atspi-common" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1909ed2dc01d0a17505d89311d192518507e8a056a48148e3598fef5e7bb6ba7" -dependencies = [ - "enumflags2", - "serde", - "static_assertions", - "zbus", - "zbus-lockstep", - "zbus-lockstep-macros", - "zbus_names", - "zvariant", -] - -[[package]] -name = "atspi-connection" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "430c5960624a4baaa511c9c0fcc2218e3b58f5dbcc47e6190cafee344b873333" -dependencies = [ - "atspi-common", - "atspi-proxies", - "futures-lite", - "zbus", -] - -[[package]] -name = "atspi-proxies" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5e6c5de3e524cf967569722446bcd458d5032348554d9a17d7d72b041ab7496" -dependencies = [ - "atspi-common", - "serde", - "zbus", - "zvariant", -] - [[package]] name = "autocfg" version = "1.5.0" @@ -823,33 +629,18 @@ checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" [[package]] name = "bit-set" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" -dependencies = [ - "bit-vec 0.6.3", -] - -[[package]] -name = "bit-set" -version = "0.8.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +checksum = "34ddef2995421ab6a5c779542c81ee77c115206f4ad9d5a8e05f4ff49716a3dd" dependencies = [ - "bit-vec 0.8.0", + "bit-vec", ] [[package]] name = "bit-vec" -version = "0.6.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" - -[[package]] -name = "bit-vec" -version = "0.8.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" +checksum = "b71798fca2c1fe1086445a7258a4bc81e6e49dcd24c8d0dd9a1e57395b603f51" [[package]] name = "bit_field" @@ -880,73 +671,78 @@ checksum = "6099cdc01846bc367c4e7dd630dc5966dccf36b652fae7a74e17b640411a91b2" [[package]] name = "blitz-dom" -version = "0.2.4" +version = "0.3.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c81d0f520bad6798a54cc4360bcabd245dc0aba2ce5917217d1d82ac5ee6bfed" +checksum = "38802275fbb85def2369e7c3abf2fea63fdf2dd8821a457264171cb072b7e6dd" dependencies = [ "accesskit", + "anyrender", "app_units", "atomic_refcell", "bitflags 2.11.1", "blitz-traits", "color", - "cssparser 0.35.0", + "cssparser 0.37.0", "cursor-icon", "debug_timer", "euclid", - "fastrand", "html-escape", "image", - "keyboard-types", + "keyboard-types 0.7.0", + "kurbo", "linebender_resource_handle", - "markup5ever 0.35.0", + "markup5ever 0.39.0", "objc2 0.6.4", "parley", "percent-encoding", "rayon", - "selectors 0.32.0", - "skrifa 0.37.0", + "selectors 0.38.0", + "skrifa", "slab", "smallvec", "stylo", - "stylo_config", "stylo_dom", + "stylo_static_prefs", "stylo_taffy", "stylo_traits", "taffy", + "thread_local", "url", "usvg", + "web-time", + "wuff", ] [[package]] name = "blitz-html" -version = "0.2.0" +version = "0.3.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e77adcd3cb60e67d365bc897c6120ecb684627f2e2265c2bb75b12cc6c4bc4de" +checksum = "8251f0fddea8d44883ebec049480f44fe68b7c4b917f8f3af8010f53aa0706bc" dependencies = [ "blitz-dom", "blitz-traits", - "html5ever 0.35.0", + "html5ever 0.39.0", "xml5ever", ] [[package]] name = "blitz-net" -version = "0.2.1" +version = "0.3.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0583c80a179a95a08adeb30c6c25dfeaa9d6e9314072f3c81a7976dee8d7a562" +checksum = "594214a6e88384ea7aa2136954073b174305ec6550c1f4bcfd9bfab4ce599b96" dependencies = [ "blitz-traits", "data-url", - "reqwest", + "reqwest 0.13.3", "tokio", + "wasm-bindgen-futures", ] [[package]] name = "blitz-paint" -version = "0.2.1" +version = "0.3.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "027aa42b3795589c9d7ae0238ac3087f9f22b58f9643fc22c4dc1ef1ef3413b2" +checksum = "0b42e521d60fb0ad6d627eed4aedab30f8b3d4719cb66ce97a34cd9ee3ed43c2" dependencies = [ "anyrender", "anyrender_svg", @@ -954,7 +750,7 @@ dependencies = [ "blitz-traits", "color", "euclid", - "kurbo 0.12.0", + "kurbo", "parley", "peniko", "stylo", @@ -964,12 +760,12 @@ dependencies = [ [[package]] name = "blitz-shell" -version = "0.2.3" +version = "0.3.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "61ecda230035f39b13383f08e0cfc7159c92d194650ac8d57871a207ea0e52b7" +checksum = "840d4beafb9ae791bd05682403cc8a1d9d69a5d4a28588a10c2080eb3f98ce23" dependencies = [ "accesskit", - "accesskit_winit", + "accesskit_xplat", "android-activity", "anyrender", "arboard", @@ -977,33 +773,30 @@ dependencies = [ "blitz-paint", "blitz-traits", "futures-util", - "keyboard-types", + "keyboard-types 0.7.0", "rfd", + "wasm-bindgen", + "web-sys", + "web-time", "winit", ] [[package]] name = "blitz-traits" -version = "0.2.0" +version = "0.3.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6cd87a5b7bc1bc3d546aeb28d0867ff3191e9c4e85452e1808931200a4bc49d4" +checksum = "7a69aad4292231416c2f1becdff3d9353be59556321c95071b66a0fc57e22d94" dependencies = [ "bitflags 2.11.1", "bytes", "cursor-icon", "http", - "keyboard-types", + "keyboard-types 0.7.0", "serde", "smol_str", "url", ] -[[package]] -name = "block" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" - [[package]] name = "block-buffer" version = "0.10.4" @@ -1032,16 +825,23 @@ dependencies = [ ] [[package]] -name = "blocking" -version = "1.6.2" +name = "borsh" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +checksum = "cfd1e3f8955a5d7de9fab72fc8373fade9fb8a703968cb200ae3dc6cf08e185a" dependencies = [ - "async-channel", - "async-task", - "futures-io", - "futures-lite", - "piper", + "bytes", + "cfg_aliases", +] + +[[package]] +name = "brotli-decompressor" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "874bb8112abecc98cbd6d81ea4fa7e94fb9449648c93cc89aa40c81c24d7de03" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", ] [[package]] @@ -1130,26 +930,25 @@ dependencies = [ [[package]] name = "calloop" -version = "0.13.0" +version = "0.14.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" dependencies = [ "bitflags 2.11.1", - "log", "polling", - "rustix 0.38.44", + "rustix", "slab", - "thiserror 1.0.69", + "tracing", ] [[package]] name = "calloop-wayland-source" -version = "0.3.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" dependencies = [ "calloop", - "rustix 0.38.44", + "rustix", "wayland-backend", "wayland-client", ] @@ -1199,12 +998,6 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" -[[package]] -name = "cfg_aliases" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" - [[package]] name = "cfg_aliases" version = "0.2.1" @@ -1271,101 +1064,31 @@ dependencies = [ ] [[package]] -name = "cocoa" -version = "0.26.1" +name = "codespan-reporting" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad36507aeb7e16159dfe68db81ccc27571c3ccd4b76fb2fb72fc59e7a4b1b64c" +checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" dependencies = [ - "bitflags 2.11.1", - "block", - "cocoa-foundation", - "core-foundation 0.10.1", - "core-graphics 0.24.0", - "foreign-types 0.5.0", - "libc", - "objc", + "serde", + "termcolor", + "unicode-width 0.1.14", ] [[package]] -name = "cocoa-foundation" -version = "0.2.1" +name = "color" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81411967c50ee9a1fc11365f8c585f863a22a9697c89239c452292c40ba79b0d" +checksum = "2ec7c5eb7a16992b1904d76c517d170ab353b0e0b3d5a0c81a8a0cd1037893cf" dependencies = [ - "bitflags 2.11.1", - "block", - "core-foundation 0.10.1", - "core-graphics-types 0.2.0", - "objc", + "bytemuck", ] [[package]] -name = "codespan-reporting" -version = "0.11.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" -dependencies = [ - "termcolor", - "unicode-width 0.1.14", -] - -[[package]] -name = "codespan-reporting" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" -dependencies = [ - "serde", - "termcolor", - "unicode-width 0.2.2", -] - -[[package]] -name = "color" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2ec7c5eb7a16992b1904d76c517d170ab353b0e0b3d5a0c81a8a0cd1037893cf" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "color_quant" -version = "1.1.0" +name = "color_quant" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" -[[package]] -name = "com" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6" -dependencies = [ - "com_macros", -] - -[[package]] -name = "com_macros" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5" -dependencies = [ - "com_macros_support", - "proc-macro2", - "syn 1.0.109", -] - -[[package]] -name = "com_macros_support" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c" -dependencies = [ - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "combine" version = "4.6.7" @@ -1397,8 +1120,6 @@ dependencies = [ [[package]] name = "const-serialize" version = "0.8.0-alpha.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9e42cd5aabba86f128b3763da1fec1491c0f728ce99245062cd49b6f9e6d235b" dependencies = [ "const-serialize 0.7.2", "const-serialize-macro 0.8.0-alpha.0", @@ -1419,8 +1140,6 @@ dependencies = [ [[package]] name = "const-serialize-macro" version = "0.8.0-alpha.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42571ed01eb46d2e1adcf99c8ca576f081e46f2623d13500eba70d1d99a4c439" dependencies = [ "proc-macro2", "quote", @@ -1533,32 +1252,6 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" -[[package]] -name = "core-graphics" -version = "0.23.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "core-graphics-types 0.1.3", - "foreign-types 0.5.0", - "libc", -] - -[[package]] -name = "core-graphics" -version = "0.24.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" -dependencies = [ - "bitflags 2.11.1", - "core-foundation 0.10.1", - "core-graphics-types 0.2.0", - "foreign-types 0.5.0", - "libc", -] - [[package]] name = "core-graphics" version = "0.25.0" @@ -1567,22 +1260,11 @@ checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" dependencies = [ "bitflags 2.11.1", "core-foundation 0.10.1", - "core-graphics-types 0.2.0", + "core-graphics-types", "foreign-types 0.5.0", "libc", ] -[[package]] -name = "core-graphics-types" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.9.4", - "libc", -] - [[package]] name = "core-graphics-types" version = "0.2.0" @@ -1677,7 +1359,7 @@ version = "0.29.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" dependencies = [ - "cssparser-macros", + "cssparser-macros 0.6.1", "dtoa-short", "itoa", "matches", @@ -1690,14 +1372,14 @@ dependencies = [ [[package]] name = "cssparser" -version = "0.35.0" +version = "0.37.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e901edd733a1472f944a45116df3f846f54d37e67e68640ac8bb69689aca2aa" +checksum = "8c9cdaae01d5ed7882b04d795e7f752f46ff52d2fa3b50a20d28c464510bba98" dependencies = [ - "cssparser-macros", + "cssparser-macros 0.7.0", "dtoa-short", "itoa", - "phf 0.11.3", + "phf 0.13.1", "serde", "smallvec", ] @@ -1713,21 +1395,20 @@ dependencies = [ ] [[package]] -name = "cursor-icon" -version = "1.2.0" +name = "cssparser-macros" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" +checksum = "10a2a99df6e410a8ff4245aa2006499ea662245f967cc7c0a38c83ef8eb44dbf" +dependencies = [ + "quote", + "syn 2.0.117", +] [[package]] -name = "d3d12" -version = "0.19.0" +name = "cursor-icon" +version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e3d747f100290a1ca24b752186f61f6637e1deffe3bf6320de6fcb29510a307" -dependencies = [ - "bitflags 2.11.1", - "libloading 0.8.9", - "winapi", -] +checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" [[package]] name = "darling" @@ -1885,8 +1566,6 @@ dependencies = [ [[package]] name = "dioxus" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c01ecf7ddbae18a419ad3d83c486101a85ffc5740ea09cdd0f09a30dc12170d" dependencies = [ "dioxus-asset-resolver", "dioxus-cli-config", @@ -1920,8 +1599,6 @@ dependencies = [ [[package]] name = "dioxus-asset-resolver" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "69387edbbc60c7cb93ad96d8cc7a22b49a76e21643380b89b1c49a78d347ff60" dependencies = [ "dioxus-cli-config", "http", @@ -1930,7 +1607,7 @@ dependencies = [ "js-sys", "ndk", "ndk-context", - "ndk-sys 0.6.0+11769913", + "ndk-sys", "percent-encoding", "thiserror 2.0.18", "tokio", @@ -1951,8 +1628,6 @@ dependencies = [ [[package]] name = "dioxus-cli-config" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c000f584ddf608e2b272b3074bf11512a474eeeb2eb85a1915f276ce5c4a8615" dependencies = [ "wasm-bindgen", ] @@ -1988,8 +1663,6 @@ dependencies = [ [[package]] name = "dioxus-config-macro" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7637091592978fbfdb45a16b26bd99fd97fb1bd7e31c6a963530e00c022af321" dependencies = [ "proc-macro2", "quote", @@ -1998,14 +1671,10 @@ dependencies = [ [[package]] name = "dioxus-config-macros" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54f9ed8fc1a215ad34bb8dbae42a4ea54efbcd26ca9006bbe5cca78e511bf25f" [[package]] name = "dioxus-core" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45887100ff0cf89abeb8b659808294fda48cd53f3b424e36407dedffcfea830b" dependencies = [ "anyhow", "const_format", @@ -2021,13 +1690,12 @@ dependencies = [ "slotmap", "subsecond", "tracing", + "xxhash-rust", ] [[package]] name = "dioxus-core-macro" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "370c63663dff0f24df5dfea643ca239283542c6b228a302f69b32e1d36762b7f" dependencies = [ "convert_case 0.8.0", "dioxus-rsx", @@ -2039,21 +1707,15 @@ dependencies = [ [[package]] name = "dioxus-core-types" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "36963eab106b169737762f9cd5ee5fd97f585989dcb2d8e30a596e97a6999009" [[package]] name = "dioxus-desktop" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "662cd78c73ca3f17346adbf2d64757df40dd0ce20536c05123097fd31828d2bd" dependencies = [ "anyhow", "async-trait", "base64", "bytes", - "cocoa", - "core-foundation 0.10.1", "dioxus-asset-resolver", "dioxus-cli-config", "dioxus-core", @@ -2072,14 +1734,16 @@ dependencies = [ "image", "infer", "jni", - "lazy-js-bundle", + "lazy-js-bundle 0.7.9", "libc", "muda", "ndk", "ndk-context", - "ndk-sys 0.6.0+11769913", - "objc", - "objc_id", + "ndk-sys", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "objc2-ui-kit", "percent-encoding", "rand 0.9.4", "rfd", @@ -2102,8 +1766,6 @@ dependencies = [ [[package]] name = "dioxus-devtools" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2349cedbdf1b429df1f1bea61fdee0ad3dae7b2548eedfbeca82710122a57da0" dependencies = [ "dioxus-cli-config", "dioxus-core", @@ -2122,8 +1784,6 @@ dependencies = [ [[package]] name = "dioxus-devtools-types" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab9b0f7565d1916b70915f59b89ea8054ef0a9d67a364a32bbee68ef5f3818d" dependencies = [ "dioxus-core", "serde", @@ -2133,8 +1793,6 @@ dependencies = [ [[package]] name = "dioxus-document" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37e3a5bec7ffc999ff23446a487eb5cd86111d1574a23533dd3f8b3c69a53a22" dependencies = [ "dioxus-core", "dioxus-core-macro", @@ -2143,7 +1801,7 @@ dependencies = [ "futures-channel", "futures-util", "generational-box", - "lazy-js-bundle", + "lazy-js-bundle 0.7.9", "serde", "serde_json", "tracing", @@ -2152,8 +1810,6 @@ dependencies = [ [[package]] name = "dioxus-fullstack" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37f0558edb88af5ad47275ae36a7f06317163ba482db377c26d7d8590b5cd0f6" dependencies = [ "anyhow", "async-stream", @@ -2189,7 +1845,7 @@ dependencies = [ "js-sys", "mime", "pin-project", - "reqwest", + "reqwest 0.12.28", "rustversion", "send_wrapper", "serde", @@ -2217,8 +1873,6 @@ dependencies = [ [[package]] name = "dioxus-fullstack-core" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc634b28b4b1e3eab1e8df4f98510e2d2fa39d686321467f977213155e86ed2b" dependencies = [ "anyhow", "axum-core", @@ -2245,8 +1899,6 @@ dependencies = [ [[package]] name = "dioxus-fullstack-macro" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85a8fe7da549859fae00c7f4bf11a2aab734ae7ef6f98f280dce9bea1f3326ec" dependencies = [ "const_format", "convert_case 0.8.0", @@ -2259,8 +1911,6 @@ dependencies = [ [[package]] name = "dioxus-history" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a15232302d1933015fcf2d6fe9e286ad36f6e9c205a546089a0f326023bb0d2" dependencies = [ "dioxus-core", "tracing", @@ -2269,8 +1919,6 @@ dependencies = [ [[package]] name = "dioxus-hooks" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4534f91cf6305204b948bdec130076ac9ecc7c22faab29475b76870558bf73ea" dependencies = [ "dioxus-core", "dioxus-signals", @@ -2285,8 +1933,6 @@ dependencies = [ [[package]] name = "dioxus-html" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e03d6ad4040b667f2b2eefcb678840e630938c09bf9ec39b04ea4d1d96d90d44" dependencies = [ "async-trait", "bytes", @@ -2300,8 +1946,8 @@ dependencies = [ "futures-channel", "futures-util", "generational-box", - "keyboard-types", - "lazy-js-bundle", + "keyboard-types 0.7.0", + "lazy-js-bundle 0.7.9", "rustversion", "serde", "serde_json", @@ -2312,8 +1958,6 @@ dependencies = [ [[package]] name = "dioxus-html-internal-macro" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "584e2772127ab00f0d5e1d4d9795f39fecebc828ece0b7a02349d438bc1b1ce7" dependencies = [ "convert_case 0.8.0", "proc-macro2", @@ -2336,25 +1980,22 @@ dependencies = [ [[package]] name = "dioxus-icons" version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6ae929a4cdde2e51fca98ccb8a8fe2ea11640e5026c57486b15dbd5618ba7e56" +source = "git+https://github.com/ealmloff/dioxus-icons?branch=bump-dioxus#5a6acdd0a15d4aea7b2b8271327b286d1f467d44" dependencies = [ "dioxus", "dioxus-signals", - "lazy-js-bundle", + "lazy-js-bundle 0.7.9", ] [[package]] name = "dioxus-interpreter-js" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11999d6eb5bb179a9512dad30e5de408aab66f2cb65de9098c9fbe02927e2978" dependencies = [ "dioxus-core", "dioxus-core-types", "dioxus-html", "js-sys", - "lazy-js-bundle", + "lazy-js-bundle 0.7.9", "rustc-hash 2.1.2", "serde", "sledgehammer_bindgen", @@ -2367,8 +2008,6 @@ dependencies = [ [[package]] name = "dioxus-liveview" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7344b8f174967c7d2f6ad0103d680ab57daea83ebe3368f7f011c402fd6aaf77" dependencies = [ "axum", "dioxus-cli-config", @@ -2395,8 +2034,6 @@ dependencies = [ [[package]] name = "dioxus-logger" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a28ccdfe36d2cb830a2784e40f7e6f7199805a2c6da99bd65b1ca308f11aed28" dependencies = [ "dioxus-cli-config", "tracing", @@ -2407,18 +2044,18 @@ dependencies = [ [[package]] name = "dioxus-native" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a27795b6b4c12e2dc6ef284f80dd647d5aecda4c0b75948ba4ecde7f83c526d4" dependencies = [ + "android-activity", "anyrender", - "anyrender_vello", "anyrender_vello_cpu", + "anyrender_vello_hybrid", "blitz-dom", "blitz-html", "blitz-net", "blitz-paint", "blitz-shell", "blitz-traits", + "cfg-if", "dioxus-asset-resolver", "dioxus-cli-config", "dioxus-core", @@ -2428,25 +2065,24 @@ dependencies = [ "dioxus-html", "dioxus-native-dom", "futures-util", - "keyboard-types", + "keyboard-types 0.7.0", "rustc-hash 2.1.2", "tokio", "webbrowser", + "wgpu_context", "winit", ] [[package]] name = "dioxus-native-dom" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf20d08ad6f5f0714d28b2115a6e11f2d5b5959144f8bef106c2e0638a8f2f13" dependencies = [ "blitz-dom", "blitz-traits", "dioxus-core", "dioxus-html", "futures-util", - "keyboard-types", + "keyboard-types 0.7.0", "rustc-hash 2.1.2", ] @@ -2458,7 +2094,7 @@ dependencies = [ "dioxus-attributes", "dioxus-sdk-time", "dioxus-ssr", - "lazy-js-bundle", + "lazy-js-bundle 0.7.9 (registry+https://github.com/rust-lang/crates.io-index)", "num-integer", "palette", "serde", @@ -2469,8 +2105,6 @@ dependencies = [ [[package]] name = "dioxus-router" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38e47f62d680429badfcb99bf5dec17ee92b0cb9623f264e36bc003a1359bfdc" dependencies = [ "dioxus-cli-config", "dioxus-core", @@ -2490,8 +2124,6 @@ dependencies = [ [[package]] name = "dioxus-router-macro" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f83fb667d27e256f8c9eca49963fbace66a8722cb64ee15a10ffc97d092357e" dependencies = [ "base16", "digest", @@ -2505,8 +2137,6 @@ dependencies = [ [[package]] name = "dioxus-rsx" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2106afda239a4c7c22ffa1ca19117011225fc1c735c139c0a5b765996aa8bb1d" dependencies = [ "proc-macro2", "proc-macro2-diagnostics", @@ -2530,8 +2160,6 @@ dependencies = [ [[package]] name = "dioxus-server" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5ba2095c16f847d3f680a94cc9b0637d190aace651ecfad0feda180da13634b" dependencies = [ "anyhow", "async-trait", @@ -2588,8 +2216,6 @@ dependencies = [ [[package]] name = "dioxus-signals" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3705754f5e043deec9fc7af0d159f18e5b21c02c47d255c7e477f31368f0b6d2" dependencies = [ "dioxus-core", "futures-channel", @@ -2604,8 +2230,6 @@ dependencies = [ [[package]] name = "dioxus-ssr" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d261c5c9907b84fb1ed52f59f46d68c84a4ae860a65cc5effd0cea740ee428af" dependencies = [ "askama_escape", "dioxus-core", @@ -2616,8 +2240,6 @@ dependencies = [ [[package]] name = "dioxus-stores" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64bec7b21c86b1360ec965a07a53a2c96b7caee3465049e1c299a45024e87614" dependencies = [ "dioxus-core", "dioxus-signals", @@ -2628,8 +2250,6 @@ dependencies = [ [[package]] name = "dioxus-stores-macro" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a5875e9f890f27b1cc3e5b56c1e23601211470315a1fb8627c4ca4f3b2be9a" dependencies = [ "convert_case 0.8.0", "proc-macro2", @@ -2640,8 +2260,6 @@ dependencies = [ [[package]] name = "dioxus-web" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc0a0be76b404e8242a597db0fb239d05f8dee4e7856bc1fc7144f7e244822fd" dependencies = [ "dioxus-cli-config", "dioxus-core", @@ -2658,7 +2276,7 @@ dependencies = [ "generational-box", "gloo-timers", "js-sys", - "lazy-js-bundle", + "lazy-js-bundle 0.7.9", "rustc-hash 2.1.2", "send_wrapper", "serde", @@ -2692,12 +2310,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "dispatch" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" - [[package]] name = "dispatch2" version = "0.3.1" @@ -2821,33 +2433,6 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "endi" -version = "1.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" - -[[package]] -name = "enumflags2" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" -dependencies = [ - "enumflags2_derive", - "serde", -] - -[[package]] -name = "enumflags2_derive" -version = "0.7.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "enumset" version = "1.1.12" @@ -2921,27 +2506,6 @@ dependencies = [ "serde", ] -[[package]] -name = "event-listener" -version = "5.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" -dependencies = [ - "concurrent-queue", - "parking", - "pin-project-lite", -] - -[[package]] -name = "event-listener-strategy" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" -dependencies = [ - "event-listener", - "pin-project-lite", -] - [[package]] name = "exr" version = "1.74.0" @@ -2980,12 +2544,9 @@ dependencies = [ [[package]] name = "fearless_simd" -version = "0.3.0" +version = "0.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8fb2907d1f08b2b316b9223ced5b0e89d87028ba8deae9764741dba8ff7f3903" -dependencies = [ - "bytemuck", -] +checksum = "b97b65636e5b9ef369943878ac74335ba1c55c1cb6adbf1e2c293c624248d693" [[package]] name = "field-offset" @@ -3084,18 +2645,9 @@ checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" [[package]] name = "font-types" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02a596f5713680923a2080d86de50fe472fb290693cf0f701187a1c8b36996b7" -dependencies = [ - "bytemuck", -] - -[[package]] -name = "font-types" -version = "0.10.1" +version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39a654f404bbcbd48ea58c617c2993ee91d1cb63727a37bf2323a4edeed1b8c5" +checksum = "5b38ad915f6dadd993ced50848a8291a543bd41ca62bc10740d5e64e2ab4cfd7" dependencies = [ "bytemuck", ] @@ -3106,7 +2658,7 @@ version = "0.5.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" dependencies = [ - "roxmltree", + "roxmltree 0.20.0", ] [[package]] @@ -3125,24 +2677,23 @@ dependencies = [ [[package]] name = "fontique" -version = "0.6.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff3336bc0b87fe42305047263fa60d2eabd650d29cbe62fdeb2a66c7a0a595f9" +checksum = "7c20b425addb8661e97fe1d51c4d8bcec3ec29ed6ad0db983976a7521276b8f7" dependencies = [ - "bytemuck", - "hashbrown 0.15.5", - "icu_locale_core", + "hashbrown 0.17.1", "linebender_resource_handle", "memmap2", "objc2 0.6.4", "objc2-core-foundation", "objc2-core-text", "objc2-foundation 0.3.2", - "read-fonts 0.35.0", - "roxmltree", + "parlance", + "read-fonts", + "roxmltree 0.21.1", "smallvec", - "windows 0.58.0", - "windows-core 0.58.0", + "windows 0.62.2", + "windows-core 0.62.2", "yeslogic-fontconfig-sys", ] @@ -3266,19 +2817,6 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" -[[package]] -name = "futures-lite" -version = "2.6.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" -dependencies = [ - "fastrand", - "futures-core", - "futures-io", - "parking", - "pin-project-lite", -] - [[package]] name = "futures-macro" version = "0.3.32" @@ -3416,8 +2954,6 @@ dependencies = [ [[package]] name = "generational-box" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd0d825b8d339701ad330dbcd6399519ced4d143484954daf6e3185dace4f77" dependencies = [ "parking_lot", "tracing", @@ -3439,7 +2975,7 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" dependencies = [ - "rustix 1.1.4", + "rustix", "windows-link 0.2.1", ] @@ -3590,6 +3126,22 @@ dependencies = [ "system-deps", ] +[[package]] +name = "glifo" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae9d48c6d81526ad2f9d5d6e5fddf5f6949ffbc46fcac0db0d061a6e65097019" +dependencies = [ + "bytemuck", + "foldhash 0.2.0", + "hashbrown 0.17.1", + "log", + "peniko", + "skrifa", + "smallvec", + "vello_common", +] + [[package]] name = "global-hotkey" version = "0.7.0" @@ -3597,7 +3149,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9247516746aa8e53411a0db9b62b0e24efbcf6a76e0ba73e5a91b512ddabed7" dependencies = [ "crossbeam-channel", - "keyboard-types", + "keyboard-types 0.7.0", "objc2 0.6.4", "objc2-app-kit 0.3.2", "once_cell", @@ -3655,21 +3207,9 @@ dependencies = [ [[package]] name = "glow" -version = "0.13.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" -dependencies = [ - "js-sys", - "slotmap", - "wasm-bindgen", - "web-sys", -] - -[[package]] -name = "glow" -version = "0.16.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" +checksum = "29038e1c483364cc6bb3cf78feee1816002e127c331a1eec55a4d202b9e1adb5" dependencies = [ "js-sys", "slotmap", @@ -3677,15 +3217,6 @@ dependencies = [ "web-sys", ] -[[package]] -name = "glutin_wgl_sys" -version = "0.5.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc424362ead" -dependencies = [ - "gl_generator", -] - [[package]] name = "glutin_wgl_sys" version = "0.6.1" @@ -3707,60 +3238,19 @@ dependencies = [ ] [[package]] -name = "gpu-alloc" -version = "0.6.0" +name = "gpu-allocator" +version = "0.28.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" -dependencies = [ - "bitflags 2.11.1", - "gpu-alloc-types", -] - -[[package]] -name = "gpu-alloc-types" -version = "0.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" -dependencies = [ - "bitflags 2.11.1", -] - -[[package]] -name = "gpu-allocator" -version = "0.25.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f56f6318968d03c18e1bcf4857ff88c61157e9da8e47c5f29055d60e1228884" -dependencies = [ - "log", - "presser", - "thiserror 1.0.69", - "winapi", - "windows 0.52.0", -] - -[[package]] -name = "gpu-allocator" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c151a2a5ef800297b4e79efa4f4bec035c5f51d5ae587287c9b952bdf734cacd" +checksum = "51255ea7cfaadb6c5f1528d43e92a82acb2b96c43365989a28b2d44ee38f8795" dependencies = [ + "ash", + "hashbrown 0.16.1", "log", "presser", - "thiserror 1.0.69", + "thiserror 2.0.18", "windows 0.58.0", ] -[[package]] -name = "gpu-descriptor" -version = "0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" -dependencies = [ - "bitflags 2.11.1", - "gpu-descriptor-types 0.1.2", - "hashbrown 0.14.5", -] - [[package]] name = "gpu-descriptor" version = "0.3.2" @@ -3768,19 +3258,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b89c83349105e3732062a895becfc71a8f921bb71ecbbdd8ff99263e3b53a0ca" dependencies = [ "bitflags 2.11.1", - "gpu-descriptor-types 0.2.0", + "gpu-descriptor-types", "hashbrown 0.15.5", ] -[[package]] -name = "gpu-descriptor-types" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" -dependencies = [ - "bitflags 2.11.1", -] - [[package]] name = "gpu-descriptor-types" version = "0.2.0" @@ -3850,12 +3331,11 @@ dependencies = [ [[package]] name = "guillotiere" -version = "0.6.2" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b62d5865c036cb1393e23c50693df631d3f5d7bcca4c04fe4cc0fd592e74a782" +checksum = "6b17e70c989c36bad147b27a58d148c0741c51448aa5653436547323e524d0ab" dependencies = [ "euclid", - "svg_fmt", ] [[package]] @@ -3891,14 +3371,14 @@ dependencies = [ [[package]] name = "harfrust" -version = "0.3.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92c020db12c71d8a12a3fe7607873cade3a01a6287e29d540c8723276221b9d8" +checksum = "a9ce5e848d21ba97a324266e41c70e0eb5e2577a610c1fbd546e15096f2e8e37" dependencies = [ "bitflags 2.11.1", "bytemuck", "core_maths", - "read-fonts 0.35.0", + "read-fonts", "smallvec", ] @@ -3907,10 +3387,6 @@ name = "hashbrown" version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" -dependencies = [ - "ahash", - "allocator-api2", -] [[package]] name = "hashbrown" @@ -3918,8 +3394,6 @@ version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ - "allocator-api2", - "equivalent", "foldhash 0.1.5", ] @@ -3935,18 +3409,12 @@ dependencies = [ ] [[package]] -name = "hassle-rs" -version = "0.11.0" +name = "hashbrown" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" dependencies = [ - "bitflags 2.11.1", - "com", - "libc", - "libloading 0.8.9", - "thiserror 1.0.69", - "widestring", - "winapi", + "foldhash 0.2.0", ] [[package]] @@ -3991,12 +3459,6 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" -[[package]] -name = "hex" -version = "0.4.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" - [[package]] name = "hexf-parse" version = "0.2.1" @@ -4021,18 +3483,17 @@ dependencies = [ "log", "mac", "markup5ever 0.14.1", - "match_token 0.1.0", + "match_token", ] [[package]] name = "html5ever" -version = "0.35.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55d958c2f74b664487a2035fe1dadb032c48718a03b63f3ab0b8537db8549ed4" +checksum = "46a1761807faccc9a19e86944bbf40610014066306f96edcdedc2fb714bcb7b8" dependencies = [ "log", - "markup5ever 0.35.0", - "match_token 0.35.0", + "markup5ever 0.39.0", ] [[package]] @@ -4198,9 +3659,37 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db2fa452206ebee18c4b5c2274dbf1de17008e874b4dc4f0aea9d01ca79e4526" dependencies = [ "displaydoc", - "yoke", + "yoke 0.7.5", + "zerofrom", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_collections" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" +dependencies = [ + "displaydoc", + "potential_utf", + "yoke 0.8.2", "zerofrom", - "zerovec", + "zerovec 0.11.6", +] + +[[package]] +name = "icu_locale" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "532b11722e350ab6bf916ba6eb0efe3ee54b932666afec989465f9243fe6dd60" +dependencies = [ + "icu_collections 2.1.1", + "icu_locale_core", + "icu_locale_data", + "icu_provider 2.1.1", + "potential_utf", + "tinystr 0.8.0", + "zerovec 0.11.6", ] [[package]] @@ -4214,8 +3703,15 @@ dependencies = [ "serde", "tinystr 0.8.0", "writeable 0.6.3", + "zerovec 0.11.6", ] +[[package]] +name = "icu_locale_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c5f1d16b4c3a2642d3a719f18f6b06070ab0aef246a6418130c955ae08aa831" + [[package]] name = "icu_locid" version = "1.5.0" @@ -4226,7 +3722,7 @@ dependencies = [ "litemap 0.7.4", "tinystr 0.7.6", "writeable 0.5.5", - "zerovec", + "zerovec 0.10.4", ] [[package]] @@ -4238,9 +3734,9 @@ dependencies = [ "displaydoc", "icu_locid", "icu_locid_transform_data", - "icu_provider", + "icu_provider 1.5.0", "tinystr 0.7.6", - "zerovec", + "zerovec 0.10.4", ] [[package]] @@ -4256,15 +3752,29 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "19ce3e0da2ec68599d193c93d088142efd7f9c5d6fc9b803774855747dc6a84f" dependencies = [ "displaydoc", - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", + "icu_collections 1.5.0", + "icu_normalizer_data 1.5.1", + "icu_properties 1.5.1", + "icu_provider 1.5.0", "smallvec", "utf16_iter", "utf8_iter", "write16", - "zerovec", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_normalizer" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" +dependencies = [ + "icu_collections 2.1.1", + "icu_normalizer_data 2.1.1", + "icu_properties 2.1.2", + "icu_provider 2.1.1", + "smallvec", + "zerovec 0.11.6", ] [[package]] @@ -4273,6 +3783,12 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5e8338228bdc8ab83303f16b797e177953730f601a96c25d10cb3ab0daa0cb7" +[[package]] +name = "icu_normalizer_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" + [[package]] name = "icu_properties" version = "1.5.1" @@ -4280,12 +3796,26 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93d6020766cfc6302c15dbbc9c8778c37e62c14427cb7f6e601d849e092aeef5" dependencies = [ "displaydoc", - "icu_collections", + "icu_collections 1.5.0", "icu_locid_transform", - "icu_properties_data", - "icu_provider", + "icu_properties_data 1.5.1", + "icu_provider 1.5.0", "tinystr 0.7.6", - "zerovec", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_properties" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" +dependencies = [ + "icu_collections 2.1.1", + "icu_locale_core", + "icu_properties_data 2.1.2", + "icu_provider 2.1.1", + "zerotrie", + "zerovec 0.11.6", ] [[package]] @@ -4294,6 +3824,12 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85fb8799753b75aee8d2a21d7c14d9f38921b54b3dbda10f5a3c7a7b82dba5e2" +[[package]] +name = "icu_properties_data" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" + [[package]] name = "icu_provider" version = "1.5.0" @@ -4306,9 +3842,26 @@ dependencies = [ "stable_deref_trait", "tinystr 0.7.6", "writeable 0.5.5", - "yoke", + "yoke 0.7.5", + "zerofrom", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_provider" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" +dependencies = [ + "displaydoc", + "icu_locale_core", + "serde", + "stable_deref_trait", + "writeable 0.6.3", + "yoke 0.8.2", "zerofrom", - "zerovec", + "zerotrie", + "zerovec 0.11.6", ] [[package]] @@ -4330,12 +3883,27 @@ checksum = "a717725612346ffc2d7b42c94b820db6908048f39434504cb130e8b46256b0de" dependencies = [ "core_maths", "displaydoc", - "icu_collections", + "icu_collections 1.5.0", "icu_locid", - "icu_provider", - "icu_segmenter_data", + "icu_provider 1.5.0", + "icu_segmenter_data 1.5.1", + "utf8_iter", + "zerovec 0.10.4", +] + +[[package]] +name = "icu_segmenter" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a807a7488f3f758629ae86d99d9d30dce24da2fb2945d74c80a4f4a62c71db73" +dependencies = [ + "icu_collections 2.1.1", + "icu_locale", + "icu_provider 2.1.1", + "icu_segmenter_data 2.1.1", + "potential_utf", "utf8_iter", - "zerovec", + "zerovec 0.11.6", ] [[package]] @@ -4344,6 +3912,12 @@ version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a1e52775179941363cc594e49ce99284d13d6948928d8e72c755f55e98caa1eb" +[[package]] +name = "icu_segmenter_data" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ebbb7321d9e21d25f5660366cb6c08201d0175898a3a6f7a41ee9685af21c80" + [[package]] name = "ident_case" version = "1.0.1" @@ -4367,8 +3941,8 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daca1df1c957320b2cf139ac61e7bd64fed304c5040df000a745aa1de3b4ef71" dependencies = [ - "icu_normalizer", - "icu_properties", + "icu_normalizer 1.5.0", + "icu_properties 1.5.1", ] [[package]] @@ -4384,7 +3958,7 @@ dependencies = [ "gif", "image-webp", "num-traits", - "png", + "png 0.17.16", "qoi", "ravif", "rayon", @@ -4406,9 +3980,9 @@ dependencies = [ [[package]] name = "imagesize" -version = "0.13.0" +version = "0.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" +checksum = "09e54e57b4c48b40f7aec75635392b12b3421fa26fe8b4332e63138ed278459c" [[package]] name = "imgref" @@ -4416,15 +3990,6 @@ version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40fac9d56ed6437b198fddba683305e8e2d651aa42647f00f5ae542e7f5c94a2" -[[package]] -name = "immutable-chunkmap" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a3e98b1520e49e252237edc238a39869da9f3241f2ec19dc788c1d24694d1e4" -dependencies = [ - "arrayvec", -] - [[package]] name = "indexmap" version = "2.11.4" @@ -4619,6 +4184,16 @@ dependencies = [ "unicode-segmentation", ] +[[package]] +name = "keyboard-types" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fbe853b403ae61a04233030ae8a79d94975281ed9770a1f9e246732b534b28d" +dependencies = [ + "bitflags 2.11.1", + "serde", +] + [[package]] name = "khronos-egl" version = "6.0.0" @@ -4665,25 +4240,19 @@ dependencies = [ [[package]] name = "kurbo" -version = "0.11.3" +version = "0.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c62026ae44756f8a599ba21140f350303d4f08dcdcc71b5ad9c9bb8128c13c62" +checksum = "4b60dfc32f652b926df6192e55525b16d186c69d47876c3ead4da5cc9f8450e2" dependencies = [ "arrayvec", "euclid", + "polycool", "smallvec", ] [[package]] -name = "kurbo" -version = "0.12.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce9729cc38c18d86123ab736fd2e7151763ba226ac2490ec092d1dd148825e32" -dependencies = [ - "arrayvec", - "euclid", - "smallvec", -] +name = "lazy-js-bundle" +version = "0.7.9" [[package]] name = "lazy-js-bundle" @@ -4806,12 +4375,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4" -[[package]] -name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - [[package]] name = "linux-raw-sys" version = "0.12.1" @@ -4898,15 +4461,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "malloc_buf" -version = "0.0.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" -dependencies = [ - "libc", -] - [[package]] name = "malloc_size_of_derive" version = "0.1.3" @@ -4921,8 +4475,6 @@ dependencies = [ [[package]] name = "manganis" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bfcf56309de35b48b8780ea097ace5c3b773a617b52edc49dfc9a63a7d9dc43" dependencies = [ "const-serialize 0.7.2", "const-serialize 0.8.0-alpha.0", @@ -4937,8 +4489,6 @@ dependencies = [ [[package]] name = "manganis-core" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a24d6be68f594495aea60850a284029d585d7b7839b26096c1b6d758f8518648" dependencies = [ "const-serialize 0.7.2", "const-serialize 0.8.0-alpha.0", @@ -4951,8 +4501,6 @@ dependencies = [ [[package]] name = "manganis-macro" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e782a10318d707c0833e31876ded8acf91287eee0010af8392559af614c7226" dependencies = [ "dunce", "macro-string", @@ -4971,19 +4519,19 @@ dependencies = [ "log", "phf 0.11.3", "phf_codegen 0.11.3", - "string_cache", - "string_cache_codegen", - "tendril", + "string_cache 0.8.9", + "string_cache_codegen 0.5.4", + "tendril 0.4.3", ] [[package]] name = "markup5ever" -version = "0.35.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "311fe69c934650f8f19652b3946075f0fc41ad8757dbb68f1ca14e7900ecc1c3" +checksum = "7122d987ec5f704ee56f6e5b41a7d93722e9aae27ae07cafa4036c4d3f9757de" dependencies = [ "log", - "tendril", + "tendril 0.5.0", "web_atoms", ] @@ -4998,17 +4546,6 @@ dependencies = [ "syn 2.0.117", ] -[[package]] -name = "match_token" -version = "0.35.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac84fd3f360fcc43dc5f5d186f02a94192761a080e8bc58621ad4d12296a58cf" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] - [[package]] name = "matchers" version = "0.2.0" @@ -5052,7 +4589,7 @@ version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad38eb12aea514a0466ea40a80fd8cc83637065948eb4a426e4aa46261175227" dependencies = [ - "rustix 1.1.4", + "rustix", ] [[package]] @@ -5073,36 +4610,6 @@ dependencies = [ "autocfg", ] -[[package]] -name = "metal" -version = "0.27.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" -dependencies = [ - "bitflags 2.11.1", - "block", - "core-graphics-types 0.1.3", - "foreign-types 0.5.0", - "log", - "objc", - "paste", -] - -[[package]] -name = "metal" -version = "0.32.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00c15a6f673ff72ddcc22394663290f870fb224c1bfce55734a75c414150e605" -dependencies = [ - "bitflags 2.11.1", - "block", - "core-graphics-types 0.2.0", - "foreign-types 0.5.0", - "log", - "objc", - "paste", -] - [[package]] name = "mime" version = "0.3.17" @@ -5155,14 +4662,14 @@ dependencies = [ "crossbeam-channel", "dpi", "gtk", - "keyboard-types", + "keyboard-types 0.7.0", "libxdo", "objc2 0.6.4", "objc2-app-kit 0.3.2", "objc2-core-foundation", "objc2-foundation 0.3.2", "once_cell", - "png", + "png 0.17.16", "thiserror 2.0.18", "windows-sys 0.60.2", ] @@ -5186,38 +4693,18 @@ dependencies = [ [[package]] name = "naga" -version = "0.19.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e3524642f53d9af419ab5e8dd29d3ba155708267667c2f3f06c88c9e130843" -dependencies = [ - "bit-set 0.5.3", - "bitflags 2.11.1", - "codespan-reporting 0.11.1", - "hexf-parse", - "indexmap", - "log", - "num-traits", - "rustc-hash 1.1.0", - "spirv", - "termcolor", - "thiserror 1.0.69", - "unicode-xid", -] - -[[package]] -name = "naga" -version = "26.0.0" +version = "29.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "916cbc7cb27db60be930a4e2da243cf4bc39569195f22fd8ee419cd31d5b662c" +checksum = "0dd91265cc2454558f659b3b4b9640f0ddb8cc6521277f166b8a8c181c898079" dependencies = [ "arrayvec", - "bit-set 0.8.0", + "bit-set", "bitflags 2.11.1", "cfg-if", - "cfg_aliases 0.2.1", - "codespan-reporting 0.12.0", + "cfg_aliases", + "codespan-reporting", "half", - "hashbrown 0.15.5", + "hashbrown 0.16.1", "hexf-parse", "indexmap", "libm", @@ -5256,7 +4743,7 @@ dependencies = [ "bitflags 2.11.1", "jni-sys 0.3.1", "log", - "ndk-sys 0.6.0+11769913", + "ndk-sys", "num_enum", "raw-window-handle 0.6.2", "thiserror 1.0.69", @@ -5268,15 +4755,6 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" -[[package]] -name = "ndk-sys" -version = "0.5.0+25.2.9519653" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" -dependencies = [ - "jni-sys 0.3.1", -] - [[package]] name = "ndk-sys" version = "0.6.0+11769913" @@ -5292,19 +4770,6 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" -[[package]] -name = "nix" -version = "0.29.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" -dependencies = [ - "bitflags 2.11.1", - "cfg-if", - "cfg_aliases 0.2.1", - "libc", - "memoffset", -] - [[package]] name = "nodrop" version = "0.1.14" @@ -5425,16 +4890,6 @@ dependencies = [ "libc", ] -[[package]] -name = "objc" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" -dependencies = [ - "malloc_buf", - "objc_exception", -] - [[package]] name = "objc-sys" version = "0.3.5" @@ -5474,7 +4929,7 @@ dependencies = [ "objc2-core-data", "objc2-core-image", "objc2-foundation 0.2.2", - "objc2-quartz-core", + "objc2-quartz-core 0.2.2", ] [[package]] @@ -5492,34 +4947,10 @@ dependencies = [ ] [[package]] -name = "objc2-cloud-kit" +name = "objc2-core-data" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" -dependencies = [ - "bitflags 2.11.1", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-core-location", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-contacts" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" -dependencies = [ - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-core-data" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" dependencies = [ "bitflags 2.11.1", "block2 0.5.1", @@ -5534,6 +4965,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ "bitflags 2.11.1", + "block2 0.6.2", "dispatch2", "objc2 0.6.4", ] @@ -5546,6 +4978,7 @@ checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ "bitflags 2.11.1", "dispatch2", + "libc", "objc2 0.6.4", "objc2-core-foundation", "objc2-io-surface", @@ -5560,29 +4993,28 @@ dependencies = [ "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", - "objc2-metal", + "objc2-metal 0.2.2", ] [[package]] -name = "objc2-core-location" -version = "0.2.2" +name = "objc2-core-text" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" dependencies = [ - "block2 0.5.1", - "objc2 0.5.2", - "objc2-contacts", - "objc2-foundation 0.2.2", + "bitflags 2.11.1", + "objc2-core-foundation", ] [[package]] -name = "objc2-core-text" +name = "objc2-core-video" version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" dependencies = [ "bitflags 2.11.1", "objc2-core-foundation", + "objc2-core-graphics", ] [[package]] @@ -5608,7 +5040,6 @@ checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ "bitflags 2.11.1", "block2 0.5.1", - "dispatch", "libc", "objc2 0.5.2", ] @@ -5637,27 +5068,27 @@ dependencies = [ ] [[package]] -name = "objc2-link-presentation" +name = "objc2-metal" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ + "bitflags 2.11.1", "block2 0.5.1", "objc2 0.5.2", - "objc2-app-kit 0.2.2", "objc2-foundation 0.2.2", ] [[package]] name = "objc2-metal" -version = "0.2.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" dependencies = [ "bitflags 2.11.1", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", + "block2 0.6.2", + "objc2 0.6.4", + "objc2-foundation 0.3.2", ] [[package]] @@ -5670,38 +5101,20 @@ dependencies = [ "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", - "objc2-metal", -] - -[[package]] -name = "objc2-symbols" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" -dependencies = [ - "objc2 0.5.2", - "objc2-foundation 0.2.2", + "objc2-metal 0.2.2", ] [[package]] -name = "objc2-ui-kit" -version = "0.2.2" +name = "objc2-quartz-core" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ "bitflags 2.11.1", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-cloud-kit", - "objc2-core-data", - "objc2-core-image", - "objc2-core-location", - "objc2-foundation 0.2.2", - "objc2-link-presentation", - "objc2-quartz-core", - "objc2-symbols", - "objc2-uniform-type-identifiers", - "objc2-user-notifications", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-metal 0.3.2", ] [[package]] @@ -5716,30 +5129,6 @@ dependencies = [ "objc2-foundation 0.3.2", ] -[[package]] -name = "objc2-uniform-type-identifiers" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" -dependencies = [ - "block2 0.5.1", - "objc2 0.5.2", - "objc2-foundation 0.2.2", -] - -[[package]] -name = "objc2-user-notifications" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" -dependencies = [ - "bitflags 2.11.1", - "block2 0.5.1", - "objc2 0.5.2", - "objc2-core-location", - "objc2-foundation 0.2.2", -] - [[package]] name = "objc2-web-kit" version = "0.3.2" @@ -5754,24 +5143,6 @@ dependencies = [ "objc2-foundation 0.3.2", ] -[[package]] -name = "objc_exception" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" -dependencies = [ - "cc", -] - -[[package]] -name = "objc_id" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" -dependencies = [ - "objc", -] - [[package]] name = "once_cell" version = "1.21.4" @@ -5809,6 +5180,15 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" +[[package]] +name = "openssl-src" +version = "300.6.0+3.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8e8cbfd3a4a8c8f089147fd7aaa33cf8c7450c4d09f8f80698a0cf093abeff4" +dependencies = [ + "cc", +] + [[package]] name = "openssl-sys" version = "0.9.115" @@ -5817,6 +5197,7 @@ checksum = "158fe5b292746440aa6e7a7e690e55aeb72d41505e2804c23c6973ad0e9c9781" dependencies = [ "cc", "libc", + "openssl-src", "pkg-config", "vcpkg", ] @@ -5846,16 +5227,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "ordered-stream" -version = "0.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" -dependencies = [ - "futures-core", - "pin-project-lite", -] - [[package]] name = "owned_ttf_parser" version = "0.25.1" @@ -5914,12 +5285,6 @@ dependencies = [ "system-deps", ] -[[package]] -name = "parking" -version = "2.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" - [[package]] name = "parking_lot" version = "0.12.5" @@ -5943,18 +5308,37 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "parlance" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b6937eda350acc1a5d05872c3cbf99fe78619c269096e2be3d4a350058639d5" + [[package]] name = "parley" -version = "0.6.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26746861bb76dbc9bcd5ed1b0b55d2fedf291100961251702a031ab2abd2ce52" +checksum = "8fad031076f48f0d4d85ce1aea9b94b4e715a4d636a030a123038f8f5b5e4343" dependencies = [ "fontique", "harfrust", - "hashbrown 0.15.5", + "hashbrown 0.17.1", + "icu_normalizer 2.1.1", + "icu_properties 2.1.2", + "icu_segmenter 2.1.2", "linebender_resource_handle", - "skrifa 0.37.0", - "swash", + "parlance", + "parley_data", + "skrifa", +] + +[[package]] +name = "parley_data" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19ab9ace3fad1b9ed603ddac5b595e69931fc50263d7e04e4055015b77b02da5" +dependencies = [ + "icu_properties 2.1.2", ] [[package]] @@ -5965,13 +5349,13 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "peniko" -version = "0.5.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3c76095c9a636173600478e0373218c7b955335048c2bcd12dc6a79657649d8" +checksum = "839c8299360d2e998bdb106dc0a6cd71dcc5f4df51df1b620361bf50e283cca6" dependencies = [ "bytemuck", "color", - "kurbo 0.12.0", + "kurbo", "linebender_resource_handle", "smallvec", ] @@ -6012,6 +5396,17 @@ dependencies = [ "phf_shared 0.11.3", ] +[[package]] +name = "phf" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1562dc717473dbaa4c1f85a36410e03c047b2e7df7f45ee938fbef64ae7fadf" +dependencies = [ + "phf_macros 0.13.1", + "phf_shared 0.13.1", + "serde", +] + [[package]] name = "phf_codegen" version = "0.8.0" @@ -6032,6 +5427,16 @@ dependencies = [ "phf_shared 0.11.3", ] +[[package]] +name = "phf_codegen" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49aa7f9d80421bca176ca8dbfebe668cc7a2684708594ec9f3c0db0805d5d6e1" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", +] + [[package]] name = "phf_generator" version = "0.8.0" @@ -6062,6 +5467,16 @@ dependencies = [ "rand 0.8.6", ] +[[package]] +name = "phf_generator" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "135ace3a761e564ec88c03a77317a7c6b80bb7f7135ef2544dbe054243b89737" +dependencies = [ + "fastrand", + "phf_shared 0.13.1", +] + [[package]] name = "phf_macros" version = "0.10.0" @@ -6089,6 +5504,19 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "phf_macros" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "812f032b54b1e759ccd5f8b6677695d5268c588701effba24601f6932f8269ef" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "phf_shared" version = "0.8.0" @@ -6116,6 +5544,15 @@ dependencies = [ "siphasher 1.0.3", ] +[[package]] +name = "phf_shared" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e57fef6bc5981e38c2ce2d63bfa546861309f875b8a75f092d1d54ae2d64f266" +dependencies = [ + "siphasher 1.0.3", +] + [[package]] name = "pico-args" version = "0.5.0" @@ -6148,36 +5585,25 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" -[[package]] -name = "piper" -version = "0.2.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" -dependencies = [ - "atomic-waker", - "fastrand", - "futures-io", -] - [[package]] name = "pixels" -version = "0.15.0" +version = "0.17.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "518d43cd70c5381d4c7bd4bf47ee344beee99b58b0587adcb198cc713ff0dfb5" +checksum = "f7ddc5048a90da4dab8f3f81fb280f44c9e1d76b68fb2f62dce78b22d55546b1" dependencies = [ "bytemuck", - "pollster 0.3.0", + "pollster", "raw-window-handle 0.6.2", - "thiserror 1.0.69", + "thiserror 2.0.18", "ultraviolet", - "wgpu 0.19.4", + "wgpu", ] [[package]] name = "pixels_window_renderer" -version = "0.1.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5973b55d585de980b6a1db68b116c8c741c18ab5a5699621aee7cac343aea58" +checksum = "76c3c4c8dec11a1bbf2be6e82322f2c4064bcbcf3b33f2de50c88ac1a53a2393" dependencies = [ "anyrender", "debug_timer", @@ -6209,6 +5635,19 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.11.1", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + [[package]] name = "polling" version = "3.11.0" @@ -6219,21 +5658,24 @@ dependencies = [ "concurrent-queue", "hermit-abi", "pin-project-lite", - "rustix 1.1.4", + "rustix", "windows-sys 0.61.2", ] [[package]] name = "pollster" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" +checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" [[package]] -name = "pollster" +name = "polycool" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" +checksum = "50596ddc09eb5ad5f75cacd40209568e66df71baf86e1499a0e99c4cff12a5a6" +dependencies = [ + "arrayvec", +] [[package]] name = "portable-atomic" @@ -6250,6 +5692,17 @@ dependencies = [ "portable-atomic", ] +[[package]] +name = "potential_utf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0103b1cef7ec0cf76490e969665504990193874ea05c85ff9bab8b911d0a0564" +dependencies = [ + "serde_core", + "writeable 0.6.3", + "zerovec 0.11.6", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -6290,7 +5743,7 @@ dependencies = [ "palette", "pulldown-cmark", "serde_json", - "strum", + "strum 0.27.2", "time", "tracing", "unic-langid", @@ -6445,16 +5898,6 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" -[[package]] -name = "quick-xml" -version = "0.30.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eff6510e86862b57b210fd8cbe8ed3f0d7d600b9c2863cd4549a2e033c66e956" -dependencies = [ - "memchr", - "serde", -] - [[package]] name = "quick-xml" version = "0.39.4" @@ -6471,7 +5914,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", - "cfg_aliases 0.2.1", + "cfg_aliases", "pin-project-lite", "quinn-proto", "quinn-udp", @@ -6511,7 +5954,7 @@ version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ - "cfg_aliases 0.2.1", + "cfg_aliases", "libc", "once_cell", "socket2", @@ -6712,6 +6155,18 @@ version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" +[[package]] +name = "raw-window-metal" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40d213455a5f1dc59214213c7330e074ddf8114c9a42411eb890c767357ce135" +dependencies = [ + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", +] + [[package]] name = "rayon" version = "1.12.0" @@ -6734,32 +6189,13 @@ dependencies = [ [[package]] name = "read-fonts" -version = "0.34.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8941f8e9d5f8ad3aebea330d01ac68c0167600eb31a86ecd86e97be4d13b51f5" -dependencies = [ - "bytemuck", - "font-types 0.9.0", -] - -[[package]] -name = "read-fonts" -version = "0.35.0" +version = "0.39.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6717cf23b488adf64b9d711329542ba34de147df262370221940dfabc2c91358" +checksum = "c4ed38b89c2c77ff968c524145ad65fb010f38af5c7a224b53b81d47ac2daa81" dependencies = [ "bytemuck", "core_maths", - "font-types 0.10.1", -] - -[[package]] -name = "redox_syscall" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" -dependencies = [ - "bitflags 1.3.2", + "font-types", ] [[package]] @@ -6836,22 +6272,17 @@ dependencies = [ "bytes", "cookie", "cookie_store", - "encoding_rs", "futures-core", "futures-util", - "h2", "http", "http-body", "http-body-util", "hyper", "hyper-rustls", - "hyper-tls", "hyper-util", "js-sys", "log", - "mime", "mime_guess", - "native-tls", "percent-encoding", "pin-project-lite", "quinn", @@ -6862,7 +6293,6 @@ dependencies = [ "serde_urlencoded", "sync_wrapper", "tokio", - "tokio-native-tls", "tokio-rustls", "tokio-util", "tower", @@ -6877,9 +6307,46 @@ dependencies = [ ] [[package]] -name = "rfd" -version = "0.17.2" -source = "registry+https://github.com/rust-lang/crates.io-index" +name = "reqwest" +version = "0.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62e0021ea2c22aed41653bc7e1419abb2c97e038ff2c33d0e1309e49a97deec0" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-tls", + "hyper-util", + "js-sys", + "log", + "mime", + "native-tls", + "percent-encoding", + "pin-project-lite", + "rustls-pki-types", + "serde", + "serde_urlencoded", + "sync_wrapper", + "tokio", + "tokio-native-tls", + "tower", + "tower-http", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "rfd" +version = "0.17.2" +source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "20dafead71c16a34e1ff357ddefc8afc11e7d51d6d2b9fbd07eaa48e3e540220" dependencies = [ "block2 0.6.2", @@ -6892,7 +6359,7 @@ dependencies = [ "objc2-core-foundation", "objc2-foundation 0.3.2", "percent-encoding", - "pollster 0.4.0", + "pollster", "raw-window-handle 0.6.2", "wasm-bindgen", "wasm-bindgen-futures", @@ -6926,6 +6393,15 @@ version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" +[[package]] +name = "roxmltree" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1964b10c76125c36f8afe190065a4bf9a87bf324842c05701330bba9f1cacbb" +dependencies = [ + "memchr", +] + [[package]] name = "rustc-hash" version = "1.1.0" @@ -6947,19 +6423,6 @@ dependencies = [ "semver", ] -[[package]] -name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags 2.11.1", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - [[package]] name = "rustix" version = "1.1.4" @@ -6969,7 +6432,7 @@ dependencies = [ "bitflags 2.11.1", "errno", "libc", - "linux-raw-sys 0.12.1", + "linux-raw-sys", "windows-sys 0.61.2", ] @@ -7079,9 +6542,9 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" [[package]] name = "sctk-adwaita" -version = "0.10.1" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6277f0217056f77f1d8f49f2950ac6c278c0d607c45f5ee99328d792ede24ec" +checksum = "1dd3accc0f3f4bbaf2c9e1957a030dc582028130c67660d44c0a0345a22ca69b" dependencies = [ "ab_glyph", "log", @@ -7133,17 +6596,17 @@ dependencies = [ [[package]] name = "selectors" -version = "0.32.0" +version = "0.38.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09975d3195f34dce9c7b381cb0f00c3c13381d4d3735c0f1a9c894b283b302ab" +checksum = "8adfa1c298912827b8a28b223b3b874357397ae706e6190acd9bf28cee99114d" dependencies = [ "bitflags 2.11.1", - "cssparser 0.35.0", + "cssparser 0.37.0", "derive_more 2.0.1", "log", "new_debug_unreachable", - "phf 0.11.3", - "phf_codegen 0.11.3", + "phf 0.13.1", + "phf_codegen 0.13.1", "precomputed-hash", "rustc-hash 2.1.2", "servo_arc 0.4.3", @@ -7396,22 +6859,12 @@ checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" [[package]] name = "skrifa" -version = "0.36.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37004372610e83ee2a4c69c7d896b41f33da6a3dc1a4fe07dd9b2629a549b1dc" -dependencies = [ - "bytemuck", - "read-fonts 0.34.0", -] - -[[package]] -name = "skrifa" -version = "0.37.0" +version = "0.42.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c31071dedf532758ecf3fed987cdb4bd9509f900e026ab684b4ecb81ea49841" +checksum = "0c34617370ae968efb7161bb2beb517d9084659aae19e24b89e3db25b46e4564" dependencies = [ "bytemuck", - "read-fonts 0.35.0", + "read-fonts", ] [[package]] @@ -7473,9 +6926,9 @@ checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" [[package]] name = "smithay-client-toolkit" -version = "0.19.2" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" +checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" dependencies = [ "bitflags 2.11.1", "calloop", @@ -7484,13 +6937,15 @@ dependencies = [ "libc", "log", "memmap2", - "rustix 0.38.44", - "thiserror 1.0.69", + "rustix", + "thiserror 2.0.18", "wayland-backend", "wayland-client", "wayland-csd-frame", "wayland-cursor", "wayland-protocols", + "wayland-protocols-experimental", + "wayland-protocols-misc", "wayland-protocols-wlr", "wayland-scanner", "xkeysym", @@ -7498,10 +6953,11 @@ dependencies = [ [[package]] name = "smol_str" -version = "0.2.2" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +checksum = "9676b89cd56310a87b93dec47b11af744f34d5fc9f367b829474eec0a891350d" dependencies = [ + "borsh", "serde", ] @@ -7549,9 +7005,9 @@ checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" [[package]] name = "spirv" -version = "0.3.0+sdk-1.3.268.0" +version = "0.4.0+sdk-1.4.341.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +checksum = "d9571ea910ebd84c86af4b3ed27f9dbdc6ad06f17c5f96146b2b671e2976744f" dependencies = [ "bitflags 2.11.1", ] @@ -7596,6 +7052,19 @@ dependencies = [ "serde", ] +[[package]] +name = "string_cache" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a18596f8c785a729f2819c0f6a7eae6ebeebdfffbfe4214ae6b087f690e31901" +dependencies = [ + "new_debug_unreachable", + "parking_lot", + "phf_shared 0.13.1", + "precomputed-hash", + "serde", +] + [[package]] name = "string_cache_codegen" version = "0.5.4" @@ -7608,15 +7077,33 @@ dependencies = [ "quote", ] +[[package]] +name = "string_cache_codegen" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "585635e46db231059f76c5849798146164652513eb9e8ab2685939dd90f29b69" +dependencies = [ + "phf_generator 0.13.1", + "phf_shared 0.13.1", + "proc-macro2", + "quote", +] + [[package]] name = "strum" version = "0.27.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" dependencies = [ - "strum_macros", + "strum_macros 0.27.2", ] +[[package]] +name = "strum" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9628de9b8791db39ceda2b119bbe13134770b56c138ec1d3af810d045c04f9bd" + [[package]] name = "strum_macros" version = "0.27.2" @@ -7629,29 +7116,39 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "strum_macros" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab85eea0270ee17587ed4156089e10b9e6880ee688791d45a905f5b1ca36f664" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "stylo" -version = "0.8.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff45c788bcb0230aff156dce747d4d0d7f793f525764fd6690d51bbfe1f5bbd5" +checksum = "e791ea1b0ede7a720ac17394e48d1ed29cfcb0c27fe339ead2f392ad111502ac" dependencies = [ "app_units", "arrayvec", "atomic_refcell", "bitflags 2.11.1", "byteorder", - "cssparser 0.35.0", + "cssparser 0.37.0", "derive_more 2.0.1", "encoding_rs", "euclid", - "icu_segmenter", + "icu_segmenter 1.5.0", "indexmap", "itertools 0.14.0", "itoa", - "lazy_static", "log", "malloc_size_of_derive", - "matches", "mime", "new_debug_unreachable", "num-derive", @@ -7663,15 +7160,16 @@ dependencies = [ "rayon", "rayon-core", "rustc-hash 2.1.2", - "selectors 0.32.0", + "selectors 0.38.0", "serde", "servo_arc 0.4.3", "smallbitvec", "smallvec", "static_assertions", - "string_cache", + "string_cache 0.9.0", + "strum 0.28.0", + "strum_macros 0.28.0", "stylo_atoms", - "stylo_config", "stylo_derive", "stylo_dom", "stylo_malloc_size_of", @@ -7689,25 +7187,19 @@ dependencies = [ [[package]] name = "stylo_atoms" -version = "0.8.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d6ff15e6ed626c331663555af48b8f21bc46f729f45711597143dc1bf50fb5" +checksum = "50302033a902062041527b6213259c28217a85ffa8f5da7479b584c98f129bbc" dependencies = [ - "string_cache", - "string_cache_codegen", + "string_cache 0.9.0", + "string_cache_codegen 0.6.1", ] -[[package]] -name = "stylo_config" -version = "0.8.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ebdb6722cde5d2660928c63e07b3afbef1be8376e2b247e96e381ba5e99db33a" - [[package]] name = "stylo_derive" -version = "0.8.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1724b911e0775fb9379dc629b1c3647fed991f90ddb865f74a2a26f7b030777" +checksum = "2697714b8a3591ca2bd9087fdbf7f228979217c24c0eba91a9f127cfbd276f24" dependencies = [ "darling 0.20.11", "proc-macro2", @@ -7718,9 +7210,9 @@ dependencies = [ [[package]] name = "stylo_dom" -version = "0.8.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8c0101ada15990fee6269257538cbcbc6f01462dc4b22d6f820edb6a4427e82" +checksum = "fb8aac516e70921783ec1279cf568cb981177305beb70575c4c00fd6551384f2" dependencies = [ "bitflags 2.11.1", "stylo_malloc_size_of", @@ -7728,33 +7220,33 @@ dependencies = [ [[package]] name = "stylo_malloc_size_of" -version = "0.8.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8185a7a3cf0716c475ad113b494c276acf534b518dd41ee47ad5aba4af6690e" +checksum = "925c363675afbe6e2b845f571332c860fe9a61bf9896d8ae358c6c68f6e3aefe" dependencies = [ "app_units", - "cssparser 0.35.0", + "cssparser 0.37.0", "euclid", - "selectors 0.32.0", + "selectors 0.38.0", "servo_arc 0.4.3", "smallbitvec", "smallvec", - "string_cache", + "string_cache 0.9.0", "thin-vec", "void", ] [[package]] name = "stylo_static_prefs" -version = "0.8.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca4c89da4ab6ac0beda8b03db38216967c99f1f7287a0f3b0f366b45d34ac7c4" +checksum = "850ac3401667d004d4a13f9c93dc6d9fe67044c9bfdaf5f1519ff136ed68fbab" [[package]] name = "stylo_taffy" -version = "0.2.0" +version = "0.3.0-alpha.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b841aad2b770ef75dd134ba885aef0716f2ac3a83ccaf0fc31b09c8b02562e23" +checksum = "95128533e10268e12b17cab58c0c608a3a9c444ed21cb9ff3b9892bc55153fbf" dependencies = [ "stylo", "stylo_atoms", @@ -7763,16 +7255,16 @@ dependencies = [ [[package]] name = "stylo_traits" -version = "0.8.0" +version = "0.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f58034d08877fb80a5496301fde9111bc57e761f4a78045222af30ce95ec150f" +checksum = "31f5138147c085644487d71b9bbb274fc7f4d6bbe2289c09744c4bd6018f45e2" dependencies = [ "app_units", "bitflags 2.11.1", - "cssparser 0.35.0", + "cssparser 0.37.0", "euclid", "malloc_size_of_derive", - "selectors 0.32.0", + "selectors 0.38.0", "serde", "servo_arc 0.4.3", "stylo_atoms", @@ -7786,8 +7278,6 @@ dependencies = [ [[package]] name = "subsecond" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cc79674bd55726e6b123204403389400229a95fe4a3b2c5453dada70b06ca95" dependencies = [ "js-sys", "libc", @@ -7805,8 +7295,6 @@ dependencies = [ [[package]] name = "subsecond-types" version = "0.7.9" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e9798bfed58797aed51c672aa99810aac30a50d3120ecfdcf28c13784e9a8f1c" dependencies = [ "serde", ] @@ -7817,33 +7305,16 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" -[[package]] -name = "svg_fmt" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" - [[package]] name = "svgtypes" -version = "0.15.3" +version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" +checksum = "695b5790b3131dafa99b3bbfd25a216edb3d216dad9ca208d4657bfb8f2abc3d" dependencies = [ - "kurbo 0.11.3", + "kurbo", "siphasher 1.0.3", ] -[[package]] -name = "swash" -version = "0.2.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "842f3cd369c2ba38966204f983eaa5e54a8e84a7d7159ed36ade2b6c335aae64" -dependencies = [ - "skrifa 0.36.0", - "yazi", - "zeno", -] - [[package]] name = "syn" version = "1.0.109" @@ -7922,9 +7393,9 @@ dependencies = [ [[package]] name = "taffy" -version = "0.9.2" +version = "0.11.0-experimental-cache-fix.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ba83ebaf2954d31d05d67340fd46cebe99da2b7133b0dd68d70c65473a437b" +checksum = "e87b88128d417cd7c2c75b8a398177fb9efcb2ae5cddad22bcec106ba9c8e1c3" dependencies = [ "arrayvec", "grid", @@ -7941,7 +7412,7 @@ dependencies = [ "bitflags 2.11.1", "block2 0.6.2", "core-foundation 0.10.1", - "core-graphics 0.25.0", + "core-graphics", "crossbeam-channel", "dispatch2", "dlopen2", @@ -7954,7 +7425,7 @@ dependencies = [ "log", "ndk", "ndk-context", - "ndk-sys 0.6.0+11769913", + "ndk-sys", "objc2 0.6.4", "objc2-app-kit 0.3.2", "objc2-foundation 0.3.2", @@ -7997,7 +7468,7 @@ dependencies = [ "fastrand", "getrandom 0.3.4", "once_cell", - "rustix 1.1.4", + "rustix", "windows-sys 0.61.2", ] @@ -8012,6 +7483,16 @@ dependencies = [ "utf-8", ] +[[package]] +name = "tendril" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4790fc369d5a530f4b544b094e31388b9b3a37c0f4652ade4505945f5660d24" +dependencies = [ + "new_debug_unreachable", + "utf-8", +] + [[package]] name = "termcolor" version = "1.4.1" @@ -8161,7 +7642,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9117f5d4db391c1cf6927e7bea3db74b9a1c1add8f7eda9ffd5364f40f57b82f" dependencies = [ "displaydoc", - "zerovec", + "zerovec 0.10.4", ] [[package]] @@ -8171,6 +7652,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2b56a820bb70060f096338fcc02edb78cb3f8fb21c5078503f48588cfcaf494" dependencies = [ "displaydoc", + "zerovec 0.11.6", ] [[package]] @@ -8190,15 +7672,15 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "to_shmem" -version = "0.2.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb61262d1e7e4cc777e40cb2f101d5fa51f3eeac50c3a7355b2027b9274baa35" +checksum = "e8eb8396666f8344ad4b8849ac0d493ae960290ba89ba1aaf0cb8045d2023288" dependencies = [ - "cssparser 0.35.0", + "cssparser 0.37.0", "servo_arc 0.4.3", "smallbitvec", "smallvec", - "string_cache", + "string_cache 0.9.0", "thin-vec", ] @@ -8526,7 +8008,7 @@ dependencies = [ "objc2-core-graphics", "objc2-foundation 0.3.2", "once_cell", - "png", + "png 0.17.16", "thiserror 2.0.18", "windows-sys 0.60.2", ] @@ -8619,22 +8101,11 @@ version = "1.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "40ce102ab67701b8526c123c1bab5cbe42d7040ccfd0f64af1a385808d2f43de" -[[package]] -name = "uds_windows" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" -dependencies = [ - "memoffset", - "tempfile", - "winapi", -] - [[package]] name = "ultraviolet" -version = "0.9.2" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a28554d13eb5daba527cc1b91b6c341372a0ae45ed277ffb2c6fbc04f319d7e" +checksum = "ea519dad475ee0446b8172793c3c327e4fc81dafdaf05aaac510e630000b6296" dependencies = [ "wide", ] @@ -8784,19 +8255,19 @@ dependencies = [ [[package]] name = "usvg" -version = "0.45.1" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" +checksum = "e419dff010bb12512b0ae9e3d2f318dfbdf0167fde7eb05465134d4e8756076f" dependencies = [ "base64", "data-url", "flate2", "fontdb", "imagesize", - "kurbo 0.11.3", + "kurbo", "log", "pico-args", - "roxmltree", + "roxmltree 0.21.1", "rustybuzz", "simplecss", "siphasher 1.0.3", @@ -8860,75 +8331,56 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" -[[package]] -name = "vello" -version = "0.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71acbd6b5f7f19841425845c113a89a54bbf60556ae39e7d0182a6f80ce37f5b" -dependencies = [ - "bytemuck", - "futures-intrusive", - "log", - "peniko", - "png", - "skrifa 0.37.0", - "static_assertions", - "thiserror 2.0.18", - "vello_encoding", - "vello_shaders", - "wgpu 26.0.1", -] - [[package]] name = "vello_common" -version = "0.0.4" +version = "0.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a235ba928b3109ad9e7696270edb09445a52ae1c7c08e6d31a19b1cdd6cbc24a" +checksum = "3361bff7f7d82c0c496b92048db83846691f0e844cc28dee92b1c824291b55ee" dependencies = [ "bytemuck", "fearless_simd", - "hashbrown 0.15.5", + "guillotiere", + "hashbrown 0.17.1", "log", "peniko", - "skrifa 0.37.0", + "png 0.18.1", "smallvec", + "thiserror 2.0.18", ] [[package]] name = "vello_cpu" -version = "0.0.4" +version = "0.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0bd1fcf9c1814f17a491e07113623d44e3ec1125a9f3401f5e047d6d326da21" +checksum = "6d8ded630e8316bb94a55881256506d1f3b9947b5f66db8a7d32ca7ba02decd0" dependencies = [ "bytemuck", + "glifo", + "hashbrown 0.17.1", "vello_common", ] [[package]] -name = "vello_encoding" -version = "0.6.0" +name = "vello_hybrid" +version = "0.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cfd5e0b9fec91df34a09fbcbbed474cec68d05691b590a911c7af83c4860ae42" +checksum = "644d88a5ccb2280a407eada75a9318920bdee029e293b52c6e8b3fc8c31c70dd" dependencies = [ "bytemuck", - "guillotiere", - "peniko", - "skrifa 0.37.0", - "smallvec", + "glifo", + "hashbrown 0.17.1", + "log", + "thiserror 2.0.18", + "vello_common", + "vello_sparse_shaders", + "wgpu", ] [[package]] -name = "vello_shaders" -version = "0.6.0" +name = "vello_sparse_shaders" +version = "0.0.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c381dde4e7d0d7957df0c0e3f8a7cc0976762d3972d97da5c71464e57ffefd3" -dependencies = [ - "bytemuck", - "log", - "naga 26.0.0", - "thiserror 2.0.18", - "vello_encoding", -] +checksum = "45c3abf652bc0f42be7b8235bc2b9ae97991ee801bbdbc694485dead5786202c" [[package]] name = "version-compare" @@ -9086,7 +8538,7 @@ checksum = "2857dd20b54e916ec7253b3d6b4d5c4d7d4ca2c33c2e11c6c76a99bd8744755d" dependencies = [ "cc", "downcast-rs", - "rustix 1.1.4", + "rustix", "scoped-tls", "smallvec", "wayland-sys", @@ -9099,7 +8551,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "645c7c96bb74690c3189b5c9cb4ca1627062bb23693a4fad9d8c3de958260144" dependencies = [ "bitflags 2.11.1", - "rustix 1.1.4", + "rustix", "wayland-backend", "wayland-scanner", ] @@ -9121,7 +8573,7 @@ version = "0.31.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a52d18780be9b1314328a3de5f930b73d2200112e3849ca6cb11822793fb34d" dependencies = [ - "rustix 1.1.4", + "rustix", "wayland-client", "xcursor", ] @@ -9138,6 +8590,32 @@ dependencies = [ "wayland-scanner", ] +[[package]] +name = "wayland-protocols-experimental" +version = "20250721.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" +dependencies = [ + "bitflags 2.11.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-misc" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8" +dependencies = [ + "bitflags 2.11.1", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + [[package]] name = "wayland-protocols-plasma" version = "0.3.12" @@ -9171,7 +8649,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9c324a910fd86ebdc364a3e61ec1f11737d3b1d6c273c0239ee8ff4bc0d24b4a" dependencies = [ "proc-macro2", - "quick-xml 0.39.4", + "quick-xml", "quote", ] @@ -9209,14 +8687,14 @@ dependencies = [ [[package]] name = "web_atoms" -version = "0.1.3" +version = "0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57ffde1dc01240bdf9992e3205668b235e59421fd085e8a317ed98da0178d414" +checksum = "d7cff6eef815df1834fd250e3a2ff436044d82a9f1bc1980ca1dbdf07effc538" dependencies = [ - "phf 0.11.3", - "phf_codegen 0.11.3", - "string_cache", - "string_cache_codegen", + "phf 0.13.1", + "phf_codegen 0.13.1", + "string_cache 0.9.0", + "string_cache_codegen 0.6.1", ] [[package]] @@ -9332,44 +8810,20 @@ checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" [[package]] name = "wgpu" -version = "0.19.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbd7311dbd2abcfebaabf1841a2824ed7c8be443a0f29166e5d3c6a53a762c01" -dependencies = [ - "arrayvec", - "cfg-if", - "cfg_aliases 0.1.1", - "js-sys", - "log", - "naga 0.19.2", - "parking_lot", - "profiling", - "raw-window-handle 0.6.2", - "smallvec", - "static_assertions", - "wasm-bindgen", - "wasm-bindgen-futures", - "web-sys", - "wgpu-core 0.19.4", - "wgpu-hal 0.19.5", - "wgpu-types 0.19.2", -] - -[[package]] -name = "wgpu" -version = "26.0.1" +version = "29.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70b6ff82bbf6e9206828e1a3178e851f8c20f1c9028e74dd3a8090741ccd5798" +checksum = "bb3feacc458f7bee8bc1737149b42b6c731aa461039a4264a67bb6681646b250" dependencies = [ "arrayvec", "bitflags 2.11.1", + "bytemuck", "cfg-if", - "cfg_aliases 0.2.1", + "cfg_aliases", "document-features", - "hashbrown 0.15.5", + "hashbrown 0.16.1", "js-sys", "log", - "naga 26.0.0", + "naga", "parking_lot", "portable-atomic", "profiling", @@ -9379,171 +8833,114 @@ dependencies = [ "wasm-bindgen", "wasm-bindgen-futures", "web-sys", - "wgpu-core 26.0.1", - "wgpu-hal 26.0.6", - "wgpu-types 26.0.0", + "wgpu-core", + "wgpu-hal", + "wgpu-types", ] [[package]] name = "wgpu-core" -version = "0.19.4" +version = "29.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28b94525fc99ba9e5c9a9e24764f2bc29bad0911a7446c12f446a8277369bf3a" +checksum = "02da3ad1b568337f25513b317870960ef87073ea0945502e44b864b67a8c77b7" dependencies = [ "arrayvec", - "bit-vec 0.6.3", + "bit-set", + "bit-vec", "bitflags 2.11.1", - "cfg_aliases 0.1.1", - "codespan-reporting 0.11.1", + "bytemuck", + "cfg_aliases", + "document-features", + "hashbrown 0.16.1", "indexmap", "log", - "naga 0.19.2", + "naga", "once_cell", "parking_lot", + "portable-atomic", "profiling", "raw-window-handle 0.6.2", "rustc-hash 1.1.0", "smallvec", - "thiserror 1.0.69", - "web-sys", - "wgpu-hal 0.19.5", - "wgpu-types 0.19.2", + "thiserror 2.0.18", + "wgpu-core-deps-apple", + "wgpu-core-deps-emscripten", + "wgpu-core-deps-wasm", + "wgpu-core-deps-windows-linux-android", + "wgpu-hal", + "wgpu-naga-bridge", + "wgpu-types", ] [[package]] -name = "wgpu-core" -version = "26.0.1" +name = "wgpu-core-deps-apple" +version = "29.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f62f1053bd28c2268f42916f31588f81f64796e2ff91b81293515017ca8bd9" +checksum = "62e51b5447e144b3dbba4feb01f80f4fa21696fa0cd99afb2c3df1affd6fdb28" dependencies = [ - "arrayvec", - "bit-set 0.8.0", - "bit-vec 0.8.0", - "bitflags 2.11.1", - "cfg_aliases 0.2.1", - "document-features", - "hashbrown 0.15.5", - "indexmap", - "log", - "naga 26.0.0", - "once_cell", - "parking_lot", - "portable-atomic", - "profiling", - "raw-window-handle 0.6.2", - "rustc-hash 1.1.0", - "smallvec", - "thiserror 2.0.18", - "wgpu-core-deps-apple", - "wgpu-core-deps-emscripten", - "wgpu-core-deps-windows-linux-android", - "wgpu-hal 26.0.6", - "wgpu-types 26.0.0", -] - -[[package]] -name = "wgpu-core-deps-apple" -version = "26.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "18ae5fbde6a4cbebae38358aa73fcd6e0f15c6144b67ef5dc91ded0db125dbdf" -dependencies = [ - "wgpu-hal 26.0.6", + "wgpu-hal", ] [[package]] name = "wgpu-core-deps-emscripten" -version = "26.0.0" +version = "29.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7670e390f416006f746b4600fdd9136455e3627f5bd763abf9a65daa216dd2d" +checksum = "3487cd6293a963bc5c0c0396f6a2192043c50003c07f4efdccbad3d90ec9d819" dependencies = [ - "wgpu-hal 26.0.6", + "wgpu-hal", ] [[package]] -name = "wgpu-core-deps-windows-linux-android" -version = "26.0.0" +name = "wgpu-core-deps-wasm" +version = "29.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "720a5cb9d12b3d337c15ff0e24d3e97ed11490ff3f7506e7f3d98c68fa5d6f14" +checksum = "0c2f2fb042f36920771deb0b966543c5751b18f3d327760ffc90f74e20b2dcd4" dependencies = [ - "wgpu-hal 26.0.6", + "wgpu-hal", ] [[package]] -name = "wgpu-hal" -version = "0.19.5" +name = "wgpu-core-deps-windows-linux-android" +version = "29.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bfabcfc55fd86611a855816326b2d54c3b2fd7972c27ce414291562650552703" +checksum = "1bfb01076d0aa08b0ba9bd741e178b5cc440f5abe99d9581323a4c8b5d1a1916" dependencies = [ - "android_system_properties", - "arrayvec", - "ash 0.37.3+1.3.251", - "bit-set 0.5.3", - "bitflags 2.11.1", - "block", - "cfg_aliases 0.1.1", - "core-graphics-types 0.1.3", - "d3d12", - "glow 0.13.1", - "glutin_wgl_sys 0.5.0", - "gpu-alloc", - "gpu-allocator 0.25.0", - "gpu-descriptor 0.2.4", - "hassle-rs", - "js-sys", - "khronos-egl", - "libc", - "libloading 0.8.9", - "log", - "metal 0.27.0", - "naga 0.19.2", - "ndk-sys 0.5.0+25.2.9519653", - "objc", - "once_cell", - "parking_lot", - "profiling", - "range-alloc", - "raw-window-handle 0.6.2", - "renderdoc-sys", - "rustc-hash 1.1.0", - "smallvec", - "thiserror 1.0.69", - "wasm-bindgen", - "web-sys", - "wgpu-types 0.19.2", - "winapi", + "wgpu-hal", ] [[package]] name = "wgpu-hal" -version = "26.0.6" +version = "29.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d0e67224cc7305b3b4eb2cc57ca4c4c3afc665c1d1bee162ea806e19c47bdd" +checksum = "31f8e1a9e7a8512f276f7c62e018c7fa8d60954303fed2e5750114332049193f" dependencies = [ "android_system_properties", "arrayvec", - "ash 0.38.0+1.3.281", - "bit-set 0.8.0", + "ash", + "bit-set", "bitflags 2.11.1", - "block", + "block2 0.6.2", "bytemuck", "cfg-if", - "cfg_aliases 0.2.1", - "core-graphics-types 0.2.0", - "glow 0.16.0", - "glutin_wgl_sys 0.6.1", - "gpu-alloc", - "gpu-allocator 0.27.0", - "gpu-descriptor 0.3.2", - "hashbrown 0.15.5", + "cfg_aliases", + "glow", + "glutin_wgl_sys", + "gpu-allocator", + "gpu-descriptor", + "hashbrown 0.16.1", "js-sys", "khronos-egl", "libc", "libloading 0.8.9", "log", - "metal 0.32.0", - "naga 26.0.0", - "ndk-sys 0.6.0+11769913", - "objc", + "naga", + "ndk-sys", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-metal 0.3.2", + "objc2-quartz-core 0.3.2", + "once_cell", "ordered-float", "parking_lot", "portable-atomic", @@ -9551,49 +8948,52 @@ dependencies = [ "profiling", "range-alloc", "raw-window-handle 0.6.2", + "raw-window-metal", "renderdoc-sys", "smallvec", "thiserror 2.0.18", "wasm-bindgen", + "wayland-sys", "web-sys", - "wgpu-types 26.0.0", - "windows 0.58.0", - "windows-core 0.58.0", + "wgpu-naga-bridge", + "wgpu-types", + "windows 0.62.2", + "windows-core 0.62.2", + "windows-result 0.4.1", ] [[package]] -name = "wgpu-types" -version = "0.19.2" +name = "wgpu-naga-bridge" +version = "29.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b671ff9fb03f78b46ff176494ee1ebe7d603393f42664be55b64dc8d53969805" +checksum = "59c654c483f058800972c3645e95388a7eca31bf9fe1933bc20e036588a0be02" dependencies = [ - "bitflags 2.11.1", - "js-sys", - "web-sys", + "naga", + "wgpu-types", ] [[package]] name = "wgpu-types" -version = "26.0.0" +version = "29.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eca7a8d8af57c18f57d393601a1fb159ace8b2328f1b6b5f80893f7d672c9ae2" +checksum = "a9bcc31518a0e9735aefebedb5f7a9ef3ed1c42549c9f4c882fa9060ceaac639" dependencies = [ "bitflags 2.11.1", "bytemuck", "js-sys", "log", - "thiserror 2.0.18", + "raw-window-handle 0.6.2", "web-sys", ] [[package]] name = "wgpu_context" -version = "0.1.2" +version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a0f49e6f733fcc61e41a5ecdb36910baa5148497036784bca319289bfdca6141" +checksum = "b1352548a4576b7998474fa6fbc54232df5f9ccd90cdea079418c3577e26e220" dependencies = [ "futures-intrusive", - "wgpu 26.0.1", + "wgpu", ] [[package]] @@ -9606,12 +9006,6 @@ dependencies = [ "safe_arch", ] -[[package]] -name = "widestring" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" - [[package]] name = "winapi" version = "0.3.9" @@ -9643,16 +9037,6 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" -[[package]] -name = "windows" -version = "0.52.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" -dependencies = [ - "windows-core 0.52.0", - "windows-targets 0.52.6", -] - [[package]] name = "windows" version = "0.58.0" @@ -9669,11 +9053,23 @@ version = "0.61.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" dependencies = [ - "windows-collections", + "windows-collections 0.2.0", "windows-core 0.61.2", - "windows-future", + "windows-future 0.2.1", "windows-link 0.1.3", - "windows-numerics", + "windows-numerics 0.2.0", +] + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections 0.3.2", + "windows-core 0.62.2", + "windows-future 0.3.2", + "windows-numerics 0.3.1", ] [[package]] @@ -9686,12 +9082,12 @@ dependencies = [ ] [[package]] -name = "windows-core" -version = "0.52.0" +name = "windows-collections" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" dependencies = [ - "windows-targets 0.52.6", + "windows-core 0.62.2", ] [[package]] @@ -9720,6 +9116,19 @@ dependencies = [ "windows-strings 0.4.2", ] +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", +] + [[package]] name = "windows-future" version = "0.2.1" @@ -9728,7 +9137,18 @@ checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ "windows-core 0.61.2", "windows-link 0.1.3", - "windows-threading", + "windows-threading 0.1.0", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core 0.62.2", + "windows-link 0.2.1", + "windows-threading 0.2.1", ] [[package]] @@ -9797,6 +9217,16 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core 0.62.2", + "windows-link 0.2.1", +] + [[package]] name = "windows-registry" version = "0.5.3" @@ -9826,6 +9256,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-strings" version = "0.1.0" @@ -9845,6 +9284,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -9947,6 +9395,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-version" version = "0.1.7" @@ -10096,51 +9553,224 @@ checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winit" -version = "0.30.13" +version = "0.31.0-beta.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6755fa58a9f8350bd1e472d4c3fcc25f824ec358933bba33306d0b63df5978d" +checksum = "2879d2854d1a43e48f67322d4bd097afcb6eb8f8f775c8de0260a71aea1df1aa" +dependencies = [ + "bitflags 2.11.1", + "cfg_aliases", + "cursor-icon", + "dpi", + "libc", + "raw-window-handle 0.6.2", + "rustix", + "smol_str", + "tracing", + "winit-android", + "winit-appkit", + "winit-common", + "winit-core", + "winit-orbital", + "winit-uikit", + "winit-wayland", + "winit-web", + "winit-win32", + "winit-x11", +] + +[[package]] +name = "winit-android" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d9c0d2cd93efec3a9f9ad819cfaf0834782403af7c0d248c784ec0c61761df" dependencies = [ - "ahash", "android-activity", - "atomic-waker", "bitflags 2.11.1", - "block2 0.5.1", - "bytemuck", + "dpi", + "ndk", + "raw-window-handle 0.6.2", + "smol_str", + "tracing", + "winit-core", +] + +[[package]] +name = "winit-appkit" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21310ca07851a49c348e0c2cc768e36b52ca65afda2c2354d78ed4b90074d8aa" +dependencies = [ + "bitflags 2.11.1", + "block2 0.6.2", + "dispatch2", + "dpi", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-video", + "objc2-foundation 0.3.2", + "raw-window-handle 0.6.2", + "smol_str", + "tracing", + "winit-common", + "winit-core", +] + +[[package]] +name = "winit-common" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45375fbac4cbb77260d83a30b1f9d8105880dbac99a9ae97f56656694680ff69" +dependencies = [ + "memmap2", + "objc2 0.6.4", + "objc2-core-foundation", + "smol_str", + "tracing", + "winit-core", + "x11-dl", + "xkbcommon-dl", +] + +[[package]] +name = "winit-core" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4f0ccd7abb43740e2c6124ac7cae7d865ecec74eec63783e8922577ac232583" +dependencies = [ + "bitflags 2.11.1", + "cursor-icon", + "dpi", + "keyboard-types 0.8.3", + "raw-window-handle 0.6.2", + "smol_str", + "web-time", +] + +[[package]] +name = "winit-orbital" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51ea1fb262e7209f265f12bd0cc792c399b14355675e65531e9c8a87db287d46" +dependencies = [ + "bitflags 2.11.1", + "dpi", + "orbclient", + "raw-window-handle 0.6.2", + "redox_syscall 0.5.18", + "smol_str", + "tracing", + "winit-core", +] + +[[package]] +name = "winit-uikit" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "680a356e798837d8eb274d4556e83bceaf81698194e31aafc5cfb8a9f2fab643" +dependencies = [ + "bitflags 2.11.1", + "block2 0.6.2", + "dispatch2", + "dpi", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-ui-kit", + "raw-window-handle 0.6.2", + "smol_str", + "tracing", + "winit-common", + "winit-core", +] + +[[package]] +name = "winit-wayland" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce5afb2ba07da603f84b722c95f9f9396d2cedae3944fb6c0cda4a6f88de545" +dependencies = [ + "ahash", + "bitflags 2.11.1", "calloop", - "cfg_aliases 0.2.1", - "concurrent-queue", - "core-foundation 0.9.4", - "core-graphics 0.23.2", "cursor-icon", "dpi", - "js-sys", "libc", "memmap2", - "ndk", - "objc2 0.5.2", - "objc2-app-kit 0.2.2", - "objc2-foundation 0.2.2", - "objc2-ui-kit 0.2.2", - "orbclient", - "percent-encoding", - "pin-project", "raw-window-handle 0.6.2", - "redox_syscall 0.4.1", - "rustix 0.38.44", + "rustix", "sctk-adwaita", "smithay-client-toolkit", "smol_str", "tracing", - "unicode-segmentation", - "wasm-bindgen", - "wasm-bindgen-futures", "wayland-backend", "wayland-client", "wayland-protocols", "wayland-protocols-plasma", + "winit-common", + "winit-core", +] + +[[package]] +name = "winit-web" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c2490a953fb776fbbd5e295d54f1c3847f4f15b6c3929ec53c09acda6487a92" +dependencies = [ + "atomic-waker", + "bitflags 2.11.1", + "concurrent-queue", + "cursor-icon", + "dpi", + "js-sys", + "pin-project", + "raw-window-handle 0.6.2", + "smol_str", + "tracing", + "wasm-bindgen", + "wasm-bindgen-futures", "web-sys", "web-time", - "windows-sys 0.52.0", + "winit-core", +] + +[[package]] +name = "winit-win32" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "644ea78af0e858aa3b092e5d1c67c41995a98220c81813f1353b28bc8bb91eaa" +dependencies = [ + "bitflags 2.11.1", + "cursor-icon", + "dpi", + "raw-window-handle 0.6.2", + "smol_str", + "tracing", + "unicode-segmentation", + "windows-sys 0.59.0", + "winit-core", +] + +[[package]] +name = "winit-x11" +version = "0.31.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa5b600756534c7041aa93cd0d244d44b09fca1b89e202bd1cd80dd9f3636c46" +dependencies = [ + "bitflags 2.11.1", + "bytemuck", + "calloop", + "cursor-icon", + "dpi", + "libc", + "percent-encoding", + "raw-window-handle 0.6.2", + "rustix", + "smol_str", + "tracing", + "winit-common", + "winit-core", "x11-dl", "x11rb", "xkbcommon-dl", @@ -10222,7 +9852,7 @@ dependencies = [ "objc2-app-kit 0.3.2", "objc2-core-foundation", "objc2-foundation 0.3.2", - "objc2-ui-kit 0.3.2", + "objc2-ui-kit", "objc2-web-kit", "once_cell", "percent-encoding", @@ -10240,6 +9870,18 @@ dependencies = [ "windows-version", ] +[[package]] +name = "wuff" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d77cd3107d02dc860d9377a7e28a60e2a77c6d1964f4119999b03dd95f007719" +dependencies = [ + "arrayvec", + "brotli-decompressor", + "bytes", + "flate2", +] + [[package]] name = "x11" version = "2.21.0" @@ -10272,8 +9914,9 @@ dependencies = [ "libc", "libloading 0.8.9", "once_cell", - "rustix 1.1.4", + "rustix", "x11rb-protocol", + "xcursor", ] [[package]] @@ -10288,16 +9931,6 @@ version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bec9e4a500ca8864c5b47b8b482a73d62e4237670e5b5f1d6b9e3cae50f28f2b" -[[package]] -name = "xdg-home" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" -dependencies = [ - "libc", - "windows-sys 0.59.0", -] - [[package]] name = "xkbcommon-dl" version = "0.4.2" @@ -10325,12 +9958,12 @@ checksum = "3ae8337f8a065cfc972643663ea4279e04e7256de865aa66fe25cec5fb912d3f" [[package]] name = "xml5ever" -version = "0.35.0" +version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ee3f1e41afb31a75aef076563b0ad3ecc24f5bd9d12a72b132222664eb76b494" +checksum = "5ab627f34ff61b80d756180d556f9c68801d836d271b3b8c094504ceca69d221" dependencies = [ "log", - "markup5ever 0.35.0", + "markup5ever 0.39.0", ] [[package]] @@ -10345,12 +9978,6 @@ version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdd20c5420375476fbd4394763288da7eb0cc0b8c11deed431a91562af7335d3" -[[package]] -name = "yazi" -version = "0.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" - [[package]] name = "yeslogic-fontconfig-sys" version = "6.0.1" @@ -10370,127 +9997,45 @@ checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40" dependencies = [ "serde", "stable_deref_trait", - "yoke-derive", + "yoke-derive 0.7.5", "zerofrom", ] [[package]] -name = "yoke-derive" -version = "0.7.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", - "synstructure", -] - -[[package]] -name = "zbus" -version = "4.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb97012beadd29e654708a0fdb4c84bc046f537aecfde2c3ee0a9e4b4d48c725" -dependencies = [ - "async-broadcast", - "async-executor", - "async-fs", - "async-io", - "async-lock", - "async-process", - "async-recursion", - "async-task", - "async-trait", - "blocking", - "enumflags2", - "event-listener", - "futures-core", - "futures-sink", - "futures-util", - "hex", - "nix", - "ordered-stream", - "rand 0.8.6", - "serde", - "serde_repr", - "sha1", - "static_assertions", - "tracing", - "uds_windows", - "windows-sys 0.52.0", - "xdg-home", - "zbus_macros", - "zbus_names", - "zvariant", -] - -[[package]] -name = "zbus-lockstep" -version = "0.4.4" +name = "yoke" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ca2c5dceb099bddaade154055c926bb8ae507a18756ba1d8963fd7b51d8ed1d" +checksum = "abe8c5fda708d9ca3df187cae8bfb9ceda00dd96231bed36e445a1a48e66f9ca" dependencies = [ - "zbus_xml", - "zvariant", + "stable_deref_trait", + "yoke-derive 0.8.2", + "zerofrom", ] [[package]] -name = "zbus-lockstep-macros" -version = "0.4.4" +name = "yoke-derive" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "709ab20fc57cb22af85be7b360239563209258430bccf38d8b979c5a2ae3ecce" +checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", "syn 2.0.117", - "zbus-lockstep", - "zbus_xml", - "zvariant", + "synstructure", ] [[package]] -name = "zbus_macros" -version = "4.4.0" +name = "yoke-derive" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "267db9407081e90bbfa46d841d3cbc60f59c0351838c4bc65199ecd79ab1983e" +checksum = "de844c262c8848816172cef550288e7dc6c7b7814b4ee56b3e1553f275f1858e" dependencies = [ - "proc-macro-crate 3.5.0", "proc-macro2", "quote", "syn 2.0.117", - "zvariant_utils", -] - -[[package]] -name = "zbus_names" -version = "3.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" -dependencies = [ - "serde", - "static_assertions", - "zvariant", -] - -[[package]] -name = "zbus_xml" -version = "4.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab3f374552b954f6abb4bd6ce979e6c9b38fb9d0cd7cc68a7d796e70c9f3a233" -dependencies = [ - "quick-xml 0.30.0", - "serde", - "static_assertions", - "zbus_names", - "zvariant", + "synstructure", ] -[[package]] -name = "zeno" -version = "0.3.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" - [[package]] name = "zerocopy" version = "0.8.48" @@ -10538,15 +10083,38 @@ version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" +[[package]] +name = "zerotrie" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa766b97d68da210d29cc0bc8d072d87de9359cb998e4bc30ab4982a1c795d47" +dependencies = [ + "displaydoc", + "yoke 0.7.5", + "zerofrom", +] + [[package]] name = "zerovec" version = "0.10.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "aa2b893d79df23bfb12d5461018d408ea19dfafe76c2c7ef6d4eba614f8ff079" dependencies = [ - "yoke", + "yoke 0.7.5", + "zerofrom", + "zerovec-derive 0.10.3", +] + +[[package]] +name = "zerovec" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90f911cbc359ab6af17377d242225f4d75119aec87ea711a880987b18cd7b239" +dependencies = [ + "serde", + "yoke 0.8.2", "zerofrom", - "zerovec-derive", + "zerovec-derive 0.11.3", ] [[package]] @@ -10560,6 +10128,17 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "zerovec-derive" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625dc425cab0dca6dc3c3319506e6593dcb08a9f387ea3b284dbd52a92c40555" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + [[package]] name = "zmij" version = "1.0.21" @@ -10589,40 +10168,3 @@ checksum = "29ce2c8a9384ad323cf564b67da86e21d3cfdff87908bc1223ed5c99bc792713" dependencies = [ "zune-core", ] - -[[package]] -name = "zvariant" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2084290ab9a1c471c38fc524945837734fbf124487e105daec2bb57fd48c81fe" -dependencies = [ - "endi", - "enumflags2", - "serde", - "static_assertions", - "zvariant_derive", -] - -[[package]] -name = "zvariant_derive" -version = "4.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73e2ba546bda683a90652bac4a279bc146adad1386f25379cf73200d2002c449" -dependencies = [ - "proc-macro-crate 3.5.0", - "proc-macro2", - "quote", - "syn 2.0.117", - "zvariant_utils", -] - -[[package]] -name = "zvariant_utils" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c51bcff7cc3dbb5055396bcf774748c3dab426b4b8659046963523cee4808340" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.117", -] diff --git a/Cargo.toml b/Cargo.toml index 5bed6886..55ac51d9 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -9,6 +9,16 @@ tracing = { version = "0.1", features = ["std"] } dioxus = "0.7.8" dioxus-rsx = "0.7.8" +[patch.crates-io] +dioxus = { path = "../selection/packages/dioxus" } +dioxus-rsx = { path = "../selection/packages/rsx" } +dioxus-ssr = { path = "../selection/packages/ssr" } + +[patch."https://github.com/ealmloff/dioxus"] +dioxus = { path = "../selection/packages/dioxus" } +dioxus-signals = { path = "../selection/packages/signals" } +lazy-js-bundle = { path = "../selection/packages/lazy-js-bundle" } + [profile.release] opt-level = "z" debug = false diff --git a/component.json b/component.json index c0986114..015c7262 100644 --- a/component.json +++ b/component.json @@ -5,6 +5,7 @@ "preview/src/components/tabs", "preview/src/components/dropdown_menu", "preview/src/components/navbar", + "preview/src/components/otp", "preview/src/components/form", "preview/src/components/tooltip", "preview/src/components/calendar", diff --git a/playwright/otp.spec.ts b/playwright/otp.spec.ts new file mode 100644 index 00000000..46b08cbd --- /dev/null +++ b/playwright/otp.spec.ts @@ -0,0 +1,328 @@ +import { test, expect, type Locator, type Page } from '@playwright/test'; + +const previewUrl = process.env.PREVIEW_URL ?? 'http://127.0.0.1:8080'; +const otpUrl = new URL('/component/?name=otp&', previewUrl).toString(); +const nonAsciiOtpUrl = new URL('/component/?name=otp&variant=non_ascii&', previewUrl).toString(); + +async function waitForOtpLayout(page: Page) { + const input = page.getByRole('textbox', { name: 'One-time password' }); + const frame = page.locator('#component-preview-frame').first(); + await expect + .poll(async () => { + const [inputBox, frameBox] = await Promise.all([ + input.boundingBox(), + frame.boundingBox(), + ]); + + if (!inputBox || !frameBox) { + return false; + } + + return ( + inputBox.width < 400 && + frameBox.width < 900 && + inputBox.x >= frameBox.x && + inputBox.x + inputBox.width <= frameBox.x + frameBox.width + ); + }) + .toBe(true); + await input.scrollIntoViewIfNeeded(); + await expect(input).toBeInViewport(); +} + +function otpSlot(otp: Locator, index: number) { + return otp.locator('[data-empty]').nth(index); +} + +test('otp typing, backspace, and rejection', async ({ page }) => { + await page.goto(otpUrl, { timeout: 20 * 60 * 1000 }); + + const input = page.getByRole('textbox', { name: 'One-time password' }); + await expect(input).toBeVisible(); + await expect(input).toHaveCSS('opacity', '0'); + + await input.focus(); + await page.keyboard.type('123456'); + await expect(page.locator('#otp-value')).toHaveText('123456'); + + await page.keyboard.press('Backspace'); + await expect(page.locator('#otp-value')).toHaveText('12345'); + + await page.keyboard.press('a'); + await expect(page.locator('#otp-value')).toHaveText('12345'); +}); + +test('otp cursor does not drift past typed length', async ({ page }) => { + await page.goto(otpUrl, { timeout: 20 * 60 * 1000 }); + + const input = page.getByRole('textbox', { name: 'One-time password' }); + await input.focus(); + await page.keyboard.type('12'); + // Three right-arrows from end should be no-ops — cursor is already at end. + await page.keyboard.press('ArrowRight'); + await page.keyboard.press('ArrowRight'); + await page.keyboard.press('ArrowRight'); + // The next typed digit goes at position 2, not somewhere past it. + await page.keyboard.type('3'); + await expect(page.locator('#otp-value')).toHaveText('123'); +}); + +test('otp ArrowLeft replaces the active slot', async ({ page }) => { + await page.goto(otpUrl, { timeout: 20 * 60 * 1000 }); + + const input = page.getByRole('textbox', { name: 'One-time password' }); + await input.focus(); + await page.keyboard.type('12'); + await page.keyboard.press('ArrowLeft'); + await page.keyboard.type('9'); + await expect(page.locator('#otp-value')).toHaveText('19'); +}); + +test('otp input events replace the active slot', async ({ page }) => { + await page.goto(otpUrl, { timeout: 20 * 60 * 1000 }); + + const input = page.getByRole('textbox', { name: 'One-time password' }); + await input.focus(); + await page.keyboard.type('12'); + await page.keyboard.press('ArrowLeft'); + + // insertText simulates paste / IME / on-screen-keyboard input without a + // keydown event for the inserted text. + await page.keyboard.insertText('9'); + await page.keyboard.insertText('8'); + await expect(page.locator('#otp-value')).toHaveText('198'); +}); + +test('otp does not let the native input grow past maxlength', async ({ page }) => { + await page.goto(otpUrl, { timeout: 20 * 60 * 1000 }); + + const input = page.getByRole('textbox', { name: 'One-time password' }); + await input.focus(); + await page.keyboard.type('1234567'); + await expect(page.locator('#otp-value')).toHaveText('123457'); + await expect(input).toHaveValue('123457'); + + await page.keyboard.press('Home'); + await page.keyboard.type('9'); + await expect(page.locator('#otp-value')).toHaveText('923457'); + await expect(input).toHaveValue('923457'); + + await page.keyboard.press('End'); + await page.keyboard.type('8'); + await expect(page.locator('#otp-value')).toHaveText('923458'); + await expect(input).toHaveValue('923458'); +}); + +test('otp keeps visual focus visible at the end', async ({ page }) => { + await page.goto(otpUrl, { timeout: 20 * 60 * 1000 }); + + const input = page.getByRole('textbox', { name: 'One-time password' }); + const otp = input.locator('xpath=..'); + await input.focus(); + await page.keyboard.type('123456'); + + await expect(otp.locator('[data-active="true"]')).toHaveCount(1); + await expect(otpSlot(otp, 5)).toHaveAttribute('data-active', 'true'); + + await page.keyboard.press('ArrowRight'); + await page.keyboard.press('End'); + await expect(otp.locator('[data-active="true"]')).toHaveCount(1); + await expect(otpSlot(otp, 5)).toHaveAttribute('data-active', 'true'); + await expect(otpSlot(otp, 5)).toHaveCSS('border-left-width', '1px'); + await expect(otpSlot(otp, 5)).toHaveCSS('border-left-style', 'solid'); +}); + +test('otp renders its own selection highlight', async ({ page }) => { + await page.goto(otpUrl, { timeout: 20 * 60 * 1000 }); + + const input = page.getByRole('textbox', { name: 'One-time password' }); + const otp = input.locator('xpath=..'); + await input.focus(); + await page.keyboard.type('123456'); + + await page.keyboard.press('ControlOrMeta+A'); + await expect(otp.locator('[data-selected="true"]')).toHaveCount(6); + + await page.keyboard.type('9'); + await expect(page.locator('#otp-value')).toHaveText('9'); + await expect(otp.locator('[data-selected="true"]')).toHaveCount(0); +}); + +test('otp pointer selection highlights slots', async ({ page }) => { + await page.goto(otpUrl, { timeout: 20 * 60 * 1000 }); + + const input = page.getByRole('textbox', { name: 'One-time password' }); + const otp = input.locator('xpath=..'); + await input.focus(); + await page.keyboard.type('123456'); + await input.evaluate((node: HTMLInputElement) => node.blur()); + await expect(input).not.toBeFocused(); + await waitForOtpLayout(page); + + const start = await otpSlot(otp, 1).boundingBox(); + const end = await otpSlot(otp, 4).boundingBox(); + expect(start).not.toBeNull(); + expect(end).not.toBeNull(); + + await page.mouse.move(start!.x + start!.width / 2 + 1, start!.y + start!.height / 2); + await page.mouse.down(); + await page.mouse.move(end!.x + end!.width / 2 + 1, end!.y + end!.height / 2, { steps: 5 }); + await page.mouse.up(); + + await expect(otp.locator('[data-selected="true"]')).toHaveCount(4); + await expect(otpSlot(otp, 1)).toHaveAttribute('data-selection-start', 'true'); + await expect(otpSlot(otp, 4)).toHaveAttribute('data-selection-end', 'true'); + + await page.keyboard.type('9'); + await expect(page.locator('#otp-value')).toHaveText('196'); +}); + +test('otp backward pointer selection includes the slot under the pointer', async ({ page }) => { + await page.goto(otpUrl, { timeout: 20 * 60 * 1000 }); + + const input = page.getByRole('textbox', { name: 'One-time password' }); + const otp = input.locator('xpath=..'); + await input.focus(); + await page.keyboard.type('123456'); + await waitForOtpLayout(page); + + const start = await otpSlot(otp, 4).boundingBox(); + const end = await otpSlot(otp, 1).boundingBox(); + expect(start).not.toBeNull(); + expect(end).not.toBeNull(); + + await page.mouse.move(start!.x + start!.width / 2, start!.y + start!.height / 2); + await page.mouse.down(); + await page.mouse.move(end!.x + end!.width / 2, end!.y + end!.height / 2, { steps: 5 }); + await page.mouse.up(); + + await expect(otp.locator('[data-selected="true"]')).toHaveCount(4); + await expect(otpSlot(otp, 4)).toHaveAttribute('data-selected', 'true'); + await expect(otpSlot(otp, 1)).toHaveAttribute('data-selection-start', 'true'); + await expect(otpSlot(otp, 1)).toHaveCSS('border-left-width', '1px'); + await expect(otpSlot(otp, 1)).toHaveCSS('border-left-style', 'solid'); + + await page.keyboard.type('9'); + await expect(page.locator('#otp-value')).toHaveText('196'); +}); + +test('otp copy cut and paste use the visible selection', async ({ + page, + context, + browserName, +}) => { + test.skip(browserName !== 'chromium', 'Clipboard permissions are Chromium-only in Playwright.'); + + await context.grantPermissions(['clipboard-read', 'clipboard-write']); + await page.goto(otpUrl, { timeout: 20 * 60 * 1000 }); + + const input = page.getByRole('textbox', { name: 'One-time password' }); + const otp = input.locator('xpath=..'); + await input.focus(); + await page.keyboard.type('123456'); + + await page.keyboard.press('ControlOrMeta+A'); + await expect(otp.locator('[data-selected="true"]')).toHaveCount(6); + + await page.keyboard.press('ControlOrMeta+C'); + await expect.poll(() => page.evaluate(() => navigator.clipboard.readText())).toBe('123456'); + + await page.evaluate(() => navigator.clipboard.writeText('98')); + await page.keyboard.press('ControlOrMeta+V'); + await expect(page.locator('#otp-value')).toHaveText('98'); + + await page.keyboard.press('ControlOrMeta+A'); + await page.keyboard.press('ControlOrMeta+X'); + await expect.poll(() => page.evaluate(() => navigator.clipboard.readText())).toBe('98'); + await expect(page.locator('#otp-value')).toHaveText(''); +}); + +test('otp paste fills all slots', async ({ page }) => { + await page.goto(otpUrl, { timeout: 20 * 60 * 1000 }); + + const input = page.getByRole('textbox', { name: 'One-time password' }); + await input.focus(); + // insertText simulates a paste / IME / on-screen-keyboard input event. + await page.keyboard.insertText('987654'); + await expect(page.locator('#otp-value')).toHaveText('987654'); +}); + +test('otp accepts emoji input in the non-ascii variant', async ({ page }) => { + await page.goto(nonAsciiOtpUrl, { timeout: 20 * 60 * 1000 }); + + const input = page.getByRole('textbox', { name: 'Emoji code' }); + await expect(input).toBeVisible(); + await input.focus(); + + for (const emoji of ['😀', '😃', '😄', '😁']) { + await page.keyboard.insertText(emoji); + } + + const value = '😀😃😄😁'; + await expect(page.locator('#otp-non-ascii-value')).toHaveText(value); + await expect(page.locator('#otp-non-ascii-complete')).toHaveText(value); + await expect(input).toHaveValue(value); +}); + +test('otp on_complete fires only when the value reaches maxlength', async ({ page }) => { + await page.goto(otpUrl, { timeout: 20 * 60 * 1000 }); + + const input = page.getByRole('textbox', { name: 'One-time password' }); + const complete = page.locator('#otp-complete'); + + await input.focus(); + await page.keyboard.type('12345'); + await expect(page.locator('#otp-value')).toHaveText('12345'); + await expect(complete).toHaveText(''); + + await page.keyboard.type('6'); + await expect(complete).toHaveText('123456'); + + // Editing back below maxlength should not re-fire complete; the last value sticks. + await page.keyboard.press('Backspace'); + await expect(page.locator('#otp-value')).toHaveText('12345'); + await expect(complete).toHaveText('123456'); +}); + +test('otp on_complete does not re-fire when editing a full buffer', async ({ page }) => { + await page.goto(otpUrl, { timeout: 20 * 60 * 1000 }); + + const input = page.getByRole('textbox', { name: 'One-time password' }); + const complete = page.locator('#otp-complete'); + + await input.focus(); + await page.keyboard.type('123456'); + await expect(complete).toHaveText('123456'); + + // Move into the full buffer and type. The keydown handler replaces the active + // slot, keeping length at maxlength but changing the value. This is + // NOT a transition to maxlength, so on_complete must not fire again. + await page.keyboard.press('Home'); + await page.keyboard.press('9'); + await expect(page.locator('#otp-value')).toHaveText('923456'); + await expect(complete).toHaveText('123456'); +}); + +test('otp disabled state blocks input', async ({ page }) => { + await page.goto(otpUrl, { timeout: 20 * 60 * 1000 }); + + const input = page.getByRole('textbox', { name: 'One-time password' }); + await page + .locator('#otp-toggle-disabled') + .evaluate((node: HTMLButtonElement) => node.click()); + await expect(input).toBeDisabled(); + + // Typing into a disabled input is a no-op in the browser. + await input.focus({ timeout: 1000 }).catch(() => { /* focus may be refused while disabled */ }); + await page.keyboard.type('123'); + await expect(page.locator('#otp-value')).toHaveText(''); + + // Re-enable and confirm input works again. + await page + .locator('#otp-toggle-disabled') + .evaluate((node: HTMLButtonElement) => node.click()); + await expect(input).toBeEnabled(); + await input.focus(); + await page.keyboard.type('123'); + await expect(page.locator('#otp-value')).toHaveText('123'); +}); diff --git a/preview/Cargo.toml b/preview/Cargo.toml index 240a3afe..e58f3fd7 100644 --- a/preview/Cargo.toml +++ b/preview/Cargo.toml @@ -7,7 +7,7 @@ rust-version = "1.88.0" [dependencies] dioxus = { workspace = true, features = ["router"] } dioxus-code = { version = "0.1.0", default-features = false, features = ["macro", "lang-css"] } -dioxus-icons = "0.1.0" +dioxus-icons = { git = "https://github.com/ealmloff/dioxus-icons", branch = "bump-dioxus" } dioxus-primitives.workspace = true dioxus-i18n = { git = "https://github.com/ealmloff/dioxus-i18n", branch = "bump-dioxus" } palette = "0.7.6" diff --git a/preview/src/components/mod.rs b/preview/src/components/mod.rs index cad937b4..a70b6a11 100644 --- a/preview/src/components/mod.rs +++ b/preview/src/components/mod.rs @@ -193,6 +193,7 @@ examples!( label, menubar, navbar, + otp[non_ascii], pagination, popover, progress, diff --git a/preview/src/components/otp/component.json b/preview/src/components/otp/component.json new file mode 100644 index 00000000..a963a6b0 --- /dev/null +++ b/preview/src/components/otp/component.json @@ -0,0 +1,13 @@ +{ + "name": "otp", + "description": "An accessible, composable one-time-password input.", + "authors": ["Evan Almloff"], + "exclude": ["variants", "docs.md", "component.json"], + "cargoDependencies": [ + { + "name": "dioxus-primitives", + "git": "https://github.com/DioxusLabs/components" + } + ], + "globalAssets": ["../../../assets/dx-components-theme.css"] +} diff --git a/preview/src/components/otp/component.rs b/preview/src/components/otp/component.rs new file mode 100644 index 00000000..20a82b75 --- /dev/null +++ b/preview/src/components/otp/component.rs @@ -0,0 +1,84 @@ +use dioxus::prelude::*; +use dioxus_primitives::otp::{ + self, OneTimePasswordGroupProps, OneTimePasswordInputProps, OneTimePasswordSeparatorProps, + OneTimePasswordSlotProps, +}; +use dioxus_primitives::{dioxus_attributes::attributes, merge_attributes}; + +#[css_module("/src/components/otp/style.css")] +struct Styles; + +#[component] +pub fn OneTimePasswordInput(props: OneTimePasswordInputProps) -> Element { + let base = attributes!(div { class: Styles::dx_otp }); + let merged = merge_attributes(vec![base, props.attributes]); + rsx! { + otp::OneTimePasswordInput { + value: props.value, + default_value: props.default_value, + maxlength: props.maxlength, + inputmode: props.inputmode, + autocomplete: props.autocomplete, + disabled: props.disabled, + required: props.required, + name: props.name, + id: props.id, + aria_label: props.aria_label, + aria_labelledby: props.aria_labelledby, + validate: props.validate, + on_value_change: props.on_value_change, + on_complete: props.on_complete, + attributes: merged, + {props.children} + } + } +} + +#[component] +pub fn OneTimePasswordGroup(props: OneTimePasswordGroupProps) -> Element { + let base = attributes!(div { class: Styles::dx_otp_group }); + let merged = merge_attributes(vec![base, props.attributes]); + rsx! { + otp::OneTimePasswordGroup { + attributes: merged, + {props.children} + } + } +} + +#[component] +pub fn OneTimePasswordSlot(props: OneTimePasswordSlotProps) -> Element { + let base = attributes!(div { class: Styles::dx_otp_slot }); + let merged = merge_attributes(vec![base, props.attributes]); + rsx! { + otp::OneTimePasswordSlot { + index: props.index, + attributes: merged, + span { class: Styles::dx_otp_caret, aria_hidden: "true" } + {props.children} + } + } +} + +#[component] +pub fn OneTimePasswordSeparator(props: OneTimePasswordSeparatorProps) -> Element { + let base = attributes!(div { class: Styles::dx_otp_separator }); + let merged = merge_attributes(vec![base, props.attributes]); + rsx! { + otp::OneTimePasswordSeparator { + attributes: merged, + svg { + width: "10", + height: "10", + view_box: "0 0 24 24", + fill: "none", + stroke: "currentColor", + stroke_width: "2", + stroke_linecap: "round", + stroke_linejoin: "round", + line { x1: "5", y1: "12", x2: "19", y2: "12" } + } + {props.children} + } + } +} diff --git a/preview/src/components/otp/docs.md b/preview/src/components/otp/docs.md new file mode 100644 index 00000000..9eba1512 --- /dev/null +++ b/preview/src/components/otp/docs.md @@ -0,0 +1,30 @@ +The OneTimePasswordInput component is used to capture a short code (typically a 6-digit +authentication code) into a row of discrete slots. It is built on a single accessible +`` element so paste, browser autofill (`autocomplete="one-time-code"`), IME +composition, and screen readers all continue to work. + +## Component Structure + +```rust +// The wrapper holds the hidden input and provides shared state to all slots. +OneTimePasswordInput { + maxlength: 6, + aria_label: "One-time password", + // Reject anything that isn't a digit (paste, autofill, and keystrokes). + validate: |s: String| s.chars().all(|c| c.is_ascii_digit()), + // A visual grouping of contiguous slots. + OneTimePasswordGroup { + // Each slot displays the character at its `index`. + OneTimePasswordSlot { index: 0 } + OneTimePasswordSlot { index: 1 } + OneTimePasswordSlot { index: 2 } + } + // Decorative separator placed between groups. + OneTimePasswordSeparator {} + OneTimePasswordGroup { + OneTimePasswordSlot { index: 3 } + OneTimePasswordSlot { index: 4 } + OneTimePasswordSlot { index: 5 } + } +} +``` diff --git a/preview/src/components/otp/mod.rs b/preview/src/components/otp/mod.rs new file mode 100644 index 00000000..2590c013 --- /dev/null +++ b/preview/src/components/otp/mod.rs @@ -0,0 +1,2 @@ +mod component; +pub use component::*; diff --git a/preview/src/components/otp/style.css b/preview/src/components/otp/style.css new file mode 100644 index 00000000..9509fa9a --- /dev/null +++ b/preview/src/components/otp/style.css @@ -0,0 +1,123 @@ +.dx-otp { + display: flex; + width: fit-content; + align-items: center; + font-family: inherit; + gap: 0.5rem; +} + +.dx-otp[data-disabled="true"] { + cursor: not-allowed; + opacity: 0.5; +} + +.dx-otp[data-disabled="true"] input { + cursor: not-allowed; +} + +.dx-otp-group { + display: flex; + align-items: center; +} + +.dx-otp-slot { + position: relative; + display: flex; + width: 2.25rem; + height: 2.25rem; + box-sizing: border-box; + align-items: center; + justify-content: center; + border-top: 1px solid var(--primary-color-7); + border-right: 1px solid var(--primary-color-7); + border-bottom: 1px solid var(--primary-color-7); + background-color: var(--light, var(--primary-color)) + var(--dark, color-mix(in oklab, var(--primary-color-7) 30%, transparent)); + box-shadow: 0 1px 2px 0 rgb(0 0 0 / 5%); + color: var(--secondary-color-1); + font-size: 0.875rem; + font-variant-numeric: tabular-nums; + font-weight: 500; + line-height: 1.25rem; + outline: none; + transition: color 100ms ease-out, background-color 100ms ease-out, + border-color 100ms ease-out, box-shadow 100ms ease-out; +} + +.dx-otp-group .dx-otp-slot:first-child { + border-left: 1px solid var(--primary-color-7); + border-bottom-left-radius: 0.375rem; + border-top-left-radius: 0.375rem; +} + +.dx-otp-group .dx-otp-slot:last-child { + border-bottom-right-radius: 0.375rem; + border-top-right-radius: 0.375rem; +} + +.dx-otp-group .dx-otp-slot[data-active="true"] { + z-index: 10; + border-color: var(--focused-border-color); + border-left: 1px solid var(--focused-border-color); + box-shadow: 0 0 0 2px var(--focused-border-color); +} + +.dx-otp-group .dx-otp-slot[data-selected="true"] { + z-index: 5; + border-color: var(--focused-border-color); + border-left: 1px solid var(--focused-border-color); + background-color: color-mix(in oklab, var(--focused-border-color) 24%, transparent); + color: var(--secondary-color-1); +} + +.dx-otp-group .dx-otp-slot[data-selection-start="true"] { + border-left: 1px solid var(--focused-border-color); +} + +/* Fake blinking caret — only visible in the active, empty slot */ +.dx-otp-caret { + position: absolute; + display: none; + align-items: center; + justify-content: center; + inset: 0; + pointer-events: none; +} + +.dx-otp-caret::after { + display: block; + width: 1px; + height: 1rem; + animation: dx-otp-caret-blink 1s ease-out infinite; + background-color: var(--secondary-color-1); + content: ""; +} + +.dx-otp-slot[data-active="true"][data-empty="true"] .dx-otp-caret { + display: flex; +} + +.dx-otp-slot[data-selected="true"] .dx-otp-caret { + display: none; +} + +@keyframes dx-otp-caret-blink { + 0%, + 70%, + 100% { + opacity: 1; + } + + 20%, + 50% { + opacity: 0; + } +} + +.dx-otp-separator { + display: flex; + align-items: center; + justify-content: center; + color: var(--secondary-color-4); + pointer-events: none; +} diff --git a/preview/src/components/otp/variants/main/mod.rs b/preview/src/components/otp/variants/main/mod.rs new file mode 100644 index 00000000..130edf6c --- /dev/null +++ b/preview/src/components/otp/variants/main/mod.rs @@ -0,0 +1,44 @@ +use super::super::component::*; +use dioxus::prelude::*; + +#[component] +pub fn Demo() -> Element { + let mut value = use_signal(String::new); + let mut last_complete = use_signal(String::new); + let mut disabled = use_signal(|| false); + + rsx! { + div { style: "position: relative; display: inline-flex; align-items: center; justify-content: center;", + OneTimePasswordInput { + maxlength: 6usize, + value: value(), + disabled: disabled(), + validate: |s: String| s.chars().all(|c| c.is_ascii_digit()), + on_value_change: move |v| value.set(v), + on_complete: move |v| last_complete.set(v), + aria_label: "One-time password", + OneTimePasswordGroup { + OneTimePasswordSlot { index: 0usize } + OneTimePasswordSlot { index: 1usize } + OneTimePasswordSlot { index: 2usize } + } + OneTimePasswordSeparator {} + OneTimePasswordGroup { + OneTimePasswordSlot { index: 3usize } + OneTimePasswordSlot { index: 4usize } + OneTimePasswordSlot { index: 5usize } + } + } + div { style: "display: none;", + span { id: "otp-value", "{value}" } + span { id: "otp-complete", "{last_complete}" } + button { + id: "otp-toggle-disabled", + r#type: "button", + onclick: move |_| disabled.toggle(), + "toggle disabled" + } + } + } + } +} diff --git a/preview/src/components/otp/variants/non_ascii/mod.rs b/preview/src/components/otp/variants/non_ascii/mod.rs new file mode 100644 index 00000000..707230d7 --- /dev/null +++ b/preview/src/components/otp/variants/non_ascii/mod.rs @@ -0,0 +1,43 @@ +use super::super::component::*; +use dioxus::prelude::*; + +#[component] +pub fn Demo() -> Element { + let mut value = use_signal(String::new); + let mut last_complete = use_signal(String::new); + + rsx! { + div { + style: "display: grid; gap: 0.75rem; justify-items: center;", + p { + style: "margin: 0; color: var(--secondary-color-2); font-size: 0.875rem; font-weight: 500;", + "Emoji code" + } + OneTimePasswordInput { + maxlength: 4usize, + value: value(), + inputmode: "text", + autocomplete: "off", + validate: |s: String| s.chars().all(|c| !c.is_ascii()), + on_value_change: move |v| value.set(v), + on_complete: move |v| last_complete.set(v), + aria_label: "Emoji code", + OneTimePasswordGroup { + OneTimePasswordSlot { index: 0usize } + OneTimePasswordSlot { index: 1usize } + OneTimePasswordSlot { index: 2usize } + OneTimePasswordSlot { index: 3usize } + } + } + output { + id: "otp-non-ascii-value", + aria_live: "polite", + style: "min-height: 1.25rem; color: var(--secondary-color-1); font-size: 1rem;", + "{value}" + } + div { style: "display: none;", + span { id: "otp-non-ascii-complete", "{last_complete}" } + } + } + } +} diff --git a/preview/src/dashboard/views/email_client/state.rs b/preview/src/dashboard/views/email_client/state.rs index 54726730..9a23cbd3 100644 --- a/preview/src/dashboard/views/email_client/state.rs +++ b/preview/src/dashboard/views/email_client/state.rs @@ -50,9 +50,9 @@ impl EmailClientState { } } -#[store(pub)] +#[store(pub(super))] impl Store { - fn active_folder_label(&self) -> &'static str { + pub(super) fn active_folder_label(&self) -> &'static str { let active_folder = self.active_folder().cloned(); FOLDERS .iter() @@ -61,7 +61,7 @@ impl Store { .unwrap_or("Inbox") } - fn visible_message_ids(&self) -> Vec { + pub(super) fn visible_message_ids(&self) -> Vec { let active_folder = self.active_folder().cloned(); let active_tab = self.active_tab().cloned(); let search_query = self.search_query().cloned(); @@ -88,7 +88,7 @@ impl Store { .collect() } - fn selected_message_uid(&self, visible_ids: &[String]) -> Option { + pub(super) fn selected_message_uid(&self, visible_ids: &[String]) -> Option { let selected_id = self.selected_id().cloned(); if visible_ids.iter().any(|uid| uid == &selected_id) { return Some(selected_id); @@ -97,7 +97,11 @@ impl Store { visible_ids.first().cloned() } - fn selected_message_index(&self, selected_uid: Option<&str>, visible_ids: &[String]) -> usize { + pub(super) fn selected_message_index( + &self, + selected_uid: Option<&str>, + visible_ids: &[String], + ) -> usize { selected_uid .and_then(|selected_uid| { visible_ids @@ -108,7 +112,7 @@ impl Store { .unwrap_or(0) } - fn folder_count(&self, folder_id: FolderId) -> u32 { + pub(super) fn folder_count(&self, folder_id: FolderId) -> u32 { let messages_store = self.messages(); let count = messages_store .read() @@ -118,7 +122,12 @@ impl Store { count } - fn tab_count(&self, tab_id: TabId, visible_query: &str, selected_tags: &[MessageTag]) -> u32 { + pub(super) fn tab_count( + &self, + tab_id: TabId, + visible_query: &str, + selected_tags: &[MessageTag], + ) -> u32 { let active_folder = self.active_folder().cloned(); let messages_store = self.messages(); let count = messages_store @@ -137,63 +146,63 @@ impl Store { count } - fn set_active_folder(&mut self, folder_id: FolderId) { + pub(super) fn set_active_folder(&mut self, folder_id: FolderId) { self.active_folder().set(folder_id); self.close_read_pane(); } - fn set_active_tab(&mut self, tab_id: TabId) { + pub(super) fn set_active_tab(&mut self, tab_id: TabId) { self.active_tab().set(tab_id); self.close_read_pane(); } - fn set_search_query(&mut self, query: String) { + pub(super) fn set_search_query(&mut self, query: String) { self.search_query().set(query); self.close_read_pane(); } - fn set_selected_tags(&mut self, tags: Vec) { + pub(super) fn set_selected_tags(&mut self, tags: Vec) { self.selected_tags().set(tags); self.close_read_pane(); } - fn select_message(&mut self, uid: String) { + pub(super) fn select_message(&mut self, uid: String) { self.selected_id().set(uid); self.read_open().set(true); } - fn close_read_pane(&mut self) { + pub(super) fn close_read_pane(&mut self) { self.read_open().set(false); } - fn open_compose(&mut self) { + pub(super) fn open_compose(&mut self) { self.compose_open().set(true); } - fn set_compose_open(&mut self, open: bool) { + pub(super) fn set_compose_open(&mut self, open: bool) { self.compose_open().set(open); } - fn discard_compose(&mut self) { + pub(super) fn discard_compose(&mut self) { self.compose_open().set(false); self.compose_to().set(String::new()); self.compose_subject().set(String::new()); self.compose_body().set(String::new()); } - fn set_compose_to(&mut self, value: String) { + pub(super) fn set_compose_to(&mut self, value: String) { self.compose_to().set(value); } - fn set_compose_subject(&mut self, value: String) { + pub(super) fn set_compose_subject(&mut self, value: String) { self.compose_subject().set(value); } - fn set_compose_body(&mut self, value: String) { + pub(super) fn set_compose_body(&mut self, value: String) { self.compose_body().set(value); } - fn archive_message(&mut self, uid: String) { + pub(super) fn archive_message(&mut self, uid: String) { self.update_message(uid.clone(), |message| { message.folder_id = FolderId::Archive; message.unread = false; @@ -201,14 +210,14 @@ impl Store { self.close_if_selected(&uid); } - fn snooze_message(&mut self, uid: String) { + pub(super) fn snooze_message(&mut self, uid: String) { self.update_message(uid.clone(), |message| { message.snoozed = true; }); self.close_if_selected(&uid); } - fn delete_message(&mut self, uid: String) { + pub(super) fn delete_message(&mut self, uid: String) { self.update_message(uid.clone(), |message| { message.folder_id = FolderId::Trash; message.unread = false; @@ -216,45 +225,45 @@ impl Store { self.close_if_selected(&uid); } - fn toggle_message_flag(&mut self, uid: String) { + pub(super) fn toggle_message_flag(&mut self, uid: String) { self.update_message(uid, |message| { message.flagged = !message.flagged; }); } - fn toggle_message_star(&mut self, uid: String) { + pub(super) fn toggle_message_star(&mut self, uid: String) { self.update_message(uid, |message| { message.starred = !message.starred; }); } - fn move_message_to_trash(&mut self, uid: String) { + pub(super) fn move_message_to_trash(&mut self, uid: String) { self.update_message(uid.clone(), |message| { message.folder_id = FolderId::Trash; }); self.close_if_selected(&uid); } - fn remove_message_tag(&mut self, uid: String, tag: MessageTag) { + pub(super) fn remove_message_tag(&mut self, uid: String, tag: MessageTag) { self.update_message(uid, |message| { message.tags.retain(|current| *current != tag); }); } - fn set_message_tags(&mut self, uid: String, tags: Vec) { + pub(super) fn set_message_tags(&mut self, uid: String, tags: Vec) { self.update_message(uid, |message| { message.tags = tags; }); } - fn update_message(&mut self, uid: String, update: impl FnOnce(&mut MessageState)) { + pub(super) fn update_message(&mut self, uid: String, update: impl FnOnce(&mut MessageState)) { if let Some(mut message) = self.messages().get(uid) { let mut message = message.write(); update(&mut message); } } - fn close_if_selected(&mut self, uid: &str) { + pub(super) fn close_if_selected(&mut self, uid: &str) { if self.selected_id().cloned() == uid { self.close_read_pane(); } diff --git a/preview/src/main.rs b/preview/src/main.rs index c5fb6f40..990f5516 100644 --- a/preview/src/main.rs +++ b/preview/src/main.rs @@ -1,3 +1,5 @@ +#![allow(unpredictable_function_pointer_comparisons)] + use crate::components::{ avatar::{AvatarImageSize, ImageAvatar}, badge::{Badge, BadgeVariant, VerifiedIcon}, @@ -11,6 +13,9 @@ use crate::components::{ Item, ItemContent, ItemDescription, ItemMedia, ItemMediaVariant, ItemTitle, ItemVariant, }, label::Label, + otp::{ + OneTimePasswordGroup, OneTimePasswordInput, OneTimePasswordSeparator, OneTimePasswordSlot, + }, progress::Progress, radio_group::{RadioGroup, RadioItem}, slider::Slider, @@ -24,8 +29,8 @@ use dioxus::prelude::{dioxus_router::LinkProps, *}; use dioxus_code::{advanced::HighlightedSource, Code, CodeTheme, Theme}; use dioxus_i18n::prelude::{use_init_i18n, I18nConfig}; use dioxus_icons::lucide::{ - ArrowRight, ArrowUpRight, Check, ChevronDown, ChevronLeft, Copy, ExternalLink, Mail, Menu, - Pause, Play, SkipBack, SkipForward, X, + ArrowRight, ArrowUpRight, Check, ChevronDown, ChevronLeft, Copy, ExternalLink, KeyRound, Mail, + Menu, Pause, Play, ShieldCheck, SkipBack, SkipForward, X, }; use std::str::FromStr; use strum::{Display, EnumIter, EnumString, IntoEnumIterator}; @@ -54,7 +59,6 @@ struct ComponentDemoData { variants: &'static [ComponentVariantDemoData], } -#[allow(unpredictable_function_pointer_comparisons)] #[derive(Clone, PartialEq)] struct ComponentVariantDemoData { name: &'static str, @@ -1200,6 +1204,10 @@ const BLOCKS: &[MasonryEntry] = &[ component: BlockStats, popout: false, }, + MasonryEntry { + component: BlockOtp, + popout: false, + }, MasonryEntry { component: BlockInbox, popout: false, @@ -1266,7 +1274,6 @@ fn WidgetMasonry() -> Element { } } -#[allow(unpredictable_function_pointer_comparisons)] #[component] fn MasonryCard(component: fn() -> Element, #[props(default)] popout: bool) -> Element { let Comp = component; @@ -1377,6 +1384,66 @@ fn BlockStats() -> Element { } } +#[component] +fn BlockOtp() -> Element { + let mut value = use_signal(String::new); + let mut last_complete = use_signal(String::new); + let is_complete = value.read().chars().count() == 6; + + rsx! { + div { style: "display: grid; gap: 1rem;", + div { style: "display: grid; align-items: center; gap: 0.75rem; grid-template-columns: auto minmax(0, 1fr) auto;", + div { style: "display: flex; width: 2.25rem; height: 2.25rem; align-items: center; justify-content: center; border: 1px solid var(--primary-color-6); border-radius: 0.5rem; background: var(--primary-color-2); color: var(--highlight-color-tertiary);", + ShieldCheck { size: 20, stroke_width: "1.75" } + } + div { style: "min-width: 0;", + h3 { style: "margin: 0; color: var(--secondary-color-3); font-size: 1rem; font-weight: 660; line-height: 1.25;", + "Verification" + } + p { style: "margin: 0; color: var(--secondary-color-5); font-size: 0.85rem; line-height: 1.4;", + "Enter the 6-digit code" + } + } + span { + style: if is_complete { + "display: inline-flex; min-width: 4.75rem; justify-content: center; padding: 0.25rem 0.5rem; border: 1px solid color-mix(in oklab, var(--secondary-success-color) 35%, var(--primary-color-6)); border-radius: 999px; background: color-mix(in oklab, var(--secondary-success-color) 14%, transparent); color: var(--secondary-success-color); font-size: 0.75rem; font-weight: 600; line-height: 1;" + } else { + "display: inline-flex; min-width: 4.75rem; justify-content: center; padding: 0.25rem 0.5rem; border: 1px solid var(--primary-color-6); border-radius: 999px; background: var(--primary-color-2); color: var(--secondary-color-5); font-size: 0.75rem; font-weight: 600; line-height: 1;" + }, + if is_complete { "Complete" } else { "Pending" } + } + } + + div { style: "display: grid; gap: 0.5rem; justify-items: start;", + label { r#for: "masonry-otp-input", style: "display: inline-flex; align-items: center; color: var(--secondary-color-4); font-size: 0.8rem; font-weight: 600; gap: 0.375rem; line-height: 1.25;", + KeyRound { size: 14, stroke_width: "1.75" } + "Security code" + } + OneTimePasswordInput { + id: "masonry-otp-input", + maxlength: 6usize, + value: value(), + validate: |s: String| s.chars().all(|c| c.is_ascii_digit()), + on_value_change: move |v| value.set(v), + on_complete: move |v| last_complete.set(v), + aria_label: "Verification code", + OneTimePasswordGroup { + OneTimePasswordSlot { index: 0usize } + OneTimePasswordSlot { index: 1usize } + OneTimePasswordSlot { index: 2usize } + } + OneTimePasswordSeparator {} + OneTimePasswordGroup { + OneTimePasswordSlot { index: 3usize } + OneTimePasswordSlot { index: 4usize } + OneTimePasswordSlot { index: 5usize } + } + } + } + } + } +} + #[component] fn BlockNotifications() -> Element { rsx! { diff --git a/primitives/src/lib.rs b/primitives/src/lib.rs index facfc1e6..17f2f18a 100644 --- a/primitives/src/lib.rs +++ b/primitives/src/lib.rs @@ -35,6 +35,7 @@ pub mod menubar; mod move_interaction; #[cfg(feature = "router")] pub mod navbar; +pub mod otp; mod pointer; pub mod popover; mod portal; diff --git a/primitives/src/otp/components/group.rs b/primitives/src/otp/components/group.rs new file mode 100644 index 00000000..9d6f0b02 --- /dev/null +++ b/primitives/src/otp/components/group.rs @@ -0,0 +1,27 @@ +use dioxus::prelude::*; + +/// The props for the [`OneTimePasswordGroup`] component. +#[derive(Props, Clone, PartialEq)] +pub struct OneTimePasswordGroupProps { + /// Additional attributes applied to the group element. + #[props(extends = GlobalAttributes)] + pub attributes: Vec, + + /// The slots inside the group. + pub children: Element, +} + +/// # OneTimePasswordGroup +/// +/// A visual grouping of [`super::OneTimePasswordSlot`]s. Used to render contiguous slots +/// separated by [`super::OneTimePasswordSeparator`]s. +#[component] +pub fn OneTimePasswordGroup(props: OneTimePasswordGroupProps) -> Element { + rsx! { + div { + role: "presentation", + ..props.attributes, + {props.children} + } + } +} diff --git a/primitives/src/otp/components/input.rs b/primitives/src/otp/components/input.rs new file mode 100644 index 00000000..c1bbb636 --- /dev/null +++ b/primitives/src/otp/components/input.rs @@ -0,0 +1,922 @@ +use super::super::context::OtpCtx; +use crate::{use_controlled, use_id_or, use_unique_id}; +use dioxus::prelude::*; +use std::ops::Range; + +fn selection_range_for(anchor: usize, focus: usize, len: usize) -> Option> { + let start = anchor.min(focus).min(len); + let end = anchor.max(focus).min(len); + + (start < end).then_some(start..end) +} + +#[derive(Clone, Debug, PartialEq, Eq)] +struct InputValueChange { + value: String, + cursor: usize, + changed: bool, +} + +impl InputValueChange { + fn from_raw_input( + current_value: &str, + raw_value: &str, + max: usize, + cursor: usize, + selected_range: Option>, + ) -> Self { + if max == 0 { + return Self { + value: String::new(), + cursor: 0, + changed: false, + }; + } + + let current_chars: Vec = current_value.chars().collect(); + let raw_chars_full: Vec = raw_value.chars().collect(); + let current_len = current_chars.len(); + let cursor = cursor.min(current_len); + + // Typing one character at the end of a full buffer replaces the last slot. + // The native input has no maxlength attribute, so it lets the value grow by + // one; we splice the overflow char into the last slot to match input-otp's + // "type past the end to overwrite the last digit" behavior. + if selected_range.is_none() + && current_len == max + && raw_chars_full.len() == current_len + 1 + && cursor == max + && raw_chars_full[..max] == current_chars[..] + { + let mut next_chars = current_chars.clone(); + next_chars[max - 1] = raw_chars_full[max]; + let next: String = next_chars.into_iter().collect(); + return Self { + value: next, + cursor: max, + changed: true, + }; + } + + let raw_chars: Vec = raw_chars_full.into_iter().take(max).collect(); + let range = edit_range_for_entry(cursor, current_len, max, selected_range.clone()); + let (next_chars, next_cursor) = if selected_range.is_none() && !range.is_empty() { + if let Some(inserted_chars) = + inserted_chars_at_cursor(¤t_chars, &raw_chars, cursor) + { + let mut replaced_chars = current_chars.clone(); + replaced_chars.splice(range.start..range.end, inserted_chars.iter().copied()); + replaced_chars.truncate(max); + let next_cursor = (range.start + inserted_chars.len()).min(replaced_chars.len()); + (replaced_chars, next_cursor) + } else { + let next_cursor = raw_value_cursor(¤t_chars, &raw_chars, range, current_len); + (raw_chars, next_cursor) + } + } else { + let next_cursor = raw_value_cursor(¤t_chars, &raw_chars, range, current_len); + (raw_chars, next_cursor) + }; + let next: String = next_chars.into_iter().collect(); + let changed = next != current_value; + + Self { + value: next, + cursor: next_cursor, + changed, + } + } +} + +fn edit_range_for_entry( + cursor: usize, + len: usize, + max: usize, + selected_range: Option>, +) -> Range { + if let Some(range) = selected_range { + return range.start.min(len)..range.end.min(len); + } + + let cursor = cursor.min(len); + if len == 0 || cursor == len && len < max { + cursor..cursor + } else { + let start = cursor.min(len.saturating_sub(1)); + start..(start + 1).min(len) + } +} + +fn inserted_chars_at_cursor( + current_chars: &[char], + raw_chars: &[char], + cursor: usize, +) -> Option> { + if raw_chars.len() <= current_chars.len() || cursor > current_chars.len() { + return None; + } + + let inserted_len = raw_chars.len() - current_chars.len(); + if cursor + inserted_len > raw_chars.len() + || raw_chars[..cursor] != current_chars[..cursor] + || raw_chars[cursor + inserted_len..] != current_chars[cursor..] + { + return None; + } + + Some(raw_chars[cursor..cursor + inserted_len].to_vec()) +} + +fn raw_value_cursor( + current_chars: &[char], + next_chars: &[char], + range: Range, + current_len: usize, +) -> usize { + let replaced_len = range.len(); + let base_len = current_len.saturating_sub(replaced_len); + if next_chars.len() >= base_len { + (range.start + next_chars.len().saturating_sub(base_len)).min(next_chars.len()) + } else { + current_chars + .iter() + .zip(next_chars) + .take_while(|(a, b)| a == b) + .count() + } +} + +fn utf16_offset_for_char(value: &str, index: usize) -> usize { + value + .chars() + .take(index) + .map(char::len_utf16) + .sum::() +} + +fn char_index_for_utf16(value: &str, utf16_offset: usize) -> usize { + let mut acc = 0; + let mut char_count = 0; + for c in value.chars() { + if acc >= utf16_offset { + return char_count; + } + let next = acc + c.len_utf16(); + if next > utf16_offset { + return char_count; + } + acc = next; + char_count += 1; + } + char_count +} + +fn active_slot_index(cursor: usize, len: usize, max: usize) -> Option { + if max == 0 { + return None; + } + + Some(cursor.min(len).min(max - 1)) +} + +fn slot_selection_range(anchor_slot: usize, focus_slot: usize, len: usize) -> Option> { + if len == 0 { + return None; + } + + let anchor_slot = anchor_slot.min(len - 1); + let focus_slot = focus_slot.min(len - 1); + let start = anchor_slot.min(focus_slot); + let end = anchor_slot.max(focus_slot) + 1; + + Some(start..end.min(len)) +} + +fn slot_selection_focus_cursor(anchor_slot: usize, focus_slot: usize, len: usize) -> usize { + if len == 0 { + return 0; + } + + if focus_slot < anchor_slot { + focus_slot.min(len) + } else { + (focus_slot + 1).min(len) + } +} + +fn apply_value_change( + current_value: &str, + next_value: String, + max: usize, + set_value: Callback, + on_complete: Callback, +) { + let old_len = current_value.chars().count(); + let len = next_value.chars().count(); + + if next_value != current_value { + set_value.call(next_value.clone()); + if old_len < max && len == max { + on_complete.call(next_value); + } + } +} + +fn focus_input(input_id: String) { + spawn(async move { + let eval = document::eval( + r#" + const id = await dioxus.recv(); + const input = document.getElementById(id); + + if (input && input.focus) { + input.focus({ preventScroll: true }); + } + "#, + ); + let _ = eval.send(input_id); + }); +} + +fn selection_direction_for_dom(direction: SelectionDirection) -> &'static str { + match direction { + SelectionDirection::Forward => "forward", + SelectionDirection::Backward => "backward", + SelectionDirection::None => "none", + } +} + +/// Read the native input's selection from Dioxus selection event data and push +/// it into `cursor` / `selection_range` / `selection_direction`. +/// +/// Returned callback is meant to be wired to the input's selection-related +/// event handlers (`onselect`, `onselectionchange`) so we treat the native +/// input as the source of truth for keyboard selection inside it. +fn use_native_selection_sync( + value: Memo, + mut cursor: Signal, + mut selection_range: Signal>>, + mut selection_direction: Signal, +) -> Callback { + use_callback(move |event: SelectionEvent| { + let Some(selection) = event.data.selection() else { + return; + }; + + let start_char; + let end_char; + { + let snapshot = value.peek(); + let range = selection.range(); + start_char = char_index_for_utf16(&snapshot, range.start); + end_char = char_index_for_utf16(&snapshot, range.end); + } + let direction = selection.direction(); + + if start_char == end_char { + if *cursor.peek() != start_char { + cursor.set(start_char); + } + if selection_range.peek().is_some() { + selection_range.set(None); + } + if *selection_direction.peek() != SelectionDirection::None { + selection_direction.set(SelectionDirection::None); + } + } else { + let focus = match direction { + SelectionDirection::Backward => start_char, + _ => end_char, + }; + if *cursor.peek() != focus { + cursor.set(focus); + } + let new_range = Some(start_char..end_char); + if *selection_range.peek() != new_range { + selection_range.set(new_range); + } + if *selection_direction.peek() != direction { + selection_direction.set(direction); + } + } + }) +} + +async fn sync_input_selection( + input_id: String, + selection: Range, + direction: SelectionDirection, +) { + let eval = document::eval( + r#" + const id = await dioxus.recv(); + const start = await dioxus.recv(); + const end = await dioxus.recv(); + const direction = await dioxus.recv(); + const input = document.getElementById(id); + + if (input && document.activeElement === input && input.setSelectionRange) { + input.setSelectionRange(start, end, direction); + } + "#, + ); + let _ = eval.send(input_id); + let _ = eval.send(selection.start); + let _ = eval.send(selection.end); + let _ = eval.send(selection_direction_for_dom(direction).to_string()); +} + +async fn sync_input_value_and_selection( + input_id: String, + value: String, + selection: Range, + direction: SelectionDirection, +) { + let eval = document::eval( + r#" + const id = await dioxus.recv(); + const value = await dioxus.recv(); + const start = await dioxus.recv(); + const end = await dioxus.recv(); + const direction = await dioxus.recv(); + const input = document.getElementById(id); + + if (input) { + if (input.value !== value) { + input.value = value; + } + if (document.activeElement === input && input.setSelectionRange) { + input.setSelectionRange(start, end, direction); + } + } + "#, + ); + let _ = eval.send(input_id); + let _ = eval.send(value); + let _ = eval.send(selection.start); + let _ = eval.send(selection.end); + let _ = eval.send(selection_direction_for_dom(direction).to_string()); +} + +#[cfg(test)] +mod tests { + use super::{ + active_slot_index, char_index_for_utf16, selection_range_for, slot_selection_focus_cursor, + slot_selection_range, InputValueChange, + }; + + fn input_change(value: &str, cursor: usize, changed: bool) -> InputValueChange { + InputValueChange { + value: value.to_string(), + cursor, + changed, + } + } + + #[test] + fn input_change_uses_raw_value() { + assert_eq!( + InputValueChange::from_raw_input("12", "129", 6, 2, None), + input_change("129", 3, true) + ); + } + + #[test] + fn input_change_replaces_at_visible_cursor() { + assert_eq!( + InputValueChange::from_raw_input("12", "192", 6, 1, None), + input_change("19", 2, true) + ); + } + + #[test] + fn multi_character_input_change_replaces_active_slot() { + assert_eq!( + InputValueChange::from_raw_input("12", "1982", 6, 1, None), + input_change("198", 3, true) + ); + } + + #[test] + fn unchanged_input_is_not_reported_as_changed() { + assert_eq!( + InputValueChange::from_raw_input("192", "192", 6, 3, None), + input_change("192", 3, false) + ); + } + + #[test] + fn typing_past_end_of_full_buffer_replaces_last_slot() { + // Native input grows by one char; we splice the overflow into the last slot. + assert_eq!( + InputValueChange::from_raw_input("123456", "1234569", 6, 6, None), + input_change("123459", 6, true) + ); + } + + #[test] + fn paste_past_end_of_full_buffer_is_truncated() { + // Multi-char overflow (paste) shouldn't replace; we keep the original buffer. + assert_eq!( + InputValueChange::from_raw_input("123456", "12345699", 6, 6, None), + input_change("123456", 6, false) + ); + } + + #[test] + fn input_deletion_uses_raw_value() { + assert_eq!( + InputValueChange::from_raw_input("12", "1", 6, 2, None), + input_change("1", 1, true) + ); + } + + #[test] + fn full_input_replacement_uses_raw_value() { + assert_eq!( + InputValueChange::from_raw_input("12", "987654", 6, 0, selection_range_for(0, 2, 2)), + input_change("987654", 6, true) + ); + } + + #[test] + fn full_input_replacement_with_shared_prefix_uses_raw_value() { + assert_eq!( + InputValueChange::from_raw_input( + "123456", + "123999", + 6, + 0, + selection_range_for(0, 6, 6), + ), + input_change("123999", 6, true) + ); + } + + #[test] + fn shorter_full_input_replacement_with_shared_prefix_uses_raw_value() { + assert_eq!( + InputValueChange::from_raw_input("123456", "1239", 6, 0, selection_range_for(0, 6, 6),), + input_change("1239", 4, true) + ); + } + + #[test] + fn full_input_replacement_truncates_to_maxlength() { + assert_eq!( + InputValueChange::from_raw_input( + "123456", + "9876543", + 6, + 0, + selection_range_for(0, 6, 6), + ), + input_change("987654", 6, true) + ); + } + + #[test] + fn selected_range_replacement_with_shared_digits_uses_raw_value() { + assert_eq!( + InputValueChange::from_raw_input( + "123456", + "123996", + 6, + 3, + selection_range_for(3, 5, 6), + ), + input_change("123996", 5, true) + ); + } + + #[test] + fn char_index_for_utf16_handles_surrogate_pairs() { + // 😀 is two UTF-16 code units, one char. + assert_eq!(char_index_for_utf16("😀😃😄", 0), 0); + assert_eq!(char_index_for_utf16("😀😃😄", 2), 1); + assert_eq!(char_index_for_utf16("😀😃😄", 4), 2); + // A utf16 offset that lands inside a surrogate rounds down to the boundary. + assert_eq!(char_index_for_utf16("😀😃😄", 3), 1); + } + + #[test] + fn active_slot_stays_visible_at_end() { + assert_eq!(active_slot_index(6, 6, 6), Some(5)); + } + + #[test] + fn active_slot_tracks_next_empty_slot() { + assert_eq!(active_slot_index(2, 2, 6), Some(2)); + } + + #[test] + fn slot_selection_range_includes_starting_slot() { + assert_eq!(slot_selection_range(1, 4, 6), Some(1..5)); + assert_eq!(slot_selection_range(4, 1, 6), Some(1..5)); + assert_eq!(slot_selection_range(5, 5, 6), Some(5..6)); + assert_eq!(slot_selection_range(5, 2, 2), Some(1..2)); + } + + #[test] + fn slot_selection_cursors_track_drag_direction() { + assert_eq!(slot_selection_focus_cursor(1, 4, 6), 5); + assert_eq!(slot_selection_focus_cursor(4, 1, 6), 1); + } +} + +/// The props for the [`OneTimePasswordInput`] component. +#[derive(Props, Clone, PartialEq)] +pub struct OneTimePasswordInputProps { + /// The controlled value of the OTP input. + pub value: ReadSignal>, + + /// The default value when uncontrolled. + #[props(default)] + pub default_value: String, + + /// The maximum number of characters the input accepts (the total number of slots). + pub maxlength: ReadSignal, + + /// Hint for the on-screen keyboard. Defaults to `"numeric"`. + #[props(default = ReadSignal::new(Signal::new(String::from("numeric"))))] + pub inputmode: ReadSignal, + + /// Autocomplete hint applied to the underlying input. Defaults to `"one-time-code"`. + #[props(default = ReadSignal::new(Signal::new(String::from("one-time-code"))))] + pub autocomplete: ReadSignal, + + /// Whether the input is disabled. + #[props(default)] + pub disabled: ReadSignal, + + /// Whether the input is required in a form. + #[props(default)] + pub required: ReadSignal, + + /// The name attribute used for form submission. + #[props(default)] + pub name: ReadSignal, + + /// Optional id for the inner ``. When omitted, a stable id is generated. + /// Use this to associate an external `