diff --git a/package.json b/package.json index 6362490e..3878e4bf 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "wooting-macros", "private": true, - "version": "1.0.2", + "version": "1.1.0-0", "type": "module", "scripts": { "dev": "vite", @@ -12,44 +12,44 @@ }, "dependencies": { "@chakra-ui/icons": "^2.1.1", - "@chakra-ui/react": "^2.8.1", - "@chakra-ui/system": "^2.6.1", - "@dnd-kit/core": "^6.0.8", - "@dnd-kit/modifiers": "^6.0.1", - "@dnd-kit/sortable": "^7.0.2", - "@dnd-kit/utilities": "^3.2.1", + "@chakra-ui/react": "^2.8.2", + "@chakra-ui/system": "^2.6.2", + "@dnd-kit/core": "^6.1.0", + "@dnd-kit/modifiers": "^7.0.0", + "@dnd-kit/sortable": "^8.0.0", + "@dnd-kit/utilities": "^3.2.2", "@emoji-mart/data": "1.1.2", "@emoji-mart/react": "1.1.1", - "@emotion/react": "^11.11.1", + "@emotion/react": "^11.11.3", "@emotion/styled": "^11.11.0", - "@fontsource/montserrat": "^5.0.15", - "@formkit/auto-animate": "0.8.0", - "@tauri-apps/api": "^1.5.1", + "@fontsource/montserrat": "^5.0.16", + "@formkit/auto-animate": "0.8.1", + "@tauri-apps/api": "^1.5.3", "emoji-mart": "^5.5.2", - "framer-motion": "^10.16.4", + "framer-motion": "^11.0.3", "react": "^18.2.0", "react-dom": "^18.2.0", - "react-icons": "^4.11.0", + "react-icons": "^5.0.1", "tauri-plugin-log": "https://github.com/tauri-apps/tauri-plugin-log.git#commit=1a369766cf90f3aed9c2b7c68b70bf39081538b3", - "yarn": "^1.22.19" + "yarn": "^1.22.21" }, "devDependencies": { - "@tauri-apps/cli": "^1.5.6", - "@types/eslint": "^8.44.6", - "@types/node": "^20.8.10", + "@tauri-apps/cli": "^1.5.9", + "@types/eslint": "^8.56.2", + "@types/node": "^20.11.17", "@types/prettier": "^3.0.0", - "@types/react": "^18.2.36", - "@types/react-dom": "^18.2.14", - "@typescript-eslint/eslint-plugin": "^6.9.1", - "@typescript-eslint/parser": "^6.9.1", - "@vitejs/plugin-react": "^4.1.1", - "eslint": "^8.53.0", - "eslint-config-prettier": "^9.0.0", + "@types/react": "^18.2.55", + "@types/react-dom": "^18.2.19", + "@typescript-eslint/eslint-plugin": "^6.21.0", + "@typescript-eslint/parser": "^6.21.0", + "@vitejs/plugin-react": "^4.2.1", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", "eslint-plugin-react": "^7.33.2", "eslint-plugin-react-hooks": "^4.6.0", - "prettier": "^3.0.3", - "typescript": "^5.2.2", - "vite": "^4.5.0" + "prettier": "^3.2.5", + "typescript": "^5.3.3", + "vite": "^5.1.1" }, "packageManager": "yarn@3.3.1" } diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index d3b67dad..76fe6932 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -19,9 +19,20 @@ checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" [[package]] name = "ahash" -version = "0.8.6" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a824f2aa7e75a0c98c5a504fceb80649e9c35265d44525b5f94de4771a395cd" +dependencies = [ + "getrandom 0.2.12", + "once_cell", + "version_check", +] + +[[package]] +name = "ahash" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91429305e9f0a25f6205c5b8e0d2db09e0708a7a6df0f42212bb56c32c8ac97a" +checksum = "77c3a9648d43b9cd48db467b3f87fdd6e146bcc88ab0180006cef2179fe11d01" dependencies = [ "cfg-if", "once_cell", @@ -90,11 +101,78 @@ dependencies = [ "libc", ] +[[package]] +name = "anstream" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc" + +[[package]] +name = "anstyle-parse" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + [[package]] name = "anyhow" -version = "1.0.75" +version = "1.0.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a4668cab20f66d8d020e1fbc0ebe47217433c1b6c8f2040faf858554e394ace6" +checksum = "080e9890a082662b09c1ad45f567faeeb47f22b5fb23895fbe1e651e718e25ca" + +[[package]] +name = "arboard" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aafb29b107435aa276664c1db8954ac27a6e105cdad3c88287a199eb0e313c08" +dependencies = [ + "clipboard-win 4.5.0", + "core-graphics 0.22.3", + "image", + "log", + "objc", + "objc-foundation", + "objc_id", + "parking_lot", + "thiserror", + "winapi", + "x11rb 0.12.0", +] [[package]] name = "arrayvec" @@ -114,28 +192,28 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d37875bd9915b7d67c2f117ea2c30a0989874d0b2cb694fe25403c85763c0c9e" +checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" dependencies = [ "concurrent-queue", - "event-listener 3.0.1", - "event-listener-strategy", + "event-listener 5.0.0", + "event-listener-strategy 0.5.0", "futures-core", "pin-project-lite", ] [[package]] name = "async-executor" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f9936333f3d84275cb4010514544ae7fe0847760f4a242e8ce603b358615cad" +checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" dependencies = [ - "async-lock 3.0.0", + "async-lock 3.3.0", "async-task", "concurrent-queue", "fastrand 2.0.1", - "futures-lite 2.0.1", + "futures-lite 2.2.0", "slab", ] @@ -173,22 +251,21 @@ dependencies = [ [[package]] name = "async-io" -version = "2.2.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41ed9d5715c2d329bf1b4da8d60455b99b187f27ba726df2883799af9af60997" +checksum = "8f97ab0c5b00a7cdbe5a371b9a782ee7be1316095885c8a4ea1daf490eb0ef65" dependencies = [ - "async-lock 3.0.0", + "async-lock 3.3.0", "cfg-if", "concurrent-queue", "futures-io", - "futures-lite 2.0.1", + "futures-lite 2.2.0", "parking", - "polling 3.3.0", - "rustix 0.38.21", + "polling 3.4.0", + "rustix 0.38.31", "slab", "tracing", - "waker-fn", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -202,12 +279,12 @@ dependencies = [ [[package]] name = "async-lock" -version = "3.0.0" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "45e900cdcd39bb94a14487d3f7ef92ca222162e6c7c3fe7cb3550ea75fb486ed" +checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" dependencies = [ - "event-listener 3.0.1", - "event-listener-strategy", + "event-listener 4.0.3", + "event-listener-strategy 0.4.0", "pin-project-lite", ] @@ -222,9 +299,9 @@ dependencies = [ "async-signal", "blocking", "cfg-if", - "event-listener 3.0.1", + "event-listener 3.1.0", "futures-lite 1.13.0", - "rustix 0.38.21", + "rustix 0.38.31", "windows-sys 0.48.0", ] @@ -236,7 +313,7 @@ checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -245,13 +322,13 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" dependencies = [ - "async-io 2.2.0", + "async-io 2.3.1", "async-lock 2.8.0", "atomic-waker", "cfg-if", "futures-core", "futures-io", - "rustix 0.38.21", + "rustix 0.38.31", "signal-hook-registry", "slab", "windows-sys 0.48.0", @@ -259,19 +336,19 @@ dependencies = [ [[package]] name = "async-task" -version = "4.5.0" +version = "4.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4eb2cdb97421e01129ccb49169d8279ed21e829929144f4a22a6e54ac549ca1" +checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" [[package]] name = "async-trait" -version = "0.1.74" +version = "0.1.77" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a66537f1bb974b254c98ed142ff995236e81b9d0fe4db0575f46612cb15eb0f9" +checksum = "c980ee35e870bd1a4d2c8294d4c04d0499e67bca1e4b5cefcc693c2fa00caea9" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -344,28 +421,28 @@ checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" [[package]] name = "base64" -version = "0.21.5" +version = "0.21.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "35636a1494ede3b646cc98f74f8e62c773a38a659ebc777a2cf26b9b74171df9" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" [[package]] name = "bindgen" -version = "0.68.1" +version = "0.69.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "726e4313eb6ec35d2730258ad4e15b547ee75d6afaa1361a922e78e59b7d8078" +checksum = "a00dc851838a2120612785d195287475a3ac45514741da670b735818822129a0" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "cexpr", "clang-sys", + "itertools", "lazy_static", "lazycell", - "peeking_take_while", "proc-macro2", "quote", "regex", "rustc-hash", "shlex", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -376,13 +453,25 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.4.1" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "327762f6e5a765692301e5bb513e0d9fef63be86bbc14528052b1cd3e6f03e07" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" dependencies = [ "serde", ] +[[package]] +name = "bitvec" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bc2832c24239b0141d5674bb9174f9d68a8b5b3f2753311927c172ca46f7e9c" +dependencies = [ + "funty", + "radium", + "tap", + "wyz", +] + [[package]] name = "block" version = "0.1.6" @@ -400,34 +489,42 @@ dependencies = [ [[package]] name = "blocking" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "864b30e660d766b7e9b47347d9b6558a17f1cfa22274034fa6f55b274b3e4620" +checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" dependencies = [ "async-channel", - "async-lock 3.0.0", + "async-lock 3.3.0", "async-task", "fastrand 2.0.1", "futures-io", - "futures-lite 2.0.1", + "futures-lite 2.2.0", "piper", "tracing", ] [[package]] -name = "brightness" -version = "0.5.0" +name = "borsh" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ccf3c64278486354c6c41b71293570a207684a34cceb53137975d781748d33f" +checksum = "f58b559fd6448c6e2fd0adb5720cd98a2506594cafa4737ff98c396f3e82f667" dependencies = [ - "async-trait", - "blocking", - "cfg-if", - "futures", - "itertools 0.10.5", - "thiserror", - "windows 0.39.0", - "zbus", + "borsh-derive", + "cfg_aliases", +] + +[[package]] +name = "borsh-derive" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7aadb5b6ccbd078890f6d7003694e33816e6b784358f18e15e7e6d9f065a57cd" +dependencies = [ + "once_cell", + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.48", + "syn_derive", ] [[package]] @@ -453,12 +550,12 @@ dependencies = [ [[package]] name = "bstr" -version = "1.7.0" +version = "1.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c79ad7fb2dd38f3dabd76b09c6a5a20c038fc0213ef1e9afd30eb777f120f019" +checksum = "c48f0051a4b4c5e0b6d365cd04af53aeaa209e3cc15ec2cdb69e73cc87fbd0dc" dependencies = [ "memchr", - "regex-automata 0.4.3", + "regex-automata 0.4.5", "serde", ] @@ -478,11 +575,44 @@ dependencies = [ "utf8-width", ] +[[package]] +name = "byte-unit" +version = "5.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ac19bdf0b2665407c39d82dbc937e951e7e2001609f0fb32edd0af45a2d63e" +dependencies = [ + "rust_decimal", + "serde", + "utf8-width", +] + +[[package]] +name = "bytecheck" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cdc57ce23ac53c931e88a43d06d070a6fd142f2617be5855eb75efc9beb1c2" +dependencies = [ + "bytecheck_derive", + "ptr_meta", + "simdutf8", +] + +[[package]] +name = "bytecheck_derive" +version = "0.6.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3db406d29fbcd95542e92559bed4d8ad92636d1ca8b3b72ede10b4bcc010e659" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "bytemuck" -version = "1.14.0" +version = "1.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "374d28ec25809ee0e23827c2ab573d729e293f281dfe393500e7ad618baa61c6" +checksum = "a2ef034f05691a48569bd920a96c81b9d91bbad1ab5ac7c4616c1f6ef36cb79f" [[package]] name = "byteorder" @@ -523,6 +653,32 @@ dependencies = [ "system-deps 6.2.0", ] +[[package]] +name = "calloop" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298" +dependencies = [ + "bitflags 2.4.2", + "log", + "polling 3.4.0", + "rustix 0.38.31", + "slab", + "thiserror", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0ea9b9476c7fad82841a8dbb380e2eae480c21910feba80725b46931ed8f02" +dependencies = [ + "calloop", + "rustix 0.38.31", + "wayland-backend", + "wayland-client", +] + [[package]] name = "cargo_toml" version = "0.15.3" @@ -580,9 +736,9 @@ dependencies = [ [[package]] name = "cfg-expr" -version = "0.15.5" +version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03915af431787e6ffdcc74c645077518c6b6e01f80b761e0fbbfa288536311b3" +checksum = "fa50868b64a9a6fda9d593ce778849ea8715cd2a3d2cc17ffdb4a2f2f2f1961d" dependencies = [ "smallvec", "target-lexicon", @@ -594,28 +750,34 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + [[package]] name = "chrono" -version = "0.4.31" +version = "0.4.33" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f2c685bad3eb3d45a01354cedb7d5faa66194d1d58ba6e267a8de788f79db38" +checksum = "9f13690e35a5e4ace198e7beea2895d29f3a9cc55015fcebe6336bd2010af9eb" dependencies = [ "android-tzdata", "iana-time-zone", "num-traits", "serde", - "windows-targets 0.48.5", + "windows-targets 0.52.0", ] [[package]] name = "clang-sys" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c688fc74432808e3eb684cae8830a86be1d66a2bd58e1f248ed0960a590baf6f" +checksum = "67523a3b4be3ce1989d607a828d036249522dd9c1c8de7f4dd2dae43a37369d1" dependencies = [ "glob", "libc", - "libloading 0.7.4", + "libloading 0.8.1", ] [[package]] @@ -634,33 +796,45 @@ dependencies = [ "winapi", ] +[[package]] +name = "clipboard-win" +version = "4.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7191c27c2357d9b7ef96baac1773290d4ca63b24205b82a3fd8a0637afcf0362" +dependencies = [ + "error-code", + "str-buf", + "winapi", +] + [[package]] name = "cocoa" -version = "0.22.0" +version = "0.24.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "667fdc068627a2816b9ff831201dd9864249d6ee8d190b9532357f1fc0f61ea7" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" dependencies = [ "bitflags 1.3.2", "block", - "core-foundation 0.9.3", - "core-graphics 0.21.0", - "foreign-types", + "cocoa-foundation", + "core-foundation", + "core-graphics 0.22.3", + "foreign-types 0.3.2", "libc", "objc", ] [[package]] name = "cocoa" -version = "0.24.1" +version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" dependencies = [ "bitflags 1.3.2", "block", "cocoa-foundation", - "core-foundation 0.9.3", - "core-graphics 0.22.3", - "foreign-types", + "core-foundation", + "core-graphics 0.23.1", + "foreign-types 0.5.0", "libc", "objc", ] @@ -673,7 +847,7 @@ checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" dependencies = [ "bitflags 1.3.2", "block", - "core-foundation 0.9.3", + "core-foundation", "core-graphics-types", "libc", "objc", @@ -685,6 +859,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" +[[package]] +name = "colorchoice" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7" + [[package]] name = "colored" version = "1.9.4" @@ -708,9 +888,9 @@ dependencies = [ [[package]] name = "concurrent-queue" -version = "2.3.0" +version = "2.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f057a694a54f12365049b0958a1685bb52d567f5593b355fbf685838e873d400" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" dependencies = [ "crossbeam-utils", ] @@ -723,11 +903,11 @@ checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" [[package]] name = "copypasta" -version = "0.8.2" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "133fc8675ee3a4ec9aa513584deda9aa0faeda3586b87f7f0f2ba082c66fb172" +checksum = "deb85422867ca93da58b7f95fb5c0c10f6183ed6e1ef8841568968a896d3a858" dependencies = [ - "clipboard-win", + "clipboard-win 3.1.1", "objc", "objc-foundation", "objc_id", @@ -737,81 +917,54 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "57d24c7a13c43e870e37c1556b74555437870a04514f7685f5b354e090567171" -dependencies = [ - "core-foundation-sys 0.7.0", - "libc", -] - -[[package]] -name = "core-foundation" -version = "0.9.3" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "194a7a9e6de53fa55116934067c844d9d749312f75c6f6d0980e8c252f8c2146" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" dependencies = [ - "core-foundation-sys 0.8.4", + "core-foundation-sys", "libc", ] [[package]] name = "core-foundation-sys" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3a71ab494c0b5b860bdc8407ae08978052417070c2ced38573a9157ad75b8ac" - -[[package]] -name = "core-foundation-sys" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e496a50fda8aacccc86d7529e2c1e0892dbd0f898a6b5645b5561b89c3210efa" - -[[package]] -name = "core-graphics" -version = "0.19.2" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3889374e6ea6ab25dba90bb5d96202f61108058361f6dc72e8b03e6f8bbe923" -dependencies = [ - "bitflags 1.3.2", - "core-foundation 0.7.0", - "foreign-types", - "libc", -] +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" [[package]] name = "core-graphics" -version = "0.21.0" +version = "0.22.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52a67c4378cf203eace8fb6567847eb641fd6ff933c1145a115c6ee820ebb978" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.3", - "foreign-types", + "core-foundation", + "core-graphics-types", + "foreign-types 0.3.2", "libc", ] [[package]] name = "core-graphics" -version = "0.22.3" +version = "0.23.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +checksum = "970a29baf4110c26fedbc7f82107d42c23f7e88e404c4577ed73fe99ff85a212" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.3", + "core-foundation", "core-graphics-types", - "foreign-types", + "foreign-types 0.5.0", "libc", ] [[package]] name = "core-graphics-types" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2bb142d41022986c1d8ff29103a1411c8a3dfad3552f87a4f8dc50d61d4f4e33" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.3", + "core-foundation", "libc", ] @@ -822,15 +975,15 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace" dependencies = [ "bitflags 1.3.2", - "core-foundation-sys 0.8.4", + "core-foundation-sys", "coreaudio-sys", ] [[package]] name = "coreaudio-sys" -version = "0.2.13" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8478e5bdad14dce236b9898ea002eabfa87cbe14f0aa538dbe3b6a4bec4332d" +checksum = "7f01585027057ff5f0a5bf276174ae4c1594a2c5bde93d5f46a016d76270f5a9" dependencies = [ "bindgen", ] @@ -842,7 +995,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6d959d90e938c5493000514b446987c07aed46c668faaa7d34d6c7a67b1a578c" dependencies = [ "alsa", - "core-foundation-sys 0.8.4", + "core-foundation-sys", "coreaudio-rs", "dasp_sample", "jni 0.19.0", @@ -862,9 +1015,9 @@ dependencies = [ [[package]] name = "cpufeatures" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce420fe07aecd3e67c5f910618fe65e94158f6dcc0adf44e00d69ce2bdfe0fd0" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" dependencies = [ "libc", ] @@ -880,46 +1033,37 @@ dependencies = [ [[package]] name = "crossbeam-channel" -version = "0.5.8" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a33c2bf77f2df06183c3aa30d1e96c0695a313d4f9c453cc3762a6db39f99200" +checksum = "176dc175b78f56c0f321911d9c8eb2b77a78a4860b9c19db83835fea1a46649b" dependencies = [ - "cfg-if", "crossbeam-utils", ] [[package]] name = "crossbeam-deque" -version = "0.8.3" +version = "0.8.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce6fd6f855243022dcecf8702fef0c297d4338e226845fe067f6341ad9fa0cef" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" dependencies = [ - "cfg-if", "crossbeam-epoch", "crossbeam-utils", ] [[package]] name = "crossbeam-epoch" -version = "0.9.15" +version = "0.9.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ae211234986c545741a7dc064309f67ee1e5ad243d0e48335adc0484d960bcc7" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" dependencies = [ - "autocfg", - "cfg-if", "crossbeam-utils", - "memoffset 0.9.0", - "scopeguard", ] [[package]] name = "crossbeam-utils" -version = "0.8.16" +version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a22b2d63d4d1dc0b7f1b6b2747dd0088008a9be28b6ddf0b1e7d335e3037294" -dependencies = [ - "cfg-if", -] +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" [[package]] name = "crypto-common" @@ -955,24 +1099,30 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "ctor" -version = "0.1.26" +version = "0.2.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096" +checksum = "30d2b3721e861707777e3195b0158f950ae6dc4a27e4d02ff9f67e3eb3de199e" dependencies = [ "quote", - "syn 1.0.109", + "syn 2.0.48", ] +[[package]] +name = "cursor-icon" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" + [[package]] name = "darling" -version = "0.20.3" +version = "0.20.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0209d94da627ab5605dcccf08bb18afa5009cfbef48d8a8b7d7bdbc79be25c5e" +checksum = "fc5d6b04b3fd0ba9926f945895de7d806260a2d7431ba82e7edaecb043c4c6b8" dependencies = [ "darling_core", "darling_macro", @@ -980,27 +1130,27 @@ dependencies = [ [[package]] name = "darling_core" -version = "0.20.3" +version = "0.20.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "177e3443818124b357d8e76f53be906d60937f0d3a90773a664fa63fa253e621" +checksum = "04e48a959bcd5c761246f5d090ebc2fbf7b9cd527a492b07a67510c108f1e7e3" dependencies = [ "fnv", "ident_case", "proc-macro2", "quote", "strsim", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "darling_macro" -version = "0.20.3" +version = "0.20.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5" +checksum = "1d1545d67a2149e1d93b7e5c7752dce5a7426eb5d1357ddcfd89336b94444f77" dependencies = [ "darling_core", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -1011,15 +1161,15 @@ checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f" [[package]] name = "data-encoding" -version = "2.4.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2e66c9d817f1720209181c316d28635c050fa304f9c79e47a520882661b7308" +checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5" [[package]] name = "deranged" -version = "0.3.9" +version = "0.3.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f32d04922c60427da6f9fef14d042d9edddef64cb9d4ce0d64d0685fbeb1fd3" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" dependencies = [ "powerfmt", "serde", @@ -1165,14 +1315,14 @@ checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" [[package]] name = "educe" -version = "0.4.23" +version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f0042ff8246a363dbe77d2ceedb073339e85a804b9a47636c6e016a9a32c05f" +checksum = "e4bd92664bf78c4d3dba9b7cdafce6fa15b13ed3ed16175218196942e99168a8" dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.48", ] [[package]] @@ -1183,13 +1333,14 @@ checksum = "a26ae43d7bcc3b814de94796a5e736d4029efb0ee900c12e2d54c993ad1a1e07" [[package]] name = "embed-resource" -version = "2.4.0" +version = "2.4.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f54cc3e827ee1c3812239a9a41dede7b4d7d5d5464faa32d71bd7cba28ce2cb2" +checksum = "3bde55e389bea6a966bd467ad1ad7da0ae14546a5bc794d16d1e55e7fca44881" dependencies = [ "cc", + "memchr", "rustc_version", - "toml 0.8.6", + "toml 0.8.10", "vswhom", "winreg 0.51.0", ] @@ -1211,15 +1362,22 @@ dependencies = [ [[package]] name = "enum-ordinalize" -version = "3.1.15" +version = "4.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1bf1fa3f06bbff1ea5b1a9c7b14aa992a39657db60a2759457328d7e058f49ee" +checksum = "fea0dcfa4e54eeb516fe454635a95753ddd39acda650ce703031c6973e315dd5" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ - "num-bigint", - "num-traits", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -1240,20 +1398,30 @@ checksum = "f95e2801cd355d4a1a3e3953ce6ee5ae9603a5c833455343a8bfe3f44d418246" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", +] + +[[package]] +name = "env_filter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a009aa4810eb158359dda09d0c87378e4bbb89b5a801f016885a4707ba24f7ea" +dependencies = [ + "log", + "regex", ] [[package]] name = "env_logger" -version = "0.10.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85cdab6a89accf66733ad5a1693a4dcced6aeff64602b634530dd73c1f3ee9f0" +checksum = "05e7cf40684ae96ade6232ed84582f40ce0a66efcd43a5117aef610534f8e0b8" dependencies = [ + "anstream", + "anstyle", + "env_filter", "humantime", - "is-terminal", "log", - "regex", - "termcolor", ] [[package]] @@ -1262,7 +1430,7 @@ version = "4.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "74351c3392ea1ff6cd2628e0042d268ac2371cb613252ff383b6dfa50d22fa79" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "libc", ] @@ -1274,19 +1442,29 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" [[package]] name = "errno" -version = "0.3.5" +version = "0.3.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac3e13f66a2f95e32a39eaa81f6b95d42878ca0e1db0c7543723dfe12557e860" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", +] + +[[package]] +name = "error-code" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64f18991e7bf11e7ffee451b5318b5c1a73c52d0d0ada6e5a3017c8c1ced6a21" +dependencies = [ + "libc", + "str-buf", ] [[package]] name = "evdev-rs" -version = "0.4.0" +version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b92abc30d5fd1e4f6440dee4d626abc68f4a9b5014dc1de575901e23c2e02321" +checksum = "9812d5790fb6fcce449333eb6713dad335e8c979225ed98755c84a3987e06dba" dependencies = [ "bitflags 1.3.2", "evdev-sys", @@ -1313,9 +1491,31 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "3.0.1" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "01cec0252c2afff729ee6f00e903d479fba81784c8e2bd77447673471fdfaea1" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b72557800024fabbaa2449dd4bf24e37b93702d457a4d4f2b0dd1f0f039f20c1" dependencies = [ "concurrent-queue", "parking", @@ -1324,11 +1524,21 @@ dependencies = [ [[package]] name = "event-listener-strategy" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d96b852f1345da36d551b9473fa1e2b1eb5c5195585c6c018118bc92a8d91160" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" dependencies = [ - "event-listener 3.0.1", + "event-listener 4.0.3", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" +dependencies = [ + "event-listener 5.0.0", "pin-project-lite", ] @@ -1349,9 +1559,9 @@ checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" [[package]] name = "fdeflate" -version = "0.3.1" +version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64d6dafc854908ff5da46ff3f8f473c6984119a2876a383a860246dd7841a868" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" dependencies = [ "simd-adler32", ] @@ -1378,14 +1588,14 @@ dependencies = [ [[package]] name = "filetime" -version = "0.2.22" +version = "0.2.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4029edd3e734da6fe05b6cd7bd2960760a616bd2ddd0d59a0124746d6272af0" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.3.5", - "windows-sys 0.48.0", + "redox_syscall", + "windows-sys 0.52.0", ] [[package]] @@ -1410,7 +1620,28 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared", + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.48", ] [[package]] @@ -1419,15 +1650,27 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + [[package]] name = "form_urlencoded" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a62bc1cf6f830c2ec14a513a9fb124d0a213a629668a4186f329db21fe045652" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" dependencies = [ "percent-encoding", ] +[[package]] +name = "funty" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6d5a32815ae3f33302d95fdcb2ce17862f8c65363dcfd29360480ba1001fc9c" + [[package]] name = "futf" version = "0.1.5" @@ -1438,42 +1681,26 @@ dependencies = [ "new_debug_unreachable", ] -[[package]] -name = "futures" -version = "0.3.29" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da0290714b38af9b4a7b094b8a37086d1b4e61f2df9122c3cad2577669145335" -dependencies = [ - "futures-channel", - "futures-core", - "futures-executor", - "futures-io", - "futures-sink", - "futures-task", - "futures-util", -] - [[package]] name = "futures-channel" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff4dd66668b557604244583e3e1e1eada8c5c2e96a6d0d6653ede395b78bbacb" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" dependencies = [ "futures-core", - "futures-sink", ] [[package]] name = "futures-core" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb1d22c66e66d9d72e1758f0bd7d4fd0bee04cad842ee34587d68c07e45d088c" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" [[package]] name = "futures-executor" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f4fb8693db0cf099eadcca0efe2a5a22e4550f98ed16aba6c48700da29597bc" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" dependencies = [ "futures-core", "futures-task", @@ -1482,9 +1709,9 @@ dependencies = [ [[package]] name = "futures-io" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bf34a163b5c4c52d0478a4d757da8fb65cabef42ba90515efee0f6f9fa45aaa" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" [[package]] name = "futures-lite" @@ -1503,44 +1730,46 @@ dependencies = [ [[package]] name = "futures-lite" -version = "2.0.1" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3831c2651acb5177cbd83943f3d9c8912c5ad03c76afcc0e9511ba568ec5ebb" +checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba" dependencies = [ + "fastrand 2.0.1", "futures-core", + "futures-io", + "parking", "pin-project-lite", ] [[package]] name = "futures-macro" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "futures-sink" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e36d3378ee38c2a36ad710c5d30c2911d752cb941c00c72dbabfb786a7970817" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" [[package]] name = "futures-task" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "efd193069b0ddadc69c46389b740bbccdd97203899b48d09c5f7969591d6bae2" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" [[package]] name = "futures-util" -version = "0.3.29" +version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a19526d624e703a3179b3d322efec918b6246ea0fa51d41124525f00f1cc8104" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" dependencies = [ - "futures-channel", "futures-core", "futures-io", "futures-macro", @@ -1672,14 +1901,24 @@ dependencies = [ [[package]] name = "gethostname" -version = "0.2.3" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1ebd34e35c46e00bb73e81363248d627782724609fe1b6396f553f68fe3862e" +checksum = "bb65d4ba3173c56a500b555b532f72c42e8d1fe64962b518897f8959fae2c177" dependencies = [ "libc", "winapi", ] +[[package]] +name = "gethostname" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +dependencies = [ + "libc", + "windows-targets 0.48.5", +] + [[package]] name = "getrandom" version = "0.1.16" @@ -1693,9 +1932,9 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.10" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be4136b2a15dd319360be1c07d9933517ccf0be8f16bf62a3bee4f0d618df427" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" dependencies = [ "cfg-if", "libc", @@ -1704,9 +1943,9 @@ dependencies = [ [[package]] name = "gimli" -version = "0.28.0" +version = "0.28.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6fb8d784f27acf97159b40fc4db5ecd8aa23b9ad5ef69cdd136d3bc80665f0c0" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "gio" @@ -1766,7 +2005,7 @@ checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" dependencies = [ "anyhow", "heck 0.4.1", - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro-error", "proc-macro2", "quote", @@ -1791,15 +2030,15 @@ checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] name = "globset" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "759c97c1e17c55525b57192c06a267cda0ac5210b222d6b82189a2338fa1c13d" +checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" dependencies = [ "aho-corasick", "bstr", - "fnv", "log", - "regex", + "regex-automata 0.4.5", + "regex-syntax 0.8.2", ] [[package]] @@ -1861,7 +2100,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" dependencies = [ "anyhow", - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro-error", "proc-macro2", "quote", @@ -1870,9 +2109,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.3.21" +version = "0.3.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91fc23aa11be92976ef4729127f1a74adf36d8436f7816b185d18df956790833" +checksum = "bb2c4422095b67ee78da96fbb51a4cc413b3b25883c7717ff7ca1ab31022c9c9" dependencies = [ "bytes", "fnv", @@ -1880,7 +2119,7 @@ dependencies = [ "futures-sink", "futures-util", "http", - "indexmap 1.9.3", + "indexmap 2.2.2", "slab", "tokio", "tokio-util", @@ -1902,6 +2141,9 @@ name = "hashbrown" version = "0.12.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" +dependencies = [ + "ahash 0.7.7", +] [[package]] name = "hashbrown" @@ -1909,14 +2151,14 @@ version = "0.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" dependencies = [ - "ahash", + "ahash 0.8.7", ] [[package]] name = "hashbrown" -version = "0.14.2" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f93e7192158dbcda357bdec5fb5788eebf8bbac027f3f33e719d29135ae84156" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" [[package]] name = "heck" @@ -1935,9 +2177,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" [[package]] name = "hermit-abi" -version = "0.3.3" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d77f7ec81a6d05a3abb01ab6eb7590f6083d08449fe5a1c8b1e620283546ccb7" +checksum = "d0c62115964e08cb8039170eb33c1d0e2388a256930279edca206fff675f82c3" [[package]] name = "hex" @@ -1951,20 +2193,6 @@ version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "62adaabb884c94955b19907d60019f4e145d091c75345379e70d1ee696f7854f" -[[package]] -name = "html5ever" -version = "0.25.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5c13fb08e5d4dfc151ee5e88bae63f7773d61852f3bdc73c9f4b9e1bde03148" -dependencies = [ - "log", - "mac", - "markup5ever 0.10.1", - "proc-macro2", - "quote", - "syn 1.0.109", -] - [[package]] name = "html5ever" version = "0.26.0" @@ -1973,7 +2201,7 @@ checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" dependencies = [ "log", "mac", - "markup5ever 0.11.0", + "markup5ever", "proc-macro2", "quote", "syn 1.0.109", @@ -1981,20 +2209,20 @@ dependencies = [ [[package]] name = "http" -version = "0.2.9" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd6effc99afb63425aff9b05836f029929e345a6148a14b7ecd5ab67af944482" +checksum = "8947b1a6fad4393052c7ba1f4cd97bed3e953a95c79c92ad9b051a04611d9fbb" dependencies = [ "bytes", "fnv", - "itoa 1.0.9", + "itoa 1.0.10", ] [[package]] name = "http-body" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" dependencies = [ "bytes", "http", @@ -2027,9 +2255,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" [[package]] name = "hyper" -version = "0.14.27" +version = "0.14.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffb1cfd654a8219eaef89881fdb3bb3b1cdc5fa75ded05d6933b2b382e395468" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" dependencies = [ "bytes", "futures-channel", @@ -2040,9 +2268,9 @@ dependencies = [ "http-body", "httparse", "httpdate", - "itoa 1.0.9", + "itoa 1.0.10", "pin-project-lite", - "socket2 0.4.10", + "socket2 0.5.5", "tokio", "tower-service", "tracing", @@ -2064,16 +2292,16 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.58" +version = "0.1.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" dependencies = [ "android_system_properties", - "core-foundation-sys 0.8.4", + "core-foundation-sys", "iana-time-zone-haiku", "js-sys", "wasm-bindgen", - "windows-core", + "windows-core 0.52.0", ] [[package]] @@ -2103,9 +2331,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "0.4.0" +version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d20d6b07bfbc108882d88ed8e37d39636dcc260e15e30c45e6ba089610b917c" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" dependencies = [ "unicode-bidi", "unicode-normalization", @@ -2113,32 +2341,32 @@ dependencies = [ [[package]] name = "ignore" -version = "0.4.20" +version = "0.4.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbe7873dab538a9a44ad79ede1faf5f30d49f9a5c883ddbab48bce81b64b7492" +checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" dependencies = [ + "crossbeam-deque", "globset", - "lazy_static", "log", "memchr", - "regex", + "regex-automata 0.4.5", "same-file", - "thread_local", "walkdir", "winapi-util", ] [[package]] name = "image" -version = "0.24.7" +version = "0.24.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f3dfdbdd72063086ff443e297b61695500514b1e41095b6fb9a5ab48a70a711" +checksum = "034bbe799d1909622a74d1193aa50147769440040ff36cb2baa947609b0a4e23" dependencies = [ "bytemuck", "byteorder", "color_quant", - "num-rational", "num-traits", + "png", + "tiff", ] [[package]] @@ -2154,12 +2382,12 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.1.0" +version = "2.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" +checksum = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520" dependencies = [ "equivalent", - "hashbrown 0.14.2", + "hashbrown 0.14.3", "serde", ] @@ -2174,18 +2402,18 @@ dependencies = [ [[package]] name = "infer" -version = "0.12.0" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a898e4b7951673fce96614ce5751d13c40fc5674bc2d759288e46c3ab62598b3" +checksum = "f551f8c3a39f68f986517db0d1759de85881894fdc7db798bd2a9df9cb04b7fc" dependencies = [ "cfb", ] [[package]] name = "inotify" -version = "0.8.3" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "46dd0a94b393c730779ccfd2a872b67b1eb67be3fc33082e733bdb38b5fde4d4" +checksum = "fdd168d97690d0b8c412d6b6c10360277f4d7ee495c5d0d5d5fe0854923255cc" dependencies = [ "bitflags 1.3.2", "inotify-sys", @@ -2229,29 +2457,20 @@ checksum = "8f518f335dce6725a761382244631d86cf0ccb2863413590b31338feb467f9c3" [[package]] name = "is-terminal" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb0889898416213fab133e1d33a0e5858a48177452750691bde3666d0fdbaf8b" +checksum = "fe8f25ce1159c7740ff0b9b2f5cdf4a8428742ba7c112b9f20f22cd5219c7dab" dependencies = [ "hermit-abi", - "rustix 0.38.21", - "windows-sys 0.48.0", -] - -[[package]] -name = "itertools" -version = "0.10.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" -dependencies = [ - "either", + "libc", + "windows-sys 0.52.0", ] [[package]] name = "itertools" -version = "0.11.0" +version = "0.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" dependencies = [ "either", ] @@ -2264,9 +2483,9 @@ checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" [[package]] name = "itoa" -version = "1.0.9" +version = "1.0.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "af150ab688ff2122fcef229be89cb50dd66af9e01a4ff320cc137eecc9bacc38" +checksum = "b1a46d1a171d865aa5f83f92695765caa047a9b4cbae2cbf37dbd613a793fd4c" [[package]] name = "javascriptcore-rs" @@ -2327,18 +2546,24 @@ checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" [[package]] name = "jobserver" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8c37f63953c4c63420ed5fd3d6d398c719489b9f872b9fa683262f8edd363c7d" +checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" dependencies = [ "libc", ] +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" + [[package]] name = "js-sys" -version = "0.3.65" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54c0c35952f67de54bb584e9fd912b3023117cbafc0a77d8f3dee1fb5f572fe8" +checksum = "406cda4b368d531c842222cf9d2600a9a4acce8d29423695379c6868a143a9ee" dependencies = [ "wasm-bindgen", ] @@ -2355,18 +2580,6 @@ dependencies = [ "treediff", ] -[[package]] -name = "kuchiki" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ea8e9c6e031377cff82ee3001dc8026cdf431ed4e2e6b51f98ab8c73484a358" -dependencies = [ - "cssparser", - "html5ever 0.25.2", - "matches", - "selectors", -] - [[package]] name = "kuchikiki" version = "0.8.2" @@ -2374,7 +2587,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" dependencies = [ "cssparser", - "html5ever 0.26.0", + "html5ever", "indexmap 1.9.3", "matches", "selectors", @@ -2435,9 +2648,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.150" +version = "0.2.153" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89d92a4743f9a61002fae18374ed11e7973f530cb3a3255fb354818118b2203c" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" [[package]] name = "libloading" @@ -2465,9 +2678,9 @@ version = "0.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "85c833ca1e66078851dba29046874e38f08b2c883700aa29a03ddd3b23814ee8" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "libc", - "redox_syscall 0.4.1", + "redox_syscall", ] [[package]] @@ -2487,9 +2700,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" [[package]] name = "linux-raw-sys" -version = "0.4.10" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "da2479e8c062e40bf0066ffa0bc823de0a9368974af99c9f6df941d2c231e03f" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" [[package]] name = "lock_api" @@ -2546,9 +2759,9 @@ dependencies = [ [[package]] name = "mach2" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d0d1830bcd151a6fc4aea1369af235b36c1528fe976b8ff678683c9995eade8" +checksum = "19b955cdeb2a02b9117f121ce63aa52d08ade45de53e48fe6a38b39c10f6f709" dependencies = [ "libc", ] @@ -2562,20 +2775,6 @@ dependencies = [ "libc", ] -[[package]] -name = "markup5ever" -version = "0.10.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a24f40fb03852d1cdd84330cddcaf98e9ec08a7b7768e952fad3b4cf048ec8fd" -dependencies = [ - "log", - "phf 0.8.0", - "phf_codegen 0.8.0", - "string_cache", - "string_cache_codegen", - "tendril", -] - [[package]] name = "markup5ever" version = "0.11.0" @@ -2607,28 +2806,19 @@ checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" [[package]] name = "memchr" -version = "2.6.4" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" [[package]] name = "memmap2" -version = "0.5.10" +version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" dependencies = [ "libc", ] -[[package]] -name = "memoffset" -version = "0.6.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" -dependencies = [ - "autocfg", -] - [[package]] name = "memoffset" version = "0.7.1" @@ -2667,9 +2857,9 @@ checksum = "933dca44d65cdd53b355d0b73d380a2ff5da71f87f036053188bf1eab6a19881" [[package]] name = "miniz_oxide" -version = "0.7.1" +version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" dependencies = [ "adler", "simd-adler32", @@ -2677,9 +2867,9 @@ dependencies = [ [[package]] name = "mio" -version = "0.8.9" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dce281c5e46beae905d4de1870d8b1509a9142b62eedf18b443b011ca8343d0" +checksum = "8f3d0b296e374a4e6f3c7b0a1f5a51d748a0d34c85e7dc48fc3fa9a87657fe09" dependencies = [ "libc", "wasi 0.11.0+wasi-snapshot-preview1", @@ -2770,7 +2960,6 @@ dependencies = [ "bitflags 1.3.2", "cfg-if", "libc", - "memoffset 0.6.5", ] [[package]] @@ -2812,9 +3001,9 @@ dependencies = [ [[package]] name = "notify-rust" -version = "4.9.0" +version = "4.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d7b75c8958cb2eab3451538b32db8a7b74006abc33eb2e6a9a56d21e4775c2b" +checksum = "827c5edfa80235ded4ab3fe8e9dc619b4f866ef16fe9b1c6b8a7f8692c0f2226" dependencies = [ "log", "mac-notification-sys", @@ -2834,15 +3023,10 @@ dependencies = [ ] [[package]] -name = "num-bigint" -version = "0.4.4" +name = "num-conv" +version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "608e7659b5c3d7cba262d894801b9ec9d00de989e8a82bd4bef91d08da45cdc0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" [[package]] name = "num-derive" @@ -2855,32 +3039,11 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "num-integer" -version = "0.1.45" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "225d3389fb3509a24c93f5c29eb6bde2586b98d9f016636dff58d7c6f7569cd9" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-rational" -version = "0.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0" -dependencies = [ - "autocfg", - "num-integer", - "num-traits", -] - [[package]] name = "num-traits" -version = "0.2.17" +version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39e3200413f237f41ab11ad6d161bc7239c84dcb631773ccd7de3dfe4b5c267c" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" dependencies = [ "autocfg", ] @@ -2910,7 +3073,7 @@ version = "0.5.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", @@ -2966,9 +3129,9 @@ dependencies = [ [[package]] name = "object" -version = "0.32.1" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9cf5f9dd3933bd50a9e1f149ec995f39ae2c496d31fd772c1fd45ebc27e902b0" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" dependencies = [ "memchr", ] @@ -3002,8 +3165,8 @@ version = "0.11.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1a1f9a0b90718cf798dd72018d1a59ef01c339b67fb7d56e63503b98d68f74e" dependencies = [ - "base64 0.21.5", - "bitflags 2.4.1", + "base64 0.21.7", + "bitflags 2.4.2", "futures-util", "rgb", "semver", @@ -3030,9 +3193,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd8b5dd2ae5ed71462c540258bedcb51965123ad7e7ccf4b9a8cafaa4a63576d" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" [[package]] name = "open" @@ -3057,13 +3220,13 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.59" +version = "0.10.63" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a257ad03cd8fb16ad4172fedf8094451e1af1c4b70097636ef2eac9a5f0cc33" +checksum = "15c9d69dd87a29568d4d017cfe8ec518706046a05184e5aea92d0af890b803c8" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "cfg-if", - "foreign-types", + "foreign-types 0.3.2", "libc", "once_cell", "openssl-macros", @@ -3078,7 +3241,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -3089,9 +3252,9 @@ checksum = "ff011a302c396a5197692431fc1948019154afc178baf7d8e37367442a4601cf" [[package]] name = "openssl-sys" -version = "0.9.95" +version = "0.9.99" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40a4130519a360279579c2053038317e40eff64d13fd3f004f9e1b72b8a6aaf9" +checksum = "22e1bf214306098e4832460f797824c05d25aacdf896f64a985fb0fd992454ae" dependencies = [ "cc", "libc", @@ -3128,12 +3291,12 @@ dependencies = [ [[package]] name = "os_pipe" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ae859aa07428ca9a929b936690f8b12dc5f11dd8c6992a18ca93919f28bc177" +checksum = "57119c3b893986491ec9aa85056780d3a0f3cf4da7cc09dd3650dbd6c6738fb9" dependencies = [ "libc", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -3191,7 +3354,7 @@ checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.4.1", + "redox_syscall", "smallvec", "windows-targets 0.48.5", ] @@ -3202,17 +3365,11 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8835116a5c179084a830efb3adc117ab007512b535bc1a21c991d3b32a6b44dd" -[[package]] -name = "peeking_take_while" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "19b17cddbe7ec3f8bc800887bab5e717348c95ea2ca0b1bf0837fb964dc67099" - [[package]] name = "percent-encoding" -version = "2.3.0" +version = "2.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b2a4787296e9989611394c33f193f676704af1686e70b8f8033ab5ba9a35a94" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" [[package]] name = "phf" @@ -3231,9 +3388,17 @@ version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" dependencies = [ - "phf_macros 0.10.0", "phf_shared 0.10.0", - "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ade2d8b8f33c7333b51bcf0428d37e217e9f32192ae4772156f65063b8ce03dc" +dependencies = [ + "phf_macros 0.11.2", + "phf_shared 0.11.2", ] [[package]] @@ -3276,6 +3441,16 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "phf_generator" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "48e4cc64c2ad9ebe670cb8fd69dd50ae301650392e81c05f9bfcb2d5bdbc24b0" +dependencies = [ + "phf_shared 0.11.2", + "rand 0.8.5", +] + [[package]] name = "phf_macros" version = "0.8.0" @@ -3292,16 +3467,15 @@ dependencies = [ [[package]] name = "phf_macros" -version = "0.10.0" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" dependencies = [ - "phf_generator 0.10.0", - "phf_shared 0.10.0", - "proc-macro-hack", + "phf_generator 0.11.2", + "phf_shared 0.11.2", "proc-macro2", "quote", - "syn 1.0.109", + "syn 2.0.48", ] [[package]] @@ -3322,24 +3496,33 @@ dependencies = [ "siphasher", ] +[[package]] +name = "phf_shared" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90fcb95eef784c2ac79119d1dd819e162b5da872ce6f3c3abe1e8ca1c082f72b" +dependencies = [ + "siphasher", +] + [[package]] name = "pin-project" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422" +checksum = "0302c4a0442c456bd56f841aee5c3bfd17967563f6fadc9ceb9f9c23cf3807e0" dependencies = [ "pin-project-internal", ] [[package]] name = "pin-project-internal" -version = "1.1.3" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405" +checksum = "266c042b60c9c76b8d53061e52b2e0d1116abc57cefc8c5cd671619a56ac3690" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -3367,9 +3550,9 @@ dependencies = [ [[package]] name = "pkg-config" -version = "0.3.27" +version = "0.3.29" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26072860ba924cbfa98ea39c8c19b4dd6a4a25423dbdf219c1eca91aa0cf6964" +checksum = "2900ede94e305130c13ddd391e0ab7cbaeb783945ae07a279c268cb05109c6cb" [[package]] name = "plist" @@ -3377,8 +3560,8 @@ version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5699cc8a63d1aa2b1ee8e12b9ad70ac790d65788cd36101fa37f87ea46c4cef" dependencies = [ - "base64 0.21.5", - "indexmap 2.1.0", + "base64 0.21.7", + "indexmap 2.2.2", "line-wrap", "quick-xml 0.31.0", "serde", @@ -3387,9 +3570,9 @@ dependencies = [ [[package]] name = "png" -version = "0.17.10" +version = "0.17.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd75bf2d8dd3702b9707cdbc56a5b9ef42cec752eb8b3bafc01234558442aa64" +checksum = "1f6c3c3e617595665b8ea2ff95a86066be38fb121ff920a9c0eb282abcd1da5a" dependencies = [ "bitflags 1.3.2", "crc32fast", @@ -3416,16 +3599,16 @@ dependencies = [ [[package]] name = "polling" -version = "3.3.0" +version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e53b6af1f60f36f8c2ac2aad5459d75a5a9b4be1e8cdd40264f315d78193e531" +checksum = "30054e72317ab98eddd8561db0f6524df3367636884b7b21b703e4b280a84a14" dependencies = [ "cfg-if", "concurrent-queue", "pin-project-lite", - "rustix 0.38.21", + "rustix 0.38.31", "tracing", - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -3456,6 +3639,15 @@ dependencies = [ "toml_edit 0.19.15", ] +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.1", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -3488,13 +3680,33 @@ checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" [[package]] name = "proc-macro2" -version = "1.0.69" +version = "1.0.78" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da" +checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" dependencies = [ "unicode-ident", ] +[[package]] +name = "ptr_meta" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0738ccf7ea06b608c10564b31debd4f5bc5e197fc8bfe088f68ae5ce81e7a4f1" +dependencies = [ + "ptr_meta_derive", +] + +[[package]] +name = "ptr_meta_derive" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16b845dbfca988fa33db069c0e230574d15a3088f147a87b64c7589eb662c9ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "quick-xml" version = "0.30.0" @@ -3515,13 +3727,19 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.33" +version = "1.0.35" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" dependencies = [ "proc-macro2", ] +[[package]] +name = "radium" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc33ff2d4973d518d823d61aa239014831e521c75da58e3df4840d3f47749d09" + [[package]] name = "rand" version = "0.7.3" @@ -3582,7 +3800,7 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.12", ] [[package]] @@ -3611,9 +3829,9 @@ checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" [[package]] name = "rayon" -version = "1.8.0" +version = "1.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c27db03db7734835b3f53954b534c91069375ce6ccaa2e065441e07d9b6cdb1" +checksum = "fa7237101a77a10773db45d62004a272517633fbcc3df19d96455ede1122e051" dependencies = [ "either", "rayon-core", @@ -3621,9 +3839,9 @@ dependencies = [ [[package]] name = "rayon-core" -version = "1.12.0" +version = "1.12.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce3fb6ad83f861aac485e76e1985cd109d9a3713802152be56c3b1f0e0658ed" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" dependencies = [ "crossbeam-deque", "crossbeam-utils", @@ -3631,33 +3849,23 @@ dependencies = [ [[package]] name = "rdev" -version = "0.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00552ca2dc2f93b84cd7b5581de49549411e4e41d89e1c691bcb93dc4be360c3" +version = "0.6.3" +source = "git+https://github.com/medzernik/rdev?branch=main#4cff1107d8f63936e1225e7a77a43bcbf61f6233" dependencies = [ - "cocoa 0.22.0", - "core-foundation 0.7.0", - "core-foundation-sys 0.7.0", - "core-graphics 0.19.2", + "cocoa 0.25.0", + "core-foundation", + "core-foundation-sys", + "core-graphics 0.23.1", "epoll", "evdev-rs", "inotify", "lazy_static", "libc", "serde", - "winapi", + "windows-sys 0.48.0", "x11", ] -[[package]] -name = "redox_syscall" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" -dependencies = [ - "bitflags 1.3.2", -] - [[package]] name = "redox_syscall" version = "0.4.1" @@ -3673,20 +3881,20 @@ version = "0.4.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a18479200779601e498ada4e8c1e1f50e3ee19deb0259c25825a98b5603b2cb4" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.12", "libredox", "thiserror", ] [[package]] name = "regex" -version = "1.10.2" +version = "1.10.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" dependencies = [ "aho-corasick", "memchr", - "regex-automata 0.4.3", + "regex-automata 0.4.5", "regex-syntax 0.8.2", ] @@ -3701,9 +3909,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" +checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd" dependencies = [ "aho-corasick", "memchr", @@ -3722,13 +3930,22 @@ version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" +[[package]] +name = "rend" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71fe3824f5629716b1589be05dacd749f6aa084c87e00e016714a8cdfccc997c" +dependencies = [ + "bytecheck", +] + [[package]] name = "reqwest" -version = "0.11.22" +version = "0.11.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b" +checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "bytes", "encoding_rs", "futures-core", @@ -3746,9 +3963,11 @@ dependencies = [ "once_cell", "percent-encoding", "pin-project-lite", + "rustls-pemfile", "serde", "serde_json", "serde_urlencoded", + "sync_wrapper", "system-configuration", "tokio", "tokio-native-tls", @@ -3792,6 +4011,35 @@ version = "0.8.37" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05aaa8004b64fd573fc9d002f4e632d51ad4f026c2b5ba95fcb6c2f32c2c47d8" +[[package]] +name = "rkyv" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cba464629b3394fc4dbc6f940ff8f5b4ff5c7aef40f29166fd4ad12acbc99c0" +dependencies = [ + "bitvec", + "bytecheck", + "bytes", + "hashbrown 0.12.3", + "ptr_meta", + "rend", + "rkyv_derive", + "seahash", + "tinyvec", + "uuid", +] + +[[package]] +name = "rkyv_derive" +version = "0.7.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7dddfff8de25e6f62b9d64e6e432bf1c6736c57d20323e15ee10435fbda7c65" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "rodio" version = "0.17.3" @@ -3805,6 +4053,22 @@ dependencies = [ "symphonia", ] +[[package]] +name = "rust_decimal" +version = "1.34.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "755392e1a2f77afd95580d3f0d0e94ac83eeeb7167552c9b5bca549e61a94d83" +dependencies = [ + "arrayvec", + "borsh", + "bytes", + "num-traits", + "rand 0.8.5", + "rkyv", + "serde", + "serde_json", +] + [[package]] name = "rustc-demangle" version = "0.1.23" @@ -3842,15 +4106,24 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.21" +version = "0.38.31" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b426b0506e5d50a7d8dafcf2e81471400deb602392c7dd110815afb4eaf02a3" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" dependencies = [ - "bitflags 2.4.1", + "bitflags 2.4.2", "errno", "libc", - "linux-raw-sys 0.4.10", - "windows-sys 0.48.0", + "linux-raw-sys 0.4.13", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls-pemfile" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c74cae0a4cf6ccbbf5f359f08efdf8ee7e1dc532573bf0db71968cb56b1448c" +dependencies = [ + "base64 0.21.7", ] [[package]] @@ -3861,9 +4134,9 @@ checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" [[package]] name = "ryu" -version = "1.0.15" +version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ad4cc8da4ef723ed60bced201181d83791ad433213d8c24efffda1eec85d741" +checksum = "f98d2aa92eebf49b69786be48e4477826b256916e84a57ff2a4f21923b48eb4c" [[package]] name = "safemem" @@ -3882,11 +4155,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.22" +version = "0.1.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0c3733bf4cf7ea0880754e19cb5a462007c4a8c1914bff372ccc95b464f1df88" +checksum = "fbc91545643bcf3a0bbb6569265615222618bdf33ce4ffbbd13c4bbd4c093534" dependencies = [ - "windows-sys 0.48.0", + "windows-sys 0.52.0", ] [[package]] @@ -3901,6 +4174,12 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + [[package]] name = "security-framework" version = "2.9.2" @@ -3908,8 +4187,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "05b64fb303737d99b81884b2c63433e9ae28abebe5eb5045dcdd175dc2ecf4de" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.3", - "core-foundation-sys 0.8.4", + "core-foundation", + "core-foundation-sys", "libc", "security-framework-sys", ] @@ -3920,7 +4199,7 @@ version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e932934257d3b408ed8f30db49d85ea163bfe74961f017f405b025af298f0c7a" dependencies = [ - "core-foundation-sys 0.8.4", + "core-foundation-sys", "libc", ] @@ -3946,60 +4225,60 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.20" +version = "1.0.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "836fa6a3e1e547f9a2c4040802ec865b5d85f4014efe00555d7090a3dcaa1090" +checksum = "b97ed7a9823b74f99c7742f5336af7be5ecd3eeafcb1507d1fa93347b1d589b0" dependencies = [ "serde", ] [[package]] name = "serde" -version = "1.0.190" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "91d3c334ca1ee894a2c6f6ad698fe8c435b76d504b13d436f0685d648d6d96f7" +checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.190" +version = "1.0.196" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67c5609f394e5c2bd7fc51efda478004ea80ef42fee983d5c67a65e34f32c0e3" +checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "serde_json" -version = "1.0.108" +version = "1.0.113" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b" +checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79" dependencies = [ - "itoa 1.0.9", + "itoa 1.0.10", "ryu", "serde", ] [[package]] name = "serde_repr" -version = "0.1.17" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145" +checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] name = "serde_spanned" -version = "0.6.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12022b835073e5b11e90a14f86838ceb1c8fb0325b72416845c487ac0fa95e80" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" dependencies = [ "serde", ] @@ -4011,23 +4290,24 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa 1.0.9", + "itoa 1.0.10", "ryu", "serde", ] [[package]] name = "serde_with" -version = "3.4.0" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64cd236ccc1b7a29e7e2739f27c0b2dd199804abc4290e32f59f3b68d6405c23" +checksum = "15d167997bd841ec232f5b2b8e0e26606df2e7caa4c31b95ea9ca52b200bd270" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.1.0", + "indexmap 2.2.2", "serde", + "serde_derive", "serde_json", "serde_with_macros", "time", @@ -4035,14 +4315,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.4.0" +version = "3.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93634eb5f75a2323b16de4748022ac4297f9e76b6dced2be287a099f41b5e788" +checksum = "865f9743393e638991566a8b7a479043c2c8da94a33e0a31f18214c9cae0a64d" dependencies = [ "darling", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -4120,9 +4400,9 @@ dependencies = [ [[package]] name = "shlex" -version = "1.2.0" +version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7cee0529a6d40f580e7a5e6c495c8fbfe21b7b52795ed4bb5e62cdf92bc6380" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" @@ -4139,6 +4419,12 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simdutf8" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27f6278552951f1f2b8cf9da965d10969b2efdea95a6ec47987ab46edfe263a" + [[package]] name = "siphasher" version = "0.3.11" @@ -4156,36 +4442,44 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.11.1" +version = "1.13.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942b4a808e05215192e39f4ab80813e599068285906cc91aa64f923db842bd5a" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" [[package]] name = "smithay-client-toolkit" -version = "0.16.1" +version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "870427e30b8f2cbe64bf43ec4b86e88fe39b0a84b3f15efd9c9c2d020bc86eb9" +checksum = "922fd3eeab3bd820d76537ce8f582b1cf951eceb5475c28500c7457d9d17f53a" dependencies = [ - "bitflags 1.3.2", - "dlib", - "lazy_static", + "bitflags 2.4.2", + "calloop", + "calloop-wayland-source", + "cursor-icon", + "libc", "log", "memmap2", - "nix 0.24.3", - "pkg-config", + "rustix 0.38.31", + "thiserror", + "wayland-backend", "wayland-client", + "wayland-csd-frame", "wayland-cursor", "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", ] [[package]] name = "smithay-clipboard" -version = "0.6.6" +version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a345c870a1fae0b1b779085e81b51e614767c239e93503588e54c5b17f4b0e8" +checksum = "0bb62b280ce5a5cba847669933a0948d00904cf83845c944eae96a4738cea1a6" dependencies = [ + "libc", "smithay-client-toolkit", - "wayland-client", + "wayland-backend", ] [[package]] @@ -4257,6 +4551,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" +[[package]] +name = "str-buf" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e08d8363704e6c71fc928674353e6b7c23dcea9d82d7012c8faf2a3a025f8d0" + [[package]] name = "string_cache" version = "0.8.7" @@ -4352,15 +4652,33 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.39" +version = "2.0.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a" +checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" dependencies = [ "proc-macro2", "quote", "unicode-ident", ] +[[package]] +name = "syn_derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1329189c02ff984e9736652b1631330da25eaa6bc639089ed4915d25446cbe7b" +dependencies = [ + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.48", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + [[package]] name = "sys-locale" version = "0.2.4" @@ -4381,7 +4699,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ba3a3adc5c275d719af8cb4272ea1c4a6d668a777f37e115f6d11ddbc1c8e0e7" dependencies = [ "bitflags 1.3.2", - "core-foundation 0.9.3", + "core-foundation", "system-configuration-sys", ] @@ -4391,7 +4709,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75fb188eb626b924683e3b95e3a48e63551fcfb51949de2f06a9d91dbee93c9" dependencies = [ - "core-foundation-sys 0.8.4", + "core-foundation-sys", "libc", ] @@ -4414,24 +4732,24 @@ version = "6.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2a2d580ff6a20c55dfb86be5f9c238f67835d0e81cbdea8bf5680e0897320331" dependencies = [ - "cfg-expr 0.15.5", + "cfg-expr 0.15.7", "heck 0.4.1", "pkg-config", - "toml 0.8.6", + "toml 0.8.10", "version-compare 0.1.1", ] [[package]] name = "tao" -version = "0.16.5" +version = "0.16.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75f5aefd6be4cd3ad3f047442242fd9f57cbfb3e565379f66b5e14749364fa4f" +checksum = "d22205b267a679ca1c590b9f178488d50981fc3e48a1b91641ae31593db875ce" dependencies = [ "bitflags 1.3.2", "cairo-rs", "cc", "cocoa 0.24.1", - "core-foundation 0.9.3", + "core-foundation", "core-graphics 0.22.3", "crossbeam-channel", "dirs-next", @@ -4481,6 +4799,12 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "tap" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" + [[package]] name = "tar" version = "0.4.40" @@ -4494,18 +4818,18 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.12.12" +version = "0.12.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "14c39fd04924ca3a864207c66fc2cd7d22d7c016007f9ce846cbb9326331930a" +checksum = "69758bda2e78f098e4ccb393021a0963bb3442eac05f135c30f61b7370bbafae" [[package]] name = "tauri" -version = "1.5.2" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9bfe673cf125ef364d6f56b15e8ce7537d9ca7e4dae1cf6fbbdeed2e024db3d9" +checksum = "fd27c04b9543776a972c86ccf70660b517ecabbeced9fb58d8b961a13ad129af" dependencies = [ "anyhow", - "base64 0.21.5", + "base64 0.21.7", "bytes", "cocoa 0.24.1", "dirs-next", @@ -4561,9 +4885,9 @@ dependencies = [ [[package]] name = "tauri-build" -version = "1.5.0" +version = "1.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "defbfc551bd38ab997e5f8e458f87396d2559d05ce32095076ad6c30f7fc5f9c" +checksum = "e9914a4715e0b75d9f387a285c7e26b5bbfeb1249ad9f842675a82481565c532" dependencies = [ "anyhow", "cargo_toml", @@ -4580,11 +4904,11 @@ dependencies = [ [[package]] name = "tauri-codegen" -version = "1.4.1" +version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7b3475e55acec0b4a50fb96435f19631fb58cbcd31923e1a213de5c382536bbb" +checksum = "a1554c5857f65dbc377cefb6b97c8ac77b1cb2a90d30d3448114d5d6b48a77fc" dependencies = [ - "base64 0.21.5", + "base64 0.21.7", "brotli", "ico", "json-patch", @@ -4606,9 +4930,9 @@ dependencies = [ [[package]] name = "tauri-macros" -version = "1.4.1" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613740228de92d9196b795ac455091d3a5fbdac2654abb8bb07d010b62ab43af" +checksum = "277abf361a3a6993ec16bcbb179de0d6518009b851090a01adfea12ac89fa875" dependencies = [ "heck 0.4.1", "proc-macro2", @@ -4623,7 +4947,7 @@ name = "tauri-plugin-log" version = "0.0.0" source = "git+https://github.com/tauri-apps/plugins-workspace?branch=dev#dce0f02bc571128308c30278cde3233f341e6a50" dependencies = [ - "byte-unit", + "byte-unit 4.0.19", "fern", "log", "serde", @@ -4645,9 +4969,9 @@ dependencies = [ [[package]] name = "tauri-runtime" -version = "0.14.1" +version = "0.14.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07f8e9e53e00e9f41212c115749e87d5cd2a9eebccafca77a19722eeecd56d43" +checksum = "cf2d0652aa2891ff3e9caa2401405257ea29ab8372cce01f186a5825f1bd0e76" dependencies = [ "gtk", "http", @@ -4666,10 +4990,11 @@ dependencies = [ [[package]] name = "tauri-runtime-wry" -version = "0.14.1" +version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8141d72b6b65f2008911e9ef5b98a68d1e3413b7a1464e8f85eb3673bb19a895" +checksum = "6cae61fbc731f690a4899681c9052dde6d05b159b44563ace8186fc1bfb7d158" dependencies = [ + "arboard", "cocoa 0.24.1", "gtk", "percent-encoding", @@ -4686,22 +5011,22 @@ dependencies = [ [[package]] name = "tauri-utils" -version = "1.5.0" +version = "1.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34d55e185904a84a419308d523c2c6891d5e2dbcee740c4997eb42e75a7b0f46" +checksum = "ece74810b1d3d44f29f732a7ae09a63183d63949bbdd59c61f8ed2a1b70150db" dependencies = [ "brotli", "ctor", "dunce", "glob", "heck 0.4.1", - "html5ever 0.26.0", - "infer 0.12.0", + "html5ever", + "infer 0.13.0", "json-patch", "kuchikiki", "log", "memchr", - "phf 0.10.1", + "phf 0.11.2", "proc-macro2", "quote", "semver", @@ -4711,7 +5036,7 @@ dependencies = [ "thiserror", "url", "walkdir", - "windows 0.39.0", + "windows-version", ] [[package]] @@ -4736,15 +5061,14 @@ dependencies = [ [[package]] name = "tempfile" -version = "3.8.1" +version = "3.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ef1adac450ad7f4b3c28589471ade84f25f731a7a0fe30d71dfa9f60fd808e5" +checksum = "a365e8cd18e44762ef95d87f284f4b5cd04107fec2ff3052bd6a3e6069669e67" dependencies = [ "cfg-if", "fastrand 2.0.1", - "redox_syscall 0.4.1", - "rustix 0.38.21", - "windows-sys 0.48.0", + "rustix 0.38.31", + "windows-sys 0.52.0", ] [[package]] @@ -4758,15 +5082,6 @@ dependencies = [ "utf-8", ] -[[package]] -name = "termcolor" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6093bad37da69aab9d123a8091e4be0aa4a03e4d601ec641c327398315f62b64" -dependencies = [ - "winapi-util", -] - [[package]] name = "thin-slice" version = "0.1.1" @@ -4775,22 +5090,22 @@ checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" [[package]] name = "thiserror" -version = "1.0.50" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f9a7210f5c9a7156bb50aa36aed4c95afb51df0df00713949448cf9e97d382d2" +checksum = "d54378c645627613241d077a3a79db965db602882668f9136ac42af9ecb730ad" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.50" +version = "1.0.56" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8" +checksum = "fa0faa943b50f3db30a20aa7e265dbc66076993efed8463e8de414e5d06d3471" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -4803,15 +5118,27 @@ dependencies = [ "once_cell", ] +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + [[package]] name = "time" -version = "0.3.30" +version = "0.3.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c4a34ab300f2dee6e562c10a046fc05e358b29f9bf92277f30c3c8d82275f6f5" +checksum = "c8248b6521bb14bc45b4067159b9b6ad792e2d6d754d6c41fb50e29fefe38749" dependencies = [ "deranged", - "itoa 1.0.9", + "itoa 1.0.10", "libc", + "num-conv", "num_threads", "powerfmt", "serde", @@ -4827,10 +5154,11 @@ checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" [[package]] name = "time-macros" -version = "0.2.15" +version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ad70d68dba9e1f8aceda7aa6711965dfec1cac869f311a51bd08b3a2ccbce20" +checksum = "7ba3a3ef41e6672a2f0f001392bb5dcd3ff0a9992d618ca761a11c3121547774" dependencies = [ + "num-conv", "time-core", ] @@ -4851,9 +5179,9 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" [[package]] name = "tokio" -version = "1.33.0" +version = "1.36.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4f38200e3ef7995e5ef13baec2f432a6da0aa9ac495b2c0e8f3b7eec2c92d653" +checksum = "61285f6515fa018fb2d1e46eb21223fff441ee8db5d0f1435e8ab4f5cdb80931" dependencies = [ "backtrace", "bytes", @@ -4870,13 +5198,13 @@ dependencies = [ [[package]] name = "tokio-macros" -version = "2.1.0" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "630bdcf245f78637c13ec01ffae6187cca34625e8c63150d424b59e55af2675e" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -4891,9 +5219,9 @@ dependencies = [ [[package]] name = "tokio-serde" -version = "0.8.0" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "911a61637386b789af998ee23f50aa30d5fd7edcec8d6d3dedae5e5815205466" +checksum = "caf600e7036b17782571dd44fa0a5cea3c82f60db5137f774a325a76a0d6852b" dependencies = [ "bytes", "educe", @@ -4953,14 +5281,14 @@ dependencies = [ [[package]] name = "toml" -version = "0.8.6" +version = "0.8.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ff9e3abce27ee2c9a37f9ad37238c1bdd4e789c84ba37df76aa4d528f5072cc" +checksum = "9a9aad4a3066010876e8dcf5a8a06e70a558751117a145c6ce2b82c2e2054290" dependencies = [ "serde", "serde_spanned", "toml_datetime", - "toml_edit 0.20.7", + "toml_edit 0.22.4", ] [[package]] @@ -4978,7 +5306,7 @@ version = "0.19.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.2", "serde", "serde_spanned", "toml_datetime", @@ -4987,11 +5315,22 @@ dependencies = [ [[package]] name = "toml_edit" -version = "0.20.7" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap 2.2.2", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70f427fce4d84c72b5b732388bf4a9f4531b53f74e2887e3ecb2481f68f66d81" +checksum = "0c9ffdf896f8daaabf9b66ba8e77ea1ed5ed0f72821b398aba62352e95062951" dependencies = [ - "indexmap 2.1.0", + "indexmap 2.2.2", "serde", "serde_spanned", "toml_datetime", @@ -5023,7 +5362,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -5038,9 +5377,9 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.4" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f751112709b4e791d8ce53e32c4ed2d353565a795ce84da2285393f41557bdf2" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" dependencies = [ "log", "once_cell", @@ -5049,9 +5388,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.17" +version = "0.3.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" dependencies = [ "matchers", "nu-ansi-term", @@ -5067,18 +5406,18 @@ dependencies = [ [[package]] name = "treediff" -version = "4.0.2" +version = "4.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "52984d277bdf2a751072b5df30ec0377febdb02f7696d64c2d7d54630bac4303" +checksum = "4d127780145176e2b5d16611cc25a900150e86e9fd79d3bde6ff3a37359c9cb5" dependencies = [ "serde_json", ] [[package]] name = "try-lock" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3528ecfd12c466c6f163363caf2d02a71161dd5e1cc6ae7b34207ea2d42d81ed" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" [[package]] name = "tungstenite" @@ -5107,19 +5446,20 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "uds_windows" -version = "1.0.2" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce65604324d3cce9b966701489fbd0cf318cb1f7bd9dd07ac9a4ee6fb791930d" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" dependencies = [ + "memoffset 0.9.0", "tempfile", "winapi", ] [[package]] name = "unicode-bidi" -version = "0.3.13" +version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "92888ba5573ff080736b3648696b70cafad7d250551175acbaa4e0385b3e1460" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" [[package]] name = "unicode-ident" @@ -5138,15 +5478,15 @@ dependencies = [ [[package]] name = "unicode-segmentation" -version = "1.10.1" +version = "1.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dd624098567895118886609431a7c3b8f516e41d30e0643f03d94592a147e36" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" [[package]] name = "url" -version = "2.4.1" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "143b538f18257fac9cad154828a57c6bf5157e1aa604d4816b5995bf6de87ae5" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" dependencies = [ "form_urlencoded", "idna", @@ -5162,17 +5502,23 @@ checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" [[package]] name = "utf8-width" -version = "0.1.6" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86bd8d4e895da8537e5315b8254664e6b769c4ff3db18321b297a1e7004392e3" + +[[package]] +name = "utf8parse" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5190c9442dcdaf0ddd50f37420417d219ae5261bbf5db120d0f9bab996c9cba1" +checksum = "711b9620af191e0cdc7468a8d14e709c3dcdb115b36f838e601583af800a370a" [[package]] name = "uuid" -version = "1.5.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ad59a7560b41a70d191093a945f0b87bc1deeda46fb237479708a1d6b6cdfc" +checksum = "f00cc9702ca12d3c81455259621e676d0f7251cec66a21e98fe2e9a37db93b2a" dependencies = [ - "getrandom 0.2.10", + "getrandom 0.2.12", ] [[package]] @@ -5183,9 +5529,9 @@ checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" [[package]] name = "value-bag" -version = "1.4.2" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a72e1902dde2bd6441347de2b70b7f5d59bf157c6c62f0c44572607a1d55bbe" +checksum = "126e423afe2dd9ac52142e7e9d5ce4135d7e13776c529d27fd6bc49f19e3280b" [[package]] name = "vcpkg" @@ -5270,9 +5616,9 @@ checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" [[package]] name = "wasm-bindgen" -version = "0.2.88" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7daec296f25a1bae309c0cd5c29c4b260e510e6d813c286b19eaadf409d40fce" +checksum = "c1e124130aee3fb58c5bdd6b639a0509486b0338acaaae0c84a5124b0f588b7f" dependencies = [ "cfg-if", "wasm-bindgen-macro", @@ -5280,24 +5626,24 @@ dependencies = [ [[package]] name = "wasm-bindgen-backend" -version = "0.2.88" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e397f4664c0e4e428e8313a469aaa58310d302159845980fd23b0f22a847f217" +checksum = "c9e7e1900c352b609c8488ad12639a311045f40a35491fb69ba8c12f758af70b" dependencies = [ "bumpalo", "log", "once_cell", "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.38" +version = "0.4.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9afec9963e3d0994cac82455b2b3502b81a7f40f9a0d32181f7528d9f4b43e02" +checksum = "877b9c3f61ceea0e56331985743b13f3d25c406a7098d45180fb5f09bc19ed97" dependencies = [ "cfg-if", "js-sys", @@ -5307,9 +5653,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.88" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5961017b3b08ad5f3fe39f1e79877f8ee7c23c5e5fd5eb80de95abc41f1f16b2" +checksum = "b30af9e2d358182b5c7449424f017eba305ed32a7010509ede96cdc4696c46ed" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -5317,28 +5663,28 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.88" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907" +checksum = "642f325be6301eb8107a83d12a8ac6c1e1c54345a7ef1a9261962dfefda09e66" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.88" +version = "0.2.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b" +checksum = "4f186bd2dcf04330886ce82d6f33dd75a7bfcf69ecf5763b89fcde53b6ac9838" [[package]] name = "wasm-streams" -version = "0.3.0" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7" +checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" dependencies = [ "futures-util", "js-sys", @@ -5348,83 +5694,106 @@ dependencies = [ ] [[package]] -name = "wayland-client" -version = "0.29.5" +name = "wayland-backend" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f3b068c05a039c9f755f881dc50f01732214f5685e379829759088967c46715" +checksum = "9d50fa61ce90d76474c87f5fc002828d81b32677340112b4ef08079a9d459a40" dependencies = [ - "bitflags 1.3.2", + "cc", "downcast-rs", - "libc", - "nix 0.24.3", + "rustix 0.38.31", "scoped-tls", - "wayland-commons", - "wayland-scanner", + "smallvec", "wayland-sys", ] [[package]] -name = "wayland-commons" -version = "0.29.5" +name = "wayland-client" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8691f134d584a33a6606d9d717b95c4fa20065605f798a3f350d78dced02a902" +checksum = "82fb96ee935c2cea6668ccb470fb7771f6215d1691746c2d896b447a00ad3f1f" dependencies = [ - "nix 0.24.3", - "once_cell", - "smallvec", - "wayland-sys", + "bitflags 2.4.2", + "rustix 0.38.31", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-csd-frame" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" +dependencies = [ + "bitflags 2.4.2", + "cursor-icon", + "wayland-backend", ] [[package]] name = "wayland-cursor" -version = "0.29.5" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6865c6b66f13d6257bef1cd40cbfe8ef2f150fb8ebbdb1e8e873455931377661" +checksum = "71ce5fa868dd13d11a0d04c5e2e65726d0897be8de247c0c5a65886e283231ba" dependencies = [ - "nix 0.24.3", + "rustix 0.38.31", "wayland-client", "xcursor", ] [[package]] name = "wayland-protocols" -version = "0.29.5" +version = "0.31.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b950621f9354b322ee817a23474e479b34be96c2e909c14f7bc0100e9a970bc6" +checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" dependencies = [ - "bitflags 1.3.2", + "bitflags 2.4.2", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" +dependencies = [ + "bitflags 2.4.2", + "wayland-backend", "wayland-client", - "wayland-commons", + "wayland-protocols", "wayland-scanner", ] [[package]] name = "wayland-scanner" -version = "0.29.5" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8f4303d8fa22ab852f789e75a967f0a2cdc430a607751c0499bada3e451cbd53" +checksum = "63b3a62929287001986fb58c789dce9b67604a397c15c611ad9f747300b6c283" dependencies = [ "proc-macro2", + "quick-xml 0.31.0", "quote", - "xml-rs", ] [[package]] name = "wayland-sys" -version = "0.29.5" +version = "0.31.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "be12ce1a3c39ec7dba25594b97b42cb3195d54953ddb9d3d95a7c3902bc6e9d4" +checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af" dependencies = [ "dlib", - "lazy_static", + "log", + "once_cell", "pkg-config", ] [[package]] name = "web-sys" -version = "0.3.65" +version = "0.3.68" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5db499c5f66323272151db0e666cd34f78617522fb0c1604d31a27c50c206a85" +checksum = "96565907687f7aceb35bc5fc03770a8a0471d82e479f25832f54a0e3f4b28446" dependencies = [ "js-sys", "wasm-bindgen", @@ -5515,6 +5884,12 @@ dependencies = [ "windows-metadata", ] +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + [[package]] name = "winapi" version = "0.3.9" @@ -5606,7 +5981,7 @@ version = "0.51.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" dependencies = [ - "windows-core", + "windows-core 0.51.1", "windows-targets 0.48.5", ] @@ -5629,6 +6004,15 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.0", +] + [[package]] name = "windows-implement" version = "0.39.0" @@ -5678,6 +6062,15 @@ dependencies = [ "windows-targets 0.48.5", ] +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.0", +] + [[package]] name = "windows-targets" version = "0.42.2" @@ -5708,12 +6101,36 @@ dependencies = [ "windows_x86_64_msvc 0.48.5", ] +[[package]] +name = "windows-targets" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a18201040b24831fbb9e4eb208f8892e1f50a37feb53cc7ff887feb8f50e7cd" +dependencies = [ + "windows_aarch64_gnullvm 0.52.0", + "windows_aarch64_msvc 0.52.0", + "windows_i686_gnu 0.52.0", + "windows_i686_msvc 0.52.0", + "windows_x86_64_gnu 0.52.0", + "windows_x86_64_gnullvm 0.52.0", + "windows_x86_64_msvc 0.52.0", +] + [[package]] name = "windows-tokens" version = "0.39.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f838de2fe15fe6bac988e74b798f26499a8b21a9d97edec321e79b28d1d7f597" +[[package]] +name = "windows-version" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75aa004c988e080ad34aff5739c39d0312f4684699d6d71fc8a198d057b8b9b4" +dependencies = [ + "windows-targets 0.52.0", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -5726,6 +6143,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb7764e35d4db8a7921e09562a0304bf2f93e0a51bfccee0bd0bb0b666b015ea" + [[package]] name = "windows_aarch64_msvc" version = "0.37.0" @@ -5750,6 +6173,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbaa0368d4f1d2aaefc55b6fcfee13f41544ddf36801e793edbbfd7d7df075ef" + [[package]] name = "windows_i686_gnu" version = "0.37.0" @@ -5774,6 +6203,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" +[[package]] +name = "windows_i686_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28637cb1fa3560a16915793afb20081aba2c92ee8af57b4d5f28e4b3e7df313" + [[package]] name = "windows_i686_msvc" version = "0.37.0" @@ -5798,6 +6233,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" +[[package]] +name = "windows_i686_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ffe5e8e31046ce6230cc7215707b816e339ff4d4d67c65dffa206fd0f7aa7b9a" + [[package]] name = "windows_x86_64_gnu" version = "0.37.0" @@ -5822,6 +6263,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6fa32db2bc4a2f5abeacf2b69f7992cd09dca97498da74a151a3132c26befd" + [[package]] name = "windows_x86_64_gnullvm" version = "0.42.2" @@ -5834,6 +6281,12 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a657e1e9d3f514745a572a6846d3c7aa7dbe1658c056ed9c3344c4109a6949e" + [[package]] name = "windows_x86_64_msvc" version = "0.37.0" @@ -5858,11 +6311,17 @@ version = "0.48.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dff9641d1cd4be8d1a070daf9e3773c5f67e78b4d9d42263020c057706765c04" + [[package]] name = "winnow" -version = "0.5.19" +version = "0.5.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "829846f3e3db426d4cee4510841b71a8e58aa2a76b1132579487ae430ccd9c7b" +checksum = "5389a154b01683d28c77f8f68f49dea75f0a4da32557a58f68ee51ebba472d29" dependencies = [ "memchr", ] @@ -5898,17 +6357,15 @@ dependencies = [ [[package]] name = "wooting-macro-backend" -version = "1.0.2" +version = "1.1.0-pre-release" dependencies = [ "anyhow", - "brightness", "copypasta", "dirs 5.0.1", "env_logger", "fastrand 2.0.1", - "futures", "halfbrown", - "itertools 0.11.0", + "itertools", "lazy_static", "log", "obws", @@ -5922,14 +6379,16 @@ dependencies = [ "tauri", "tokio", "tokio-serde", + "url", ] [[package]] name = "wooting-macros" -version = "1.0.2" +version = "1.1.0-pre-release" dependencies = [ + "anyhow", "auto-launch", - "byte-unit", + "byte-unit 5.1.4", "log", "serde", "serde_json", @@ -5944,9 +6403,9 @@ dependencies = [ [[package]] name = "wry" -version = "0.24.4" +version = "0.24.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "88ef04bdad49eba2e01f06e53688c8413bd6a87b0bc14b72284465cf96e3578e" +checksum = "6ad85d0e067359e409fcb88903c3eac817c392e5d638258abfb3da5ad8ba6fc4" dependencies = [ "base64 0.13.1", "block", @@ -5958,9 +6417,9 @@ dependencies = [ "gio", "glib", "gtk", - "html5ever 0.25.2", + "html5ever", "http", - "kuchiki", + "kuchikiki", "libc", "log", "objc", @@ -5980,6 +6439,15 @@ dependencies = [ "windows-implement", ] +[[package]] +name = "wyz" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05f360fc0b24296329c78fda852a1e9ae82de9cf7b27dae4b7f62f118f77b9ed" +dependencies = [ + "tap", +] + [[package]] name = "x11" version = "2.21.0" @@ -5992,11 +6460,12 @@ dependencies = [ [[package]] name = "x11-clipboard" -version = "0.7.1" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "980b9aa9226c3b7de8e2adb11bf20124327c054e0e5812d2aac0b5b5a87e7464" +checksum = "613c2be3e772af2bbb57c5a94413675f5ec668bac00a71ada2ced28c420ef087" dependencies = [ - "x11rb", + "libc", + "x11rb 0.13.0", ] [[package]] @@ -6012,65 +6481,81 @@ dependencies = [ [[package]] name = "x11rb" -version = "0.10.1" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "592b4883219f345e712b3209c62654ebda0bb50887f330cbd018d0f654bfd507" +checksum = "b1641b26d4dec61337c35a1b1aaf9e3cba8f46f0b43636c609ab0291a648040a" dependencies = [ - "gethostname", - "nix 0.24.3", + "gethostname 0.3.0", + "nix 0.26.4", "winapi", "winapi-wsapoll", - "x11rb-protocol", + "x11rb-protocol 0.12.0", +] + +[[package]] +name = "x11rb" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8f25ead8c7e4cba123243a6367da5d3990e0d3affa708ea19dce96356bd9f1a" +dependencies = [ + "gethostname 0.4.3", + "rustix 0.38.31", + "x11rb-protocol 0.13.0", ] [[package]] name = "x11rb-protocol" -version = "0.10.0" +version = "0.12.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56b245751c0ac9db0e006dc812031482784e434630205a93c73cfefcaabeac67" +checksum = "82d6c3f9a0fb6701fab8f6cea9b0c0bd5d6876f1f89f7fada07e558077c344bc" dependencies = [ - "nix 0.24.3", + "nix 0.26.4", ] +[[package]] +name = "x11rb-protocol" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e63e71c4b8bd9ffec2c963173a4dc4cbde9ee96961d4fcb4429db9929b606c34" + [[package]] name = "xattr" -version = "1.0.1" +version = "1.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4686009f71ff3e5c4dbcf1a282d0a44db3f021ba69350cd42086b3e5f1c6985" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" dependencies = [ "libc", + "linux-raw-sys 0.4.13", + "rustix 0.38.31", ] [[package]] name = "xcursor" -version = "0.3.4" +version = "0.3.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "463705a63313cd4301184381c5e8042f0a7e9b4bb63653f216311d4ae74690b7" -dependencies = [ - "nom", -] +checksum = "6a0ccd7b4a5345edfcd0c3535718a4e9ff7798ffc536bb5b5a0e26ff84732911" [[package]] name = "xdg-home" -version = "1.0.0" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2769203cd13a0c6015d515be729c526d041e9cf2c0cc478d57faee85f40c6dcd" +checksum = "21e5a325c3cb8398ad6cf859c1135b25dd29e186679cf2da7581d9679f63b38e" dependencies = [ - "nix 0.26.4", + "libc", "winapi", ] [[package]] -name = "xml-rs" -version = "0.8.19" +name = "xkeysym" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" +checksum = "054a8e68b76250b253f671d1268cb7f1ae089ec35e195b2efb2a4e9a836d0621" [[package]] name = "zbus" -version = "3.14.1" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "31de390a2d872e4cd04edd71b425e29853f786dc99317ed72d73d6fcf5ebb948" +checksum = "c45d06ae3b0f9ba1fb2671268b975557d8f5a84bb5ec6e43964f87e763d8bca8" dependencies = [ "async-broadcast", "async-executor", @@ -6109,11 +6594,11 @@ dependencies = [ [[package]] name = "zbus_macros" -version = "3.14.1" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41d1794a946878c0e807f55a397187c11fc7a038ba5d868e7db4f3bd7760bc9d" +checksum = "b4a1ba45ed0ad344b85a2bb5a1fe9830aed23d67812ea39a586e7d0136439c7d" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "regex", @@ -6134,22 +6619,22 @@ dependencies = [ [[package]] name = "zerocopy" -version = "0.7.25" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8cd369a67c0edfef15010f980c3cbe45d7f651deac2cd67ce097cd801de16557" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.7.25" +version = "0.7.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c2f140bda219a26ccc0cdb03dba58af72590c53b22642577d88a927bc5c87d6b" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.39", + "syn 2.0.48", ] [[package]] @@ -6183,7 +6668,7 @@ version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "934d7a7dfc310d6ee06c87ffe88ef4eca7d3e37bb251dece2ef93da8f17d8ecd" dependencies = [ - "proc-macro-crate", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 1.0.109", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 71b8f218..b843fc41 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -1,12 +1,13 @@ [package] name = "wooting-macros" -version = "1.0.2" +version = "1.1.0-pre-release" +edition = "2021" description = "Macro software made by Wooting." -authors = ["Jeroen N", "Erik S", "Simon W", "David M", "Khang N"] +authors = ["Jeroen N", "Erik S", "Simon W", "David M", "Khang N", "Pola M"] license = "GPL-3.0-only" repository = "https://github.com/WootingKb/wooting-macros" -edition = "2021" - +readme = "../README.md" +publish = false # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [build-dependencies] @@ -16,19 +17,20 @@ tauri-build = { version = "1.5", features = [] } serde_json = "1.0" serde = { version = "1.0", features = ["derive", "rc"] } tauri = { version = "1.5", features = ["app-hide", "app-show", "clipboard-read-text", "clipboard-write-text", "dialog-open", "icon-png", "os-all", "shell-open", "system-tray", "updater"] } -tokio = { version = "1.33", features = ["full"] } -tokio-serde = { version = "0.8", features = ["json"] } +tokio = { version = "1.36", features = ["full"] } +tokio-serde = { version = "0.9", features = ["json"] } wooting-macro-backend = { path = "../wooting-macro-backend" } auto-launch = "0.5" log = "0.4" tauri-plugin-log = { git = "https://github.com/tauri-apps/plugins-workspace", branch = "dev", features= ["colored"] } -byte-unit = "4.0" +byte-unit = "5.1" +anyhow = "1.0" [features] # by default Tauri runs in production mode # when `tauri dev` runs it is executed with `cargo run --no-default-features` if `devPath` is an URL default = ["custom-protocol"] -# this feature is used used for production builds where `devPath` points to the filesystem +# this feature is used for production builds where `devPath` points to the filesystem # DO NOT remove this custom-protocol = ["tauri/custom-protocol"] diff --git a/src-tauri/src/main.rs b/src-tauri/src/main.rs index 0bb0ac95..6e56ceb1 100644 --- a/src-tauri/src/main.rs +++ b/src-tauri/src/main.rs @@ -5,21 +5,23 @@ extern crate core; -use log::*; use std::str::FromStr; use std::time; -use tauri_plugin_log::fern::colors::{Color, ColoredLevelConfig}; - -use byte_unit::{Byte, ByteUnit}; -use std::env::current_exe; +use anyhow::{Context, Error, Result}; +use byte_unit::{Byte, Unit}; +use log::*; use tauri::{ CustomMenuItem, Manager, SystemTray, SystemTrayEvent, SystemTrayMenu, SystemTrayMenuItem, WindowEvent, }; +use tauri_plugin_log::fern::colors::{Color, ColoredLevelConfig}; -use wooting_macro_backend::config::*; use wooting_macro_backend::*; +use wooting_macro_backend::config::*; + +// This is the debug envvar you may wish to set if you want advanced access to debug info from Wootomation. +const DEBUG_ENVVAR: &str = "MACRO_LOG_LEVEL"; #[tauri::command] /// Gets the application config from the current state and sends to frontend. @@ -34,9 +36,11 @@ async fn get_config(state: tauri::State<'_, MacroBackend>) -> Result, config: ApplicationConfig, -) -> Result<(), ()> { - state.set_config(config).await; - Ok(()) +) -> Result<(), String> { + state + .set_config(config) + .await + .map_err(|err| err.to_string()) } #[tauri::command] @@ -51,18 +55,23 @@ async fn get_macros(state: tauri::State<'_, MacroBackend>) -> Result, frontend_data: MacroData, -) -> Result<(), ()> { - state.set_macros(frontend_data).await; - Ok(()) +) -> Result<(), String> { + state + .set_macros(frontend_data) + .await + .map_err(|err| err.to_string()) } #[tauri::command] -async fn get_monitor_data() -> Result, ()> { - #[cfg(any(target_os = "windows", target_os = "linux"))] - return Ok(plugin::system_event::backend_load_monitors().await); - - #[cfg(target_os = "macos")] - return Ok(vec![]); +async fn is_debug() -> Result { + if let Ok(result) = std::env::var(DEBUG_ENVVAR) { + return Ok( + log::LevelFilter::from_str(result.as_str()).map_err(|err| err.to_string())? + >= log::LevelFilter::Debug, + ); + } else { + Ok(false) + } } #[tauri::command] @@ -72,7 +81,36 @@ async fn control_grabbing( frontend_bool: bool, ) -> Result<(), ()> { state.set_is_listening(frontend_bool); - // set_macro_listening(state, frontend_bool); + Ok(()) +} + +/// Enables or disables the automatic startup of Wootomation at system start. +fn init_autostart(app_name: &str, set_autolaunch: bool) -> Result<(), Error> { + let current_exe = std::env::current_exe().context("current EXE not found")?; + + let auto_start = auto_launch::AutoLaunchBuilder::new() + .set_app_name(app_name) + .set_app_path(current_exe.as_path().to_str().unwrap()) + .set_use_launch_agent(true) + .build() + .context("App name is empty, or unsupported OS is used.")?; + + match set_autolaunch { + true => auto_start.enable()?, + false => { + if let Err(e) = auto_start.disable() { + match e { + auto_launch::Error::Io(err) => match err.kind() { + std::io::ErrorKind::NotFound => { + trace!("Autostart is already removed, finished checking."); + } + _ => return Err(err.into()), + }, + _ => return Err(e.into()), + } + } + } + } Ok(()) } @@ -80,72 +118,55 @@ async fn control_grabbing( /// Spawn the backend thread. /// Note: this doesn't work on macOS since we cannot give the thread the proper permissions /// (will crash on key grab/listen) -async fn main() { - let log_level: log::LevelFilter = option_env!("MACRO_LOG_LEVEL") - .and_then(|s| log::LevelFilter::from_str(s).ok()) +async fn main() -> Result<(), Error> { + // The optionENV only takes a string literal and can't be forced to take a const of any type. + let log_level = std::env::var(DEBUG_ENVVAR) + .ok() + .and_then(|s| str::parse::(&s).ok()) .unwrap_or(log::LevelFilter::Info); - wooting_macro_backend::MacroBackend::generate_directories(); + MacroBackend::generate_directories().context("unable to generate config directories")?; let backend = MacroBackend::default(); - info!("Running the macro backend"); - #[cfg(any(target_os = "windows", target_os = "linux"))] - backend.init().await; + // The backend is run only on Windows and Linux, on macOS it won't work. + info!("Running the macro backend"); + if let Err(e) = backend.init().await { + error!("Initialization error: {}", e); + }; + // Read the options from the config. let set_autolaunch: bool = backend.config.read().await.auto_start; let set_launch_minimized: bool = backend.config.read().await.minimize_at_launch; - // Begin the main event loop. This loop cannot run on another thread on MacOS. + // Set the window behaviors (add buttons to the right click tray menu). let quit = CustomMenuItem::new("quit".to_string(), "Quit"); let hide_show = CustomMenuItem::new("hide_show".to_string(), "Hide"); - let tray_menu = SystemTrayMenu::new() .add_item(hide_show) .add_native_item(SystemTrayMenuItem::Separator) .add_item(quit); - let system_tray = SystemTray::new().with_menu(tray_menu); + // Initialize the main application tauri::Builder::default() - // This is where you pass in your commands + // State management is initialized .manage(backend) + // This is where commands shared with frontend are passed .invoke_handler(tauri::generate_handler![ get_macros, set_macros, get_config, set_config, control_grabbing, - get_monitor_data + is_debug ]) .setup(move |app| { let app_name = &app.package_info().name; - let current_exe = current_exe().unwrap(); - - let auto_start = auto_launch::AutoLaunchBuilder::new() - .set_app_name(app_name) - .set_app_path(current_exe.as_path().to_str().unwrap()) - .set_use_launch_agent(true) - .build() - .unwrap(); - - match set_autolaunch { - true => auto_start.enable().unwrap(), - false => { - if let Err(e) = auto_start.disable() { - match e { - auto_launch::Error::Io(err) => match err.kind() { - std::io::ErrorKind::NotFound => { - info!("Autostart is already removed, finished checking.") - } - _ => error!("{}", err), - }, - _ => error!("{}", e), - } - } - } - } + init_autostart(&app_name, set_autolaunch).unwrap_or_else(|err| { + error!("error changing the autostart options: {}", err.to_string()) + }); Ok(()) }) @@ -205,13 +226,16 @@ async fn main() { }) .on_page_load(move |window, _| { if set_launch_minimized { - window.hide().unwrap(); + window.hide().expect("Couldn't hide window"); } }) .on_window_event(move |event| { if let WindowEvent::CloseRequested { api, .. } = event.event() { - if wooting_macro_backend::config::ApplicationConfig::read_data().minimize_to_tray { - event.window().hide().unwrap(); + if ApplicationConfig::read_data() + .expect("error reading config data, can't determine if app is to be terminated or hidden") + .minimize_to_tray + { + event.window().hide().expect("Couldn't hide window"); api.prevent_close(); } } @@ -247,10 +271,10 @@ async fn main() { .debug(Color::Magenta) .trace(Color::White), ) - .max_file_size(Byte::from_unit(16f64, ByteUnit::KiB).unwrap().into()) + .max_file_size(Byte::from_f64_with_unit(16_f64, Unit::KiB).unwrap().into()) .targets([ tauri_plugin_log::LogTarget::Folder( - wooting_macro_backend::config::LogDirPath::file_name(), + LogDirPath::file_name().expect("error getting log folder name"), ), tauri_plugin_log::LogTarget::Stdout, tauri_plugin_log::LogTarget::Webview, @@ -258,5 +282,7 @@ async fn main() { .build(), ) .run(tauri::generate_context!()) - .expect("error while running tauri application"); + .context("error while running tauri application")?; + + Ok(()) } diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 651b5fb9..67a7215c 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -7,7 +7,7 @@ }, "package": { "productName": "Wootomation", - "version": "1.0.2" + "version": "1.1.0-0" }, "tauri": { "allowlist": { diff --git a/src/App.tsx b/src/App.tsx index 1337ef3f..b05bc7a6 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -1,36 +1,74 @@ -import { Flex, useDisclosure, Text, Box } from '@chakra-ui/react' +import { Box, Flex, Text, useDisclosure } from '@chakra-ui/react' import Overview from './views/Overview' import { ViewState } from './constants/enums' import { useApplicationContext } from './contexts/applicationContext' import Macroview from './views/Macroview' import { useEffect } from 'react' -import SettingsModal from './views/SettingsModal' import data from '@emoji-mart/data' import { init } from 'emoji-mart' import './App.css' import { MacroProvider } from './contexts/macroContext' +import MacroSettingsModal from './views/MacroSettingsModal' +import SettingsModal from './views/SettingsModal' function App() { - const { viewState, initComplete } = useApplicationContext() - const { isOpen, onOpen, onClose } = useDisclosure() + const { viewState, initComplete, appDebugMode } = useApplicationContext() + const { + isOpen: isOpenSettings, + onOpen: onOpenSettings, + onClose: onCloseSettings + } = useDisclosure() + const { + isOpen: isOpenMacroSettings, + onOpen: onOpenMacroSettings, + onClose: onCloseMacroSettings + } = useDisclosure() + + useEffect(() => { + if (appDebugMode !== null && !appDebugMode) { + // Disables Tauri right click context menu + const handleContextMenuBlock = (event: MouseEvent): void => { + event.preventDefault() + } + document.addEventListener('contextmenu', handleContextMenuBlock) + + // Ctrl + f is disabled with this event listener to whether the debug mode is on + const handleKeyDownBlock = (event: KeyboardEvent): void => { + if (event.ctrlKey && event.key.toLowerCase() === 'f') { + event.preventDefault() + } + if (event.ctrlKey && event.key.toLowerCase() === 'r') { + event.preventDefault() + } + if (event.key.toLowerCase() === 'f5') { + event.preventDefault() + } + } + document.addEventListener('keydown', handleKeyDownBlock) + + // Disable selectStart + const handleSelectStartBlock = (event: Event): void => { + event.preventDefault() + } + document.addEventListener('selectstart', handleSelectStartBlock) + + return () => { + // Remove the listeners + document.removeEventListener('contextmenu', handleContextMenuBlock) + document.removeEventListener('keydown', handleKeyDownBlock) + document.removeEventListener('selectstart', handleSelectStartBlock) + } + } + }, [appDebugMode]) useEffect(() => { - document.addEventListener('contextmenu', (event) => event.preventDefault()) // disables tauri's right click context menu - // TODO: Figure out how to disable other keyboard shortcuts like CTRL-F init({ data }) }, []) if (!initComplete) { return ( - + Loading... @@ -40,28 +78,31 @@ function App() { return ( - + {viewState === ViewState.Overview && ( - + )} {viewState === ViewState.Addview && ( - + )} {viewState === ViewState.Editview && ( - + )} - + + ) } diff --git a/src/components/EmojiPopover.tsx b/src/components/EmojiPopover.tsx index 473dd8de..2712e872 100644 --- a/src/components/EmojiPopover.tsx +++ b/src/components/EmojiPopover.tsx @@ -1,9 +1,9 @@ import { Box, Popover, - PopoverTrigger, - PopoverContent, PopoverBody, + PopoverContent, + PopoverTrigger, useColorMode } from '@chakra-ui/react' import data from '@emoji-mart/data' diff --git a/src/components/icons.tsx b/src/components/icons.tsx index caedb369..197f9664 100644 --- a/src/components/icons.tsx +++ b/src/components/icons.tsx @@ -1,16 +1,16 @@ import { Icon, IconProps } from '@chakra-ui/react' import { SiDiscord, SiGithub } from 'react-icons/si' import { RxKeyboard } from 'react-icons/rx' -import { BsMouse2 } from 'react-icons/bs' +import { BsMouse2, BsThreeDotsVertical } from 'react-icons/bs' import { SlScreenDesktop } from 'react-icons/sl' import { - HiOutlinePuzzlePiece, - HiArrowUp, HiArrowDown, - HiArrowsUpDown + HiArrowsUpDown, + HiArrowUp, + HiOutlinePuzzlePiece } from 'react-icons/hi2' -import { HiStop, HiPlay } from 'react-icons/hi' -import { BsThreeDotsVertical } from 'react-icons/bs' +import { HiPlay, HiStop } from 'react-icons/hi' +import { RepeatClockIcon } from '@chakra-ui/icons' export const KeyboardIcon = (props: IconProps) => { return @@ -48,3 +48,6 @@ export const StopIcon = (props: IconProps) => { export const RecordIcon = (props: IconProps) => { return } +export const ResetDefaultIcon = (props: IconProps) => { + return +} diff --git a/src/components/leftPanel/SearchBar.tsx b/src/components/leftPanel/SearchBar.tsx new file mode 100644 index 00000000..9bca315f --- /dev/null +++ b/src/components/leftPanel/SearchBar.tsx @@ -0,0 +1,35 @@ +import { Input, useColorModeValue } from '@chakra-ui/react' + +export function SearchBar({ + changeSearchValue + }: { + changeSearchValue: (newValue: string) => void +}) { + const cancelSearchButtonColour = useColorModeValue('#A0AEC0', '#52525b') + const borderColour = useColorModeValue( + 'primary-light.500', + 'primary-dark.500' + ) + + return ( + changeSearchValue(event.target.value)} + /> + ) +} \ No newline at end of file diff --git a/src/components/macrosettings/DefaultMacroSettings.tsx b/src/components/macrosettings/DefaultMacroSettings.tsx new file mode 100644 index 00000000..94cd9130 --- /dev/null +++ b/src/components/macrosettings/DefaultMacroSettings.tsx @@ -0,0 +1,9 @@ +import { Text, VStack } from '@chakra-ui/react' + +export default function DefaultMacroSettings() { + return ( + + Default Macro Settings Coming Soon + + ) +} diff --git a/src/components/macrosettings/MacroSettingsLeftPanel.tsx b/src/components/macrosettings/MacroSettingsLeftPanel.tsx new file mode 100644 index 00000000..654f9519 --- /dev/null +++ b/src/components/macrosettings/MacroSettingsLeftPanel.tsx @@ -0,0 +1,61 @@ +import { Flex, Text, useColorModeValue, VStack } from '@chakra-ui/react' +import useScrollbarStyles from '../../hooks/useScrollbarStyles' +import useBorderColour from '../../hooks/useBorderColour' +import SettingsButton from '../settings/SettingsButton' +import { SettingTabs } from '../../views/MacroSettingsModal' +import { SettingInfo } from '../../constants/SettingsMap' +import { SettingsCategory } from '../../constants/enums' + +interface Props { + pageIndex: number + onSettingsButtonPress: (index: number) => void +} + +export default function MacroSettingsLeftPanel({ + pageIndex, + onSettingsButtonPress +}: Props) { + const panelBg = useColorModeValue('primary-light.50', 'bg-dark') + + return ( + + + + + Macro Specific Settings + + {SettingTabs.map((item, index) => { + const settingItem: SettingInfo = { + displayString: item.title, + pageIndex: index, + category: SettingsCategory.Macro + } + + return ( + + ) + })} + + + + ) +} diff --git a/src/components/macrosettings/NotificationMacroSettingsPanel.tsx b/src/components/macrosettings/NotificationMacroSettingsPanel.tsx new file mode 100644 index 00000000..a69a783d --- /dev/null +++ b/src/components/macrosettings/NotificationMacroSettingsPanel.tsx @@ -0,0 +1,9 @@ +import { Text, VStack } from '@chakra-ui/react' + +export default function NotificationMacroSettingsPanel() { + return ( + + Coming Soon + + ) +} diff --git a/src/components/macroview/UnsavedChangesModal.tsx b/src/components/macroview/UnsavedChangesModal.tsx index f7259259..2cd19988 100644 --- a/src/components/macroview/UnsavedChangesModal.tsx +++ b/src/components/macroview/UnsavedChangesModal.tsx @@ -1,12 +1,12 @@ import { + Button, + Divider, Modal, - ModalOverlay, + ModalBody, ModalContent, + ModalFooter, ModalHeader, - ModalBody, - Divider, - Button, - ModalFooter + ModalOverlay } from '@chakra-ui/react' import { useCallback } from 'react' import { useApplicationContext } from '../../contexts/applicationContext' diff --git a/src/components/macroview/centerPanel/ClearSequenceModal.tsx b/src/components/macroview/centerPanel/ClearSequenceModal.tsx index 3fd3d91b..690a2723 100644 --- a/src/components/macroview/centerPanel/ClearSequenceModal.tsx +++ b/src/components/macroview/centerPanel/ClearSequenceModal.tsx @@ -1,12 +1,12 @@ import { + Button, + Divider, Modal, - ModalOverlay, + ModalBody, ModalContent, + ModalFooter, ModalHeader, - ModalBody, - Divider, - Button, - ModalFooter + ModalOverlay } from '@chakra-ui/react' import { useCallback } from 'react' import { useMacroContext } from '../../../contexts/macroContext' diff --git a/src/components/macroview/centerPanel/SequencingArea.tsx b/src/components/macroview/centerPanel/SequencingArea.tsx index 4fd6a7d1..d7ae8d04 100644 --- a/src/components/macroview/centerPanel/SequencingArea.tsx +++ b/src/components/macroview/centerPanel/SequencingArea.tsx @@ -1,16 +1,16 @@ import { - VStack, - HStack, - Text, - Button, - Divider, Alert, - AlertIcon, AlertDescription, + AlertIcon, + Button, + Divider, + HStack, + IconButton, Stack, + Text, + Tooltip, useDisclosure, - IconButton, - Tooltip + VStack } from '@chakra-ui/react' import { DeleteIcon, SettingsIcon, TimeIcon } from '@chakra-ui/icons' import { useCallback } from 'react' @@ -23,12 +23,14 @@ import { checkIfKeypress, checkIfMouseButton } from '../../../constants/utils' import ClearSequenceModal from './ClearSequenceModal' import { RecordIcon, StopIcon } from '../../icons' import SortableList from './SortableList' +import useMainBgColour from '../../../hooks/useMainBgColour' +import { useApplicationContext } from '../../../contexts/applicationContext' interface Props { - onOpenSettingsModal: () => void + onOpenMacroSettingsModal: () => void } -export default function SequencingArea({ onOpenSettingsModal }: Props) { +export default function SequencingArea({ onOpenMacroSettingsModal }: Props) { const { sequence, willCauseTriggerLooping, @@ -38,6 +40,7 @@ export default function SequencingArea({ onOpenSettingsModal }: Props) { } = useMacroContext() const { config } = useSettingsContext() const { isOpen, onOpen, onClose } = useDisclosure() + const { appDebugMode } = useApplicationContext() const onItemChanged = useCallback( ( @@ -128,7 +131,7 @@ export default function SequencingArea({ onOpenSettingsModal }: Props) { useRecordingSequence(onItemChanged) return ( - + {/** Header */} - - Sequence - {willCauseTriggerLooping && ( + + Sequence + - - + + + } size={['xs', 'sm', 'md']} - onClick={onOpenSettingsModal} + onClick={onOpenMacroSettingsModal} /> diff --git a/src/components/macroview/centerPanel/SortableList.tsx b/src/components/macroview/centerPanel/SortableList.tsx index d998f20c..38d60c1e 100644 --- a/src/components/macroview/centerPanel/SortableList.tsx +++ b/src/components/macroview/centerPanel/SortableList.tsx @@ -1,14 +1,14 @@ -import { VStack } from '@chakra-ui/react' +import { useColorModeValue, VStack } from '@chakra-ui/react' import { - DndContext, closestCenter, + DndContext, + DragEndEvent, DragOverlay, - useSensors, - useSensor, - PointerSensor, + DragStartEvent, KeyboardSensor, - DragEndEvent, - DragStartEvent + PointerSensor, + useSensor, + useSensors } from '@dnd-kit/core' import { restrictToVerticalAxis } from '@dnd-kit/modifiers' import { @@ -38,6 +38,7 @@ export default function SortableList({ recording, stopRecording }: Props) { coordinateGetter: sortableKeyboardCoordinates }) ) + const backgroundColor = useColorModeValue("primary-light.100", "bg-dark") const handleDragEnd = useCallback( (event: DragEndEvent) => { @@ -76,9 +77,11 @@ export default function SortableList({ recording, stopRecording }: Props) { > diff --git a/src/components/macroview/centerPanel/sortableElement/SortableItem.tsx b/src/components/macroview/centerPanel/sortableElement/SortableItem.tsx index e71b21e7..100e9d28 100644 --- a/src/components/macroview/centerPanel/sortableElement/SortableItem.tsx +++ b/src/components/macroview/centerPanel/sortableElement/SortableItem.tsx @@ -1,18 +1,18 @@ -import { TimeIcon, EditIcon } from '@chakra-ui/icons' +import { TimeIcon } from '@chakra-ui/icons' import { Box, Divider, Flex, HStack, - IconButton, Menu, MenuButton, MenuItem, MenuList, Text, - useColorModeValue + useColorModeValue, + VStack } from '@chakra-ui/react' -import { useMemo, useCallback } from 'react' +import React, { useCallback, useMemo } from 'react' import { useMacroContext } from '../../../../contexts/macroContext' import { ActionEventType } from '../../../../types' import { @@ -34,12 +34,7 @@ interface Props { stopRecording: () => void } -export default function SortableItem({ - id, - element, - recording, - stopRecording -}: Props) { +export default function SortableItem({ id, element, recording }: Props) { const isEditable = checkIfElementIsEditable(element) const displayText = getElementDisplayString(element) const { @@ -101,14 +96,6 @@ export default function SortableItem({ if (checkIfElementIsEditable(element)) updateSelectedElementId(id - 1) }, [element, id, isSelected, recording, updateSelectedElementId]) - const onEditButtonPress = useCallback(() => { - stopRecording() - if (isSelected) { - return - } - updateSelectedElementId(id - 1) - }, [id, isSelected, stopRecording, updateSelectedElementId]) - const onDeleteButtonPress = useCallback(() => { if (isSelected) { updateSelectedElementId(undefined) @@ -116,12 +103,21 @@ export default function SortableItem({ onElementDelete(id - 1) }, [id, isSelected, onElementDelete, updateSelectedElementId]) + const secondBg = useColorModeValue('primary-light.0', 'primary-dark.800') + return ( @@ -211,24 +207,18 @@ export default function SortableItem({ )} - {isEditable && ( - } - size={['xs', 'sm']} - onClick={onEditButtonPress} - /> - )} - + {/*To center the 3-dot menu properly, it needs to be wrapped in a VStack*/} + + + Duplicate diff --git a/src/components/macroview/centerPanel/sortableElement/SortableWrapper.tsx b/src/components/macroview/centerPanel/sortableElement/SortableWrapper.tsx index e4a796fb..7592633d 100644 --- a/src/components/macroview/centerPanel/sortableElement/SortableWrapper.tsx +++ b/src/components/macroview/centerPanel/sortableElement/SortableWrapper.tsx @@ -1,11 +1,12 @@ import { ReactNode } from 'react' import { DragHandleIcon } from '@chakra-ui/icons' -import { HStack, useColorModeValue, Center } from '@chakra-ui/react' +import { Center, HStack, useColorModeValue } from '@chakra-ui/react' import { useSortable } from '@dnd-kit/sortable' import { CSS } from '@dnd-kit/utilities' import { useMacroContext } from '../../../../contexts/macroContext' import useMainBgColour from '../../../../hooks/useMainBgColour' + interface Props { id: number isSmall: boolean @@ -37,7 +38,8 @@ export default function SortableWrapper({ id, isSmall, children }: Props) { const style = { transform: CSS.Transform.toString(transform), transition, - opacity: isDragging ? 0 : 1 + opacity: isDragging ? 0 : 1, + rounded: 'md' } return ( @@ -46,7 +48,7 @@ export default function SortableWrapper({ id, isSmall, children }: Props) { style={style} {...attributes} w={isSmall ? 'fit-content' : 'full'} - rounded="md" + rounded='md' spacing="0px" bg={ selectedElementId !== undefined && id === selectedElementId + 1 @@ -61,8 +63,8 @@ export default function SortableWrapper({ id, isSmall, children }: Props) { px={4} h="full" bg={handleBg} - roundedLeft="md" cursor="grab" + roundedLeft='md' > diff --git a/src/components/macroview/leftPanel/AccordionComponents/KeyboardKeysSection.tsx b/src/components/macroview/leftPanel/AccordionComponents/KeyboardKeysSection.tsx index d6965e42..02582b2f 100644 --- a/src/components/macroview/leftPanel/AccordionComponents/KeyboardKeysSection.tsx +++ b/src/components/macroview/leftPanel/AccordionComponents/KeyboardKeysSection.tsx @@ -1,18 +1,19 @@ import { - AccordionItem, AccordionButton, - Flex, AccordionIcon, + AccordionItem, AccordionPanel, + AspectRatio, + Flex, Grid, - GridItem, - AspectRatio + GridItem } from '@chakra-ui/react' import { KeyType } from '../../../../constants/enums' import { HidInfo } from '../../../../constants/HIDmap' import { KeyboardKeyCategory } from '../../../../types' import { KeyboardIcon } from '../../../icons' import SelectElementButton from '../SelectElementButton' +import { DefaultMacroDelay } from '../../../../constants' interface Props { keyboardKeyCategories: KeyboardKeyCategory[] @@ -55,9 +56,7 @@ export default function KeyboardKeysSection({ keyboardKeyCategories }: Props) { @@ -38,8 +39,8 @@ export default function MouseButtonsSection({ elementsToRender }: Props) { h="fit" columns={{ base: 2, - md: 4, - xl: 6 + md: 3, + xl: 4 }} px={4} spacing={2} @@ -55,7 +56,7 @@ export default function MouseButtonsSection({ elementsToRender }: Props) { data: { type: 'DownUp', button: info.enumVal, - duration: 20 + duration: DefaultMouseDelay } } }} diff --git a/src/components/macroview/leftPanel/AccordionComponents/PluginsSection.tsx b/src/components/macroview/leftPanel/AccordionComponents/PluginsSection.tsx index 00dbc175..a365309d 100644 --- a/src/components/macroview/leftPanel/AccordionComponents/PluginsSection.tsx +++ b/src/components/macroview/leftPanel/AccordionComponents/PluginsSection.tsx @@ -3,14 +3,10 @@ import { AccordionIcon, AccordionItem, AccordionPanel, - AspectRatio, Flex, - Grid, - GridItem + Grid } from '@chakra-ui/react' -import { PluginEventInfo } from '../../../../constants/PluginsEventMap' import { PluginCategory } from '../../../../types' -import SelectElementButton from '../SelectElementButton' interface Props { pluginCategories: PluginCategory[] @@ -27,7 +23,7 @@ export default function PluginsSection({ pluginCategories }: Props) { as="span" flex="1" textAlign="left" - fontWeight={'semibold'} + fontWeight="semibold" alignItems="center" gap={2} > diff --git a/src/components/macroview/leftPanel/AccordionComponents/SelectAreaAccordion.tsx b/src/components/macroview/leftPanel/AccordionComponents/SelectAreaAccordion.tsx index 7f3df706..cda4df90 100644 --- a/src/components/macroview/leftPanel/AccordionComponents/SelectAreaAccordion.tsx +++ b/src/components/macroview/leftPanel/AccordionComponents/SelectAreaAccordion.tsx @@ -1,20 +1,13 @@ -import { - Accordion, - Flex, - Text, - Divider, -} from '@chakra-ui/react' +import { Accordion, Divider, Flex, Text } from '@chakra-ui/react' import { useMemo } from 'react' -import { HIDCategory, PluginGroup } from '../../../../constants/enums' +import { HIDCategory } from '../../../../constants/enums' import { Hid } from '../../../../constants/HIDmap' import { SystemEvent } from '../../../../constants/SystemEventMap' import MouseButtonsSection from './MouseButtonsSection' import SystemEventsSection from './SystemEventsSection' import { MouseInput } from '../../../../constants/MouseMap' import KeyboardKeysSection from './KeyboardKeysSection' -import PluginsSection from './PluginsSection' -import { Plugin } from '../../../../constants/PluginsEventMap' -import { KeyboardKeyCategory, PluginCategory } from '../../../../types' +import { KeyboardKeyCategory } from '../../../../types' import useScrollbarStyles from '../../../../hooks/useScrollbarStyles' interface Props { @@ -51,7 +44,8 @@ export default function SelectAreaAccordion({ searchValue }: Props) { const elements = keyboardKeyElements.filter((element) => { return HIDCategory[element.category] === categoryName }) - if (elements.length > 0) temp.push({ name: categoryName, elements: elements }) + if (elements.length > 0) + temp.push({ name: categoryName, elements: elements }) } return temp }, [keyboardKeyElements]) diff --git a/src/components/macroview/leftPanel/AccordionComponents/SystemEventsSection.tsx b/src/components/macroview/leftPanel/AccordionComponents/SystemEventsSection.tsx index 53ebb9f3..138e6454 100644 --- a/src/components/macroview/leftPanel/AccordionComponents/SystemEventsSection.tsx +++ b/src/components/macroview/leftPanel/AccordionComponents/SystemEventsSection.tsx @@ -47,7 +47,7 @@ export default function SystemEventsSection({ elementsToRender }: Props) { {elementsToRender.map((info: SystemEventInfo) => ( void +} + +export default function SelectElementArea({ + searchValue, + changeSearchValue +}: Props) { const borderColour = useColorModeValue( 'primary-light.500', 'primary-dark.500' @@ -20,17 +26,22 @@ export default function SelectElementArea() { return ( - + Elements setSearchValue(event.target.value)} + onChange={(event) => changeSearchValue(event.target.value)} sx={{ '&::-webkit-search-cancel-button': { WebkitAppearance: 'none', @@ -43,7 +54,7 @@ export default function SelectElementArea() { }} /> - + ) } diff --git a/src/components/macroview/leftPanel/SelectElementButton.tsx b/src/components/macroview/leftPanel/SelectElementButton.tsx index 28d14b65..b1b8b1d2 100644 --- a/src/components/macroview/leftPanel/SelectElementButton.tsx +++ b/src/components/macroview/leftPanel/SelectElementButton.tsx @@ -6,8 +6,8 @@ import { ActionEventType } from '../../../types' interface Props { properties: ActionEventType - nameText: string, - descText?: string, + nameText: string + descText?: string } export default function SelectElementButton({ @@ -51,7 +51,12 @@ export default function SelectElementButton({ ]) return ( - + - - {nameText} - + + {nameText} + ) diff --git a/src/components/macroview/rightPanel/EditArea.tsx b/src/components/macroview/rightPanel/EditArea.tsx index 49ee16f3..9c07da41 100644 --- a/src/components/macroview/rightPanel/EditArea.tsx +++ b/src/components/macroview/rightPanel/EditArea.tsx @@ -1,5 +1,5 @@ -import { VStack, Text } from '@chakra-ui/react' -import { useMemo } from 'react' +import { Box, HStack, Text, useColorModeValue, VStack } from '@chakra-ui/react' +import React, { useMemo } from 'react' import { useMacroContext } from '../../../contexts/macroContext' import { useSelectedElement } from '../../../contexts/selectors' import useMainBgColour from '../../../hooks/useMainBgColour' @@ -9,6 +9,36 @@ import KeyPressForm from './editForms/KeyPressForm' import MousePressForm from './editForms/MousePressForm' import SystemEventActionForm from './editForms/SystemEventActionForm' +export function BoxText({ children }: { children: string }) { + const bg = useColorModeValue('primary-light.50', 'primary-dark.700') + const kebabColour = useColorModeValue('primary-light.500', 'primary-dark.500') + + return ( + + Editing element + + + {children} + + + + ) +} + export default function EditArea() { const selectedElement = useSelectedElement() const { selectedElementId } = useMacroContext() @@ -61,9 +91,6 @@ export default function EditArea() { px={[2, 4, 6]} pt={[2, 4]} > - - Edit Element - {SelectedElementFormComponent} ) diff --git a/src/components/macroview/rightPanel/editForms/ClipboardForm.tsx b/src/components/macroview/rightPanel/editForms/ClipboardForm.tsx index 4a981408..e4ca14e8 100644 --- a/src/components/macroview/rightPanel/editForms/ClipboardForm.tsx +++ b/src/components/macroview/rightPanel/editForms/ClipboardForm.tsx @@ -1,16 +1,18 @@ import { + Box, Divider, - Textarea, - Text, HStack, - Box, - useColorMode + Text, + Textarea, + useColorMode, + useColorModeValue } from '@chakra-ui/react' -import { useState, useEffect, useCallback, useRef } from 'react' +import React, { useCallback, useEffect, useRef, useState } from 'react' import { useMacroContext } from '../../../../contexts/macroContext' import data from '@emoji-mart/data' import Picker from '@emoji-mart/react' import { SystemEventAction } from '../../../../types' +import { BoxText } from '../EditArea' interface Props { selectedElementId: number @@ -26,6 +28,8 @@ export default function ClipboardForm({ const [showEmojiPicker, setShowEmojiPicker] = useState(false) const { updateElement } = useMacroContext() const { colorMode } = useColorMode() + const bg = useColorModeValue('primary-light.50', 'primary-dark.700') + const kebabColour = useColorModeValue('primary-light.500', 'primary-dark.500') useEffect(() => { if ( @@ -104,9 +108,9 @@ export default function ClipboardForm({ return ( <> - - Paste Text - + + Clipboard + diff --git a/src/components/macroview/rightPanel/editForms/DelayForm.tsx b/src/components/macroview/rightPanel/editForms/DelayForm.tsx index f5c7c723..060f0245 100644 --- a/src/components/macroview/rightPanel/editForms/DelayForm.tsx +++ b/src/components/macroview/rightPanel/editForms/DelayForm.tsx @@ -1,8 +1,22 @@ -import { Divider, Grid, GridItem, Input, Button, Text } from '@chakra-ui/react' -import { useCallback, useEffect, useState } from 'react' +import { + Button, + Divider, + Grid, + GridItem, + HStack, + Input, + Text, + useColorModeValue, + useToast, + VStack +} from '@chakra-ui/react' +import React, { useCallback, useEffect, useState } from 'react' import { useMacroContext } from '../../../../contexts/macroContext' -import { useSettingsContext } from '../../../../contexts/settingsContext' import { DelayEventAction } from '../../../../types' +import { DefaultDelayDelay } from '../../../../constants' +import { ResetDefaultIcon } from '../../../icons' +import { useSettingsContext } from '../../../../contexts/settingsContext' +import { BoxText } from '../EditArea' interface Props { selectedElementId: number @@ -13,9 +27,14 @@ export default function DelayForm({ selectedElementId, selectedElement }: Props) { - const [delayDuration, setDelayDuration] = useState("0") + const config = useSettingsContext() + const [delayDuration, setDelayDuration] = useState( + config.config.DefaultDelayValue + ) const { updateElement } = useMacroContext() - const { config } = useSettingsContext() + const bg = useColorModeValue('primary-light.50', 'primary-dark.700') + const kebabColour = useColorModeValue('primary-light.500', 'primary-dark.500') + const toast = useToast() useEffect(() => { if ( @@ -24,74 +43,95 @@ export default function DelayForm({ ) return - setDelayDuration(selectedElement.data.toString()) + setDelayDuration(selectedElement.data) }, [selectedElement]) const onDelayDurationChange = useCallback( (event: React.ChangeEvent) => { - - setDelayDuration(event.target.value) + setDelayDuration(Number(event.target.value)) }, [setDelayDuration] ) const onInputBlur = useCallback(() => { - let duration - if (delayDuration === '') { - duration = 0; - } else { + let duration = delayDuration - duration = parseInt(delayDuration) - if (Number.isNaN(duration)) { - return - } + if (delayDuration < 1) { + toast({ + title: 'Minimum duration applied', + description: 'Applied minimum duration of 1ms', + status: 'info', + duration: 4000, + isClosable: true + }) + duration = 1 + } else if (Number.isNaN(duration)) { + return } - + const temp: DelayEventAction = { ...selectedElement, data: duration } updateElement(temp, selectedElementId) - }, [delayDuration, selectedElement, selectedElementId, updateElement]) + }, [delayDuration, selectedElement, selectedElementId, toast, updateElement]) - const resetDuration = useCallback(() => { - setDelayDuration(config.DefaultDelayValue.toString()) + const onResetClick = useCallback(() => { + toast({ + title: 'Default duration applied', + description: `Applied default duration of ${config.config.DefaultDelayValue}ms`, + status: 'info', + duration: 4000, + isClosable: true + }) + setDelayDuration(config.config.DefaultDelayValue) const temp: DelayEventAction = { ...selectedElement, - data: config.DefaultDelayValue + data: config.config.DefaultDelayValue } updateElement(temp, selectedElementId) }, [ - config.DefaultDelayValue, + toast, + config.config.DefaultDelayValue, selectedElement, - selectedElementId, - updateElement + updateElement, + selectedElementId ]) return ( <> - - Delay Element - + + Editing element + Delay + - + Duration (ms) - + - + + - ) } diff --git a/src/components/macroview/rightPanel/editForms/KeyPressForm.tsx b/src/components/macroview/rightPanel/editForms/KeyPressForm.tsx index ecaa3eb9..ce4cbefc 100644 --- a/src/components/macroview/rightPanel/editForms/KeyPressForm.tsx +++ b/src/components/macroview/rightPanel/editForms/KeyPressForm.tsx @@ -1,19 +1,31 @@ import { + Button, Divider, + Flex, Grid, GridItem, - Flex, - Button, + HStack, Input, - Text + Text, + useColorModeValue, + useToast, + VStack } from '@chakra-ui/react' -import { useCallback, useEffect, useState } from 'react' +import React, { useCallback, useEffect, useState } from 'react' import { useMacroContext } from '../../../../contexts/macroContext' import { KeyType } from '../../../../constants/enums' -import { HIDLookup } from '../../../../constants/HIDmap' -import { DownArrowIcon, DownUpArrowsIcon, UpArrowIcon } from '../../../icons' +import { + DownArrowIcon, + DownUpArrowsIcon, + ResetDefaultIcon, + UpArrowIcon +} from '../../../icons' import { KeyPressEventAction } from '../../../../types' +import { BoxText } from '../EditArea' +import { HIDLookup } from '../../../../constants/HIDmap' +import { DefaultMacroDelay } from "../../../../constants"; + interface Props { selectedElementId: number selectedElement: KeyPressEventAction @@ -23,10 +35,12 @@ export default function KeyPressForm({ selectedElementId, selectedElement }: Props) { - const [headingText, setHeadingText] = useState('') - const [keypressDuration, setKeypressDuration] = useState("1") + const [keypressDuration, setKeypressDuration] = useState(DefaultMacroDelay) const [keypressType, setKeypressType] = useState() const { updateElement } = useMacroContext() + const bg = useColorModeValue('primary-light.50', 'primary-dark.700') + const kebabColour = useColorModeValue('primary-light.500', 'primary-dark.500') + const toast = useToast() useEffect(() => { if ( @@ -37,26 +51,29 @@ export default function KeyPressForm({ const typeString = selectedElement.data.keytype as keyof typeof KeyType setKeypressType(KeyType[typeString]) - setKeypressDuration(selectedElement.data.press_duration.toString()) - setHeadingText( - `Key ${HIDLookup.get(selectedElement.data.keypress)?.displayString}` - ) - }, [selectedElement]) + setKeypressDuration(keypressDuration) + }, [bg, kebabColour, selectedElement, keypressDuration]) const onKeypressDurationChange = useCallback( (event: React.ChangeEvent) => { - setKeypressDuration(event.target.value) + setKeypressDuration(Number(event.target.value)) }, [setKeypressDuration] ) const onInputBlur = useCallback(() => { - let duration - if (keypressDuration === '') { - duration = 0; - } else { + let duration = DefaultMacroDelay - duration = parseInt(keypressDuration) + if (keypressDuration >= DefaultMacroDelay) { + duration = keypressDuration + } else { + toast({ + title: 'Minimum duration', + description: `Duration must be at least ${DefaultMacroDelay}ms`, + status: 'warning', + duration: 4000, + isClosable: true + }) if (Number.isNaN(duration)) { return } @@ -67,7 +84,31 @@ export default function KeyPressForm({ data: { ...selectedElement.data, press_duration: duration } } updateElement(temp, selectedElementId) - }, [keypressDuration, selectedElement, selectedElementId, updateElement]) + }, [ + keypressDuration, + selectedElement, + selectedElementId, + toast, + updateElement + ]) + + const onResetClick = useCallback(() => { + toast({ + title: 'Default duration applied', + description: `Applied default duration of ${DefaultMacroDelay}ms`, + status: 'info', + duration: 4000, + isClosable: true + }) + + setKeypressDuration(DefaultMacroDelay) + + const temp: KeyPressEventAction = { + ...selectedElement, + data: { ...selectedElement.data, press_duration: DefaultMacroDelay } + } + updateElement(temp, selectedElementId) + }, [toast, selectedElement, updateElement, selectedElementId]) const onKeypressTypeChange = useCallback( (newType: KeyType) => { @@ -83,11 +124,13 @@ export default function KeyPressForm({ return ( <> - - {headingText} - + + + {HIDLookup.get(selectedElement.data.keypress)?.displayString ?? ''} + + - + Type of keystroke @@ -100,7 +143,7 @@ export default function KeyPressForm({ justifyContent="space-around" > + )} diff --git a/src/components/macroview/rightPanel/editForms/MousePressForm.tsx b/src/components/macroview/rightPanel/editForms/MousePressForm.tsx index 0d414477..c1478c56 100644 --- a/src/components/macroview/rightPanel/editForms/MousePressForm.tsx +++ b/src/components/macroview/rightPanel/editForms/MousePressForm.tsx @@ -1,19 +1,30 @@ import { + Button, Divider, + Flex, Grid, GridItem, - Flex, - Button, Input, - Text + Text, + useColorModeValue, + useToast, + VStack } from '@chakra-ui/react' -import { useCallback, useEffect, useState } from 'react' +import React, { useCallback, useEffect, useState } from 'react' import { useMacroContext } from '../../../../contexts/macroContext' import { KeyType } from '../../../../constants/enums' import { mouseEnumLookup } from '../../../../constants/MouseMap' -import { DownArrowIcon, DownUpArrowsIcon, UpArrowIcon } from '../../../icons' +import { + DownArrowIcon, + DownUpArrowsIcon, + ResetDefaultIcon, + UpArrowIcon +} from '../../../icons' import { MouseEventAction } from '../../../../types' +import { DefaultMouseDelay } from '../../../../constants' +import { BoxText } from '../EditArea' + interface Props { selectedElementId: number selectedElement: MouseEventAction @@ -23,27 +34,34 @@ export default function MousePressForm({ selectedElementId, selectedElement }: Props) { - const [headingText, setHeadingText] = useState('') - const [mousepressDuration, setMousepressDuration] = useState("1") + const [headingText, setHeadingText] = useState('') + const [mousepressDuration, setMousepressDuration] = + useState(DefaultMouseDelay) const [mousepressType, setMousepressType] = useState() const { updateElement } = useMacroContext() + const bg = useColorModeValue('primary-light.50', 'primary-dark.700') + const kebabColour = useColorModeValue('primary-light.500', 'primary-dark.500') + const toast = useToast() useEffect(() => { const typeString: keyof typeof KeyType = selectedElement.data.data .type as keyof typeof KeyType setMousepressType(KeyType[typeString]) if (selectedElement.data.data.type === 'DownUp') { - setMousepressDuration(selectedElement.data.data.duration.toString()) + setMousepressDuration(selectedElement.data.data.duration) } + setHeadingText( - `${mouseEnumLookup.get(selectedElement.data.data.button)?.displayString}` + + {mouseEnumLookup.get(selectedElement.data.data.button)?.displayString ?? + ''} + ) - }, [selectedElement]) + }, [bg, kebabColour, selectedElement]) const onMousepressDurationChange = useCallback( (event: React.ChangeEvent) => { - - setMousepressDuration(event.target.value) + setMousepressDuration(Number(event.target.value)) }, [setMousepressDuration] ) @@ -52,15 +70,20 @@ export default function MousePressForm({ if (selectedElement.data.data.type !== 'DownUp') { return } - let duration - if (mousepressDuration === '') { - duration = 0; - } else { + let duration = DefaultMouseDelay - duration = parseInt(mousepressDuration) - if (Number.isNaN(duration)) { - return - } + if (mousepressDuration >= DefaultMouseDelay) { + duration = mousepressDuration + } else if (mousepressDuration < DefaultMouseDelay) { + toast({ + title: 'Minimum duration', + description: `Duration must be at least ${DefaultMouseDelay}ms`, + status: 'warning', + duration: 4000, + isClosable: true + }) + } else if (Number.isNaN(duration)) { + return } const temp: MouseEventAction = { @@ -74,7 +97,13 @@ export default function MousePressForm({ } } updateElement(temp, selectedElementId) - }, [mousepressDuration, selectedElement, selectedElementId, updateElement]) + }, [ + mousepressDuration, + selectedElement, + selectedElementId, + toast, + updateElement + ]) const onMousepressTypeChange = useCallback( (newType: KeyType) => { @@ -102,7 +131,9 @@ export default function MousePressForm({ ...temp.data.data, type: 'DownUp', duration: - temp.data.data.type === 'DownUp' ? temp.data.data.duration : 1 + temp.data.data.type === 'DownUp' + ? temp.data.data.duration + : DefaultMouseDelay } } } @@ -115,13 +146,41 @@ export default function MousePressForm({ [selectedElement, selectedElementId, updateElement] ) + const onResetClick = useCallback(() => { + if (selectedElement.data.data.type !== 'DownUp') { + return + } + + toast({ + title: 'Default duration applied', + description: `Applied default duration of ${DefaultMouseDelay}ms`, + status: 'info', + duration: 4000, + isClosable: true + }) + + setMousepressDuration(DefaultMouseDelay) + + const temp: MouseEventAction = { + ...selectedElement, + data: { + ...selectedElement.data, + data: { + ...selectedElement.data.data, + duration: DefaultMouseDelay + } + } + } + updateElement(temp, selectedElementId) + }, [toast, selectedElement, updateElement, selectedElementId]) + return ( <> {headingText} - + Type of keystroke @@ -134,7 +193,7 @@ export default function MousePressForm({ justifyContent="space-around" > + )} diff --git a/src/components/macroview/rightPanel/editForms/OpenEventForm.tsx b/src/components/macroview/rightPanel/editForms/OpenEventForm.tsx index b0f420c7..6101e1c1 100644 --- a/src/components/macroview/rightPanel/editForms/OpenEventForm.tsx +++ b/src/components/macroview/rightPanel/editForms/OpenEventForm.tsx @@ -1,9 +1,10 @@ import { Button, Divider, Text, Textarea, VStack } from '@chakra-ui/react' -import { useCallback, useEffect, useState } from 'react' +import React, { useCallback, useEffect, useState } from 'react' import { useMacroContext } from '../../../../contexts/macroContext' -import { open } from '@tauri-apps/api/dialog' +import { dialog } from '@tauri-apps/api' import { sysEventLookup } from '../../../../constants/SystemEventMap' import { SystemEventAction } from '../../../../types' +import { BoxText } from '../EditArea' interface Props { selectedElement: SystemEventAction @@ -15,7 +16,7 @@ export default function OpenEventForm({ selectedElement }: Props) { const [subtype, setSubtype] = useState<'File' | 'Directory' | 'Website'>() - const [headerText, setHeaderText] = useState('') + const [headerText, setHeaderText] = useState('') const [subHeaderText, setSubHeaderText] = useState('') const [path, setPath] = useState('') const { updateElement } = useMacroContext() @@ -40,7 +41,10 @@ export default function OpenEventForm({ break } setHeaderText( - sysEventLookup.get(selectedElement.data.action.type)?.displayString || '' + + {sysEventLookup.get(selectedElement.data.action.type)?.displayString || + ''} + ) setPath(selectedElement.data.action.data) }, [selectedElement]) @@ -67,7 +71,7 @@ export default function OpenEventForm({ const onButtonPress = useCallback( async (isDirectory: boolean) => { if (isDirectory) { - const dir = await open({ + const dir = await dialog.open({ directory: true, multiple: false, title: 'Select a directory to open' @@ -85,7 +89,7 @@ export default function OpenEventForm({ } updateElement(temp, selectedElementId) } else { - const file = await open({ + const file = await dialog.open({ multiple: false, title: 'Select a file to open' }) diff --git a/src/components/macroview/rightPanel/editForms/SystemEventActionForm.tsx b/src/components/macroview/rightPanel/editForms/SystemEventActionForm.tsx index 2972cbba..41949428 100644 --- a/src/components/macroview/rightPanel/editForms/SystemEventActionForm.tsx +++ b/src/components/macroview/rightPanel/editForms/SystemEventActionForm.tsx @@ -1,4 +1,3 @@ -import { useMemo } from 'react' import { SystemEventAction } from '../../../../types' import ClipboardForm from './ClipboardForm' import EmptyForm from './EmptyForm' @@ -9,27 +8,32 @@ interface Props { selectedElementId: number } -export default function SystemEventActionForm({ selectedElement, selectedElementId }: Props) { - const SelectedElementFormComponent = useMemo(() => { - switch (selectedElement.data.type) { - case 'Open': - return - case 'Volume': +export default function SystemEventActionForm({ + selectedElement, + selectedElementId +}: Props) { + switch (selectedElement.data.type) { + case 'Open': + return ( + + ) + case 'Volume': + return + case 'Clipboard': + if (selectedElement.data.action.type === 'PasteUserDefinedString') { + return ( + + ) + } else { return - case 'Clipboard': - if (selectedElement.data.action.type === 'PasteUserDefinedString') { - return ( - - ) - } else { - return - } - default: - return - } - }, [selectedElement, selectedElementId]) - return SelectedElementFormComponent + } + default: + return + } } diff --git a/src/components/macroview/topArea/Header.tsx b/src/components/macroview/topArea/Header.tsx index 2ac42b7c..91df2258 100644 --- a/src/components/macroview/topArea/Header.tsx +++ b/src/components/macroview/topArea/Header.tsx @@ -1,16 +1,16 @@ import { ArrowBackIcon } from '@chakra-ui/icons' import { - HStack, + Box, + Button, Flex, + HStack, IconButton, Input, Tooltip, - Button, useColorModeValue, - useDisclosure, - Box + useDisclosure } from '@chakra-ui/react' -import { useState, useEffect, useMemo, useCallback } from 'react' +import { useCallback, useEffect, useMemo, useState } from 'react' import { useApplicationContext } from '../../../contexts/applicationContext' import { useMacroContext } from '../../../contexts/macroContext' import { useSelectedMacro } from '../../../contexts/selectors' @@ -144,6 +144,7 @@ export default function Header({ isEditing }: Props) { gap={4} shadow={shadowColour} justifyContent="space-between" + justifyItems="center" > } - rounded="md" + rounded='md' spacing="16px" > diff --git a/src/components/macroview/topArea/TriggerArea.tsx b/src/components/macroview/topArea/TriggerArea.tsx index 7067880d..fecfbf32 100644 --- a/src/components/macroview/topArea/TriggerArea.tsx +++ b/src/components/macroview/topArea/TriggerArea.tsx @@ -1,11 +1,11 @@ import { EditIcon } from '@chakra-ui/icons' import { + Button, HStack, Kbd, - Button, + StackDivider, Text, - useColorModeValue, - StackDivider + useColorModeValue } from '@chakra-ui/react' import { useMacroContext } from '../../../contexts/macroContext' import { HIDLookup } from '../../../constants/HIDmap' @@ -30,10 +30,10 @@ export default function TriggerArea({ onOpen }: Props) { gap={2} divider={} shadow={shadowColour} - rounded="md" + rounded='md' justifyContent="space-between" > - + Trigger Keys {macro.trigger.type === 'KeyPressEvent' && macro.trigger.data.map((HIDcode) => ( - + {HIDLookup.get(HIDcode)?.displayString} ))} {macro.trigger.type === 'MouseEvent' && ( - + {mouseEnumLookup.get(macro.trigger.data)?.displayString} )} */} - - - - - + + + + + + + + ) : ( + + + Search + - + )} - + ) } diff --git a/src/components/overview/DeleteCollectionModal.tsx b/src/components/overview/DeleteCollectionModal.tsx index 82c84908..023ce038 100644 --- a/src/components/overview/DeleteCollectionModal.tsx +++ b/src/components/overview/DeleteCollectionModal.tsx @@ -1,12 +1,12 @@ import { + Button, + Divider, Modal, - ModalOverlay, - ModalContent, - ModalHeader, ModalBody, + ModalContent, ModalFooter, - Button, - Divider + ModalHeader, + ModalOverlay } from '@chakra-ui/react' import { useCallback } from 'react' import { useApplicationContext } from '../../contexts/applicationContext' diff --git a/src/components/overview/LeftPanel.tsx b/src/components/overview/LeftPanel.tsx index 694c8de4..6e1df3e8 100644 --- a/src/components/overview/LeftPanel.tsx +++ b/src/components/overview/LeftPanel.tsx @@ -1,64 +1,54 @@ import { AddIcon, SettingsIcon } from '@chakra-ui/icons' -import { - VStack, - Divider, - Button, - HStack, - Text, - Tooltip, - Switch, - useToast, - Box -} from '@chakra-ui/react' +import { Button, Divider, Text, useToast, VStack } from '@chakra-ui/react' import { Collection } from '../../types' import { useApplicationContext } from '../../contexts/applicationContext' import { updateMacroOutput } from '../../constants/utils' import CollectionButton from './CollectionButton' import { useAutoAnimate } from '@formkit/auto-animate/react' -import { useCallback, useState } from 'react' -import data from '@emoji-mart/data' +import { useCallback, useMemo } from 'react' import useScrollbarStyles from '../../hooks/useScrollbarStyles' import useMainBgColour from '../../hooks/useMainBgColour' import useBorderColour from '../../hooks/useBorderColour' -import {error } from "tauri-plugin-log" +import { error } from 'tauri-plugin-log' + +import { SearchBar } from "../leftPanel/SearchBar"; interface Props { onOpenSettingsModal: () => void + searchValue: string + changeSearchValue: (newValue: string) => void } -export default function LeftPanel({ onOpenSettingsModal }: Props) { +export default function LeftPanel({ + onOpenSettingsModal, + searchValue, + changeSearchValue +}: Props) { const { collections, selection, onCollectionAdd, onCollectionUpdate, - changeSelectedCollectionIndex + changeSelectedCollectionIndex, + isMacroOutputEnabled, + changeMacroOutputEnabled } = useApplicationContext() const [parent] = useAutoAnimate() const toast = useToast() - const [isMacroOutputEnabled, setIsMacroOutputEnabled] = useState(true) const onNewCollectionButtonPress = useCallback(() => { - const randomCategory = - data.categories[ - Math.floor(Math.random() * (data.categories.length - 3) + 1) // The plus 1 is to avoid selecting the frequent category. The - 3 is to avoid selecting the flags and symbols categories - ] - let randomEmoji = - randomCategory.emojis[ - Math.floor(Math.random() * randomCategory.emojis.length) - ] - if (randomEmoji.includes('flag') || randomEmoji.includes('symbols')) { - randomEmoji = 'smile' - } - onCollectionAdd({ active: true, - icon: `:${randomEmoji}:`, + icon: `:😍:`, macros: [], name: `Collection ${collections.length + 1}` }) }, [collections.length, onCollectionAdd]) + const isSearching: boolean = useMemo((): boolean => { + return searchValue.length !== 0 + }, [searchValue]) + return ( - - + Collections - - - { - setIsMacroOutputEnabled((value) => { - updateMacroOutput(value).catch((e) => { - error(e) - toast({ - title: `Error ${ - !value ? 'disabling' : 'enabling' - } macro output`, - description: `Unable to ${ - !value ? 'disable' : 'enable' - } macro output, please re-open the app. If that does not work, please contact us on Discord.`, - status: 'error', - duration: 2000, - isClosable: true - }) - }) - return !value - }) - }} + + + + + + {!isSearching && + collections.map((collection: Collection, index: number) => ( + changeSelectedCollectionIndex(index)} + toggleCollection={() => + onCollectionUpdate( + { + ...collections[index], + active: !collections[index].active + }, + index + ) + } /> - - - - + ))} + {!isSearching && ( + + )} + + + - - - {collections.map((collection: Collection, index: number) => ( - changeSelectedCollectionIndex(index)} - toggleCollection={() => - onCollectionUpdate( - { - ...collections[index], - active: !collections[index].active - }, - index - ) - } - /> - ))} - - - - + ) } diff --git a/src/components/overview/MacroCard.tsx b/src/components/overview/MacroCard.tsx index 1a2d8b7b..02bdf074 100644 --- a/src/components/overview/MacroCard.tsx +++ b/src/components/overview/MacroCard.tsx @@ -1,19 +1,19 @@ import { + Box, Button, - Flex, - Text, - Switch, Divider, - VStack, + Flex, + HStack, Kbd, Menu, MenuButton, - MenuList, MenuItem, + MenuList, + Switch, + Text, + Tooltip, useColorModeValue, - Box, - HStack, - Tooltip + VStack } from '@chakra-ui/react' import { EditIcon } from '@chakra-ui/icons' import { Macro } from '../../types' @@ -21,7 +21,7 @@ import { HIDLookup } from '../../constants/HIDmap' import { useApplicationContext } from '../../contexts/applicationContext' import { useSelectedCollection } from '../../contexts/selectors' import { mouseEnumLookup } from '../../constants/MouseMap' -import { useCallback } from 'react' +import { useCallback, useMemo } from 'react' import { KebabVertical } from '../icons' import useMainBgColour from '../../hooks/useMainBgColour' @@ -29,9 +29,17 @@ interface Props { macro: Macro index: number onDelete: (index: number) => void + collectionName?: string + searchValue: string } -export default function MacroCard({ macro, index, onDelete }: Props) { +export default function MacroCard({ + macro, + index, + onDelete, + collectionName, + searchValue +}: Props) { const { selection, onCollectionUpdate, changeSelectedMacroIndex } = useApplicationContext() const currentCollection = useSelectedCollection() @@ -63,13 +71,17 @@ export default function MacroCard({ macro, index, onDelete }: Props) { onCollectionUpdate(newCollection, selection.collectionIndex) }, [currentCollection, macro, onCollectionUpdate, selection.collectionIndex]) + const isSearching: boolean = useMemo((): boolean => { + return searchValue.length !== 0 + }, [searchValue]) + return ( Move to Collection */} {/* Export */} - onDelete(index)} textColor={deleteTextColour}> + onDelete(index)} + textColor={deleteTextColour} + > Delete @@ -121,8 +136,15 @@ export default function MacroCard({ macro, index, onDelete }: Props) { {/** Trigger Keys Display */} + {isSearching && ( + + + {collectionName} + + + )} - Trigger Keys: + Trigger Keys {macro.trigger.type === 'KeyPressEvent' && macro.trigger.data.map((HIDcode) => ( - + {HIDLookup.get(HIDcode)?.displayString} ))} {macro.trigger.type === 'MouseEvent' && ( - + {mouseEnumLookup.get(macro.trigger.data)?.displayString} )} diff --git a/src/components/overview/MacroList.tsx b/src/components/overview/MacroList.tsx index 07606c88..141fa9e0 100644 --- a/src/components/overview/MacroList.tsx +++ b/src/components/overview/MacroList.tsx @@ -1,28 +1,65 @@ import { AddIcon } from '@chakra-ui/icons' import { + Alert, + AlertDescription, + AlertIcon, Box, Button, Flex, Grid, GridItem, + HStack, + Text, useColorModeValue, VStack } from '@chakra-ui/react' -import { useCallback } from 'react' +import { useCallback, useMemo, useState } from 'react' import { useApplicationContext } from '../../contexts/applicationContext' import { useSelectedCollection } from '../../contexts/selectors' import { ViewState } from '../../constants/enums' -import { Macro } from '../../types' +import { Collection, Macro } from '../../types' import MacroCard from './MacroCard' import useScrollbarStyles from '../../hooks/useScrollbarStyles' import useMainBgColour from '../../hooks/useMainBgColour' +import { motion } from 'framer-motion' -export default function MacroList() { - const { selection, onCollectionUpdate, changeViewState } = - useApplicationContext() +interface Props { + searchValue: string +} + +export default function MacroList({ searchValue }: Props) { + // Get the ApplicationContext from your hook. + const { + collections, + selection, + onCollectionUpdate, + changeViewState, + isMacroOutputEnabled + } = useApplicationContext() const currentCollection = useSelectedCollection() const shadowColour = useColorModeValue('md', 'white-md') + const matchingMacros = useMemo(() => { + const newMatchingMacros: { macro: Macro; collection: Collection }[] = [] + + if (searchValue) { + collections.map((collection) => { + collection.macros.map((macro) => { + if (macro.name.toLocaleLowerCase().includes(searchValue)) { + newMatchingMacros.push({ macro, collection }) + } + }) + }) + return newMatchingMacros + } else { + return currentCollection.macros.map((macro, index) => ({ + macro, + collection: currentCollection, + index + })) + } + }, [searchValue, collections, currentCollection]) + const onMacroDelete = useCallback( (macroIndex: number) => { const newCollection = { ...currentCollection } @@ -34,51 +71,119 @@ export default function MacroList() { [currentCollection, onCollectionUpdate, selection.collectionIndex] ) + const isSearching: boolean = useMemo((): boolean => { + return searchValue.length !== 0 + }, [searchValue.length]) + return ( + {!isMacroOutputEnabled && ( + + + + + Macros will not function while Macro output is disabled. + + + + )} - - - + + + + {currentCollection.macros.map((macro, index) => ( + + + + + + ))} + + )} + {searchValue && + matchingMacros.map(({ macro, collection }, index) => ( + - Add Macro - - - - {currentCollection.macros.map((macro: Macro, index: number) => ( - - - - ))} + + + + + ))} + {matchingMacros.length === 0 && isSearching && ( + + {`No macros correspond to: "${searchValue}"`} + + )} ) } diff --git a/src/components/settings/AppearanceSettingsPanel.tsx b/src/components/settings/AppearanceSettingsPanel.tsx index 0f16a450..5d035939 100644 --- a/src/components/settings/AppearanceSettingsPanel.tsx +++ b/src/components/settings/AppearanceSettingsPanel.tsx @@ -1,13 +1,13 @@ import { MoonIcon, SunIcon } from '@chakra-ui/icons' import { - HStack, - VStack, - Text, Divider, + HStack, Radio, RadioGroup, + Text, useColorMode, - useColorModeValue + useColorModeValue, + VStack } from '@chakra-ui/react' import { useCallback, useEffect, useState } from 'react' import { useSettingsContext } from '../../contexts/settingsContext' @@ -55,12 +55,12 @@ export default function AppearanceSettingsPanel() { _hover={{ bg: radioHoverBg }} p="4" gap={2} - rounded="md" + rounded='md' onClick={() => onThemeChange('light')} > @@ -73,12 +73,12 @@ export default function AppearanceSettingsPanel() { _hover={{ bg: radioHoverBg }} p="4" gap={2} - rounded="md" + rounded='md' onClick={() => onThemeChange('dark')} > diff --git a/src/components/settings/ApplicationSettingsPanel.tsx b/src/components/settings/ApplicationSettingsPanel.tsx index ae460a3f..1ce3c242 100644 --- a/src/components/settings/ApplicationSettingsPanel.tsx +++ b/src/components/settings/ApplicationSettingsPanel.tsx @@ -63,6 +63,8 @@ export default function ApplicationSettingsPanel() { description="The value (in ms) that all Delay elements will default to when added to the sequence." defaultValue={config.DefaultDelayValue} onChange={updateDefaultDelayVal} + minimum={1} + maximum={20000} /> diff --git a/src/components/settings/NumberInputSetting.tsx b/src/components/settings/NumberInputSetting.tsx index 7e78d51d..faded0a9 100644 --- a/src/components/settings/NumberInputSetting.tsx +++ b/src/components/settings/NumberInputSetting.tsx @@ -1,12 +1,12 @@ import { HStack, - VStack, - Text, + NumberDecrementStepper, + NumberIncrementStepper, NumberInput, NumberInputField, NumberInputStepper, - NumberIncrementStepper, - NumberDecrementStepper + Text, + VStack } from '@chakra-ui/react' import { useEffect, useState } from 'react' @@ -15,13 +15,17 @@ interface Props { description: string defaultValue: number onChange: (value: string) => void + minimum: number + maximum: number } export default function NumberInputSetting({ title, description, defaultValue, - onChange + onChange, + minimum, + maximum }: Props) { const [value, setValue] = useState('') @@ -48,12 +52,13 @@ export default function NumberInputSetting({ setValue(valueAsString)} - min={1} + min={minimum} + max={maximum} > diff --git a/src/components/settings/PatchNotesPanel.tsx b/src/components/settings/PatchNotesPanel.tsx index 8d0d3b4b..ddc83f86 100644 --- a/src/components/settings/PatchNotesPanel.tsx +++ b/src/components/settings/PatchNotesPanel.tsx @@ -17,7 +17,7 @@ export default function PatchNotesPanel() { return ( - January 16th, 2023 + December 21st, 2023, v. 1.1 @@ -36,12 +36,9 @@ export default function PatchNotesPanel() { fontFamily="Montserrat" textColor={highlightedTextColour} > - Perform keystrokes, open applications, folders, and websites, - paste text with emojis, and more.  + New UI.  - Create simple macros that can be triggered by specific keyboard keys - or a single mouse button. You can also optionally set a name and an - icon, and/or delete it later. + New, smoother UI with animations and nicer colors. - Create groups of macros that can be easily toggled on/off as a - group.  + Macro search.  - Collections allow you to easily organize and manage your macros. - Group by game, task, etc. You can optionally set a name and an icon - for the collection, and/or delete it later. + You can now search your macros from the main window across all + collections. - Adjust how the application behaves.  + Security updates and bugfixes.  - You can adjust some window settings, as well as some functionality - settings that affect your experience creating a macro. + We updated the dependencies so Wootomation stays secure. You can now + also use any layout for a trigger key. - Blind your eyes, or don't.  - - You can select between one of two themes, light and dark.  - - Dark mode is better, definitely not biased... + Gaming.  + Macros now work in games! However, we don't support nor endorse + their use in multiplayer games, using them in such context is at + your own risk! - Enable and disable individual macros, collections, or the entire - app without closing it.  - - If you find yourself in a situation where you'd like to turn off one - or more macros, you have a breadth of options to choose from. - - *Be aware that disabling Macro Output (aka the entire app), will - not be enough if you plan on using the app and playing certain - games. For peace of mind, when playing competitive games, it is - recommended that you close the app. + Keycombos.  + Key combos should now work properly, so you can now do the + CTRL+SHIFT+KEY combos you always wanted. diff --git a/src/components/settings/SettingsButton.tsx b/src/components/settings/SettingsButton.tsx index 7b33aa7f..d963666f 100644 --- a/src/components/settings/SettingsButton.tsx +++ b/src/components/settings/SettingsButton.tsx @@ -33,3 +33,4 @@ export default function SettingsButton({ ) } + diff --git a/src/components/settings/SettingsLeftPanel.tsx b/src/components/settings/SettingsLeftPanel.tsx index 173092da..f5d3ba0e 100644 --- a/src/components/settings/SettingsLeftPanel.tsx +++ b/src/components/settings/SettingsLeftPanel.tsx @@ -1,22 +1,21 @@ import { - VStack, Divider, + Flex, + HStack, Text, useColorModeValue, - HStack, - Flex + VStack } from '@chakra-ui/react' import { openDiscordLink, openGithubLink } from '../../constants/externalLinks' import { SettingsCategory } from '../../constants/enums' import { SettingsGroup } from '../../constants/SettingsMap' import SettingsButton from './SettingsButton' -import { type, version } from '@tauri-apps/api/os' -import { getVersion } from '@tauri-apps/api/app' -import { useEffect, useState } from 'react' +import { SetStateAction, useEffect, useState } from 'react' import { DiscordIcon, GithubIcon } from '../icons' import useScrollbarStyles from '../../hooks/useScrollbarStyles' import useBorderColour from '../../hooks/useBorderColour' -import {error} from "tauri-plugin-log" +import { error } from 'tauri-plugin-log' +import { app, os } from '@tauri-apps/api' interface Props { pageIndex: number @@ -42,14 +41,14 @@ export default function SettingsLeftPanel({ useEffect(() => { const getOSType = async () => { - const os = await type() - const osVersion = await version() - switch (os) { + const opersys = await os.type() + const osVersion = await os.version() + switch (opersys) { case 'Linux': - setOsText(`${os} (${osVersion})`) + setOsText(`${opersys} (${osVersion})`) break case 'Darwin': - setOsText(`${os} (${osVersion})`) + setOsText(`${opersys} (${osVersion})`) break case 'Windows_NT': setOsText(`Windows (${osVersion})`) @@ -60,8 +59,11 @@ export default function SettingsLeftPanel({ } } - getVersion() - .then((version) => setVersionText(version)) + app + .getVersion() + .then((version: SetStateAction) => + setVersionText(version) + ) .catch(error) getOSType().catch((err) => error(err)) diff --git a/src/components/settings/ToggleSetting.tsx b/src/components/settings/ToggleSetting.tsx index f06bb6df..ffec35bf 100644 --- a/src/components/settings/ToggleSetting.tsx +++ b/src/components/settings/ToggleSetting.tsx @@ -1,4 +1,4 @@ -import { HStack, VStack, Text, Switch } from '@chakra-ui/react' +import { HStack, Switch, Text, VStack } from '@chakra-ui/react' interface Props { title: string @@ -15,7 +15,6 @@ export default function ToggleSetting({ onChange, didDependencyCheckFail = false }: Props) { - return ( diff --git a/src/constants/HIDmap.ts b/src/constants/HIDmap.ts index 71395be0..1742fb89 100644 --- a/src/constants/HIDmap.ts +++ b/src/constants/HIDmap.ts @@ -5,6 +5,8 @@ export interface HidInfo { category: HIDCategory displayString: string webKeyId: string + whichID: number + locationID?: number colSpan?: number allowAtStartOfTrigger?: boolean } @@ -15,47 +17,58 @@ export class Hid { HIDcode: 4, category: HIDCategory.Alphanumeric, displayString: 'A', - webKeyId: 'KeyA' + webKeyId: 'KeyA', + whichID: 65 } } + static get B(): HidInfo { return { HIDcode: 5, category: HIDCategory.Alphanumeric, displayString: 'B', - webKeyId: 'KeyB' + webKeyId: 'KeyB', + whichID: 66 } } + static get C(): HidInfo { return { HIDcode: 6, category: HIDCategory.Alphanumeric, displayString: 'C', - webKeyId: 'KeyC' + webKeyId: 'KeyC', + whichID: 67 } } + static get D(): HidInfo { return { HIDcode: 7, category: HIDCategory.Alphanumeric, displayString: 'D', - webKeyId: 'KeyD' + webKeyId: 'KeyD', + whichID: 68 } } + static get E(): HidInfo { return { HIDcode: 8, category: HIDCategory.Alphanumeric, displayString: 'E', - webKeyId: 'KeyE' + webKeyId: 'KeyE', + whichID: 69 } } + static get F(): HidInfo { return { HIDcode: 9, category: HIDCategory.Alphanumeric, displayString: 'F', - webKeyId: 'KeyF' + webKeyId: 'KeyF', + whichID: 70 } } @@ -64,79 +77,98 @@ export class Hid { HIDcode: 10, category: HIDCategory.Alphanumeric, displayString: 'G', - webKeyId: 'KeyG' + webKeyId: 'KeyG', + whichID: 71 } } + static get H(): HidInfo { return { HIDcode: 11, category: HIDCategory.Alphanumeric, displayString: 'H', - webKeyId: 'KeyH' + webKeyId: 'KeyH', + whichID: 72 } } + static get I(): HidInfo { return { HIDcode: 12, category: HIDCategory.Alphanumeric, displayString: 'I', - webKeyId: 'KeyI' + webKeyId: 'KeyI', + whichID: 73 } } + static get J(): HidInfo { return { HIDcode: 13, category: HIDCategory.Alphanumeric, displayString: 'J', - webKeyId: 'KeyJ' + webKeyId: 'KeyJ', + whichID: 74 } } + static get K(): HidInfo { return { HIDcode: 14, category: HIDCategory.Alphanumeric, displayString: 'K', - webKeyId: 'KeyK' + webKeyId: 'KeyK', + whichID: 75 } } + static get L(): HidInfo { return { HIDcode: 15, category: HIDCategory.Alphanumeric, displayString: 'L', - webKeyId: 'KeyL' + webKeyId: 'KeyL', + whichID: 76 } } + static get M(): HidInfo { return { HIDcode: 16, category: HIDCategory.Alphanumeric, displayString: 'M', - webKeyId: 'KeyM' + webKeyId: 'KeyM', + whichID: 77 } } + static get N(): HidInfo { return { HIDcode: 17, category: HIDCategory.Alphanumeric, displayString: 'N', - webKeyId: 'KeyN' + webKeyId: 'KeyN', + whichID: 78 } } + static get O(): HidInfo { return { HIDcode: 18, category: HIDCategory.Alphanumeric, displayString: 'O', - webKeyId: 'KeyO' + webKeyId: 'KeyO', + whichID: 79 } } + static get P(): HidInfo { return { HIDcode: 19, category: HIDCategory.Alphanumeric, displayString: 'P', - webKeyId: 'KeyP' + webKeyId: 'KeyP', + whichID: 80 } } @@ -145,79 +177,98 @@ export class Hid { HIDcode: 20, category: HIDCategory.Alphanumeric, displayString: 'Q', - webKeyId: 'KeyQ' + webKeyId: 'KeyQ', + whichID: 81 } } + static get R(): HidInfo { return { HIDcode: 21, category: HIDCategory.Alphanumeric, displayString: 'R', - webKeyId: 'KeyR' + webKeyId: 'KeyR', + whichID: 82 } } + static get S(): HidInfo { return { HIDcode: 22, category: HIDCategory.Alphanumeric, displayString: 'S', - webKeyId: 'KeyS' + webKeyId: 'KeyS', + whichID: 83 } } + static get T(): HidInfo { return { HIDcode: 23, category: HIDCategory.Alphanumeric, displayString: 'T', - webKeyId: 'KeyT' + webKeyId: 'KeyT', + whichID: 84 } } + static get U(): HidInfo { return { HIDcode: 24, category: HIDCategory.Alphanumeric, displayString: 'U', - webKeyId: 'KeyU' + webKeyId: 'KeyU', + whichID: 85 } } + static get V(): HidInfo { return { HIDcode: 25, category: HIDCategory.Alphanumeric, displayString: 'V', - webKeyId: 'KeyV' + webKeyId: 'KeyV', + whichID: 86 } } + static get W(): HidInfo { return { HIDcode: 26, category: HIDCategory.Alphanumeric, displayString: 'W', - webKeyId: 'KeyW' + webKeyId: 'KeyW', + whichID: 87 } } + static get X(): HidInfo { return { HIDcode: 27, category: HIDCategory.Alphanumeric, displayString: 'X', - webKeyId: 'KeyX' + webKeyId: 'KeyX', + whichID: 88 } } + static get Y(): HidInfo { return { HIDcode: 28, category: HIDCategory.Alphanumeric, displayString: 'Y', - webKeyId: 'KeyY' + webKeyId: 'KeyY', + whichID: 89 } } + static get Z(): HidInfo { return { HIDcode: 29, category: HIDCategory.Alphanumeric, displayString: 'Z', - webKeyId: 'KeyZ' + webKeyId: 'KeyZ', + whichID: 90 } } @@ -226,79 +277,98 @@ export class Hid { HIDcode: 30, category: HIDCategory.Alphanumeric, displayString: '1', - webKeyId: 'Digit1' + webKeyId: 'Digit1', + whichID: 49 } } + static get N2(): HidInfo { return { HIDcode: 31, category: HIDCategory.Alphanumeric, displayString: '2', - webKeyId: 'Digit2' + webKeyId: 'Digit2', + whichID: 50 } } + static get N3(): HidInfo { return { HIDcode: 32, category: HIDCategory.Alphanumeric, displayString: '3', - webKeyId: 'Digit3' + webKeyId: 'Digit3', + whichID: 51 } } + static get N4(): HidInfo { return { HIDcode: 33, category: HIDCategory.Alphanumeric, displayString: '4', - webKeyId: 'Digit4' + webKeyId: 'Digit4', + whichID: 52 } } + static get N5(): HidInfo { return { HIDcode: 34, category: HIDCategory.Alphanumeric, displayString: '5', - webKeyId: 'Digit5' + webKeyId: 'Digit5', + whichID: 53 } } + static get N6(): HidInfo { return { HIDcode: 35, category: HIDCategory.Alphanumeric, displayString: '6', - webKeyId: 'Digit6' + webKeyId: 'Digit6', + whichID: 54 } } + static get N7(): HidInfo { return { HIDcode: 36, category: HIDCategory.Alphanumeric, displayString: '7', - webKeyId: 'Digit7' + webKeyId: 'Digit7', + whichID: 55 } } + static get N8(): HidInfo { return { HIDcode: 37, category: HIDCategory.Alphanumeric, displayString: '8', - webKeyId: 'Digit8' + webKeyId: 'Digit8', + whichID: 56 } } + static get N9(): HidInfo { return { HIDcode: 38, category: HIDCategory.Alphanumeric, displayString: '9', - webKeyId: 'Digit9' + webKeyId: 'Digit9', + whichID: 57 } } + static get N0(): HidInfo { return { HIDcode: 39, category: HIDCategory.Alphanumeric, displayString: '0', - webKeyId: 'Digit0' + webKeyId: 'Digit0', + whichID: 48 } } @@ -308,82 +378,101 @@ export class Hid { category: HIDCategory.Alphanumeric, displayString: 'Enter', webKeyId: 'Enter', - colSpan: 2 + colSpan: 2, + whichID: 13 } } + static get ESCAPE(): HidInfo { return { HIDcode: 41, category: HIDCategory.Alphanumeric, displayString: 'Escape', webKeyId: 'Escape', - colSpan: 2 + colSpan: 2, + whichID: 27 } } + static get BACKSPACE(): HidInfo { return { HIDcode: 42, category: HIDCategory.Alphanumeric, displayString: 'Backspace', webKeyId: 'Backspace', - colSpan: 2 + colSpan: 2, + whichID: 8 } } + static get TAB(): HidInfo { return { HIDcode: 43, category: HIDCategory.Alphanumeric, displayString: 'Tab', - webKeyId: 'Tab' + webKeyId: 'Tab', + whichID: 9 } } + static get SPACE(): HidInfo { return { HIDcode: 44, category: HIDCategory.Alphanumeric, displayString: 'Space', webKeyId: 'Space', - colSpan: 2 + colSpan: 2, + whichID: 32 } } + static get MINUS(): HidInfo { return { HIDcode: 45, category: HIDCategory.Alphanumeric, displayString: '-', - webKeyId: 'Minus' + webKeyId: 'Minus', + whichID: 189 } } + static get EQUAL(): HidInfo { return { HIDcode: 46, category: HIDCategory.Alphanumeric, displayString: '=', - webKeyId: 'Equal' + webKeyId: 'Equal', + whichID: 187 } } + static get BRACKETL(): HidInfo { return { HIDcode: 47, category: HIDCategory.Alphanumeric, displayString: '[', - webKeyId: 'BracketLeft' + webKeyId: 'BracketLeft', + whichID: 219 } } + static get BRACKETR(): HidInfo { return { HIDcode: 48, category: HIDCategory.Alphanumeric, displayString: ']', - webKeyId: 'BracketRight' + webKeyId: 'BracketRight', + whichID: 221 } } + static get BACKSLASH(): HidInfo { return { HIDcode: 49, category: HIDCategory.Alphanumeric, displayString: '\\', - webKeyId: 'Backslash' + webKeyId: 'Backslash', + whichID: 220 } } @@ -392,49 +481,61 @@ export class Hid { HIDcode: 51, category: HIDCategory.Alphanumeric, displayString: ';', - webKeyId: 'Semicolon' + webKeyId: 'Semicolon', + whichID: 186 } } + static get QUOTE(): HidInfo { return { HIDcode: 52, category: HIDCategory.Alphanumeric, displayString: '"', - webKeyId: 'Quote' + webKeyId: 'Quote', + whichID: 222 } } + static get BACKQUOTE(): HidInfo { return { HIDcode: 53, category: HIDCategory.Alphanumeric, displayString: '`', - webKeyId: 'Backquote' + webKeyId: 'Backquote', + whichID: 192 } } + static get COMMA(): HidInfo { return { HIDcode: 54, category: HIDCategory.Alphanumeric, displayString: ',', - webKeyId: 'Comma' + webKeyId: 'Comma', + whichID: 77 } } + static get PERIOD(): HidInfo { return { HIDcode: 55, category: HIDCategory.Alphanumeric, displayString: '.', - webKeyId: 'Period' + webKeyId: 'Period', + whichID: 188 } } + static get SLASH(): HidInfo { return { HIDcode: 56, category: HIDCategory.Alphanumeric, displayString: '/', - webKeyId: 'Slash' + webKeyId: 'Slash', + whichID: 191 } } + static get CAPSLOCK(): HidInfo { return { HIDcode: 57, @@ -442,23 +543,28 @@ export class Hid { displayString: 'Caps Lock', webKeyId: 'CapsLock', colSpan: 2, - allowAtStartOfTrigger: true + allowAtStartOfTrigger: true, + whichID: 20 } } + static get F1(): HidInfo { return { HIDcode: 58, category: HIDCategory.Function, displayString: 'F1', - webKeyId: 'F1' + webKeyId: 'F1', + whichID: 112 } } + static get F2(): HidInfo { return { HIDcode: 59, category: HIDCategory.Function, displayString: 'F2', - webKeyId: 'F2' + webKeyId: 'F2', + whichID: 113 } } @@ -467,79 +573,218 @@ export class Hid { HIDcode: 60, category: HIDCategory.Function, displayString: 'F3', - webKeyId: 'F3' + webKeyId: 'F3', + whichID: 114 } } + static get F4(): HidInfo { return { HIDcode: 61, category: HIDCategory.Function, displayString: 'F4', - webKeyId: 'F4' + webKeyId: 'F4', + whichID: 115 } } + static get F5(): HidInfo { return { HIDcode: 62, category: HIDCategory.Function, displayString: 'F5', - webKeyId: 'F5' + webKeyId: 'F5', + whichID: 116 } } + static get F6(): HidInfo { return { HIDcode: 63, category: HIDCategory.Function, displayString: 'F6', - webKeyId: 'F6' + webKeyId: 'F6', + whichID: 117 } } + static get F7(): HidInfo { return { HIDcode: 64, category: HIDCategory.Function, displayString: 'F7', - webKeyId: 'F7' + webKeyId: 'F7', + whichID: 118 } } + static get F8(): HidInfo { return { HIDcode: 65, category: HIDCategory.Function, displayString: 'F8', - webKeyId: 'F8' + webKeyId: 'F8', + whichID: 119 } } + static get F9(): HidInfo { return { HIDcode: 66, category: HIDCategory.Function, displayString: 'F9', - webKeyId: 'F9' + webKeyId: 'F9', + whichID: 120 } } + static get F10(): HidInfo { return { HIDcode: 67, category: HIDCategory.Function, displayString: 'F10', - webKeyId: 'F10' + webKeyId: 'F10', + whichID: 121 } } + static get F11(): HidInfo { return { HIDcode: 68, category: HIDCategory.Function, displayString: 'F11', - webKeyId: 'F11' + webKeyId: 'F11', + whichID: 122 } } + static get F12(): HidInfo { return { HIDcode: 69, category: HIDCategory.Function, displayString: 'F12', - webKeyId: 'F12' + webKeyId: 'F12', + whichID: 123 + } + } + + static get F13(): HidInfo { + return { + HIDcode: 104, + category: HIDCategory.Function, + displayString: 'F13', + webKeyId: 'F13', + whichID: 124 + } + } + + static get F14(): HidInfo { + return { + HIDcode: 105, + category: HIDCategory.Function, + displayString: 'F14', + webKeyId: 'F14', + whichID: 125 + } + } + + static get F15(): HidInfo { + return { + HIDcode: 106, + category: HIDCategory.Function, + displayString: 'F15', + webKeyId: 'F15', + whichID: 126 + } + } + + static get F16(): HidInfo { + return { + HIDcode: 107, + category: HIDCategory.Function, + displayString: 'F16', + webKeyId: 'F16', + whichID: 127 + } + } + + static get F17(): HidInfo { + return { + HIDcode: 108, + category: HIDCategory.Function, + displayString: 'F17', + webKeyId: 'F17', + whichID: 128 + } + } + + static get F18(): HidInfo { + return { + HIDcode: 109, + category: HIDCategory.Function, + displayString: 'F18', + webKeyId: 'F18', + whichID: 129 + } + } + + static get F19(): HidInfo { + return { + HIDcode: 110, + category: HIDCategory.Function, + displayString: 'F19', + webKeyId: 'F19', + whichID: 130 + } + } + + static get F20(): HidInfo { + return { + HIDcode: 111, + category: HIDCategory.Function, + displayString: 'F20', + webKeyId: 'F20', + whichID: 131 + } + } + + static get F21(): HidInfo { + return { + HIDcode: 112, + category: HIDCategory.Function, + displayString: 'F21', + webKeyId: 'F21', + whichID: 132 + } + } + + static get F22(): HidInfo { + return { + HIDcode: 113, + category: HIDCategory.Function, + displayString: 'F22', + webKeyId: 'F22', + whichID: 133 + } + } + + static get F23(): HidInfo { + return { + HIDcode: 114, + category: HIDCategory.Function, + displayString: 'F23', + webKeyId: 'F23', + whichID: 134 + } + } + + static get F24(): HidInfo { + return { + HIDcode: 115, + category: HIDCategory.Function, + displayString: 'F24', + webKeyId: 'F24', + whichID: 135 } } @@ -549,88 +794,107 @@ export class Hid { category: HIDCategory.Modifier, displayString: 'Print Screen', webKeyId: 'PrintScreen', - colSpan: 2 + colSpan: 2, + whichID: 44 } } + static get SCROLLLOCK(): HidInfo { return { HIDcode: 71, category: HIDCategory.Modifier, displayString: 'Scroll Lock', webKeyId: 'ScrollLock', - colSpan: 2 + colSpan: 2, + whichID: 145 } } + static get PAUSE(): HidInfo { return { HIDcode: 72, category: HIDCategory.Modifier, displayString: 'Pause', webKeyId: 'Pause', - colSpan: 2 + colSpan: 2, + whichID: 19 } } + static get INSERT(): HidInfo { return { HIDcode: 73, category: HIDCategory.Navigation, displayString: 'Insert', webKeyId: 'Insert', - colSpan: 2 + colSpan: 2, + whichID: 45 } } + static get HOME(): HidInfo { return { HIDcode: 74, category: HIDCategory.Navigation, displayString: 'Home', webKeyId: 'Home', - colSpan: 2 + colSpan: 2, + whichID: 36 } } + static get PAGEUP(): HidInfo { return { HIDcode: 75, category: HIDCategory.Navigation, displayString: 'Page Up', webKeyId: 'PageUp', - colSpan: 2 + colSpan: 2, + whichID: 33 } } + static get DELETE(): HidInfo { return { HIDcode: 76, category: HIDCategory.Navigation, displayString: 'Delete', webKeyId: 'Delete', - colSpan: 2 + colSpan: 2, + whichID: 46 } } + static get END(): HidInfo { return { HIDcode: 77, category: HIDCategory.Navigation, displayString: 'End', webKeyId: 'End', - colSpan: 2 + colSpan: 2, + whichID: 35 } } + static get PAGEDOWN(): HidInfo { return { HIDcode: 78, category: HIDCategory.Navigation, displayString: 'Page Down', webKeyId: 'PageDown', - colSpan: 2 + colSpan: 2, + whichID: 34 } } + static get ARROWR(): HidInfo { return { HIDcode: 79, category: HIDCategory.Navigation, displayString: 'Right Arrow', webKeyId: 'ArrowRight', - colSpan: 2 + colSpan: 2, + whichID: 39 } } @@ -640,87 +904,112 @@ export class Hid { category: HIDCategory.Navigation, displayString: 'Left Arrow', webKeyId: 'ArrowLeft', - colSpan: 2 + colSpan: 2, + whichID: 37 } } + static get ARROWD(): HidInfo { return { HIDcode: 81, category: HIDCategory.Navigation, displayString: 'Down Arrow', webKeyId: 'ArrowDown', - colSpan: 2 + colSpan: 2, + whichID: 40 } } + static get ARROWU(): HidInfo { return { HIDcode: 82, category: HIDCategory.Navigation, displayString: 'Up Arrow', webKeyId: 'ArrowUp', - colSpan: 2 + colSpan: 2, + whichID: 38 } } + static get NUMLOCK(): HidInfo { return { HIDcode: 83, category: HIDCategory.Numpad, displayString: 'Num Lock', webKeyId: 'NumLock', - colSpan: 2 + colSpan: 2, + whichID: 144 } } + static get NUMDIVIDE(): HidInfo { return { HIDcode: 84, category: HIDCategory.Numpad, displayString: 'Numpad Divide', webKeyId: 'NumpadDivide', - colSpan: 2 + colSpan: 2, + whichID: 111, + locationID: 3 } } + static get NUMMULTIPLY(): HidInfo { return { HIDcode: 85, category: HIDCategory.Numpad, displayString: 'Numpad Multiply', webKeyId: 'NumpadMultiply', - colSpan: 2 + colSpan: 2, + whichID: 106, + locationID: 3 } } + static get NUMSUBTRACT(): HidInfo { return { HIDcode: 86, category: HIDCategory.Numpad, displayString: 'Numpad Subtract', webKeyId: 'NumpadSubtract', - colSpan: 2 + colSpan: 2, + whichID: 109, + locationID: 3 } } + static get NUMADD(): HidInfo { return { HIDcode: 87, category: HIDCategory.Numpad, displayString: 'Numpad Add', webKeyId: 'NumpadAdd', - colSpan: 2 + colSpan: 2, + whichID: 107, + locationID: 3 } } + static get NUMENTER(): HidInfo { return { HIDcode: 88, category: HIDCategory.Numpad, displayString: 'Numpad Enter', webKeyId: 'NumpadEnter', - colSpan: 2 + colSpan: 2, + whichID: 13, + locationID: 3 } } + static get NP1(): HidInfo { return { HIDcode: 89, category: HIDCategory.Numpad, displayString: 'NP1', - webKeyId: 'Numpad1' + webKeyId: 'Numpad1', + whichID: 97, + locationID: 3 } } @@ -729,177 +1018,109 @@ export class Hid { HIDcode: 90, category: HIDCategory.Numpad, displayString: 'NP2', - webKeyId: 'Numpad2' + webKeyId: 'Numpad2', + whichID: 98, + locationID: 3 } } + static get NP3(): HidInfo { return { HIDcode: 91, category: HIDCategory.Numpad, displayString: 'NP3', - webKeyId: 'Numpad3' + webKeyId: 'Numpad3', + whichID: 99, + locationID: 3 } } + static get NP4(): HidInfo { return { HIDcode: 92, category: HIDCategory.Numpad, displayString: 'NP4', - webKeyId: 'Numpad4' + webKeyId: 'Numpad4', + whichID: 100, + locationID: 3 } } + static get NP5(): HidInfo { return { HIDcode: 93, category: HIDCategory.Numpad, displayString: 'NP5', - webKeyId: 'Numpad5' + webKeyId: 'Numpad5', + whichID: 101, + locationID: 3 } } + static get NP6(): HidInfo { return { HIDcode: 94, category: HIDCategory.Numpad, displayString: 'NP6', - webKeyId: 'Numpad6' + webKeyId: 'Numpad6', + whichID: 102, + locationID: 3 } } + static get NP7(): HidInfo { return { HIDcode: 95, category: HIDCategory.Numpad, displayString: 'NP7', - webKeyId: 'Numpad7' + webKeyId: 'Numpad7', + whichID: 103, + locationID: 3 } } + static get NP8(): HidInfo { return { HIDcode: 96, category: HIDCategory.Numpad, displayString: 'NP8', - webKeyId: 'Numpad8' + webKeyId: 'Numpad8', + whichID: 104, + locationID: 3 } } + static get NP9(): HidInfo { return { HIDcode: 97, category: HIDCategory.Numpad, displayString: 'NP9', - webKeyId: 'Numpad9' + webKeyId: 'Numpad9', + whichID: 105, + locationID: 3 } } + static get NP0(): HidInfo { return { HIDcode: 98, category: HIDCategory.Numpad, displayString: 'NP0', - webKeyId: 'Numpad0' + webKeyId: 'Numpad0', + whichID: 96, + locationID: 3 } } + static get NUMDECIMAL(): HidInfo { return { HIDcode: 133, category: HIDCategory.Numpad, displayString: 'Numpad Decimal', webKeyId: 'NumpadDecimal', - colSpan: 2 - } - } - - static get F13(): HidInfo { - return { - HIDcode: 104, - category: HIDCategory.Function, - displayString: 'F13', - webKeyId: 'F13' - } - } - static get F14(): HidInfo { - return { - HIDcode: 105, - category: HIDCategory.Function, - displayString: 'F14', - webKeyId: 'F14' - } - } - static get F15(): HidInfo { - return { - HIDcode: 106, - category: HIDCategory.Function, - displayString: 'F15', - webKeyId: 'F15' - } - } - static get F16(): HidInfo { - return { - HIDcode: 107, - category: HIDCategory.Function, - displayString: 'F16', - webKeyId: 'F16' - } - } - static get F17(): HidInfo { - return { - HIDcode: 108, - category: HIDCategory.Function, - displayString: 'F17', - webKeyId: 'F17' - } - } - static get F18(): HidInfo { - return { - HIDcode: 109, - category: HIDCategory.Function, - displayString: 'F18', - webKeyId: 'F18' - } - } - static get F19(): HidInfo { - return { - HIDcode: 110, - category: HIDCategory.Function, - displayString: 'F19', - webKeyId: 'F19' - } - } - static get F20(): HidInfo { - return { - HIDcode: 111, - category: HIDCategory.Function, - displayString: 'F20', - webKeyId: 'F20' - } - } - static get F21(): HidInfo { - return { - HIDcode: 112, - category: HIDCategory.Function, - displayString: 'F21', - webKeyId: 'F21' - } - } - static get F22(): HidInfo { - return { - HIDcode: 113, - category: HIDCategory.Function, - displayString: 'F22', - webKeyId: 'F22' - } - } - static get F23(): HidInfo { - return { - HIDcode: 114, - category: HIDCategory.Function, - displayString: 'F23', - webKeyId: 'F23' - } - } - static get F24(): HidInfo { - return { - HIDcode: 115, - category: HIDCategory.Function, - displayString: 'F24', - webKeyId: 'F24' + colSpan: 2, + whichID: 110, + locationID: 3 } } @@ -909,199 +1130,235 @@ export class Hid { category: HIDCategory.Modifier, displayString: 'L-CTRL', webKeyId: 'ControlLeft', - colSpan: 2 + colSpan: 2, + whichID: 17, + locationID: 1 } } + static get SHIFTL(): HidInfo { return { HIDcode: 225, category: HIDCategory.Modifier, displayString: 'L-SHIFT', webKeyId: 'ShiftLeft', - colSpan: 2 + colSpan: 2, + whichID: 16, + locationID: 1 } } + static get ALTL(): HidInfo { return { HIDcode: 226, category: HIDCategory.Modifier, displayString: 'L-ALT', webKeyId: 'AltLeft', - colSpan: 2 + colSpan: 2, + whichID: 18, + locationID: 1 } } + static get METAL(): HidInfo { return { HIDcode: 227, category: HIDCategory.Modifier, displayString: 'L-Win/Super/Command', webKeyId: 'MetaLeft', - colSpan: 4 + colSpan: 4, + whichID: 91, + locationID: 1 } } + static get CONTROLR(): HidInfo { return { HIDcode: 228, category: HIDCategory.Modifier, displayString: 'R-CTRL', webKeyId: 'ControlRight', - colSpan: 2 + colSpan: 2, + whichID: 17, + locationID: 2 } } + static get SHIFTR(): HidInfo { return { HIDcode: 229, category: HIDCategory.Modifier, displayString: 'R-SHIFT', webKeyId: 'ShiftRight', - colSpan: 2 + colSpan: 2, + whichID: 16, + locationID: 2 } } + static get ALTR(): HidInfo { return { HIDcode: 230, category: HIDCategory.Modifier, displayString: 'R-ALT', webKeyId: 'AltRight', - colSpan: 2 + colSpan: 2, + whichID: 18, + locationID: 2 } } + static get METAR(): HidInfo { return { HIDcode: 231, category: HIDCategory.Modifier, displayString: 'R-Win/Super/Command', webKeyId: 'MetaRight', - colSpan: 4 + colSpan: 4, + whichID: 92, + locationID: 2 } } static readonly all: HidInfo[] = [ - Hid.A, - Hid.B, - Hid.C, - Hid.D, - Hid.E, - Hid.F, - Hid.G, - Hid.H, - Hid.I, - Hid.J, - Hid.K, - Hid.L, - Hid.M, - Hid.N, - Hid.O, - Hid.P, - Hid.Q, - Hid.R, - Hid.S, - Hid.T, - Hid.U, - Hid.V, - Hid.W, - Hid.X, - Hid.Y, - Hid.Z, - Hid.N0, - Hid.N1, - Hid.N2, - Hid.N3, - Hid.N4, - Hid.N5, - Hid.N6, - Hid.N7, - Hid.N8, - Hid.N9, - Hid.NP0, - Hid.NP1, - Hid.NP2, - Hid.NP3, - Hid.NP4, - Hid.NP5, - Hid.NP6, - Hid.NP7, - Hid.NP8, - Hid.NP9, - Hid.ENTER, - Hid.ESCAPE, - Hid.BACKSPACE, - Hid.TAB, - Hid.SPACE, - Hid.MINUS, - Hid.EQUAL, - Hid.BRACKETL, - Hid.BRACKETR, - Hid.BACKSLASH, - Hid.SEMICOLON, - Hid.QUOTE, - Hid.BACKQUOTE, - Hid.COMMA, - Hid.PERIOD, - Hid.CAPSLOCK, - Hid.SLASH, - Hid.F1, - Hid.F2, - Hid.F3, - Hid.F4, - Hid.F5, - Hid.F6, - Hid.F7, - Hid.F8, - Hid.F9, - Hid.F10, - Hid.F11, - Hid.F12, - Hid.PRINTSCREEN, - Hid.SCROLLLOCK, - Hid.PAUSE, - Hid.INSERT, - Hid.HOME, - Hid.PAGEUP, - Hid.DELETE, - Hid.END, - Hid.PAGEDOWN, - Hid.ARROWR, - Hid.ARROWL, - Hid.ARROWD, - Hid.ARROWU, - Hid.NUMLOCK, - Hid.NUMDIVIDE, - Hid.NUMMULTIPLY, - Hid.NUMSUBTRACT, - Hid.NUMADD, - Hid.NUMENTER, - Hid.NUMDECIMAL, - Hid.F13, - Hid.F14, - Hid.F15, - Hid.F16, - Hid.F17, - Hid.F18, - Hid.F19, - Hid.F20, - Hid.F21, - Hid.F22, - Hid.F23, - Hid.F24, - Hid.SHIFTL, - Hid.CONTROLL, - Hid.ALTL, - Hid.METAL, - Hid.SHIFTR, - Hid.CONTROLR, - Hid.METAR, - Hid.ALTR + Hid.A, //6510, + Hid.B, //6610, + Hid.C, //6710, + Hid.D, //6810, + Hid.E, //6910, + Hid.F, //7010, + Hid.G, //7110, + Hid.H, //7210, + Hid.I, //7310, + Hid.J, //7410, + Hid.K, //7510, + Hid.L, //7610, + Hid.M, //7710, + Hid.N, //7810, + Hid.O, //7910, + Hid.P, //8010, + Hid.Q, //8110, + Hid.R, //8210, + Hid.S, //8310, + Hid.T, //8410, + Hid.U, //8510, + Hid.V, //8610, + Hid.W, //8710, + Hid.X, //8810, + Hid.Y, //8910, + Hid.Z, //9010, + Hid.N0, //4810, + Hid.N1, //4910, + Hid.N2, //5010, + Hid.N3, //5110, + Hid.N4, //5210, + Hid.N5, //5310, + Hid.N6, //5410, + Hid.N7, //5510, + Hid.N8, //5610, + Hid.N9, //5710, + Hid.NP0, //9610, + Hid.NP1, //9710, + Hid.NP2, //9810, + Hid.NP3, //9910, + Hid.NP4, //10010, + Hid.NP5, //10110, + Hid.NP6, //10210, + Hid.NP7, //10310, + Hid.NP8, //10410, + Hid.NP9, //10510, + Hid.ENTER, //1310, + Hid.ESCAPE, //2710, + Hid.BACKSPACE, //810, + Hid.TAB, //910, + Hid.SPACE, //3210, + Hid.MINUS, //18910, + Hid.EQUAL, //18710, + Hid.BRACKETL, //21910, + Hid.BRACKETR, //22110, + Hid.BACKSLASH, //22010, + Hid.SEMICOLON, //18610, + Hid.QUOTE, //22210, + Hid.BACKQUOTE, //19210, + Hid.COMMA, //7710, + Hid.PERIOD, //18810, + Hid.CAPSLOCK, //2010, + Hid.SLASH, //19110, + Hid.F1, //11210, + Hid.F2, //11310, + Hid.F3, //11410, + Hid.F4, //11510, + Hid.F5, //11610, + Hid.F6, //11710, + Hid.F7, //11810, + Hid.F8, //11910, + Hid.F9, //12010, + Hid.F10, //12110, + Hid.F11, //12210, + Hid.F12, //12310, + Hid.F13, //12410, + Hid.F14, //12510, + Hid.F15, //12610, + Hid.F16, //12710, + Hid.F17, //12810, + Hid.F18, //12910, + Hid.F19, //13010, + Hid.F20, //13110, + Hid.F21, //13210, + Hid.F22, //13310, + Hid.F23, //13410, + Hid.F24, //13510, + Hid.PRINTSCREEN, //4410, + Hid.SCROLLLOCK, //14510, + Hid.PAUSE, //1910, + Hid.INSERT, //4510, + Hid.HOME, //3610, + Hid.PAGEUP, //3310, + Hid.DELETE, //4610, + Hid.END, //3510, + Hid.PAGEDOWN, //3410, + Hid.ARROWR, //3910, + Hid.ARROWL, //3710, + Hid.ARROWD, //4010, + Hid.ARROWU, //3810, + Hid.NUMLOCK, //14410, + Hid.NUMDIVIDE, //11110, + Hid.NUMMULTIPLY, //10610, + Hid.NUMSUBTRACT, //10910, + Hid.NUMADD, //10710, + Hid.NUMENTER, //1310, + Hid.NUMDECIMAL, //11010, + // + Hid.SHIFTL, //1611, + Hid.CONTROLL, //1711, + Hid.ALTL, //1811, + Hid.METAL, //9111, + Hid.SHIFTR, //1612, + Hid.CONTROLR, //1712, + Hid.METAR, //9212, + Hid.ALTR //1812, ] } -export const webCodeHIDLookup = new Map( +export const webCodeLocationHIDLookup = new Map( + // This creates a unique ID: whichID, separated by an extra '1' digit, then locationID. Hid.all - .filter((hid) => hid.webKeyId !== undefined) - .map((hid) => [hid.webKeyId!, hid]) + .filter((hid) => hid.whichID !== undefined) + .map((hid) => [ + webCodeLocationHidEncode(hid.whichID, hid.locationID ?? 0), + hid + ]) ) + +export function webCodeLocationHidEncode( + which: number, + location: number +): string { + return String(which) + '|' + location +} + export const HIDLookup = new Map( Hid.all .filter((hid) => hid.HIDcode !== undefined) - .map((hid) => [hid.HIDcode!, hid]) + .map((hid) => [hid.HIDcode, hid]) ) diff --git a/src/constants/SystemEventMap.ts b/src/constants/SystemEventMap.ts index 45095d92..78e82b21 100644 --- a/src/constants/SystemEventMap.ts +++ b/src/constants/SystemEventMap.ts @@ -88,33 +88,6 @@ export class SystemEvent { description: "Mutes or unmutes the system audio output." } } - // static get SetBrightness(): SystemEventInfo { - // return { - // type: 'Brightness', - // subtype: 'SetAll', - // displayString: 'Set Brightness', - // defaultData: { - // type: 'Brightness', - // action: { type: 'SetAll', level: 75, } - // } - // } - // } - // static get IncreaseBrightness(): SystemEventInfo { - // return { - // type: 'Brightness', - // subtype: 'Increase', - // displayString: 'Increase Brightness', - // defaultData: { type: 'Brightness', action: { type: 'Increase' } } - // } - // } - // static get DecreaseBrightness(): SystemEventInfo { - // return { - // type: 'Brightness', - // subtype: 'Decrease', - // displayString: 'Decrease Brightness', - // defaultData: { type: 'Brightness', action: { type: 'Decrease' } } - // } - // } static readonly all: SystemEventInfo[] = [ SystemEvent.OpenFile, @@ -125,9 +98,6 @@ export class SystemEvent { SystemEvent.IncreaseVolume, SystemEvent.DecreaseVolume, SystemEvent.ToggleMuteVolume, - // SystemEvent.SetBrightness, - // SystemEvent.IncreaseBrightness, - // SystemEvent.DecreaseBrightness ] } diff --git a/src/constants/emojiTypes.d.ts b/src/constants/emojiTypes.d.ts new file mode 100644 index 00000000..e69de29b diff --git a/src/constants/enums.ts b/src/constants/enums.ts index 63e41b75..77efb065 100644 --- a/src/constants/enums.ts +++ b/src/constants/enums.ts @@ -34,6 +34,7 @@ export enum MouseButton { export enum SettingsCategory { General, + Macro, Other } diff --git a/src/constants/externalLinks.ts b/src/constants/externalLinks.ts index 5ea27b32..0c1ceb87 100644 --- a/src/constants/externalLinks.ts +++ b/src/constants/externalLinks.ts @@ -1,8 +1,8 @@ -import { open } from '@tauri-apps/api/shell' +import { shell } from '@tauri-apps/api' export const openDiscordLink = () => { - open('https://discord.gg/wooting') + shell.open('https://discord.gg/wooting') } export const openGithubLink = () => { - open('https://github.com/WootingKb/wooting-macros') + shell.open('https://github.com/WootingKb/wooting-macros') } diff --git a/src/constants/index.ts b/src/constants/index.ts new file mode 100644 index 00000000..d794acdc --- /dev/null +++ b/src/constants/index.ts @@ -0,0 +1,3 @@ +export const DefaultMacroDelay = 20 +export const DefaultDelayDelay = 20 +export const DefaultMouseDelay = 20 diff --git a/src/constants/utils.ts b/src/constants/utils.ts index ca59f73d..6ed1586a 100644 --- a/src/constants/utils.ts +++ b/src/constants/utils.ts @@ -1,4 +1,4 @@ -import { invoke } from '@tauri-apps/api/tauri' +import { invoke } from '@tauri-apps/api' import { HIDCategory, MouseButton } from './enums' import { ActionEventType, @@ -28,6 +28,9 @@ export const updateMacroOutput = (value: boolean): Promise => { frontendBool: !value }) } +export const isDebug = (): Promise => { + return invoke('is_debug', {}) +} export const checkIfMouseButtonArray = ( items: number[] | MouseButton[] @@ -135,15 +138,15 @@ export const scrollbarStylesLight = { }, '&::-webkit-scrollbar-track': { background: '#D5DAE2', - borderRadius: '8px' + borderRadius: 'lg' }, '&::-webkit-scrollbar-thumb': { background: '#9EAABD', - borderRadius: '8px' + borderRadius: 'lg' }, '&::-webkit-scrollbar-thumb:hover': { background: '#8392AA', - borderRadius: '8px' + borderRadius: 'lg' } } @@ -153,14 +156,16 @@ export const scrollbarsStylesDark = { }, '&::-webkit-scrollbar-track': { background: '#27272a', - borderRadius: '8px' + borderRadius: 'lg' }, '&::-webkit-scrollbar-thumb': { background: '#3f3f46', - borderRadius: '8px' + borderRadius: 'lg' }, '&::-webkit-scrollbar-thumb:hover': { background: '#52525b', - borderRadius: '8px' + borderRadius: 'lg' } } + + diff --git a/src/contexts/applicationContext.tsx b/src/contexts/applicationContext.tsx index 32af12e3..0f6117f2 100644 --- a/src/contexts/applicationContext.tsx +++ b/src/contexts/applicationContext.tsx @@ -1,18 +1,19 @@ -import { invoke } from '@tauri-apps/api/tauri' import { + createContext, ReactNode, - useState, + SetStateAction, + useCallback, + useContext, useEffect, useMemo, - useContext, - createContext, - useCallback + useState } from 'react' import { useToast } from '@chakra-ui/react' import { ViewState } from '../constants/enums' -import { AppState, Collection, MacroData, CurrentSelection } from '../types' -import { updateBackendConfig } from '../constants/utils' -import { error } from "tauri-plugin-log" +import { AppState, Collection, CurrentSelection, MacroData } from '../types' +import { isDebug, updateBackendConfig } from '../constants/utils' +import { error } from 'tauri-plugin-log' +import { invoke } from '@tauri-apps/api' interface ApplicationProviderProps { children: ReactNode @@ -34,27 +35,50 @@ function ApplicationProvider({ children }: ApplicationProviderProps) { const [viewState, setViewState] = useState(ViewState.Overview) const [initComplete, setInitComplete] = useState(false) const [collections, setCollections] = useState([]) + const [isMacroOutputEnabled, setIsMacroOutputEnabled] = useState(true) const [selection, setSelection] = useState({ collectionIndex: 0, macroIndex: undefined }) + const [appDebugMode, setAppDebugMode] = useState(null) + + useEffect(() => { + if (appDebugMode === null) { + isDebug() + .then((value: boolean) => { + setAppDebugMode(value) + }) + .catch((error) => { + toast({ + title: 'Debug environment variable set incorrectly!', + description: `Debug environment variable exists, but is set to an invalid value. Only 'error', 'warn', 'info' or 'trace' are valid. Debug features disabled. + Please remove or fix the debug variable, then restart the file explorer process and Wootomation.`, + status: 'error', + isClosable: true, + duration: 10000 + }) + setAppDebugMode(false) + console.log('Debug mode disabled: ', error) + }) + } + }) + const toast = useToast() useEffect(() => { invoke('get_macros') - .then((res) => { + .then((res: { data: SetStateAction }) => { setCollections(res.data) setInitComplete(true) }) - .catch((e) => { + .catch((e: string) => { error(e) toast({ title: 'Error loading macros', description: 'Unable to load macros, please re-open the app. If that does not work, please contact us on Discord.', status: 'error', - duration: 2000, - isClosable: true + isClosable: false }) }) }, [toast]) @@ -65,10 +89,9 @@ function ApplicationProvider({ children }: ApplicationProviderProps) { error(e) toast({ title: 'Error updating macro data', - description: - 'Unable to update macro data, please re-open the app. If that does not work, please contact us on Discord.', + description: `Unable to update macro data: ${e}. + Your system action filepath or website URL may be incorrect. Alternatively, please contact us on Discord.`, status: 'error', - duration: 2000, isClosable: true }) }) @@ -104,6 +127,13 @@ function ApplicationProvider({ children }: ApplicationProviderProps) { [setSelection] ) + const changeMacroOutputEnabled = useCallback( + (value: boolean) => { + setIsMacroOutputEnabled(!value) + }, + [setIsMacroOutputEnabled] + ) + const onCollectionAdd = useCallback( (newCollection: Collection) => { let newIndex = 0 @@ -151,7 +181,10 @@ function ApplicationProvider({ children }: ApplicationProviderProps) { onCollectionAdd, onCollectionUpdate, changeSelectedCollectionIndex, - changeSelectedMacroIndex + changeSelectedMacroIndex, + isMacroOutputEnabled, + changeMacroOutputEnabled, + appDebugMode }), [ viewState, @@ -163,7 +196,10 @@ function ApplicationProvider({ children }: ApplicationProviderProps) { onCollectionAdd, onCollectionUpdate, changeSelectedCollectionIndex, - changeSelectedMacroIndex + changeSelectedMacroIndex, + isMacroOutputEnabled, + changeMacroOutputEnabled, + appDebugMode ] ) diff --git a/src/contexts/macroContext.tsx b/src/contexts/macroContext.tsx index 0f23abaf..c7856be5 100644 --- a/src/contexts/macroContext.tsx +++ b/src/contexts/macroContext.tsx @@ -1,21 +1,21 @@ import { - ReactNode, - useState, - useMemo, - useContext, createContext, + ReactNode, useCallback, - useEffect + useContext, + useEffect, + useMemo, + useState } from 'react' import { MacroType, ViewState } from '../constants/enums' import { checkIfElementIsEditable } from '../constants/utils' import { - MacroState, ActionEventType, - Macro, - TriggerEventType, KeyPressEventAction, - MouseEventAction + Macro, + MacroState, + MouseEventAction, + TriggerEventType } from '../types' import { useApplicationContext } from './applicationContext' import { useSelectedCollection, useSelectedMacro } from './selectors' @@ -139,7 +139,7 @@ function MacroProvider({ children }: MacroProviderProps) { macro.trigger.data.length === 0) || (macro.trigger.type === 'MouseEvent' && macro.trigger.data === undefined) || - sequence.length === 0 + sequence.length === 0 ) { return false } diff --git a/src/contexts/settingsContext.tsx b/src/contexts/settingsContext.tsx index f0483ea2..872633e8 100644 --- a/src/contexts/settingsContext.tsx +++ b/src/contexts/settingsContext.tsx @@ -10,8 +10,9 @@ import { useState } from 'react' import { ApplicationConfig, SettingsState } from '../types' -import { updateSettings } from '../constants/utils' -import {error} from "tauri-plugin-log" +import { error } from 'tauri-plugin-log' +import { DefaultDelayDelay } from "../constants"; +import { updateSettings } from "../constants/utils"; type SettingsProviderProps = { children: ReactNode } @@ -29,7 +30,7 @@ function SettingsProvider({ children }: SettingsProviderProps) { const [initComplete, setInitComplete] = useState(false) const [config, setConfig] = useState({ AutoStart: false, - DefaultDelayValue: 20, + DefaultDelayValue: DefaultDelayDelay, AutoAddDelay: false, AutoSelectElement: true, MinimizeAtLaunch: false, @@ -50,11 +51,9 @@ function SettingsProvider({ children }: SettingsProviderProps) { error(e) toast({ title: 'Error loading settings', - description: - 'Unable to load settings, please re-open the app. If that does not work, please contact us on Discord.', + description: `Unable to load settings: ${e}. Please re-open the app. If that does not work, please contact us on Discord.`, status: 'error', - duration: 2000, - isClosable: true + isClosable: false }) }) }, [toast]) @@ -65,11 +64,9 @@ function SettingsProvider({ children }: SettingsProviderProps) { error(e) toast({ title: 'Error updating settings', - description: - 'Unable to update settings, please re-open the app. If that does not work, please contact us on Discord.', + description: `Unable to update settings: ${e}. Please re-open the app. If that does not work, please contact us on Discord.`, status: 'error', - duration: 2000, - isClosable: true + isClosable: false }) }) }, [config, initComplete, toast]) diff --git a/src/hooks/useRecordingSequence.ts b/src/hooks/useRecordingSequence.ts index 178477be..09eb60c6 100644 --- a/src/hooks/useRecordingSequence.ts +++ b/src/hooks/useRecordingSequence.ts @@ -1,10 +1,14 @@ -import { invoke } from '@tauri-apps/api/tauri' import { useCallback, useEffect, useState } from 'react' -import { KeyType } from '../constants/enums' -import { webCodeHIDLookup } from '../constants/HIDmap' +import { KeyType, MouseButton } from '../constants/enums' +import { + webCodeLocationHidEncode, + webCodeLocationHIDLookup +} from '../constants/HIDmap' import { webButtonLookup } from '../constants/MouseMap' import { Keypress, MousePressAction } from '../types' -import {error} from "tauri-plugin-log" +import { error } from 'tauri-plugin-log' +import { useToast } from '@chakra-ui/react' +import { invoke } from '@tauri-apps/api' export default function useRecordingSequence( onItemChanged: ( @@ -21,6 +25,9 @@ export default function useRecordingSequence( const [prevItem, setPrevItem] = useState< Keypress | MousePressAction | undefined >(undefined) + + const toast = useToast() + const [eventType, setEventType] = useState<'Down' | 'Up'>('Down') const [prevEventType, setPrevEventType] = useState<'Down' | 'Up'>('Down') @@ -44,8 +51,12 @@ export default function useRecordingSequence( if (event.repeat) { return } + const HIDIdentifier = webCodeLocationHidEncode( + event.which, + event.location + ) - const HIDcode = webCodeHIDLookup.get(event.code)?.HIDcode + const HIDcode = webCodeLocationHIDLookup.get(HIDIdentifier)?.HIDcode if (HIDcode === undefined) { return } @@ -97,6 +108,19 @@ export default function useRecordingSequence( return } + // We want to stop the recording when the left mouse button is pressed. Currently, always stops the recording + if (enumVal === MouseButton.Left) { + toast({ + title: `Sequence recording stopped`, + description: `To record Mouse Button 1, insert the button from the left panel.`, + status: 'info', + duration: 4000, + isClosable: true + }) + setRecording(false) + return + } + const timeDiff = Math.round(event.timeStamp - prevTimestamp) setPrevTimestamp(event.timeStamp) setPrevEventType(eventType) @@ -134,18 +158,22 @@ export default function useRecordingSequence( window.addEventListener('mousedown', addMousepress, false) window.addEventListener('keyup', addKeypress, false) window.addEventListener('mouseup', addMousepress, false) - invoke('control_grabbing', { frontendBool: false }).catch((e) => { - error(e) - }) + invoke('control_grabbing', { frontendBool: false }).catch( + (e: string) => { + error(e) + } + ) return () => { window.removeEventListener('keydown', addKeypress, false) window.removeEventListener('mousedown', addMousepress, false) window.removeEventListener('keyup', addKeypress, false) window.removeEventListener('mouseup', addMousepress, false) - invoke('control_grabbing', { frontendBool: true }).catch((e) => { - error(e) - }) + invoke('control_grabbing', { frontendBool: true }).catch( + (e: string) => { + error(e) + } + ) } }, [recording, addKeypress, addMousepress]) diff --git a/src/hooks/useRecordingTrigger.ts b/src/hooks/useRecordingTrigger.ts index a0ad4d40..22399994 100644 --- a/src/hooks/useRecordingTrigger.ts +++ b/src/hooks/useRecordingTrigger.ts @@ -1,14 +1,11 @@ import { useToast } from '@chakra-ui/react' -import { invoke } from '@tauri-apps/api/tauri' import { useCallback, useEffect, useState } from 'react' import { MouseButton } from '../constants/enums' -import { webCodeHIDLookup } from '../constants/HIDmap' +import { webCodeLocationHidEncode, webCodeLocationHIDLookup } from '../constants/HIDmap' import { webButtonLookup } from '../constants/MouseMap' -import { - checkIfModifierKey, - checkIfKeyShouldContinueTriggerRecording -} from '../constants/utils' -import {error} from "tauri-plugin-log" +import { checkIfKeyShouldContinueTriggerRecording } from '../constants/utils' +import { error } from 'tauri-plugin-log' +import { invoke } from '@tauri-apps/api' export default function useRecordingTrigger( initialItems: MouseButton | number[] @@ -43,7 +40,11 @@ export default function useRecordingTrigger( event.preventDefault() event.stopPropagation() - const HIDcode = webCodeHIDLookup.get(event.code)?.HIDcode + // Gets the ID according to the whichID, adds a separator extra digit '1' and then adds location to the end. + const HIDIdentifier = webCodeLocationHidEncode(event.which, event.location) + + const HIDcode = webCodeLocationHIDLookup.get(HIDIdentifier)?.HIDcode + if (HIDcode === undefined) { return } @@ -102,7 +103,6 @@ export default function useRecordingTrigger( description: 'Unable to disable macro output, please re-open the app. If that does not work, please contact us on Discord.', status: 'error', - duration: 2000, isClosable: true }) }) @@ -117,7 +117,6 @@ export default function useRecordingTrigger( description: 'Unable to enable macro output, please re-open the app. If that does not work, please contact us on Discord.', status: 'error', - duration: 2000, isClosable: true }) }) diff --git a/src/main.tsx b/src/main.tsx index e44ec03a..568cb79f 100644 --- a/src/main.tsx +++ b/src/main.tsx @@ -1,16 +1,14 @@ import ReactDOM from 'react-dom/client' import App from './App' import { ChakraProvider, ColorModeScript } from '@chakra-ui/react' -import { theme } from './theme/index' +import { theme } from './theme' import { ApplicationProvider } from './contexts/applicationContext' import { SettingsProvider } from './contexts/settingsContext' import '@fontsource/montserrat/800.css' -import { attachConsole } from 'tauri-plugin-log'; - - -// with LogTarget::Webview enabled this function will print logs to the browser console -attachConsole(); +import { attachConsole } from 'tauri-plugin-log' +// with LogTarget::Webview enabled, this function will print logs to the browser console +attachConsole() ReactDOM.createRoot(document.getElementById('root') as HTMLElement).render( diff --git a/src/theme/components/button.ts b/src/theme/components/button.ts index 4fa83aad..760a164d 100644 --- a/src/theme/components/button.ts +++ b/src/theme/components/button.ts @@ -36,6 +36,25 @@ export const Button = defineStyleConfig({ opacity: 0.5 } }), + brandTertiary: (props: StyleFunctionProps) => ({ + bg: mode('primary-light.100', 'primary-dark.800')(props), + transition: 'ease-out 150ms', + _hover: { + bg: mode('primary-light.200', 'primary-dark.700')(props), + _disabled: { + bg: mode('primary-light.100', 'primary-dark.800')(props), + opacity: 0.5 + } + }, + _active: { + bg: mode('primary-accent.400', 'primary-accent.400')(props), + color: 'bg-dark' + }, + _disabled: { + bg: mode('primary-accent.300', 'primary-accent.500')(props), + opacity: 0.5 + } + }), brandAccent: (props: StyleFunctionProps) => ({ bg: mode('primary-accent.300', 'primary-accent.500')(props), color: 'bg-dark', @@ -71,18 +90,18 @@ export const Button = defineStyleConfig({ } }), yellowGradient: () => ({ - bgGradient: 'linear(to-b, primary-accent.300, primary-accent.500)', + bg: 'primary-accent.500', color: 'bg-dark', _hover: { - bgGradient: 'linear(to-b, primary-accent.200, primary-accent.400)', + bg: 'primary-accent.200', _disabled: { - opacity: 0.5, - bgGradient: 'linear(to-b, primary-accent.300, primary-accent.500)' + bg: 'primary-accent.500', + opacity: 0.5 } }, _disabled: { - opacity: 0.5, - bgGradient: 'linear(to-b, primary-accent.300, primary-accent.500)' + bg: 'primary-accent.500', + opacity: 0.5 } }), brandGhost: (props: StyleFunctionProps) => ({ diff --git a/src/theme/components/tooltip.ts b/src/theme/components/tooltip.ts index 9baaa658..d90d7976 100644 --- a/src/theme/components/tooltip.ts +++ b/src/theme/components/tooltip.ts @@ -14,7 +14,7 @@ export const Tooltip = defineStyleConfig({ 'colors.primary-light.800', 'colors.primary-dark.700' )(props), - borderRadius: 'md', + rounded: 'md' }), brandSecondary: (props: StyleFunctionProps) => ({ bg: mode('primary-light.800', 'primary-dark.900')(props), @@ -26,7 +26,7 @@ export const Tooltip = defineStyleConfig({ )(props), border: '1px solid', borderColor: mode('primary-light.500', 'primary-dark.600')(props), - borderRadius: 'md', + rounded: 'md' }), } }) diff --git a/src/theme/config.ts b/src/theme/config.ts index 1a69a572..64d896e9 100644 --- a/src/theme/config.ts +++ b/src/theme/config.ts @@ -1,6 +1,6 @@ -import { ThemeConfig } from "@chakra-ui/react"; +import { ThemeConfig } from '@chakra-ui/react' export const config: ThemeConfig = { initialColorMode: 'light', useSystemColorMode: false -} +} \ No newline at end of file diff --git a/src/theme/shadows.ts b/src/theme/shadows.ts index f27938ac..4b53d7a5 100644 --- a/src/theme/shadows.ts +++ b/src/theme/shadows.ts @@ -1,8 +1,5 @@ export const shadows = { xs: '0px 0px 4px 1px rgba(0, 0, 0, 0.16)', - 'white-xs': '0px 0px 4px 1px rgba(125, 125, 125, 0.16)', sm: '0px 2px 4px rgba(0, 0, 0, 0.16)', - 'white-sm': '0px 2px 4px rgba(125, 125, 125, 0.16)', md: '0px 4px 8px rgba(0, 0, 0, 0.16)', - 'white-md': '0px 4px 8px rgba(125, 125, 125, 0.16)' } diff --git a/src/types.d.ts b/src/types.d.ts index 3b0c5c06..ee4f3342 100644 --- a/src/types.d.ts +++ b/src/types.d.ts @@ -1,4 +1,4 @@ -import { MacroType, ViewState, MouseButton } from './constants/enums' +import { MacroType, MouseButton, ViewState } from './constants/enums' import { HidInfo } from './constants/HIDmap' import { PluginEventInfo } from './constants/PluginsEventMap' @@ -22,6 +22,9 @@ export type AppState = { ) => void changeSelectedCollectionIndex: (index: number) => void changeSelectedMacroIndex: (index: number | undefined) => void + isMacroOutputEnabled: boolean + changeMacroOutputEnabled: (value: boolean) => void + appDebugMode: boolean | null } export type MacroState = { @@ -163,7 +166,7 @@ export type SystemAction = | { type: 'Open'; action: DirectoryAction } | { type: 'Volume'; action: VolumeAction } | { type: 'Clipboard'; action: ClipboardAction } - // | { type: 'Brightness'; action: MonitorBrightnessAction } +// | { type: 'Brightness'; action: MonitorBrightnessAction } export type DirectoryAction = | { type: 'Directory'; data: string } @@ -194,6 +197,7 @@ export interface KeyboardKeyCategory { name: string elements: HidInfo[] } + export interface PluginCategory { name: string elements: PluginEventInfo[] diff --git a/src/views/MacroSettingsModal.tsx b/src/views/MacroSettingsModal.tsx new file mode 100644 index 00000000..404c9361 --- /dev/null +++ b/src/views/MacroSettingsModal.tsx @@ -0,0 +1,110 @@ +import { + Divider, + Flex, + HStack, + Modal, + ModalBody, + ModalCloseButton, + ModalContent, + ModalOverlay, + Text, + useColorModeValue, + VStack +} from '@chakra-ui/react' +import { useEffect, useState } from 'react' + +import useScrollbarStyles from '../hooks/useScrollbarStyles' +import useMainBgColour from '../hooks/useMainBgColour' +import NotificationMacroSettingsPanel from '../components/macrosettings/NotificationMacroSettingsPanel' +import DefaultMacroSettings from '../components/macrosettings/DefaultMacroSettings' +import MacroSettingsLeftPanel from '../components/macrosettings/MacroSettingsLeftPanel' + +type Props = { + isOpen: boolean + onClose: () => void +} + +interface SettingsTabDefinition { + title: string + component: () => React.ReactNode +} + +export const SettingTabs: SettingsTabDefinition[] = [ + { + title: 'Macro Defaults', + component: () => + }, + { + title: 'Notifications', + component: () => + } +] +export default function MacroSettingsModal({ isOpen, onClose }: Props) { + const [pageIndex, setPageIndex] = useState(0) + const rightPanelBg = useMainBgColour() + const leftPanelBg = useColorModeValue('primary-light.50', 'bg-dark') + + useEffect(() => { + setPageIndex(0) + }, [isOpen]) + + return ( + + + + + + + + + + {SettingTabs[pageIndex].title + ' Settings'} + + + {SettingTabs[pageIndex].component()} + + + + + + + + ) +} diff --git a/src/views/Macroview.tsx b/src/views/Macroview.tsx index 59883bde..aaa50e6e 100644 --- a/src/views/Macroview.tsx +++ b/src/views/Macroview.tsx @@ -1,18 +1,22 @@ -import { VStack, HStack } from '@chakra-ui/react' +import { HStack, VStack } from '@chakra-ui/react' import EditArea from '../components/macroview/rightPanel/EditArea' import SelectElementArea from '../components/macroview/leftPanel/SelectElementArea' import SequencingArea from '../components/macroview/centerPanel/SequencingArea' import Header from '../components/macroview/topArea/Header' import { useMacroContext } from '../contexts/macroContext' -import { useEffect } from 'react' +import { useEffect, useState } from 'react' type Props = { isEditing: boolean - onOpenSettingsModal: () => void + onOpenMacroSettingsModal: () => void } -export default function Macroview({ isEditing, onOpenSettingsModal }: Props) { +export default function Macroview({ + isEditing, + onOpenMacroSettingsModal +}: Props) { const { changeIsUpdatingMacro } = useMacroContext() + const [searchValue, changeSearchValue] = useState('') useEffect(() => { changeIsUpdatingMacro(isEditing) @@ -31,8 +35,11 @@ export default function Macroview({ isEditing, onOpenSettingsModal }: Props) { spacing="0" > {/** Bottom Panels */} - - + + diff --git a/src/views/Overview.tsx b/src/views/Overview.tsx index 76cc6109..ad43f4d4 100644 --- a/src/views/Overview.tsx +++ b/src/views/Overview.tsx @@ -1,19 +1,22 @@ import { HStack } from '@chakra-ui/react' import LeftPanel from '../components/overview/LeftPanel' import CollectionPanel from '../components/overview/CollectionPanel' +import { useState } from 'react' type Props = { onOpenSettingsModal: () => void } export default function Overview({ onOpenSettingsModal }: Props) { - + const [searchValue, changeSearchValue] = useState('') return ( - + ) } diff --git a/src/views/SettingsModal.tsx b/src/views/SettingsModal.tsx index 672afdfc..1cac4d6d 100644 --- a/src/views/SettingsModal.tsx +++ b/src/views/SettingsModal.tsx @@ -1,14 +1,14 @@ import { + Flex, + HStack, Modal, - ModalOverlay, - ModalContent, ModalBody, ModalCloseButton, - HStack, - VStack, + ModalContent, + ModalOverlay, Text, useColorModeValue, - Flex + VStack } from '@chakra-ui/react' import { useEffect, useMemo, useState } from 'react' import { settingInfoLookup } from '../constants/SettingsMap' @@ -58,7 +58,7 @@ export default function SettingsModal({ isOpen, onClose }: Props) { return ( serde::Deserialize<'de> { - fn file_name() -> PathBuf; + fn file_name() -> Result; /// Reads the data from the file and returns it. /// /// If it errors out, it replaces and writes a default config. - fn read_data() -> Self { - let default = Self::default(); - - match File::open(Self::file_name().as_path()) { + fn read_data() -> Result { + match File::open(Self::file_name()?) { Ok(data) => { let data: Self = match serde_json::from_reader(&data) { Ok(x) => x, Err(error) => { - error!("Error reading config.json, using default data. {}", error); - default.write_to_file(); - default + error!("Error reading config.json, using default data and moving to backup. {}", error); + let mut file_name = Self::file_name()?.to_str().unwrap().to_owned(); + + if PathBuf::from(format!("{}.bak", file_name)).exists() { + let mut i = 0; + while PathBuf::from(format!("{}-{}.bak", file_name, i)).exists() { + i += 1; + } + file_name = format!("{}-{}.bak", file_name, i); + } + warn!( + "Renaming {} to {}", + Self::file_name()?.to_str().unwrap(), + file_name + ); + + std::fs::rename(Self::file_name()?, file_name) + .expect("cannot rename the invalid config, aborting."); + Self::default() } }; - data + Ok(data) } - Err(err) => { - error!("Error opening file, using default config {}", err); - default.write_to_file(); - default - } + Err(err) => match err.kind() { + std::io::ErrorKind::NotFound => { + warn!("File not found, writing a default config {}", err); + Self::default().write_to_file()?; + Ok(Self::default()) + } + err => Err(anyhow::format_err!("filesystem error: {}", err)), + }, } } /// Writes the config file to the config directory. /// /// If it fails, it uses only in-memory defaults and won't save anything to disk. - fn write_to_file(&self) { - match std::fs::write( - Self::file_name().as_path(), - serde_json::to_string_pretty(&self).unwrap(), - ) { - Ok(_) => { - info!("Success writing a new file"); - } - Err(err) => { - error!( - "Error writing a new file, using only read only defaults. {}", - err - ); - } - }; + fn write_to_file(&self) -> Result<()> { + let converted_json = serde_json::to_string_pretty(&self)?; + + std::fs::write(Self::file_name()?.as_path(), converted_json)?; + + Ok(()) } } impl ConfigFile for ApplicationConfig { - fn file_name() -> PathBuf { + fn file_name() -> Result { + let path: PathBuf; let dir = { #[cfg(debug_assertions)] - let x = PathBuf::from(".."); + { + path = PathBuf::from(".."); + } #[cfg(not(debug_assertions))] - let x = dirs::config_dir().unwrap().join(CONFIG_DIR); + { + path = { + let conf_dir: Result = match dirs::config_dir() { + Some(config_path) => Ok(config_path), + None => Err(anyhow::Error::msg( + "Cannot find config directory, cannot proceed.", + )), + }; + conf_dir?.join(CONFIG_DIR) + }; + } - x + path }; - dir.join(CONFIG_FILE) + Ok(dir.join(CONFIG_FILE)) } } impl ConfigFile for LogDirPath { - fn file_name() -> PathBuf { + fn file_name() -> Result { + let path: PathBuf; #[cfg(debug_assertions)] - let x = PathBuf::from(".."); + { + path = PathBuf::from(".."); + } #[cfg(not(debug_assertions))] - let x = dirs::config_dir().unwrap().join(CONFIG_DIR); + { + path = { + let conf_dir: Result = match dirs::config_dir() { + Some(config_path) => Ok(config_path), + None => Err(anyhow::Error::msg( + "Cannot find config directory, cannot proceed.", + )), + }; + conf_dir?.join(CONFIG_DIR) + }; + } - x + Ok(path) } } impl ConfigFile for LogFileName { - fn file_name() -> PathBuf { + fn file_name() -> Result { + let path: PathBuf; + let dir = { #[cfg(debug_assertions)] - let x = PathBuf::from(".."); + { + path = PathBuf::from(".."); + } #[cfg(not(debug_assertions))] - let x = dirs::config_dir().unwrap().join(CONFIG_DIR); - - x + { + let conf_dir: Result = match dirs::config_dir() { + Some(config_path) => Ok(config_path), + None => Err(anyhow::Error::msg( + "Cannot find config directory, cannot proceed.", + )), + }; + path = conf_dir?.join(CONFIG_DIR); + } + path }; - dir.join(LOG_FILE) + Ok(dir.join(LOG_FILE)) } } impl ConfigFile for MacroData { - fn file_name() -> PathBuf { + fn file_name() -> Result { + let path: PathBuf; let dir = { #[cfg(debug_assertions)] - let x = PathBuf::from(".."); + { + path = PathBuf::from(".."); + } #[cfg(not(debug_assertions))] - let x = dirs::config_dir().unwrap().join(CONFIG_DIR); + { + path = { + let conf_dir: Result = match dirs::config_dir() { + Some(config_path) => Ok(config_path), + None => Err(anyhow::Error::msg( + "Cannot find config directory, cannot proceed.", + )), + }; + conf_dir?.join(CONFIG_DIR) + }; + } - x + path }; - dir.join(DATA_FILE) + Ok(dir.join(DATA_FILE)) } } @@ -119,7 +179,7 @@ impl Default for ApplicationConfig { fn default() -> Self { ApplicationConfig { auto_start: false, - default_delay_value: 20, + default_delay_value: MACRO_EVENT_DELAY, auto_add_delay: false, auto_select_element: true, minimize_at_launch: false, diff --git a/wooting-macro-backend/src/hid_table.rs b/wooting-macro-backend/src/hid_table.rs index 6e1eac82..812289ea 100644 --- a/wooting-macro-backend/src/hid_table.rs +++ b/wooting-macro-backend/src/hid_table.rs @@ -1,6 +1,7 @@ use std::collections::HashMap; use std::hash::Hash; +use crate::plugin::mouse::MouseButton; use lazy_static::lazy_static; use rdev::{Button, Key}; @@ -11,11 +12,61 @@ pub static ref BUTTON_TO_HID: HashMap = { scancode.insert(Button::Left, 0x101); scancode.insert(Button::Right, 0x102); scancode.insert(Button::Middle, 0x103); - scancode.insert(Button::Unknown(4), 0x104); - scancode.insert(Button::Unknown(5), 0x105); + scancode.insert(Button::Forward, 0x104); + scancode.insert(Button::Backward, 0x105); scancode };} +impl From<&Button> for MouseButton { + fn from(value: &Button) -> Self { + match *value { + Button::Left => MouseButton::Left, + Button::Right => MouseButton::Right, + Button::Middle => MouseButton::Middle, + Button::Forward => MouseButton::Mouse4, + Button::Backward => MouseButton::Mouse5, + Button::Unknown(_) => MouseButton::Left, + } + } +} + +impl From<&MouseButton> for Button { + fn from(item: &MouseButton) -> Self { + match *item { + MouseButton::Left => Button::Left, + MouseButton::Right => Button::Right, + MouseButton::Middle => Button::Middle, + MouseButton::Mouse4 => Button::Forward, + MouseButton::Mouse5 => Button::Backward, + } + } +} + +impl From<&MouseButton> for u32 { + fn from(value: &MouseButton) -> Self { + match *value { + MouseButton::Left => 0x101, + MouseButton::Right => 0x102, + MouseButton::Middle => 0x103, + MouseButton::Mouse4 => 0x104, + MouseButton::Mouse5 => 0x105, + } + } +} + +lazy_static! { + pub static ref RDEV_MODIFIER_KEYS: [rdev::Key; 8] = [ + Key::Alt, + Key::AltGr, + Key::ControlLeft, + Key::ControlRight, + Key::ShiftLeft, + Key::ShiftRight, + Key::MetaLeft, + Key::MetaRight + ]; +} + lazy_static! { ///Conversion from HID codes to the library backend enums. #[derive(Debug, PartialEq, Hash, std::cmp::Eq)] @@ -25,7 +76,6 @@ pub static ref SCANCODE_TO_RDEV: HashMap = { scancode.insert(0x05, Key::KeyB); //US_B scancode.insert(0x06, Key::KeyC); //US_C scancode.insert(0x07, Key::KeyD); //US_D - scancode.insert(0x08, Key::KeyE); //US_E scancode.insert(0x09, Key::KeyF); //US_F scancode.insert(0x0a, Key::KeyG); //US_G @@ -34,7 +84,6 @@ pub static ref SCANCODE_TO_RDEV: HashMap = { scancode.insert(0x0d, Key::KeyJ); //US_J scancode.insert(0x0e, Key::KeyK); //US_K scancode.insert(0x0f, Key::KeyL); //US_L - scancode.insert(0x10, Key::KeyM); //US_M scancode.insert(0x11, Key::KeyN); //US_N scancode.insert(0x12, Key::KeyO); //US_O @@ -43,16 +92,15 @@ pub static ref SCANCODE_TO_RDEV: HashMap = { scancode.insert(0x15, Key::KeyR); //US_R scancode.insert(0x16, Key::KeyS); //US_S scancode.insert(0x17, Key::KeyT); //US_T - scancode.insert(0x18, Key::KeyU); //US_U scancode.insert(0x19, Key::KeyV); //US_V scancode.insert(0x1a, Key::KeyW); //US_W scancode.insert(0x1b, Key::KeyX); //US_X scancode.insert(0x1c, Key::KeyY); //US_Y scancode.insert(0x1d, Key::KeyZ); //US_Z + scancode.insert(0x1e, Key::Num1); //DIGIT1 scancode.insert(0x1f, Key::Num2); //DIGIT2 - scancode.insert(0x20, Key::Num3); //DIGIT3 scancode.insert(0x21, Key::Num4); //DIGIT4 scancode.insert(0x22, Key::Num5); //DIGIT5 @@ -81,9 +129,9 @@ pub static ref SCANCODE_TO_RDEV: HashMap = { scancode.insert(0x35, Key::BackQuote); //BACKQUOTE scancode.insert(0x36, Key::Comma); //COMMA scancode.insert(0x37, Key::Dot); //PERIOD - scancode.insert(0x38, Key::Slash); //SLASH scancode.insert(0x39, Key::CapsLock); //CAPS_LOCK + scancode.insert(0x3a, Key::F1); //F1 scancode.insert(0x3b, Key::F2); //F2 scancode.insert(0x3c, Key::F3); //F3 @@ -97,51 +145,22 @@ pub static ref SCANCODE_TO_RDEV: HashMap = { scancode.insert(0x43, Key::F10); //F10 scancode.insert(0x44, Key::F11); //F11 scancode.insert(0x45, Key::F12); //F12 - - - #[cfg(target_os = "windows")] - { - scancode.insert(0x7f, Key::Unknown(173)); //VOLUME_MUTE - scancode.insert(0x81, Key::Unknown(174)); //VOLUME_DOWN - scancode.insert(0x80, Key::Unknown(175)); //VOLUME_UP - - scancode.insert(0x68, Key::Unknown(124)); //F13 - scancode.insert(0x69, Key::Unknown(125)); //F14 - scancode.insert(0x6a, Key::Unknown(126)); //F15 - scancode.insert(0x6b, Key::Unknown(127)); //F16 - - scancode.insert(0x6c, Key::Unknown(128)); //F17 - scancode.insert(0x6d, Key::Unknown(129)); //F18 - scancode.insert(0x6e, Key::Unknown(130)); //F19 - scancode.insert(0x6f, Key::Unknown(131)); //F20 - - scancode.insert(0x70, Key::Unknown(132)); //F21 - scancode.insert(0x71, Key::Unknown(133)); //F22 - scancode.insert(0x72, Key::Unknown(134)); //F23 - scancode.insert(0x73, Key::Unknown(135)); //F24 - } - - #[cfg(target_os = "linux")] - { - scancode.insert(0x7f, Key::Unknown(121)); //VOLUME_MUTE - scancode.insert(0x81, Key::Unknown(122)); //VOLUME_DOWN - scancode.insert(0x80, Key::Unknown(123)); //VOLUME_UP - - scancode.insert(0x68, Key::Unknown(191)); //F13 - scancode.insert(0x69, Key::Unknown(192)); //F14 - scancode.insert(0x6a, Key::Unknown(193)); //F15 - scancode.insert(0x6b, Key::Unknown(194)); //F16 - - scancode.insert(0x6c, Key::Unknown(195)); //F17 - scancode.insert(0x6d, Key::Unknown(196)); //F18 - scancode.insert(0x6e, Key::Unknown(197)); //F19 - scancode.insert(0x6f, Key::Unknown(198)); //F20 - - scancode.insert(0x70, Key::Unknown(199)); //F21 - scancode.insert(0x71, Key::Unknown(200)); //F22 - scancode.insert(0x72, Key::Unknown(201)); //F23 - scancode.insert(0x73, Key::Unknown(202)); //F24 - } + scancode.insert(0x68, Key::F13); //F13 + scancode.insert(0x69, Key::F14); //F14 + scancode.insert(0x6a, Key::F15); //F15 + scancode.insert(0x6b, Key::F16); //F16 + scancode.insert(0x6c, Key::F17); //F17 + scancode.insert(0x6d, Key::F18); //F18 + scancode.insert(0x6e, Key::F19); //F19 + scancode.insert(0x6f, Key::F20); //F20 + scancode.insert(0x70, Key::F21); //F21 + scancode.insert(0x71, Key::F22); //F22 + scancode.insert(0x72, Key::F23); //F23 + scancode.insert(0x73, Key::F24); //F24 + + scancode.insert(0x7f, Key::VolumeMute); //VOLUME_MUTE + scancode.insert(0x81, Key::VolumeDown); //VOLUME_DOWN + scancode.insert(0x80, Key::VolumeUp); //VOLUME_UP scancode.insert(0x46, Key::PrintScreen); //PRINT_SCREEN scancode.insert(0x47, Key::ScrollLock); //SCROLL_LOCK @@ -232,7 +251,6 @@ pub static ref SCANCODE_TO_HID: HashMap = { scancode.insert(Key::KeyB, 0x05); //US_B scancode.insert(Key::KeyC, 0x06); //US_C scancode.insert(Key::KeyD, 0x07); //US_D - scancode.insert(Key::KeyE, 0x08); //US_E scancode.insert(Key::KeyF, 0x09); //US_F scancode.insert(Key::KeyG, 0x0a); //US_G @@ -241,7 +259,6 @@ pub static ref SCANCODE_TO_HID: HashMap = { scancode.insert(Key::KeyJ, 0x0d); //US_J scancode.insert(Key::KeyK, 0x0e); //US_K scancode.insert(Key::KeyL, 0x0f); //US_L - scancode.insert(Key::KeyM, 0x10); //US_M scancode.insert(Key::KeyN, 0x11); //US_N scancode.insert(Key::KeyO, 0x12); //US_O @@ -250,16 +267,15 @@ pub static ref SCANCODE_TO_HID: HashMap = { scancode.insert(Key::KeyR, 0x15); //US_R scancode.insert(Key::KeyS, 0x16); //US_S scancode.insert(Key::KeyT, 0x17); //US_T - scancode.insert(Key::KeyU, 0x18); //US_U scancode.insert(Key::KeyV, 0x19); //US_V scancode.insert(Key::KeyW, 0x1a); //US_W scancode.insert(Key::KeyX, 0x1b); //US_X scancode.insert(Key::KeyY, 0x1c); //US_Y scancode.insert(Key::KeyZ, 0x1d); //US_Z + scancode.insert(Key::Num1, 0x1e); //DIGIT1 scancode.insert(Key::Num2, 0x1f); //DIGIT2 - scancode.insert(Key::Num3, 0x20); //DIGIT3 scancode.insert(Key::Num4, 0x21); //DIGIT4 scancode.insert(Key::Num5, 0x22); //DIGIT5 @@ -288,66 +304,37 @@ pub static ref SCANCODE_TO_HID: HashMap = { scancode.insert(Key::BackQuote, 0x35); //BACKQUOTE scancode.insert(Key::Comma, 0x36); //COMMA scancode.insert(Key::Dot, 0x37); //PERIOD - - scancode.insert( Key::Slash, 0x38); //SLASH - scancode.insert( Key::CapsLock, 0x39); //CAPS_LOCK - scancode.insert( Key::F1, 0x3a); //F1 - scancode.insert( Key::F2, 0x3b); //F2 - scancode.insert( Key::F3, 0x3c); //F3 - scancode.insert( Key::F4, 0x3d); //F4 - scancode.insert( Key::F5, 0x3e); //F5 - scancode.insert( Key::F6, 0x3f); //F6 - + scancode.insert(Key::Slash, 0x38); //SLASH + scancode.insert(Key::CapsLock, 0x39); //CAPS_LOCK + + scancode.insert(Key::F1, 0x3a); //F1 + scancode.insert(Key::F2, 0x3b); //F2 + scancode.insert(Key::F3, 0x3c); //F3 + scancode.insert(Key::F4, 0x3d); //F4 + scancode.insert(Key::F5, 0x3e); //F5 + scancode.insert(Key::F6, 0x3f); //F6 scancode.insert(Key::F7, 0x40); //F7 scancode.insert(Key::F8, 0x41); //F8 scancode.insert(Key::F9, 0x42); //F9 scancode.insert(Key::F10, 0x43); //F10 scancode.insert(Key::F11, 0x44); //F11 scancode.insert(Key::F12, 0x45); //F12 - - #[cfg(target_os = "windows")] - { - scancode.insert(Key::Unknown(173), 0x7f); //VOLUME_MUTE - scancode.insert(Key::Unknown(174), 0x81); //VOLUME_DOWN - scancode.insert(Key::Unknown(175), 0x80); //VOLUME_UP - - scancode.insert(Key::Unknown(124), 0x68); //F13 - scancode.insert(Key::Unknown(125), 0x69); //F14 - scancode.insert(Key::Unknown(126), 0x6a); //F15 - scancode.insert(Key::Unknown(127), 0x6b); //F16 - - scancode.insert(Key::Unknown(128), 0x6c); //F17 - scancode.insert(Key::Unknown(129), 0x6d); //F18 - scancode.insert(Key::Unknown(130), 0x6e); //F19 - scancode.insert(Key::Unknown(131), 0x6f); //F20 - - scancode.insert(Key::Unknown(132), 0x70); //F21 - scancode.insert(Key::Unknown(133), 0x71); //F22 - scancode.insert(Key::Unknown(134), 0x72); //F23 - scancode.insert(Key::Unknown(135), 0x73); //F24 - } - - #[cfg(target_os = "linux")] - { - scancode.insert(Key::Unknown(121), 0x7f); //VOLUME_MUTE - scancode.insert(Key::Unknown(122), 0x81); //VOLUME_DOWN - scancode.insert(Key::Unknown(123), 0x80); //VOLUME_UP - - scancode.insert(Key::Unknown(191), 0x68); //F13 - scancode.insert(Key::Unknown(192), 0x69); //F14 - scancode.insert(Key::Unknown(193), 0x6a); //F15 - scancode.insert(Key::Unknown(194), 0x6b); //F16 - - scancode.insert(Key::Unknown(195), 0x6c); //F17 - scancode.insert(Key::Unknown(196), 0x6d); //F18 - scancode.insert(Key::Unknown(197), 0x6e); //F19 - scancode.insert(Key::Unknown(198), 0x6f); //F20 - - scancode.insert(Key::Unknown(199), 0x70); //F21 - scancode.insert(Key::Unknown(200), 0x71); //F22 - scancode.insert(Key::Unknown(201), 0x72); //F23 - scancode.insert(Key::Unknown(202), 0x73); //F24 - } + scancode.insert(Key::F13, 0x68); //F13 + scancode.insert(Key::F14, 0x69); //F14 + scancode.insert(Key::F15, 0x6a); //F15 + scancode.insert(Key::F16, 0x6b); //F16 + scancode.insert(Key::F17, 0x6c); //F17 + scancode.insert(Key::F18, 0x6d); //F18 + scancode.insert(Key::F19, 0x6e); //F19 + scancode.insert(Key::F20, 0x6f); //F20 + scancode.insert(Key::F21, 0x70); //F21 + scancode.insert(Key::F22, 0x71); //F22 + scancode.insert(Key::F23, 0x72); //F23 + scancode.insert(Key::F24, 0x73); //F24 + + scancode.insert(Key::VolumeMute, 0x7f); //VOLUME_MUTE + scancode.insert(Key::VolumeDown, 0x81); //VOLUME_DOWN + scancode.insert(Key::VolumeUp, 0x80); //VOLUME_UP scancode.insert(Key::PrintScreen, 0x46); //PRINT_SCREEN scancode.insert(Key::ScrollLock, 0x47); //SCROLL_LOCK diff --git a/wooting-macro-backend/src/lib.rs b/wooting-macro-backend/src/lib.rs index 6bf5c654..a1a75a6f 100644 --- a/wooting-macro-backend/src/lib.rs +++ b/wooting-macro-backend/src/lib.rs @@ -1,32 +1,27 @@ -pub mod config; -mod hid_table; -pub mod plugin; - -use rayon::prelude::*; - -use log::*; - -use itertools::Itertools; - +#[cfg(not(debug_assertions))] +use std::path::PathBuf; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::Arc; use std::{thread, time}; +use anyhow::{bail, Error, Result}; +#[cfg(not(debug_assertions))] +use dirs; +use halfbrown::HashMap; +use itertools::Itertools; +use log::*; +use rayon::prelude::*; +use rdev::simulate; use tokio::sync::mpsc::{UnboundedReceiver, UnboundedSender}; use tokio::sync::RwLock; use tokio::task; -use halfbrown::HashMap; - use config::{ApplicationConfig, ConfigFile}; -#[cfg(not(debug_assertions))] -use dirs; // This has to be imported for release build #[allow(unused_imports)] use crate::config::CONFIG_DIR; use crate::hid_table::*; - //Plugin imports use crate::plugin::delay; #[allow(unused_imports)] @@ -38,6 +33,10 @@ use crate::plugin::obs; use crate::plugin::phillips_hue; use crate::plugin::system_event; +pub mod config; +mod hid_table; +pub mod plugin; + #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] /// Type of a macro. Currently only Single is implemented. Others have been postponed for now. /// @@ -112,34 +111,33 @@ impl Macro { /// This function is used to execute a macro. It is called by the macro checker. /// It spawns async tasks to execute said events specifically. /// Make sure to expand this if you implement new action types. - async fn execute(&self, send_channel: UnboundedSender) { + async fn execute(&self, send_channel: UnboundedSender) -> Result<()> { for action in &self.sequence { match action { ActionEventType::KeyPressEventAction { data } => match data.keytype { key_press::KeyType::Down => { + // One key press down send_channel - .send(rdev::EventType::KeyPress(SCANCODE_TO_RDEV[&data.keypress])) - .unwrap(); + .send(rdev::EventType::KeyPress(SCANCODE_TO_RDEV[&data.keypress]))?; } key_press::KeyType::Up => { - send_channel - .send(rdev::EventType::KeyRelease( - SCANCODE_TO_RDEV[&data.keypress], - )) - .unwrap(); + // One key lift up + send_channel.send(rdev::EventType::KeyRelease( + SCANCODE_TO_RDEV[&data.keypress], + ))?; } key_press::KeyType::DownUp => { + // Key press send_channel - .send(rdev::EventType::KeyPress(SCANCODE_TO_RDEV[&data.keypress])) - .unwrap(); + .send(rdev::EventType::KeyPress(SCANCODE_TO_RDEV[&data.keypress]))?; + // Wait the set delay by user tokio::time::sleep(time::Duration::from_millis(data.press_duration)).await; - send_channel - .send(rdev::EventType::KeyRelease( - SCANCODE_TO_RDEV[&data.keypress], - )) - .unwrap(); + // Lift the key + send_channel.send(rdev::EventType::KeyRelease( + SCANCODE_TO_RDEV[&data.keypress], + ))?; } }, ActionEventType::PhillipsHueEventAction { .. } => {} @@ -161,6 +159,7 @@ impl Macro { } } } + Ok(()) } } @@ -177,7 +176,6 @@ pub struct MacroBackend { pub config: Arc>, pub triggers: Arc>, pub is_listening: Arc, - pub display_list: Arc>>, } ///MacroData is the main data structure that contains all macro data. @@ -201,7 +199,7 @@ impl Default for MacroData { impl MacroData { /// Extracts the first trigger data from the macros. - pub fn extract_triggers(&self) -> MacroTriggerLookup { + pub fn extract_triggers(&self) -> Result { let mut output_hashmap = MacroTriggerLookup::new(); for collections in &self.data { @@ -212,18 +210,29 @@ impl MacroData { TriggerEventType::KeyPressEvent { data, .. } => { //TODO: optimize using references match data.len() { - 0 => error!("A trigger key can't be zero...: {:#?}", data), - 1 => output_hashmap - .entry(*data.first().unwrap()) - .or_default() - .push(macros.clone()), + 0 => { + bail!("a trigger key can't be zero, aborting trigger generation: {:#?}", data); + } + 1 => { + let first_data = match data.first() { + Some(data) => *data, + None => { + return Err(Error::msg( + "Error getting first element in macro trigger", + )); + } + }; + output_hashmap + .entry(first_data) + .or_default() + .push(macros.clone()) + } _ => data[..data.len() - 1].iter().for_each(|x| { output_hashmap.entry(*x).or_default().push(macros.clone()); }), } } TriggerEventType::MouseEvent { data } => { - // let data: u32 = *<&mouse::MouseButton as Into<&u32>>::into(data); let data: u32 = data.into(); match output_hashmap.get_mut(&data) { @@ -239,7 +248,7 @@ impl MacroData { } } - output_hashmap + Ok(output_hashmap) } } @@ -263,7 +272,9 @@ async fn execute_macro(macros: Macro, channel: UnboundedSender) let cloned_channel = channel; task::spawn(async move { - macros.execute(cloned_channel).await; + if let Err(error) = macros.execute(cloned_channel).await { + error!("error executing macro: {}", error); + } }); } MacroType::Toggle => { @@ -281,15 +292,18 @@ async fn execute_macro(macros: Macro, channel: UnboundedSender) /// Puts a mandatory 0-20 ms delay between each macro execution (depending on the platform). fn keypress_executor_sender(mut rchan_execute: UnboundedReceiver) { loop { - plugin::util::send(&rchan_execute.blocking_recv().unwrap()); - - //Windows requires a delay between each macro execution. - #[cfg(any(target_os = "macos", target_os = "linux"))] - thread::sleep(time::Duration::from_millis(10)); + let received_event = match &rchan_execute.blocking_recv() { + Some(event) => *event, + None => { + error!("Failed to receive an event!"); + continue; + } + }; + plugin::util::direct_send_event(&received_event) + .unwrap_or_else(|err| error!("Error directly sending an event to keyboard: {}", err)); - //MacOS requires some strange delays so putting it here just in case. - #[cfg(target_os = "windows")] - thread::sleep(time::Duration::from_millis(1)); + //Every OS requires a delay so the OS can catch up. + thread::sleep(time::Duration::from_millis(delay::STANDARD_KEYPRESS_DELAY)); } } @@ -322,7 +336,7 @@ fn check_macro_execution_efficiently( let channel_clone_execute = channel_sender.clone(); let macro_clone_execute = macros.clone(); - // Disabled until a better fix is done + // We don't need this here as there can't be a single key that's a modifier // plugin::util::lift_keys(data, &channel_clone_execute); task::spawn(async move { @@ -343,8 +357,9 @@ fn check_macro_execution_efficiently( let channel_clone_execute = channel_sender.clone(); let macro_clone_execute = macros.clone(); - // Disabled until a better fix is done - // plugin::util::lift_keys(data, &channel_clone_execute); + // This releases any trigger keys that have been held to make macros more reliable when used with modifier hotkeys. + plugin::util::lift_keys(data, &channel_clone_execute) + .unwrap_or_else(|err| error!("Error lifting keys: {}", err)); task::spawn(async move { execute_macro(macro_clone_execute, channel_clone_execute).await; @@ -379,14 +394,26 @@ fn check_macro_execution_efficiently( output } +#[derive(Debug, Clone, Default)] +struct KeysPressed(Arc>>); + impl MacroBackend { /// Creates the data directory if not present in %appdata% (only in release build). - pub fn generate_directories() { + pub fn generate_directories() -> Result<()> { #[cfg(not(debug_assertions))] - match std::fs::create_dir_all(dirs::config_dir().unwrap().join(CONFIG_DIR).as_path()) { - Ok(x) => x, - Err(error) => error!("Directory creation failed, OS error: {}", error), - }; + { + let conf_dir: Result = match dirs::config_dir() { + Some(config_path) => Ok(config_path), + None => Err(anyhow::Error::msg( + "Cannot find config directory, cannot proceed.", + )), + }; + + let conf_dir = conf_dir?.join(CONFIG_DIR); + + std::fs::create_dir_all(conf_dir.as_path())?; + } + Ok(()) } /// Sets whether the backend should process keys that it listens to. Disabling disables the processing logic, but the app still grabs the keys. @@ -394,20 +421,22 @@ impl MacroBackend { self.is_listening.store(is_listening, Ordering::Relaxed); } /// Sets the macros from the frontend to the files. This function is here to completely split the frontend off. - pub async fn set_macros(&self, macros: MacroData) { - macros.write_to_file(); - *self.triggers.write().await = macros.extract_triggers(); + pub async fn set_macros(&self, macros: MacroData) -> Result<()> { + macros.write_to_file()?; + *self.triggers.write().await = macros.extract_triggers()?; *self.data.write().await = macros; + Ok(()) } /// Sets the config from the frontend to the files. This function is here to completely split the frontend off. - pub async fn set_config(&self, config: ApplicationConfig) { - config.write_to_file(); + pub async fn set_config(&self, config: ApplicationConfig) -> Result<()> { + config.write_to_file()?; *self.config.write().await = config; + Ok(()) } /// Initializes the entire backend and gets the whole grabbing system running. - pub async fn init(&self) { + pub async fn init(&self) -> Result<()> { //? : io-uring async read files and write files //TODO: implement drop when the application ends to clean up the downed keys @@ -419,13 +448,13 @@ impl MacroBackend { // Spawn the channels let (schan_execute, rchan_execute) = tokio::sync::mpsc::unbounded_channel(); - //Create the executor + // Create the executor thread::spawn(move || { keypress_executor_sender(rchan_execute); }); let _grabber = task::spawn_blocking(move || { - let keys_pressed: Arc>> = Arc::new(RwLock::new(vec![])); + let keys_pressed: KeysPressed = KeysPressed::default(); rdev::grab(move |event: rdev::Event| { if inner_is_listening.load(Ordering::Relaxed) { @@ -434,11 +463,8 @@ impl MacroBackend { debug!("Key Pressed RAW: {:?}", key); let key_to_push = key; - // https://doc.rust-lang.org/std/collections/struct.HashSet.html - // benchmark - let pressed_keys_copy_converted: Vec = { - let mut keys_pressed = keys_pressed.blocking_write(); + let mut keys_pressed = keys_pressed.0.blocking_write(); keys_pressed.push(key_to_push); @@ -464,21 +490,20 @@ impl MacroBackend { .collect::>() ); - let first_key: u32 = match pressed_keys_copy_converted.first() { - None => 0, - Some(data_first) => *data_first, - }; + let first_key: u32 = pressed_keys_copy_converted + .first() + .copied() + .unwrap_or_default(); let trigger_list = inner_triggers.blocking_read().clone(); - let check_these_macros = match trigger_list.get(&first_key) { - None => { - vec![] - } - Some(data_found) => data_found.to_vec(), - }; + let check_these_macros = trigger_list + .get(&first_key) + .cloned() + .unwrap_or_default() + .to_vec(); - // ? up the pressed keys here immidiately? + // ? up the pressed keys here right away? let should_grab = { if !check_these_macros.is_empty() { @@ -501,9 +526,9 @@ impl MacroBackend { } rdev::EventType::KeyRelease(key) => { - keys_pressed.blocking_write().retain(|x| *x != key); + keys_pressed.0.blocking_write().retain(|x| *x != key); - debug!("Key state: {:?}", keys_pressed.blocking_read()); + debug!("Key state: {:?}", keys_pressed.0.blocking_read()); Some(event) } @@ -532,10 +557,11 @@ impl MacroBackend { channel_clone, ); - if should_grab { - None - } else { - Some(event) + // Left mouse button never gets consumed to allow users to control their PC. + match (should_grab, button) { + (true, rdev::Button::Left) => Some(event), + (true, _) => None, + (false, _) => Some(event), } } rdev::EventType::ButtonRelease(button) => { @@ -547,38 +573,30 @@ impl MacroBackend { rdev::EventType::Wheel { .. } => Some(event), } } else { - debug!( - "Passing event through... macro recording disabled: {:?}", - event - ); - Some(event) } }) }); + Err(anyhow::Error::msg("Error in grabbing thread!")) } } impl Default for MacroBackend { /// Generates a new state. fn default() -> Self { - let macro_data = MacroData::read_data(); - let triggers = macro_data.extract_triggers(); + let macro_data = + MacroData::read_data().unwrap_or_else(|err| panic!("Cannot get macro data! {}", err)); + + let triggers = macro_data + .extract_triggers() + .expect("error extracting triggers"); MacroBackend { data: Arc::new(RwLock::from(macro_data)), - config: Arc::new(RwLock::from(ApplicationConfig::read_data())), + config: Arc::new(RwLock::from( + ApplicationConfig::read_data().expect("error reading config"), + )), triggers: Arc::new(RwLock::from(triggers)), is_listening: Arc::new(AtomicBool::new(true)), - display_list: Arc::new(RwLock::from(vec![])), } } } - -#[cfg(test)] -mod tests { - #[test] - fn it_works() { - let result = 2 + 2; - assert_eq!(result, 4); - } -} diff --git a/wooting-macro-backend/src/plugin/delay.rs b/wooting-macro-backend/src/plugin/delay.rs index 6edaa87d..3a301edc 100644 --- a/wooting-macro-backend/src/plugin/delay.rs +++ b/wooting-macro-backend/src/plugin/delay.rs @@ -1,2 +1,13 @@ +#[cfg(target_os = "windows")] +pub const STANDARD_KEYPRESS_DELAY: u64 = 1; + +#[cfg(target_os = "macos")] +pub const STANDARD_KEYPRESS_DELAY: u64 = 10; + +#[cfg(target_os = "linux")] +pub const STANDARD_KEYPRESS_DELAY: u64 = 10; + +/// Delay between macro events for the frontend +pub const MACRO_EVENT_DELAY: u64 = 20; /// Delay for the sequence in milliseconds pub type Delay = u64; diff --git a/wooting-macro-backend/src/plugin/mouse.rs b/wooting-macro-backend/src/plugin/mouse.rs index 93e3e8ce..c19a237a 100644 --- a/wooting-macro-backend/src/plugin/mouse.rs +++ b/wooting-macro-backend/src/plugin/mouse.rs @@ -1,5 +1,5 @@ +use anyhow::Result; use log::*; -use rdev::EventType; use serde_repr; use tokio::sync::mpsc::UnboundedSender; @@ -31,43 +31,6 @@ pub enum MouseButton { Mouse5 = 0x105, } -impl From<&rdev::Button> for MouseButton { - fn from(value: &rdev::Button) -> Self { - match *value { - rdev::Button::Left => MouseButton::Left, - rdev::Button::Right => MouseButton::Right, - rdev::Button::Middle => MouseButton::Middle, - rdev::Button::Unknown(1) => MouseButton::Mouse4, - rdev::Button::Unknown(2) => MouseButton::Mouse5, - rdev::Button::Unknown(_) => MouseButton::Left, - } - } -} - -impl From<&MouseButton> for rdev::Button { - fn from(item: &MouseButton) -> Self { - match *item { - MouseButton::Left => rdev::Button::Left, - MouseButton::Right => rdev::Button::Right, - MouseButton::Middle => rdev::Button::Middle, - MouseButton::Mouse4 => rdev::Button::Unknown(1), - MouseButton::Mouse5 => rdev::Button::Unknown(2), - } - } -} - -impl From<&MouseButton> for u32 { - fn from(value: &MouseButton) -> Self { - match *value { - MouseButton::Left => 0x101, - MouseButton::Right => 0x102, - MouseButton::Middle => 0x103, - MouseButton::Mouse4 => 0x104, - MouseButton::Mouse5 => 0x105, - } - } -} - #[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Hash, Eq)] #[serde(tag = "type")] /// Mouse press action: Press presses a defined button. Release releases a defined button. @@ -80,43 +43,36 @@ pub enum MousePressAction { impl MouseAction { /// Creates a new MouseAction from a rdev event and sends it to the channel for async execution. - pub async fn execute(&self, send_channel: UnboundedSender) { + pub async fn execute(&self, send_channel: UnboundedSender) -> Result<()> { match &self { MouseAction::Press { data } => match data { MousePressAction::Down { button } => { - send_channel - .send(rdev::EventType::ButtonPress(button.into())) - .unwrap(); + send_channel.send(rdev::EventType::ButtonPress(button.into()))?; } MousePressAction::Up { button } => { - send_channel - .send(rdev::EventType::ButtonRelease(button.into())) - .unwrap(); + send_channel.send(rdev::EventType::ButtonRelease(button.into()))?; } MousePressAction::DownUp { button, duration } => { - send_channel - .send(rdev::EventType::ButtonPress(button.into())) - .unwrap(); + send_channel.send(rdev::EventType::ButtonPress(button.into()))?; tokio::time::sleep(time::Duration::from_millis(*duration as u64)).await; - send_channel - .send(rdev::EventType::ButtonRelease(button.into())) - .unwrap(); + send_channel.send(rdev::EventType::ButtonRelease(button.into()))?; } }, MouseAction::Move { x, y } => { - let display_size = rdev::display_size().unwrap(); + let display_size = rdev::display_size().map_err(|err| { + anyhow::Error::msg(format!("Error getting displays: {:?}", err)) + })?; info!("Display size: {:?}", display_size); - send_channel - .send(rdev::EventType::MouseMove { - x: *x as f64, - y: *y as f64, - }) - .unwrap(); + send_channel.send(rdev::EventType::MouseMove { + x: *x as f64, + y: *y as f64, + })?; } } + Ok(()) } } diff --git a/wooting-macro-backend/src/plugin/system_event.rs b/wooting-macro-backend/src/plugin/system_event.rs index efec494a..7129b51c 100644 --- a/wooting-macro-backend/src/plugin/system_event.rs +++ b/wooting-macro-backend/src/plugin/system_event.rs @@ -1,32 +1,25 @@ -use super::util; +use std::path::PathBuf; +use std::{time, vec}; + +use anyhow::Result; use copypasta::{ClipboardContext, ClipboardProvider}; use fastrand; -use log::*; use rdev; -use std::vec; use tokio::sync::mpsc::UnboundedSender; +use url::Url; -use crate::hid_table::SCANCODE_TO_RDEV; - -// The Brightness of monitors is not implemented for macOS, so we have to condition the code. -#[cfg(target_os = "windows")] -use brightness::{windows::BrightnessExt, Brightness, BrightnessDevice}; -#[cfg(target_os = "linux")] -use brightness::{Brightness, BrightnessDevice}; - -#[cfg(any(target_os = "windows", target_os = "linux"))] -use futures::{StreamExt, TryFutureExt}; +use super::util; -// Frequently used constants +// Frequently used keys within the code. const COPY_HOTKEY: [rdev::Key; 2] = [rdev::Key::ControlLeft, rdev::Key::KeyC]; const PASTE_HOTKEY: [rdev::Key; 2] = [rdev::Key::ControlLeft, rdev::Key::KeyV]; #[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Hash, Eq)] #[serde(tag = "type")] pub enum DirectoryAction { - Directory { data: String }, - File { data: String }, - Website { data: String }, + File { data: PathBuf }, + Directory { data: PathBuf }, + Website { data: Url }, } #[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Hash, Eq)] @@ -35,263 +28,105 @@ pub enum DirectoryAction { pub enum SystemAction { Open { action: DirectoryAction }, Volume { action: VolumeAction }, - Brightness { action: MonitorBrightnessAction }, Clipboard { action: ClipboardAction }, } impl SystemAction { /// Execute the keys themselves. - - pub async fn execute(&self, send_channel: UnboundedSender) { + pub async fn execute(&self, send_channel: UnboundedSender) -> Result<()> { match &self { SystemAction::Open { action } => match action { - DirectoryAction::Directory { data } => { - match opener::open(std::path::Path::new(data)) { - Ok(x) => x, - Err(e) => error!("Error: {}", e), - }; - } - DirectoryAction::File { data } => { - match opener::open(std::path::Path::new(data)) { - Ok(x) => x, - Err(e) => error!("Error: {}", e), - }; + DirectoryAction::Directory { data } | DirectoryAction::File { data } => { + opener::open(data)?; } DirectoryAction::Website { data } => { - match opener::open_browser(std::path::Path::new(data)) { - Ok(x) => x, - Err(e) => error!("Error: {}", e), - }; + // The open_browser explicitly opens the path in a browser window. + opener::open_browser(data.as_str())?; } }, SystemAction::Volume { action } => match action { VolumeAction::ToggleMute => { - util::send_key(&send_channel, vec![*SCANCODE_TO_RDEV.get(&0x7f).unwrap()]) - .await; + util::direct_send_key(&send_channel, vec![rdev::Key::VolumeMute]).await?; } VolumeAction::LowerVolume => { - util::send_key(&send_channel, vec![*SCANCODE_TO_RDEV.get(&0x81).unwrap()]) - .await; + util::direct_send_key(&send_channel, vec![rdev::Key::VolumeDown]).await?; } VolumeAction::IncreaseVolume => { - util::send_key(&send_channel, vec![*SCANCODE_TO_RDEV.get(&0x80).unwrap()]) - .await; + util::direct_send_key(&send_channel, vec![rdev::Key::VolumeUp]).await?; } }, - - SystemAction::Brightness { action } => { - // This is split for windows/linux and macOS. - // macOS cannot implement this feature, so due to language limitations we have to make two separate matches. - #[cfg(any(target_os = "windows", target_os = "linux"))] - match action { - MonitorBrightnessAction::SetAll { level } => { - #[cfg(any(target_os = "windows", target_os = "linux"))] - brightness_set_all_device(*level).await; - #[cfg(target_os = "macos")] - error!("Not supported on macOS"); - } - MonitorBrightnessAction::SetSpecific { level, name } => { - #[cfg(any(target_os = "windows", target_os = "linux"))] - brightness_set_specific_device(*level, name).await; - #[cfg(target_os = "macos")] - error!("Not supported on macOS"); - } - MonitorBrightnessAction::ChangeSpecific { by_how_much, name } => { - #[cfg(any(target_os = "windows", target_os = "linux"))] - brightness_change_specific(*by_how_much, name).await; - #[cfg(target_os = "macos")] - error!("Not supported on macOS"); - } - MonitorBrightnessAction::ChangeAll { by_how_much } => { - #[cfg(any(target_os = "windows", target_os = "linux"))] - brightness_change_all(*by_how_much).await; - #[cfg(target_os = "macos")] - error!("Not supported on macOS"); - } - } - // Second match for macOS - #[cfg(target_os = "macos")] - match action { - _ => { - error!("Not supported on macOS"); - } - } - } - SystemAction::Clipboard { action } => match action { ClipboardAction::SetClipboard { data } => { ClipboardContext::new() - .unwrap() + .map_err(|err| anyhow::Error::msg(err.to_string()))? .set_contents(data.to_owned()) - .unwrap(); + .map_err(|err| anyhow::Error::msg(err.to_string()))?; } ClipboardAction::Copy => { - util::send_hotkey(&send_channel, COPY_HOTKEY.to_vec()).await; + util::direct_send_hotkey(&send_channel, COPY_HOTKEY.to_vec()).await?; } ClipboardAction::GetClipboard => { - ClipboardContext::new().unwrap().get_contents().unwrap(); + ClipboardContext::new() + .map_err(|err| anyhow::Error::msg(err.to_string()))? + .get_contents() + .map_err(|err| anyhow::Error::msg(err.to_string()))?; } ClipboardAction::Paste => { - util::send_hotkey(&send_channel, PASTE_HOTKEY.to_vec()).await; + util::direct_send_hotkey(&send_channel, PASTE_HOTKEY.to_vec()).await?; } ClipboardAction::PasteUserDefinedString { data } => { ClipboardContext::new() - .unwrap() + .map_err(|err| anyhow::Error::msg(err.to_string()))? .set_contents(data.to_owned()) - .unwrap(); + .map_err(|err| anyhow::Error::msg(err.to_string()))?; - util::send_hotkey(&send_channel, PASTE_HOTKEY.to_vec()).await; + util::direct_send_hotkey(&send_channel, PASTE_HOTKEY.to_vec()).await?; } ClipboardAction::Sarcasm => { - let mut ctx = ClipboardContext::new().unwrap(); - - util::send_hotkey(&send_channel, COPY_HOTKEY.to_vec()).await; - - //Transform the text - let content = transform_text(ctx.get_contents().unwrap()); - ctx.set_contents(content).unwrap(); - - //Paste the text again - util::send_hotkey(&send_channel, PASTE_HOTKEY.to_vec()).await; - } - }, - } - } -} - -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)] -/// Monitor information. -pub struct Monitor { - pub device_id: String, - pub brightness: u32, - pub display_name: String, -} -#[cfg(any(target_os = "windows", target_os = "linux"))] -/// Loads the monitors and sends them to the frontend. -pub async fn backend_load_monitors() -> Vec { - let mut monitors = Vec::new(); + let mut ctx = ClipboardContext::new() + .map_err(|err| anyhow::Error::msg(err.to_string()))?; - if let Ok(i) = brightness::brightness_devices() - .into_future() - .await - .0 - .unwrap() - { - monitors.push(Monitor { - device_id: i.device_name().into_future().await.unwrap(), - brightness: i.get().into_future().await.unwrap(), - #[cfg(target_os = "windows")] - display_name: i.device_description().unwrap(), - #[cfg(target_os = "linux")] - display_name: "Not supported on Linux".to_string(), - }); - } - - monitors -} + // Copy the text + util::direct_send_hotkey(&send_channel, COPY_HOTKEY.to_vec()).await?; -#[cfg(any(target_os = "windows", target_os = "linux"))] -/// Sets brightness of all monitors to the given level. -async fn brightness_set_all_device(percentage_level: u32) { - if let Ok(mut devices) = brightness::brightness_devices() - .into_future() - .await - .0 - .unwrap() - { - set_brightness(&mut devices, percentage_level) - .await - .unwrap(); - } -} + // Delay is required to make Discord, and some other apps cooperate properly. + tokio::time::sleep(time::Duration::from_millis(10)).await; -#[cfg(any(target_os = "windows", target_os = "linux"))] -/// Sets brightness of a specific device (it's name) to the given level. -async fn brightness_set_specific_device(percentage_level: u32, name: &str) { - if let Ok(mut devices) = brightness::brightness_devices() - .into_future() - .await - .0 - .unwrap() - { - if devices.device_name().into_future().await.unwrap() == name { - set_brightness(&mut devices, percentage_level) - .await - .unwrap(); - } - } -} + // Transform the text + let content = transform_text( + ctx.get_contents() + .map_err(|err| anyhow::Error::msg(err.to_string()))?, + ); -#[cfg(any(target_os = "windows", target_os = "linux"))] -/// Decreases brightness of specific devices by 2%. -async fn brightness_change_specific(by_how_much: i32, name: &str) { - if let Ok(mut devices) = brightness::brightness_devices() - .into_future() - .await - .0 - .unwrap() - { - if devices.device_name().into_future().await.unwrap() == name { - let current_brightness: i32 = devices.get().await.unwrap() as i32; + ctx.set_contents(content) + .map_err(|err| anyhow::Error::msg(err.to_string()))?; - set_brightness( - &mut devices, - (current_brightness.checked_add(by_how_much).unwrap_or(0)) as u32, - ) - .await - .unwrap(); + // Paste the text again + util::direct_send_hotkey(&send_channel, PASTE_HOTKEY.to_vec()).await?; + } + }, } + Ok(()) } } -#[cfg(any(target_os = "windows", target_os = "linux"))] -/// Decrements brightness of all devices by 2%. -async fn brightness_change_all(by_how_much: i32) { - if let Ok(mut devices) = brightness::brightness_devices() - .into_future() - .await - .0 - .unwrap() - { - let current_brightness: i32 = devices.get().await.unwrap() as i32; - - set_brightness( - &mut devices, - (current_brightness.checked_add(by_how_much).unwrap_or(0)) as u32, - ) - .await - .unwrap(); - } -} - -#[cfg(any(target_os = "windows", target_os = "linux"))] -/// Sets brightness for a device. -async fn set_brightness( - dev: &mut BrightnessDevice, - percentage_level: u32, -) -> Result<(), brightness::Error> { - info!("Display {}", dev.device_name().await.unwrap()); - dev.set(percentage_level).await.unwrap(); - Ok(()) -} - /// Transforms the text into a sarcastic version. fn transform_text(text: String) -> String { - let mut transformed_text = String::new(); - for c in text.chars() { - if c.is_ascii_alphabetic() && fastrand::bool() { - if c.is_ascii_lowercase() { - transformed_text.push(c.to_ascii_uppercase()); + text.chars() + .map(|c| { + if c.is_ascii_alphabetic() && fastrand::bool() { + if c.is_ascii_lowercase() { + c.to_ascii_uppercase() + } else { + c.to_ascii_lowercase() + } } else { - transformed_text.push(c.to_ascii_lowercase()); + c } - } else { - transformed_text.push(c); - } - } - transformed_text + }) + .collect() } #[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Hash, Eq)] @@ -306,18 +141,6 @@ pub enum ClipboardAction { Sarcasm, } -#[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Hash, Eq)] -#[serde(tag = "type")] -/// Monitor get, set brightness of any screen. -/// -/// ! **UNIMPLEMENTED** - The brightness is currently not implemented and tested on frontend. Backend needs testing. You are welcome to contribute. -pub enum MonitorBrightnessAction { - SetAll { level: u32 }, - SetSpecific { level: u32, name: String }, - ChangeSpecific { by_how_much: i32, name: String }, - ChangeAll { by_how_much: i32 }, -} - #[derive(Debug, Clone, serde::Serialize, serde::Deserialize, PartialEq, Hash, Eq)] #[serde(tag = "type")] /// Key shortcut alias to mute/increase/decrease volume. diff --git a/wooting-macro-backend/src/plugin/util.rs b/wooting-macro-backend/src/plugin/util.rs index f78a0b94..a7360ffd 100644 --- a/wooting-macro-backend/src/plugin/util.rs +++ b/wooting-macro-backend/src/plugin/util.rs @@ -1,50 +1,63 @@ +use crate::hid_table::RDEV_MODIFIER_KEYS; +use anyhow::Result; use log::*; use rdev; use tokio::sync::mpsc::UnboundedSender; /// Sends an event to the library to Execute on an OS level. This makes it easier to implement keypresses in custom code. -pub fn send(event_type: &rdev::EventType) { - debug!("Sending event: {:?}", event_type); - match rdev::simulate(event_type) { - Ok(()) => (), - Err(_) => { - error!("We could not send {:?}", event_type); - } - } +pub fn direct_send_event(event_type: &rdev::EventType) -> Result<()> { + trace!("Sending event: {:?}", event_type); + rdev::simulate(event_type)?; + Ok(()) } /// Sends a vector of keys to get processed -pub async fn send_key(send_channel: &UnboundedSender, key: Vec) { - for press in key { - send_channel.send(rdev::EventType::KeyPress(press)).unwrap(); - send_channel - .send(rdev::EventType::KeyRelease(press)) - .unwrap(); +pub async fn direct_send_key( + send_channel: &UnboundedSender, + key: Vec, +) -> Result<()> { + for press in key.iter() { + send_channel.send(rdev::EventType::KeyPress(*press))?; + + send_channel.send(rdev::EventType::KeyRelease(*press))?; } + Ok(()) } /// Sends a vector of hotkeys to get processed -pub async fn send_hotkey(send_channel: &UnboundedSender, key: Vec) { - for press in &key { - send_channel - .send(rdev::EventType::KeyPress(*press)) - .unwrap(); +pub async fn direct_send_hotkey( + send_channel: &UnboundedSender, + key: Vec, +) -> Result<()> { + for press in key.iter() { + send_channel.send(rdev::EventType::KeyPress(*press))?; } - for press in &key.into_iter().rev().collect::>() { - send_channel - .send(rdev::EventType::KeyRelease(*press)) - .unwrap(); + for press in key.iter().rev() { + send_channel.send(rdev::EventType::KeyRelease(*press))?; } + + Ok(()) } // Disabled until a better fix is done // /// Lifts the keys pressed -// pub fn lift_keys(pressed_events: &Vec, channel_sender: &UnboundedSender) { -// for x in pressed_events { -// channel_sender -// .send(rdev::EventType::KeyRelease( -// super::super::SCANCODE_TO_RDEV[x], -// )) -// .unwrap(); -// } -// } +pub fn lift_keys( + pressed_events: &[u32], + channel_sender: &UnboundedSender, +) -> Result<()> { + let mut pressed_events_local = pressed_events.to_owned(); + + pressed_events_local.retain(|id_key| { + RDEV_MODIFIER_KEYS + .iter() + .any(|rdev_key| super::super::SCANCODE_TO_RDEV[id_key] == *rdev_key) + }); + + for key in pressed_events_local.iter() { + channel_sender.send(rdev::EventType::KeyRelease( + super::super::SCANCODE_TO_RDEV[key], + ))?; + } + + Ok(()) +} diff --git a/yarn.lock b/yarn.lock index 6f655200..3c77cb4a 100644 --- a/yarn.lock +++ b/yarn.lock @@ -41,58 +41,68 @@ __metadata: languageName: node linkType: hard -"@babel/compat-data@npm:^7.22.9": - version: 7.22.20 - resolution: "@babel/compat-data@npm:7.22.20" - checksum: efedd1d18878c10fde95e4d82b1236a9aba41395ef798cbb651f58dbf5632dbff475736c507b8d13d4c8f44809d41c0eb2ef0d694283af9ba5dd8339b6dab451 +"@babel/code-frame@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/code-frame@npm:7.23.5" + dependencies: + "@babel/highlight": ^7.23.4 + chalk: ^2.4.2 + checksum: d90981fdf56a2824a9b14d19a4c0e8db93633fd488c772624b4e83e0ceac6039a27cd298a247c3214faa952bf803ba23696172ae7e7235f3b97f43ba278c569a languageName: node linkType: hard -"@babel/core@npm:^7.23.2": - version: 7.23.2 - resolution: "@babel/core@npm:7.23.2" +"@babel/compat-data@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/compat-data@npm:7.23.5" + checksum: 06ce244cda5763295a0ea924728c09bae57d35713b675175227278896946f922a63edf803c322f855a3878323d48d0255a2a3023409d2a123483c8a69ebb4744 + languageName: node + linkType: hard + +"@babel/core@npm:^7.23.5": + version: 7.23.6 + resolution: "@babel/core@npm:7.23.6" dependencies: "@ampproject/remapping": ^2.2.0 - "@babel/code-frame": ^7.22.13 - "@babel/generator": ^7.23.0 - "@babel/helper-compilation-targets": ^7.22.15 - "@babel/helper-module-transforms": ^7.23.0 - "@babel/helpers": ^7.23.2 - "@babel/parser": ^7.23.0 + "@babel/code-frame": ^7.23.5 + "@babel/generator": ^7.23.6 + "@babel/helper-compilation-targets": ^7.23.6 + "@babel/helper-module-transforms": ^7.23.3 + "@babel/helpers": ^7.23.6 + "@babel/parser": ^7.23.6 "@babel/template": ^7.22.15 - "@babel/traverse": ^7.23.2 - "@babel/types": ^7.23.0 + "@babel/traverse": ^7.23.6 + "@babel/types": ^7.23.6 convert-source-map: ^2.0.0 debug: ^4.1.0 gensync: ^1.0.0-beta.2 json5: ^2.2.3 semver: ^6.3.1 - checksum: 003897718ded16f3b75632d63cd49486bf67ff206cc7ebd1a10d49e2456f8d45740910d5ec7e42e3faf0deec7a2e96b1a02e766d19a67a8309053f0d4e57c0fe + checksum: 4bddd1b80394a64b2ee33eeb216e8a2a49ad3d74f0ca9ba678c84a37f4502b2540662d72530d78228a2a349fda837fa852eea5cd3ae28465d1188acc6055868e languageName: node linkType: hard -"@babel/generator@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/generator@npm:7.23.0" +"@babel/generator@npm:^7.23.6": + version: 7.23.6 + resolution: "@babel/generator@npm:7.23.6" dependencies: - "@babel/types": ^7.23.0 + "@babel/types": ^7.23.6 "@jridgewell/gen-mapping": ^0.3.2 "@jridgewell/trace-mapping": ^0.3.17 jsesc: ^2.5.1 - checksum: 8efe24adad34300f1f8ea2add420b28171a646edc70f2a1b3e1683842f23b8b7ffa7e35ef0119294e1901f45bfea5b3dc70abe1f10a1917ccdfb41bed69be5f1 + checksum: 1a1a1c4eac210f174cd108d479464d053930a812798e09fee069377de39a893422df5b5b146199ead7239ae6d3a04697b45fc9ac6e38e0f6b76374390f91fc6c languageName: node linkType: hard -"@babel/helper-compilation-targets@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/helper-compilation-targets@npm:7.22.15" +"@babel/helper-compilation-targets@npm:^7.23.6": + version: 7.23.6 + resolution: "@babel/helper-compilation-targets@npm:7.23.6" dependencies: - "@babel/compat-data": ^7.22.9 - "@babel/helper-validator-option": ^7.22.15 - browserslist: ^4.21.9 + "@babel/compat-data": ^7.23.5 + "@babel/helper-validator-option": ^7.23.5 + browserslist: ^4.22.2 lru-cache: ^5.1.1 semver: ^6.3.1 - checksum: ce85196769e091ae54dd39e4a80c2a9df1793da8588e335c383d536d54f06baf648d0a08fc873044f226398c4ded15c4ae9120ee18e7dfd7c639a68e3cdc9980 + checksum: c630b98d4527ac8fe2c58d9a06e785dfb2b73ec71b7c4f2ddf90f814b5f75b547f3c015f110a010fd31f76e3864daaf09f3adcd2f6acdbfb18a8de3a48717590 languageName: node linkType: hard @@ -140,9 +150,9 @@ __metadata: languageName: node linkType: hard -"@babel/helper-module-transforms@npm:^7.23.0": - version: 7.23.0 - resolution: "@babel/helper-module-transforms@npm:7.23.0" +"@babel/helper-module-transforms@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/helper-module-transforms@npm:7.23.3" dependencies: "@babel/helper-environment-visitor": ^7.22.20 "@babel/helper-module-imports": ^7.22.15 @@ -151,7 +161,7 @@ __metadata: "@babel/helper-validator-identifier": ^7.22.20 peerDependencies: "@babel/core": ^7.0.0 - checksum: 6e2afffb058cf3f8ce92f5116f710dda4341c81cfcd872f9a0197ea594f7ce0ab3cb940b0590af2fe99e60d2e5448bfba6bca8156ed70a2ed4be2adc8586c891 + checksum: 5d0895cfba0e16ae16f3aa92fee108517023ad89a855289c4eb1d46f7aef4519adf8e6f971e1d55ac20c5461610e17213f1144097a8f932e768a9132e2278d71 languageName: node linkType: hard @@ -194,6 +204,13 @@ __metadata: languageName: node linkType: hard +"@babel/helper-string-parser@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/helper-string-parser@npm:7.23.4" + checksum: c0641144cf1a7e7dc93f3d5f16d5327465b6cf5d036b48be61ecba41e1eece161b48f46b7f960951b67f8c3533ce506b16dece576baef4d8b3b49f8c65410f90 + languageName: node + linkType: hard + "@babel/helper-validator-identifier@npm:^7.18.6, @babel/helper-validator-identifier@npm:^7.19.1": version: 7.19.1 resolution: "@babel/helper-validator-identifier@npm:7.19.1" @@ -208,21 +225,21 @@ __metadata: languageName: node linkType: hard -"@babel/helper-validator-option@npm:^7.22.15": - version: 7.22.15 - resolution: "@babel/helper-validator-option@npm:7.22.15" - checksum: 68da52b1e10002a543161494c4bc0f4d0398c8fdf361d5f7f4272e95c45d5b32d974896d44f6a0ea7378c9204988879d73613ca683e13bd1304e46d25ff67a8d +"@babel/helper-validator-option@npm:^7.23.5": + version: 7.23.5 + resolution: "@babel/helper-validator-option@npm:7.23.5" + checksum: 537cde2330a8aede223552510e8a13e9c1c8798afee3757995a7d4acae564124fe2bf7e7c3d90d62d3657434a74340a274b3b3b1c6f17e9a2be1f48af29cb09e languageName: node linkType: hard -"@babel/helpers@npm:^7.23.2": - version: 7.23.2 - resolution: "@babel/helpers@npm:7.23.2" +"@babel/helpers@npm:^7.23.6": + version: 7.23.6 + resolution: "@babel/helpers@npm:7.23.6" dependencies: "@babel/template": ^7.22.15 - "@babel/traverse": ^7.23.2 - "@babel/types": ^7.23.0 - checksum: aaf4828df75ec460eaa70e5c9f66e6dadc28dae3728ddb7f6c13187dbf38030e142194b83d81aa8a31bbc35a5529a5d7d3f3cf59d5d0b595f5dd7f9d8f1ced8e + "@babel/traverse": ^7.23.6 + "@babel/types": ^7.23.6 + checksum: c5ba62497e1d717161d107c4b3de727565c68b6b9f50f59d6298e613afeca8895799b227c256e06d362e565aec34e26fb5c675b9c3d25055c52b945a21c21e21 languageName: node linkType: hard @@ -248,7 +265,18 @@ __metadata: languageName: node linkType: hard -"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.22.15, @babel/parser@npm:^7.23.0": +"@babel/highlight@npm:^7.23.4": + version: 7.23.4 + resolution: "@babel/highlight@npm:7.23.4" + dependencies: + "@babel/helper-validator-identifier": ^7.22.20 + chalk: ^2.4.2 + js-tokens: ^4.0.0 + checksum: 643acecdc235f87d925979a979b539a5d7d1f31ae7db8d89047269082694122d11aa85351304c9c978ceeb6d250591ccadb06c366f358ccee08bb9c122476b89 + languageName: node + linkType: hard + +"@babel/parser@npm:^7.1.0, @babel/parser@npm:^7.22.15": version: 7.23.0 resolution: "@babel/parser@npm:7.23.0" bin: @@ -266,25 +294,34 @@ __metadata: languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-self@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-jsx-self@npm:7.22.5" +"@babel/parser@npm:^7.23.6": + version: 7.23.6 + resolution: "@babel/parser@npm:7.23.6" + bin: + parser: ./bin/babel-parser.js + checksum: 140801c43731a6c41fd193f5c02bc71fd647a0360ca616b23d2db8be4b9739b9f951a03fc7c2db4f9b9214f4b27c1074db0f18bc3fa653783082d5af7c8860d5 + languageName: node + linkType: hard + +"@babel/plugin-transform-react-jsx-self@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-react-jsx-self@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 671eebfabd14a0c7d6ae805fff7e289dfdb7ba984bb100ea2ef6dad1d6a665ebbb09199ab2e64fca7bc78bd0fdc80ca897b07996cf215fafc32c67bc564309af + checksum: 882bf56bc932d015c2d83214133939ddcf342e5bcafa21f1a93b19f2e052145115e1e0351730897fd66e5f67cad7875b8a8d81ceb12b6e2a886ad0102cb4eb1f languageName: node linkType: hard -"@babel/plugin-transform-react-jsx-source@npm:^7.22.5": - version: 7.22.5 - resolution: "@babel/plugin-transform-react-jsx-source@npm:7.22.5" +"@babel/plugin-transform-react-jsx-source@npm:^7.23.3": + version: 7.23.3 + resolution: "@babel/plugin-transform-react-jsx-source@npm:7.23.3" dependencies: "@babel/helper-plugin-utils": ^7.22.5 peerDependencies: "@babel/core": ^7.0.0-0 - checksum: 4ca2bd62ca14f8bbdcda9139f3f799e1c1c1bae504b67c1ca9bca142c53d81926d1a2b811f66a625f20999b2d352131053d886601f1ba3c1e9378c104d884277 + checksum: 92287fb797e522d99bdc77eaa573ce79ff0ad9f1cf4e7df374645e28e51dce0adad129f6f075430b129b5bac8dad843f65021970e12e992d6d6671f0d65bb1e0 languageName: node linkType: hard @@ -308,21 +345,21 @@ __metadata: languageName: node linkType: hard -"@babel/traverse@npm:^7.23.2": - version: 7.23.2 - resolution: "@babel/traverse@npm:7.23.2" +"@babel/traverse@npm:^7.23.6": + version: 7.23.6 + resolution: "@babel/traverse@npm:7.23.6" dependencies: - "@babel/code-frame": ^7.22.13 - "@babel/generator": ^7.23.0 + "@babel/code-frame": ^7.23.5 + "@babel/generator": ^7.23.6 "@babel/helper-environment-visitor": ^7.22.20 "@babel/helper-function-name": ^7.23.0 "@babel/helper-hoist-variables": ^7.22.5 "@babel/helper-split-export-declaration": ^7.22.6 - "@babel/parser": ^7.23.0 - "@babel/types": ^7.23.0 - debug: ^4.1.0 + "@babel/parser": ^7.23.6 + "@babel/types": ^7.23.6 + debug: ^4.3.1 globals: ^11.1.0 - checksum: 26a1eea0dde41ab99dde8b9773a013a0dc50324e5110a049f5d634e721ff08afffd54940b3974a20308d7952085ac769689369e9127dea655f868c0f6e1ab35d + checksum: 48f2eac0e86b6cb60dab13a5ea6a26ba45c450262fccdffc334c01089e75935f7546be195e260e97f6e43cea419862eda095018531a2718fef8189153d479f88 languageName: node linkType: hard @@ -348,6 +385,17 @@ __metadata: languageName: node linkType: hard +"@babel/types@npm:^7.23.6": + version: 7.23.6 + resolution: "@babel/types@npm:7.23.6" + dependencies: + "@babel/helper-string-parser": ^7.23.4 + "@babel/helper-validator-identifier": ^7.22.20 + to-fast-properties: ^2.0.0 + checksum: 68187dbec0d637f79bc96263ac95ec8b06d424396678e7e225492be866414ce28ebc918a75354d4c28659be6efe30020b4f0f6df81cc418a2d30645b690a8de0 + languageName: node + linkType: hard + "@chakra-ui/accordion@npm:2.3.1": version: 2.3.1 resolution: "@chakra-ui/accordion@npm:2.3.1" @@ -367,9 +415,9 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/alert@npm:2.2.1": - version: 2.2.1 - resolution: "@chakra-ui/alert@npm:2.2.1" +"@chakra-ui/alert@npm:2.2.2": + version: 2.2.2 + resolution: "@chakra-ui/alert@npm:2.2.2" dependencies: "@chakra-ui/icon": 3.2.0 "@chakra-ui/react-context": 2.1.0 @@ -378,14 +426,14 @@ __metadata: peerDependencies: "@chakra-ui/system": ">=2.0.0" react: ">=18" - checksum: 23a48b4bf8b8ca73bf2b94a4b18bc3d9e27709fe9d8968fb00ea6b0890c3d52503ebfbab91c8a7820045924b4fb37c414a50fb1bc1a9fe51a51263f775bf4f47 + checksum: f13a7b3c128447b915d8481105bb994fd382edb45273f0c59733c02cec4d891561db8462d5b4b0148f405ec3228b7e78dddb1dc03c2905dc4a0ec21e2c915822 languageName: node linkType: hard -"@chakra-ui/anatomy@npm:2.2.1": - version: 2.2.1 - resolution: "@chakra-ui/anatomy@npm:2.2.1" - checksum: 61f529cf47166a9a8de76411e2e64f533c2b7d3ca36c59d628e9dc532470f899b45c09c9da5d43048fe30564a2258309301c6266f4c1b828ff865373812d3481 +"@chakra-ui/anatomy@npm:2.2.2": + version: 2.2.2 + resolution: "@chakra-ui/anatomy@npm:2.2.2" + checksum: 0f760fae4a145305ef20bbff119bfbc92a54a477cd0916450dc4f88923e00856b582392ff35cfad93ee7cc9ab59a60fecbc9dd8bab9287bdd9cbe6d87031bce1 languageName: node linkType: hard @@ -454,11 +502,11 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/checkbox@npm:2.3.1": - version: 2.3.1 - resolution: "@chakra-ui/checkbox@npm:2.3.1" +"@chakra-ui/checkbox@npm:2.3.2": + version: 2.3.2 + resolution: "@chakra-ui/checkbox@npm:2.3.2" dependencies: - "@chakra-ui/form-control": 2.1.1 + "@chakra-ui/form-control": 2.2.0 "@chakra-ui/react-context": 2.1.0 "@chakra-ui/react-types": 2.0.7 "@chakra-ui/react-use-callback-ref": 2.1.0 @@ -472,7 +520,7 @@ __metadata: peerDependencies: "@chakra-ui/system": ">=2.0.0" react: ">=18" - checksum: 26f14892b10df284102b9614216be25aa81925ca8307b20083157af5f3339247f220fb14963570120ca51b26d0ff6de1c7d41cf6d47ed81f026429d645f2a8d8 + checksum: b3dcf8b8e5530fd51df2b761a1721c554f01aa7d3e02fed6d8e12697715c73f6d42c9f80d116f4fc7b757f82f89bea876f1bc0c59cd4d64480c3f7536b0208ac languageName: node linkType: hard @@ -602,9 +650,9 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/form-control@npm:2.1.1": - version: 2.1.1 - resolution: "@chakra-ui/form-control@npm:2.1.1" +"@chakra-ui/form-control@npm:2.2.0": + version: 2.2.0 + resolution: "@chakra-ui/form-control@npm:2.2.0" dependencies: "@chakra-ui/icon": 3.2.0 "@chakra-ui/react-context": 2.1.0 @@ -614,7 +662,7 @@ __metadata: peerDependencies: "@chakra-ui/system": ">=2.0.0" react: ">=18" - checksum: 4b0ad7a597f1e1858e279cf2daa07d81b5246d67adda86f6fec3e289bbfba5d174fb240614d0395067322396ffbbad6529a53a2cd4468f29dcdd5ab7f3d56a8c + checksum: 3ac04664c4a063c83329a51f2ece019c866d5d08cf2c896beb29643205d258d74a9bed8072d00d37ff236b799b0a870b37cba29e295305fbce4b457906e7c025 languageName: node linkType: hard @@ -669,11 +717,11 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/input@npm:2.1.1": - version: 2.1.1 - resolution: "@chakra-ui/input@npm:2.1.1" +"@chakra-ui/input@npm:2.1.2": + version: 2.1.2 + resolution: "@chakra-ui/input@npm:2.1.2" dependencies: - "@chakra-ui/form-control": 2.1.1 + "@chakra-ui/form-control": 2.2.0 "@chakra-ui/object-utils": 2.1.0 "@chakra-ui/react-children-utils": 2.0.6 "@chakra-ui/react-context": 2.1.0 @@ -681,7 +729,7 @@ __metadata: peerDependencies: "@chakra-ui/system": ">=2.0.0" react: ">=18" - checksum: 539413039aadc8cf0594351978b9ada796d9c6be18fa852509a5f390a2bf3f83645ce1f6b8b6772d77b3c71e3879c9bcab8542c04f61acee12cc1262d26760e2 + checksum: 0db226c07d0b4c726632036d08dada467c7676e3b4fe2b0881d8885f8b6903563d20d106c9052d60e1a56b67f498e30155fd47e4efe2dbd35cefdee427c740d8 languageName: node linkType: hard @@ -782,12 +830,12 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/number-input@npm:2.1.1": - version: 2.1.1 - resolution: "@chakra-ui/number-input@npm:2.1.1" +"@chakra-ui/number-input@npm:2.1.2": + version: 2.1.2 + resolution: "@chakra-ui/number-input@npm:2.1.2" dependencies: "@chakra-ui/counter": 2.1.0 - "@chakra-ui/form-control": 2.1.1 + "@chakra-ui/form-control": 2.2.0 "@chakra-ui/icon": 3.2.0 "@chakra-ui/react-context": 2.1.0 "@chakra-ui/react-types": 2.0.7 @@ -801,7 +849,7 @@ __metadata: peerDependencies: "@chakra-ui/system": ">=2.0.0" react: ">=18" - checksum: ed8fa2f5d71e31f87025724865b1da8b70a216104bcd04d354b141d2349bc9b5c5d15f7a600f432903b8f8b61e51ed22bdb308cc7cb78de6699fe0e10643bf0d + checksum: fcce1dedfb50a0246dc2d87e96b0faa472e43c47ae9c9821bd6bf94457737d954024ecbf2dc9cf05437169cf12c84cb3af59733d8e38dc5df5295931b9573a26 languageName: node linkType: hard @@ -897,29 +945,29 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/provider@npm:2.4.1": - version: 2.4.1 - resolution: "@chakra-ui/provider@npm:2.4.1" +"@chakra-ui/provider@npm:2.4.2": + version: 2.4.2 + resolution: "@chakra-ui/provider@npm:2.4.2" dependencies: "@chakra-ui/css-reset": 2.3.0 "@chakra-ui/portal": 2.1.0 "@chakra-ui/react-env": 3.1.0 - "@chakra-ui/system": 2.6.1 + "@chakra-ui/system": 2.6.2 "@chakra-ui/utils": 2.0.15 peerDependencies: "@emotion/react": ^11.0.0 "@emotion/styled": ^11.0.0 react: ">=18" react-dom: ">=18" - checksum: 0acbd0afb52f8f79dc800babf7e75270886e446b2fb891e4ca780429b7a75921f9a02818172d2068e88270e930072768fbbe1a19db3fccec1e79bb4751771240 + checksum: 8ecb657ca2c15ba975e01b1f127f774a10f7ea8eed032cec84e0c82e223eb66dce6834da8f6c8f0ab8aa3cde1867c1e10e77bb4cb6488f1e009ca97bc4d9be6f languageName: node linkType: hard -"@chakra-ui/radio@npm:2.1.1": - version: 2.1.1 - resolution: "@chakra-ui/radio@npm:2.1.1" +"@chakra-ui/radio@npm:2.1.2": + version: 2.1.2 + resolution: "@chakra-ui/radio@npm:2.1.2" dependencies: - "@chakra-ui/form-control": 2.1.1 + "@chakra-ui/form-control": 2.2.0 "@chakra-ui/react-context": 2.1.0 "@chakra-ui/react-types": 2.0.7 "@chakra-ui/react-use-merge-refs": 2.1.0 @@ -928,7 +976,7 @@ __metadata: peerDependencies: "@chakra-ui/system": ">=2.0.0" react: ">=18" - checksum: 946adad1d03b66eb73a72d5e8af4196869c118f3baec19be5269d3258e500a15573b48035e543a4b5f67414ea65279ee4af68438daa8b2ac2f503dcecc909294 + checksum: 44b99b830bd3b5e5e0e2332c2c38908abd2740fd0dc695fcd899a06f5f76cfed318f85dce66d9eb12a982daf4797a1945eb2653d1ca1ac3bc34295dce7ab147c languageName: node linkType: hard @@ -1162,60 +1210,60 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/react@npm:^2.8.1": - version: 2.8.1 - resolution: "@chakra-ui/react@npm:2.8.1" +"@chakra-ui/react@npm:^2.8.2": + version: 2.8.2 + resolution: "@chakra-ui/react@npm:2.8.2" dependencies: "@chakra-ui/accordion": 2.3.1 - "@chakra-ui/alert": 2.2.1 + "@chakra-ui/alert": 2.2.2 "@chakra-ui/avatar": 2.3.0 "@chakra-ui/breadcrumb": 2.2.0 "@chakra-ui/button": 2.1.0 "@chakra-ui/card": 2.2.0 - "@chakra-ui/checkbox": 2.3.1 + "@chakra-ui/checkbox": 2.3.2 "@chakra-ui/close-button": 2.1.1 "@chakra-ui/control-box": 2.1.0 "@chakra-ui/counter": 2.1.0 "@chakra-ui/css-reset": 2.3.0 "@chakra-ui/editable": 3.1.0 "@chakra-ui/focus-lock": 2.1.0 - "@chakra-ui/form-control": 2.1.1 + "@chakra-ui/form-control": 2.2.0 "@chakra-ui/hooks": 2.2.1 "@chakra-ui/icon": 3.2.0 "@chakra-ui/image": 2.1.0 - "@chakra-ui/input": 2.1.1 + "@chakra-ui/input": 2.1.2 "@chakra-ui/layout": 2.3.1 "@chakra-ui/live-region": 2.1.0 "@chakra-ui/media-query": 3.3.0 "@chakra-ui/menu": 2.2.1 "@chakra-ui/modal": 2.3.1 - "@chakra-ui/number-input": 2.1.1 + "@chakra-ui/number-input": 2.1.2 "@chakra-ui/pin-input": 2.1.0 "@chakra-ui/popover": 2.2.1 "@chakra-ui/popper": 3.1.0 "@chakra-ui/portal": 2.1.0 "@chakra-ui/progress": 2.2.0 - "@chakra-ui/provider": 2.4.1 - "@chakra-ui/radio": 2.1.1 + "@chakra-ui/provider": 2.4.2 + "@chakra-ui/radio": 2.1.2 "@chakra-ui/react-env": 3.1.0 - "@chakra-ui/select": 2.1.1 + "@chakra-ui/select": 2.1.2 "@chakra-ui/skeleton": 2.1.0 "@chakra-ui/skip-nav": 2.1.0 "@chakra-ui/slider": 2.1.0 "@chakra-ui/spinner": 2.1.0 "@chakra-ui/stat": 2.1.1 "@chakra-ui/stepper": 2.3.1 - "@chakra-ui/styled-system": 2.9.1 - "@chakra-ui/switch": 2.1.1 - "@chakra-ui/system": 2.6.1 + "@chakra-ui/styled-system": 2.9.2 + "@chakra-ui/switch": 2.1.2 + "@chakra-ui/system": 2.6.2 "@chakra-ui/table": 2.1.0 "@chakra-ui/tabs": 3.0.0 "@chakra-ui/tag": 3.1.1 - "@chakra-ui/textarea": 2.1.1 - "@chakra-ui/theme": 3.3.0 - "@chakra-ui/theme-utils": 2.0.20 - "@chakra-ui/toast": 7.0.1 - "@chakra-ui/tooltip": 2.3.0 + "@chakra-ui/textarea": 2.1.2 + "@chakra-ui/theme": 3.3.1 + "@chakra-ui/theme-utils": 2.0.21 + "@chakra-ui/toast": 7.0.2 + "@chakra-ui/tooltip": 2.3.1 "@chakra-ui/transition": 2.1.0 "@chakra-ui/utils": 2.0.15 "@chakra-ui/visually-hidden": 2.2.0 @@ -1225,20 +1273,20 @@ __metadata: framer-motion: ">=4.0.0" react: ">=18" react-dom: ">=18" - checksum: e15028e1a19b7d0ed20c20bc033ce623ad33f229400b2640991af4c24baa0c2e1fafaeea2788b5ab4e9cc4a084482476d18abe44ad895d9899dfa1ff1e5cc6ed + checksum: f7af6ec5f248e7995030a4f61c6f815bef7bb9fbebd652a4f2eff9b313db007124e8f636727a50f4d40f6f4550249c5920bb47f024cc34a3e97286a02666ea98 languageName: node linkType: hard -"@chakra-ui/select@npm:2.1.1": - version: 2.1.1 - resolution: "@chakra-ui/select@npm:2.1.1" +"@chakra-ui/select@npm:2.1.2": + version: 2.1.2 + resolution: "@chakra-ui/select@npm:2.1.2" dependencies: - "@chakra-ui/form-control": 2.1.1 + "@chakra-ui/form-control": 2.2.0 "@chakra-ui/shared-utils": 2.0.5 peerDependencies: "@chakra-ui/system": ">=2.0.0" react: ">=18" - checksum: c8c2aa4c02d6a17b2bf85a82513ebb52c8948859919a7d81552f89d8c49b2219a0617a30910b459d521e3a37fc60f15f10dcdfa4586a8d0140bdfd5d84baf395 + checksum: d98ea14cc9146bfad976c5f230970adf7012251c6895d8e0f24ad36ae478351717cc99cc12f1e3ce8b1b314b6712a5481d9e2a9364bb7cd0f05d55d06a27bf32 languageName: node linkType: hard @@ -1334,47 +1382,47 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/styled-system@npm:2.9.1": - version: 2.9.1 - resolution: "@chakra-ui/styled-system@npm:2.9.1" +"@chakra-ui/styled-system@npm:2.9.2": + version: 2.9.2 + resolution: "@chakra-ui/styled-system@npm:2.9.2" dependencies: "@chakra-ui/shared-utils": 2.0.5 - csstype: ^3.0.11 + csstype: ^3.1.2 lodash.mergewith: 4.6.2 - checksum: 23ee15b4b49e3981e3ff28f040f410715e9abc1957d6808a6d3d625acdb2223201f3a89f714813da36988e11b921adcc5f842ec3ec992fffebfb89edee4dac4e + checksum: 05202a86f1d8c6f37b5a95a56d7aed6b24fe12ac17f54690d46fcc7715e5e78e34a2aa0a15dc83e26396c4d7bc8188e761ddc2938e65cd782b11576a66a73519 languageName: node linkType: hard -"@chakra-ui/switch@npm:2.1.1": - version: 2.1.1 - resolution: "@chakra-ui/switch@npm:2.1.1" +"@chakra-ui/switch@npm:2.1.2": + version: 2.1.2 + resolution: "@chakra-ui/switch@npm:2.1.2" dependencies: - "@chakra-ui/checkbox": 2.3.1 + "@chakra-ui/checkbox": 2.3.2 "@chakra-ui/shared-utils": 2.0.5 peerDependencies: "@chakra-ui/system": ">=2.0.0" framer-motion: ">=4.0.0" react: ">=18" - checksum: c499e1121c828c1acf1ef5832d0ddb5e775d8fc26e13e8b2322fd789f6145cfd6f3a3740101ae6103f86fe9d12bea0467bac90b397681072481d784b73b1535a + checksum: 3a4e61b2e6215468e685651b7cfc118d93570210aa0b3529f2aa9eea69be3935e1b00eeb0306050edef4840f6a8920d72ff5353ffb815ef65d7d720f7b33fe82 languageName: node linkType: hard -"@chakra-ui/system@npm:2.6.1, @chakra-ui/system@npm:^2.6.1": - version: 2.6.1 - resolution: "@chakra-ui/system@npm:2.6.1" +"@chakra-ui/system@npm:2.6.2, @chakra-ui/system@npm:^2.6.2": + version: 2.6.2 + resolution: "@chakra-ui/system@npm:2.6.2" dependencies: "@chakra-ui/color-mode": 2.2.0 "@chakra-ui/object-utils": 2.1.0 "@chakra-ui/react-utils": 2.0.12 - "@chakra-ui/styled-system": 2.9.1 - "@chakra-ui/theme-utils": 2.0.20 + "@chakra-ui/styled-system": 2.9.2 + "@chakra-ui/theme-utils": 2.0.21 "@chakra-ui/utils": 2.0.15 react-fast-compare: 3.2.2 peerDependencies: "@emotion/react": ^11.0.0 "@emotion/styled": ^11.0.0 react: ">=18" - checksum: 638812588ce10e5966837ee66465a18936030267701dbac675374086cb574e5b618f9dd1f9ceea2a8f1d48c1aea1f286f848f4d41452423a88bc24b2a5ce60e1 + checksum: 45ac01d0d9adb9391ec5ece3ad1ef7cc09e73720c0222df02f5a45a37bb120cfbf994b15c08b72e7018a866d9475c5c57f61638774d8d7c5c0c40da8714a347c languageName: node linkType: hard @@ -1424,82 +1472,82 @@ __metadata: languageName: node linkType: hard -"@chakra-ui/textarea@npm:2.1.1": - version: 2.1.1 - resolution: "@chakra-ui/textarea@npm:2.1.1" +"@chakra-ui/textarea@npm:2.1.2": + version: 2.1.2 + resolution: "@chakra-ui/textarea@npm:2.1.2" dependencies: - "@chakra-ui/form-control": 2.1.1 + "@chakra-ui/form-control": 2.2.0 "@chakra-ui/shared-utils": 2.0.5 peerDependencies: "@chakra-ui/system": ">=2.0.0" react: ">=18" - checksum: 07f9067fe027da882be00715a45ea93504c84b2ca991031ef0a196636b85e747413d6bb28620414b877ce935fd71ded774f4fc64ca060064f7acf504394393eb + checksum: 35d483cf1d5e87dea1157624129bff651b6595be85ea25797465c1b44ccae617db81cacfb3f35ecefe2db0700a06710db77397ddfdbfec9157a1e920da5f6739 languageName: node linkType: hard -"@chakra-ui/theme-tools@npm:2.1.1": - version: 2.1.1 - resolution: "@chakra-ui/theme-tools@npm:2.1.1" +"@chakra-ui/theme-tools@npm:2.1.2": + version: 2.1.2 + resolution: "@chakra-ui/theme-tools@npm:2.1.2" dependencies: - "@chakra-ui/anatomy": 2.2.1 + "@chakra-ui/anatomy": 2.2.2 "@chakra-ui/shared-utils": 2.0.5 color2k: ^2.0.2 peerDependencies: "@chakra-ui/styled-system": ">=2.0.0" - checksum: c038686d489401395f551298096c66236fe204a943fd859565b2804ec2a448241245032e702297dfc6c3d4e7fc1945e2998f8350eace1c4ab2ac23cd7688863f + checksum: aa628824a9485d7bc28b468f7395b1ebfd2fee88e656b9d9626f4521c0f9b28bba656db1f5b74c34ae7ce2dc6d25d1789b3e227dd1fd2d36c230f8a97330e529 languageName: node linkType: hard -"@chakra-ui/theme-utils@npm:2.0.20": - version: 2.0.20 - resolution: "@chakra-ui/theme-utils@npm:2.0.20" +"@chakra-ui/theme-utils@npm:2.0.21": + version: 2.0.21 + resolution: "@chakra-ui/theme-utils@npm:2.0.21" dependencies: "@chakra-ui/shared-utils": 2.0.5 - "@chakra-ui/styled-system": 2.9.1 - "@chakra-ui/theme": 3.3.0 + "@chakra-ui/styled-system": 2.9.2 + "@chakra-ui/theme": 3.3.1 lodash.mergewith: 4.6.2 - checksum: be8bd98609d95d64eb5db2f54dbf26f2113342f724b31899455be71a46de4d8751327c2055735a2ec8021ada55a7575f7063df18b55f9393e880db3d1376e242 + checksum: d43f15d2c264cb96cfee0acf64681308763d27940b42f6de76eb8f297623dd4236c80ccf845b06851ca15f1c53a7ca9af69dce1c6d6467bb17612d1c60629197 languageName: node linkType: hard -"@chakra-ui/theme@npm:3.3.0": - version: 3.3.0 - resolution: "@chakra-ui/theme@npm:3.3.0" +"@chakra-ui/theme@npm:3.3.1": + version: 3.3.1 + resolution: "@chakra-ui/theme@npm:3.3.1" dependencies: - "@chakra-ui/anatomy": 2.2.1 + "@chakra-ui/anatomy": 2.2.2 "@chakra-ui/shared-utils": 2.0.5 - "@chakra-ui/theme-tools": 2.1.1 + "@chakra-ui/theme-tools": 2.1.2 peerDependencies: "@chakra-ui/styled-system": ">=2.8.0" - checksum: 6648d760e47fdc95d10cfa85f943e1ab1206be652f0db77c864e95e938b8ee13a012a53e1941b22fd81c12cc2c27504d64c06682daf141267b86ec3c7f4c165b + checksum: 0232cb4a5674dd7252b7070ecc890dee9fc4fe51527005aa47009342edcf8f13fef7f3b8c70b74c0b73ba86cdeabe892b2ab8469cecfc19ae3350a66bccb43eb languageName: node linkType: hard -"@chakra-ui/toast@npm:7.0.1": - version: 7.0.1 - resolution: "@chakra-ui/toast@npm:7.0.1" +"@chakra-ui/toast@npm:7.0.2": + version: 7.0.2 + resolution: "@chakra-ui/toast@npm:7.0.2" dependencies: - "@chakra-ui/alert": 2.2.1 + "@chakra-ui/alert": 2.2.2 "@chakra-ui/close-button": 2.1.1 "@chakra-ui/portal": 2.1.0 "@chakra-ui/react-context": 2.1.0 "@chakra-ui/react-use-timeout": 2.1.0 "@chakra-ui/react-use-update-effect": 2.1.0 "@chakra-ui/shared-utils": 2.0.5 - "@chakra-ui/styled-system": 2.9.1 - "@chakra-ui/theme": 3.3.0 + "@chakra-ui/styled-system": 2.9.2 + "@chakra-ui/theme": 3.3.1 peerDependencies: - "@chakra-ui/system": 2.6.1 + "@chakra-ui/system": 2.6.2 framer-motion: ">=4.0.0" react: ">=18" react-dom: ">=18" - checksum: 21df2923492de633f81085b8aa22b421c1f5b2f3c6bf2d3280dc04c2f4211f44aaf1e5c3b9aa4367827ba33b74ffc777823ecdbeddb7940389e7d9da0bfb37d1 + checksum: 5e996a53b82628c90e11054d900ab4c714bb6b1a9b74198fbbfc49692175278fc482820578090d0eb27180d3772937ed9fb54ba8f3acfdbbbc20e859c1b55338 languageName: node linkType: hard -"@chakra-ui/tooltip@npm:2.3.0": - version: 2.3.0 - resolution: "@chakra-ui/tooltip@npm:2.3.0" +"@chakra-ui/tooltip@npm:2.3.1": + version: 2.3.1 + resolution: "@chakra-ui/tooltip@npm:2.3.1" dependencies: "@chakra-ui/dom-utils": 2.1.0 "@chakra-ui/popper": 3.1.0 @@ -1514,7 +1562,7 @@ __metadata: framer-motion: ">=4.0.0" react: ">=18" react-dom: ">=18" - checksum: aaab684191f3e45803353ffec9c17bf7ebecdf090b0d6422527886995c7d2be32e3bdd0442b19d4ab0e0baf1f0a9202095b5ed2fe47e07b2f684ae2150b5c7bf + checksum: 047bb349fd80382d4f2ee4086119ca80a584b879c4525891e0fb602db0e857dfead4a35c1eb27d4b0c4ce0ac9c0324e63b9fb5f984389297eee2cd1a684f8e1a languageName: node linkType: hard @@ -1552,65 +1600,65 @@ __metadata: languageName: node linkType: hard -"@dnd-kit/accessibility@npm:^3.0.0": - version: 3.0.1 - resolution: "@dnd-kit/accessibility@npm:3.0.1" +"@dnd-kit/accessibility@npm:^3.1.0": + version: 3.1.0 + resolution: "@dnd-kit/accessibility@npm:3.1.0" dependencies: tslib: ^2.0.0 peerDependencies: react: ">=16.8.0" - checksum: 0afc2c0fce9a1c107453620ca0da1778f182d340e74ffbc6e369ef0ac8943cafb929d3a6c0891d9b915aa23b2b92137ff4fad958f43118466586d8129a3359d5 + checksum: fcb88c961e2f4c226ab575bc4a13712419884bb0f60761befcaa23bcb6c9939dc2cac6633416f2a07baee9a8830350c6df444039332408cdaaf27cad17c6b64b languageName: node linkType: hard -"@dnd-kit/core@npm:^6.0.8": - version: 6.0.8 - resolution: "@dnd-kit/core@npm:6.0.8" +"@dnd-kit/core@npm:^6.1.0": + version: 6.1.0 + resolution: "@dnd-kit/core@npm:6.1.0" dependencies: - "@dnd-kit/accessibility": ^3.0.0 - "@dnd-kit/utilities": ^3.2.1 + "@dnd-kit/accessibility": ^3.1.0 + "@dnd-kit/utilities": ^3.2.2 tslib: ^2.0.0 peerDependencies: react: ">=16.8.0" react-dom: ">=16.8.0" - checksum: abe48ff7395f84fd8c15e6c8b13da4df153dc1f1076096d783acd0c25539516c77e4854ea59be6621dde55739cb0df1d62924ad069df3267fe05ad90ef729b2f + checksum: 3b8f46d2f4d2723abad4721c7bc4d1df2c4f6f26ce54673243666212cfa6f34f33e3255b53144a847da469dc736c966c19e4c45330f967ce8c01f8f878ec7f5b languageName: node linkType: hard -"@dnd-kit/modifiers@npm:^6.0.1": - version: 6.0.1 - resolution: "@dnd-kit/modifiers@npm:6.0.1" +"@dnd-kit/modifiers@npm:^7.0.0": + version: 7.0.0 + resolution: "@dnd-kit/modifiers@npm:7.0.0" dependencies: - "@dnd-kit/utilities": ^3.2.1 + "@dnd-kit/utilities": ^3.2.2 tslib: ^2.0.0 peerDependencies: - "@dnd-kit/core": ^6.0.6 + "@dnd-kit/core": ^6.1.0 react: ">=16.8.0" - checksum: cd31715aac81baa2398558dc7c877a483d1c4c41cdb2f466557fdc41bb742db5cd1b34b3b84332b94ac4a2835e7e5a0e28c64e621936e976399788f1dd029ea4 + checksum: 176f76a552a2692a205f7fe647c836aa7ded7f0fdc3370407f3633c153139fe838cb85e59cbc3b156377cc8fe3fb7b72af15b97ed3de15cec904eae35f0c36e6 languageName: node linkType: hard -"@dnd-kit/sortable@npm:^7.0.2": - version: 7.0.2 - resolution: "@dnd-kit/sortable@npm:7.0.2" +"@dnd-kit/sortable@npm:^8.0.0": + version: 8.0.0 + resolution: "@dnd-kit/sortable@npm:8.0.0" dependencies: - "@dnd-kit/utilities": ^3.2.0 + "@dnd-kit/utilities": ^3.2.2 tslib: ^2.0.0 peerDependencies: - "@dnd-kit/core": ^6.0.7 + "@dnd-kit/core": ^6.1.0 react: ">=16.8.0" - checksum: 4ce705aceb15766a0deefe25a9d95a87e9413c3fb9088ea3eb0962e57f844895000117fcec7c0944a0d4ae4e1e889cfa69e3d3778164d4d23115fb1edb218283 + checksum: 26589fd23c18d930a949489b232a7345c0bee4abb6be91d3673232bc79085f13cb5d82087c2068edbc51cbdd3d47c2fe386bada92dc7f2d0dcde13d6be379daa languageName: node linkType: hard -"@dnd-kit/utilities@npm:^3.2.0, @dnd-kit/utilities@npm:^3.2.1": - version: 3.2.1 - resolution: "@dnd-kit/utilities@npm:3.2.1" +"@dnd-kit/utilities@npm:^3.2.2": + version: 3.2.2 + resolution: "@dnd-kit/utilities@npm:3.2.2" dependencies: tslib: ^2.0.0 peerDependencies: react: ">=16.8.0" - checksum: 038fd5cc1328bf4c9dca17cd48046e5a687bbf9d904c7197f851aab869ab52d9dee2734b2e255256fd6158245acd00063a23deed962c7673c0fadfbf061f04ca + checksum: 8a5015c2faa52760ab82a64287b2ac6a3d798867a1bca5ccbc1178560dbd9a1f9f1a21faea80f590ba1a4277c3eb7e7c4d3b4a39f1f32171bf6bc8174b370547 languageName: node linkType: hard @@ -1702,14 +1750,14 @@ __metadata: languageName: node linkType: hard -"@emotion/react@npm:^11.11.1": - version: 11.11.1 - resolution: "@emotion/react@npm:11.11.1" +"@emotion/react@npm:^11.11.3": + version: 11.11.3 + resolution: "@emotion/react@npm:11.11.3" dependencies: "@babel/runtime": ^7.18.3 "@emotion/babel-plugin": ^11.11.0 "@emotion/cache": ^11.11.0 - "@emotion/serialize": ^1.1.2 + "@emotion/serialize": ^1.1.3 "@emotion/use-insertion-effect-with-fallbacks": ^1.0.1 "@emotion/utils": ^1.2.1 "@emotion/weak-memoize": ^0.3.1 @@ -1719,7 +1767,7 @@ __metadata: peerDependenciesMeta: "@types/react": optional: true - checksum: aec3c36650f5f0d3d4445ff44d73dd88712b1609645b6af3e6d08049cfbc51f1785fe13dea1a1d4ab1b0800d68f2339ab11e459687180362b1ef98863155aae5 + checksum: 2e4b223591569f0a41686d5bd72dc8778629b7be33267e4a09582979e6faee4d7218de84e76294ed827058d4384d75557b5d71724756539c1f235e9a69e62b2e languageName: node linkType: hard @@ -1736,6 +1784,19 @@ __metadata: languageName: node linkType: hard +"@emotion/serialize@npm:^1.1.3": + version: 1.1.3 + resolution: "@emotion/serialize@npm:1.1.3" + dependencies: + "@emotion/hash": ^0.9.1 + "@emotion/memoize": ^0.8.1 + "@emotion/unitless": ^0.8.1 + "@emotion/utils": ^1.2.1 + csstype: ^3.0.2 + checksum: 5a756ce7e2692322683978d8ed2e84eadd60bd6f629618a82c5018c84d98684b117e57fad0174f68ec2ec0ac089bb2e0bcc8ea8c2798eb904b6d3236aa046063 + languageName: node + linkType: hard + "@emotion/sheet@npm:^1.2.2": version: 1.2.2 resolution: "@emotion/sheet@npm:1.2.2" @@ -1793,156 +1854,156 @@ __metadata: languageName: node linkType: hard -"@esbuild/android-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/android-arm64@npm:0.18.20" +"@esbuild/android-arm64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/android-arm64@npm:0.19.8" conditions: os=android & cpu=arm64 languageName: node linkType: hard -"@esbuild/android-arm@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/android-arm@npm:0.18.20" +"@esbuild/android-arm@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/android-arm@npm:0.19.8" conditions: os=android & cpu=arm languageName: node linkType: hard -"@esbuild/android-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/android-x64@npm:0.18.20" +"@esbuild/android-x64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/android-x64@npm:0.19.8" conditions: os=android & cpu=x64 languageName: node linkType: hard -"@esbuild/darwin-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/darwin-arm64@npm:0.18.20" +"@esbuild/darwin-arm64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/darwin-arm64@npm:0.19.8" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@esbuild/darwin-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/darwin-x64@npm:0.18.20" +"@esbuild/darwin-x64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/darwin-x64@npm:0.19.8" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@esbuild/freebsd-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/freebsd-arm64@npm:0.18.20" +"@esbuild/freebsd-arm64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/freebsd-arm64@npm:0.19.8" conditions: os=freebsd & cpu=arm64 languageName: node linkType: hard -"@esbuild/freebsd-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/freebsd-x64@npm:0.18.20" +"@esbuild/freebsd-x64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/freebsd-x64@npm:0.19.8" conditions: os=freebsd & cpu=x64 languageName: node linkType: hard -"@esbuild/linux-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-arm64@npm:0.18.20" +"@esbuild/linux-arm64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/linux-arm64@npm:0.19.8" conditions: os=linux & cpu=arm64 languageName: node linkType: hard -"@esbuild/linux-arm@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-arm@npm:0.18.20" +"@esbuild/linux-arm@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/linux-arm@npm:0.19.8" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@esbuild/linux-ia32@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-ia32@npm:0.18.20" +"@esbuild/linux-ia32@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/linux-ia32@npm:0.19.8" conditions: os=linux & cpu=ia32 languageName: node linkType: hard -"@esbuild/linux-loong64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-loong64@npm:0.18.20" +"@esbuild/linux-loong64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/linux-loong64@npm:0.19.8" conditions: os=linux & cpu=loong64 languageName: node linkType: hard -"@esbuild/linux-mips64el@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-mips64el@npm:0.18.20" +"@esbuild/linux-mips64el@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/linux-mips64el@npm:0.19.8" conditions: os=linux & cpu=mips64el languageName: node linkType: hard -"@esbuild/linux-ppc64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-ppc64@npm:0.18.20" +"@esbuild/linux-ppc64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/linux-ppc64@npm:0.19.8" conditions: os=linux & cpu=ppc64 languageName: node linkType: hard -"@esbuild/linux-riscv64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-riscv64@npm:0.18.20" +"@esbuild/linux-riscv64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/linux-riscv64@npm:0.19.8" conditions: os=linux & cpu=riscv64 languageName: node linkType: hard -"@esbuild/linux-s390x@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-s390x@npm:0.18.20" +"@esbuild/linux-s390x@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/linux-s390x@npm:0.19.8" conditions: os=linux & cpu=s390x languageName: node linkType: hard -"@esbuild/linux-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/linux-x64@npm:0.18.20" +"@esbuild/linux-x64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/linux-x64@npm:0.19.8" conditions: os=linux & cpu=x64 languageName: node linkType: hard -"@esbuild/netbsd-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/netbsd-x64@npm:0.18.20" +"@esbuild/netbsd-x64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/netbsd-x64@npm:0.19.8" conditions: os=netbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/openbsd-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/openbsd-x64@npm:0.18.20" +"@esbuild/openbsd-x64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/openbsd-x64@npm:0.19.8" conditions: os=openbsd & cpu=x64 languageName: node linkType: hard -"@esbuild/sunos-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/sunos-x64@npm:0.18.20" +"@esbuild/sunos-x64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/sunos-x64@npm:0.19.8" conditions: os=sunos & cpu=x64 languageName: node linkType: hard -"@esbuild/win32-arm64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/win32-arm64@npm:0.18.20" +"@esbuild/win32-arm64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/win32-arm64@npm:0.19.8" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@esbuild/win32-ia32@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/win32-ia32@npm:0.18.20" +"@esbuild/win32-ia32@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/win32-ia32@npm:0.19.8" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@esbuild/win32-x64@npm:0.18.20": - version: 0.18.20 - resolution: "@esbuild/win32-x64@npm:0.18.20" +"@esbuild/win32-x64@npm:0.19.8": + version: 0.19.8 + resolution: "@esbuild/win32-x64@npm:0.19.8" conditions: os=win32 & cpu=x64 languageName: node linkType: hard @@ -1965,9 +2026,9 @@ __metadata: languageName: node linkType: hard -"@eslint/eslintrc@npm:^2.1.3": - version: 2.1.3 - resolution: "@eslint/eslintrc@npm:2.1.3" +"@eslint/eslintrc@npm:^2.1.4": + version: 2.1.4 + resolution: "@eslint/eslintrc@npm:2.1.4" dependencies: ajv: ^6.12.4 debug: ^4.3.2 @@ -1978,28 +2039,28 @@ __metadata: js-yaml: ^4.1.0 minimatch: ^3.1.2 strip-json-comments: ^3.1.1 - checksum: 5c6c3878192fe0ddffa9aff08b4e2f3bcc8f1c10d6449b7295a5f58b662019896deabfc19890455ffd7e60a5bd28d25d0eaefb2f78b2d230aae3879af92b89e5 + checksum: 10957c7592b20ca0089262d8c2a8accbad14b4f6507e35416c32ee6b4dbf9cad67dfb77096bbd405405e9ada2b107f3797fe94362e1c55e0b09d6e90dd149127 languageName: node linkType: hard -"@eslint/js@npm:8.53.0": - version: 8.53.0 - resolution: "@eslint/js@npm:8.53.0" - checksum: e0d5cfb0000aaee237c8e6d6d6e366faa60b1ef7f928ce17778373aa44d3b886368f6d5e1f97f913f0f16801aad016db8b8df78418c9d18825c15590328028af +"@eslint/js@npm:8.56.0": + version: 8.56.0 + resolution: "@eslint/js@npm:8.56.0" + checksum: 5804130574ef810207bdf321c265437814e7a26f4e6fac9b496de3206afd52f533e09ec002a3be06cd9adcc9da63e727f1883938e663c4e4751c007d5b58e539 languageName: node linkType: hard -"@fontsource/montserrat@npm:^5.0.15": - version: 5.0.15 - resolution: "@fontsource/montserrat@npm:5.0.15" - checksum: 314be0ad651943b68acf2fb6679c8938ba29a99b4c9bbb5e9ad37e4309782129bb9b79f86e139137c338fe7118d55ee33639327bc2e9ef19b98ab34ed15f5d38 +"@fontsource/montserrat@npm:^5.0.16": + version: 5.0.16 + resolution: "@fontsource/montserrat@npm:5.0.16" + checksum: 080a47c77f83daca759643ebb2cf332b216c082f4d271db6841b61a5e46e92184e39b63c82cedc1d62e5f55aa7db8ea63f8611de6bb7d1f6a6fe427a7b1f6cc8 languageName: node linkType: hard -"@formkit/auto-animate@npm:0.8.0": - version: 0.8.0 - resolution: "@formkit/auto-animate@npm:0.8.0" - checksum: fbe4c35e022c0d26435343368a2cac3e63d5579815925632a828797a204ad20ad17738860396a4a08f89c0b0a88c1f0f7f483e9d03c9fc4f1cf05c6c1fa0bf4f +"@formkit/auto-animate@npm:0.8.1": + version: 0.8.1 + resolution: "@formkit/auto-animate@npm:0.8.1" + checksum: ffc1a3432ce81bcf7abd4360fabf05b7aee01005e64ce519f57d134e68a5e15a81f295a7b2979678896bfd7d2048202a9fa2dbd09781267899e9056e918120c1 languageName: node linkType: hard @@ -2166,6 +2227,90 @@ __metadata: languageName: node linkType: hard +"@rollup/rollup-android-arm-eabi@npm:4.6.0": + version: 4.6.0 + resolution: "@rollup/rollup-android-arm-eabi@npm:4.6.0" + conditions: os=android & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-android-arm64@npm:4.6.0": + version: 4.6.0 + resolution: "@rollup/rollup-android-arm64@npm:4.6.0" + conditions: os=android & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-arm64@npm:4.6.0": + version: 4.6.0 + resolution: "@rollup/rollup-darwin-arm64@npm:4.6.0" + conditions: os=darwin & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-darwin-x64@npm:4.6.0": + version: 4.6.0 + resolution: "@rollup/rollup-darwin-x64@npm:4.6.0" + conditions: os=darwin & cpu=x64 + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm-gnueabihf@npm:4.6.0": + version: 4.6.0 + resolution: "@rollup/rollup-linux-arm-gnueabihf@npm:4.6.0" + conditions: os=linux & cpu=arm + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-gnu@npm:4.6.0": + version: 4.6.0 + resolution: "@rollup/rollup-linux-arm64-gnu@npm:4.6.0" + conditions: os=linux & cpu=arm64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-arm64-musl@npm:4.6.0": + version: 4.6.0 + resolution: "@rollup/rollup-linux-arm64-musl@npm:4.6.0" + conditions: os=linux & cpu=arm64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-gnu@npm:4.6.0": + version: 4.6.0 + resolution: "@rollup/rollup-linux-x64-gnu@npm:4.6.0" + conditions: os=linux & cpu=x64 & libc=glibc + languageName: node + linkType: hard + +"@rollup/rollup-linux-x64-musl@npm:4.6.0": + version: 4.6.0 + resolution: "@rollup/rollup-linux-x64-musl@npm:4.6.0" + conditions: os=linux & cpu=x64 & libc=musl + languageName: node + linkType: hard + +"@rollup/rollup-win32-arm64-msvc@npm:4.6.0": + version: 4.6.0 + resolution: "@rollup/rollup-win32-arm64-msvc@npm:4.6.0" + conditions: os=win32 & cpu=arm64 + languageName: node + linkType: hard + +"@rollup/rollup-win32-ia32-msvc@npm:4.6.0": + version: 4.6.0 + resolution: "@rollup/rollup-win32-ia32-msvc@npm:4.6.0" + conditions: os=win32 & cpu=ia32 + languageName: node + linkType: hard + +"@rollup/rollup-win32-x64-msvc@npm:4.6.0": + version: 4.6.0 + resolution: "@rollup/rollup-win32-x64-msvc@npm:4.6.0" + conditions: os=win32 & cpu=x64 + languageName: node + linkType: hard + "@tauri-apps/api@npm:1.5.0": version: 1.5.0 resolution: "@tauri-apps/api@npm:1.5.0" @@ -2173,97 +2318,97 @@ __metadata: languageName: node linkType: hard -"@tauri-apps/api@npm:^1.5.1": - version: 1.5.1 - resolution: "@tauri-apps/api@npm:1.5.1" - checksum: d69f8f2cf856aa2bd17bc6ba71dc9c11f683be6e95ad7d3657fd107d994fd96a1f609baac13bd1677cd813770c1d4c818d115c9581b86ecc67adafad0b7bedf0 +"@tauri-apps/api@npm:^1.5.3": + version: 1.5.3 + resolution: "@tauri-apps/api@npm:1.5.3" + checksum: 396f6f0630ab2cff0700f016eb84a8150cb8f16ec280e43975952448a0243503c0a0421ffa02ed7b79accef354e044dbd457ec9f73bd98273cf920610474bfbb languageName: node linkType: hard -"@tauri-apps/cli-darwin-arm64@npm:1.5.6": - version: 1.5.6 - resolution: "@tauri-apps/cli-darwin-arm64@npm:1.5.6" +"@tauri-apps/cli-darwin-arm64@npm:1.5.9": + version: 1.5.9 + resolution: "@tauri-apps/cli-darwin-arm64@npm:1.5.9" conditions: os=darwin & cpu=arm64 languageName: node linkType: hard -"@tauri-apps/cli-darwin-x64@npm:1.5.6": - version: 1.5.6 - resolution: "@tauri-apps/cli-darwin-x64@npm:1.5.6" +"@tauri-apps/cli-darwin-x64@npm:1.5.9": + version: 1.5.9 + resolution: "@tauri-apps/cli-darwin-x64@npm:1.5.9" conditions: os=darwin & cpu=x64 languageName: node linkType: hard -"@tauri-apps/cli-linux-arm-gnueabihf@npm:1.5.6": - version: 1.5.6 - resolution: "@tauri-apps/cli-linux-arm-gnueabihf@npm:1.5.6" +"@tauri-apps/cli-linux-arm-gnueabihf@npm:1.5.9": + version: 1.5.9 + resolution: "@tauri-apps/cli-linux-arm-gnueabihf@npm:1.5.9" conditions: os=linux & cpu=arm languageName: node linkType: hard -"@tauri-apps/cli-linux-arm64-gnu@npm:1.5.6": - version: 1.5.6 - resolution: "@tauri-apps/cli-linux-arm64-gnu@npm:1.5.6" +"@tauri-apps/cli-linux-arm64-gnu@npm:1.5.9": + version: 1.5.9 + resolution: "@tauri-apps/cli-linux-arm64-gnu@npm:1.5.9" conditions: os=linux & cpu=arm64 & libc=glibc languageName: node linkType: hard -"@tauri-apps/cli-linux-arm64-musl@npm:1.5.6": - version: 1.5.6 - resolution: "@tauri-apps/cli-linux-arm64-musl@npm:1.5.6" +"@tauri-apps/cli-linux-arm64-musl@npm:1.5.9": + version: 1.5.9 + resolution: "@tauri-apps/cli-linux-arm64-musl@npm:1.5.9" conditions: os=linux & cpu=arm64 & libc=musl languageName: node linkType: hard -"@tauri-apps/cli-linux-x64-gnu@npm:1.5.6": - version: 1.5.6 - resolution: "@tauri-apps/cli-linux-x64-gnu@npm:1.5.6" +"@tauri-apps/cli-linux-x64-gnu@npm:1.5.9": + version: 1.5.9 + resolution: "@tauri-apps/cli-linux-x64-gnu@npm:1.5.9" conditions: os=linux & cpu=x64 & libc=glibc languageName: node linkType: hard -"@tauri-apps/cli-linux-x64-musl@npm:1.5.6": - version: 1.5.6 - resolution: "@tauri-apps/cli-linux-x64-musl@npm:1.5.6" +"@tauri-apps/cli-linux-x64-musl@npm:1.5.9": + version: 1.5.9 + resolution: "@tauri-apps/cli-linux-x64-musl@npm:1.5.9" conditions: os=linux & cpu=x64 & libc=musl languageName: node linkType: hard -"@tauri-apps/cli-win32-arm64-msvc@npm:1.5.6": - version: 1.5.6 - resolution: "@tauri-apps/cli-win32-arm64-msvc@npm:1.5.6" +"@tauri-apps/cli-win32-arm64-msvc@npm:1.5.9": + version: 1.5.9 + resolution: "@tauri-apps/cli-win32-arm64-msvc@npm:1.5.9" conditions: os=win32 & cpu=arm64 languageName: node linkType: hard -"@tauri-apps/cli-win32-ia32-msvc@npm:1.5.6": - version: 1.5.6 - resolution: "@tauri-apps/cli-win32-ia32-msvc@npm:1.5.6" +"@tauri-apps/cli-win32-ia32-msvc@npm:1.5.9": + version: 1.5.9 + resolution: "@tauri-apps/cli-win32-ia32-msvc@npm:1.5.9" conditions: os=win32 & cpu=ia32 languageName: node linkType: hard -"@tauri-apps/cli-win32-x64-msvc@npm:1.5.6": - version: 1.5.6 - resolution: "@tauri-apps/cli-win32-x64-msvc@npm:1.5.6" +"@tauri-apps/cli-win32-x64-msvc@npm:1.5.9": + version: 1.5.9 + resolution: "@tauri-apps/cli-win32-x64-msvc@npm:1.5.9" conditions: os=win32 & cpu=x64 languageName: node linkType: hard -"@tauri-apps/cli@npm:^1.5.6": - version: 1.5.6 - resolution: "@tauri-apps/cli@npm:1.5.6" +"@tauri-apps/cli@npm:^1.5.9": + version: 1.5.9 + resolution: "@tauri-apps/cli@npm:1.5.9" dependencies: - "@tauri-apps/cli-darwin-arm64": 1.5.6 - "@tauri-apps/cli-darwin-x64": 1.5.6 - "@tauri-apps/cli-linux-arm-gnueabihf": 1.5.6 - "@tauri-apps/cli-linux-arm64-gnu": 1.5.6 - "@tauri-apps/cli-linux-arm64-musl": 1.5.6 - "@tauri-apps/cli-linux-x64-gnu": 1.5.6 - "@tauri-apps/cli-linux-x64-musl": 1.5.6 - "@tauri-apps/cli-win32-arm64-msvc": 1.5.6 - "@tauri-apps/cli-win32-ia32-msvc": 1.5.6 - "@tauri-apps/cli-win32-x64-msvc": 1.5.6 + "@tauri-apps/cli-darwin-arm64": 1.5.9 + "@tauri-apps/cli-darwin-x64": 1.5.9 + "@tauri-apps/cli-linux-arm-gnueabihf": 1.5.9 + "@tauri-apps/cli-linux-arm64-gnu": 1.5.9 + "@tauri-apps/cli-linux-arm64-musl": 1.5.9 + "@tauri-apps/cli-linux-x64-gnu": 1.5.9 + "@tauri-apps/cli-linux-x64-musl": 1.5.9 + "@tauri-apps/cli-win32-arm64-msvc": 1.5.9 + "@tauri-apps/cli-win32-ia32-msvc": 1.5.9 + "@tauri-apps/cli-win32-x64-msvc": 1.5.9 dependenciesMeta: "@tauri-apps/cli-darwin-arm64": optional: true @@ -2287,7 +2432,7 @@ __metadata: optional: true bin: tauri: tauri.js - checksum: 29addd5f51a485465b2465db85711c3cca1187292d03b7a8719c8b8abc21824142e25174d76747ce82ad542436e32fd2ee3cac3422f0a87b1ffc5904044bdffb + checksum: 044288c79d45937b687b376515adae1b4734328430d6d08de6f17c8faf17eabbef42d6d2b8f30155db4f81ad665bcccff6f4968086f714250d7a6107024903c9 languageName: node linkType: hard @@ -2298,16 +2443,16 @@ __metadata: languageName: node linkType: hard -"@types/babel__core@npm:^7.20.3": - version: 7.20.3 - resolution: "@types/babel__core@npm:7.20.3" +"@types/babel__core@npm:^7.20.5": + version: 7.20.5 + resolution: "@types/babel__core@npm:7.20.5" dependencies: "@babel/parser": ^7.20.7 "@babel/types": ^7.20.7 "@types/babel__generator": "*" "@types/babel__template": "*" "@types/babel__traverse": "*" - checksum: 8d14acc14d99b4b8bf36c00da368f6d597bd9ae3344aa7048f83f0f701b0463fa7c7bf2e50c3e4382fdbcfd1e4187b3452a0f0888b0f3ae8fad975591f7bdb94 + checksum: a3226f7930b635ee7a5e72c8d51a357e799d19cbf9d445710fa39ab13804f79ab1a54b72ea7d8e504659c7dfc50675db974b526142c754398d7413aa4bc30845 languageName: node linkType: hard @@ -2339,13 +2484,13 @@ __metadata: languageName: node linkType: hard -"@types/eslint@npm:^8.44.6": - version: 8.44.6 - resolution: "@types/eslint@npm:8.44.6" +"@types/eslint@npm:^8.56.2": + version: 8.56.2 + resolution: "@types/eslint@npm:8.56.2" dependencies: "@types/estree": "*" "@types/json-schema": "*" - checksum: ed8de582ab3dbd7ec0bf97d41f4f3de28dd8a37fc48bc423e1c406bbb70d1fd8c4175ba17ad6495ef9ef99a43df71421277b7a2a0355097489c4c4cf6bb266ff + checksum: 38e054971596f5c0413f66a62dc26b10e0a21ac46ceacb06fbf8cfb838d20820787209b17218b3916e4c23d990ff77cfdb482d655cac0e0d2b837d430fcc5db8 languageName: node linkType: hard @@ -2386,12 +2531,12 @@ __metadata: languageName: node linkType: hard -"@types/node@npm:^20.8.10": - version: 20.8.10 - resolution: "@types/node@npm:20.8.10" +"@types/node@npm:^20.11.17": + version: 20.11.17 + resolution: "@types/node@npm:20.11.17" dependencies: undici-types: ~5.26.4 - checksum: 7c61190e43e8074a1b571e52ff14c880bc67a0447f2fe5ed0e1a023eb8a23d5f815658edb98890f7578afe0f090433c4a635c7c87311762544e20dd78723e515 + checksum: 59c0dde187120adc97da30063c86511664b24b50fe777abfe1f557c217d0a0b84a68aaab5ef8ac44f5c2986b3f9cd605a15fa6e4f31195e594da96bbe9617c20 languageName: node linkType: hard @@ -2418,12 +2563,12 @@ __metadata: languageName: node linkType: hard -"@types/react-dom@npm:^18.2.14": - version: 18.2.14 - resolution: "@types/react-dom@npm:18.2.14" +"@types/react-dom@npm:^18.2.19": + version: 18.2.19 + resolution: "@types/react-dom@npm:18.2.19" dependencies: "@types/react": "*" - checksum: 890289c70d1966c168037637c09cacefe6205bdd27a33252144a6b432595a2943775ac1a1accac0beddaeb67f8fdf721e076acb1adc990b08e51c3d9fd4e780c + checksum: 087a19d8e4c1c0900ec4ac5ddb749a811a38274b25683d233c11755d2895cc6e475e8bf9bea3dee36519769298e078d4c2feab9ab4bd13b26bc2a6170716437e languageName: node linkType: hard @@ -2438,14 +2583,14 @@ __metadata: languageName: node linkType: hard -"@types/react@npm:^18.2.36": - version: 18.2.36 - resolution: "@types/react@npm:18.2.36" +"@types/react@npm:^18.2.55": + version: 18.2.55 + resolution: "@types/react@npm:18.2.55" dependencies: "@types/prop-types": "*" "@types/scheduler": "*" csstype: ^3.0.2 - checksum: 561fab294117983f3d245a63730bcffb423fc2a1b0f27d20c870abc5d980bc206a74f741cb11b5170fcdf0e747ac05448369cd930fbf345f74ed567f8fef3a9e + checksum: a8eb4fa77f73831b9112d4f11a7006217dc0740361649b9b0da3fd441d151a9cd415d5d68b91c0af4e430e063424d301c77489e5edaddc9f711c4e46cf9818a5 languageName: node linkType: hard @@ -2463,15 +2608,15 @@ __metadata: languageName: node linkType: hard -"@typescript-eslint/eslint-plugin@npm:^6.9.1": - version: 6.9.1 - resolution: "@typescript-eslint/eslint-plugin@npm:6.9.1" +"@typescript-eslint/eslint-plugin@npm:^6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/eslint-plugin@npm:6.21.0" dependencies: "@eslint-community/regexpp": ^4.5.1 - "@typescript-eslint/scope-manager": 6.9.1 - "@typescript-eslint/type-utils": 6.9.1 - "@typescript-eslint/utils": 6.9.1 - "@typescript-eslint/visitor-keys": 6.9.1 + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/type-utils": 6.21.0 + "@typescript-eslint/utils": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 debug: ^4.3.4 graphemer: ^1.4.0 ignore: ^5.2.4 @@ -2484,44 +2629,44 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 71ad2487ab3ce23dc8ac58e8f402c0bd23883dbcb045d049b8adf126d1f7c4f386655f0e25d316db256f91663d436683cbf101e45aed9e1d248cd843b7fa22f9 + checksum: 5ef2c502255e643e98051e87eb682c2a257e87afd8ec3b9f6274277615e1c2caf3131b352244cfb1987b8b2c415645eeacb9113fa841fc4c9b2ac46e8aed6efd languageName: node linkType: hard -"@typescript-eslint/parser@npm:^6.9.1": - version: 6.9.1 - resolution: "@typescript-eslint/parser@npm:6.9.1" +"@typescript-eslint/parser@npm:^6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/parser@npm:6.21.0" dependencies: - "@typescript-eslint/scope-manager": 6.9.1 - "@typescript-eslint/types": 6.9.1 - "@typescript-eslint/typescript-estree": 6.9.1 - "@typescript-eslint/visitor-keys": 6.9.1 + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/typescript-estree": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 debug: ^4.3.4 peerDependencies: eslint: ^7.0.0 || ^8.0.0 peerDependenciesMeta: typescript: optional: true - checksum: aabca4e9751c0caf48477a75a811e1f96176ddea26465d5654579a1a5288d1bb959bf4426207ee22f7dcfb2f1ab50ade2bbf49fee555e1b4ca8abebd47fe26fb + checksum: 162fe3a867eeeffda7328bce32dae45b52283c68c8cb23258fb9f44971f761991af61f71b8c9fe1aa389e93dfe6386f8509c1273d870736c507d76dd40647b68 languageName: node linkType: hard -"@typescript-eslint/scope-manager@npm:6.9.1": - version: 6.9.1 - resolution: "@typescript-eslint/scope-manager@npm:6.9.1" +"@typescript-eslint/scope-manager@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/scope-manager@npm:6.21.0" dependencies: - "@typescript-eslint/types": 6.9.1 - "@typescript-eslint/visitor-keys": 6.9.1 - checksum: 3b48f7c939ab4668e150360756b84310467306700b874d028614b337e894d1db79f9898e3d20b9d60ef40c219160d653791ed61058c8857059c310c904a4c6a8 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 + checksum: 71028b757da9694528c4c3294a96cc80bc7d396e383a405eab3bc224cda7341b88e0fc292120b35d3f31f47beac69f7083196c70616434072fbcd3d3e62d3376 languageName: node linkType: hard -"@typescript-eslint/type-utils@npm:6.9.1": - version: 6.9.1 - resolution: "@typescript-eslint/type-utils@npm:6.9.1" +"@typescript-eslint/type-utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/type-utils@npm:6.21.0" dependencies: - "@typescript-eslint/typescript-estree": 6.9.1 - "@typescript-eslint/utils": 6.9.1 + "@typescript-eslint/typescript-estree": 6.21.0 + "@typescript-eslint/utils": 6.21.0 debug: ^4.3.4 ts-api-utils: ^1.0.1 peerDependencies: @@ -2529,59 +2674,60 @@ __metadata: peerDependenciesMeta: typescript: optional: true - checksum: 39cf4831ebe3618ffd47f85b2425d8fba746cf2087d16f99e021a66a148c3c52034f68854acfde9c01816e363e699e59e16606482937051418b86a60593f850a + checksum: 77025473f4d80acf1fafcce99c5c283e557686a61861febeba9c9913331f8a41e930bf5cd8b7a54db502a57b6eb8ea6d155cbd4f41349ed00e3d7aeb1f477ddc languageName: node linkType: hard -"@typescript-eslint/types@npm:6.9.1": - version: 6.9.1 - resolution: "@typescript-eslint/types@npm:6.9.1" - checksum: f9208af83e8117cdeb48655bbb436339b8b2369421cda0cc7ae7c7bb44a2743a5b2702c9c9f7ccbe261fbac63083c6e357a015a20903cb8dfed3e754f8fb40e3 +"@typescript-eslint/types@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/types@npm:6.21.0" + checksum: 9501b47d7403417af95fc1fb72b2038c5ac46feac0e1598a46bcb43e56a606c387e9dcd8a2a0abe174c91b509f2d2a8078b093786219eb9a01ab2fbf9ee7b684 languageName: node linkType: hard -"@typescript-eslint/typescript-estree@npm:6.9.1": - version: 6.9.1 - resolution: "@typescript-eslint/typescript-estree@npm:6.9.1" +"@typescript-eslint/typescript-estree@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/typescript-estree@npm:6.21.0" dependencies: - "@typescript-eslint/types": 6.9.1 - "@typescript-eslint/visitor-keys": 6.9.1 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/visitor-keys": 6.21.0 debug: ^4.3.4 globby: ^11.1.0 is-glob: ^4.0.3 + minimatch: 9.0.3 semver: ^7.5.4 ts-api-utils: ^1.0.1 peerDependenciesMeta: typescript: optional: true - checksum: 3824629963e05a70944788da00711e35ac9ba72be690add5b3d771b2aa5a7d1f9bcf974e0170e6ee644090c96b9e0496d781dd4f4893e6e24652e7dae876c293 + checksum: dec02dc107c4a541e14fb0c96148f3764b92117c3b635db3a577b5a56fc48df7a556fa853fb82b07c0663b4bf2c484c9f245c28ba3e17e5cb0918ea4cab2ea21 languageName: node linkType: hard -"@typescript-eslint/utils@npm:6.9.1": - version: 6.9.1 - resolution: "@typescript-eslint/utils@npm:6.9.1" +"@typescript-eslint/utils@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/utils@npm:6.21.0" dependencies: "@eslint-community/eslint-utils": ^4.4.0 "@types/json-schema": ^7.0.12 "@types/semver": ^7.5.0 - "@typescript-eslint/scope-manager": 6.9.1 - "@typescript-eslint/types": 6.9.1 - "@typescript-eslint/typescript-estree": 6.9.1 + "@typescript-eslint/scope-manager": 6.21.0 + "@typescript-eslint/types": 6.21.0 + "@typescript-eslint/typescript-estree": 6.21.0 semver: ^7.5.4 peerDependencies: eslint: ^7.0.0 || ^8.0.0 - checksum: 124db80dbe849cfb951d97a3b2dd04a8dd4d7be2f6db7d2782943e84bbf3fad210f884a16ffa8ead48fd4c43b22c3132abcd9a4f2da9d94a99c473a7bb04f2e7 + checksum: b129b3a4aebec8468259f4589985cb59ea808afbfdb9c54f02fad11e17d185e2bf72bb332f7c36ec3c09b31f18fc41368678b076323e6e019d06f74ee93f7bf2 languageName: node linkType: hard -"@typescript-eslint/visitor-keys@npm:6.9.1": - version: 6.9.1 - resolution: "@typescript-eslint/visitor-keys@npm:6.9.1" +"@typescript-eslint/visitor-keys@npm:6.21.0": + version: 6.21.0 + resolution: "@typescript-eslint/visitor-keys@npm:6.21.0" dependencies: - "@typescript-eslint/types": 6.9.1 + "@typescript-eslint/types": 6.21.0 eslint-visitor-keys: ^3.4.1 - checksum: 4262055a71d9f54d576df915a80050ad1ad01ef13301e67a1494ca34712a73b9f31f0d06830c582d8dd7483681368aa769575f9db03cb5a8e910efc435f0e78a + checksum: 67c7e6003d5af042d8703d11538fca9d76899f0119130b373402819ae43f0bc90d18656aa7add25a24427ccf1a0efd0804157ba83b0d4e145f06107d7d1b7433 languageName: node linkType: hard @@ -2592,18 +2738,18 @@ __metadata: languageName: node linkType: hard -"@vitejs/plugin-react@npm:^4.1.1": - version: 4.1.1 - resolution: "@vitejs/plugin-react@npm:4.1.1" +"@vitejs/plugin-react@npm:^4.2.1": + version: 4.2.1 + resolution: "@vitejs/plugin-react@npm:4.2.1" dependencies: - "@babel/core": ^7.23.2 - "@babel/plugin-transform-react-jsx-self": ^7.22.5 - "@babel/plugin-transform-react-jsx-source": ^7.22.5 - "@types/babel__core": ^7.20.3 + "@babel/core": ^7.23.5 + "@babel/plugin-transform-react-jsx-self": ^7.23.3 + "@babel/plugin-transform-react-jsx-source": ^7.23.3 + "@types/babel__core": ^7.20.5 react-refresh: ^0.14.0 peerDependencies: - vite: ^4.2.0 - checksum: 275132ab1e4c227326396aeee93084f20bbe5f0fbe92d45813f3eacd0766eb6e8cd83ee222f90411aefad1ce60fbd31766a8e4725e7bb36914f2bba37afbdebf + vite: ^4.2.0 || ^5.0.0 + checksum: 08d227d27ff2304e395e746bd2d4b5fee40587f69d7e2fcd6beb7d91163c1f1dc26d843bc48e2ffb8f38c6b8a1b9445fb07840e3dcc841f97b56bbb8205346aa languageName: node linkType: hard @@ -2887,17 +3033,17 @@ __metadata: languageName: node linkType: hard -"browserslist@npm:^4.21.9": - version: 4.22.1 - resolution: "browserslist@npm:4.22.1" +"browserslist@npm:^4.22.2": + version: 4.22.2 + resolution: "browserslist@npm:4.22.2" dependencies: - caniuse-lite: ^1.0.30001541 - electron-to-chromium: ^1.4.535 - node-releases: ^2.0.13 + caniuse-lite: ^1.0.30001565 + electron-to-chromium: ^1.4.601 + node-releases: ^2.0.14 update-browserslist-db: ^1.0.13 bin: browserslist: cli.js - checksum: 7e6b10c53f7dd5d83fd2b95b00518889096382539fed6403829d447e05df4744088de46a571071afb447046abc3c66ad06fbc790e70234ec2517452e32ffd862 + checksum: 33ddfcd9145220099a7a1ac533cecfe5b7548ffeb29b313e1b57be6459000a1f8fa67e781cf4abee97268ac594d44134fcc4a6b2b4750ceddc9796e3a22076d9 languageName: node linkType: hard @@ -2944,10 +3090,10 @@ __metadata: languageName: node linkType: hard -"caniuse-lite@npm:^1.0.30001541": - version: 1.0.30001547 - resolution: "caniuse-lite@npm:1.0.30001547" - checksum: ec0fc2b46721887f6f4aca1f3902f03d9a1a07416d16a86b7cd4bfba60e7b6b03ab3969659d3ea0158cc2f298972c80215c06c9457eb15c649d7780e8f5e91a7 +"caniuse-lite@npm:^1.0.30001565": + version: 1.0.30001570 + resolution: "caniuse-lite@npm:1.0.30001570" + checksum: 460be2c7a9b1c8a83b6aae4226661c276d9dada6c84209dee547699cf4b28030b9d1fc29ddd7626acee77412b6401993878ea0ef3eadbf3a63ded9034896ae20 languageName: node linkType: hard @@ -3111,14 +3257,21 @@ __metadata: languageName: node linkType: hard -"csstype@npm:^3.0.11, csstype@npm:^3.0.2": +"csstype@npm:^3.0.2": version: 3.1.1 resolution: "csstype@npm:3.1.1" checksum: 1f7b4f5fdd955b7444b18ebdddf3f5c699159f13e9cf8ac9027ae4a60ae226aef9bbb14a6e12ca7dba3358b007cee6354b116e720262867c398de6c955ea451d languageName: node linkType: hard -"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": +"csstype@npm:^3.1.2": + version: 3.1.2 + resolution: "csstype@npm:3.1.2" + checksum: e1a52e6c25c1314d6beef5168da704ab29c5186b877c07d822bd0806717d9a265e8493a2e35ca7e68d0f5d472d43fac1cdce70fd79fd0853dff81f3028d857b5 + languageName: node + linkType: hard + +"debug@npm:4, debug@npm:^4.1.0, debug@npm:^4.1.1, debug@npm:^4.3.1, debug@npm:^4.3.2, debug@npm:^4.3.3, debug@npm:^4.3.4": version: 4.3.4 resolution: "debug@npm:4.3.4" dependencies: @@ -3217,10 +3370,10 @@ __metadata: languageName: node linkType: hard -"electron-to-chromium@npm:^1.4.535": - version: 1.4.549 - resolution: "electron-to-chromium@npm:1.4.549" - checksum: 6aa2a71fa359642e8cc77c0bbf4ded752ff769405173fdb91f790ae3b29cc076eb98579622a87fda86d087ef6f18ca13fa05d229083756c546761b1258c3dd48 +"electron-to-chromium@npm:^1.4.601": + version: 1.4.614 + resolution: "electron-to-chromium@npm:1.4.614" + checksum: e99e6c8600aa76b4d385a4381b943ec2cfeebfdc36a2675fbf87b334256428b92f5d79ab287b8bab0e1875a992284a8a95a03b41b71e9d64a75b5088daf1dc5e languageName: node linkType: hard @@ -3410,32 +3563,32 @@ __metadata: languageName: node linkType: hard -"esbuild@npm:^0.18.10": - version: 0.18.20 - resolution: "esbuild@npm:0.18.20" - dependencies: - "@esbuild/android-arm": 0.18.20 - "@esbuild/android-arm64": 0.18.20 - "@esbuild/android-x64": 0.18.20 - "@esbuild/darwin-arm64": 0.18.20 - "@esbuild/darwin-x64": 0.18.20 - "@esbuild/freebsd-arm64": 0.18.20 - "@esbuild/freebsd-x64": 0.18.20 - "@esbuild/linux-arm": 0.18.20 - "@esbuild/linux-arm64": 0.18.20 - "@esbuild/linux-ia32": 0.18.20 - "@esbuild/linux-loong64": 0.18.20 - "@esbuild/linux-mips64el": 0.18.20 - "@esbuild/linux-ppc64": 0.18.20 - "@esbuild/linux-riscv64": 0.18.20 - "@esbuild/linux-s390x": 0.18.20 - "@esbuild/linux-x64": 0.18.20 - "@esbuild/netbsd-x64": 0.18.20 - "@esbuild/openbsd-x64": 0.18.20 - "@esbuild/sunos-x64": 0.18.20 - "@esbuild/win32-arm64": 0.18.20 - "@esbuild/win32-ia32": 0.18.20 - "@esbuild/win32-x64": 0.18.20 +"esbuild@npm:^0.19.3": + version: 0.19.8 + resolution: "esbuild@npm:0.19.8" + dependencies: + "@esbuild/android-arm": 0.19.8 + "@esbuild/android-arm64": 0.19.8 + "@esbuild/android-x64": 0.19.8 + "@esbuild/darwin-arm64": 0.19.8 + "@esbuild/darwin-x64": 0.19.8 + "@esbuild/freebsd-arm64": 0.19.8 + "@esbuild/freebsd-x64": 0.19.8 + "@esbuild/linux-arm": 0.19.8 + "@esbuild/linux-arm64": 0.19.8 + "@esbuild/linux-ia32": 0.19.8 + "@esbuild/linux-loong64": 0.19.8 + "@esbuild/linux-mips64el": 0.19.8 + "@esbuild/linux-ppc64": 0.19.8 + "@esbuild/linux-riscv64": 0.19.8 + "@esbuild/linux-s390x": 0.19.8 + "@esbuild/linux-x64": 0.19.8 + "@esbuild/netbsd-x64": 0.19.8 + "@esbuild/openbsd-x64": 0.19.8 + "@esbuild/sunos-x64": 0.19.8 + "@esbuild/win32-arm64": 0.19.8 + "@esbuild/win32-ia32": 0.19.8 + "@esbuild/win32-x64": 0.19.8 dependenciesMeta: "@esbuild/android-arm": optional: true @@ -3483,7 +3636,7 @@ __metadata: optional: true bin: esbuild: bin/esbuild - checksum: 5d253614e50cdb6ec22095afd0c414f15688e7278a7eb4f3720a6dd1306b0909cf431e7b9437a90d065a31b1c57be60130f63fe3e8d0083b588571f31ee6ec7b + checksum: 1dff99482ecbfcc642ec66c71e4dc5c73ce6aef68e8158a4937890b570e86a95959ac47e0f14785ba70df5a673ae4289df88a162e9759b02367ed28074cee8ba languageName: node linkType: hard @@ -3508,14 +3661,14 @@ __metadata: languageName: node linkType: hard -"eslint-config-prettier@npm:^9.0.0": - version: 9.0.0 - resolution: "eslint-config-prettier@npm:9.0.0" +"eslint-config-prettier@npm:^9.1.0": + version: 9.1.0 + resolution: "eslint-config-prettier@npm:9.1.0" peerDependencies: eslint: ">=7.0.0" bin: eslint-config-prettier: bin/cli.js - checksum: 362e991b6cb343f79362bada2d97c202e5303e6865888918a7445c555fb75e4c078b01278e90be98aa98ae22f8597d8e93d48314bec6824f540f7efcab3ce451 + checksum: 9229b768c879f500ee54ca05925f31b0c0bafff3d9f5521f98ff05127356de78c81deb9365c86a5ec4efa990cb72b74df8612ae15965b14136044c73e1f6a907 languageName: node linkType: hard @@ -3578,14 +3731,14 @@ __metadata: languageName: node linkType: hard -"eslint@npm:^8.53.0": - version: 8.53.0 - resolution: "eslint@npm:8.53.0" +"eslint@npm:^8.56.0": + version: 8.56.0 + resolution: "eslint@npm:8.56.0" dependencies: "@eslint-community/eslint-utils": ^4.2.0 "@eslint-community/regexpp": ^4.6.1 - "@eslint/eslintrc": ^2.1.3 - "@eslint/js": 8.53.0 + "@eslint/eslintrc": ^2.1.4 + "@eslint/js": 8.56.0 "@humanwhocodes/config-array": ^0.11.13 "@humanwhocodes/module-importer": ^1.0.1 "@nodelib/fs.walk": ^1.2.8 @@ -3622,7 +3775,7 @@ __metadata: text-table: ^0.2.0 bin: eslint: bin/eslint.js - checksum: 2da808655c7aa4b33f8970ba30d96b453c3071cc4d6cd60d367163430677e32ff186b65270816b662d29139283138bff81f28dddeb2e73265495245a316ed02c + checksum: 883436d1e809b4a25d9eb03d42f584b84c408dbac28b0019f6ea07b5177940bf3cca86208f749a6a1e0039b63e085ee47aca1236c30721e91f0deef5cc5a5136 languageName: node linkType: hard @@ -3782,9 +3935,9 @@ __metadata: languageName: node linkType: hard -"framer-motion@npm:^10.16.4": - version: 10.16.4 - resolution: "framer-motion@npm:10.16.4" +"framer-motion@npm:^11.0.3": + version: 11.0.3 + resolution: "framer-motion@npm:11.0.3" dependencies: "@emotion/is-prop-valid": ^0.8.2 tslib: ^2.4.0 @@ -3799,7 +3952,7 @@ __metadata: optional: true react-dom: optional: true - checksum: 57eb252f25a2c4ee14b024295c6a1162a53a05e0321bdb9c8a22ec266fbe777832823eaa0309e42854170fcde16c42915c6c5d0208b628fd000d6fab013c501f + checksum: fcc287089c5beabefee6b06eea1c764ff6f3d28294e15fd00da6a88ddc8210261f106352db382ee6d59e44a1ad9f3cf0fbeef297380645400db1f9985097f481 languageName: node linkType: hard @@ -3838,6 +3991,16 @@ __metadata: languageName: node linkType: hard +"fsevents@npm:~2.3.3": + version: 2.3.3 + resolution: "fsevents@npm:2.3.3" + dependencies: + node-gyp: latest + checksum: 11e6ea6fea15e42461fc55b4b0e4a0a3c654faa567f1877dbd353f39156f69def97a69936d1746619d656c4b93de2238bf731f6085a03a50cabf287c9d024317 + conditions: os=darwin + languageName: node + linkType: hard + "fsevents@patch:fsevents@~2.3.2#~builtin": version: 2.3.2 resolution: "fsevents@patch:fsevents@npm%3A2.3.2#~builtin::version=2.3.2&hash=df0bf1" @@ -3847,6 +4010,15 @@ __metadata: languageName: node linkType: hard +"fsevents@patch:fsevents@~2.3.3#~builtin": + version: 2.3.3 + resolution: "fsevents@patch:fsevents@npm%3A2.3.3#~builtin::version=2.3.3&hash=df0bf1" + dependencies: + node-gyp: latest + conditions: os=darwin + languageName: node + linkType: hard + "function-bind@npm:^1.1.1": version: 1.1.1 resolution: "function-bind@npm:1.1.1" @@ -4742,6 +4914,15 @@ __metadata: languageName: node linkType: hard +"minimatch@npm:9.0.3": + version: 9.0.3 + resolution: "minimatch@npm:9.0.3" + dependencies: + brace-expansion: ^2.0.1 + checksum: 253487976bf485b612f16bf57463520a14f512662e592e95c571afdab1442a6a6864b6c88f248ce6fc4ff0b6de04ac7aa6c8bb51e868e99d1d65eb0658a708b5 + languageName: node + linkType: hard + "minimatch@npm:^3.0.5, minimatch@npm:^3.1.1, minimatch@npm:^3.1.2": version: 3.1.2 resolution: "minimatch@npm:3.1.2" @@ -4862,12 +5043,12 @@ __metadata: languageName: node linkType: hard -"nanoid@npm:^3.3.6": - version: 3.3.6 - resolution: "nanoid@npm:3.3.6" +"nanoid@npm:^3.3.7": + version: 3.3.7 + resolution: "nanoid@npm:3.3.7" bin: nanoid: bin/nanoid.cjs - checksum: 7d0eda657002738aa5206107bd0580aead6c95c460ef1bdd0b1a87a9c7ae6277ac2e9b945306aaa5b32c6dcb7feaf462d0f552e7f8b5718abfc6ead5c94a71b3 + checksum: d36c427e530713e4ac6567d488b489a36582ef89da1d6d4e3b87eded11eb10d7042a877958c6f104929809b2ab0bafa17652b076cdf84324aa75b30b722204f2 languageName: node linkType: hard @@ -4905,10 +5086,10 @@ __metadata: languageName: node linkType: hard -"node-releases@npm:^2.0.13": - version: 2.0.13 - resolution: "node-releases@npm:2.0.13" - checksum: 17ec8f315dba62710cae71a8dad3cd0288ba943d2ece43504b3b1aa8625bf138637798ab470b1d9035b0545996f63000a8a926e0f6d35d0996424f8b6d36dda3 +"node-releases@npm:^2.0.14": + version: 2.0.14 + resolution: "node-releases@npm:2.0.14" + checksum: 59443a2f77acac854c42d321bf1b43dea0aef55cd544c6a686e9816a697300458d4e82239e2d794ea05f7bbbc8a94500332e2d3ac3f11f52e4b16cbe638b3c41 languageName: node linkType: hard @@ -5138,14 +5319,14 @@ __metadata: languageName: node linkType: hard -"postcss@npm:^8.4.27": - version: 8.4.31 - resolution: "postcss@npm:8.4.31" +"postcss@npm:^8.4.35": + version: 8.4.35 + resolution: "postcss@npm:8.4.35" dependencies: - nanoid: ^3.3.6 + nanoid: ^3.3.7 picocolors: ^1.0.0 source-map-js: ^1.0.2 - checksum: 1d8611341b073143ad90486fcdfeab49edd243377b1f51834dc4f6d028e82ce5190e4f11bb2633276864503654fb7cab28e67abdc0fbf9d1f88cad4a0ff0beea + checksum: cf3c3124d3912a507603f6d9a49b3783f741075e9aa73eb592a6dd9194f9edab9d20a8875d16d137d4f779fe7b6fbd1f5727e39bfd1c3003724980ee4995e1da languageName: node linkType: hard @@ -5156,7 +5337,7 @@ __metadata: languageName: node linkType: hard -"prettier@npm:*, prettier@npm:^3.0.3": +"prettier@npm:*": version: 3.0.3 resolution: "prettier@npm:3.0.3" bin: @@ -5165,6 +5346,15 @@ __metadata: languageName: node linkType: hard +"prettier@npm:^3.2.5": + version: 3.2.5 + resolution: "prettier@npm:3.2.5" + bin: + prettier: bin/prettier.cjs + checksum: 2ee4e1417572372afb7a13bb446b34f20f1bf1747db77cf6ccaf57a9be005f2f15c40f903d41a6b79eec3f57fff14d32a20fb6dee1f126da48908926fe43c311 + languageName: node + linkType: hard + "promise-inflight@npm:^1.0.1": version: 1.0.1 resolution: "promise-inflight@npm:1.0.1" @@ -5257,12 +5447,12 @@ __metadata: languageName: node linkType: hard -"react-icons@npm:^4.11.0": - version: 4.11.0 - resolution: "react-icons@npm:4.11.0" +"react-icons@npm:^5.0.1": + version: 5.0.1 + resolution: "react-icons@npm:5.0.1" peerDependencies: react: "*" - checksum: 7b8b80bbe2dabcc54b6c2129b7761a04b19caebe24389adc7683478ef41212b9ca0b53c63abcc06b3c01b94c84855ec5142b4c357e19c4aaaad9a4db23a3c485 + checksum: e5df9c5e3bcdb8d68bd4c5e41650c26d2a3ceda61ded0e2abf7caa0e54c9fb712badcd06f0c240cfc645a5dd15a5dc1eb5dd55f60123d86860f516b1fc456474 languageName: node linkType: hard @@ -5479,17 +5669,53 @@ __metadata: languageName: node linkType: hard -"rollup@npm:^3.27.1": - version: 3.29.4 - resolution: "rollup@npm:3.29.4" - dependencies: +"rollup@npm:^4.2.0": + version: 4.6.0 + resolution: "rollup@npm:4.6.0" + dependencies: + "@rollup/rollup-android-arm-eabi": 4.6.0 + "@rollup/rollup-android-arm64": 4.6.0 + "@rollup/rollup-darwin-arm64": 4.6.0 + "@rollup/rollup-darwin-x64": 4.6.0 + "@rollup/rollup-linux-arm-gnueabihf": 4.6.0 + "@rollup/rollup-linux-arm64-gnu": 4.6.0 + "@rollup/rollup-linux-arm64-musl": 4.6.0 + "@rollup/rollup-linux-x64-gnu": 4.6.0 + "@rollup/rollup-linux-x64-musl": 4.6.0 + "@rollup/rollup-win32-arm64-msvc": 4.6.0 + "@rollup/rollup-win32-ia32-msvc": 4.6.0 + "@rollup/rollup-win32-x64-msvc": 4.6.0 fsevents: ~2.3.2 dependenciesMeta: + "@rollup/rollup-android-arm-eabi": + optional: true + "@rollup/rollup-android-arm64": + optional: true + "@rollup/rollup-darwin-arm64": + optional: true + "@rollup/rollup-darwin-x64": + optional: true + "@rollup/rollup-linux-arm-gnueabihf": + optional: true + "@rollup/rollup-linux-arm64-gnu": + optional: true + "@rollup/rollup-linux-arm64-musl": + optional: true + "@rollup/rollup-linux-x64-gnu": + optional: true + "@rollup/rollup-linux-x64-musl": + optional: true + "@rollup/rollup-win32-arm64-msvc": + optional: true + "@rollup/rollup-win32-ia32-msvc": + optional: true + "@rollup/rollup-win32-x64-msvc": + optional: true fsevents: optional: true bin: rollup: dist/bin/rollup - checksum: 8bb20a39c8d91130825159c3823eccf4dc2295c9a0a5c4ed851a5bf2167dbf24d9a29f23461a54c955e5506395e6cc188eafc8ab0e20399d7489fb33793b184e + checksum: f0325de87cc70086297415d2780d99f6ba7f56605aa3174ae33dff842aab11c4f5206a1718b1a4872df090589ab71a3b60fdb383b7ee59cb276ad0752c3214c7 languageName: node linkType: hard @@ -5981,23 +6207,23 @@ __metadata: languageName: node linkType: hard -"typescript@npm:^5.2.2": - version: 5.2.2 - resolution: "typescript@npm:5.2.2" +"typescript@npm:^5.3.3": + version: 5.3.3 + resolution: "typescript@npm:5.3.3" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 7912821dac4d962d315c36800fe387cdc0a6298dba7ec171b350b4a6e988b51d7b8f051317786db1094bd7431d526b648aba7da8236607febb26cf5b871d2d3c + checksum: 2007ccb6e51bbbf6fde0a78099efe04dc1c3dfbdff04ca3b6a8bc717991862b39fd6126c0c3ebf2d2d98ac5e960bcaa873826bb2bb241f14277034148f41f6a2 languageName: node linkType: hard -"typescript@patch:typescript@^5.2.2#~builtin": - version: 5.2.2 - resolution: "typescript@patch:typescript@npm%3A5.2.2#~builtin::version=5.2.2&hash=ad5954" +"typescript@patch:typescript@^5.3.3#~builtin": + version: 5.3.3 + resolution: "typescript@patch:typescript@npm%3A5.3.3#~builtin::version=5.3.3&hash=ad5954" bin: tsc: bin/tsc tsserver: bin/tsserver - checksum: 07106822b4305de3f22835cbba949a2b35451cad50888759b6818421290ff95d522b38ef7919e70fb381c5fe9c1c643d7dea22c8b31652a717ddbd57b7f4d554 + checksum: f61375590b3162599f0f0d5b8737877ac0a7bc52761dbb585d67e7b8753a3a4c42d9a554c4cc929f591ffcf3a2b0602f65ae3ce74714fd5652623a816862b610 languageName: node linkType: hard @@ -6099,16 +6325,16 @@ __metadata: languageName: node linkType: hard -"vite@npm:^4.5.0": - version: 4.5.0 - resolution: "vite@npm:4.5.0" +"vite@npm:^5.1.1": + version: 5.1.1 + resolution: "vite@npm:5.1.1" dependencies: - esbuild: ^0.18.10 - fsevents: ~2.3.2 - postcss: ^8.4.27 - rollup: ^3.27.1 + esbuild: ^0.19.3 + fsevents: ~2.3.3 + postcss: ^8.4.35 + rollup: ^4.2.0 peerDependencies: - "@types/node": ">= 14" + "@types/node": ^18.0.0 || >=20.0.0 less: "*" lightningcss: ^1.21.0 sass: "*" @@ -6135,7 +6361,7 @@ __metadata: optional: true bin: vite: bin/vite.js - checksum: 06f1a4c858e4dc4c04a10466f4ccacea30c5a9f8574e5ba3deb9d03fa20e80ca6797f02dad97a988da7cdef96238dbc69c3b6a538156585c74722d996223619e + checksum: 6aa7133ed1b455c63a164ba29e6627f4178884e74ec79937bf28492d95a4b9b3a30ce85d3162bb1854217b3adeb1f74bca87d38f394d5696df44f482c4bd3591 languageName: node linkType: hard @@ -6236,42 +6462,42 @@ __metadata: resolution: "wooting-macros@workspace:." dependencies: "@chakra-ui/icons": ^2.1.1 - "@chakra-ui/react": ^2.8.1 - "@chakra-ui/system": ^2.6.1 - "@dnd-kit/core": ^6.0.8 - "@dnd-kit/modifiers": ^6.0.1 - "@dnd-kit/sortable": ^7.0.2 - "@dnd-kit/utilities": ^3.2.1 + "@chakra-ui/react": ^2.8.2 + "@chakra-ui/system": ^2.6.2 + "@dnd-kit/core": ^6.1.0 + "@dnd-kit/modifiers": ^7.0.0 + "@dnd-kit/sortable": ^8.0.0 + "@dnd-kit/utilities": ^3.2.2 "@emoji-mart/data": 1.1.2 "@emoji-mart/react": 1.1.1 - "@emotion/react": ^11.11.1 + "@emotion/react": ^11.11.3 "@emotion/styled": ^11.11.0 - "@fontsource/montserrat": ^5.0.15 - "@formkit/auto-animate": 0.8.0 - "@tauri-apps/api": ^1.5.1 - "@tauri-apps/cli": ^1.5.6 - "@types/eslint": ^8.44.6 - "@types/node": ^20.8.10 + "@fontsource/montserrat": ^5.0.16 + "@formkit/auto-animate": 0.8.1 + "@tauri-apps/api": ^1.5.3 + "@tauri-apps/cli": ^1.5.9 + "@types/eslint": ^8.56.2 + "@types/node": ^20.11.17 "@types/prettier": ^3.0.0 - "@types/react": ^18.2.36 - "@types/react-dom": ^18.2.14 - "@typescript-eslint/eslint-plugin": ^6.9.1 - "@typescript-eslint/parser": ^6.9.1 - "@vitejs/plugin-react": ^4.1.1 + "@types/react": ^18.2.55 + "@types/react-dom": ^18.2.19 + "@typescript-eslint/eslint-plugin": ^6.21.0 + "@typescript-eslint/parser": ^6.21.0 + "@vitejs/plugin-react": ^4.2.1 emoji-mart: ^5.5.2 - eslint: ^8.53.0 - eslint-config-prettier: ^9.0.0 + eslint: ^8.56.0 + eslint-config-prettier: ^9.1.0 eslint-plugin-react: ^7.33.2 eslint-plugin-react-hooks: ^4.6.0 - framer-motion: ^10.16.4 - prettier: ^3.0.3 + framer-motion: ^11.0.3 + prettier: ^3.2.5 react: ^18.2.0 react-dom: ^18.2.0 - react-icons: ^4.11.0 + react-icons: ^5.0.1 tauri-plugin-log: "https://github.com/tauri-apps/tauri-plugin-log.git#commit=1a369766cf90f3aed9c2b7c68b70bf39081538b3" - typescript: ^5.2.2 - vite: ^4.5.0 - yarn: ^1.22.19 + typescript: ^5.3.3 + vite: ^5.1.1 + yarn: ^1.22.21 languageName: unknown linkType: soft @@ -6303,13 +6529,13 @@ __metadata: languageName: node linkType: hard -"yarn@npm:^1.22.19": - version: 1.22.19 - resolution: "yarn@npm:1.22.19" +"yarn@npm:^1.22.21": + version: 1.22.21 + resolution: "yarn@npm:1.22.21" bin: yarn: bin/yarn.js yarnpkg: bin/yarn.js - checksum: b43d2cc5fee7e933beb12a8aee7dfceca9e9ef2dd17c5d04d15a12ab7bec5f5744ea34a07b86e013da7f291a18c4e1ad8f70e150f5ed2f4666e6723c7f0a8452 + checksum: 791fab07ad55351049361686bcdd25c64a46e2afe2f2fc7587e666aa4f758d7eef80235b921aa09415557ac580ab23305c0181c1b43fed45f357a0c7a77322a1 languageName: node linkType: hard