diff --git a/Cargo.lock b/Cargo.lock index 4aa78c2b5f..54ee6fa81a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -329,11 +329,11 @@ dependencies = [ "clipboard-win", "image 0.25.8", "log", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit", "objc2-core-foundation", "objc2-core-graphics", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "parking_lot", "percent-encoding", "windows-sys 0.60.2", @@ -861,11 +861,11 @@ dependencies = [ [[package]] name = "block2" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" dependencies = [ - "objc2 0.6.2", + "objc2 0.6.3", ] [[package]] @@ -1168,7 +1168,7 @@ name = "cap-cursor-info" version = "0.0.0" dependencies = [ "hex", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit", "serde", "sha2", @@ -1187,6 +1187,7 @@ dependencies = [ "async-stream", "axum", "base64 0.22.1", + "block2 0.6.2", "bytemuck", "bytes", "cap-audio", @@ -1203,12 +1204,10 @@ dependencies = [ "chrono", "cidre", "clipboard-rs", - "cocoa", - "core-foundation 0.10.1", - "core-graphics 0.24.0", "cpal 0.15.3 (git+https://github.com/CapSoftware/cpal?rev=3cc779a7b4ca)", "device_query", "dirs", + "dispatch2", "dotenvy_macro", "ffmpeg-next", "flume", @@ -1223,8 +1222,12 @@ dependencies = [ "lz4_flex", "md5", "nix 0.29.0", - "objc", + "objc2 0.6.3", "objc2-app-kit", + "objc2-application-services", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.2", "opentelemetry", "opentelemetry-otlp", "opentelemetry_sdk", @@ -1595,7 +1598,7 @@ dependencies = [ "image 0.25.8", "log", "metal 0.31.0", - "objc2 0.6.2", + "objc2 0.6.3", "pretty_assertions", "rayon", "reactive_graph", @@ -1876,9 +1879,9 @@ checksum = "afede46921767868c5c7f8f55202bdd8bec0bab6bc9605174200f45924f93c62" dependencies = [ "clipboard-win", "image 0.25.8", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "windows 0.59.0", "x11rb", ] @@ -2651,9 +2654,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" dependencies = [ "bitflags 2.9.4", - "block2 0.6.1", + "block2 0.6.2", "libc", - "objc2 0.6.2", + "objc2 0.6.3", ] [[package]] @@ -3673,7 +3676,7 @@ checksum = "b9247516746aa8e53411a0db9b62b0e24efbcf6a76e0ba73e5a91b512ddabed7" dependencies = [ "crossbeam-channel", "keyboard-types", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit", "once_cell", "serde", @@ -5005,8 +5008,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "119c8490084af61b44c9eda9d626475847a186737c0378c85e32d77c33a01cd4" dependencies = [ "cc", - "objc2 0.6.2", - "objc2-foundation 0.3.1", + "objc2 0.6.3", + "objc2-foundation 0.3.2", "time", ] @@ -5319,10 +5322,10 @@ dependencies = [ "dpi", "gtk", "keyboard-types", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "once_cell", "png 0.17.16", "serde", @@ -5666,9 +5669,9 @@ dependencies = [ [[package]] name = "objc2" -version = "0.6.2" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "561f357ba7f3a2a61563a186a163d0a3a5247e1089524a3981d49adb775078bc" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" dependencies = [ "objc2-encode", "objc2-exception-helper", @@ -5676,21 +5679,38 @@ dependencies = [ [[package]] name = "objc2-app-kit" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" dependencies = [ "bitflags 2.9.4", - "block2 0.6.1", + "block2 0.6.2", "libc", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-cloud-kit", "objc2-core-data", "objc2-core-foundation", "objc2-core-graphics", "objc2-core-image", - "objc2-foundation 0.3.1", - "objc2-quartz-core 0.3.1", + "objc2-core-text", + "objc2-core-video", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", +] + +[[package]] +name = "objc2-application-services" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69282c2b5bc58fba07cb9de2113619532eb551e98efe3d8d695509ef45fbd53b" +dependencies = [ + "bitflags 2.9.4", + "libc", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-services", + "objc2-foundation 0.3.2", ] [[package]] @@ -5700,17 +5720,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2e085a2e16c61dadbad7a808fc9d5b5f8472b1b825b53d529c9f64ccac78e722" dependencies = [ "bitflags 2.9.4", - "block2 0.6.1", + "block2 0.6.2", "dispatch2", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-avf-audio", "objc2-core-foundation", "objc2-core-graphics", "objc2-core-image", "objc2-core-media", "objc2-core-video", - "objc2-foundation 0.3.1", - "objc2-quartz-core 0.3.1", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", ] [[package]] @@ -5719,19 +5739,19 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bfc1d11521c211a7ebe17739fc806719da41f56c6b3f949d9861b459188ce910" dependencies = [ - "objc2 0.6.2", - "objc2-foundation 0.3.1", + "objc2 0.6.3", + "objc2-foundation 0.3.2", ] [[package]] name = "objc2-cloud-kit" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" dependencies = [ "bitflags 2.9.4", - "objc2 0.6.2", - "objc2-foundation 0.3.1", + "objc2 0.6.3", + "objc2-foundation 0.3.2", ] [[package]] @@ -5741,7 +5761,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca44961e888e19313b808f23497073e3f6b3c22bb485056674c8b49f3b025c82" dependencies = [ "dispatch2", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-core-audio-types", "objc2-core-foundation", ] @@ -5753,52 +5773,57 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c0f1cc99bb07ad2ddb6527ddf83db6a15271bb036b3eb94b801cd44fdc666ee1" dependencies = [ "bitflags 2.9.4", - "objc2 0.6.2", + "objc2 0.6.3", ] [[package]] name = "objc2-core-data" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" dependencies = [ "bitflags 2.9.4", - "objc2 0.6.2", - "objc2-foundation 0.3.1", + "objc2 0.6.3", + "objc2-foundation 0.3.2", ] [[package]] name = "objc2-core-foundation" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ "bitflags 2.9.4", + "block2 0.6.2", "dispatch2", - "objc2 0.6.2", + "libc", + "objc2 0.6.3", ] [[package]] name = "objc2-core-graphics" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ "bitflags 2.9.4", + "block2 0.6.2", "dispatch2", - "objc2 0.6.2", + "libc", + "objc2 0.6.3", "objc2-core-foundation", "objc2-io-surface", + "objc2-metal 0.3.2", ] [[package]] name = "objc2-core-image" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" dependencies = [ - "objc2 0.6.2", - "objc2-foundation 0.3.1", + "objc2 0.6.3", + "objc2-foundation 0.3.2", ] [[package]] @@ -5809,21 +5834,45 @@ checksum = "f0b7afa6822e2fa20dfc88d10186b2432bf8560b5ed73ec9d31efd78277bc878" dependencies = [ "bitflags 2.9.4", "dispatch2", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-core-audio", "objc2-core-audio-types", "objc2-core-foundation", "objc2-core-video", ] +[[package]] +name = "objc2-core-services" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "583300ad934cba24ff5292aee751ecc070f7ca6b39a574cc21b7b5e588e06a0b" +dependencies = [ + "dispatch2", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-security", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.9.4", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-core-graphics", +] + [[package]] name = "objc2-core-video" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1989c3e76c7e978cab0ba9e6f4961cd00ed14ca21121444cc26877403bfb6303" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" dependencies = [ "bitflags 2.9.4", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-core-foundation", "objc2-core-graphics", "objc2-io-surface", @@ -5858,25 +5907,25 @@ dependencies = [ [[package]] name = "objc2-foundation" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ "bitflags 2.9.4", - "block2 0.6.1", + "block2 0.6.2", "libc", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-core-foundation", ] [[package]] name = "objc2-io-surface" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ "bitflags 2.9.4", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-core-foundation", ] @@ -5886,7 +5935,7 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9052cb1bb50a4c161d934befcf879526fb87ae9a68858f241e693ca46225cf5a" dependencies = [ - "objc2 0.6.2", + "objc2 0.6.3", "objc2-core-foundation", ] @@ -5902,6 +5951,17 @@ dependencies = [ "objc2-foundation 0.2.2", ] +[[package]] +name = "objc2-metal" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" +dependencies = [ + "bitflags 2.9.4", + "objc2 0.6.3", + "objc2-foundation 0.3.2", +] + [[package]] name = "objc2-osa-kit" version = "0.3.1" @@ -5909,9 +5969,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26bb88504b5a050dbba515d2414607bf5e57dd56b107bc5f0351197a3e7bdc5d" dependencies = [ "bitflags 2.9.4", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", ] [[package]] @@ -5924,28 +5984,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-quartz-core" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ "bitflags 2.9.4", - "objc2 0.6.2", - "objc2-foundation 0.3.1", + "objc2 0.6.3", + "objc2-foundation 0.3.2", ] [[package]] name = "objc2-security" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1f8e0ef3ab66b08c42644dcb34dba6ec0a574bbd8adbb8bdbdc7a2779731a44" +checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" dependencies = [ "bitflags 2.9.4", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-core-foundation", ] @@ -5956,9 +6016,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "25b1312ad7bc8a0e92adae17aa10f90aae1fb618832f9b993b022b591027daed" dependencies = [ "bitflags 2.9.4", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", ] [[package]] @@ -5968,11 +6028,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91672909de8b1ce1c2252e95bbee8c1649c9ad9d14b9248b3d7b4c47903c47ad" dependencies = [ "bitflags 2.9.4", - "block2 0.6.1", - "objc2 0.6.2", + "block2 0.6.2", + "objc2 0.6.3", "objc2-app-kit", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "objc2-javascript-core", "objc2-security", ] @@ -6256,8 +6316,8 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "732c71caeaa72c065bb69d7ea08717bd3f4863a4f451402fc9513e29dbd5261b" dependencies = [ - "objc2 0.6.2", - "objc2-foundation 0.3.1", + "objc2 0.6.3", + "objc2-foundation 0.3.2", "objc2-osa-kit", "serde", "serde_json", @@ -7436,17 +7496,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" dependencies = [ "ashpd", - "block2 0.6.1", + "block2 0.6.2", "dispatch2", "glib-sys", "gobject-sys", "gtk-sys", "js-sys", "log", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "raw-window-handle", "wasm-bindgen", "wasm-bindgen-futures", @@ -7758,9 +7818,9 @@ dependencies = [ "clap", "futures", "inquire", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "scap-targets", "tokio", "tracing", @@ -7863,7 +7923,7 @@ version = "0.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0c62ae379564f834110c5b020cc731a7c14b8ec4879b4367579a467a0a704c21" dependencies = [ - "block2 0.6.1", + "block2 0.6.2", "core-foundation 0.10.1", "core-graphics 0.25.0", "core-media-rs", @@ -8931,12 +8991,12 @@ dependencies = [ [[package]] name = "tao" -version = "0.34.3" +version = "0.34.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "959469667dbcea91e5485fc48ba7dd6023face91bb0f1a14681a70f99847c3f7" +checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" dependencies = [ "bitflags 2.9.4", - "block2 0.6.1", + "block2 0.6.2", "core-foundation 0.10.1", "core-graphics 0.24.0", "crossbeam-channel", @@ -8953,9 +9013,9 @@ dependencies = [ "ndk 0.9.0", "ndk-context", "ndk-sys 0.6.0+11769913", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "once_cell", "parking_lot", "raw-window-handle", @@ -8999,9 +9059,9 @@ checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" [[package]] name = "tauri" -version = "2.8.5" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4d1d3b3dc4c101ac989fd7db77e045cc6d91a25349cd410455cb5c57d510c1c" +checksum = "15524fc7959bfcaa051ba6d0b3fb1ef18e978de2176c7c6acb977f7fd14d35c7" dependencies = [ "anyhow", "bytes", @@ -9021,9 +9081,9 @@ dependencies = [ "log", "mime", "muda", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "objc2-ui-kit", "objc2-web-kit", "percent-encoding", @@ -9045,7 +9105,6 @@ dependencies = [ "tokio", "tray-icon", "url", - "urlpattern", "webkit2gtk", "webview2-com", "window-vibrancy", @@ -9054,9 +9113,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "2.4.1" +version = "2.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c432ccc9ff661803dab74c6cd78de11026a578a9307610bbc39d3c55be7943f" +checksum = "17fcb8819fd16463512a12f531d44826ce566f486d7ccd211c9c8cebdaec4e08" dependencies = [ "anyhow", "cargo_toml", @@ -9076,9 +9135,9 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "2.4.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ab3a62cf2e6253936a8b267c2e95839674e7439f104fa96ad0025e149d54d8a" +checksum = "9fa9844cefcf99554a16e0a278156ae73b0d8680bbc0e2ad1e4287aadd8489cf" dependencies = [ "base64 0.22.1", "brotli", @@ -9103,9 +9162,9 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "2.4.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4368ea8094e7045217edb690f493b55b30caf9f3e61f79b4c24b6db91f07995e" +checksum = "3764a12f886d8245e66b7ee9b43ccc47883399be2019a61d80cf0f4117446fde" dependencies = [ "heck 0.5.0", "proc-macro2", @@ -9150,9 +9209,9 @@ dependencies = [ [[package]] name = "tauri-plugin-clipboard-manager" -version = "2.3.0" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adddd9e9275b20e77af3061d100a25a884cced3c4c9ef680bd94dd0f7e26c1ca" +checksum = "206dc20af4ed210748ba945c2774e60fd0acd52b9a73a028402caf809e9b6ecf" dependencies = [ "arboard", "log", @@ -9165,9 +9224,9 @@ dependencies = [ [[package]] name = "tauri-plugin-deep-link" -version = "2.4.3" +version = "2.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd67112fb1131834c2a7398ffcba520dbbf62c17de3b10329acd1a3554b1a9bb" +checksum = "6e82759f7c7d51de3cbde51c04b3f2332de52436ed84541182cd8944b04e9e73" dependencies = [ "dunce", "plist", @@ -9186,9 +9245,9 @@ dependencies = [ [[package]] name = "tauri-plugin-dialog" -version = "2.4.0" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0beee42a4002bc695550599b011728d9dfabf82f767f134754ed6655e434824e" +checksum = "313f8138692ddc4a2127c4c9607d616a46f5c042e77b3722450866da0aad2f19" dependencies = [ "log", "raw-window-handle", @@ -9204,9 +9263,9 @@ dependencies = [ [[package]] name = "tauri-plugin-fs" -version = "2.4.2" +version = "2.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "315784ec4be45e90a987687bae7235e6be3d6e9e350d2b75c16b8a4bf22c1db7" +checksum = "47df422695255ecbe7bac7012440eddaeefd026656171eac9559f5243d3230d9" dependencies = [ "anyhow", "dunce", @@ -9226,9 +9285,9 @@ dependencies = [ [[package]] name = "tauri-plugin-global-shortcut" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6df9f0f7bf2fe768b85fee4951c2505a35b72c44df1f6403e74e110bc13c5f58" +checksum = "424af23c7e88d05e4a1a6fc2c7be077912f8c76bd7900fd50aa2b7cbf5a2c405" dependencies = [ "global-hotkey", "log", @@ -9241,9 +9300,9 @@ dependencies = [ [[package]] name = "tauri-plugin-http" -version = "2.5.2" +version = "2.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "938a3d7051c9a82b431e3a0f3468f85715b3442b3c3a3913095e9fa509e2652c" +checksum = "c00685aceab12643cf024f712ab0448ba8fcadf86f2391d49d2e5aa732aacc70" dependencies = [ "bytes", "cookie_store", @@ -9265,9 +9324,9 @@ dependencies = [ [[package]] name = "tauri-plugin-notification" -version = "2.3.1" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2fbc86b929b5376ab84b25c060f966d146b2fbd59b6af8264027b343c82c219" +checksum = "01fc2c5ff41105bd1f7242d8201fdf3efd70749b82fa013a17f2126357d194cc" dependencies = [ "log", "notify-rust", @@ -9298,14 +9357,14 @@ dependencies = [ [[package]] name = "tauri-plugin-opener" -version = "2.5.0" +version = "2.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "786156aa8e89e03d271fbd3fe642207da8e65f3c961baa9e2930f332bf80a1f5" +checksum = "c26b72571d25dee25667940027114e60f569fc3974f8cefbe50c2cbc5fd65e3b" dependencies = [ "dunce", "glob", "objc2-app-kit", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "open", "schemars 0.8.22", "serde", @@ -9320,9 +9379,9 @@ dependencies = [ [[package]] name = "tauri-plugin-os" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a1c77ebf6f20417ab2a74e8c310820ba52151406d0c80fbcea7df232e3f6ba" +checksum = "d8f08346c8deb39e96f86973da0e2d76cbb933d7ac9b750f6dc4daf955a6f997" dependencies = [ "gethostname", "log", @@ -9338,9 +9397,9 @@ dependencies = [ [[package]] name = "tauri-plugin-positioner" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a01e373ea3f3f5f46d40f434ba13bd12fa4833aabab50dfc09f6362bad27c95" +checksum = "02dcd56dd4797bd4d6c4c658daed40ce563176f92df90fbd2c904ce145de17ef" dependencies = [ "log", "serde", @@ -9379,9 +9438,9 @@ dependencies = [ [[package]] name = "tauri-plugin-shell" -version = "2.3.1" +version = "2.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54777d0c0d8add34eea3ced84378619ef5b97996bd967d3038c668feefd21071" +checksum = "c374b6db45f2a8a304f0273a15080d98c70cde86178855fc24653ba657a1144c" dependencies = [ "encoding_rs", "log", @@ -9400,9 +9459,9 @@ dependencies = [ [[package]] name = "tauri-plugin-single-instance" -version = "2.3.4" +version = "2.3.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb9cac815bf11c4a80fb498666bcdad66d65b89e3ae24669e47806febb76389c" +checksum = "dd707f8c86b4e3004e2c141fa24351f1909ba40ce1b8437e30d5ed5277dd3710" dependencies = [ "serde", "serde_json", @@ -9416,9 +9475,9 @@ dependencies = [ [[package]] name = "tauri-plugin-store" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d85dd80d60a76ee2c2fdce09e9ef30877b239c2a6bb76e6d7d03708aa5f13a19" +checksum = "59a77036340a97eb5bbe1b3209c31e5f27f75e6f92a52fd9dd4b211ef08bf310" dependencies = [ "dunce", "serde", @@ -9464,9 +9523,9 @@ dependencies = [ [[package]] name = "tauri-plugin-window-state" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2d5f6fe3291bfa609c7e0b0ee3bedac294d94c7018934086ce782c1d0f2a468e" +checksum = "73736611e14142408d15353e21e3cca2f12a3cfb523ad0ce85999b6d2ef1a704" dependencies = [ "bitflags 2.9.4", "log", @@ -9479,16 +9538,16 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "2.8.0" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4cfc9ad45b487d3fded5a4731a567872a4812e9552e3964161b08edabf93846" +checksum = "87f766fe9f3d1efc4b59b17e7a891ad5ed195fa8d23582abb02e6c9a01137892" dependencies = [ "cookie", "dpi", "gtk", "http 1.3.1", "jni", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-ui-kit", "objc2-web-kit", "raw-window-handle", @@ -9504,17 +9563,17 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "2.8.1" +version = "2.9.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1fe9d48bd122ff002064e88cfcd7027090d789c4302714e68fcccba0f4b7807" +checksum = "7950f3bde6bcca6655bc5e76d3d6ec587ceb81032851ab4ddbe1f508bdea2729" dependencies = [ "gtk", "http 1.3.1", "jni", "log", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "once_cell", "percent-encoding", "raw-window-handle", @@ -9559,9 +9618,9 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "2.7.0" +version = "2.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41a3852fdf9a4f8fbeaa63dc3e9a85284dd6ef7200751f0bd66ceee30c93f212" +checksum = "76a423c51176eb3616ee9b516a9fa67fed5f0e78baaba680e44eb5dd2cc37490" dependencies = [ "anyhow", "brotli", @@ -10202,11 +10261,11 @@ dependencies = [ "dirs", "libappindicator", "muda", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit", "objc2-core-foundation", "objc2-core-graphics", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "once_cell", "png 0.17.16", "serde", @@ -11184,10 +11243,10 @@ version = "0.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" dependencies = [ - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "raw-window-handle", "windows-sys 0.59.0", "windows-version", @@ -12007,12 +12066,12 @@ checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" [[package]] name = "wry" -version = "0.53.3" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31f0e9642a0d061f6236c54ccae64c2722a7879ad4ec7dff59bd376d446d8e90" +checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" dependencies = [ "base64 0.22.1", - "block2 0.6.1", + "block2 0.6.2", "cookie", "crossbeam-channel", "dirs", @@ -12027,10 +12086,10 @@ dependencies = [ "kuchikiki", "libc", "ndk 0.9.0", - "objc2 0.6.2", + "objc2 0.6.3", "objc2-app-kit", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "objc2-ui-kit", "objc2-web-kit", "once_cell", diff --git a/Cargo.toml b/Cargo.toml index 61e8ab20f9..8782e12e28 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -22,12 +22,12 @@ tokio = { version = "1.39.3", features = [ "rt-multi-thread", "time", ] } -tauri = { version = "2.5.0", features = ["specta"] } +tauri = { version = "2.9.4", features = ["specta"] } specta = { version = "=2.0.0-rc.20", features = [ "derive", "serde_json", "uuid", - "chrono" + "chrono", ] } serde = { version = "1", features = ["derive"] } serde_json = "1" @@ -65,6 +65,7 @@ cidre = { git = "https://github.com/CapSoftware/cidre", rev = "bf84b67079a8", fe "io_surface", "mtl", ], default-features = false } +objc2 = "0.6.3" windows = "0.60.0" windows-core = "0.60" diff --git a/apps/desktop/package.json b/apps/desktop/package.json index aa83e5edee..aab9059cc9 100644 --- a/apps/desktop/package.json +++ b/apps/desktop/package.json @@ -39,7 +39,7 @@ "@solidjs/router": "^0.14.2", "@solidjs/start": "^1.1.3", "@tanstack/solid-query": "^5.51.21", - "@tauri-apps/api": "2.5.0", + "@tauri-apps/api": "2.9.1", "@tauri-apps/plugin-clipboard-manager": "^2.3.0", "@tauri-apps/plugin-deep-link": "^2.4.1", "@tauri-apps/plugin-dialog": "^2.4.0", @@ -49,7 +49,7 @@ "@tauri-apps/plugin-opener": "^2.5.0", "@tauri-apps/plugin-os": "^2.3.0", "@tauri-apps/plugin-process": "2.3.0", - "@tauri-apps/plugin-shell": "^2.3.0", + "@tauri-apps/plugin-shell": "^2.3.1", "@tauri-apps/plugin-store": "^2.4.0", "@tauri-apps/plugin-updater": "^2.9.0", "@ts-rest/core": "^3.52.1", @@ -75,7 +75,7 @@ "@fontsource/geist-sans": "^5.0.3", "@webgpu/types": "^0.1.44", "@iconify/json": "^2.2.239", - "@tauri-apps/cli": ">=2.1.0", + "@tauri-apps/cli": "^2.9.5", "@total-typescript/ts-reset": "^0.6.1", "@types/dom-webcodecs": "^0.1.11", "@types/uuid": "^9.0.8", diff --git a/apps/desktop/src-tauri/Cargo.toml b/apps/desktop/src-tauri/Cargo.toml index 184bb073d1..c3780cc3cb 100644 --- a/apps/desktop/src-tauri/Cargo.toml +++ b/apps/desktop/src-tauri/Cargo.toml @@ -27,23 +27,23 @@ tauri = { workspace = true, features = [ "devtools", ] } tauri-specta = { version = "=2.0.0-rc.20", features = ["derive", "typescript"] } -tauri-plugin-dialog = "2.2.0" -tauri-plugin-fs = "2.2.0" -tauri-plugin-global-shortcut = "2.2.0" -tauri-plugin-http = "2.2.0" -tauri-plugin-notification = "2.2.0" -tauri-plugin-os = "2.2.0" -tauri-plugin-process = "2.2.0" -tauri-plugin-shell = "2.2.0" -tauri-plugin-single-instance = { version = "2.2.0", features = ["deep-link"] } -tauri-plugin-store = "2.2.0" +tauri-plugin-dialog = "2.4.2" +tauri-plugin-fs = "2.4.4" +tauri-plugin-global-shortcut = "2.3.1" +tauri-plugin-http = "2.5.4" +tauri-plugin-notification = "2.3.3" +tauri-plugin-os = "2.3.2" +tauri-plugin-process = "2.3.0" +tauri-plugin-shell = "2.3.3" +tauri-plugin-single-instance = { version = "2.3.6", features = ["deep-link"] } +tauri-plugin-store = "2.4.1" tauri-plugin-updater = "2.9.0" tauri-plugin-oauth = { git = "https://github.com/FabianLars/tauri-plugin-oauth", branch = "v2" } -tauri-plugin-window-state = "2.2.0" -tauri-plugin-positioner = "2.2.0" -tauri-plugin-deep-link = "2.2.0" -tauri-plugin-clipboard-manager = "2.2.1" -tauri-plugin-opener = "2.2.6" +tauri-plugin-window-state = "2.4.1" +tauri-plugin-positioner = "2.3.1" +tauri-plugin-deep-link = "2.4.5" +tauri-plugin-clipboard-manager = "2.3.2" +tauri-plugin-opener = "2.5.2" serde = { workspace = true } serde_json = "1.0.111" @@ -120,16 +120,18 @@ aho-corasick.workspace = true [target.'cfg(target_os = "macos")'.dependencies] -core-graphics = "0.24.0" -core-foundation = "0.10.0" -objc2-app-kit = { version = "0.3.0", features = [ +objc2.workspace = true +dispatch2 = "0.3.0" +block2 = "0.6.2" +objc2-foundation = "0.3.2" +objc2-application-services = "0.3.2" +objc2-core-foundation = "0.3.2" +objc2-core-graphics = "0.3.2" +objc2-app-kit = { version = "0.3.2", features = [ "NSWindow", "NSResponder", "NSHapticFeedback", ] } -cocoa = "0.26.0" -objc = "0.2.7" -swift-rs = "1.0.6" tauri-nspanel = { git = "https://github.com/ahkohd/tauri-nspanel", branch = "v2" } cidre = { workspace = true } diff --git a/apps/desktop/src-tauri/src/deeplink_actions.rs b/apps/desktop/src-tauri/src/deeplink_actions.rs index dbd90f667f..240205c982 100644 --- a/apps/desktop/src-tauri/src/deeplink_actions.rs +++ b/apps/desktop/src-tauri/src/deeplink_actions.rs @@ -6,7 +6,7 @@ use std::path::{Path, PathBuf}; use tauri::{AppHandle, Manager, Url}; use tracing::trace; -use crate::{App, ArcLock, recording::StartRecordingInputs, windows::ShowCapWindow}; +use crate::{App, ArcLock, recording::StartRecordingInputs, windows::CapWindow}; #[derive(Debug, Serialize, Deserialize)] #[serde(rename_all = "snake_case")] @@ -150,7 +150,7 @@ impl DeepLinkAction { crate::open_project_from_path(Path::new(&project_path), app.clone()) } DeepLinkAction::OpenSettings { page } => { - crate::show_window(app.clone(), ShowCapWindow::Settings { page }).await + crate::show_window(app.clone(), CapWindow::Settings { page }).await } } } diff --git a/apps/desktop/src-tauri/src/hotkeys.rs b/apps/desktop/src-tauri/src/hotkeys.rs index 52df0540af..5b7be24fac 100644 --- a/apps/desktop/src-tauri/src/hotkeys.rs +++ b/apps/desktop/src-tauri/src/hotkeys.rs @@ -2,7 +2,7 @@ use crate::{ RequestOpenRecordingPicker, RequestStartRecording, recording, recording_settings::{RecordingSettingsStore, RecordingTargetMode}, tray, - windows::ShowCapWindow, + windows::CapWindow, }; use global_hotkey::HotKeyState; use serde::{Deserialize, Serialize}; @@ -97,7 +97,7 @@ pub fn init(app: &AppHandle) { if shortcut.key == Code::Comma && shortcut.mods == Modifiers::META { let app = app.clone(); tokio::spawn(async move { - let _ = ShowCapWindow::Settings { page: None }.show(&app).await; + let _ = CapWindow::Settings { page: None }.show(&app).await; }); } diff --git a/apps/desktop/src-tauri/src/lib.rs b/apps/desktop/src-tauri/src/lib.rs index e914955174..898e2cf051 100644 --- a/apps/desktop/src-tauri/src/lib.rs +++ b/apps/desktop/src-tauri/src/lib.rs @@ -96,7 +96,7 @@ use upload::{create_or_get_video, upload_image, upload_video}; use web_api::AuthedApiError; use web_api::ManagerExt as WebManagerExt; use windows::{ - CapWindowId, EditorWindowIds, ScreenshotEditorWindowIds, ShowCapWindow, set_window_transparent, + CapWindow, CapWindowDef, EditorWindowIds, ScreenshotEditorWindowIds, set_window_transparent, }; use crate::{ @@ -509,7 +509,7 @@ async fn set_camera_input( return Err(e); } - ShowCapWindow::Camera + CapWindow::Camera .show(&app_handle) .await .map_err(|err| error!("Failed to show camera preview window: {err}")) @@ -1320,7 +1320,7 @@ struct SerializedEditorInstance { #[specta::specta] #[instrument(skip(window))] async fn create_editor_instance(window: Window) -> Result { - let CapWindowId::Editor { id } = CapWindowId::from_str(window.label()).unwrap() else { + let Ok(CapWindowDef::Editor { id }) = CapWindowDef::from_str(window.label()) else { return Err("Invalid window".to_string()); }; @@ -1472,14 +1472,14 @@ fn close_recordings_overlay_window(app: AppHandle) { #[cfg(target_os = "macos")] { use tauri_nspanel::ManagerExt; - if let Ok(panel) = app.get_webview_panel(&CapWindowId::RecordingsOverlay.label()) { + if let Ok(panel) = app.get_webview_panel(&CapWindowDef::RecordingsOverlay.label()) { panel.released_when_closed(true); panel.close(); } } if !cfg!(target_os = "macos") - && let Some(window) = CapWindowId::RecordingsOverlay.get(&app) + && let Some(window) = CapWindowDef::RecordingsOverlay.get(&app) { let _ = window.close(); } @@ -1492,7 +1492,7 @@ fn focus_captures_panel(_app: AppHandle) { #[cfg(target_os = "macos")] { use tauri_nspanel::ManagerExt; - if let Ok(panel) = _app.get_webview_panel(&CapWindowId::RecordingsOverlay.label()) { + if let Ok(panel) = _app.get_webview_panel(&CapWindowDef::RecordingsOverlay.label()) { panel.make_key_window(); } } @@ -1728,7 +1728,7 @@ async fn upload_screenshot( }; if !auth.is_upgraded() { - ShowCapWindow::Upgrade.show(&app).await.ok(); + CapWindow::Upgrade.show(&app).await.ok(); return Ok(UploadResult::UpgradeRequired); } @@ -2113,7 +2113,7 @@ async fn reset_microphone_permissions(_app: AppHandle) -> Result<(), ()> { #[specta::specta] #[instrument(skip(app))] async fn is_camera_window_open(app: AppHandle) -> bool { - CapWindowId::Camera.get(&app).is_some() + CapWindowDef::Camera.get(&app).is_some() } #[tauri::command] @@ -2191,7 +2191,7 @@ async fn editor_delete_project( #[tauri::command] #[specta::specta] #[instrument(skip(app))] -async fn show_window(app: AppHandle, window: ShowCapWindow) -> Result<(), String> { +async fn show_window(app: AppHandle, window: CapWindow) -> Result<(), String> { window.show(&app).await.map_err(|e| e.to_string())?; Ok(()) } @@ -2399,7 +2399,6 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { reset_microphone_permissions, is_camera_window_open, seek_to, - windows::position_traffic_lights, windows::set_theme, global_message_dialog, show_window, @@ -2516,7 +2515,7 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { else { let app = app.clone(); tokio::spawn(async move { - ShowCapWindow::Main { + CapWindow::Main { init_target_mode: None, } .show(&app) @@ -2557,14 +2556,14 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { flags }) .with_denylist(&[ - CapWindowId::Setup.label().as_str(), + CapWindowDef::Setup.label().as_str(), "window-capture-occluder", "target-select-overlay", - CapWindowId::CaptureArea.label().as_str(), - CapWindowId::Camera.label().as_str(), - CapWindowId::RecordingsOverlay.label().as_str(), - CapWindowId::RecordingControls.label().as_str(), - CapWindowId::Upgrade.label().as_str(), + CapWindowDef::CaptureArea.label().as_str(), + CapWindowDef::Camera.label().as_str(), + CapWindowDef::RecordingsOverlay.label().as_str(), + CapWindowDef::RecordingControls.label().as_str(), + CapWindowDef::Upgrade.label().as_str(), ]) .map_label(|label| match label { label if label.starts_with("editor-") => "editor", @@ -2607,7 +2606,7 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { camera_feed .tell(feeds::camera::OnFeedDisconnect(Box::new({ move || { - if let Some(win) = CapWindowId::Camera.get(&app) { + if let Some(win) = CapWindowDef::Camera.get(&app) { win.close().ok(); } } @@ -2714,11 +2713,11 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { .map(|s| !s.has_completed_startup) .unwrap_or(false) { - let _ = ShowCapWindow::Setup.show(&app).await; + let _ = CapWindow::Setup.show(&app).await; } else { println!("Permissions granted, showing main window"); - let _ = ShowCapWindow::Main { + let _ = CapWindow::Main { init_target_mode: None, } .show(&app) @@ -2756,7 +2755,7 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { }); RequestOpenRecordingPicker::listen_any_spawn(&app, async |event, app| { - let _ = ShowCapWindow::Main { + let _ = CapWindow::Main { init_target_mode: event.target_mode, } .show(&app) @@ -2764,7 +2763,7 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { }); RequestOpenSettings::listen_any_spawn(&app, async |payload, app| { - let _ = ShowCapWindow::Settings { + let _ = CapWindow::Settings { page: Some(payload.page), } .show(&app) @@ -2790,19 +2789,19 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { match event { WindowEvent::CloseRequested { .. } => { - if let Ok(CapWindowId::Camera) = CapWindowId::from_str(label) { + if let Ok(CapWindowDef::Camera) = CapWindowDef::from_str(label) { tokio::spawn(cleanup_camera_window(app.clone())); } } WindowEvent::Destroyed => { - if let Ok(window_id) = CapWindowId::from_str(label) { + if let Ok(window_id) = CapWindowDef::from_str(label) { match window_id { - CapWindowId::Main => { + CapWindowDef::Main => { let app = app.clone(); for (id, window) in app.webview_windows() { - if let Ok(CapWindowId::TargetSelectOverlay { .. }) = - CapWindowId::from_str(&id) + if let Ok(CapWindowDef::TargetSelectOverlay { .. }) = + CapWindowDef::from_str(&id) { let _ = window.close(); } @@ -2813,7 +2812,7 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { let app_state = &mut *state.write().await; let camera_window_open = - CapWindowId::Camera.get(&app).is_some(); + CapWindowDef::Camera.get(&app).is_some(); if !app_state.is_recording_active_or_pending() && !camera_window_open @@ -2831,18 +2830,18 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { } }); } - CapWindowId::Editor { id } => { + CapWindowDef::Editor { id } => { let window_ids = EditorWindowIds::get(window.app_handle()); window_ids.ids.lock().unwrap().retain(|(_, _id)| *_id != id); tokio::spawn(EditorInstances::remove(window.clone())); #[cfg(target_os = "windows")] - if CapWindowId::Settings.get(app).is_none() { + if CapWindowDef::Settings.get(app).is_none() { reopen_main_window(app); } } - CapWindowId::ScreenshotEditor { id } => { + CapWindowDef::ScreenshotEditor { id } => { let window_ids = ScreenshotEditorWindowIds::get(window.app_handle()); window_ids.ids.lock().unwrap().retain(|(_, _id)| *_id != id); @@ -2850,18 +2849,18 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { tokio::spawn(ScreenshotEditorInstances::remove(window.clone())); #[cfg(target_os = "windows")] - if CapWindowId::Settings.get(app).is_none() { + if CapWindowDef::Settings.get(app).is_none() { reopen_main_window(app); } } - CapWindowId::Settings => { + CapWindowDef::Settings => { for (label, window) in app.webview_windows() { - if let Ok(id) = CapWindowId::from_str(&label) + if let Ok(id) = CapWindowDef::from_str(&label) && matches!( id, - CapWindowId::TargetSelectOverlay { .. } - | CapWindowId::Main - | CapWindowId::Camera + CapWindowDef::TargetSelectOverlay { .. } + | CapWindowDef::Main + | CapWindowDef::Camera ) { let _ = window.show(); @@ -2875,14 +2874,14 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { return; } - CapWindowId::Upgrade | CapWindowId::ModeSelect => { + CapWindowDef::Upgrade | CapWindowDef::ModeSelect => { for (label, window) in app.webview_windows() { - if let Ok(id) = CapWindowId::from_str(&label) + if let Ok(id) = CapWindowDef::from_str(&label) && matches!( id, - CapWindowId::TargetSelectOverlay { .. } - | CapWindowId::Main - | CapWindowId::Camera + CapWindowDef::TargetSelectOverlay { .. } + | CapWindowDef::Main + | CapWindowDef::Camera ) { let _ = window.show(); @@ -2890,12 +2889,26 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { } return; } - CapWindowId::TargetSelectOverlay { display_id } => { + CapWindowDef::TargetSelectOverlay { display_id } => { app.state::() .destroy(&display_id, app.global_shortcut()); } - CapWindowId::Camera => { - tokio::spawn(cleanup_camera_window(app.clone())); + CapWindowDef::Camera => { + let app = app.clone(); + tokio::spawn(async move { + let state = app.state::>(); + let mut app_state = state.write().await; + + app_state.camera_preview.on_window_close(); + + if !app_state.is_recording_active_or_pending() { + let _ = app_state + .camera_feed + .ask(feeds::camera::RemoveInput) + .await; + app_state.camera_in_use = false; + } + }); } _ => {} }; @@ -2906,7 +2919,7 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { && app .webview_windows() .keys() - .all(|label| !CapWindowId::from_str(label).unwrap().activates_dock()) + .all(|label| !CapWindowDef::from_str(label).unwrap().activates_dock()) { #[cfg(target_os = "macos")] app.set_activation_policy(tauri::ActivationPolicy::Accessory) @@ -2915,12 +2928,12 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { } #[cfg(target_os = "macos")] WindowEvent::Focused(focused) => { - let window_id = CapWindowId::from_str(label); + let window_id = CapWindowDef::from_str(label); - if matches!(window_id, Ok(CapWindowId::Upgrade)) { + if matches!(window_id, Ok(CapWindowDef::Upgrade)) { for (label, window) in app.webview_windows() { - if let Ok(id) = CapWindowId::from_str(&label) - && matches!(id, CapWindowId::TargetSelectOverlay { .. }) + if let Ok(id) = CapWindowDef::from_str(&label) + && matches!(id, CapWindowDef::TargetSelectOverlay { .. }) { let _ = window.hide(); } @@ -2972,7 +2985,7 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { } else { let handle = _handle.clone(); tokio::spawn(async move { - let _ = ShowCapWindow::Main { + let _ = CapWindow::Main { init_target_mode: None, } .show(&handle) @@ -2991,20 +3004,23 @@ pub async fn run(recording_logging_handle: LoggingHandle, logs_dir: PathBuf) { #[cfg(target_os = "windows")] fn has_open_editor_window(app: &AppHandle) -> bool { - app.webview_windows() - .keys() - .any(|label| matches!(CapWindowId::from_str(label), Ok(CapWindowId::Editor { .. }))) + app.webview_windows().keys().any(|label| { + matches!( + CapWindowDef::from_str(label), + Ok(CapWindowDef::Editor { .. }) + ) + }) } #[cfg(target_os = "windows")] fn reopen_main_window(app: &AppHandle) { - if let Some(main) = CapWindowId::Main.get(app) { + if let Some(main) = CapWindowDef::Main.get(app) { let _ = main.show(); let _ = main.set_focus(); } else { let handle = app.clone(); tokio::spawn(async move { - let _ = ShowCapWindow::Main { + let _ = CapWindow::Main { init_target_mode: None, } .show(&handle) @@ -3265,7 +3281,7 @@ fn open_project_from_path(path: &Path, app: AppHandle) -> Result<(), String> { } let project_path = path.to_path_buf(); - tokio::spawn(async move { ShowCapWindow::Editor { project_path }.show(&app).await }); + tokio::spawn(async move { CapWindow::Editor { project_path }.show(&app).await }); } RecordingMetaInner::Instant(_) => { let mp4_path = path.join("content/output.mp4"); @@ -3274,7 +3290,7 @@ fn open_project_from_path(path: &Path, app: AppHandle) -> Result<(), String> { let _ = app .opener() .open_path(mp4_path.to_str().unwrap_or_default(), None::); - if let Some(main_window) = CapWindowId::Main.get(&app) { + if let Some(main_window) = CapWindowDef::Main.get(&app) { main_window.close().ok(); } } diff --git a/apps/desktop/src-tauri/src/permissions.rs b/apps/desktop/src-tauri/src/permissions.rs index 9e6ad00f20..f1983de1d4 100644 --- a/apps/desktop/src-tauri/src/permissions.rs +++ b/apps/desktop/src-tauri/src/permissions.rs @@ -4,14 +4,6 @@ use serde::{Deserialize, Serialize}; use cidre::av; use tracing::instrument; -#[cfg(target_os = "macos")] -#[link(name = "ApplicationServices", kind = "framework")] -unsafe extern "C" { - fn AXIsProcessTrusted() -> bool; - fn AXIsProcessTrustedWithOptions(options: core_foundation::dictionary::CFDictionaryRef) - -> bool; -} - #[derive(Debug, Serialize, Deserialize, specta::Type)] #[serde(rename_all = "camelCase")] pub enum OSPermission { @@ -91,20 +83,17 @@ pub async fn request_permission(_permission: OSPermission) { }); } OSPermission::Accessibility => { - use core_foundation::base::TCFType; - use core_foundation::dictionary::CFDictionary; // Import CFDictionaryRef - use core_foundation::string::CFString; - - let prompt_key = CFString::new("AXTrustedCheckOptionPrompt"); - let prompt_value = core_foundation::boolean::CFBoolean::true_value(); - - let options = CFDictionary::from_CFType_pairs(&[( - prompt_key.as_CFType(), - prompt_value.as_CFType(), - )]); - + let options = objc2_core_foundation::CFDictionary::from_slices( + &[&*objc2_core_foundation::CFString::from_static_str( + "AXTrustedCheckOptionPrompt", + )], + &[objc2_core_foundation::CFBoolean::new(true)], + ); + // SAFETY: The AXIsProcessTrustedWithOptions function is safe to call with a valid CFDictionaryRef. unsafe { - AXIsProcessTrustedWithOptions(options.as_concrete_TypeRef()); + objc2_application_services::AXIsProcessTrustedWithOptions(Some( + options.as_opaque(), + )); } } } @@ -173,7 +162,7 @@ pub fn do_permissions_check(_initial_check: bool) -> OSPermissionsCheck { }, microphone: check_av_permission(MediaType::audio()), camera: check_av_permission(MediaType::video()), - accessibility: if unsafe { AXIsProcessTrusted() } { + accessibility: if unsafe { objc2_application_services::AXIsProcessTrusted() } { OSPermissionStatus::Granted } else { OSPermissionStatus::Denied diff --git a/apps/desktop/src-tauri/src/platform/macos/delegates.rs b/apps/desktop/src-tauri/src/platform/macos/delegates.rs deleted file mode 100644 index d8933c3b84..0000000000 --- a/apps/desktop/src-tauri/src/platform/macos/delegates.rs +++ /dev/null @@ -1,361 +0,0 @@ -// TODO(Ilya): Re-write all macos code to use `objc2` crates n -/// -/// Credit to @haasal, @charrondev, Hoppscotch app, Electron, Zed Editor -/// -/// https://github.com/haasal -/// https://gist.github.com/charrondev -/// https://github.com/hoppscotch/hoppscotch -/// https://github.com/clearlysid/tauri-plugin-decorum/ -/// (Issue) https://github.com/tauri-apps/tauri/issues/4789 -/// (Gist) https://gist.github.com/charrondev/43150e940bd2771b1ea88256d491c7a9 -/// (Hoppscotch) https://github.com/hoppscotch/hoppscotch/blob/286fcd2bb08a84f027b10308d1e18da368f95ebf/packages/hoppscotch-selfhost-desktop/src-tauri/src/mac/window.rs -/// (Electron) https://github.com/electron/electron/blob/38512efd25a159ddc64a54c22ef9eb6dd60064ec/shell/browser/native_window_mac.mm#L1454 -/// -use objc::{msg_send, sel, sel_impl}; -use rand::{Rng, distributions::Alphanumeric}; -use tauri::{Emitter, LogicalPosition, Runtime, Window}; - -pub struct UnsafeWindowHandle(pub *mut std::ffi::c_void); -unsafe impl Send for UnsafeWindowHandle {} -unsafe impl Sync for UnsafeWindowHandle {} - -#[derive(Debug)] -struct WindowState { - window: Window, - controls_inset: LogicalPosition, -} - -// TODO: Respect RTL display language -// TODO: Update Height, consider supporting the scenario where the buttons are hidden by the system due to screen sharing of the window -// https://developer.apple.com/documentation/appkit/nsapplication/1428556-userinterfacelayoutdirection?language=objc -pub fn position_window_controls( - ns_window_handle: UnsafeWindowHandle, - inset: &LogicalPosition, -) { - use cocoa::{ - appkit::{NSView, NSWindow, NSWindowButton}, - base::id, - foundation::NSRect, - }; - - let ns_window = ns_window_handle.0 as id; - unsafe { - let close = ns_window.standardWindowButton_(NSWindowButton::NSWindowCloseButton); - let minimize = ns_window.standardWindowButton_(NSWindowButton::NSWindowMiniaturizeButton); - let zoom = ns_window.standardWindowButton_(NSWindowButton::NSWindowZoomButton); - - let title_bar_container_view = close.superview().superview(); - - let close_rect: NSRect = msg_send![close, frame]; - let button_height = close_rect.size.height; - - let title_bar_frame_height = button_height + inset.y; - let mut title_bar_rect = NSView::frame(title_bar_container_view); - title_bar_rect.size.height = title_bar_frame_height; - title_bar_rect.origin.y = NSView::frame(ns_window).size.height - title_bar_frame_height; - let _: () = msg_send![title_bar_container_view, setFrame: title_bar_rect]; - - let window_buttons = vec![close, minimize, zoom]; - let space_between = NSView::frame(minimize).origin.x - NSView::frame(close).origin.x; - let vertical_offset = 4.0; // Adjust this value to push buttons down - - for (i, button) in window_buttons.into_iter().enumerate() { - let mut rect: NSRect = NSView::frame(button); - rect.origin.x = inset.x + (i as f64 * space_between); - rect.origin.y = ((title_bar_frame_height - button_height) / 2.0) - vertical_offset; - button.setFrameOrigin(rect.origin); - } - } -} - -pub fn setup(window: Window, controls_inset: LogicalPosition) { - use cocoa::appkit::NSWindow; - use cocoa::base::{BOOL, id}; - use cocoa::foundation::NSUInteger; - use objc::runtime::{Object, Sel}; - use std::ffi::c_void; - - let Ok(ns_win) = window.ns_window() else { - tracing::warn!("Failed to get window handle for delegate setup"); - return; - }; - - // Do the initial positioning - position_window_controls(UnsafeWindowHandle(ns_win), &controls_inset); - - // Ensure they stay in place while resizing the window. - fn with_window_state) -> T, T>( - this: &Object, - func: F, - ) { - let ptr = unsafe { - let x: *mut c_void = *this.get_ivar("app_box"); - &mut *(x as *mut WindowState) - }; - func(ptr); - } - - unsafe { - let ns_win_id = ns_win as id; - let current_delegate: id = ns_win_id.delegate(); - - extern "C" fn on_window_should_close(this: &Object, _cmd: Sel, sender: id) -> BOOL { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - msg_send![super_del, windowShouldClose: sender] - } - } - extern "C" fn on_window_will_close(this: &Object, _cmd: Sel, notification: id) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, windowWillClose: notification]; - } - } - extern "C" fn on_window_did_resize(this: &Object, _cmd: Sel, notification: id) { - unsafe { - with_window_state(this, |state: &mut WindowState| { - position_window_controls( - UnsafeWindowHandle( - state - .window - .ns_window() - .expect("Failed to get handle to NSWindow"), - ), - &state.controls_inset, - ); - }); - - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, windowDidResize: notification]; - } - } - extern "C" fn on_window_did_move(this: &Object, _cmd: Sel, notification: id) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, windowDidMove: notification]; - } - } - extern "C" fn on_window_did_change_backing_properties( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, windowDidChangeBackingProperties: notification]; - } - } - extern "C" fn on_window_did_become_key(this: &Object, _cmd: Sel, notification: id) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, windowDidBecomeKey: notification]; - } - } - extern "C" fn on_window_did_resign_key(this: &Object, _cmd: Sel, notification: id) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, windowDidResignKey: notification]; - } - } - extern "C" fn on_dragging_entered(this: &Object, _cmd: Sel, notification: id) -> BOOL { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - msg_send![super_del, draggingEntered: notification] - } - } - extern "C" fn on_prepare_for_drag_operation( - this: &Object, - _cmd: Sel, - notification: id, - ) -> BOOL { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - msg_send![super_del, prepareForDragOperation: notification] - } - } - extern "C" fn on_perform_drag_operation(this: &Object, _cmd: Sel, sender: id) -> BOOL { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - msg_send![super_del, performDragOperation: sender] - } - } - extern "C" fn on_conclude_drag_operation(this: &Object, _cmd: Sel, notification: id) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, concludeDragOperation: notification]; - } - } - extern "C" fn on_dragging_exited(this: &Object, _cmd: Sel, notification: id) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, draggingExited: notification]; - } - } - extern "C" fn on_window_will_use_full_screen_presentation_options( - this: &Object, - _cmd: Sel, - window: id, - proposed_options: NSUInteger, - ) -> NSUInteger { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - msg_send![super_del, window: window willUseFullScreenPresentationOptions: proposed_options] - } - } - extern "C" fn on_window_did_enter_full_screen( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - with_window_state(this, |state: &mut WindowState| { - state - .window - .emit("did-enter-fullscreen", ()) - .expect("Failed to emit event"); - }); - - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, windowDidEnterFullScreen: notification]; - } - } - extern "C" fn on_window_will_enter_full_screen( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - with_window_state(this, |state: &mut WindowState| { - state - .window - .emit("will-enter-fullscreen", ()) - .expect("Failed to emit event"); - }); - - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, windowWillEnterFullScreen: notification]; - } - } - extern "C" fn on_window_did_exit_full_screen( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - with_window_state(this, |state: &mut WindowState| { - state - .window - .emit("did-exit-fullscreen", ()) - .expect("Failed to emit event"); - - position_window_controls( - UnsafeWindowHandle( - state - .window - .ns_window() - .expect("Failed to get handle to NSWindow"), - ), - &state.controls_inset, - ); - }); - - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, windowDidExitFullScreen: notification]; - } - } - extern "C" fn on_window_will_exit_full_screen( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - with_window_state(this, |state: &mut WindowState| { - state - .window - .emit("will-exit-fullscreen", ()) - .expect("Failed to emit event"); - }); - - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, windowWillExitFullScreen: notification]; - } - } - extern "C" fn on_window_did_fail_to_enter_full_screen( - this: &Object, - _cmd: Sel, - window: id, - ) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, windowDidFailToEnterFullScreen: window]; - } - } - extern "C" fn on_effective_appearance_did_change( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![super_del, effectiveAppearanceDidChange: notification]; - } - } - extern "C" fn on_effective_appearance_did_changed_on_main_thread( - this: &Object, - _cmd: Sel, - notification: id, - ) { - unsafe { - let super_del: id = *this.get_ivar("super_delegate"); - let _: () = msg_send![ - super_del, - effectiveAppearanceDidChangedOnMainThread: notification - ]; - } - } - - let window_label = window.label().to_string(); - - let app_state = WindowState { - window, - controls_inset, - }; - let app_box = Box::into_raw(Box::new(app_state)) as *mut c_void; - let random_str: String = rand::thread_rng() - .sample_iter(&Alphanumeric) - .take(20) - .map(char::from) - .collect(); - - // We need to ensure we have a unique delegate name, otherwise we will panic while trying to create a duplicate - // delegate with the same name. - let delegate_name = format!("windowDelegate_cap_{window_label}_{random_str}"); - - ns_win_id.setDelegate_(cocoa::delegate!(&delegate_name, { - window: id = ns_win_id, - app_box: *mut c_void = app_box, - toolbar: id = cocoa::base::nil, - super_delegate: id = current_delegate, - (windowShouldClose:) => on_window_should_close as extern "C" fn(&Object, Sel, id) -> BOOL, - (windowWillClose:) => on_window_will_close as extern "C" fn(&Object, Sel, id), - (windowDidResize:) => on_window_did_resize:: as extern "C" fn(&Object, Sel, id), - (windowDidMove:) => on_window_did_move as extern "C" fn(&Object, Sel, id), - (windowDidChangeBackingProperties:) => on_window_did_change_backing_properties as extern "C" fn(&Object, Sel, id), - (windowDidBecomeKey:) => on_window_did_become_key as extern "C" fn(&Object, Sel, id), - (windowDidResignKey:) => on_window_did_resign_key as extern "C" fn(&Object, Sel, id), - (draggingEntered:) => on_dragging_entered as extern "C" fn(&Object, Sel, id) -> BOOL, - (prepareForDragOperation:) => on_prepare_for_drag_operation as extern "C" fn(&Object, Sel, id) -> BOOL, - (performDragOperation:) => on_perform_drag_operation as extern "C" fn(&Object, Sel, id) -> BOOL, - (concludeDragOperation:) => on_conclude_drag_operation as extern "C" fn(&Object, Sel, id), - (draggingExited:) => on_dragging_exited as extern "C" fn(&Object, Sel, id), - (window:willUseFullScreenPresentationOptions:) => on_window_will_use_full_screen_presentation_options as extern "C" fn(&Object, Sel, id, NSUInteger) -> NSUInteger, - (windowDidEnterFullScreen:) => on_window_did_enter_full_screen:: as extern "C" fn(&Object, Sel, id), - (windowWillEnterFullScreen:) => on_window_will_enter_full_screen:: as extern "C" fn(&Object, Sel, id), - (windowDidExitFullScreen:) => on_window_did_exit_full_screen:: as extern "C" fn(&Object, Sel, id), - (windowWillExitFullScreen:) => on_window_will_exit_full_screen:: as extern "C" fn(&Object, Sel, id), - (windowDidFailToEnterFullScreen:) => on_window_did_fail_to_enter_full_screen as extern "C" fn(&Object, Sel, id), - (effectiveAppearanceDidChange:) => on_effective_appearance_did_change as extern "C" fn(&Object, Sel, id), - (effectiveAppearanceDidChangedOnMainThread:) => on_effective_appearance_did_changed_on_main_thread as extern "C" fn(&Object, Sel, id) - })) - } -} diff --git a/apps/desktop/src-tauri/src/platform/macos/mod.rs b/apps/desktop/src-tauri/src/platform/macos/mod.rs index 14a3158583..1c60e46604 100644 --- a/apps/desktop/src-tauri/src/platform/macos/mod.rs +++ b/apps/desktop/src-tauri/src/platform/macos/mod.rs @@ -1,53 +1,40 @@ -// use std::ffi::c_void; +use objc2::{Message, rc::Retained}; +use objc2_app_kit::{NSWindow, NSWindowButton}; +use tauri::WebviewWindow; -// use cocoa::{ -// base::{id, nil}, -// foundation::NSString, -// }; -// use core_graphics::{ -// base::boolean_t, -// display::{CFDictionaryRef, CGRect}, -// }; -// use objc::{class, msg_send, sel, sel_impl}; - -pub mod delegates; mod sc_shareable_content; pub use sc_shareable_content::*; -pub fn set_window_level(window: tauri::Window, level: objc2_app_kit::NSWindowLevel) { - let c_window = window.clone(); - _ = window.run_on_main_thread(move || unsafe { - let Ok(ns_win) = c_window.ns_window() else { - return; - }; - let ns_win = ns_win as *const objc2_app_kit::NSWindow; - (*ns_win).setLevel(level); - }); -} - -// pub fn get_ns_window_number(ns_window: *mut c_void) -> isize { -// let ns_window = ns_window as *const objc2_app_kit::NSWindow; +pub trait WebviewWindowExt { + fn objc2_nswindow(&self) -> Retained; -// unsafe { (*ns_window).windowNumber() } -// } - -// #[link(name = "CoreGraphics", kind = "framework")] -// unsafe extern "C" { -// pub fn CGRectMakeWithDictionaryRepresentation( -// dict: CFDictionaryRef, -// rect: *mut CGRect, -// ) -> boolean_t; -// } + fn set_traffic_lights_visible(&self, visible: bool); +} -// /// Makes the background of the WKWebView layer transparent. -// /// This differs from Tauri's implementation as it does not change the window background which causes performance performance issues and artifacts when shadows are enabled on the window. -// /// Use Tauri's implementation to make the window itself transparent. -// pub fn make_webview_transparent(target: &tauri::WebviewWindow) -> tauri::Result<()> { -// target.with_webview(|webview| unsafe { -// let wkwebview = webview.inner() as id; -// let no: id = msg_send![class!(NSNumber), numberWithBool:0]; -// // [https://developer.apple.com/documentation/webkit/webview/1408486-drawsbackground] -// let _: id = msg_send![wkwebview, setValue:no forKey: NSString::alloc(nil).init_str("drawsBackground")]; -// }) -// } +impl WebviewWindowExt for WebviewWindow { + #[inline] + fn objc2_nswindow(&self) -> Retained { + // SAFETY: This cast is safe as the existence of the WebviewWindow means it's attached to an NSWindow + unsafe { + (&*self + .ns_window() + .expect("WebviewWindow is always backed by NSWindow") + .cast::()) + .retain() + } + } + + fn set_traffic_lights_visible(&self, visible: bool) { + let nswindow = self.objc2_nswindow(); + for btn in [ + NSWindowButton::CloseButton, + NSWindowButton::MiniaturizeButton, + NSWindowButton::ZoomButton, + ] { + if let Some(btn) = nswindow.standardWindowButton(btn) { + btn.setHidden(!visible); + } + } + } +} diff --git a/apps/desktop/src-tauri/src/platform/mod.rs b/apps/desktop/src-tauri/src/platform/mod.rs index e51d3e709a..48324c5b96 100644 --- a/apps/desktop/src-tauri/src/platform/mod.rs +++ b/apps/desktop/src-tauri/src/platform/mod.rs @@ -38,7 +38,7 @@ pub fn perform_haptic_feedback( _time: Option, ) -> Result<(), String> { #[cfg(target_os = "macos")] - unsafe { + { use objc2_app_kit::{ NSHapticFeedbackManager, NSHapticFeedbackPattern, NSHapticFeedbackPerformanceTime, NSHapticFeedbackPerformer, diff --git a/apps/desktop/src-tauri/src/recording.rs b/apps/desktop/src-tauri/src/recording.rs index a796749932..a36aaea8f0 100644 --- a/apps/desktop/src-tauri/src/recording.rs +++ b/apps/desktop/src-tauri/src/recording.rs @@ -66,7 +66,7 @@ use crate::{ InstantMultipartUpload, build_video_meta, compress_image, create_or_get_video, upload_video, }, web_api::ManagerExt, - windows::{CapWindowId, ShowCapWindow}, + windows::{CapWindow, CapWindowDef}, }; #[derive(Clone)] @@ -478,7 +478,7 @@ pub async fn start_recording( .add_recording_logging_handle(&project_file_path.join("recording-logs.log")) .await?; - if let Some(window) = CapWindowId::Camera.get(&app) { + if let Some(window) = CapWindowDef::Camera.get(&app) { let _ = window.set_content_protected(matches!(inputs.mode, RecordingMode::Studio)); } @@ -563,13 +563,13 @@ pub async fn start_recording( if let Some(show) = inputs .capture_target .display() - .map(|d| ShowCapWindow::WindowCaptureOccluder { screen_id: d.id() }) + .map(|d| CapWindow::WindowCaptureOccluder { screen_id: d.id() }) { let _ = show.show(&app).await; } } ScreenCaptureTarget::Area { screen, .. } => { - let _ = ShowCapWindow::WindowCaptureOccluder { + let _ = CapWindow::WindowCaptureOccluder { screen_id: screen.clone(), } .show(&app) @@ -588,17 +588,17 @@ pub async fn start_recording( for (id, win) in app .webview_windows() .iter() - .filter_map(|(label, win)| CapWindowId::from_str(label).ok().map(|id| (id, win))) + .filter_map(|(label, win)| CapWindowDef::from_str(label).ok().map(|id| (id, win))) { - if matches!(id, CapWindowId::TargetSelectOverlay { .. }) { + if matches!(id, CapWindowDef::TargetSelectOverlay { .. }) { win.close().ok(); } } - let _ = ShowCapWindow::InProgressRecording { countdown } + let _ = CapWindow::InProgressRecording { countdown } .show(&app) .await; - if let Some(window) = CapWindowId::Main.get(&app) { + if let Some(window) = CapWindowDef::Main.get(&app) { let _ = general_settings .map(|v| v.main_window_recording_start_behaviour) .unwrap_or_default() @@ -906,7 +906,7 @@ pub async fn start_recording( ) .kind(tauri_plugin_dialog::MessageDialogKind::Error); - if let Some(window) = CapWindowId::RecordingControls.get(&app) { + if let Some(window) = CapWindowDef::RecordingControls.get(&app) { dialog = dialog.parent(&window); } @@ -970,7 +970,7 @@ async fn handle_spawn_failure( ) .kind(tauri_plugin_dialog::MessageDialogKind::Error); - if let Some(window) = CapWindowId::RecordingControls.get(app) { + if let Some(window) = CapWindowDef::RecordingControls.get(app) { dialog = dialog.parent(&window); } @@ -1097,14 +1097,14 @@ pub async fn delete_recording(app: AppHandle, state: MutableState<'_, App>) -> R .flatten() .unwrap_or_default(); - if let Some(window) = CapWindowId::RecordingControls.get(&app) { + if let Some(window) = CapWindowDef::RecordingControls.get(&app) { let _ = window.close(); } match settings.post_deletion_behaviour { PostDeletionBehaviour::DoNothing => {} PostDeletionBehaviour::ReopenRecordingWindow => { - let _ = ShowCapWindow::Main { + let _ = CapWindow::Main { init_target_mode: None, } .show(&app) @@ -1327,14 +1327,14 @@ async fn handle_recording_end( let _ = app.recording_logging_handle.reload(None); - if let Some(window) = CapWindowId::RecordingControls.get(&handle) { + if let Some(window) = CapWindowDef::RecordingControls.get(&handle) { let _ = window.close(); } - if let Some(window) = CapWindowId::Main.get(&handle) { + if let Some(window) = CapWindowDef::Main.get(&handle) { window.unminimize().ok(); } else { - if let Some(v) = CapWindowId::Camera.get(&handle) { + if let Some(v) = CapWindowDef::Camera.get(&handle) { let _ = v.close(); } let _ = app.mic_feed.ask(microphone::RemoveInput).await; @@ -1342,7 +1342,7 @@ async fn handle_recording_end( app.selected_mic_label = None; app.selected_camera_id = None; app.camera_in_use = false; - if let Some(win) = CapWindowId::Camera.get(&handle) { + if let Some(win) = CapWindowDef::Camera.get(&handle) { win.close().ok(); } } @@ -1560,14 +1560,14 @@ async fn handle_recording_finish( .unwrap_or(PostStudioRecordingBehaviour::OpenEditor) { PostStudioRecordingBehaviour::OpenEditor => { - let _ = ShowCapWindow::Editor { + let _ = CapWindow::Editor { project_path: recording_dir, } .show(app) .await; } PostStudioRecordingBehaviour::ShowOverlay => { - let _ = ShowCapWindow::RecordingsOverlay.show(app).await; + let _ = CapWindow::RecordingsOverlay.show(app).await; let app = AppHandle::clone(app); tokio::spawn(async move { diff --git a/apps/desktop/src-tauri/src/screenshot_editor.rs b/apps/desktop/src-tauri/src/screenshot_editor.rs index 58f7a5f8f6..fa2c4b7a22 100644 --- a/apps/desktop/src-tauri/src/screenshot_editor.rs +++ b/apps/desktop/src-tauri/src/screenshot_editor.rs @@ -1,7 +1,7 @@ use crate::PendingScreenshots; use crate::frame_ws::{WSFrame, create_watch_frame_ws}; use crate::gpu_context; -use crate::windows::{CapWindowId, ScreenshotEditorWindowIds}; +use crate::windows::{CapWindowDef, ScreenshotEditorWindowIds}; use cap_project::{ ProjectConfiguration, RecordingMeta, RecordingMetaInner, SingleSegment, StudioRecordingMeta, VideoMeta, @@ -423,8 +423,8 @@ pub struct SerializedScreenshotEditorInstance { pub async fn create_screenshot_editor_instance( window: Window, ) -> Result { - let CapWindowId::ScreenshotEditor { id } = - CapWindowId::from_str(window.label()).map_err(|e| e.to_string())? + let CapWindowDef::ScreenshotEditor { id } = + CapWindowDef::from_str(window.label()).map_err(|e| e.to_string())? else { return Err("Invalid window".to_string()); }; diff --git a/apps/desktop/src-tauri/src/target_select_overlay.rs b/apps/desktop/src-tauri/src/target_select_overlay.rs index e41efe5e91..a9ebbb8161 100644 --- a/apps/desktop/src-tauri/src/target_select_overlay.rs +++ b/apps/desktop/src-tauri/src/target_select_overlay.rs @@ -11,7 +11,7 @@ use cap_recording::screen_capture::ScreenCaptureTarget; use crate::{ general_settings, window_exclusion::WindowExclusion, - windows::{CapWindowId, ShowCapWindow}, + windows::{CapWindow, CapWindowDef}, }; use scap_targets::{ Display, DisplayId, Window, WindowId, @@ -59,7 +59,7 @@ pub async fn open_target_select_overlays( .map(|d| d.id()) .collect::>(); for display_id in displays { - let _ = ShowCapWindow::TargetSelectOverlay { display_id } + let _ = CapWindow::TargetSelectOverlay { display_id } .show(&app) .await; } @@ -184,7 +184,7 @@ pub async fn update_camera_overlay_bounds( #[instrument(skip(app))] pub async fn close_target_select_overlays(app: AppHandle) -> Result<(), String> { for (id, window) in app.webview_windows() { - if let Ok(CapWindowId::TargetSelectOverlay { .. }) = CapWindowId::from_str(&id) { + if let Ok(CapWindowDef::TargetSelectOverlay { .. }) = CapWindowDef::from_str(&id) { let _ = window.close(); } } @@ -238,12 +238,8 @@ pub async fn focus_window(window_id: WindowId) -> Result<(), String> { .owner_pid() .ok_or("Could not get window owner PID")?; - if let Some(app) = - unsafe { NSRunningApplication::runningApplicationWithProcessIdentifier(pid) } - { - unsafe { - app.activateWithOptions(NSApplicationActivationOptions::ActivateIgnoringOtherApps); - } + if let Some(app) = NSRunningApplication::runningApplicationWithProcessIdentifier(pid) { + app.activateWithOptions(NSApplicationActivationOptions::ActivateIgnoringOtherApps); } } @@ -299,8 +295,8 @@ impl WindowFocusManager { tokio::spawn(async move { let app = window.app_handle(); loop { - let cap_main = CapWindowId::Main.get(app); - let cap_settings = CapWindowId::Settings.get(app); + let cap_main = CapWindowDef::Main.get(app); + let cap_settings = CapWindowDef::Settings.get(app); let main_window_available = cap_main.is_some(); let settings_window_available = cap_settings.is_some(); diff --git a/apps/desktop/src-tauri/src/tray.rs b/apps/desktop/src-tauri/src/tray.rs index 8b2e1efa9c..2d7bb19517 100644 --- a/apps/desktop/src-tauri/src/tray.rs +++ b/apps/desktop/src-tauri/src/tray.rs @@ -2,7 +2,7 @@ use crate::{ NewScreenshotAdded, NewStudioRecordingAdded, RecordingStarted, RecordingStopped, RequestOpenRecordingPicker, RequestOpenSettings, recording, recording_settings::{RecordingSettingsStore, RecordingTargetMode}, - windows::ShowCapWindow, + windows::CapWindow, }; use cap_recording::RecordingMode; @@ -456,7 +456,7 @@ fn handle_previous_item_click(app: &AppHandle, path_str: &str) { let app = app.clone(); let screenshot_path = path; tokio::spawn(async move { - let _ = ShowCapWindow::ScreenshotEditor { + let _ = CapWindow::ScreenshotEditor { path: screenshot_path, } .show(&app) @@ -478,7 +478,7 @@ fn handle_previous_item_click(app: &AppHandle, path_str: &str) { let app = app.clone(); let project_path = path.clone(); tokio::spawn(async move { - let _ = ShowCapWindow::Editor { project_path }.show(&app).await; + let _ = CapWindow::Editor { project_path }.show(&app).await; }); } RecordingMetaInner::Instant(_) => { @@ -553,7 +553,7 @@ pub fn create_tray(app: &AppHandle) -> tauri::Result<()> { Ok(TrayItem::OpenCap) => { let app = app.clone(); tokio::spawn(async move { - let _ = ShowCapWindow::Main { + let _ = CapWindow::Main { init_target_mode: None, } .show(&app) @@ -593,7 +593,7 @@ pub fn create_tray(app: &AppHandle) -> tauri::Result<()> { Ok(TrayItem::OpenSettings) => { let app = app.clone(); tokio::spawn( - async move { ShowCapWindow::Settings { page: None }.show(&app).await }, + async move { CapWindow::Settings { page: None }.show(&app).await }, ); } Ok(TrayItem::UploadLogs) => { diff --git a/apps/desktop/src-tauri/src/windows.rs b/apps/desktop/src-tauri/src/windows.rs index 552eae2a64..3dfffbea5a 100644 --- a/apps/desktop/src-tauri/src/windows.rs +++ b/apps/desktop/src-tauri/src/windows.rs @@ -33,10 +33,10 @@ use crate::{ use cap_recording::feeds; #[cfg(target_os = "macos")] -const DEFAULT_TRAFFIC_LIGHTS_INSET: LogicalPosition = LogicalPosition::new(12.0, 12.0); +use crate::platform::{self, WebviewWindowExt}; #[derive(Clone, Deserialize, Type)] -pub enum CapWindowId { +pub enum CapWindowDef { // Contains onboarding + permissions Setup, Main, @@ -54,7 +54,7 @@ pub enum CapWindowId { ScreenshotEditor { id: u32 }, } -impl FromStr for CapWindowId { +impl FromStr for CapWindowDef { type Err = String; fn from_str(s: &str) -> Result { @@ -99,7 +99,7 @@ impl FromStr for CapWindowId { } } -impl std::fmt::Display for CapWindowId { +impl std::fmt::Display for CapWindowDef { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { match self { Self::Setup => write!(f, "setup"), @@ -124,28 +124,28 @@ impl std::fmt::Display for CapWindowId { } } -impl CapWindowId { +impl CapWindowDef { pub fn label(&self) -> String { self.to_string() } - pub fn title(&self) -> String { + pub const fn title(&self) -> &str { match self { - Self::Setup => "Cap Setup".to_string(), - Self::Settings => "Cap Settings".to_string(), - Self::WindowCaptureOccluder { .. } => "Cap Window Capture Occluder".to_string(), - Self::CaptureArea => "Cap Capture Area".to_string(), - Self::RecordingControls => "Cap Recording Controls".to_string(), - Self::Editor { .. } => "Cap Editor".to_string(), - Self::ScreenshotEditor { .. } => "Cap Screenshot Editor".to_string(), - Self::ModeSelect => "Cap Mode Selection".to_string(), - Self::Camera => "Cap Camera".to_string(), - Self::RecordingsOverlay => "Cap Recordings Overlay".to_string(), - _ => "Cap".to_string(), + Self::Setup => "Cap Setup", + Self::Settings => "Cap Settings", + Self::WindowCaptureOccluder { .. } => "Cap Window Capture Occluder", + Self::CaptureArea => "Cap Capture Area", + Self::RecordingControls => "Cap Recording Controls", + Self::Editor { .. } => "Cap Editor", + Self::ScreenshotEditor { .. } => "Cap Screenshot Editor", + Self::ModeSelect => "Cap Mode Selection", + Self::Camera => "Cap Camera", + Self::RecordingsOverlay => "Cap Recordings Overlay", + _ => "Cap", } } - pub fn activates_dock(&self) -> bool { + pub const fn activates_dock(&self) -> bool { matches!( self, Self::Setup @@ -158,28 +158,57 @@ impl CapWindowId { ) } + #[cfg(target_os = "macos")] + pub const fn pre_solarium_traffic_lights_position(&self) -> LogicalPosition { + match self { + Self::Editor { .. } | Self::ScreenshotEditor { .. } => LogicalPosition::new(20.0, 25.0), + _ => LogicalPosition::new(12.0, 16.0), + } + } + pub fn get(&self, app: &AppHandle) -> Option { let label = self.label(); app.get_webview_window(&label) } #[cfg(target_os = "macos")] - pub fn traffic_lights_position(&self) -> Option>> { + pub const fn undecorated(&self) -> bool { + matches!( + self, + Self::Camera + | Self::WindowCaptureOccluder { .. } + | Self::CaptureArea + | Self::RecordingsOverlay + | Self::TargetSelectOverlay { .. } + ) + } + + #[cfg(target_os = "macos")] + pub const fn disables_window_buttons(&self) -> bool { + matches!(self, Self::RecordingControls) + } + + #[cfg(target_os = "macos")] + pub const fn disables_fullscreen(&self) -> bool { + matches!(self, Self::Settings) + } + + #[cfg(target_os = "macos")] + pub const fn window_level(&self) -> Option { + use objc2_app_kit::{ + NSMainMenuWindowLevel, NSPopUpMenuWindowLevel, NSScreenSaverWindowLevel, + }; + match self { - Self::Editor { .. } | Self::ScreenshotEditor { .. } => { - Some(Some(LogicalPosition::new(20.0, 32.0))) + Self::RecordingControls => Some(NSMainMenuWindowLevel), + Self::TargetSelectOverlay { .. } | Self::CaptureArea => Some(45), + Self::RecordingsOverlay | Self::WindowCaptureOccluder { .. } => { + Some(NSScreenSaverWindowLevel) } - Self::RecordingControls => Some(Some(LogicalPosition::new(-100.0, -100.0))), - Self::Camera - | Self::WindowCaptureOccluder { .. } - | Self::CaptureArea - | Self::RecordingsOverlay - | Self::TargetSelectOverlay { .. } => None, - _ => Some(None), + _ => None, } } - - pub fn min_size(&self) -> Option<(f64, f64)> { + pub const fn min_size(&self) -> Option<(f64, f64)> { Some(match self { Self::Setup => (600.0, 600.0), Self::Main => (310.0, 320.0), @@ -195,7 +224,7 @@ impl CapWindowId { } #[derive(Debug, Clone, Type, Deserialize)] -pub enum ShowCapWindow { +pub enum CapWindow { Setup, Main { init_target_mode: Option, @@ -227,7 +256,7 @@ pub enum ShowCapWindow { }, } -impl ShowCapWindow { +impl CapWindow { pub async fn show(&self, app: &AppHandle) -> tauri::Result { if let Self::Editor { project_path } = &self { let state = app.state::(); @@ -244,7 +273,7 @@ impl ShowCapWindow { } }; - let window_label = CapWindowId::Editor { id: window_id }.label(); + let window_label = CapWindowDef::Editor { id: window_id }.label(); PendingEditorInstances::start_prewarm(app, window_label, project_path.clone()).await; } @@ -261,14 +290,14 @@ impl ShowCapWindow { } } - if let Some(window) = self.id(app).get(app) { + let def = self.def(app); + if let Some(window) = def.get(app) { window.show().ok(); window.unminimize().ok(); window.set_focus().ok(); return Ok(window); } - let _id = self.id(app); let monitor = app.primary_monitor()?.unwrap(); let window = match self { @@ -309,9 +338,6 @@ impl ShowCapWindow { .map(|s| s.enable_new_recording_flow) .unwrap_or_default(); - let title = CapWindowId::Main.title(); - let should_protect = should_protect_window(app, &title); - let window = self .window_builder(app, if new_recording_flow { "/new-main" } else { "/" }) .resizable(false) @@ -320,7 +346,6 @@ impl ShowCapWindow { .minimizable(false) .always_on_top(true) .visible_on_all_workspaces(true) - .content_protected(should_protect) .center() .initialization_script(format!( " @@ -332,13 +357,15 @@ impl ShowCapWindow { )) .build()?; - if new_recording_flow { - #[cfg(target_os = "macos")] - crate::platform::set_window_level(window.as_ref().window(), 50); - } - #[cfg(target_os = "macos")] { + if new_recording_flow { + let _ = window.run_on_main_thread({ + let window = window.clone(); + move || window.objc2_nswindow().setLevel(50) + }); + } + let app_handle = app.clone(); tauri::async_runtime::spawn(async move { let prewarmer = @@ -361,13 +388,7 @@ impl ShowCapWindow { .map(|d| d.id()) == Some(display.id()); - let title = CapWindowId::TargetSelectOverlay { - display_id: display_id.clone(), - } - .title(); - let should_protect = should_protect_window(app, &title); - - let mut window_builder = self + let mut builder = self .window_builder( app, format!("/target-select-overlay?displayId={display_id}&isHoveredDisplay={is_hovered_display}"), @@ -376,29 +397,27 @@ impl ShowCapWindow { .resizable(false) .fullscreen(false) .shadow(false) - .content_protected(should_protect) .always_on_top(true) .visible_on_all_workspaces(true) .skip_taskbar(true) - .transparent(true) - .visible(false); + .transparent(true); #[cfg(target_os = "macos")] { let position = display.raw_handle().logical_position(); let size = display.logical_size().unwrap(); - window_builder = window_builder + builder = builder .inner_size(size.width(), size.height()) .position(position.x(), position.y()); } #[cfg(windows)] { - window_builder = window_builder.inner_size(100.0, 100.0).position(0.0, 0.0); + builder = builder.inner_size(100.0, 100.0).position(0.0, 0.0); } - let window = window_builder.build()?; + let window = builder.build()?; #[cfg(windows)] { @@ -426,21 +445,16 @@ impl ShowCapWindow { app.state::() .spawn(display_id, window.clone()); - #[cfg(target_os = "macos")] - { - crate::platform::set_window_level(window.as_ref().window(), 45); - } - window } Self::Settings { page } => { for (label, window) in app.webview_windows() { - if let Ok(id) = CapWindowId::from_str(&label) + if let Ok(id) = CapWindowDef::from_str(&label) && matches!( id, - CapWindowId::TargetSelectOverlay { .. } - | CapWindowId::Main - | CapWindowId::Camera + CapWindowDef::TargetSelectOverlay { .. } + | CapWindowDef::Main + | CapWindowDef::Camera ) { let _ = window.hide(); @@ -473,10 +487,10 @@ impl ShowCapWindow { window } Self::Editor { .. } => { - if let Some(main) = CapWindowId::Main.get(app) { + if let Some(main) = CapWindowDef::Main.get(app) { let _ = main.close(); }; - if let Some(camera) = CapWindowId::Camera.get(app) { + if let Some(camera) = CapWindowDef::Camera.get(app) { let _ = camera.close(); }; @@ -502,10 +516,10 @@ impl ShowCapWindow { window } Self::ScreenshotEditor { path: _ } => { - if let Some(main) = CapWindowId::Main.get(app) { + if let Some(main) = CapWindowDef::Main.get(app) { let _ = main.close(); }; - if let Some(camera) = CapWindowId::Camera.get(app) { + if let Some(camera) = CapWindowDef::Camera.get(app) { let _ = camera.close(); }; @@ -534,7 +548,7 @@ impl ShowCapWindow { window } Self::Upgrade => { - if let Some(main) = CapWindowId::Main.get(app) { + if let Some(main) = CapWindowDef::Main.get(app) { let _ = main.hide(); } @@ -564,7 +578,8 @@ impl ShowCapWindow { window } Self::ModeSelect => { - if let Some(main) = CapWindowId::Main.get(app) { + // Hide main window when mode select window opens + if let Some(main) = CapWindowDef::Main.get(app) { let _ = main.hide(); } @@ -607,7 +622,7 @@ impl ShowCapWindow { if enable_native_camera_preview && state.camera_preview.is_initialized() { error!("Unable to initialize camera preview as one already exists!"); - if let Some(window) = CapWindowId::Camera.get(app) { + if let Some(window) = CapWindowDef::Camera.get(app) { window.show().ok(); } return Err(anyhow!( @@ -616,7 +631,7 @@ impl ShowCapWindow { .into()); } - let mut window_builder = self + let mut builder = self .window_builder(app, "/camera") .maximized(false) .resizable(false) @@ -641,7 +656,7 @@ impl ShowCapWindow { .transparent(true) .visible(false); // We set this true in `CameraWindowState::init_window` - let window = window_builder.build()?; + let window = builder.build()?; if enable_native_camera_preview { if let Some(id) = state.selected_camera_id.clone() @@ -672,22 +687,13 @@ impl ShowCapWindow { } #[cfg(target_os = "macos")] - { - crate::platform::set_window_level(window.as_ref().window(), 60); - - _ = window.run_on_main_thread({ - let window = window.as_ref().window(); - move || unsafe { - let Ok(win) = window.ns_window() else { - return; - }; - let win = win as *const objc2_app_kit::NSWindow; - (*win).setCollectionBehavior( - (*win).collectionBehavior() | objc2_app_kit::NSWindowCollectionBehavior::FullScreenAuxiliary, - ); - } - }); - } + dispatch2::run_on_main(|_| { + let nswindow = window.objc2_nswindow(); + nswindow.setCollectionBehavior( + nswindow.collectionBehavior() + | objc2_app_kit::NSWindowCollectionBehavior::FullScreenAuxiliary, + ); + }); window } @@ -697,12 +703,6 @@ impl ShowCapWindow { return Err(tauri::Error::WindowNotFound); }; - let title = CapWindowId::WindowCaptureOccluder { - screen_id: screen_id.clone(), - } - .title(); - let should_protect = should_protect_window(app, &title); - #[cfg(target_os = "macos")] let position = display.raw_handle().logical_position(); @@ -711,7 +711,7 @@ impl ShowCapWindow { let bounds = display.physical_size().unwrap(); - let mut window_builder = self + let mut builder = self .window_builder(app, "/window-capture-occluder") .maximized(false) .resizable(false) @@ -719,35 +719,22 @@ impl ShowCapWindow { .shadow(false) .always_on_top(true) .visible_on_all_workspaces(true) - .content_protected(should_protect) .skip_taskbar(true) .inner_size(bounds.width(), bounds.height()) .position(position.x(), position.y()) .transparent(true); - let window = window_builder.build()?; - + let window = builder.build()?; window.set_ignore_cursor_events(true).unwrap(); - - #[cfg(target_os = "macos")] - { - crate::platform::set_window_level(window.as_ref().window(), 900); - } - window } Self::CaptureArea { screen_id } => { - let title = CapWindowId::CaptureArea.title(); - let should_protect = should_protect_window(app, &title); - - let mut window_builder = self + let mut builder = self .window_builder(app, "/capture-area") .maximized(false) .fullscreen(false) .shadow(false) - .resizable(false) .always_on_top(true) - .content_protected(should_protect) .skip_taskbar(true) .closable(true) .decorations(false) @@ -759,28 +746,20 @@ impl ShowCapWindow { #[cfg(target_os = "macos")] if let Some(bounds) = display.raw_handle().logical_bounds() { - window_builder = window_builder + builder = builder .inner_size(bounds.size().width(), bounds.size().height()) .position(bounds.position().x(), bounds.position().y()); } #[cfg(windows)] if let Some(bounds) = display.raw_handle().physical_bounds() { - window_builder = window_builder + builder = builder .inner_size(bounds.size().width(), bounds.size().height()) .position(bounds.position().x(), bounds.position().y()); } - let window = window_builder.build()?; - - #[cfg(target_os = "macos")] - crate::platform::set_window_level( - window.as_ref().window(), - objc2_app_kit::NSPopUpMenuWindowLevel, - ); - // Hide the main window if the target monitor is the same - if let Some(main_window) = CapWindowId::Main.get(app) + if let Some(main_window) = CapWindowDef::Main.get(app) && let (Ok(outer_pos), Ok(outer_size)) = (main_window.outer_position(), main_window.outer_size()) && let Ok(scale_factor) = main_window.scale_factor() @@ -789,14 +768,14 @@ impl ShowCapWindow { let _ = main_window.minimize(); }; - window + builder.build()? } Self::InProgressRecording { countdown } => { let width = 320.0; let height = 150.0; - let title = CapWindowId::RecordingControls.title(); - let should_protect = should_protect_window(app, &title); + let title = CapWindowDef::RecordingControls.title(); + let should_protect = should_protect_window(app, title); let pos_x = ((monitor.size().width as f64) / monitor.scale_factor() - width) / 2.0; let pos_y = @@ -843,54 +822,22 @@ impl ShowCapWindow { .visible_on_all_workspaces(true) .content_protected(should_protect) .inner_size(width, height) - .position(pos_x, pos_y) - .skip_taskbar(false) + .position( + ((monitor.size().width as f64) / monitor.scale_factor() - width) / 2.0, + (monitor.size().height as f64) / monitor.scale_factor() - height - 120.0, + ) + .skip_taskbar(true) .initialization_script(format!( "window.COUNTDOWN = {};", countdown.unwrap_or_default() )) .build()?; - debug!( - "InProgressRecording window created: label={}, inner_size={:?}, outer_position={:?}", - window.label(), - window.inner_size(), - window.outer_position() - ); - - #[cfg(target_os = "macos")] - { - crate::platform::set_window_level(window.as_ref().window(), 1000); - } - - #[cfg(target_os = "macos")] - { - let show_result = window.show(); - debug!( - "InProgressRecording window.show() result: {:?}", - show_result - ); - fake_window::spawn_fake_window_listener(app.clone(), window.clone()); - } - - #[cfg(windows)] - { - tokio::time::sleep(std::time::Duration::from_millis(100)).await; - let show_result = window.show(); - debug!( - "InProgressRecording window.show() result: {:?}", - show_result - ); - window.set_focus().ok(); - fake_window::spawn_fake_window_listener(app.clone(), window.clone()); - } + fake_window::spawn_fake_window_listener(app.clone(), window.clone()); window } Self::RecordingsOverlay => { - let title = CapWindowId::RecordingsOverlay.title(); - let should_protect = should_protect_window(app, &title); - let window = self .window_builder(app, "/recordings-overlay") .maximized(false) @@ -900,7 +847,6 @@ impl ShowCapWindow { .always_on_top(true) .visible_on_all_workspaces(true) .accept_first_mouse(true) - .content_protected(should_protect) .inner_size( (monitor.size().width as f64) / monitor.scale_factor(), (monitor.size().height as f64) / monitor.scale_factor(), @@ -920,7 +866,7 @@ impl ShowCapWindow { let panel = window.to_panel().unwrap(); - panel.set_level(cocoa::appkit::NSMainMenuWindowLevel); + panel.set_level(objc2_app_kit::NSMainMenuWindowLevel as i32); panel.set_collection_behaviour( NSWindowCollectionBehavior::NSWindowCollectionBehaviorTransient @@ -944,13 +890,28 @@ impl ShowCapWindow { } }; - // removing this for now as it causes windows to just stay hidden sometimes -_- - // window.hide().ok(); - #[cfg(target_os = "macos")] - if let Some(position) = _id.traffic_lights_position() { - add_traffic_lights(&window, position); - } + let _ = window.run_on_main_thread({ + let window = window.clone(); + move || { + if def.disables_window_buttons() { + window.set_traffic_lights_visible(false); + } + + let nswindow = window.objc2_nswindow(); + + if def.disables_fullscreen() { + nswindow.setCollectionBehavior( + nswindow.collectionBehavior() + | objc2_app_kit::NSWindowCollectionBehavior::FullScreenNone, + ); + } + + if let Some(level) = def.window_level() { + nswindow.setLevel(level) + } + } + }); Ok(window) } @@ -960,29 +921,30 @@ impl ShowCapWindow { app: &'a AppHandle, url: impl Into, ) -> WebviewWindowBuilder<'a, Wry, AppHandle> { - let id = self.id(app); + let def = self.def(app); + let should_protect = should_protect_window(app, def.title()); - let mut builder = WebviewWindow::builder(app, id.label(), WebviewUrl::App(url.into())) - .title(id.title()) + let mut builder = WebviewWindow::builder(app, def.label(), WebviewUrl::App(url.into())) + .title(def.title()) .visible(false) .accept_first_mouse(true) - .shadow(true); + .shadow(true) + .content_protected(should_protect); - if let Some(min) = id.min_size() { + if let Some(min) = def.min_size() { builder = builder .inner_size(min.0, min.1) .min_inner_size(min.0, min.1); } #[cfg(target_os = "macos")] - { - if id.traffic_lights_position().is_some() { - builder = builder - .hidden_title(true) - .title_bar_style(tauri::TitleBarStyle::Overlay); - } else { - builder = builder.decorations(false) - } + if def.undecorated() { + builder = builder.decorations(false); + } else { + builder = builder + .hidden_title(true) + .title_bar_style(tauri::TitleBarStyle::Overlay) + .traffic_light_position(def.pre_solarium_traffic_lights_position()); } #[cfg(windows)] @@ -993,64 +955,39 @@ impl ShowCapWindow { builder } - pub fn id(&self, app: &AppHandle) -> CapWindowId { + pub fn def(&self, app: &AppHandle) -> CapWindowDef { match self { - ShowCapWindow::Setup => CapWindowId::Setup, - ShowCapWindow::Main { .. } => CapWindowId::Main, - ShowCapWindow::Settings { .. } => CapWindowId::Settings, - ShowCapWindow::Editor { project_path } => { + CapWindow::Setup => CapWindowDef::Setup, + CapWindow::Main { .. } => CapWindowDef::Main, + CapWindow::Settings { .. } => CapWindowDef::Settings, + CapWindow::Editor { project_path } => { let state = app.state::(); let s = state.ids.lock().unwrap(); let id = s.iter().find(|(path, _)| path == project_path).unwrap().1; - CapWindowId::Editor { id } + CapWindowDef::Editor { id } } - ShowCapWindow::RecordingsOverlay => CapWindowId::RecordingsOverlay, - ShowCapWindow::TargetSelectOverlay { display_id } => CapWindowId::TargetSelectOverlay { + CapWindow::RecordingsOverlay => CapWindowDef::RecordingsOverlay, + CapWindow::TargetSelectOverlay { display_id } => CapWindowDef::TargetSelectOverlay { display_id: display_id.clone(), }, - ShowCapWindow::WindowCaptureOccluder { screen_id } => { - CapWindowId::WindowCaptureOccluder { - screen_id: screen_id.clone(), - } - } - ShowCapWindow::CaptureArea { .. } => CapWindowId::CaptureArea, - ShowCapWindow::Camera => CapWindowId::Camera, - ShowCapWindow::InProgressRecording { .. } => CapWindowId::RecordingControls, - ShowCapWindow::Upgrade => CapWindowId::Upgrade, - ShowCapWindow::ModeSelect => CapWindowId::ModeSelect, - ShowCapWindow::ScreenshotEditor { path } => { + CapWindow::WindowCaptureOccluder { screen_id } => CapWindowDef::WindowCaptureOccluder { + screen_id: screen_id.clone(), + }, + CapWindow::CaptureArea { .. } => CapWindowDef::CaptureArea, + CapWindow::Camera => CapWindowDef::Camera, + CapWindow::InProgressRecording { .. } => CapWindowDef::RecordingControls, + CapWindow::Upgrade => CapWindowDef::Upgrade, + CapWindow::ModeSelect => CapWindowDef::ModeSelect, + CapWindow::ScreenshotEditor { path } => { let state = app.state::(); let s = state.ids.lock().unwrap(); let id = s.iter().find(|(p, _)| p == path).unwrap().1; - CapWindowId::ScreenshotEditor { id } + CapWindowDef::ScreenshotEditor { id } } } } } -#[cfg(target_os = "macos")] -fn add_traffic_lights(window: &WebviewWindow, controls_inset: Option>) { - use crate::platform::delegates; - - let target_window = window.clone(); - window - .run_on_main_thread(move || { - delegates::setup( - target_window.as_ref().window(), - controls_inset.unwrap_or(DEFAULT_TRAFFIC_LIGHTS_INSET), - ); - - let c_win = target_window.clone(); - target_window.on_window_event(move |event| match event { - tauri::WindowEvent::ThemeChanged(..) | tauri::WindowEvent::Focused(..) => { - position_traffic_lights_impl(&c_win.as_ref().window(), controls_inset); - } - _ => {} - }); - }) - .ok(); -} - #[tauri::command] #[specta::specta] #[instrument(skip(window))] @@ -1060,49 +997,6 @@ pub fn set_theme(window: tauri::Window, theme: AppTheme) { AppTheme::Light => Some(tauri::Theme::Light), AppTheme::Dark => Some(tauri::Theme::Dark), }); - - #[cfg(target_os = "macos")] - match CapWindowId::from_str(window.label()) { - Ok(win) if win.traffic_lights_position().is_some() => position_traffic_lights(window, None), - Ok(_) | Err(_) => {} - } -} - -#[tauri::command] -#[specta::specta] -#[instrument(skip(_window))] -pub fn position_traffic_lights(_window: tauri::Window, _controls_inset: Option<(f64, f64)>) { - #[cfg(target_os = "macos")] - position_traffic_lights_impl( - &_window, - _controls_inset.map(LogicalPosition::from).or_else(|| { - // Attempt to get the default inset from the window's traffic lights position - CapWindowId::from_str(_window.label()) - .ok() - .and_then(|id| id.traffic_lights_position().flatten()) - }), - ); -} - -#[cfg(target_os = "macos")] -fn position_traffic_lights_impl( - window: &tauri::Window, - controls_inset: Option>, -) { - use crate::platform::delegates::{UnsafeWindowHandle, position_window_controls}; - let c_win = window.clone(); - window - .run_on_main_thread(move || { - let ns_window = match c_win.ns_window() { - Ok(handle) => handle, - Err(_) => return, - }; - position_window_controls( - UnsafeWindowHandle(ns_window), - &controls_inset.unwrap_or(DEFAULT_TRAFFIC_LIGHTS_INSET), - ); - }) - .ok(); } fn should_protect_window(app: &AppHandle, window_title: &str) -> bool { @@ -1123,10 +1017,10 @@ fn should_protect_window(app: &AppHandle, window_title: &str) -> bool { #[instrument(skip(app))] pub fn refresh_window_content_protection(app: AppHandle) -> Result<(), String> { for (label, window) in app.webview_windows() { - if let Ok(id) = CapWindowId::from_str(&label) { + if let Ok(id) = CapWindowDef::from_str(&label) { let title = id.title(); window - .set_content_protected(should_protect_window(&app, &title)) + .set_content_protected(should_protect_window(&app, title)) .map_err(|e| e.to_string())?; } } @@ -1203,7 +1097,6 @@ impl MonitorExt for Display { #[specta::specta] #[tauri::command(async)] -#[instrument(skip(_window))] pub fn set_window_transparent(_window: tauri::Window, _value: bool) { #[cfg(target_os = "macos")] { diff --git a/apps/desktop/src-tauri/tauri.conf.json b/apps/desktop/src-tauri/tauri.conf.json index 5f2a676ebd..76d6e5a4a8 100644 --- a/apps/desktop/src-tauri/tauri.conf.json +++ b/apps/desktop/src-tauri/tauri.conf.json @@ -84,7 +84,13 @@ "ext": ["cap"], "name": "Cap Project", "mimeType": "application/x-cap-project", - "role": "Editor" + "role": "Editor", + "rank": "Owner", + "description": "Cap Project", + "exportedType": { + "identifier": "so.cap.desktop.project", + "conformsTo": ["com.apple.package"] + } } ] } diff --git a/apps/desktop/src/routes/screenshot-editor/Editor.tsx b/apps/desktop/src/routes/screenshot-editor/Editor.tsx index bd2f44b436..b87dd8269d 100644 --- a/apps/desktop/src/routes/screenshot-editor/Editor.tsx +++ b/apps/desktop/src/routes/screenshot-editor/Editor.tsx @@ -369,7 +369,7 @@ function Dialogs() {
{ const srcW = originalSize.x; @@ -405,7 +405,7 @@ function Dialogs() { }} initialCrop={initialBounds} snapToRatioEnabled={snapToRatio()} - showBounds={true} + showBounds={false} allowLightMode={true} onContextMenu={(e) => showCropOptionsMenu(e, true)} > diff --git a/apps/desktop/src/utils/tauri.ts b/apps/desktop/src/utils/tauri.ts index 77c8a8a94e..d8a107af2a 100644 --- a/apps/desktop/src/utils/tauri.ts +++ b/apps/desktop/src/utils/tauri.ts @@ -185,16 +185,13 @@ async isCameraWindowOpen() : Promise { async seekTo(frameNumber: number) : Promise { return await TAURI_INVOKE("seek_to", { frameNumber }); }, -async positionTrafficLights(controlsInset: [number, number] | null) : Promise { - await TAURI_INVOKE("position_traffic_lights", { controlsInset }); -}, async setTheme(theme: AppTheme) : Promise { await TAURI_INVOKE("set_theme", { theme }); }, async globalMessageDialog(message: string) : Promise { await TAURI_INVOKE("global_message_dialog", { message }); }, -async showWindow(window: ShowCapWindow) : Promise { +async showWindow(window: CapWindow) : Promise { return await TAURI_INVOKE("show_window", { window }); }, async writeClipboardString(text: string) : Promise { @@ -379,6 +376,7 @@ export type CameraPreviewState = { size: number; shape: CameraPreviewShape; mirr export type CameraShape = "square" | "source" export type CameraXPosition = "left" | "center" | "right" export type CameraYPosition = "top" | "bottom" +export type CapWindow = "Setup" | { Main: { init_target_mode: RecordingTargetMode | null } } | { Settings: { page: string | null } } | { Editor: { project_path: string } } | "RecordingsOverlay" | { WindowCaptureOccluder: { screen_id: DisplayId } } | { TargetSelectOverlay: { display_id: DisplayId } } | { CaptureArea: { screen_id: DisplayId } } | "Camera" | { InProgressRecording: { countdown: number | null } } | "Upgrade" | "ModeSelect" | { ScreenshotEditor: { path: string } } export type CaptionData = { segments: CaptionSegment[]; settings: CaptionSettings | null } export type CaptionSegment = { id: string; start: number; end: number; text: string; words?: CaptionWord[] } export type CaptionSettings = { enabled: boolean; font: string; size: number; color: string; backgroundColor: string; backgroundOpacity: number; position?: string; italic: boolean; fontWeight?: number; outline: boolean; outlineColor: string; exportWithSubtitles: boolean; highlightColor?: string; fadeDuration?: number; lingerDuration?: number; wordTransitionDuration?: number } @@ -492,7 +490,6 @@ export type SerializedScreenshotEditorInstance = { framesSocketUrl: string; path export type SetCaptureAreaPending = boolean export type ShadowConfiguration = { size: number; opacity: number; blur: number } export type SharingMeta = { id: string; link: string } -export type ShowCapWindow = "Setup" | { Main: { init_target_mode: RecordingTargetMode | null } } | { Settings: { page: string | null } } | { Editor: { project_path: string } } | "RecordingsOverlay" | { WindowCaptureOccluder: { screen_id: DisplayId } } | { TargetSelectOverlay: { display_id: DisplayId } } | { CaptureArea: { screen_id: DisplayId } } | "Camera" | { InProgressRecording: { countdown: number | null } } | "Upgrade" | "ModeSelect" | { ScreenshotEditor: { path: string } } export type SingleSegment = { display: VideoMeta; camera?: VideoMeta | null; audio?: AudioMeta | null; cursor?: string | null } export type StartRecordingInputs = { capture_target: ScreenCaptureTarget; capture_system_audio?: boolean; mode: RecordingMode; organization_id?: string | null } export type StereoMode = "stereo" | "monoL" | "monoR" diff --git a/crates/cursor-info/Cargo.toml b/crates/cursor-info/Cargo.toml index e86871e9ec..6ee59a5863 100644 --- a/crates/cursor-info/Cargo.toml +++ b/crates/cursor-info/Cargo.toml @@ -12,8 +12,8 @@ workspace-hack = { version = "0.1", path = "../workspace-hack" } [target.'cfg(target_os= "windows")'.dependencies] windows = { workspace = true, features = [ - "Win32_Graphics_Gdi", - "Win32_UI_WindowsAndMessaging", + "Win32_Graphics_Gdi", + "Win32_UI_WindowsAndMessaging", ] } [dev-dependencies] @@ -21,7 +21,7 @@ hex = "0.4" sha2 = "0.10" [target.'cfg(target_os = "macos")'.dev-dependencies] -objc2 = "0.6" +objc2 = { workspace = true } objc2-app-kit = { version = "0.3.0", features = ["NSCursor", "NSApplication"] } diff --git a/crates/scap-screencapturekit/Cargo.toml b/crates/scap-screencapturekit/Cargo.toml index 8d71749275..4754e42083 100644 --- a/crates/scap-screencapturekit/Cargo.toml +++ b/crates/scap-screencapturekit/Cargo.toml @@ -11,7 +11,7 @@ workspace-hack = { version = "0.1", path = "../workspace-hack" } [target.'cfg(target_os = "macos")'.dependencies] cidre = { workspace = true } -objc2 = "0.6.1" +objc2 = { workspace = true } objc2-app-kit = "0.3.1" objc2-foundation = "0.3.1" diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index acf6280246..cec31d7c83 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -118,13 +118,13 @@ importers: version: 0.14.10(solid-js@1.9.6) '@solidjs/start': specifier: ^1.1.3 - version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.54)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) + version: 1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1) '@tanstack/solid-query': specifier: ^5.51.21 version: 5.75.4(solid-js@1.9.6) '@tauri-apps/api': - specifier: 2.5.0 - version: 2.5.0 + specifier: 2.9.1 + version: 2.9.1 '@tauri-apps/plugin-clipboard-manager': specifier: ^2.3.0 version: 2.3.0 @@ -153,8 +153,8 @@ importers: specifier: 2.3.0 version: 2.3.0 '@tauri-apps/plugin-shell': - specifier: ^2.3.0 - version: 2.3.0 + specifier: ^2.3.1 + version: 2.3.3 '@tauri-apps/plugin-store': specifier: ^2.4.0 version: 2.4.0 @@ -208,7 +208,7 @@ importers: version: 9.0.1 vinxi: specifier: ^0.5.6 - version: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.54)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + version: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) webcodecs: specifier: ^0.1.0 version: 0.1.0 @@ -223,8 +223,8 @@ importers: specifier: ^2.2.239 version: 2.2.336 '@tauri-apps/cli': - specifier: '>=2.1.0' - version: 2.5.0 + specifier: ^2.9.5 + version: 2.9.6 '@total-typescript/ts-reset': specifier: ^0.6.1 version: 0.6.1 @@ -649,7 +649,7 @@ importers: version: 15.5.7(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-auth: specifier: ^4.24.5 - version: 4.24.11(next@15.5.7(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 4.24.11(next@15.5.7(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-contentlayer2: specifier: ^0.5.3 version: 0.5.8(acorn@8.15.0)(contentlayer2@0.5.8(acorn@8.15.0)(esbuild@0.25.5))(esbuild@0.25.5)(next@15.5.7(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -971,7 +971,7 @@ importers: version: 15.5.7(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) next-auth: specifier: ^4.24.5 - version: 4.24.11(next@15.5.7(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) + version: 4.24.11(next@15.5.7(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) react-email: specifier: ^4.0.16 version: 4.0.16(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) @@ -3589,10 +3589,6 @@ packages: '@jridgewell/gen-mapping@0.3.13': resolution: {integrity: sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==} - '@jridgewell/gen-mapping@0.3.8': - resolution: {integrity: sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==} - engines: {node: '>=6.0.0'} - '@jridgewell/remapping@2.3.5': resolution: {integrity: sha512-LI9u/+laYG4Ds1TDKSJW2YPrIlcVYOwi2fUC6xB43lueCjgxV4lffOCZCtYFiH6TNOX+tQKXx97T4IKHbhyHEQ==} @@ -3600,10 +3596,6 @@ packages: resolution: {integrity: sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==} engines: {node: '>=6.0.0'} - '@jridgewell/set-array@1.2.1': - resolution: {integrity: sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==} - engines: {node: '>=6.0.0'} - '@jridgewell/source-map@0.3.11': resolution: {integrity: sha512-ZMp1V8ZFcPG5dIWnQLr3NSI1MiCU7UETdS/A0G8V/XWHvJv3ZsFqutJn1Y5RPmAPX6F3BiE397OqveU/9NCuIA==} @@ -3616,12 +3608,6 @@ packages: '@jridgewell/sourcemap-codec@1.5.5': resolution: {integrity: sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==} - '@jridgewell/trace-mapping@0.3.25': - resolution: {integrity: sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==} - - '@jridgewell/trace-mapping@0.3.30': - resolution: {integrity: sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==} - '@jridgewell/trace-mapping@0.3.31': resolution: {integrity: sha512-zzNR+SdQSDJzc8joaeP8QQoCQr8NuYx2dIIytl1QeBEZHJ9uW6hebsrYgbz8hJwUQao3TWCMtmfV8Nu1twOLAw==} @@ -4328,8 +4314,8 @@ packages: resolution: {integrity: sha512-JD6DerIKdJGmRp4jQyX5FlrQjA4tjOw1cvfsPAZXfOOEErMUHjPcPSICS+6WnM0nB0efSFARh0KAZss+bvExOA==} engines: {node: '>=14'} - '@oxc-project/types@0.102.0': - resolution: {integrity: sha512-8Skrw405g+/UJPKWJ1twIk3BIH2nXdiVlVNtYT23AXVwpsd79es4K+KYt06Fbnkc5BaTvk/COT2JuCLYdwnCdA==} + '@oxc-project/types@0.103.0': + resolution: {integrity: sha512-bkiYX5kaXWwUessFRSoXFkGIQTmc6dLGdxuRTrC+h8PSnIdZyuXHHlLAeTmOue5Br/a0/a7dHH0Gca6eXn9MKg==} '@oxc-project/types@0.94.0': resolution: {integrity: sha512-+UgQT/4o59cZfH6Cp7G0hwmqEQ0wE+AdIwhikdwnhWI9Dp8CgSY081+Q3O67/wq3VJu8mgUEB93J9EHHn70fOw==} @@ -5273,8 +5259,8 @@ packages: cpu: [arm64] os: [android] - '@rolldown/binding-android-arm64@1.0.0-beta.54': - resolution: {integrity: sha512-zZRx/ur3Fai3fxiEmVp48+6GCBR48PRWJR1X3TTMn9yiq2bBHlYPgBaQtDOYWXv5H3J5dXujeTyGnuoY+kdGCg==} + '@rolldown/binding-android-arm64@1.0.0-beta.55': + resolution: {integrity: sha512-5cPpHdO+zp+klznZnIHRO1bMHDq5hS9cqXodEKAaa/dQTPDjnE91OwAsy3o1gT2x4QaY8NzdBXAvutYdaw0WeA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [android] @@ -5285,8 +5271,8 @@ packages: cpu: [arm64] os: [darwin] - '@rolldown/binding-darwin-arm64@1.0.0-beta.54': - resolution: {integrity: sha512-zMyFEJmbIs91x22HAA/eUvmZHgjX8tGsD3TJ+WC9aY4bCdl3w84H9vMZmChSHAF1dYvGNH4KQDI2IubeZaCYtg==} + '@rolldown/binding-darwin-arm64@1.0.0-beta.55': + resolution: {integrity: sha512-l0887CGU2SXZr0UJmeEcXSvtDCOhDTTYXuoWbhrEJ58YQhQk24EVhDhHMTyjJb1PBRniUgNc1G0T51eF8z+TWw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [darwin] @@ -5297,8 +5283,8 @@ packages: cpu: [x64] os: [darwin] - '@rolldown/binding-darwin-x64@1.0.0-beta.54': - resolution: {integrity: sha512-Ex7QttdaVnEpmE/zroUT5Qm10e2+Vjd9q0LX9eXm59SitxDODMpC8GI1Rct5RrLf4GLU4DzdXBj6DGzuR+6g6w==} + '@rolldown/binding-darwin-x64@1.0.0-beta.55': + resolution: {integrity: sha512-d7qP2AVYzN0tYIP4vJ7nmr26xvmlwdkLD/jWIc9Z9dqh5y0UGPigO3m5eHoHq9BNazmwdD9WzDHbQZyXFZjgtA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [darwin] @@ -5309,8 +5295,8 @@ packages: cpu: [x64] os: [freebsd] - '@rolldown/binding-freebsd-x64@1.0.0-beta.54': - resolution: {integrity: sha512-E1XO10ryM/Vxw3Q1wvs9s2mSpVBfbHtzkbJcdu26qh17ZmVwNWLiIoqEcbkXm028YwkReG4Gd2gCZ3NxgTQ28Q==} + '@rolldown/binding-freebsd-x64@1.0.0-beta.55': + resolution: {integrity: sha512-j311E4NOB0VMmXHoDDZhrWidUf7L/Sa6bu/+i2cskvHKU40zcUNPSYeD2YiO2MX+hhDFa5bJwhliYfs+bTrSZw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [freebsd] @@ -5321,8 +5307,8 @@ packages: cpu: [arm] os: [linux] - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.54': - resolution: {integrity: sha512-oS73Uks8jczQR9pg0Bj718vap/x71exyJ5yuxu4X5V4MhwRQnky7ANSPm6ARUfraxOqt49IBfcMeGnw2rTSqdA==} + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.55': + resolution: {integrity: sha512-lAsaYWhfNTW2A/9O7zCpb5eIJBrFeNEatOS/DDOZ5V/95NHy50g4b/5ViCqchfyFqRb7MKUR18/+xWkIcDkeIw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm] os: [linux] @@ -5333,8 +5319,8 @@ packages: cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.54': - resolution: {integrity: sha512-pY8N2X5C+/ZQcy0eRdfOzOP//OFngP1TaIqDjFwfBPws2UNavKS8SpxhPEgUaYIaT0keVBd/TB+eVy9z+CIOtw==} + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.55': + resolution: {integrity: sha512-2x6ffiVLZrQv7Xii9+JdtyT1U3bQhKj59K3eRnYlrXsKyjkjfmiDUVx2n+zSyijisUqD62fcegmx2oLLfeTkCA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -5345,8 +5331,8 @@ packages: cpu: [arm64] os: [linux] - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.54': - resolution: {integrity: sha512-cgTooAFm2MUmFriB7IYaWBNyqrGlRPKG+yaK2rGFl2rcdOcO24urY4p3eyB0ogqsRLvJbIxwjjYiWiIP7Eo1Cw==} + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.55': + resolution: {integrity: sha512-QbNncvqAXziya5wleI+OJvmceEE15vE4yn4qfbI/hwT/+8ZcqxyfRZOOh62KjisXxp4D0h3JZspycXYejxAU3w==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [linux] @@ -5357,8 +5343,8 @@ packages: cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.54': - resolution: {integrity: sha512-nGyLT1Qau0W+kEL44V2jhHmvfS3wyJW08E4WEu2E6NuIy+uChKN1X0aoxzFIDi2owDsYaZYez/98/f268EupIQ==} + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.55': + resolution: {integrity: sha512-YZCTZZM+rujxwVc6A+QZaNMJXVtmabmFYLG2VGQTKaBfYGvBKUgtbMEttnp/oZ88BMi2DzadBVhOmfQV8SuHhw==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -5369,8 +5355,8 @@ packages: cpu: [x64] os: [linux] - '@rolldown/binding-linux-x64-musl@1.0.0-beta.54': - resolution: {integrity: sha512-KH374P0TUjDXssROT/orvzaWrzGOptD13PTrltgKwbDprJTMknoLiYsOD6Ttz92O2VuAcCtFuJ1xbyFM2Uo/Xg==} + '@rolldown/binding-linux-x64-musl@1.0.0-beta.55': + resolution: {integrity: sha512-28q9OQ/DDpFh2keS4BVAlc3N65/wiqKbk5K1pgLdu/uWbKa8hgUJofhXxqO+a+Ya2HVTUuYHneWsI2u+eu3N5Q==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [linux] @@ -5381,8 +5367,8 @@ packages: cpu: [arm64] os: [openharmony] - '@rolldown/binding-openharmony-arm64@1.0.0-beta.54': - resolution: {integrity: sha512-oMAVO4wbfAbhpBxPsSp8R7ntL2DchpNfO+tGhN8/sI9jsbYwOv78uIW1fTwOBslhjTVFltGJ+l23mubNQcYNaQ==} + '@rolldown/binding-openharmony-arm64@1.0.0-beta.55': + resolution: {integrity: sha512-LiCA4BjCnm49B+j1lFzUtlC+4ZphBv0d0g5VqrEJua/uyv9Ey1v9tiaMql1C8c0TVSNDUmrkfHQ71vuQC7YfpQ==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [openharmony] @@ -5392,8 +5378,8 @@ packages: engines: {node: '>=14.0.0'} cpu: [wasm32] - '@rolldown/binding-wasm32-wasi@1.0.0-beta.54': - resolution: {integrity: sha512-MYY/FmY+HehHiQkNx04W5oLy/Fqd1hXYqZmmorSDXvAHnxMbSgmdFicKsSYOg/sVGHBMEP1tTn6kV5sWrS45rA==} + '@rolldown/binding-wasm32-wasi@1.0.0-beta.55': + resolution: {integrity: sha512-nZ76tY7T0Oe8vamz5Cv5CBJvrqeQxwj1WaJ2GxX8Msqs0zsQMMcvoyxOf0glnJlxxgKjtoBxAOxaAU8ERbW6Tg==} engines: {node: '>=14.0.0'} cpu: [wasm32] @@ -5403,8 +5389,8 @@ packages: cpu: [arm64] os: [win32] - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.54': - resolution: {integrity: sha512-66o3uKxUmcYskT9exskxs3OVduXf5x0ndlMkYOjSpBgqzhLtkub136yDvZkNT1OkNDET0odSwcU7aWdpnwzAyg==} + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.55': + resolution: {integrity: sha512-TFVVfLfhL1G+pWspYAgPK/FSqjiBtRKYX9hixfs508QVEZPQlubYAepHPA7kEa6lZXYj5ntzF87KC6RNhxo+ew==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [arm64] os: [win32] @@ -5421,8 +5407,8 @@ packages: cpu: [x64] os: [win32] - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.54': - resolution: {integrity: sha512-FbbbrboChLBXfeEsOfaypBGqzbdJ/CcSA2BPLCggojnIHy58Jo+AXV7HATY8opZk7194rRbokIT8AfPJtZAWtg==} + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.55': + resolution: {integrity: sha512-j1WBlk0p+ISgLzMIgl0xHp1aBGXenoK2+qWYc/wil2Vse7kVOdFq9aeQ8ahK6/oxX2teQ5+eDvgjdywqTL+daA==} engines: {node: ^20.19.0 || >=22.12.0} cpu: [x64] os: [win32] @@ -5430,8 +5416,8 @@ packages: '@rolldown/pluginutils@1.0.0-beta.42': resolution: {integrity: sha512-N7pQzk9CyE7q0bBN/q0J8s6Db279r5kUZc6d7/wWRe9/zXqC52HQovVyu6iXPIDY4BEzzgbVLhVFXrOuGJ22ZQ==} - '@rolldown/pluginutils@1.0.0-beta.54': - resolution: {integrity: sha512-AHgcZ+w7RIRZ65ihSQL8YuoKcpD9Scew4sEeP1BBUT9QdTo6KjwHrZZXjID6nL10fhKessCH6OPany2QKwAwTQ==} + '@rolldown/pluginutils@1.0.0-beta.55': + resolution: {integrity: sha512-vajw/B3qoi7aYnnD4BQ4VoCcXQWnF0roSwE2iynbNxgW4l9mFwtLmLmUhpDdcTBfKyZm1p/T0D13qG94XBLohA==} '@rollup/plugin-alias@5.1.1': resolution: {integrity: sha512-PR9zDb+rOzkRb2VD+EuKB7UC41vU5DIwZ5qqCpk0KJudcWAyi8rvYOhS7+L5aZCspw1stTViLgN5v6FF1p5cgQ==} @@ -6320,10 +6306,10 @@ packages: react-dom: optional: true - '@storybook/builder-vite@10.2.0-alpha.6': - resolution: {integrity: sha512-DI96oVURX5u0I2x6fepMDSC1Q6/z3WanKHMOu1wfWawDyhS+/hR8Krnqu7i9mGBR4blQU8HPIKQD7XdPfIoXlw==} + '@storybook/builder-vite@10.2.0-alpha.7': + resolution: {integrity: sha512-RYio5bC82BrkNexBYVcs31UbNYudnGmGizHD837GIPhXobBeJXHDy4uvTetzZsQUUsry3+cBhQojXgcY56P/vA==} peerDependencies: - storybook: ^10.2.0-alpha.6 + storybook: ^10.2.0-alpha.7 vite: ^5.0.0 || ^6.0.0 || ^7.0.0 '@storybook/core@8.6.12': @@ -6334,12 +6320,12 @@ packages: prettier: optional: true - '@storybook/csf-plugin@10.2.0-alpha.6': - resolution: {integrity: sha512-7+n6c0wplOcLIQeRn0f6YkVs+o4rH7t0Fis8pymWKyU0k2DBHHPl+nYhyVK6Ii2UgnsgDj9ngKMpG3nvPDVxxA==} + '@storybook/csf-plugin@10.2.0-alpha.7': + resolution: {integrity: sha512-Me3QUxBDp6CxBUjTXY7gUHBlFD3wHpFa/vezFnCJGqX5lGkJSqW0cSlNFb4XAVbBlImsjBMMJb3tdWacWETe6w==} peerDependencies: esbuild: '*' rollup: '*' - storybook: ^10.2.0-alpha.6 + storybook: ^10.2.0-alpha.7 vite: '*' webpack: '*' peerDependenciesMeta: @@ -6631,14 +6617,8 @@ packages: resolution: {integrity: sha512-rqI++FWClU5I2UBp4HXFvl+sBWkdigBkxnpJDQUWttNyG7IZP4FwQGhTNL5EOw0vI8i6eSAJ5frLqO7n7jbJdg==} engines: {node: '>= 14.6.0', npm: '>= 6.6.0', yarn: '>= 1.19.1'} - '@tauri-apps/api@2.5.0': - resolution: {integrity: sha512-Ldux4ip+HGAcPUmuLT8EIkk6yafl5vK0P0c0byzAKzxJh7vxelVtdPONjfgTm96PbN24yjZNESY8CKo8qniluA==} - - '@tauri-apps/api@2.7.0': - resolution: {integrity: sha512-v7fVE8jqBl8xJFOcBafDzXFc8FnicoH3j8o8DNNs0tHuEBmXUDqrCOAzMRX0UkfpwqZLqvrvK0GNQ45DfnoVDg==} - - '@tauri-apps/api@2.8.0': - resolution: {integrity: sha512-ga7zdhbS2GXOMTIZRT0mYjKJtR9fivsXzsyq5U3vjDL0s6DTMwYRm0UHNjzTY5dh4+LSC68Sm/7WEiimbQNYlw==} + '@tauri-apps/api@2.9.1': + resolution: {integrity: sha512-IGlhP6EivjXHepbBic618GOmiWe4URJiIeZFlB7x3czM0yDHHYviH1Xvoiv4FefdkQtn6v7TuwWCRfOGdnVUGw==} '@tauri-apps/cli-darwin-arm64@1.6.3': resolution: {integrity: sha512-fQN6IYSL8bG4NvkdKE4sAGF4dF/QqqQq4hOAU+t8ksOzHJr0hUlJYfncFeJYutr/MMkdF7hYKadSb0j5EE9r0A==} @@ -6646,8 +6626,8 @@ packages: cpu: [arm64] os: [darwin] - '@tauri-apps/cli-darwin-arm64@2.5.0': - resolution: {integrity: sha512-VuVAeTFq86dfpoBDNYAdtQVLbP0+2EKCHIIhkaxjeoPARR0sLpFHz2zs0PcFU76e+KAaxtEtAJAXGNUc8E1PzQ==} + '@tauri-apps/cli-darwin-arm64@2.9.6': + resolution: {integrity: sha512-gf5no6N9FCk1qMrti4lfwP77JHP5haASZgVbBgpZG7BUepB3fhiLCXGUK8LvuOjP36HivXewjg72LTnPDScnQQ==} engines: {node: '>= 10'} cpu: [arm64] os: [darwin] @@ -6658,8 +6638,8 @@ packages: cpu: [x64] os: [darwin] - '@tauri-apps/cli-darwin-x64@2.5.0': - resolution: {integrity: sha512-hUF01sC06cZVa8+I0/VtsHOk9BbO75rd+YdtHJ48xTdcYaQ5QIwL4yZz9OR1AKBTaUYhBam8UX9Pvd5V2/4Dpw==} + '@tauri-apps/cli-darwin-x64@2.9.6': + resolution: {integrity: sha512-oWh74WmqbERwwrwcueJyY6HYhgCksUc6NT7WKeXyrlY/FPmNgdyQAgcLuTSkhRFuQ6zh4Np1HZpOqCTpeZBDcw==} engines: {node: '>= 10'} cpu: [x64] os: [darwin] @@ -6670,8 +6650,8 @@ packages: cpu: [arm] os: [linux] - '@tauri-apps/cli-linux-arm-gnueabihf@2.5.0': - resolution: {integrity: sha512-LQKqttsK252LlqYyX8R02MinUsfFcy3+NZiJwHFgi5Y3+ZUIAED9cSxJkyNtuY5KMnR4RlpgWyLv4P6akN1xhg==} + '@tauri-apps/cli-linux-arm-gnueabihf@2.9.6': + resolution: {integrity: sha512-/zde3bFroFsNXOHN204DC2qUxAcAanUjVXXSdEGmhwMUZeAQalNj5cz2Qli2elsRjKN/hVbZOJj0gQ5zaYUjSg==} engines: {node: '>= 10'} cpu: [arm] os: [linux] @@ -6682,8 +6662,8 @@ packages: cpu: [arm64] os: [linux] - '@tauri-apps/cli-linux-arm64-gnu@2.5.0': - resolution: {integrity: sha512-mTQufsPcpdHg5RW0zypazMo4L55EfeE5snTzrPqbLX4yCK2qalN7+rnP8O8GT06xhp6ElSP/Ku1M2MR297SByQ==} + '@tauri-apps/cli-linux-arm64-gnu@2.9.6': + resolution: {integrity: sha512-pvbljdhp9VOo4RnID5ywSxgBs7qiylTPlK56cTk7InR3kYSTJKYMqv/4Q/4rGo/mG8cVppesKIeBMH42fw6wjg==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] @@ -6694,14 +6674,14 @@ packages: cpu: [arm64] os: [linux] - '@tauri-apps/cli-linux-arm64-musl@2.5.0': - resolution: {integrity: sha512-rQO1HhRUQqyEaal5dUVOQruTRda/TD36s9kv1hTxZiFuSq3558lsTjAcUEnMAtBcBkps20sbyTJNMT0AwYIk8Q==} + '@tauri-apps/cli-linux-arm64-musl@2.9.6': + resolution: {integrity: sha512-02TKUndpodXBCR0oP//6dZWGYcc22Upf2eP27NvC6z0DIqvkBBFziQUcvi2n6SrwTRL0yGgQjkm9K5NIn8s6jw==} engines: {node: '>= 10'} cpu: [arm64] os: [linux] - '@tauri-apps/cli-linux-riscv64-gnu@2.5.0': - resolution: {integrity: sha512-7oS18FN46yDxyw1zX/AxhLAd7T3GrLj3Ai6s8hZKd9qFVzrAn36ESL7d3G05s8wEtsJf26qjXnVF4qleS3dYsA==} + '@tauri-apps/cli-linux-riscv64-gnu@2.9.6': + resolution: {integrity: sha512-fmp1hnulbqzl1GkXl4aTX9fV+ubHw2LqlLH1PE3BxZ11EQk+l/TmiEongjnxF0ie4kV8DQfDNJ1KGiIdWe1GvQ==} engines: {node: '>= 10'} cpu: [riscv64] os: [linux] @@ -6712,8 +6692,8 @@ packages: cpu: [x64] os: [linux] - '@tauri-apps/cli-linux-x64-gnu@2.5.0': - resolution: {integrity: sha512-SG5sFNL7VMmDBdIg3nO3EzNRT306HsiEQ0N90ILe3ZABYAVoPDO/ttpCO37ApLInTzrq/DLN+gOlC/mgZvLw1w==} + '@tauri-apps/cli-linux-x64-gnu@2.9.6': + resolution: {integrity: sha512-vY0le8ad2KaV1PJr+jCd8fUF9VOjwwQP/uBuTJvhvKTloEwxYA/kAjKK9OpIslGA9m/zcnSo74czI6bBrm2sYA==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -6724,8 +6704,8 @@ packages: cpu: [x64] os: [linux] - '@tauri-apps/cli-linux-x64-musl@2.5.0': - resolution: {integrity: sha512-QXDM8zp/6v05PNWju5ELsVwF0VH1n6b5pk2E6W/jFbbiwz80Vs1lACl9pv5kEHkrxBj+aWU/03JzGuIj2g3SkQ==} + '@tauri-apps/cli-linux-x64-musl@2.9.6': + resolution: {integrity: sha512-TOEuB8YCFZTWVDzsO2yW0+zGcoMiPPwcUgdnW1ODnmgfwccpnihDRoks+ABT1e3fHb1ol8QQWsHSCovb3o2ENQ==} engines: {node: '>= 10'} cpu: [x64] os: [linux] @@ -6736,8 +6716,8 @@ packages: cpu: [arm64] os: [win32] - '@tauri-apps/cli-win32-arm64-msvc@2.5.0': - resolution: {integrity: sha512-pFSHFK6b+o9y4Un8w0gGLwVyFTZaC3P0kQ7umRt/BLDkzD5RnQ4vBM7CF8BCU5nkwmEBUCZd7Wt3TWZxe41o6Q==} + '@tauri-apps/cli-win32-arm64-msvc@2.9.6': + resolution: {integrity: sha512-ujmDGMRc4qRLAnj8nNG26Rlz9klJ0I0jmZs2BPpmNNf0gM/rcVHhqbEkAaHPTBVIrtUdf7bGvQAD2pyIiUrBHQ==} engines: {node: '>= 10'} cpu: [arm64] os: [win32] @@ -6748,8 +6728,8 @@ packages: cpu: [ia32] os: [win32] - '@tauri-apps/cli-win32-ia32-msvc@2.5.0': - resolution: {integrity: sha512-EArv1IaRlogdLAQyGlKmEqZqm5RfHCUMhJoedWu7GtdbOMUfSAz6FMX2boE1PtEmNO4An+g188flLeVErrxEKg==} + '@tauri-apps/cli-win32-ia32-msvc@2.9.6': + resolution: {integrity: sha512-S4pT0yAJgFX8QRCyKA1iKjZ9Q/oPjCZf66A/VlG5Yw54Nnr88J1uBpmenINbXxzyhduWrIXBaUbEY1K80ZbpMg==} engines: {node: '>= 10'} cpu: [ia32] os: [win32] @@ -6760,8 +6740,8 @@ packages: cpu: [x64] os: [win32] - '@tauri-apps/cli-win32-x64-msvc@2.5.0': - resolution: {integrity: sha512-lj43EFYbnAta8pd9JnUq87o+xRUR0odz+4rixBtTUwUgdRdwQ2V9CzFtsMu6FQKpFQ6mujRK6P1IEwhL6ADRsQ==} + '@tauri-apps/cli-win32-x64-msvc@2.9.6': + resolution: {integrity: sha512-ldWuWSSkWbKOPjQMJoYVj9wLHcOniv7diyI5UAJ4XsBdtaFB0pKHQsqw/ItUma0VXGC7vB4E9fZjivmxur60aw==} engines: {node: '>= 10'} cpu: [x64] os: [win32] @@ -6771,8 +6751,8 @@ packages: engines: {node: '>= 10'} hasBin: true - '@tauri-apps/cli@2.5.0': - resolution: {integrity: sha512-rAtHqG0Gh/IWLjN2zTf3nZqYqbo81oMbqop56rGTjrlWk9pTTAjkqOjSL9XQLIMZ3RbeVjveCqqCA0s8RnLdMg==} + '@tauri-apps/cli@2.9.6': + resolution: {integrity: sha512-3xDdXL5omQ3sPfBfdC8fCtDKcnyV7OqyzQgfyT5P3+zY6lcPqIYKQBvUasNvppi21RSdfhy44ttvJmftb0PCDw==} engines: {node: '>= 10'} hasBin: true @@ -6803,8 +6783,8 @@ packages: '@tauri-apps/plugin-process@2.3.0': resolution: {integrity: sha512-0DNj6u+9csODiV4seSxxRbnLpeGYdojlcctCuLOCgpH9X3+ckVZIEj6H7tRQ7zqWr7kSTEWnrxtAdBb0FbtrmQ==} - '@tauri-apps/plugin-shell@2.3.0': - resolution: {integrity: sha512-6GIRxO2z64uxPX4CCTuhQzefvCC0ew7HjdBhMALiGw74vFBDY95VWueAHOHgNOMV4UOUAFupyidN9YulTe5xlA==} + '@tauri-apps/plugin-shell@2.3.3': + resolution: {integrity: sha512-Xod+pRcFxmOWFWEnqH5yZcA7qwAMuaaDkMR1Sply+F8VfBj++CGnj2xf5UoialmjZ2Cvd8qrvSCbU+7GgNVsKQ==} '@tauri-apps/plugin-store@2.4.0': resolution: {integrity: sha512-PjBnlnH6jyI71MGhrPaxUUCsOzc7WO1mbc4gRhME0m2oxLgCqbksw6JyeKQimuzv4ysdpNO3YbmaY2haf82a3A==} @@ -12443,8 +12423,8 @@ packages: engines: {node: ^20.19.0 || >=22.12.0} hasBin: true - rolldown@1.0.0-beta.54: - resolution: {integrity: sha512-3lIvjCWgjPL3gmiATUdV1NeVBGJZy6FdtwgLPol25tAkn46Q/MsVGfCSNswXwFOxGrxglPaN20IeALSIFuFyEg==} + rolldown@1.0.0-beta.55: + resolution: {integrity: sha512-r8Ws43aYCnfO07ao0SvQRz4TBAtZJjGWNvScRBOHuiNHvjfECOJBIqJv0nUkL1GYcltjvvHswRilDF1ocsC0+g==} engines: {node: ^20.19.0 || >=22.12.0} hasBin: true @@ -13681,10 +13661,6 @@ packages: resolution: {integrity: sha512-6NCPkv1ClwH+/BGE9QeoTIl09nuiAt0gS28nn1PvYXsGKRwM2TCbFA2QiilmehPDTXIe684k4rZI1yl3A1PCUw==} engines: {node: '>=18.12.0'} - unplugin@2.3.2: - resolution: {integrity: sha512-3n7YA46rROb3zSj8fFxtxC/PqoyvYQ0llwz9wtUPUutr9ig09C8gGo5CWCwHrUzlqC1LLR43kxp5vEIyH1ac1w==} - engines: {node: '>=18.12.0'} - unrs-resolver@1.7.2: resolution: {integrity: sha512-BBKpaylOW8KbHsu378Zky/dGh4ckT/4NW/0SHRABdqRLcQJ2dAOjDo9g97p04sWflm0kqPqpUatxReNV/dqI5A==} @@ -14424,8 +14400,8 @@ snapshots: '@ampproject/remapping@2.3.0': dependencies: - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 '@antfu/install-pkg@0.4.1': dependencies: @@ -15437,8 +15413,8 @@ snapshots: dependencies: '@babel/parser': 7.27.5 '@babel/types': 7.27.1 - '@jridgewell/gen-mapping': 0.3.8 - '@jridgewell/trace-mapping': 0.3.25 + '@jridgewell/gen-mapping': 0.3.13 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/generator@7.27.5': @@ -15446,7 +15422,7 @@ snapshots: '@babel/parser': 7.27.5 '@babel/types': 7.27.6 '@jridgewell/gen-mapping': 0.3.13 - '@jridgewell/trace-mapping': 0.3.30 + '@jridgewell/trace-mapping': 0.3.31 jsesc: 3.1.0 '@babel/generator@7.28.3': @@ -17009,12 +16985,6 @@ snapshots: '@jridgewell/sourcemap-codec': 1.5.5 '@jridgewell/trace-mapping': 0.3.31 - '@jridgewell/gen-mapping@0.3.8': - dependencies: - '@jridgewell/set-array': 1.2.1 - '@jridgewell/sourcemap-codec': 1.5.0 - '@jridgewell/trace-mapping': 0.3.25 - '@jridgewell/remapping@2.3.5': dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -17022,8 +16992,6 @@ snapshots: '@jridgewell/resolve-uri@3.1.2': {} - '@jridgewell/set-array@1.2.1': {} - '@jridgewell/source-map@0.3.11': dependencies: '@jridgewell/gen-mapping': 0.3.13 @@ -17038,16 +17006,6 @@ snapshots: '@jridgewell/sourcemap-codec@1.5.5': {} - '@jridgewell/trace-mapping@0.3.25': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - - '@jridgewell/trace-mapping@0.3.30': - dependencies: - '@jridgewell/resolve-uri': 3.1.2 - '@jridgewell/sourcemap-codec': 1.5.5 - '@jridgewell/trace-mapping@0.3.31': dependencies: '@jridgewell/resolve-uri': 3.1.2 @@ -18030,7 +17988,7 @@ snapshots: '@opentelemetry/semantic-conventions@1.37.0': {} - '@oxc-project/types@0.102.0': {} + '@oxc-project/types@0.103.0': {} '@oxc-project/types@0.94.0': {} @@ -19005,61 +18963,61 @@ snapshots: '@rolldown/binding-android-arm64@1.0.0-beta.42': optional: true - '@rolldown/binding-android-arm64@1.0.0-beta.54': + '@rolldown/binding-android-arm64@1.0.0-beta.55': optional: true '@rolldown/binding-darwin-arm64@1.0.0-beta.42': optional: true - '@rolldown/binding-darwin-arm64@1.0.0-beta.54': + '@rolldown/binding-darwin-arm64@1.0.0-beta.55': optional: true '@rolldown/binding-darwin-x64@1.0.0-beta.42': optional: true - '@rolldown/binding-darwin-x64@1.0.0-beta.54': + '@rolldown/binding-darwin-x64@1.0.0-beta.55': optional: true '@rolldown/binding-freebsd-x64@1.0.0-beta.42': optional: true - '@rolldown/binding-freebsd-x64@1.0.0-beta.54': + '@rolldown/binding-freebsd-x64@1.0.0-beta.55': optional: true '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.54': + '@rolldown/binding-linux-arm-gnueabihf@1.0.0-beta.55': optional: true '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.54': + '@rolldown/binding-linux-arm64-gnu@1.0.0-beta.55': optional: true '@rolldown/binding-linux-arm64-musl@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-arm64-musl@1.0.0-beta.54': + '@rolldown/binding-linux-arm64-musl@1.0.0-beta.55': optional: true '@rolldown/binding-linux-x64-gnu@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-x64-gnu@1.0.0-beta.54': + '@rolldown/binding-linux-x64-gnu@1.0.0-beta.55': optional: true '@rolldown/binding-linux-x64-musl@1.0.0-beta.42': optional: true - '@rolldown/binding-linux-x64-musl@1.0.0-beta.54': + '@rolldown/binding-linux-x64-musl@1.0.0-beta.55': optional: true '@rolldown/binding-openharmony-arm64@1.0.0-beta.42': optional: true - '@rolldown/binding-openharmony-arm64@1.0.0-beta.54': + '@rolldown/binding-openharmony-arm64@1.0.0-beta.55': optional: true '@rolldown/binding-wasm32-wasi@1.0.0-beta.42': @@ -19067,7 +19025,7 @@ snapshots: '@napi-rs/wasm-runtime': 1.0.6 optional: true - '@rolldown/binding-wasm32-wasi@1.0.0-beta.54': + '@rolldown/binding-wasm32-wasi@1.0.0-beta.55': dependencies: '@napi-rs/wasm-runtime': 1.1.0 optional: true @@ -19075,7 +19033,7 @@ snapshots: '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.42': optional: true - '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.54': + '@rolldown/binding-win32-arm64-msvc@1.0.0-beta.55': optional: true '@rolldown/binding-win32-ia32-msvc@1.0.0-beta.42': @@ -19084,12 +19042,12 @@ snapshots: '@rolldown/binding-win32-x64-msvc@1.0.0-beta.42': optional: true - '@rolldown/binding-win32-x64-msvc@1.0.0-beta.54': + '@rolldown/binding-win32-x64-msvc@1.0.0-beta.55': optional: true '@rolldown/pluginutils@1.0.0-beta.42': {} - '@rolldown/pluginutils@1.0.0-beta.54': {} + '@rolldown/pluginutils@1.0.0-beta.55': {} '@rollup/plugin-alias@5.1.1(rollup@4.40.2)': optionalDependencies: @@ -19102,7 +19060,7 @@ snapshots: estree-walker: 2.0.2 fdir: 6.5.0(picomatch@4.0.3) is-reference: 1.2.1 - magic-string: 0.30.17 + magic-string: 0.30.19 picomatch: 4.0.3 optionalDependencies: rollup: 4.40.2 @@ -19111,7 +19069,7 @@ snapshots: dependencies: '@rollup/pluginutils': 5.1.4(rollup@4.40.2) estree-walker: 2.0.2 - magic-string: 0.30.17 + magic-string: 0.30.19 optionalDependencies: rollup: 4.40.2 @@ -19134,7 +19092,7 @@ snapshots: '@rollup/plugin-replace@6.0.2(rollup@4.40.2)': dependencies: '@rollup/pluginutils': 5.1.4(rollup@4.40.2) - magic-string: 0.30.17 + magic-string: 0.30.19 optionalDependencies: rollup: 4.40.2 @@ -20072,11 +20030,11 @@ snapshots: dependencies: solid-js: 1.9.6 - '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.54)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': + '@solidjs/start@1.1.3(@testing-library/jest-dom@6.5.0)(@types/node@22.15.17)(jiti@2.6.1)(solid-js@1.9.6)(terser@5.44.0)(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(yaml@2.8.1)': dependencies: '@tanstack/server-functions-plugin': 1.119.2(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1) - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.54)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) - '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.54)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/server-components': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) defu: 6.1.4 error-stack-parser: 2.1.4 html-to-image: 1.11.13 @@ -20087,7 +20045,7 @@ snapshots: source-map-js: 1.2.1 terracotta: 1.0.6(solid-js@1.9.6) tinyglobby: 0.2.13 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.54)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) vite-plugin-solid: 2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) transitivePeerDependencies: - '@testing-library/jest-dom' @@ -20217,9 +20175,9 @@ snapshots: react: 19.1.1 react-dom: 19.1.1(react@19.1.1) - '@storybook/builder-vite@10.2.0-alpha.6(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5))': + '@storybook/builder-vite@10.2.0-alpha.7(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5))': dependencies: - '@storybook/csf-plugin': 10.2.0-alpha.6(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) + '@storybook/csf-plugin': 10.2.0-alpha.7(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) '@vitest/mocker': 3.2.4(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)) storybook: 8.6.12(prettier@3.5.3) ts-dedent: 2.2.0 @@ -20251,7 +20209,7 @@ snapshots: - supports-color - utf-8-validate - '@storybook/csf-plugin@10.2.0-alpha.6(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5))': + '@storybook/csf-plugin@10.2.0-alpha.7(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5))': dependencies: storybook: 8.6.12(prettier@3.5.3) unplugin: 2.3.10 @@ -20575,73 +20533,69 @@ snapshots: '@tauri-apps/api@1.6.0': {} - '@tauri-apps/api@2.5.0': {} - - '@tauri-apps/api@2.7.0': {} - - '@tauri-apps/api@2.8.0': {} + '@tauri-apps/api@2.9.1': {} '@tauri-apps/cli-darwin-arm64@1.6.3': optional: true - '@tauri-apps/cli-darwin-arm64@2.5.0': + '@tauri-apps/cli-darwin-arm64@2.9.6': optional: true '@tauri-apps/cli-darwin-x64@1.6.3': optional: true - '@tauri-apps/cli-darwin-x64@2.5.0': + '@tauri-apps/cli-darwin-x64@2.9.6': optional: true '@tauri-apps/cli-linux-arm-gnueabihf@1.6.3': optional: true - '@tauri-apps/cli-linux-arm-gnueabihf@2.5.0': + '@tauri-apps/cli-linux-arm-gnueabihf@2.9.6': optional: true '@tauri-apps/cli-linux-arm64-gnu@1.6.3': optional: true - '@tauri-apps/cli-linux-arm64-gnu@2.5.0': + '@tauri-apps/cli-linux-arm64-gnu@2.9.6': optional: true '@tauri-apps/cli-linux-arm64-musl@1.6.3': optional: true - '@tauri-apps/cli-linux-arm64-musl@2.5.0': + '@tauri-apps/cli-linux-arm64-musl@2.9.6': optional: true - '@tauri-apps/cli-linux-riscv64-gnu@2.5.0': + '@tauri-apps/cli-linux-riscv64-gnu@2.9.6': optional: true '@tauri-apps/cli-linux-x64-gnu@1.6.3': optional: true - '@tauri-apps/cli-linux-x64-gnu@2.5.0': + '@tauri-apps/cli-linux-x64-gnu@2.9.6': optional: true '@tauri-apps/cli-linux-x64-musl@1.6.3': optional: true - '@tauri-apps/cli-linux-x64-musl@2.5.0': + '@tauri-apps/cli-linux-x64-musl@2.9.6': optional: true '@tauri-apps/cli-win32-arm64-msvc@1.6.3': optional: true - '@tauri-apps/cli-win32-arm64-msvc@2.5.0': + '@tauri-apps/cli-win32-arm64-msvc@2.9.6': optional: true '@tauri-apps/cli-win32-ia32-msvc@1.6.3': optional: true - '@tauri-apps/cli-win32-ia32-msvc@2.5.0': + '@tauri-apps/cli-win32-ia32-msvc@2.9.6': optional: true '@tauri-apps/cli-win32-x64-msvc@1.6.3': optional: true - '@tauri-apps/cli-win32-x64-msvc@2.5.0': + '@tauri-apps/cli-win32-x64-msvc@2.9.6': optional: true '@tauri-apps/cli@1.6.3': @@ -20659,67 +20613,67 @@ snapshots: '@tauri-apps/cli-win32-ia32-msvc': 1.6.3 '@tauri-apps/cli-win32-x64-msvc': 1.6.3 - '@tauri-apps/cli@2.5.0': + '@tauri-apps/cli@2.9.6': optionalDependencies: - '@tauri-apps/cli-darwin-arm64': 2.5.0 - '@tauri-apps/cli-darwin-x64': 2.5.0 - '@tauri-apps/cli-linux-arm-gnueabihf': 2.5.0 - '@tauri-apps/cli-linux-arm64-gnu': 2.5.0 - '@tauri-apps/cli-linux-arm64-musl': 2.5.0 - '@tauri-apps/cli-linux-riscv64-gnu': 2.5.0 - '@tauri-apps/cli-linux-x64-gnu': 2.5.0 - '@tauri-apps/cli-linux-x64-musl': 2.5.0 - '@tauri-apps/cli-win32-arm64-msvc': 2.5.0 - '@tauri-apps/cli-win32-ia32-msvc': 2.5.0 - '@tauri-apps/cli-win32-x64-msvc': 2.5.0 + '@tauri-apps/cli-darwin-arm64': 2.9.6 + '@tauri-apps/cli-darwin-x64': 2.9.6 + '@tauri-apps/cli-linux-arm-gnueabihf': 2.9.6 + '@tauri-apps/cli-linux-arm64-gnu': 2.9.6 + '@tauri-apps/cli-linux-arm64-musl': 2.9.6 + '@tauri-apps/cli-linux-riscv64-gnu': 2.9.6 + '@tauri-apps/cli-linux-x64-gnu': 2.9.6 + '@tauri-apps/cli-linux-x64-musl': 2.9.6 + '@tauri-apps/cli-win32-arm64-msvc': 2.9.6 + '@tauri-apps/cli-win32-ia32-msvc': 2.9.6 + '@tauri-apps/cli-win32-x64-msvc': 2.9.6 '@tauri-apps/plugin-clipboard-manager@2.3.0': dependencies: - '@tauri-apps/api': 2.7.0 + '@tauri-apps/api': 2.9.1 '@tauri-apps/plugin-deep-link@2.4.1': dependencies: - '@tauri-apps/api': 2.7.0 + '@tauri-apps/api': 2.9.1 '@tauri-apps/plugin-dialog@2.4.0': dependencies: - '@tauri-apps/api': 2.8.0 + '@tauri-apps/api': 2.9.1 '@tauri-apps/plugin-fs@2.4.1': dependencies: - '@tauri-apps/api': 2.7.0 + '@tauri-apps/api': 2.9.1 '@tauri-apps/plugin-http@2.5.1': dependencies: - '@tauri-apps/api': 2.7.0 + '@tauri-apps/api': 2.9.1 '@tauri-apps/plugin-notification@2.3.0': dependencies: - '@tauri-apps/api': 2.7.0 + '@tauri-apps/api': 2.9.1 '@tauri-apps/plugin-opener@2.5.0': dependencies: - '@tauri-apps/api': 2.8.0 + '@tauri-apps/api': 2.9.1 '@tauri-apps/plugin-os@2.3.0': dependencies: - '@tauri-apps/api': 2.7.0 + '@tauri-apps/api': 2.9.1 '@tauri-apps/plugin-process@2.3.0': dependencies: - '@tauri-apps/api': 2.7.0 + '@tauri-apps/api': 2.9.1 - '@tauri-apps/plugin-shell@2.3.0': + '@tauri-apps/plugin-shell@2.3.3': dependencies: - '@tauri-apps/api': 2.7.0 + '@tauri-apps/api': 2.9.1 '@tauri-apps/plugin-store@2.4.0': dependencies: - '@tauri-apps/api': 2.8.0 + '@tauri-apps/api': 2.9.1 '@tauri-apps/plugin-updater@2.9.0': dependencies: - '@tauri-apps/api': 2.7.0 + '@tauri-apps/api': 2.9.1 '@testing-library/dom@10.4.0': dependencies: @@ -21389,7 +21343,7 @@ snapshots: untun: 0.1.3 uqr: 0.1.2 - '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.54)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/plugin-directives@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: '@babel/parser': 7.27.2 acorn: 8.14.1 @@ -21400,18 +21354,18 @@ snapshots: magicast: 0.2.11 recast: 0.23.11 tslib: 2.8.1 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.54)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) - '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.54)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': + '@vinxi/server-components@0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1))': dependencies: - '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.54)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) + '@vinxi/plugin-directives': 0.5.1(vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1)) acorn: 8.14.1 acorn-loose: 8.5.0 acorn-typescript: 1.4.13(acorn@8.14.1) astring: 1.9.0 magicast: 0.2.11 recast: 0.23.11 - vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.54)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) + vinxi: 0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1) '@virtual-grid/core@2.0.1': {} @@ -21458,7 +21412,7 @@ snapshots: dependencies: '@vitest/spy': 2.1.9 estree-walker: 3.0.3 - magic-string: 0.30.17 + magic-string: 0.30.19 optionalDependencies: vite: 5.4.19(@types/node@22.15.17)(terser@5.44.0) @@ -21486,7 +21440,7 @@ snapshots: '@vitest/snapshot@2.1.9': dependencies: '@vitest/pretty-format': 2.1.9 - magic-string: 0.30.17 + magic-string: 0.30.19 pathe: 1.1.2 '@vitest/spy@2.0.5': @@ -23398,8 +23352,8 @@ snapshots: '@typescript-eslint/parser': 5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) eslint: 9.30.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.30.1(jiti@2.6.1)) - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) eslint-plugin-jsx-a11y: 6.10.2(eslint@9.30.1(jiti@2.6.1)) eslint-plugin-react: 7.37.5(eslint@9.30.1(jiti@2.6.1)) eslint-plugin-react-hooks: 5.2.0(eslint@9.30.1(jiti@2.6.1)) @@ -23427,33 +23381,33 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 - eslint: 8.57.1 + eslint: 9.30.1(jiti@2.6.1) get-tsconfig: 4.11.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.15 unrs-resolver: 1.7.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color - eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@9.30.1(jiti@2.6.1)): + eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0)(eslint@8.57.1): dependencies: '@nolyfill/is-core-module': 1.0.39 debug: 4.4.3 - eslint: 9.30.1(jiti@2.6.1) + eslint: 8.57.1 get-tsconfig: 4.11.0 is-bun-module: 2.0.0 stable-hash: 0.0.5 tinyglobby: 0.2.15 unrs-resolver: 1.7.2 optionalDependencies: - eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)) + eslint-plugin-import: 2.31.0(@typescript-eslint/parser@5.62.0(eslint@8.57.1)(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@8.57.1) transitivePeerDependencies: - supports-color @@ -23468,14 +23422,14 @@ snapshots: transitivePeerDependencies: - supports-color - eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)): + eslint-module-utils@2.12.0(@typescript-eslint/parser@5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)): dependencies: debug: 3.2.7 optionalDependencies: '@typescript-eslint/parser': 5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3) eslint: 9.30.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0)(eslint@9.30.1(jiti@2.6.1)) + eslint-import-resolver-typescript: 3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) transitivePeerDependencies: - supports-color @@ -23508,7 +23462,7 @@ snapshots: - eslint-import-resolver-webpack - supports-color - eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)): + eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)): dependencies: '@rtsao/scc': 1.1.0 array-includes: 3.1.8 @@ -23519,7 +23473,7 @@ snapshots: doctrine: 2.1.0 eslint: 9.30.1(jiti@2.6.1) eslint-import-resolver-node: 0.3.9 - eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1)(eslint@9.30.1(jiti@2.6.1)) + eslint-module-utils: 2.12.0(@typescript-eslint/parser@5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint-import-resolver-node@0.3.9)(eslint-import-resolver-typescript@3.10.1(eslint-plugin-import@2.31.0(@typescript-eslint/parser@5.62.0(eslint@9.30.1(jiti@2.6.1))(typescript@5.8.3))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)))(eslint@9.30.1(jiti@2.6.1)) hasown: 2.0.2 is-core-module: 2.16.1 is-glob: 4.0.3 @@ -23824,8 +23778,8 @@ snapshots: espree@9.6.1: dependencies: - acorn: 8.14.1 - acorn-jsx: 5.3.2(acorn@8.14.1) + acorn: 8.15.0 + acorn-jsx: 5.3.2(acorn@8.15.0) eslint-visitor-keys: 3.4.3 esprima@4.0.1: {} @@ -26029,7 +25983,7 @@ snapshots: p-wait-for: 5.0.2 qs: 6.14.0 - next-auth@4.24.11(next@15.5.7(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): + next-auth@4.24.11(next@15.5.7(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1))(nodemailer@6.10.1)(react-dom@19.1.1(react@19.1.1))(react@19.1.1): dependencies: '@babel/runtime': 7.27.1 '@panva/hkdf': 1.2.1 @@ -26104,7 +26058,7 @@ snapshots: cors: 2.8.5 next: 15.5.7(@babel/core@7.27.1)(@opentelemetry/api@1.9.0)(react-dom@19.1.1(react@19.1.1))(react@19.1.1) - nitropack@2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(mysql2@3.15.2)(rolldown@1.0.0-beta.54)(xml2js@0.6.2): + nitropack@2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(mysql2@3.15.2)(xml2js@0.6.2): dependencies: '@cloudflare/kv-asset-handler': 0.4.0 '@netlify/functions': 3.1.5(encoding@0.1.13)(rollup@4.40.2) @@ -26144,7 +26098,7 @@ snapshots: klona: 2.0.6 knitwork: 1.2.0 listhen: 1.9.0 - magic-string: 0.30.17 + magic-string: 0.30.19 magicast: 0.3.5 mime: 4.0.7 mlly: 1.7.4 @@ -26158,7 +26112,7 @@ snapshots: pretty-bytes: 6.1.1 radix3: 1.1.2 rollup: 4.40.2 - rollup-plugin-visualizer: 5.14.0(rolldown@1.0.0-beta.54)(rollup@4.40.2) + rollup-plugin-visualizer: 5.14.0(rollup@4.40.2) scule: 1.3.0 semver: 7.7.2 serve-placeholder: 2.0.2 @@ -27465,7 +27419,7 @@ snapshots: dependencies: glob: 7.2.3 - rolldown-plugin-dts@0.16.11(rolldown@1.0.0-beta.54)(typescript@5.8.3): + rolldown-plugin-dts@0.16.11(rolldown@1.0.0-beta.55)(typescript@5.8.3): dependencies: '@babel/generator': 7.28.3 '@babel/parser': 7.28.4 @@ -27476,7 +27430,7 @@ snapshots: dts-resolver: 2.1.2 get-tsconfig: 4.11.0 magic-string: 0.30.19 - rolldown: 1.0.0-beta.54 + rolldown: 1.0.0-beta.55 optionalDependencies: typescript: 5.8.3 transitivePeerDependencies: @@ -27504,24 +27458,24 @@ snapshots: '@rolldown/binding-win32-ia32-msvc': 1.0.0-beta.42 '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.42 - rolldown@1.0.0-beta.54: + rolldown@1.0.0-beta.55: dependencies: - '@oxc-project/types': 0.102.0 - '@rolldown/pluginutils': 1.0.0-beta.54 + '@oxc-project/types': 0.103.0 + '@rolldown/pluginutils': 1.0.0-beta.55 optionalDependencies: - '@rolldown/binding-android-arm64': 1.0.0-beta.54 - '@rolldown/binding-darwin-arm64': 1.0.0-beta.54 - '@rolldown/binding-darwin-x64': 1.0.0-beta.54 - '@rolldown/binding-freebsd-x64': 1.0.0-beta.54 - '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.54 - '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.54 - '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.54 - '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.54 - '@rolldown/binding-linux-x64-musl': 1.0.0-beta.54 - '@rolldown/binding-openharmony-arm64': 1.0.0-beta.54 - '@rolldown/binding-wasm32-wasi': 1.0.0-beta.54 - '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.54 - '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.54 + '@rolldown/binding-android-arm64': 1.0.0-beta.55 + '@rolldown/binding-darwin-arm64': 1.0.0-beta.55 + '@rolldown/binding-darwin-x64': 1.0.0-beta.55 + '@rolldown/binding-freebsd-x64': 1.0.0-beta.55 + '@rolldown/binding-linux-arm-gnueabihf': 1.0.0-beta.55 + '@rolldown/binding-linux-arm64-gnu': 1.0.0-beta.55 + '@rolldown/binding-linux-arm64-musl': 1.0.0-beta.55 + '@rolldown/binding-linux-x64-gnu': 1.0.0-beta.55 + '@rolldown/binding-linux-x64-musl': 1.0.0-beta.55 + '@rolldown/binding-openharmony-arm64': 1.0.0-beta.55 + '@rolldown/binding-wasm32-wasi': 1.0.0-beta.55 + '@rolldown/binding-win32-arm64-msvc': 1.0.0-beta.55 + '@rolldown/binding-win32-x64-msvc': 1.0.0-beta.55 rollup-plugin-inject@3.0.2: dependencies: @@ -27533,14 +27487,13 @@ snapshots: dependencies: rollup-plugin-inject: 3.0.2 - rollup-plugin-visualizer@5.14.0(rolldown@1.0.0-beta.54)(rollup@4.40.2): + rollup-plugin-visualizer@5.14.0(rollup@4.40.2): dependencies: open: 8.4.2 picomatch: 4.0.3 source-map: 0.7.4 yargs: 17.7.2 optionalDependencies: - rolldown: 1.0.0-beta.54 rollup: 4.40.2 rollup-pluginutils@2.8.2: @@ -28123,7 +28076,7 @@ snapshots: storybook-solidjs-vite@1.0.0-beta.7(@storybook/test@8.6.12(storybook@8.6.12(prettier@3.5.3)))(esbuild@0.25.5)(rollup@4.40.2)(solid-js@1.9.6)(storybook@8.6.12(prettier@3.5.3))(vite-plugin-solid@2.11.6(@testing-library/jest-dom@6.5.0)(solid-js@1.9.6)(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1)))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)): dependencies: - '@storybook/builder-vite': 10.2.0-alpha.6(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) + '@storybook/builder-vite': 10.2.0-alpha.7(esbuild@0.25.5)(rollup@4.40.2)(storybook@8.6.12(prettier@3.5.3))(vite@6.3.5(@types/node@22.15.17)(jiti@2.6.1)(terser@5.44.0)(yaml@2.8.1))(webpack@5.101.3(esbuild@0.25.5)) '@storybook/types': 9.0.0-alpha.1(storybook@8.6.12(prettier@3.5.3)) magic-string: 0.30.17 solid-js: 1.9.6 @@ -28687,8 +28640,8 @@ snapshots: diff: 8.0.2 empathic: 2.0.0 hookable: 5.5.3 - rolldown: 1.0.0-beta.54 - rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.54)(typescript@5.8.3) + rolldown: 1.0.0-beta.55 + rolldown-plugin-dts: 0.16.11(rolldown@1.0.0-beta.55)(typescript@5.8.3) semver: 7.7.2 tinyexec: 1.0.1 tinyglobby: 0.2.15 @@ -28857,10 +28810,10 @@ snapshots: unctx@2.4.1: dependencies: - acorn: 8.14.1 + acorn: 8.15.0 estree-walker: 3.0.3 - magic-string: 0.30.17 - unplugin: 2.3.2 + magic-string: 0.30.19 + unplugin: 2.3.10 undici-types@5.26.5: {} @@ -28951,7 +28904,7 @@ snapshots: escape-string-regexp: 5.0.0 estree-walker: 3.0.3 local-pkg: 1.1.1 - magic-string: 0.30.17 + magic-string: 0.30.19 mlly: 1.7.4 pathe: 2.0.3 picomatch: 4.0.3 @@ -29085,12 +29038,6 @@ snapshots: picomatch: 4.0.3 webpack-virtual-modules: 0.6.2 - unplugin@2.3.2: - dependencies: - acorn: 8.15.0 - picomatch: 4.0.3 - webpack-virtual-modules: 0.6.2 - unrs-resolver@1.7.2: dependencies: napi-postinstall: 0.2.3 @@ -29145,7 +29092,7 @@ snapshots: unwasm@0.3.9: dependencies: knitwork: 1.2.0 - magic-string: 0.30.17 + magic-string: 0.30.19 mlly: 1.7.4 pathe: 1.1.2 pkg-types: 1.3.1 @@ -29284,7 +29231,7 @@ snapshots: d3-time: 3.1.0 d3-timer: 3.0.1 - vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(rolldown@1.0.0-beta.54)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): + vinxi@0.5.6(@planetscale/database@1.19.0)(@types/node@22.15.17)(db0@0.3.2(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(mysql2@3.15.2))(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(ioredis@5.6.1)(jiti@2.6.1)(mysql2@3.15.2)(terser@5.44.0)(xml2js@0.6.2)(yaml@2.8.1): dependencies: '@babel/core': 7.27.1 '@babel/plugin-syntax-jsx': 7.27.1(@babel/core@7.27.1) @@ -29306,7 +29253,7 @@ snapshots: hookable: 5.5.3 http-proxy: 1.18.1 micromatch: 4.0.8 - nitropack: 2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(mysql2@3.15.2)(rolldown@1.0.0-beta.54)(xml2js@0.6.2) + nitropack: 2.11.11(@planetscale/database@1.19.0)(drizzle-orm@0.44.6(@cloudflare/workers-types@4.20250507.0)(@opentelemetry/api@1.9.0)(@planetscale/database@1.19.0)(mysql2@3.15.2))(encoding@0.1.13)(mysql2@3.15.2)(xml2js@0.6.2) node-fetch-native: 1.6.6 path-to-regexp: 6.3.0 pathe: 1.1.2