diff --git a/.github/workflows/build-connect-app-aarch64.yml b/.github/workflows/build-connect-app-aarch64.yml index 6cee7696..19a3b95c 100644 --- a/.github/workflows/build-connect-app-aarch64.yml +++ b/.github/workflows/build-connect-app-aarch64.yml @@ -24,7 +24,7 @@ jobs: - name: Mecha Connect App package: mecha-connect artifact: mecha-connect-aarch64-unknown-linux-gnu.tar.gz - path: ./client/app + path: ./client runs-on: ubicloud-standard-2-arm continue-on-error: false @@ -53,25 +53,17 @@ jobs: protobuf-compiler \ libprotobuf-dev - - name: Build [${{ matrix.package }}] - run: | - cd ${{ matrix.path }} - cargo --config net.git-fetch-with-cli=true fetch - cargo build --release - ls -la - - name: Package deb [${{ matrix.package }}] continue-on-error: true run: | cd ${{ matrix.path }} - cargo deb --no-build + cargo tauri build --bundles deb ls -la - name: Prepare artifacts [${{ matrix.package }}] run: | mkdir build - cp ./target/release/${{ matrix.package }} ./build - cp ./target/debian/*.deb ./build + cp ../target/release/bundle/deb/${{ matrix.package }} ./build - name: Upload artifacts uses: actions/upload-artifact@v4 diff --git a/Cargo.lock b/Cargo.lock index 1e0b155d..183acd89 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -51,6 +51,21 @@ dependencies = [ "memchr", ] +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -75,6 +90,24 @@ dependencies = [ "backtrace", ] +[[package]] +name = "app" +version = "0.1.0" +dependencies = [ + "anyhow", + "prost 0.11.9", + "serde", + "serde_json", + "simple-base64", + "tauri", + "tauri-build", + "thiserror", + "tokio", + "tokio-util", + "tonic 0.9.2", + "tonic-build 0.9.2", +] + [[package]] name = "async-nats" version = "0.33.0" @@ -89,7 +122,7 @@ dependencies = [ "nkeys 0.3.2", "nuid", "once_cell", - "rand", + "rand 0.8.5", "regex", "ring", "rustls", @@ -142,6 +175,30 @@ dependencies = [ "syn 2.0.60", ] +[[package]] +name = "atk" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" +dependencies = [ + "atk-sys", + "bitflags 1.3.2", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.2", +] + [[package]] name = "autocfg" version = "1.2.0" @@ -162,7 +219,7 @@ dependencies = [ "http 0.2.12", "http-body 0.4.6", "hyper 0.14.28", - "itoa", + "itoa 1.0.11", "matchit", "memchr", "mime", @@ -251,12 +308,6 @@ dependencies = [ "serde", ] -[[package]] -name = "bit_field" -version = "0.10.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" - [[package]] name = "bitflags" version = "1.3.2" @@ -269,6 +320,12 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + [[package]] name = "block-buffer" version = "0.10.4" @@ -278,6 +335,37 @@ dependencies = [ "generic-array", ] +[[package]] +name = "brotli" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bstr" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" +dependencies = [ + "memchr", + "serde", +] + [[package]] name = "bumpalo" version = "3.16.0" @@ -328,27 +416,36 @@ dependencies = [ [[package]] name = "cairo-rs" -version = "0.18.5" +version = "0.15.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" dependencies = [ - "bitflags 2.5.0", + "bitflags 1.3.2", "cairo-sys-rs", "glib", "libc", - "once_cell", "thiserror", ] [[package]] name = "cairo-sys-rs" -version = "0.18.2" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" dependencies = [ "glib-sys", "libc", - "system-deps", + "system-deps 6.2.2", +] + +[[package]] +name = "cargo_toml" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" +dependencies = [ + "serde", + "toml 0.7.8", ] [[package]] @@ -361,6 +458,32 @@ dependencies = [ "libc", ] +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" +dependencies = [ + "smallvec", +] + [[package]] name = "cfg-expr" version = "0.15.8" @@ -411,6 +534,36 @@ dependencies = [ "inout", ] +[[package]] +name = "cocoa" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation", + "core-graphics-types", + "libc", + "objc", +] + [[package]] name = "color_quant" version = "1.1.0" @@ -418,30 +571,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" [[package]] -name = "connect" -version = "0.1.0" +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" dependencies = [ - "anyhow", - "async-trait", - "image", - "init-tracing-opentelemetry", - "opentelemetry-appender-tracing", - "prost 0.11.9", - "relm4", - "relm4-macros", - "reqwest 0.11.27", - "sentry", - "sentry-anyhow", - "sentry-tracing", - "serde", - "serde_yaml", - "simple-base64", - "tokio", - "tokio-util", - "tonic 0.9.2", - "tonic-build 0.9.2", - "tracing", - "tracing-subscriber", + "bytes", + "memchr", ] [[package]] @@ -456,6 +592,12 @@ version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + [[package]] name = "core-foundation" version = "0.9.4" @@ -472,6 +614,30 @@ version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + [[package]] name = "cpufeatures" version = "0.2.12" @@ -524,12 +690,6 @@ version = "0.8.19" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" -[[package]] -name = "crunchy" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" - [[package]] name = "crypto" version = "1.0.0" @@ -540,7 +700,7 @@ dependencies = [ "chrono", "fs", "mkdirp", - "rand", + "rand 0.8.5", "rcgen", "rsa", "sentry", @@ -564,6 +724,43 @@ dependencies = [ "typenum", ] +[[package]] +name = "cssparser" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa 0.4.8", + "matches", + "phf 0.8.0", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.60", +] + +[[package]] +name = "ctor" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" +dependencies = [ + "quote", + "syn 2.0.60", +] + [[package]] name = "curve25519-dalek" version = "4.1.2" @@ -592,6 +789,41 @@ dependencies = [ "syn 2.0.60", ] +[[package]] +name = "darling" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83b2eb4d90d12bdda5ed17de686c2acb4c57914f8f921b8da7e112b5a36f3fe1" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622687fe0bac72a04e5599029151f5796111b90f1baaa9b544d807a5e31cd120" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.60", +] + +[[package]] +name = "darling_macro" +version = "0.20.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "733cabb43482b1a1b53eee8583c2b9e8684d592215ea83efd305dd31bc2f0178" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.60", +] + [[package]] name = "dashmap" version = "5.5.3" @@ -662,6 +894,19 @@ dependencies = [ "serde", ] +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 1.0.109", +] + [[package]] name = "digest" version = "0.10.7" @@ -683,6 +928,16 @@ dependencies = [ "dirs-sys", ] +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + [[package]] name = "dirs-sys" version = "0.4.1" @@ -695,12 +950,50 @@ dependencies = [ "windows-sys 0.48.0", ] +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + [[package]] name = "dotenv" version = "0.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77c90badedccf4105eca100756a0b1289e191f6fcbdadd3cee1d2f614f97da8f" +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "dtoa-short" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + [[package]] name = "ed25519" version = "2.2.3" @@ -730,12 +1023,32 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" [[package]] -name = "encoding_rs" -version = "0.8.34" +name = "embed-resource" +version = "2.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +checksum = "c6985554d0688b687c5cb73898a34fbe3ad6c24c58c238a4d91d5e840670ee9d" dependencies = [ - "cfg-if", + "cc", + "memchr", + "rustc_version", + "toml 0.8.2", + "vswhom", + "winreg 0.52.0", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", ] [[package]] @@ -764,22 +1077,6 @@ dependencies = [ "tokio", ] -[[package]] -name = "exr" -version = "1.72.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" -dependencies = [ - "bit_field", - "flume", - "half", - "lebe", - "miniz_oxide", - "rayon-core", - "smallvec", - "zune-inflate", -] - [[package]] name = "fastrand" version = "2.0.2" @@ -851,18 +1148,6 @@ dependencies = [ "miniz_oxide", ] -[[package]] -name = "flume" -version = "0.11.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" -dependencies = [ - "futures-core", - "futures-sink", - "nanorand", - "spin 0.9.8", -] - [[package]] name = "fnv" version = "1.0.7" @@ -893,12 +1178,6 @@ dependencies = [ "percent-encoding", ] -[[package]] -name = "fragile" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c2141d6d6c8512188a7891b4b01590a45f6dac67afb4f255c4124dbb86d4eaa" - [[package]] name = "fs" version = "1.0.0" @@ -920,6 +1199,16 @@ dependencies = [ "winapi", ] +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + [[package]] name = "futures" version = "0.3.30" @@ -1018,62 +1307,103 @@ dependencies = [ "byteorder", ] +[[package]] +name = "gdk" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + [[package]] name = "gdk-pixbuf" -version = "0.18.5" +version = "0.15.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" dependencies = [ + "bitflags 1.3.2", "gdk-pixbuf-sys", "gio", "glib", "libc", - "once_cell", ] [[package]] name = "gdk-pixbuf-sys" -version = "0.18.0" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" dependencies = [ "gio-sys", "glib-sys", "gobject-sys", "libc", - "system-deps", + "system-deps 6.2.2", ] [[package]] -name = "gdk4" -version = "0.7.3" +name = "gdk-sys" +version = "0.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7edb019ad581f8ecf8ea8e4baa6df7c483a95b5a59be3140be6a9c3b0c632af6" +checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" dependencies = [ - "cairo-rs", - "gdk-pixbuf", - "gdk4-sys", - "gio", - "glib", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", "libc", - "pango", + "pango-sys", + "pkg-config", + "system-deps 6.2.2", ] [[package]] -name = "gdk4-sys" -version = "0.7.2" +name = "gdkwayland-sys" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbab43f332a3cf1df9974da690b5bb0e26720ed09a228178ce52175372dcfef0" +checksum = "cca49a59ad8cfdf36ef7330fe7bdfbe1d34323220cc16a0de2679ee773aee2c2" dependencies = [ - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gio-sys", + "gdk-sys", "glib-sys", "gobject-sys", "libc", - "pango-sys", "pkg-config", - "system-deps", + "system-deps 6.2.2", +] + +[[package]] +name = "gdkx11-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps 6.2.2", + "x11", +] + +[[package]] +name = "generator" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "windows 0.48.0", ] [[package]] @@ -1088,25 +1418,24 @@ dependencies = [ [[package]] name = "getrandom" -version = "0.2.14" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" dependencies = [ "cfg-if", - "js-sys", "libc", - "wasi", - "wasm-bindgen", + "wasi 0.9.0+wasi-snapshot-preview1", ] [[package]] -name = "gif" -version = "0.13.1" +name = "getrandom" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +checksum = "94b22e06ecb0110981051723910cbf0b5f5e09a2062dd7663334ee79a9d1286c" dependencies = [ - "color_quant", - "weezl", + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", ] [[package]] @@ -1117,54 +1446,49 @@ checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" [[package]] name = "gio" -version = "0.18.4" +version = "0.15.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" dependencies = [ + "bitflags 1.3.2", "futures-channel", "futures-core", "futures-io", - "futures-util", "gio-sys", "glib", "libc", "once_cell", - "pin-project-lite", - "smallvec", "thiserror", ] [[package]] name = "gio-sys" -version = "0.18.1" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps", + "system-deps 6.2.2", "winapi", ] [[package]] name = "glib" -version = "0.18.5" +version = "0.15.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" dependencies = [ - "bitflags 2.5.0", + "bitflags 1.3.2", "futures-channel", "futures-core", "futures-executor", "futures-task", - "futures-util", - "gio-sys", "glib-macros", "glib-sys", "gobject-sys", "libc", - "memchr", "once_cell", "smallvec", "thiserror", @@ -1172,26 +1496,27 @@ dependencies = [ [[package]] name = "glib-macros" -version = "0.18.5" +version = "0.15.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" dependencies = [ + "anyhow", "heck 0.4.1", - "proc-macro-crate 2.0.2", + "proc-macro-crate", "proc-macro-error", "proc-macro2", "quote", - "syn 2.0.60", + "syn 1.0.109", ] [[package]] name = "glib-sys" -version = "0.18.1" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" dependencies = [ "libc", - "system-deps", + "system-deps 6.2.2", ] [[package]] @@ -1201,37 +1526,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" [[package]] -name = "gobject-sys" -version = "0.18.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0850127b514d1c4a4654ead6dedadb18198999985908e6ffe4436f53c785ce44" -dependencies = [ - "glib-sys", - "libc", - "system-deps", -] - -[[package]] -name = "graphene-rs" -version = "0.18.1" +name = "globset" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b2228cda1505613a7a956cca69076892cfbda84fc2b7a62b94a41a272c0c401" +checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" dependencies = [ - "glib", - "graphene-sys", - "libc", + "aho-corasick", + "bstr", + "log", + "regex-automata 0.4.6", + "regex-syntax 0.8.3", ] [[package]] -name = "graphene-sys" -version = "0.18.1" +name = "gobject-sys" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc4144cee8fc8788f2a9b73dc5f1d4e1189d1f95305c4cb7bd9c1af1cfa31f59" +checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" dependencies = [ "glib-sys", "libc", - "pkg-config", - "system-deps", + "system-deps 6.2.2", ] [[package]] @@ -1262,90 +1577,60 @@ dependencies = [ ] [[package]] -name = "gsk4" -version = "0.7.3" +name = "gtk" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0d958e351d2f210309b32d081c832d7de0aca0b077aa10d88336c6379bd01f7e" +checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" dependencies = [ + "atk", + "bitflags 1.3.2", "cairo-rs", - "gdk4", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", "glib", - "graphene-rs", - "gsk4-sys", + "gtk-sys", + "gtk3-macros", "libc", + "once_cell", "pango", + "pkg-config", ] [[package]] -name = "gsk4-sys" -version = "0.7.3" +name = "gtk-sys" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12bd9e3effea989f020e8f1ff3fa3b8c63ba93d43b899c11a118868853a56d55" +checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" dependencies = [ + "atk-sys", "cairo-sys-rs", - "gdk4-sys", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", "glib-sys", "gobject-sys", - "graphene-sys", "libc", "pango-sys", - "system-deps", + "system-deps 6.2.2", ] [[package]] -name = "gtk4" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5aeb51aa3e9728575a053e1f43543cd9992ac2477e1b186ad824fd4adfb70842" -dependencies = [ - "cairo-rs", - "field-offset", - "futures-channel", - "gdk-pixbuf", - "gdk4", - "gio", - "glib", - "graphene-rs", - "gsk4", - "gtk4-macros", - "gtk4-sys", - "libc", - "pango", -] - -[[package]] -name = "gtk4-macros" -version = "0.7.2" +name = "gtk3-macros" +version = "0.15.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d57ec49cf9b657f69a05bca8027cff0a8dfd0c49e812be026fc7311f2163832f" +checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" dependencies = [ "anyhow", - "proc-macro-crate 1.3.1", + "proc-macro-crate", "proc-macro-error", "proc-macro2", "quote", "syn 1.0.109", ] -[[package]] -name = "gtk4-sys" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54d8c4aa23638ce9faa2caf7e2a27d4a1295af2155c8e8d28c4d4eeca7a65eb8" -dependencies = [ - "cairo-sys-rs", - "gdk-pixbuf-sys", - "gdk4-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "graphene-sys", - "gsk4-sys", - "libc", - "pango-sys", - "system-deps", -] - [[package]] name = "h2" version = "0.3.26" @@ -1365,16 +1650,6 @@ dependencies = [ "tracing", ] -[[package]] -name = "half" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" -dependencies = [ - "cfg-if", - "crunchy", -] - [[package]] name = "hashbrown" version = "0.12.3" @@ -1387,6 +1662,15 @@ version = "0.14.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + [[package]] name = "heck" version = "0.4.1" @@ -1437,7 +1721,21 @@ checksum = "f9c7c7c8ac16c798734b8a24560c1362120597c40d5e1459f09498f8f6c8f2ba" dependencies = [ "cfg-if", "libc", - "windows", + "windows 0.52.0", +] + +[[package]] +name = "html5ever" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn 1.0.109", ] [[package]] @@ -1448,7 +1746,7 @@ checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" dependencies = [ "bytes", "fnv", - "itoa", + "itoa 1.0.11", ] [[package]] @@ -1459,7 +1757,7 @@ checksum = "21b9ddb458710bc376481b842f5da65cdf31522de232c1ca8146abce2a358258" dependencies = [ "bytes", "fnv", - "itoa", + "itoa 1.0.11", ] [[package]] @@ -1496,6 +1794,12 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "http-range" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" + [[package]] name = "httparse" version = "1.8.0" @@ -1523,7 +1827,7 @@ dependencies = [ "http-body 0.4.6", "httparse", "httpdate", - "itoa", + "itoa 1.0.11", "pin-project-lite", "socket2", "tokio", @@ -1544,7 +1848,7 @@ dependencies = [ "http 1.1.0", "http-body 1.0.0", "httparse", - "itoa", + "itoa 1.0.11", "pin-project-lite", "smallvec", "tokio", @@ -1635,6 +1939,22 @@ dependencies = [ "cc", ] +[[package]] +name = "ico" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3804960be0bb5e4edb1e1ad67afd321a9ecfd875c3e65c099468fd2717d7cae" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + [[package]] name = "identity" version = "1.0.0" @@ -1661,6 +1981,22 @@ dependencies = [ "unicode-normalization", ] +[[package]] +name = "ignore" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata 0.4.6", + "same-file", + "walkdir", + "winapi-util", +] + [[package]] name = "image" version = "0.24.9" @@ -1670,13 +2006,7 @@ dependencies = [ "bytemuck", "byteorder", "color_quant", - "exr", - "gif", - "jpeg-decoder", "num-traits", - "png", - "qoi", - "tiff", ] [[package]] @@ -1687,6 +2017,7 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", + "serde", ] [[package]] @@ -1697,6 +2028,16 @@ checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" dependencies = [ "equivalent", "hashbrown 0.14.3", + "serde", +] + +[[package]] +name = "infer" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f551f8c3a39f68f986517db0d1759de85881894fdc7db798bd2a9df9cb04b7fc" +dependencies = [ + "cfb", ] [[package]] @@ -1780,6 +2121,12 @@ dependencies = [ "either", ] +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + [[package]] name = "itoa" version = "1.0.11" @@ -1787,89 +2134,109 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" [[package]] -name = "jobserver" -version = "0.1.30" +name = "javascriptcore-rs" +version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "685a7d121ee3f65ae4fddd72b25a04bb36b6af81bc0828f7d5434c0fe60fa3a2" +checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" dependencies = [ - "libc", + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", ] [[package]] -name = "jpeg-decoder" -version = "0.3.1" +name = "javascriptcore-rs-sys" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" +checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" dependencies = [ - "rayon", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", ] [[package]] -name = "js-sys" -version = "0.3.69" +name = "jni" +version = "0.20.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" dependencies = [ - "wasm-bindgen", + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", ] [[package]] -name = "kv-store" -version = "1.0.0" -dependencies = [ - "anyhow", - "fs", - "lazy_static", - "sentry-anyhow", - "sled", - "tracing", +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685a7d121ee3f65ae4fddd72b25a04bb36b6af81bc0828f7d5434c0fe60fa3a2" +dependencies = [ + "libc", ] [[package]] -name = "lazy_static" -version = "1.4.0" +name = "js-sys" +version = "0.3.69" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" dependencies = [ - "spin 0.5.2", + "wasm-bindgen", ] [[package]] -name = "lebe" -version = "0.5.2" +name = "json-patch" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" +checksum = "ec9ad60d674508f3ca8f380a928cfe7b096bc729c4e2dbfe3852bc45da3ab30b" +dependencies = [ + "serde", + "serde_json", + "thiserror", +] [[package]] -name = "libadwaita" -version = "0.5.3" +name = "kuchikiki" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2fe7e70c06507ed10a16cda707f358fbe60fe0dc237498f78c686ade92fd979c" +checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" dependencies = [ - "gdk-pixbuf", - "gdk4", - "gio", - "glib", - "gtk4", - "libadwaita-sys", - "libc", - "pango", + "cssparser", + "html5ever", + "indexmap 1.9.3", + "matches", + "selectors", ] [[package]] -name = "libadwaita-sys" -version = "0.5.3" +name = "kv-store" +version = "1.0.0" +dependencies = [ + "anyhow", + "fs", + "lazy_static", + "sentry-anyhow", + "sled", + "tracing", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e10aaa38de1d53374f90deeb4535209adc40cc5dba37f9704724169bceec69a" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" dependencies = [ - "gdk4-sys", - "gio-sys", - "glib-sys", - "gobject-sys", - "gtk4-sys", - "libc", - "pango-sys", - "system-deps", + "spin 0.5.2", ] [[package]] @@ -1894,6 +2261,12 @@ dependencies = [ "libc", ] +[[package]] +name = "line-wrap" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd1bc4d24ad230d21fb898d1116b1801d7adfc449d42026475862ab48b11e70e" + [[package]] name = "linux-raw-sys" version = "0.4.13" @@ -1931,6 +2304,50 @@ dependencies = [ "value-bag", ] +[[package]] +name = "loom" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "serde", + "serde_json", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "markup5ever" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" +dependencies = [ + "log", + "phf 0.10.1", + "phf_codegen 0.10.0", + "string_cache", + "string_cache_codegen", + "tendril", +] + [[package]] name = "matchers" version = "0.1.0" @@ -1940,6 +2357,12 @@ dependencies = [ "regex-automata 0.1.10", ] +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + [[package]] name = "matchit" version = "0.7.3" @@ -2044,7 +2467,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" dependencies = [ "libc", - "wasi", + "wasi 0.11.0+wasi-snapshot-preview1", "windows-sys 0.48.0", ] @@ -2066,15 +2489,6 @@ version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "defc4c55412d89136f966bbb339008b474350e5e6e78d2714439c386b3137a03" -[[package]] -name = "nanorand" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" -dependencies = [ - "getrandom", -] - [[package]] name = "native-tls" version = "0.2.11" @@ -2108,6 +2522,34 @@ dependencies = [ "tracing", ] +[[package]] +name = "ndk" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" +dependencies = [ + "bitflags 1.3.2", + "jni-sys", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +dependencies = [ + "jni-sys", +] + [[package]] name = "neli" version = "0.6.4" @@ -2247,6 +2689,12 @@ dependencies = [ "zip", ] +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + [[package]] name = "nix" version = "0.27.1" @@ -2269,9 +2717,9 @@ dependencies = [ "data-encoding", "ed25519", "ed25519-dalek", - "getrandom", + "getrandom 0.2.14", "log", - "rand", + "rand 0.8.5", "signatory", ] @@ -2284,12 +2732,18 @@ dependencies = [ "data-encoding", "ed25519", "ed25519-dalek", - "getrandom", + "getrandom 0.2.14", "log", - "rand", + "rand 0.8.5", "signatory", ] +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + [[package]] name = "ntapi" version = "0.4.1" @@ -2315,7 +2769,7 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc895af95856f929163a0aa20c26a78d26bfdc839f51b9d5aa7a5b79e52b7e83" dependencies = [ - "rand", + "rand 0.8.5", ] [[package]] @@ -2355,7 +2809,7 @@ dependencies = [ "num-integer", "num-iter", "num-traits", - "rand", + "rand 0.8.5", "smallvec", "zeroize", ] @@ -2427,6 +2881,55 @@ dependencies = [ "libc", ] +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", + "objc_exception", +] + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + [[package]] name = "object" version = "0.32.2" @@ -2677,7 +3180,7 @@ dependencies = [ "once_cell", "opentelemetry_api", "percent-encoding", - "rand", + "rand 0.8.5", "thiserror", "tokio", "tokio-stream", @@ -2699,7 +3202,7 @@ dependencies = [ "opentelemetry 0.21.0", "ordered-float", "percent-encoding", - "rand", + "rand 0.8.5", "serde_json", "thiserror", "tokio", @@ -2740,11 +3243,11 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" [[package]] name = "pango" -version = "0.18.3" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" dependencies = [ - "gio", + "bitflags 1.3.2", "glib", "libc", "once_cell", @@ -2753,14 +3256,14 @@ dependencies = [ [[package]] name = "pango-sys" -version = "0.18.0" +version = "0.15.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" dependencies = [ "glib-sys", "gobject-sys", "libc", - "system-deps", + "system-deps 6.2.2", ] [[package]] @@ -2818,7 +3321,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7676374caaee8a325c9e7a2ae557f216c5563a171d6997b0ef8a65af35147700" dependencies = [ "base64ct", - "rand_core", + "rand_core 0.6.4", "subtle", ] @@ -2875,6 +3378,140 @@ dependencies = [ "indexmap 2.2.6", ] +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_macros 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_shared 0.10.0", +] + +[[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]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator 0.11.2", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.60", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +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.5" @@ -2940,6 +3577,20 @@ version = "3.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db23d408679286588f4d4644f965003d056e3dd5abcaaa938116871d7ce2fee7" +[[package]] +name = "plist" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9d34169e64b3c7a80c8621a48adaf44e0cf62c78a9b25dd9dd35f1881a17cf9" +dependencies = [ + "base64 0.21.7", + "indexmap 2.2.6", + "line-wrap", + "quick-xml", + "serde", + "time", +] + [[package]] name = "png" version = "0.17.13" @@ -2965,6 +3616,12 @@ version = "0.2.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + [[package]] name = "prettyplease" version = "0.1.25" @@ -2995,16 +3652,6 @@ dependencies = [ "toml_edit 0.19.15", ] -[[package]] -name = "proc-macro-crate" -version = "2.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" -dependencies = [ - "toml_datetime", - "toml_edit 0.20.2", -] - [[package]] name = "proc-macro-error" version = "1.0.4" @@ -3029,6 +3676,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + [[package]] name = "proc-macro2" version = "1.0.81" @@ -3199,12 +3852,12 @@ dependencies = [ ] [[package]] -name = "qoi" -version = "0.4.1" +name = "quick-xml" +version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" dependencies = [ - "bytemuck", + "memchr", ] [[package]] @@ -3216,6 +3869,20 @@ dependencies = [ "proc-macro2", ] +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + [[package]] name = "rand" version = "0.8.5" @@ -3223,8 +3890,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" dependencies = [ "libc", - "rand_chacha", - "rand_core", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", ] [[package]] @@ -3234,7 +3911,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", ] [[package]] @@ -3243,9 +3929,33 @@ version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" dependencies = [ - "getrandom", + "getrandom 0.2.14", ] +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + [[package]] name = "rayon" version = "1.10.0" @@ -3302,7 +4012,7 @@ version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" dependencies = [ - "getrandom", + "getrandom 0.2.14", "libredox", "thiserror", ] @@ -3351,35 +4061,6 @@ version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" -[[package]] -name = "relm4" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f8f08cd89e93688c76f1ceae98f1331131b211b898d529bcf41f4ccfcbe698e" -dependencies = [ - "async-trait", - "flume", - "fragile", - "futures", - "gtk4", - "libadwaita", - "once_cell", - "relm4-macros", - "tokio", - "tracing", -] - -[[package]] -name = "relm4-macros" -version = "0.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0249463bd27f93f10c883aaa31e7ca254cc2f0c6c8cd60a68e6d052d9dba85" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.60", -] - [[package]] name = "reqwest" version = "0.11.27" @@ -3468,7 +4149,7 @@ checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" dependencies = [ "cc", "cfg-if", - "getrandom", + "getrandom 0.2.14", "libc", "spin 0.9.8", "untrusted", @@ -3488,7 +4169,7 @@ dependencies = [ "num-traits", "pkcs1", "pkcs8", - "rand_core", + "rand_core 0.6.4", "signature", "spki", "subtle", @@ -3594,6 +4275,15 @@ version = "1.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e86697c916019a8588c99b5fac3cead74ec0b4b819707a682fd4d23fa0ce1ba1" +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + [[package]] name = "schannel" version = "0.1.23" @@ -3603,6 +4293,12 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + [[package]] name = "scopeguard" version = "1.2.0" @@ -3642,11 +4338,34 @@ dependencies = [ "libc", ] +[[package]] +name = "selectors" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +dependencies = [ + "bitflags 1.3.2", + "cssparser", + "derive_more", + "fxhash", + "log", + "matches", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc", + "smallvec", + "thin-slice", +] + [[package]] name = "semver" version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92d43fe69e652f3df9bdc2b85b2854a0825b86e4fb76bc44d945137d053639ca" +dependencies = [ + "serde", +] [[package]] name = "sentry" @@ -3712,7 +4431,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "46a75011ea1c0d5c46e9e57df03ce81f5c7f0a9e199086334a1f9c0a541e0826" dependencies = [ "once_cell", - "rand", + "rand 0.8.5", "sentry-types", "serde", "serde_json", @@ -3759,7 +4478,7 @@ checksum = "4519c900ce734f7a0eb7aba0869dfb225a7af8820634a7dd51449e3b093cfb7c" dependencies = [ "debugid", "hex", - "rand", + "rand 0.8.5", "serde", "serde_json", "thiserror", @@ -3794,7 +4513,8 @@ version = "1.0.116" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3e17db7126d17feb94eb3fad46bf1a96b034e8aacbc2e775fe81505f8b0b2813" dependencies = [ - "itoa", + "indexmap 2.2.6", + "itoa 1.0.11", "ryu", "serde", ] @@ -3835,11 +4555,41 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" dependencies = [ "form_urlencoded", - "itoa", + "itoa 1.0.11", "ryu", "serde", ] +[[package]] +name = "serde_with" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20" +dependencies = [ + "base64 0.22.0", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.2.6", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.60", +] + [[package]] name = "serde_yaml" version = "0.9.34+deprecated" @@ -3847,12 +4597,34 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ "indexmap 2.2.6", - "itoa", + "itoa 1.0.11", "ryu", "serde", "unsafe-libyaml", ] +[[package]] +name = "serialize-to-javascript" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "services" version = "1.0.0" @@ -3861,6 +4633,16 @@ dependencies = [ "async-trait", ] +[[package]] +name = "servo_arc" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + [[package]] name = "settings" version = "1.0.0" @@ -3946,7 +4728,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1e303f8205714074f6068773f0e29527e0453937fe837c9717d066635b65f31" dependencies = [ "pkcs8", - "rand_core", + "rand_core 0.6.4", "signature", "zeroize", ] @@ -3958,7 +4740,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77549399552de45a898a580c1b41d445bf730df867cc44e6c0233bbc4b8329de" dependencies = [ "digest", - "rand_core", + "rand_core 0.6.4", ] [[package]] @@ -3973,6 +4755,12 @@ version = "0.23.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6385ef05b7bbfddaa8bf6306d059adac087990d659576c73b7da802d9a6ce91f" +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + [[package]] name = "slab" version = "0.4.9" @@ -4014,6 +4802,34 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "soup2" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" +dependencies = [ + "bitflags 1.3.2", + "gio", + "glib", + "libc", + "once_cell", + "soup2-sys", +] + +[[package]] +name = "soup2-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" +dependencies = [ + "bitflags 1.3.2", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + [[package]] name = "spin" version = "0.5.2" @@ -4025,9 +4841,6 @@ name = "spin" version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" -dependencies = [ - "lock_api", -] [[package]] name = "spki" @@ -4039,6 +4852,21 @@ dependencies = [ "der", ] +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "state" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" +dependencies = [ + "loom", +] + [[package]] name = "status" version = "1.0.0" @@ -4065,6 +4893,38 @@ dependencies = [ "uptime_lib", ] +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot 0.12.1", + "phf_shared 0.10.0", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + [[package]] name = "subtle" version = "2.5.0" @@ -4121,7 +4981,7 @@ dependencies = [ "ntapi", "once_cell", "rayon", - "windows", + "windows 0.52.0", ] [[package]] @@ -4146,35 +5006,291 @@ dependencies = [ ] [[package]] -name = "system-deps" -version = "6.2.2" +name = "system-deps" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" +dependencies = [ + "cfg-expr 0.9.1", + "heck 0.3.3", + "pkg-config", + "toml 0.5.11", + "version-compare 0.0.11", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr 0.15.8", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare 0.2.0", +] + +[[package]] +name = "tao" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "575c856fc21e551074869dcfaad8f706412bd5b803dfa0fbf6881c4ff4bfafab" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "cc", + "cocoa", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch", + "gdk", + "gdk-pixbuf", + "gdk-sys", + "gdkwayland-sys", + "gdkx11-sys", + "gio", + "glib", + "glib-sys", + "gtk", + "image", + "instant", + "jni", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc", + "once_cell", + "parking_lot 0.12.1", + "png", + "raw-window-handle", + "scopeguard", + "serde", + "tao-macros", + "unicode-segmentation", + "uuid", + "windows 0.39.0", + "windows-implement", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec114582505d158b669b136e6851f85840c109819d77c42bb7c0709f727d18c2" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tar" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "target-lexicon" +version = "0.12.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" + +[[package]] +name = "tauri" +version = "1.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13ce04f77bcd40bb57ec7061725c9c415d30b2bf80257637b857ee067f2fa198" +dependencies = [ + "anyhow", + "cocoa", + "dirs-next", + "dunce", + "embed_plist", + "encoding_rs", + "flate2", + "futures-util", + "glib", + "glob", + "gtk", + "heck 0.5.0", + "http 0.2.12", + "ignore", + "objc", + "once_cell", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "semver", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "state", + "tar", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "tempfile", + "thiserror", + "tokio", + "url", + "uuid", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-build" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab30cba12974d0f9b09794f61e72cad6da2142d3ceb81e519321bab86ce53312" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs-next", + "heck 0.5.0", + "json-patch", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3a1d90db526a8cdfd54444ad3f34d8d4d58fa5c536463915942393743bd06f8" +dependencies = [ + "base64 0.21.7", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "tauri-utils", + "thiserror", + "time", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "1.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a582d75414250122e4a597b9dd7d3c910a2c77906648fc2ac9353845ff0feec" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 1.0.109", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-runtime" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd7ffddf36d450791018e63a3ddf54979b9581d9644c584a5fb5611e6b5f20b4" +dependencies = [ + "gtk", + "http 0.2.12", + "http-range", + "rand 0.8.5", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror", + "url", + "uuid", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-runtime-wry" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2af45aeb15b1cadb4ca91248423f4438a0864b836298cecb436892afbfdff4" +dependencies = [ + "cocoa", + "gtk", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "tauri-runtime", + "tauri-utils", + "uuid", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "1.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +checksum = "450b17a7102e5d46d4bdabae0d1590fd27953e704e691fc081f06c06d2253b35" dependencies = [ - "cfg-expr", + "brotli", + "ctor", + "dunce", + "glob", "heck 0.5.0", - "pkg-config", - "toml", - "version-compare", + "html5ever", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.2", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "serde_with", + "thiserror", + "url", + "walkdir", + "windows-version", ] [[package]] -name = "tar" -version = "0.4.40" +name = "tauri-winres" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" +checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb" dependencies = [ - "filetime", - "libc", - "xattr", + "embed-resource", + "toml 0.7.8", ] -[[package]] -name = "target-lexicon" -version = "0.12.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" - [[package]] name = "telemetry" version = "1.0.0" @@ -4221,20 +5337,37 @@ dependencies = [ "windows-sys 0.52.0", ] +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "thin-slice" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" + [[package]] name = "thiserror" -version = "1.0.58" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.58" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" dependencies = [ "proc-macro2", "quote", @@ -4251,17 +5384,6 @@ 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.36" @@ -4269,7 +5391,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" dependencies = [ "deranged", - "itoa", + "itoa 1.0.11", "num-conv", "powerfmt", "serde", @@ -4365,7 +5487,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7f57eb36ecbe0fc510036adff84824dd3c24bb781e21bfa67b69d556aa85214f" dependencies = [ "pin-project", - "rand", + "rand 0.8.5", "tokio", ] @@ -4404,6 +5526,27 @@ dependencies = [ "tracing", ] +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.19.15", +] + [[package]] name = "toml" version = "0.8.2" @@ -4432,6 +5575,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" dependencies = [ "indexmap 2.2.6", + "serde", + "serde_spanned", "toml_datetime", "winnow", ] @@ -4584,7 +5729,7 @@ dependencies = [ "indexmap 1.9.3", "pin-project", "pin-project-lite", - "rand", + "rand 0.8.5", "slab", "tokio", "tokio-util", @@ -4757,6 +5902,12 @@ dependencies = [ "tinyvec", ] +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + [[package]] name = "unsafe-libyaml" version = "0.2.11" @@ -4777,7 +5928,7 @@ checksum = "f4e71ddbefed856d5881821d6ada4e606bbb91fd332296963ed596e2ad2100f3" dependencies = [ "libc", "thiserror", - "windows", + "windows 0.52.0", ] [[package]] @@ -4811,12 +5962,19 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + [[package]] name = "uuid" version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" dependencies = [ + "getrandom 0.2.14", "serde", ] @@ -4838,6 +5996,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "version-compare" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" + [[package]] name = "version-compare" version = "0.2.0" @@ -4850,6 +6014,36 @@ version = "0.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + [[package]] name = "want" version = "0.3.1" @@ -4859,6 +6053,12 @@ dependencies = [ "try-lock", ] +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + [[package]] name = "wasi" version = "0.11.0+wasi-snapshot-preview1" @@ -4942,10 +6142,89 @@ dependencies = [ ] [[package]] -name = "weezl" -version = "0.1.8" +name = "webkit2gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup2", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" +dependencies = [ + "atk-sys", + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pango-sys", + "pkg-config", + "soup2-sys", + "system-deps 6.2.2", +] + +[[package]] +name = "webview2-com" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows 0.39.0", + "windows-implement", +] + +[[package]] +name = "webview2-com-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "webview2-com-sys" +version = "0.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" +checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" +dependencies = [ + "regex", + "serde", + "serde_json", + "thiserror", + "windows 0.39.0", + "windows-bindgen", + "windows-metadata", +] [[package]] name = "which" @@ -4975,12 +6254,44 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +[[package]] +name = "winapi-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys 0.52.0", +] + [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "windows" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" +dependencies = [ + "windows-implement", + "windows_aarch64_msvc 0.39.0", + "windows_i686_gnu 0.39.0", + "windows_i686_msvc 0.39.0", + "windows_x86_64_gnu 0.39.0", + "windows_x86_64_msvc 0.39.0", +] + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows" version = "0.52.0" @@ -4991,6 +6302,16 @@ dependencies = [ "windows-targets 0.52.5", ] +[[package]] +name = "windows-bindgen" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" +dependencies = [ + "windows-metadata", + "windows-tokens", +] + [[package]] name = "windows-core" version = "0.52.0" @@ -5000,6 +6321,22 @@ dependencies = [ "windows-targets 0.52.5", ] +[[package]] +name = "windows-implement" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" +dependencies = [ + "syn 1.0.109", + "windows-tokens", +] + +[[package]] +name = "windows-metadata" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" + [[package]] name = "windows-sys" version = "0.48.0" @@ -5049,6 +6386,21 @@ dependencies = [ "windows_x86_64_msvc 0.52.5", ] +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6998aa457c9ba8ff2fb9f13e9d2a930dabcea28f1d0ab94d687d8b3654844515" +dependencies = [ + "windows-targets 0.52.5", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.48.5" @@ -5061,6 +6413,12 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" +[[package]] +name = "windows_aarch64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" + [[package]] name = "windows_aarch64_msvc" version = "0.48.5" @@ -5073,6 +6431,12 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" +[[package]] +name = "windows_i686_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" + [[package]] name = "windows_i686_gnu" version = "0.48.5" @@ -5091,6 +6455,12 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" +[[package]] +name = "windows_i686_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" + [[package]] name = "windows_i686_msvc" version = "0.48.5" @@ -5103,6 +6473,12 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" +[[package]] +name = "windows_x86_64_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" + [[package]] name = "windows_x86_64_gnu" version = "0.48.5" @@ -5127,6 +6503,12 @@ version = "0.52.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" +[[package]] +name = "windows_x86_64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" + [[package]] name = "windows_x86_64_msvc" version = "0.48.5" @@ -5175,12 +6557,71 @@ dependencies = [ "anyhow", "base64 0.22.0", "defguard_wireguard_rs", - "rand", + "rand 0.8.5", "serde", "tracing", "x25519-dalek", ] +[[package]] +name = "wry" +version = "0.24.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00711278ed357350d44c749c286786ecac644e044e4da410d466212152383b45" +dependencies = [ + "base64 0.13.1", + "block", + "cocoa", + "core-graphics", + "crossbeam-channel", + "dunce", + "gdk", + "gio", + "glib", + "gtk", + "html5ever", + "http 0.2.12", + "kuchikiki", + "libc", + "log", + "objc", + "objc_id", + "once_cell", + "serde", + "serde_json", + "sha2", + "soup2", + "tao", + "thiserror", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows 0.39.0", + "windows-implement", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + [[package]] name = "x25519-dalek" version = "2.0.1" @@ -5188,7 +6629,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c7e468321c81fb07fa7f4c636c3972b9100f0346e5b6a9f2bd0603a52f7ed277" dependencies = [ "curve25519-dalek", - "rand_core", + "rand_core 0.6.4", "serde", "zeroize", ] @@ -5300,12 +6741,3 @@ dependencies = [ "cc", "pkg-config", ] - -[[package]] -name = "zune-inflate" -version = "0.2.54" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" -dependencies = [ - "simd-adler32", -] diff --git a/Cargo.toml b/Cargo.toml index 13323cd1..da05c543 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [workspace] default-members = ["agent"] -members = ["agent", "core/services", "core/events", "core/settings", "provisioning", "messaging", "identity", "status", "settings", "grpc-server", "networking","telemetry","commons/crypto", "commons/kv-store", "commons/fs", "client/app", "commons/wireguard"] +members = ["agent", "core/services", "core/events", "core/settings", "provisioning", "messaging", "identity", "status", "settings", "grpc-server", "networking","telemetry","commons/crypto", "commons/kv-store", "commons/fs", "client/app/src-tauri", "commons/wireguard"] resolver = "2" [workspace.package] diff --git a/client/.eslintignore b/client/.eslintignore new file mode 100644 index 00000000..38972655 --- /dev/null +++ b/client/.eslintignore @@ -0,0 +1,13 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example + +# Ignore files for PNPM, NPM and YARN +pnpm-lock.yaml +package-lock.json +yarn.lock diff --git a/client/.eslintrc.cjs b/client/.eslintrc.cjs new file mode 100644 index 00000000..0b757582 --- /dev/null +++ b/client/.eslintrc.cjs @@ -0,0 +1,31 @@ +/** @type { import("eslint").Linter.Config } */ +module.exports = { + root: true, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:svelte/recommended', + 'prettier' + ], + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint'], + parserOptions: { + sourceType: 'module', + ecmaVersion: 2020, + extraFileExtensions: ['.svelte'] + }, + env: { + browser: true, + es2017: true, + node: true + }, + overrides: [ + { + files: ['*.svelte'], + parser: 'svelte-eslint-parser', + parserOptions: { + parser: '@typescript-eslint/parser' + } + } + ] +}; diff --git a/client/.gitignore b/client/.gitignore new file mode 100644 index 00000000..6635cf55 --- /dev/null +++ b/client/.gitignore @@ -0,0 +1,10 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/client/.npmrc b/client/.npmrc new file mode 100644 index 00000000..b6f27f13 --- /dev/null +++ b/client/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/client/.prettierignore b/client/.prettierignore new file mode 100644 index 00000000..cc41cea9 --- /dev/null +++ b/client/.prettierignore @@ -0,0 +1,4 @@ +# Ignore files for PNPM, NPM and YARN +pnpm-lock.yaml +package-lock.json +yarn.lock diff --git a/client/.prettierrc b/client/.prettierrc new file mode 100644 index 00000000..95730232 --- /dev/null +++ b/client/.prettierrc @@ -0,0 +1,8 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte"], + "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] +} diff --git a/client/app/.cargo/config b/client/app/.cargo/config deleted file mode 100644 index 205979e2..00000000 --- a/client/app/.cargo/config +++ /dev/null @@ -1,3 +0,0 @@ -[target.aarch64-unknown-linux-gnu] -objcopy = { path = "aarch64-linux-gnu-objcopy" } -strip = { path = "aarch64-linux-gnu-strip" } diff --git a/client/app/.eslintignore b/client/app/.eslintignore new file mode 100644 index 00000000..38972655 --- /dev/null +++ b/client/app/.eslintignore @@ -0,0 +1,13 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example + +# Ignore files for PNPM, NPM and YARN +pnpm-lock.yaml +package-lock.json +yarn.lock diff --git a/client/app/.eslintrc.cjs b/client/app/.eslintrc.cjs new file mode 100644 index 00000000..0b757582 --- /dev/null +++ b/client/app/.eslintrc.cjs @@ -0,0 +1,31 @@ +/** @type { import("eslint").Linter.Config } */ +module.exports = { + root: true, + extends: [ + 'eslint:recommended', + 'plugin:@typescript-eslint/recommended', + 'plugin:svelte/recommended', + 'prettier' + ], + parser: '@typescript-eslint/parser', + plugins: ['@typescript-eslint'], + parserOptions: { + sourceType: 'module', + ecmaVersion: 2020, + extraFileExtensions: ['.svelte'] + }, + env: { + browser: true, + es2017: true, + node: true + }, + overrides: [ + { + files: ['*.svelte'], + parser: 'svelte-eslint-parser', + parserOptions: { + parser: '@typescript-eslint/parser' + } + } + ] +}; diff --git a/client/app/.gitignore b/client/app/.gitignore new file mode 100644 index 00000000..6635cf55 --- /dev/null +++ b/client/app/.gitignore @@ -0,0 +1,10 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example +vite.config.js.timestamp-* +vite.config.ts.timestamp-* diff --git a/client/app/.npmrc b/client/app/.npmrc new file mode 100644 index 00000000..b6f27f13 --- /dev/null +++ b/client/app/.npmrc @@ -0,0 +1 @@ +engine-strict=true diff --git a/client/app/.prettierignore b/client/app/.prettierignore new file mode 100644 index 00000000..cc41cea9 --- /dev/null +++ b/client/app/.prettierignore @@ -0,0 +1,4 @@ +# Ignore files for PNPM, NPM and YARN +pnpm-lock.yaml +package-lock.json +yarn.lock diff --git a/client/app/.prettierrc b/client/app/.prettierrc new file mode 100644 index 00000000..95730232 --- /dev/null +++ b/client/app/.prettierrc @@ -0,0 +1,8 @@ +{ + "useTabs": true, + "singleQuote": true, + "trailingComma": "none", + "printWidth": 100, + "plugins": ["prettier-plugin-svelte"], + "overrides": [{ "files": "*.svelte", "options": { "parser": "svelte" } }] +} diff --git a/client/app/Cargo.toml b/client/app/Cargo.toml deleted file mode 100644 index 4e6e7b69..00000000 --- a/client/app/Cargo.toml +++ /dev/null @@ -1,65 +0,0 @@ -[package] -name = "connect" -version = "0.1.0" -edition = "2021" -authors = ["Sweta Rohit To deploy your app, you may need to install an [adapter](https://kit.svelte.dev/docs/adapters) for your target environment. + +You can start app with `cargo tauri dev`. \ No newline at end of file diff --git a/client/app/build.rs b/client/app/build.rs deleted file mode 100644 index be79cfd1..00000000 --- a/client/app/build.rs +++ /dev/null @@ -1,16 +0,0 @@ -fn main() -> Result<(), Box> { - let provisioning_client = "./proto/provisioning.proto"; - let identity_client = "./proto/identity.proto"; - let settings_client = "./proto/settings.proto"; - - tonic_build::configure() - .build_server(true) - .type_attribute(".", "#[derive(serde::Deserialize, serde::Serialize)]") - .compile( - &[provisioning_client, identity_client, settings_client], - &[".proto"], - ) - .unwrap_or_else(|e| panic!("protobuf compile error: {}", e)); - - Ok(()) -} diff --git a/client/app/components.json b/client/app/components.json new file mode 100644 index 00000000..23d96a67 --- /dev/null +++ b/client/app/components.json @@ -0,0 +1,14 @@ +{ + "$schema": "https://shadcn-svelte.com/schema.json", + "style": "default", + "tailwind": { + "config": "tailwind.config.js", + "css": "src/app.pcss", + "baseColor": "slate" + }, + "aliases": { + "components": "$lib/components", + "utils": "$lib/utils" + }, + "typescript": true +} \ No newline at end of file diff --git a/client/app/package-lock.json b/client/app/package-lock.json new file mode 100644 index 00000000..d577f855 --- /dev/null +++ b/client/app/package-lock.json @@ -0,0 +1,4627 @@ +{ + "name": "mecha-connect", + "version": "0.0.1", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "mecha-connect", + "version": "0.0.1", + "dependencies": { + "@tauri-apps/api": "^1.5.4", + "bits-ui": "^0.21.7", + "clsx": "^2.1.1", + "embla-carousel-autoplay": "^8.0.2", + "embla-carousel-svelte": "^8.0.4", + "lucide-svelte": "^0.377.0", + "mode-watcher": "^0.3.0", + "svelte-sonner": "^0.3.24", + "tailwind-merge": "^2.3.0", + "tailwind-variants": "^0.2.1" + }, + "devDependencies": { + "@sveltejs/adapter-auto": "^3.0.0", + "@sveltejs/adapter-static": "^3.0.1", + "@sveltejs/kit": "^2.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0", + "@types/eslint": "^8.56.0", + "@typescript-eslint/eslint-plugin": "^7.0.0", + "@typescript-eslint/parser": "^7.0.0", + "autoprefixer": "^10.4.16", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-svelte": "^2.35.1", + "postcss": "^8.4.32", + "postcss-load-config": "^5.0.2", + "prettier": "^3.1.1", + "prettier-plugin-svelte": "^3.1.2", + "prettier-plugin-tailwindcss": "^0.5.9", + "svelte": "^4.2.7", + "svelte-check": "^3.6.0", + "tailwindcss": "^3.3.6", + "tslib": "^2.4.1", + "typescript": "^5.0.0", + "vite": "^5.0.3" + } + }, + "node_modules/@alloc/quick-lru": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/@alloc/quick-lru/-/quick-lru-5.2.0.tgz", + "integrity": "sha512-UrcABB+4bUrFABwbluTIBErXwvbsU/V7TZWfmbgJfbkwiBuziS9gxdODUyuiecfdGQ85jglMW6juS3+z5TsKLw==", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/@ampproject/remapping": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", + "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.24.5", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.5.tgz", + "integrity": "sha512-Nms86NXrsaeU9vbBJKni6gXiEXZ4CVpYVzEjDH9Sb8vmZ3UljyA1GSOJl/6LGPO8EHLuSF9H+IxNXHPX8QHJ4g==", + "dependencies": { + "regenerator-runtime": "^0.14.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", + "cpu": [ + "mips64el" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@eslint-community/eslint-utils": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", + "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", + "dev": true, + "dependencies": { + "eslint-visitor-keys": "^3.3.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "peerDependencies": { + "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" + } + }, + "node_modules/@eslint-community/regexpp": { + "version": "4.10.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", + "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", + "dev": true, + "engines": { + "node": "^12.0.0 || ^14.0.0 || >=16.0.0" + } + }, + "node_modules/@eslint/eslintrc": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", + "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", + "dev": true, + "dependencies": { + "ajv": "^6.12.4", + "debug": "^4.3.2", + "espree": "^9.6.0", + "globals": "^13.19.0", + "ignore": "^5.2.0", + "import-fresh": "^3.2.1", + "js-yaml": "^4.1.0", + "minimatch": "^3.1.2", + "strip-json-comments": "^3.1.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@eslint/js": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", + "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + } + }, + "node_modules/@floating-ui/core": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.1.tgz", + "integrity": "sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==", + "dependencies": { + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/dom": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.4.tgz", + "integrity": "sha512-0G8R+zOvQsAG1pg2Q99P21jiqxqGBW1iRe/iXHsBRBxnpXKFI8QwbB4x5KmYLggNO5m34IQgOIu9SCRfR/WWiQ==", + "dependencies": { + "@floating-ui/core": "^1.0.0", + "@floating-ui/utils": "^0.2.0" + } + }, + "node_modules/@floating-ui/utils": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" + }, + "node_modules/@humanwhocodes/config-array": { + "version": "0.11.14", + "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", + "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", + "dev": true, + "dependencies": { + "@humanwhocodes/object-schema": "^2.0.2", + "debug": "^4.3.1", + "minimatch": "^3.0.5" + }, + "engines": { + "node": ">=10.10.0" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/@humanwhocodes/module-importer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", + "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", + "dev": true, + "engines": { + "node": ">=12.22" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/nzakas" + } + }, + "node_modules/@humanwhocodes/object-schema": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", + "dev": true + }, + "node_modules/@internationalized/date": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/@internationalized/date/-/date-3.5.3.tgz", + "integrity": "sha512-X9bi8NAEHAjD8yzmPYT2pdJsbe+tYSEBAfowtlxJVJdZR3aK8Vg7ZUT1Fm5M47KLzp/M1p1VwAaeSma3RT7biw==", + "dependencies": { + "@swc/helpers": "^0.5.0" + } + }, + "node_modules/@isaacs/cliui": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", + "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", + "dependencies": { + "string-width": "^5.1.2", + "string-width-cjs": "npm:string-width@^4.2.0", + "strip-ansi": "^7.0.1", + "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", + "wrap-ansi": "^8.1.0", + "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/@isaacs/cliui/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/@isaacs/cliui/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/@jridgewell/gen-mapping": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.5.tgz", + "integrity": "sha512-IzL8ZoEDIBRWEzlCcRhOaCupYyN5gdIK+Q6fbFdPDg6HqX6jpkItn7DFIpW9LQzXG6Df9sA7+OKnq0qlz/GaQg==", + "dependencies": { + "@jridgewell/set-array": "^1.2.1", + "@jridgewell/sourcemap-codec": "^1.4.10", + "@jridgewell/trace-mapping": "^0.3.24" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/resolve-uri": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", + "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/set-array": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", + "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.4.15", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", + "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==" + }, + "node_modules/@jridgewell/trace-mapping": { + "version": "0.3.25", + "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", + "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", + "dependencies": { + "@jridgewell/resolve-uri": "^3.1.0", + "@jridgewell/sourcemap-codec": "^1.4.14" + } + }, + "node_modules/@melt-ui/svelte": { + "version": "0.76.2", + "resolved": "https://registry.npmjs.org/@melt-ui/svelte/-/svelte-0.76.2.tgz", + "integrity": "sha512-7SbOa11tXUS95T3fReL+dwDs5FyJtCEqrqG3inRziDws346SYLsxOQ6HmX+4BkIsQh1R8U3XNa+EMmdMt38lMA==", + "dependencies": { + "@floating-ui/core": "^1.3.1", + "@floating-ui/dom": "^1.4.5", + "@internationalized/date": "^3.5.0", + "dequal": "^2.0.3", + "focus-trap": "^7.5.2", + "nanoid": "^5.0.4" + }, + "peerDependencies": { + "svelte": ">=3 <5" + } + }, + "node_modules/@melt-ui/svelte/node_modules/nanoid": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz", + "integrity": "sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@pkgjs/parseargs": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", + "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", + "optional": true, + "engines": { + "node": ">=14" + } + }, + "node_modules/@polka/url": { + "version": "1.0.0-next.25", + "resolved": "https://registry.npmjs.org/@polka/url/-/url-1.0.0-next.25.tgz", + "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==", + "dev": true + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.17.2.tgz", + "integrity": "sha512-NM0jFxY8bB8QLkoKxIQeObCaDlJKewVlIEkuyYKm5An1tdVZ966w2+MPQ2l8LBZLjR+SgyV+nRkTIunzOYBMLQ==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.17.2.tgz", + "integrity": "sha512-yeX/Usk7daNIVwkq2uGoq2BYJKZY1JfyLTaHO/jaiSwi/lsf8fTFoQW/n6IdAsx5tx+iotu2zCJwz8MxI6D/Bw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.17.2.tgz", + "integrity": "sha512-kcMLpE6uCwls023+kknm71ug7MZOrtXo+y5p/tsg6jltpDtgQY1Eq5sGfHcQfb+lfuKwhBmEURDga9N0ol4YPw==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.17.2.tgz", + "integrity": "sha512-AtKwD0VEx0zWkL0ZjixEkp5tbNLzX+FCqGG1SvOu993HnSz4qDI6S4kGzubrEJAljpVkhRSlg5bzpV//E6ysTQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.17.2.tgz", + "integrity": "sha512-3reX2fUHqN7sffBNqmEyMQVj/CKhIHZd4y631duy0hZqI8Qoqf6lTtmAKvJFYa6bhU95B1D0WgzHkmTg33In0A==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.17.2.tgz", + "integrity": "sha512-uSqpsp91mheRgw96xtyAGP9FW5ChctTFEoXP0r5FAzj/3ZRv3Uxjtc7taRQSaQM/q85KEKjKsZuiZM3GyUivRg==", + "cpu": [ + "arm" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.17.2.tgz", + "integrity": "sha512-EMMPHkiCRtE8Wdk3Qhtciq6BndLtstqZIroHiiGzB3C5LDJmIZcSzVtLRbwuXuUft1Cnv+9fxuDtDxz3k3EW2A==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.17.2.tgz", + "integrity": "sha512-NMPylUUZ1i0z/xJUIx6VUhISZDRT+uTWpBcjdv0/zkp7b/bQDF+NfnfdzuTiB1G6HTodgoFa93hp0O1xl+/UbA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.17.2.tgz", + "integrity": "sha512-T19My13y8uYXPw/L/k0JYaX1fJKFT/PWdXiHr8mTbXWxjVF1t+8Xl31DgBBvEKclw+1b00Chg0hxE2O7bTG7GQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.17.2.tgz", + "integrity": "sha512-BOaNfthf3X3fOWAB+IJ9kxTgPmMqPPH5f5k2DcCsRrBIbWnaJCgX2ll77dV1TdSy9SaXTR5iDXRL8n7AnoP5cg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.17.2.tgz", + "integrity": "sha512-W0UP/x7bnn3xN2eYMql2T/+wpASLE5SjObXILTMPUBDB/Fg/FxC+gX4nvCfPBCbNhz51C+HcqQp2qQ4u25ok6g==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.17.2.tgz", + "integrity": "sha512-Hy7pLwByUOuyaFC6mAr7m+oMC+V7qyifzs/nW2OJfC8H4hbCzOX07Ov0VFk/zP3kBsELWNFi7rJtgbKYsav9QQ==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.17.2.tgz", + "integrity": "sha512-h1+yTWeYbRdAyJ/jMiVw0l6fOOm/0D1vNLui9iPuqgRGnXA0u21gAqOyB5iHjlM9MMfNOm9RHCQ7zLIzT0x11Q==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.17.2.tgz", + "integrity": "sha512-tmdtXMfKAjy5+IQsVtDiCfqbynAQE/TQRpWdVataHmhMb9DCoJxp9vLcCBjEQWMiUYxO1QprH/HbY9ragCEFLA==", + "cpu": [ + "arm64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.17.2.tgz", + "integrity": "sha512-7II/QCSTAHuE5vdZaQEwJq2ZACkBpQDOmQsE6D6XUbnBHW8IAhm4eTufL6msLJorzrHDFv3CF8oCA/hSIRuZeQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.17.2.tgz", + "integrity": "sha512-TGGO7v7qOq4CYmSBVEYpI1Y5xDuCEnbVC5Vth8mOsW0gDSzxNrVERPc790IGHsrT2dQSimgMr9Ub3Y1Jci5/8w==", + "cpu": [ + "x64" + ], + "dev": true, + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@sveltejs/adapter-auto": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-auto/-/adapter-auto-3.2.0.tgz", + "integrity": "sha512-She5nKT47kwHE18v9NMe6pbJcvULr82u0V3yZ0ej3n1laWKGgkgdEABE9/ak5iDPs93LqsBkuIo51kkwCLBjJA==", + "dev": true, + "dependencies": { + "import-meta-resolve": "^4.0.0" + }, + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/adapter-static": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@sveltejs/adapter-static/-/adapter-static-3.0.1.tgz", + "integrity": "sha512-6lMvf7xYEJ+oGeR5L8DFJJrowkefTK6ZgA4JiMqoClMkKq0s6yvsd3FZfCFvX1fQ0tpCD7fkuRVHsnUVgsHyNg==", + "dev": true, + "peerDependencies": { + "@sveltejs/kit": "^2.0.0" + } + }, + "node_modules/@sveltejs/kit": { + "version": "2.5.7", + "resolved": "https://registry.npmjs.org/@sveltejs/kit/-/kit-2.5.7.tgz", + "integrity": "sha512-6uedTzrb7nQrw6HALxnPrPaXdIN2jJJTzTIl96Z3P5NiG+OAfpdPbrWrvkJ3GN4CfWqrmU4dJqwMMRMTD/C7ow==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/cookie": "^0.6.0", + "cookie": "^0.6.0", + "devalue": "^5.0.0", + "esm-env": "^1.0.0", + "import-meta-resolve": "^4.0.0", + "kleur": "^4.1.5", + "magic-string": "^0.30.5", + "mrmime": "^2.0.0", + "sade": "^1.8.1", + "set-cookie-parser": "^2.6.0", + "sirv": "^2.0.4", + "tiny-glob": "^0.2.9" + }, + "bin": { + "svelte-kit": "svelte-kit.js" + }, + "engines": { + "node": ">=18.13" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^3.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.3" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte/-/vite-plugin-svelte-3.1.0.tgz", + "integrity": "sha512-sY6ncCvg+O3njnzbZexcVtUqOBE3iYmQPJ9y+yXSkOwG576QI/xJrBnQSRXFLGwJNBa0T78JEKg5cIR0WOAuUw==", + "dev": true, + "dependencies": { + "@sveltejs/vite-plugin-svelte-inspector": "^2.0.0", + "debug": "^4.3.4", + "deepmerge": "^4.3.1", + "kleur": "^4.1.5", + "magic-string": "^0.30.9", + "svelte-hmr": "^0.16.0", + "vitefu": "^0.2.5" + }, + "engines": { + "node": "^18.0.0 || >=20" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.0" + } + }, + "node_modules/@sveltejs/vite-plugin-svelte-inspector": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/@sveltejs/vite-plugin-svelte-inspector/-/vite-plugin-svelte-inspector-2.1.0.tgz", + "integrity": "sha512-9QX28IymvBlSCqsCll5t0kQVxipsfhFFL+L2t3nTWfXnddYwxBuAEtTtlaVQpRz9c37BhJjltSeY4AJSC03SSg==", + "dev": true, + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.0.0 || >=20" + }, + "peerDependencies": { + "@sveltejs/vite-plugin-svelte": "^3.0.0", + "svelte": "^4.0.0 || ^5.0.0-next.0", + "vite": "^5.0.0" + } + }, + "node_modules/@swc/helpers": { + "version": "0.5.11", + "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.11.tgz", + "integrity": "sha512-YNlnKRWF2sVojTpIyzwou9XoTNbzbzONwRhOoniEioF1AtaitTvVZblaQRrAzChWQ1bLYyYSWzM18y4WwgzJ+A==", + "dependencies": { + "tslib": "^2.4.0" + } + }, + "node_modules/@tauri-apps/api": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/@tauri-apps/api/-/api-1.5.4.tgz", + "integrity": "sha512-LKYae9URbdEdbHrOXBeXb/lZgVyWTX0E98rSFBuQlmkLr8OeG+akuE41PfLjBVyk1Q+fq7wxo4ieenLSMUAUhA==", + "engines": { + "node": ">= 14.6.0", + "npm": ">= 6.6.0", + "yarn": ">= 1.19.1" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/tauri" + } + }, + "node_modules/@types/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA==", + "dev": true + }, + "node_modules/@types/eslint": { + "version": "8.56.10", + "resolved": "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.10.tgz", + "integrity": "sha512-Shavhk87gCtY2fhXDctcfS3e6FdxWkCx1iUZ9eEUbh7rTqlZT0/IzOkCOVt0fCjcFuZ9FPYfuezTBImfHCDBGQ==", + "dev": true, + "dependencies": { + "@types/estree": "*", + "@types/json-schema": "*" + } + }, + "node_modules/@types/estree": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz", + "integrity": "sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw==" + }, + "node_modules/@types/json-schema": { + "version": "7.0.15", + "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", + "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", + "dev": true + }, + "node_modules/@types/pug": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/@types/pug/-/pug-2.0.10.tgz", + "integrity": "sha512-Sk/uYFOBAB7mb74XcpizmH0KOR2Pv3D2Hmrh1Dmy5BmK3MpdSa5kqZcg6EKBdklU0bFXX9gCfzvpnyUehrPIuA==", + "dev": true + }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==", + "dev": true + }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz", + "integrity": "sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==", + "dev": true, + "dependencies": { + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/type-utils": "7.8.0", + "@typescript-eslint/utils": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.3.1", + "natural-compare": "^1.4.0", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz", + "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==", + "dev": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", + "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", + "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", + "dev": true, + "dependencies": { + "@typescript-eslint/typescript-estree": "7.8.0", + "@typescript-eslint/utils": "7.8.0", + "debug": "^4.3.4", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", + "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", + "dev": true, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", + "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/visitor-keys": "7.8.0", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", + "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.8.0", + "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/typescript-estree": "7.8.0", + "semver": "^7.6.0" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.8.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", + "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", + "dev": true, + "dependencies": { + "@typescript-eslint/types": "7.8.0", + "eslint-visitor-keys": "^3.4.3" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@ungap/structured-clone": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", + "dev": true + }, + "node_modules/acorn": { + "version": "8.11.3", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", + "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-jsx": { + "version": "5.3.2", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", + "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", + "dev": true, + "peerDependencies": { + "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" + } + }, + "node_modules/ajv": { + "version": "6.12.6", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", + "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", + "dev": true, + "dependencies": { + "fast-deep-equal": "^3.1.1", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.4.1", + "uri-js": "^4.2.2" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/epoberezkin" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/any-promise": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/any-promise/-/any-promise-1.3.0.tgz", + "integrity": "sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==" + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/arg": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/arg/-/arg-5.0.2.tgz", + "integrity": "sha512-PYjyFOLKQ9y57JvQ6QLo8dAgNqswh8M1RMJYdQduT6xbWSgK36P/Z/v+p888pM69jMMfS8Xd8F6I1kQ/I9HUGg==" + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "dev": true + }, + "node_modules/aria-query": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/aria-query/-/aria-query-5.3.0.tgz", + "integrity": "sha512-b0P0sZPKtyu8HkeRAfCq0IfURZK+SuwMjY1UXGBU27wpAiTwQAIlq56IbIO+ytk/JjS1fMR14ee5WBBfKi5J6A==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/array-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", + "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/autoprefixer": { + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/autoprefixer" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "browserslist": "^4.23.0", + "caniuse-lite": "^1.0.30001599", + "fraction.js": "^4.3.7", + "normalize-range": "^0.1.2", + "picocolors": "^1.0.0", + "postcss-value-parser": "^4.2.0" + }, + "bin": { + "autoprefixer": "bin/autoprefixer" + }, + "engines": { + "node": "^10 || ^12 || >=14" + }, + "peerDependencies": { + "postcss": "^8.1.0" + } + }, + "node_modules/axobject-query": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/axobject-query/-/axobject-query-4.0.0.tgz", + "integrity": "sha512-+60uv1hiVFhHZeO+Lz0RYzsVHy5Wr1ayX0mwda9KPDVLNJgZ1T9Ny7VmFbLDzxsH0D87I86vgj3gFrjTJUYznw==", + "dependencies": { + "dequal": "^2.0.3" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/bits-ui": { + "version": "0.21.7", + "resolved": "https://registry.npmjs.org/bits-ui/-/bits-ui-0.21.7.tgz", + "integrity": "sha512-1PKp90ly1R6jexIiAUj1Dk4u2pln7ok+L8Vc0rHMY7pi7YZvadFNZvkp1G5BtmL8qh2xsn4MVNgKjPAQMCxW0A==", + "dependencies": { + "@internationalized/date": "^3.5.1", + "@melt-ui/svelte": "0.76.2", + "nanoid": "^5.0.5" + }, + "funding": { + "url": "https://github.com/sponsors/huntabyte" + }, + "peerDependencies": { + "svelte": "^4.0.0 || ^5.0.0-next.118" + } + }, + "node_modules/bits-ui/node_modules/nanoid": { + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.0.7.tgz", + "integrity": "sha512-oLxFY2gd2IqnjcYyOXD8XGCftpGtZP2AbHbOkthDkvRywH5ayNtPVy9YlOPcHckXzbLTCHpkb7FB+yuxKV13pQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.js" + }, + "engines": { + "node": "^18 || >=20" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browserslist": { + "version": "4.23.0", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.23.0.tgz", + "integrity": "sha512-QW8HiM1shhT2GuzkvklfjcKDiWFXHOeFCIA/huJPwHsslwcydgk7X+z2zXpEijP98UCY7HbubZt5J2Zgvf0CaQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "caniuse-lite": "^1.0.30001587", + "electron-to-chromium": "^1.4.668", + "node-releases": "^2.0.14", + "update-browserslist-db": "^1.0.13" + }, + "bin": { + "browserslist": "cli.js" + }, + "engines": { + "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "dev": true, + "engines": { + "node": "*" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/camelcase-css": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/camelcase-css/-/camelcase-css-2.0.1.tgz", + "integrity": "sha512-QOSvevhslijgYwRx6Rv7zKdMF8lbRmx+uQGx2+vDc+KI/eBnsy9kit5aj23AgGu3pa4t9AgwbnXWqS+iOY+2aA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/caniuse-lite": { + "version": "1.0.30001615", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001615.tgz", + "integrity": "sha512-1IpazM5G3r38meiae0bHRnPhz+CBQ3ZLqbQMtrg+AsTPKAXgW38JNsXkyZ+v8waCsDmPq87lmfun5Q2AGysNEQ==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/caniuse-lite" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ] + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chokidar/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/clsx": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clsx/-/clsx-2.1.1.tgz", + "integrity": "sha512-eYm0QWBtUrBWZWG0d386OGAw16Z995PiOVo2B7bjWSbHedGl5e0ZWaq65kOGgUSNesEIDkB9ISbTg/JK9dhCZA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/code-red": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/code-red/-/code-red-1.0.4.tgz", + "integrity": "sha512-7qJWqItLA8/VPVlKJlFXU+NBlo/qyfs39aJcuMT/2ere32ZqvF5OSxgdM5xOfJJ7O429gg2HM47y8v9P+9wrNw==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15", + "@types/estree": "^1.0.1", + "acorn": "^8.10.0", + "estree-walker": "^3.0.3", + "periscopic": "^3.1.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/commander": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-4.1.1.tgz", + "integrity": "sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", + "dev": true + }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "dev": true, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css-tree": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-2.3.1.tgz", + "integrity": "sha512-6Fv1DV/TYw//QF5IzQdqsNDjx/wc8TrMBZsqjL9eW01tWb7R7k/mq+/VXfJCl7SoD5emsJop9cOByJZfs8hYIw==", + "dependencies": { + "mdn-data": "2.0.30", + "source-map-js": "^1.0.1" + }, + "engines": { + "node": "^10 || ^12.20.0 || ^14.13.0 || >=15.0.0" + } + }, + "node_modules/cssesc": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz", + "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==", + "bin": { + "cssesc": "bin/cssesc" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "dev": true, + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", + "dev": true + }, + "node_modules/deepmerge": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", + "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/dequal": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz", + "integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==", + "engines": { + "node": ">=6" + } + }, + "node_modules/detect-indent": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-6.1.0.tgz", + "integrity": "sha512-reYkTUJAZb9gUuZ2RvVCNhVHdg62RHnJ7WJl8ftMi4diZ6NWlciOzQN88pUhSELEwflJht4oQDv0F0BMlwaYtA==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/devalue": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/devalue/-/devalue-5.0.0.tgz", + "integrity": "sha512-gO+/OMXF7488D+u3ue+G7Y4AA3ZmUnB3eHJXmBTgNHvr4ZNzl36A0ZtG+XCRNYCkYx/bFmw4qtkoFLa+wSrwAA==", + "dev": true + }, + "node_modules/didyoumean": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/didyoumean/-/didyoumean-1.2.2.tgz", + "integrity": "sha512-gxtyfqMg7GKyhQmb056K7M3xszy/myH8w+B4RT+QXBQsvAOdc3XymqDDPHx1BgPgsdAA5SIifona89YtRATDzw==" + }, + "node_modules/dir-glob": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", + "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", + "dev": true, + "dependencies": { + "path-type": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/doctrine": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", + "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", + "dev": true, + "dependencies": { + "esutils": "^2.0.2" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/eastasianwidth": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", + "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==" + }, + "node_modules/electron-to-chromium": { + "version": "1.4.754", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.754.tgz", + "integrity": "sha512-7Kr5jUdns5rL/M9wFFmMZAgFDuL2YOnanFH4OI4iFzUqyh3XOL7nAGbSlSMZdzKMIyyTpNSbqZsWG9odwLeKvA==", + "dev": true + }, + "node_modules/embla-carousel": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.0.2.tgz", + "integrity": "sha512-bogsDO8xosuh/l3PxIvA5AMl3+BnRVAse9sDW/60amzj4MbGS5re4WH5eVEXiuH8G1/3G7QUAX2QNr3Yx8z5rA==", + "peer": true + }, + "node_modules/embla-carousel-autoplay": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/embla-carousel-autoplay/-/embla-carousel-autoplay-8.0.2.tgz", + "integrity": "sha512-31lBigAkHeI4k1767uYcr9Gm2y12mzLpVsi+QRxIWQT8J4AtRoHLOhd8YJFiXf22DbI/j78+IaeJK4lZRlFxUw==", + "peerDependencies": { + "embla-carousel": "8.0.2" + } + }, + "node_modules/embla-carousel-svelte": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/embla-carousel-svelte/-/embla-carousel-svelte-8.0.4.tgz", + "integrity": "sha512-ZaVF6q9FpekWrdizPB9UTXsQ9yGZbC12NBoMUzYKOXrmb/a2A9EK4I9ZNxH0WFxx/2o3HB0/mHwxMSKrWoFvMw==", + "dependencies": { + "embla-carousel": "8.0.4", + "embla-carousel-reactive-utils": "8.0.4" + }, + "peerDependencies": { + "svelte": "^3.49.0 || ^4.0.0" + } + }, + "node_modules/embla-carousel-svelte/node_modules/embla-carousel": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/embla-carousel/-/embla-carousel-8.0.4.tgz", + "integrity": "sha512-INndmilrV9KY4Wnb4F2tI55DuQnFjf3GPOaPDT2LGYiKhIWVNUhv1nz/RI7CZ6WoIZ8MYHP4t6Qm/cqpcGHknA==" + }, + "node_modules/embla-carousel-svelte/node_modules/embla-carousel-reactive-utils": { + "version": "8.0.4", + "resolved": "https://registry.npmjs.org/embla-carousel-reactive-utils/-/embla-carousel-reactive-utils-8.0.4.tgz", + "integrity": "sha512-7lWM+8hanIF2roTAjxwfqfr0+VTbr9rYVlAs0r5PwPOVpz1G3/+bRelgAYvwcfWVm5Vydo2pKXVfFOPQjznF7w==", + "peerDependencies": { + "embla-carousel": "8.0.4" + } + }, + "node_modules/emoji-regex": { + "version": "9.2.2", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", + "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==" + }, + "node_modules/es6-promise": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/es6-promise/-/es6-promise-3.3.1.tgz", + "integrity": "sha512-SOp9Phqvqn7jtEUxPWdWfWoLmyt2VaJ6MpvP9Comy1MceMXqE6bxvaTu4iaxpYYPzhny28Lc+M87/c2cPK6lDg==", + "dev": true + }, + "node_modules/esbuild": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", + "dev": true, + "hasInstallScript": true, + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", + "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint": { + "version": "8.57.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", + "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.2.0", + "@eslint-community/regexpp": "^4.6.1", + "@eslint/eslintrc": "^2.1.4", + "@eslint/js": "8.57.0", + "@humanwhocodes/config-array": "^0.11.14", + "@humanwhocodes/module-importer": "^1.0.1", + "@nodelib/fs.walk": "^1.2.8", + "@ungap/structured-clone": "^1.2.0", + "ajv": "^6.12.4", + "chalk": "^4.0.0", + "cross-spawn": "^7.0.2", + "debug": "^4.3.2", + "doctrine": "^3.0.0", + "escape-string-regexp": "^4.0.0", + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "esquery": "^1.4.2", + "esutils": "^2.0.2", + "fast-deep-equal": "^3.1.3", + "file-entry-cache": "^6.0.1", + "find-up": "^5.0.0", + "glob-parent": "^6.0.2", + "globals": "^13.19.0", + "graphemer": "^1.4.0", + "ignore": "^5.2.0", + "imurmurhash": "^0.1.4", + "is-glob": "^4.0.0", + "is-path-inside": "^3.0.3", + "js-yaml": "^4.1.0", + "json-stable-stringify-without-jsonify": "^1.0.1", + "levn": "^0.4.1", + "lodash.merge": "^4.6.2", + "minimatch": "^3.1.2", + "natural-compare": "^1.4.0", + "optionator": "^0.9.3", + "strip-ansi": "^6.0.1", + "text-table": "^0.2.0" + }, + "bin": { + "eslint": "bin/eslint.js" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-compat-utils": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/eslint-compat-utils/-/eslint-compat-utils-0.5.0.tgz", + "integrity": "sha512-dc6Y8tzEcSYZMHa+CMPLi/hyo1FzNeonbhJL7Ol0ccuKQkwopJcJBA9YL/xmMTLU1eKigXo9vj9nALElWYSowg==", + "dev": true, + "dependencies": { + "semver": "^7.5.4" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "eslint": ">=6.0.0" + } + }, + "node_modules/eslint-config-prettier": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-9.1.0.tgz", + "integrity": "sha512-NSWl5BFQWEPi1j4TjVNItzYV7dZXZ+wP6I6ZhrBGpChQhZRUaElihE9uRRkcbRnNb76UMKDF3r+WTmNcGPKsqw==", + "dev": true, + "bin": { + "eslint-config-prettier": "bin/cli.js" + }, + "peerDependencies": { + "eslint": ">=7.0.0" + } + }, + "node_modules/eslint-plugin-svelte": { + "version": "2.38.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-svelte/-/eslint-plugin-svelte-2.38.0.tgz", + "integrity": "sha512-IwwxhHzitx3dr0/xo0z4jjDlb2AAHBPKt+juMyKKGTLlKi1rZfA4qixMwnveU20/JTHyipM6keX4Vr7LZFYc9g==", + "dev": true, + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@jridgewell/sourcemap-codec": "^1.4.15", + "debug": "^4.3.4", + "eslint-compat-utils": "^0.5.0", + "esutils": "^2.0.3", + "known-css-properties": "^0.30.0", + "postcss": "^8.4.38", + "postcss-load-config": "^3.1.4", + "postcss-safe-parser": "^6.0.0", + "postcss-selector-parser": "^6.0.16", + "semver": "^7.6.0", + "svelte-eslint-parser": ">=0.35.0 <1.0.0" + }, + "engines": { + "node": "^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "eslint": "^7.0.0 || ^8.0.0-0 || ^9.0.0-0", + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.112" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-svelte/node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/eslint-plugin-svelte/node_modules/postcss-load-config": { + "version": "3.1.4", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-3.1.4.tgz", + "integrity": "sha512-6DiM4E7v4coTE4uzA8U//WhtPwyhiim3eyjEMFCnUpzbrkK9wJHgKDT2mR+HbtSrd/NubVaYTOpSpjUl8NQeRg==", + "dev": true, + "dependencies": { + "lilconfig": "^2.0.5", + "yaml": "^1.10.2" + }, + "engines": { + "node": ">= 10" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/eslint-plugin-svelte/node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "dev": true, + "engines": { + "node": ">= 6" + } + }, + "node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dev": true, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "dev": true, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/esm-env": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esm-env/-/esm-env-1.0.0.tgz", + "integrity": "sha512-Cf6VksWPsTuW01vU9Mk/3vRue91Zevka5SjyNf3nEpokFRuqt/KjUQoGAwq9qMmhpLTHmXzSIrFRw8zxWzmFBA==", + "dev": true + }, + "node_modules/espree": { + "version": "9.6.1", + "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", + "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", + "dev": true, + "dependencies": { + "acorn": "^8.9.0", + "acorn-jsx": "^5.3.2", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/esquery": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", + "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", + "dev": true, + "dependencies": { + "estraverse": "^5.1.0" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/esrecurse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", + "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", + "dev": true, + "dependencies": { + "estraverse": "^5.2.0" + }, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "dev": true, + "engines": { + "node": ">=4.0" + } + }, + "node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/fast-deep-equal": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", + "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", + "dev": true + }, + "node_modules/fast-glob": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", + "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.4" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fast-glob/node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fast-json-stable-stringify": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", + "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", + "dev": true + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "dev": true + }, + "node_modules/fastq": { + "version": "1.17.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", + "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/file-entry-cache": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", + "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", + "dev": true, + "dependencies": { + "flat-cache": "^3.0.4" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/find-up": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", + "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", + "dev": true, + "dependencies": { + "locate-path": "^6.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/flat-cache": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", + "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", + "dev": true, + "dependencies": { + "flatted": "^3.2.9", + "keyv": "^4.5.3", + "rimraf": "^3.0.2" + }, + "engines": { + "node": "^10.12.0 || >=12.0.0" + } + }, + "node_modules/flatted": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", + "dev": true + }, + "node_modules/focus-trap": { + "version": "7.5.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.5.4.tgz", + "integrity": "sha512-N7kHdlgsO/v+iD/dMoJKtsSqs5Dz/dXZVebRgJw23LDk+jMi/974zyiOYDziY2JPp8xivq9BmUGwIJMiuSBi7w==", + "dependencies": { + "tabbable": "^6.2.0" + } + }, + "node_modules/foreground-child": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.1.1.tgz", + "integrity": "sha512-TMKDUnIte6bfb5nWv7V/caI169OHgvwjb7V4WkeUvbQQdjr5rWKqHFiKWb/fcOwB+CzBT+qbWjvj+DVwRskpIg==", + "dependencies": { + "cross-spawn": "^7.0.0", + "signal-exit": "^4.0.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/fraction.js": { + "version": "4.3.7", + "resolved": "https://registry.npmjs.org/fraction.js/-/fraction.js-4.3.7.tgz", + "integrity": "sha512-ZsDfxO51wGAXREY55a7la9LScWpwv9RxIrYABrlvOFBlH/ShPnrtsXeuUIfXKKOVicNxQ+o8JTbJvjS4M89yew==", + "dev": true, + "engines": { + "node": "*" + }, + "funding": { + "type": "patreon", + "url": "https://github.com/sponsors/rawify" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", + "dev": true + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/glob-parent": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", + "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", + "dependencies": { + "is-glob": "^4.0.3" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/glob/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/glob/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globalyzer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globalyzer/-/globalyzer-0.1.0.tgz", + "integrity": "sha512-40oNTM9UfG6aBmuKxk/giHn5nQ8RVz/SS4Ir6zgzOv9/qC3kKZ9v4etGTcJbEl/NyVQH7FGU7d+X1egr57Md2Q==", + "dev": true + }, + "node_modules/globby": { + "version": "11.1.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", + "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", + "dev": true, + "dependencies": { + "array-union": "^2.1.0", + "dir-glob": "^3.0.1", + "fast-glob": "^3.2.9", + "ignore": "^5.2.0", + "merge2": "^1.4.1", + "slash": "^3.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/globrex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/globrex/-/globrex-0.1.2.tgz", + "integrity": "sha512-uHJgbwAMwNFf5mLst7IWLNg14x1CkeqglJb/K3doi4dw6q2IvAAmM/Y81kevy83wP+Sst+nutFTYOGg3d1lsxg==", + "dev": true + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "dev": true + }, + "node_modules/graphemer": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", + "dev": true + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/ignore": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", + "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", + "dev": true, + "engines": { + "node": ">= 4" + } + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "dev": true, + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/import-meta-resolve": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/import-meta-resolve/-/import-meta-resolve-4.1.0.tgz", + "integrity": "sha512-I6fiaX09Xivtk+THaMfAwnA3MVA5Big1WHF1Dfx9hFuvNIWpXnorlkzhcQf6ehrqQiiZECRt1poOAkPmer3ruw==", + "dev": true, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/wooorm" + } + }, + "node_modules/imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", + "dev": true, + "engines": { + "node": ">=0.8.19" + } + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dev": true, + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", + "dev": true + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-core-module": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.13.1.tgz", + "integrity": "sha512-hHrIjvZsftOsvKSn2TRYl63zvxsgE0K+0mYMoH6gD4omR5IWB2KynivBQczo3+wF1cCkjzvptnI9Q0sPU66ilw==", + "dependencies": { + "hasown": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-path-inside": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", + "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-reference": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/is-reference/-/is-reference-3.0.2.tgz", + "integrity": "sha512-v3rht/LgVcsdZa3O2Nqs+NMowLOxeOm7Ay9+/ARQ2F+qEoANRcqrjAZKGN0v8ymUetZGgkp26LTnGT7H0Qo9Pg==", + "dependencies": { + "@types/estree": "*" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jackspeak": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-2.3.6.tgz", + "integrity": "sha512-N3yCS/NegsOBokc8GAdM8UcmfsKiSS8cipheD/nivzr700H+nsMOxJjQnvwOcRYVuFkdH0wGUvW2WbXGmrZGbQ==", + "dependencies": { + "@isaacs/cliui": "^8.0.2" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + }, + "optionalDependencies": { + "@pkgjs/parseargs": "^0.11.0" + } + }, + "node_modules/jiti": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.0.tgz", + "integrity": "sha512-gFqAIbuKyyso/3G2qhiO2OM6shY6EPP/R0+mkDbyspxKazh8BXDC5FiFsUjlczgdNz/vfra0da2y+aHrusLG/Q==", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dev": true, + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/json-buffer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", + "dev": true + }, + "node_modules/json-schema-traverse": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", + "dev": true + }, + "node_modules/json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", + "dev": true + }, + "node_modules/keyv": { + "version": "4.5.4", + "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", + "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", + "dev": true, + "dependencies": { + "json-buffer": "3.0.1" + } + }, + "node_modules/kleur": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/kleur/-/kleur-4.1.5.tgz", + "integrity": "sha512-o+NO+8WrRiQEE4/7nwRJhN1HWpVmJm511pBHUxPLtp0BUISzlBplORYSmTclCnJvQq2tKu/sgl3xVpkc7ZWuQQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/known-css-properties": { + "version": "0.30.0", + "resolved": "https://registry.npmjs.org/known-css-properties/-/known-css-properties-0.30.0.tgz", + "integrity": "sha512-VSWXYUnsPu9+WYKkfmJyLKtIvaRJi1kXUqVmBACORXZQxT5oZDsoZ2vQP+bQFDnWtpI/4eq3MLoRMjI2fnLzTQ==", + "dev": true + }, + "node_modules/levn": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", + "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1", + "type-check": "~0.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "dev": true, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==" + }, + "node_modules/locate-character": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/locate-character/-/locate-character-3.0.0.tgz", + "integrity": "sha512-SW13ws7BjaeJ6p7Q6CO2nchbYEc3X3J6WrmTTDto7yMPqVSZTUyY5Tjbid+Ab8gLnATtygYtiDIJGQRRn2ZOiA==" + }, + "node_modules/locate-path": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", + "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", + "dev": true, + "dependencies": { + "p-locate": "^5.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/lodash.merge": { + "version": "4.6.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", + "dev": true + }, + "node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/lucide-svelte": { + "version": "0.377.0", + "resolved": "https://registry.npmjs.org/lucide-svelte/-/lucide-svelte-0.377.0.tgz", + "integrity": "sha512-RUsf2d/tNQuDAgPpBfkhgXfho0VCw5dA7O2ZT/wpl0JVMJelGlASfx5IMZRU8jYOqWSp9UlUXWa4MvLp1GzuPQ==", + "peerDependencies": { + "svelte": "^3 || ^4 || ^5.0.0-next.42" + } + }, + "node_modules/magic-string": { + "version": "0.30.10", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.10.tgz", + "integrity": "sha512-iIRwTIf0QKV3UAnYK4PU8uiEc4SRh5jX0mwpIwETPpHdhVM4f53RSwS/vXvN1JhGX+Cs7B8qIq3d6AH49O5fAQ==", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.15" + } + }, + "node_modules/mdn-data": { + "version": "2.0.30", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.30.tgz", + "integrity": "sha512-GaqWWShW4kv/G9IEucWScBx9G1/vsFZZJUO+tD26M8J8z3Kw5RDQjaoZe03YAClgeS/SWPOcb4nkFBTEi5DUEA==" + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", + "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", + "dependencies": { + "braces": "^3.0.2", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/minimist": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", + "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", + "dev": true, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/minipass": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.0.4.tgz", + "integrity": "sha512-jYofLM5Dam9279rdkWzqHozUo4ybjdZmCsDHePy5V/PbBcVMiSZR97gmAy45aqi8CK1lG2ECd356FU86avfwUQ==", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/mkdirp": { + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dev": true, + "dependencies": { + "minimist": "^1.2.6" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/mode-watcher": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mode-watcher/-/mode-watcher-0.3.0.tgz", + "integrity": "sha512-k8jjuTx94HaaRKWO6JDf8wL761hFatrTIHJKl+E+3JWcnv+GnMBH062zcLsy0lbCI3n7RZxxHaWi66auFnUO4g==", + "peerDependencies": { + "svelte": "^4.0.0" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/mrmime": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/mrmime/-/mrmime-2.0.0.tgz", + "integrity": "sha512-eu38+hdgojoyq63s+yTpN4XMBdt5l8HhMhc4VKLO9KM5caLIBvUm4thi7fFaxyTmCKeNnXZ5pAlBwCUnhA09uw==", + "dev": true, + "engines": { + "node": ">=10" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "dev": true + }, + "node_modules/mz": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/mz/-/mz-2.7.0.tgz", + "integrity": "sha512-z81GNO7nnYMEhrGh9LeymoE4+Yr0Wn5McHIZMK5cfQCl+NDX08sCZgUc9/6MHni9IWuFLm1Z3HTCXu2z9fN62Q==", + "dependencies": { + "any-promise": "^1.0.0", + "object-assign": "^4.0.1", + "thenify-all": "^1.0.0" + } + }, + "node_modules/nanoid": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.7.tgz", + "integrity": "sha512-eSRppjcPIatRIMC1U6UngP8XFcz8MQWGQdt1MTBQ7NaAmvXDfvNxbvWV3x2y6CdEUciCSsDHDQZbhYaB8QEo2g==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", + "dev": true + }, + "node_modules/node-releases": { + "version": "2.0.14", + "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", + "integrity": "sha512-y10wOWt8yZpqXmOgRo77WaHEmhYQYGNA6y421PKsKYWEK8aW+cqAphborZDhqfyKrbZEN92CN1X2KbafY2s7Yw==", + "dev": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/normalize-range": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz", + "integrity": "sha512-bdok/XvKII3nUpklnV6P2hxtMNrCboOjAcyBuQnWEhO665FwrSNRxU+AqpsyvO6LgGYPspN+lu5CLtw4jPRKNA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dev": true, + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/optionator": { + "version": "0.9.4", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", + "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", + "dev": true, + "dependencies": { + "deep-is": "^0.1.3", + "fast-levenshtein": "^2.0.6", + "levn": "^0.4.1", + "prelude-ls": "^1.2.1", + "type-check": "^0.4.0", + "word-wrap": "^1.2.5" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", + "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", + "dev": true, + "dependencies": { + "yocto-queue": "^0.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/p-locate": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", + "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", + "dev": true, + "dependencies": { + "p-limit": "^3.0.2" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "dev": true, + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/path-scurry": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "dependencies": { + "lru-cache": "^10.2.0", + "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/path-scurry/node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/path-type": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", + "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/periscopic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/periscopic/-/periscopic-3.1.0.tgz", + "integrity": "sha512-vKiQ8RRtkl9P+r/+oefh25C3fhybptkHKCZSPlcXiJux2tJF55GnEj3BVn4A5gKfq9NWWXXrxkHBwVPUfH0opw==", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^3.0.0", + "is-reference": "^3.0.0" + } + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha512-udgsAY+fTnvv7kI7aaxbqwWNb0AHiB0qBO89PZKPkoTmGOgdbrHDKD+0B2X4uTfJ/FT1R09r9gTsjUjNJotuog==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/pirates": { + "version": "4.0.6", + "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz", + "integrity": "sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/postcss": { + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "nanoid": "^3.3.7", + "picocolors": "^1.0.0", + "source-map-js": "^1.2.0" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/postcss-import": { + "version": "15.1.0", + "resolved": "https://registry.npmjs.org/postcss-import/-/postcss-import-15.1.0.tgz", + "integrity": "sha512-hpr+J05B2FVYUAXHeK1YyI267J/dDDhMU6B6civm8hSY1jYJnBXxzKDKDswzJmtLHryrjhnDjqqp/49t8FALew==", + "dependencies": { + "postcss-value-parser": "^4.0.0", + "read-cache": "^1.0.0", + "resolve": "^1.1.7" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "postcss": "^8.0.0" + } + }, + "node_modules/postcss-js": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/postcss-js/-/postcss-js-4.0.1.tgz", + "integrity": "sha512-dDLF8pEO191hJMtlHFPRa8xsizHaM82MLfNkUHdUtVEV3tgTp5oj+8qbEqYM57SLfc74KSbw//4SeJma2LRVIw==", + "dependencies": { + "camelcase-css": "^2.0.1" + }, + "engines": { + "node": "^12 || ^14 || >= 16" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.4.21" + } + }, + "node_modules/postcss-load-config": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-5.1.0.tgz", + "integrity": "sha512-G5AJ+IX0aD0dygOE0yFZQ/huFFMSNneyfp0e3/bT05a8OfPC5FUoZRPfGijUdGOJNMewJiwzcHJXFafFzeKFVA==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.1.1", + "yaml": "^2.4.2" + }, + "engines": { + "node": ">= 18" + }, + "peerDependencies": { + "jiti": ">=1.21.0", + "postcss": ">=8.0.9", + "tsx": "^4.8.1" + }, + "peerDependenciesMeta": { + "jiti": { + "optional": true + }, + "postcss": { + "optional": true + }, + "tsx": { + "optional": true + } + } + }, + "node_modules/postcss-nested": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/postcss-nested/-/postcss-nested-6.0.1.tgz", + "integrity": "sha512-mEp4xPMi5bSWiMbsgoPfcP74lsWLHkQbZc3sY+jWYd65CUwXrUaTp0fmNpa01ZcETKlIgUdFN/MpS2xZtqL9dQ==", + "dependencies": { + "postcss-selector-parser": "^6.0.11" + }, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.2.14" + } + }, + "node_modules/postcss-safe-parser": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/postcss-safe-parser/-/postcss-safe-parser-6.0.0.tgz", + "integrity": "sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ==", + "dev": true, + "engines": { + "node": ">=12.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + "peerDependencies": { + "postcss": "^8.3.3" + } + }, + "node_modules/postcss-scss": { + "version": "4.0.9", + "resolved": "https://registry.npmjs.org/postcss-scss/-/postcss-scss-4.0.9.tgz", + "integrity": "sha512-AjKOeiwAitL/MXxQW2DliT28EKukvvbEWx3LBmJIRN8KfBGZbRTxNYW0kSqi1COiTZ57nZ9NW06S6ux//N1c9A==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss-scss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "engines": { + "node": ">=12.0" + }, + "peerDependencies": { + "postcss": "^8.4.29" + } + }, + "node_modules/postcss-selector-parser": { + "version": "6.0.16", + "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.16.tgz", + "integrity": "sha512-A0RVJrX+IUkVZbW3ClroRWurercFhieevHB38sr2+l9eUClMqome3LmEmnhlNy+5Mr2EYN6B2Kaw9wYdd+VHiw==", + "dependencies": { + "cssesc": "^3.0.0", + "util-deprecate": "^1.0.2" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/postcss-value-parser": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz", + "integrity": "sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ==" + }, + "node_modules/prelude-ls": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", + "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", + "dev": true, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/prettier": { + "version": "3.2.5", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.2.5.tgz", + "integrity": "sha512-3/GWa9aOC0YeD7LUfvOG2NiDyhOWRvt1k+rcKhOuYnMY24iiCphgneUfJDyFXd6rZCAnuLBv6UeAULtrhT/F4A==", + "dev": true, + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/prettier-plugin-svelte": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/prettier-plugin-svelte/-/prettier-plugin-svelte-3.2.3.tgz", + "integrity": "sha512-wJq8RunyFlWco6U0WJV5wNCM7zpBFakS76UBSbmzMGpncpK98NZABaE+s7n8/APDCEVNHXC5Mpq+MLebQtsRlg==", + "dev": true, + "peerDependencies": { + "prettier": "^3.0.0", + "svelte": "^3.2.0 || ^4.0.0-next.0 || ^5.0.0-next.0" + } + }, + "node_modules/prettier-plugin-tailwindcss": { + "version": "0.5.14", + "resolved": "https://registry.npmjs.org/prettier-plugin-tailwindcss/-/prettier-plugin-tailwindcss-0.5.14.tgz", + "integrity": "sha512-Puaz+wPUAhFp8Lo9HuciYKM2Y2XExESjeT+9NQoVFXZsPPnc9VYss2SpxdQ6vbatmt8/4+SN0oe0I1cPDABg9Q==", + "dev": true, + "engines": { + "node": ">=14.21.3" + }, + "peerDependencies": { + "@ianvs/prettier-plugin-sort-imports": "*", + "@prettier/plugin-pug": "*", + "@shopify/prettier-plugin-liquid": "*", + "@trivago/prettier-plugin-sort-imports": "*", + "@zackad/prettier-plugin-twig-melody": "*", + "prettier": "^3.0", + "prettier-plugin-astro": "*", + "prettier-plugin-css-order": "*", + "prettier-plugin-import-sort": "*", + "prettier-plugin-jsdoc": "*", + "prettier-plugin-marko": "*", + "prettier-plugin-organize-attributes": "*", + "prettier-plugin-organize-imports": "*", + "prettier-plugin-sort-imports": "*", + "prettier-plugin-style-order": "*", + "prettier-plugin-svelte": "*" + }, + "peerDependenciesMeta": { + "@ianvs/prettier-plugin-sort-imports": { + "optional": true + }, + "@prettier/plugin-pug": { + "optional": true + }, + "@shopify/prettier-plugin-liquid": { + "optional": true + }, + "@trivago/prettier-plugin-sort-imports": { + "optional": true + }, + "@zackad/prettier-plugin-twig-melody": { + "optional": true + }, + "prettier-plugin-astro": { + "optional": true + }, + "prettier-plugin-css-order": { + "optional": true + }, + "prettier-plugin-import-sort": { + "optional": true + }, + "prettier-plugin-jsdoc": { + "optional": true + }, + "prettier-plugin-marko": { + "optional": true + }, + "prettier-plugin-organize-attributes": { + "optional": true + }, + "prettier-plugin-organize-imports": { + "optional": true + }, + "prettier-plugin-sort-imports": { + "optional": true + }, + "prettier-plugin-style-order": { + "optional": true + }, + "prettier-plugin-svelte": { + "optional": true + } + } + }, + "node_modules/punycode": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", + "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ] + }, + "node_modules/read-cache": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz", + "integrity": "sha512-Owdv/Ft7IjOgm/i0xvNDZ1LrRANRfew4b2prF3OWMQLxLfu3bS8FVhCsrSCMK4lR56Y9ya+AThoTpDCTxCmpRA==", + "dependencies": { + "pify": "^2.3.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.14.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" + }, + "node_modules/resolve": { + "version": "1.22.8", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.8.tgz", + "integrity": "sha512-oKWePCxqpd6FlLvGV1VU0x7bkPmmCNolxzjMf4NczoDnQcIWrAF+cPtZn5i6n+RfD2d9i0tzpKnG6Yk168yIyw==", + "dependencies": { + "is-core-module": "^2.13.0", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "dev": true, + "engines": { + "node": ">=4" + } + }, + "node_modules/reusify": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", + "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rimraf": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", + "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rollup": { + "version": "4.17.2", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.17.2.tgz", + "integrity": "sha512-/9ClTJPByC0U4zNLowV1tMBe8yMEAxewtR3cUNX5BoEpGH3dQEWpJLr6CLp0fPdYRF/fzVOgvDb1zXuakwF5kQ==", + "dev": true, + "dependencies": { + "@types/estree": "1.0.5" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.17.2", + "@rollup/rollup-android-arm64": "4.17.2", + "@rollup/rollup-darwin-arm64": "4.17.2", + "@rollup/rollup-darwin-x64": "4.17.2", + "@rollup/rollup-linux-arm-gnueabihf": "4.17.2", + "@rollup/rollup-linux-arm-musleabihf": "4.17.2", + "@rollup/rollup-linux-arm64-gnu": "4.17.2", + "@rollup/rollup-linux-arm64-musl": "4.17.2", + "@rollup/rollup-linux-powerpc64le-gnu": "4.17.2", + "@rollup/rollup-linux-riscv64-gnu": "4.17.2", + "@rollup/rollup-linux-s390x-gnu": "4.17.2", + "@rollup/rollup-linux-x64-gnu": "4.17.2", + "@rollup/rollup-linux-x64-musl": "4.17.2", + "@rollup/rollup-win32-arm64-msvc": "4.17.2", + "@rollup/rollup-win32-ia32-msvc": "4.17.2", + "@rollup/rollup-win32-x64-msvc": "4.17.2", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sade": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/sade/-/sade-1.8.1.tgz", + "integrity": "sha512-xal3CZX1Xlo/k4ApwCFrHVACi9fBqJ7V+mwhBsuf/1IOKbBy098Fex+Wa/5QMubw09pSZ/u8EY8PWgevJsXp1A==", + "dev": true, + "dependencies": { + "mri": "^1.1.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/sander": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/sander/-/sander-0.5.1.tgz", + "integrity": "sha512-3lVqBir7WuKDHGrKRDn/1Ye3kwpXaDOMsiRP1wd6wpZW56gJhsbp5RqQpA6JG/P+pkXizygnr1dKR8vzWaVsfA==", + "dev": true, + "dependencies": { + "es6-promise": "^3.1.2", + "graceful-fs": "^4.1.3", + "mkdirp": "^0.5.1", + "rimraf": "^2.5.2" + } + }, + "node_modules/sander/node_modules/rimraf": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", + "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", + "dev": true, + "dependencies": { + "glob": "^7.1.3" + }, + "bin": { + "rimraf": "bin.js" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "dev": true, + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/set-cookie-parser": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.6.0.tgz", + "integrity": "sha512-RVnVQxTXuerk653XfuliOxBP81Sf0+qfQE73LIYKcyMYHG94AuH0kgrQpRDuTZnSmjpysHmzxJXKNfa6PjFhyQ==", + "dev": true + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/sirv": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/sirv/-/sirv-2.0.4.tgz", + "integrity": "sha512-94Bdh3cC2PKrbgSOUqTiGPWVZeSiXfKOVZNJniWoqrWrRkB1CJzBU3NEbiTsPcYy1lDsANA/THzS+9WBiy5nfQ==", + "dev": true, + "dependencies": { + "@polka/url": "^1.0.0-next.24", + "mrmime": "^2.0.0", + "totalist": "^3.0.0" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/slash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", + "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/sorcery": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/sorcery/-/sorcery-0.11.0.tgz", + "integrity": "sha512-J69LQ22xrQB1cIFJhPfgtLuI6BpWRiWu1Y3vSsIwK/eAScqJxd/+CJlUuHQRdX2C9NGFamq+KqNywGgaThwfHw==", + "dev": true, + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.4.14", + "buffer-crc32": "^0.2.5", + "minimist": "^1.2.0", + "sander": "^0.5.0" + }, + "bin": { + "sorcery": "bin/sorcery" + } + }, + "node_modules/source-map-js": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/string-width": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", + "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "dependencies": { + "eastasianwidth": "^0.2.0", + "emoji-regex": "^9.2.2", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/string-width-cjs": { + "name": "string-width", + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/string-width-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/string-width/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/string-width/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi-cjs": { + "name": "strip-ansi", + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dev": true, + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-json-comments": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", + "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", + "dev": true, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/sucrase": { + "version": "3.35.0", + "resolved": "https://registry.npmjs.org/sucrase/-/sucrase-3.35.0.tgz", + "integrity": "sha512-8EbVDiu9iN/nESwxeSxDKe0dunta1GOlHufmSSXxMD2z2/tMZpDMpvXQGsc+ajGo8y2uYUmixaSRUc/QPoQ0GA==", + "dependencies": { + "@jridgewell/gen-mapping": "^0.3.2", + "commander": "^4.0.0", + "glob": "^10.3.10", + "lines-and-columns": "^1.1.6", + "mz": "^2.7.0", + "pirates": "^4.0.1", + "ts-interface-checker": "^0.1.9" + }, + "bin": { + "sucrase": "bin/sucrase", + "sucrase-node": "bin/sucrase-node" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, + "node_modules/sucrase/node_modules/glob": { + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "dependencies": { + "foreground-child": "^3.1.0", + "jackspeak": "^2.3.6", + "minimatch": "^9.0.1", + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" + }, + "bin": { + "glob": "dist/esm/bin.mjs" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/svelte": { + "version": "4.2.15", + "resolved": "https://registry.npmjs.org/svelte/-/svelte-4.2.15.tgz", + "integrity": "sha512-j9KJSccHgLeRERPlhMKrCXpk2TqL2m5Z+k+OBTQhZOhIdCCd3WfqV+ylPWeipEwq17P/ekiSFWwrVQv93i3bsg==", + "dependencies": { + "@ampproject/remapping": "^2.2.1", + "@jridgewell/sourcemap-codec": "^1.4.15", + "@jridgewell/trace-mapping": "^0.3.18", + "@types/estree": "^1.0.1", + "acorn": "^8.9.0", + "aria-query": "^5.3.0", + "axobject-query": "^4.0.0", + "code-red": "^1.0.3", + "css-tree": "^2.3.1", + "estree-walker": "^3.0.3", + "is-reference": "^3.0.1", + "locate-character": "^3.0.0", + "magic-string": "^0.30.4", + "periscopic": "^3.1.0" + }, + "engines": { + "node": ">=16" + } + }, + "node_modules/svelte-check": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/svelte-check/-/svelte-check-3.7.0.tgz", + "integrity": "sha512-Va6sGL4Vy4znn0K+vaatk98zoBvG2aDee4y3r5X4S80z8DXfbACHvdLlyXa4C4c5tQzK9H0Uq2pbd20wH3ucjQ==", + "dev": true, + "dependencies": { + "@jridgewell/trace-mapping": "^0.3.17", + "chokidar": "^3.4.1", + "fast-glob": "^3.2.7", + "import-fresh": "^3.2.1", + "picocolors": "^1.0.0", + "sade": "^1.7.4", + "svelte-preprocess": "^5.1.3", + "typescript": "^5.0.3" + }, + "bin": { + "svelte-check": "bin/svelte-check" + }, + "peerDependencies": { + "svelte": "^3.55.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0" + } + }, + "node_modules/svelte-eslint-parser": { + "version": "0.35.0", + "resolved": "https://registry.npmjs.org/svelte-eslint-parser/-/svelte-eslint-parser-0.35.0.tgz", + "integrity": "sha512-CtbPseajW0gjwEvHiuzYJkPDjAcHz2FaHt540j6RVYrZgnE6xWkzUBodQ4I3nV+G5AS0Svt8K6aIA/CIU9xT2Q==", + "dev": true, + "dependencies": { + "eslint-scope": "^7.2.2", + "eslint-visitor-keys": "^3.4.3", + "espree": "^9.6.1", + "postcss": "^8.4.38", + "postcss-scss": "^4.0.9" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/ota-meshi" + }, + "peerDependencies": { + "svelte": "^3.37.0 || ^4.0.0 || ^5.0.0-next.112" + }, + "peerDependenciesMeta": { + "svelte": { + "optional": true + } + } + }, + "node_modules/svelte-hmr": { + "version": "0.16.0", + "resolved": "https://registry.npmjs.org/svelte-hmr/-/svelte-hmr-0.16.0.tgz", + "integrity": "sha512-Gyc7cOS3VJzLlfj7wKS0ZnzDVdv3Pn2IuVeJPk9m2skfhcu5bq3wtIZyQGggr7/Iim5rH5cncyQft/kRLupcnA==", + "dev": true, + "engines": { + "node": "^12.20 || ^14.13.1 || >= 16" + }, + "peerDependencies": { + "svelte": "^3.19.0 || ^4.0.0" + } + }, + "node_modules/svelte-preprocess": { + "version": "5.1.4", + "resolved": "https://registry.npmjs.org/svelte-preprocess/-/svelte-preprocess-5.1.4.tgz", + "integrity": "sha512-IvnbQ6D6Ao3Gg6ftiM5tdbR6aAETwjhHV+UKGf5bHGYR69RQvF1ho0JKPcbUON4vy4R7zom13jPjgdOWCQ5hDA==", + "dev": true, + "hasInstallScript": true, + "dependencies": { + "@types/pug": "^2.0.6", + "detect-indent": "^6.1.0", + "magic-string": "^0.30.5", + "sorcery": "^0.11.0", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">= 16.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.10.2", + "coffeescript": "^2.5.1", + "less": "^3.11.3 || ^4.0.0", + "postcss": "^7 || ^8", + "postcss-load-config": "^2.1.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", + "pug": "^3.0.0", + "sass": "^1.26.8", + "stylus": "^0.55.0", + "sugarss": "^2.0.0 || ^3.0.0 || ^4.0.0", + "svelte": "^3.23.0 || ^4.0.0-next.0 || ^4.0.0 || ^5.0.0-next.0", + "typescript": ">=3.9.5 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "@babel/core": { + "optional": true + }, + "coffeescript": { + "optional": true + }, + "less": { + "optional": true + }, + "postcss": { + "optional": true + }, + "postcss-load-config": { + "optional": true + }, + "pug": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "typescript": { + "optional": true + } + } + }, + "node_modules/svelte-sonner": { + "version": "0.3.24", + "resolved": "https://registry.npmjs.org/svelte-sonner/-/svelte-sonner-0.3.24.tgz", + "integrity": "sha512-txuL0JBUs0v6qGrr0PGCsbXmKHuthdrAkfISYi8umuveF7+gINb6EXl6VmKY9aHhyxCqvVgqd6yophQNrnor4w==", + "peerDependencies": { + "svelte": ">=3 <5" + } + }, + "node_modules/tabbable": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/tabbable/-/tabbable-6.2.0.tgz", + "integrity": "sha512-Cat63mxsVJlzYvN51JmVXIgNoUokrIaT2zLclCXjRd8boZ0004U4KCs/sToJ75C6sdlByWxpYnb5Boif1VSFew==" + }, + "node_modules/tailwind-merge": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/tailwind-merge/-/tailwind-merge-2.3.0.tgz", + "integrity": "sha512-vkYrLpIP+lgR0tQCG6AP7zZXCTLc1Lnv/CCRT3BqJ9CZ3ui2++GPaGb1x/ILsINIMSYqqvrpqjUFsMNLlW99EA==", + "dependencies": { + "@babel/runtime": "^7.24.1" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/dcastil" + } + }, + "node_modules/tailwind-variants": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/tailwind-variants/-/tailwind-variants-0.2.1.tgz", + "integrity": "sha512-2xmhAf4UIc3PijOUcJPA1LP4AbxhpcHuHM2C26xM0k81r0maAO6uoUSHl3APmvHZcY5cZCY/bYuJdfFa4eGoaw==", + "dependencies": { + "tailwind-merge": "^2.2.0" + }, + "engines": { + "node": ">=16.x", + "pnpm": ">=7.x" + }, + "peerDependencies": { + "tailwindcss": "*" + } + }, + "node_modules/tailwindcss": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", + "dependencies": { + "@alloc/quick-lru": "^5.2.0", + "arg": "^5.0.2", + "chokidar": "^3.5.3", + "didyoumean": "^1.2.2", + "dlv": "^1.1.3", + "fast-glob": "^3.3.0", + "glob-parent": "^6.0.2", + "is-glob": "^4.0.3", + "jiti": "^1.21.0", + "lilconfig": "^2.1.0", + "micromatch": "^4.0.5", + "normalize-path": "^3.0.0", + "object-hash": "^3.0.0", + "picocolors": "^1.0.0", + "postcss": "^8.4.23", + "postcss-import": "^15.1.0", + "postcss-js": "^4.0.1", + "postcss-load-config": "^4.0.1", + "postcss-nested": "^6.0.1", + "postcss-selector-parser": "^6.0.11", + "resolve": "^1.22.2", + "sucrase": "^3.32.0" + }, + "bin": { + "tailwind": "lib/cli.js", + "tailwindcss": "lib/cli.js" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/tailwindcss/node_modules/lilconfig": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-2.1.0.tgz", + "integrity": "sha512-utWOt/GHzuUxnLKxB6dk81RoOeoNeHgbrXiuGk4yyF5qlRz+iIVWu56E2fqGHFrXz0QNUhLB/8nKqvRH66JKGQ==", + "engines": { + "node": ">=10" + } + }, + "node_modules/tailwindcss/node_modules/postcss-load-config": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/postcss-load-config/-/postcss-load-config-4.0.2.tgz", + "integrity": "sha512-bSVhyJGL00wMVoPUzAVAnbEoWyqRxkjv64tUl427SKnPrENtq6hJwUojroMz2VB+Q1edmi4IfrAPpami5VVgMQ==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "lilconfig": "^3.0.0", + "yaml": "^2.3.4" + }, + "engines": { + "node": ">= 14" + }, + "peerDependencies": { + "postcss": ">=8.0.9", + "ts-node": ">=9.0.0" + }, + "peerDependenciesMeta": { + "postcss": { + "optional": true + }, + "ts-node": { + "optional": true + } + } + }, + "node_modules/tailwindcss/node_modules/postcss-load-config/node_modules/lilconfig": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", + "integrity": "sha512-O18pf7nyvHTckunPWCV1XUNXU1piu01y2b7ATJ0ppkUkk8ocqVWBrYjJBCwHDjD/ZWcfyrA0P4gKhzWGi5EINQ==", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antonk52" + } + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", + "dev": true + }, + "node_modules/thenify": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/thenify/-/thenify-3.3.1.tgz", + "integrity": "sha512-RVZSIV5IG10Hk3enotrhvz0T9em6cyHBLkH/YAZuKqd8hRkKhSfCGIcP2KUY0EPxndzANBmNllzWPwak+bheSw==", + "dependencies": { + "any-promise": "^1.0.0" + } + }, + "node_modules/thenify-all": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/thenify-all/-/thenify-all-1.6.0.tgz", + "integrity": "sha512-RNxQH/qI8/t3thXJDwcstUO4zeqo64+Uy/+sNVRBx4Xn2OX+OZ9oP+iJnNFqplFra2ZUVeKCSa2oVWi3T4uVmA==", + "dependencies": { + "thenify": ">= 3.1.0 < 4" + }, + "engines": { + "node": ">=0.8" + } + }, + "node_modules/tiny-glob": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/tiny-glob/-/tiny-glob-0.2.9.tgz", + "integrity": "sha512-g/55ssRPUjShh+xkfx9UPDXqhckHEsHr4Vd9zX55oSdGZc/MD0m3sferOkwWtp98bv+kcVfEHtRJgBVJzelrzg==", + "dev": true, + "dependencies": { + "globalyzer": "0.1.0", + "globrex": "^0.1.2" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/totalist": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/totalist/-/totalist-3.0.1.tgz", + "integrity": "sha512-sf4i37nQ2LBx4m3wB74y+ubopq6W/dIzXg0FDGjsYnZHVa1Da8FH853wlL2gtUhg+xJXjfk3kUZS3BRoQeoQBQ==", + "dev": true, + "engines": { + "node": ">=6" + } + }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "dev": true, + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, + "node_modules/ts-interface-checker": { + "version": "0.1.13", + "resolved": "https://registry.npmjs.org/ts-interface-checker/-/ts-interface-checker-0.1.13.tgz", + "integrity": "sha512-Y/arvbn+rrz3JCKl9C4kVNfTfSm2/mEp5FSz5EsZSANGPSlQrpRI5M4PKF+mJnE52jOO90PnPSc3Ur3bTQw0gA==" + }, + "node_modules/tslib": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz", + "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==" + }, + "node_modules/type-check": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", + "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", + "dev": true, + "dependencies": { + "prelude-ls": "^1.2.1" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/type-fest": { + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", + "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "dev": true, + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/update-browserslist-db": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.0.14.tgz", + "integrity": "sha512-JixKH8GR2pWYshIPUg/NujK3JO7JiqEEUiNArE86NQyrgUuZeTlZQN3xuS/yiV5Kb48ev9K6RqNkaJjXsdg7Jw==", + "dev": true, + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/browserslist" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/browserslist" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "dependencies": { + "escalade": "^3.1.2", + "picocolors": "^1.0.0" + }, + "bin": { + "update-browserslist-db": "cli.js" + }, + "peerDependencies": { + "browserslist": ">= 4.21.0" + } + }, + "node_modules/uri-js": { + "version": "4.4.1", + "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", + "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", + "dev": true, + "dependencies": { + "punycode": "^2.1.0" + } + }, + "node_modules/util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" + }, + "node_modules/vite": { + "version": "5.2.11", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.11.tgz", + "integrity": "sha512-HndV31LWW05i1BLPMUCE1B9E9GFbOu1MbenhS58FuK6owSO5qHm7GiCotrNY1YE5rMeQSFBGmT5ZaLEjFizgiQ==", + "dev": true, + "dependencies": { + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || >=20.0.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.4.0" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + } + } + }, + "node_modules/vitefu": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/vitefu/-/vitefu-0.2.5.tgz", + "integrity": "sha512-SgHtMLoqaeeGnd2evZ849ZbACbnwQCIwRH57t18FxcXoZop0uQu0uzlIhJBlF/eWVzuce0sHeqPcDo+evVcg8Q==", + "dev": true, + "peerDependencies": { + "vite": "^3.0.0 || ^4.0.0 || ^5.0.0" + }, + "peerDependenciesMeta": { + "vite": { + "optional": true + } + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/word-wrap": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", + "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", + "dev": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wrap-ansi": { + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", + "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "dependencies": { + "ansi-styles": "^6.1.0", + "string-width": "^5.0.1", + "strip-ansi": "^7.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs": { + "name": "wrap-ansi", + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/wrap-ansi-cjs/node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-regex": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.0.1.tgz", + "integrity": "sha512-n5M855fKb2SsfMIiFFoVrABHJC8QtHwVx+mHWP3QcEqBHYienj5dHSgjbxtC0WEZXYt4wcD6zrQElDPhFuZgfA==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-regex?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/ansi-styles": { + "version": "6.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", + "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi/node_modules/strip-ansi": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", + "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "dependencies": { + "ansi-regex": "^6.0.1" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/chalk/strip-ansi?sponsor=1" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "dev": true + }, + "node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, + "node_modules/yaml": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", + "integrity": "sha512-B3VqDZ+JAg1nZpaEmWtTXUlBneoGx6CPM9b0TENK6aoSu5t73dItudwdgmi6tHlIZZId4dZ9skcAQ2UbcyAeVA==", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/yocto-queue": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", + "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", + "dev": true, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + } + } +} diff --git a/client/app/package.json b/client/app/package.json new file mode 100644 index 00000000..3d35b864 --- /dev/null +++ b/client/app/package.json @@ -0,0 +1,51 @@ +{ + "name": "mecha-connect", + "version": "0.0.1", + "private": true, + "scripts": { + "dev": "vite dev", + "build": "vite build", + "preview": "vite preview", + "check": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json", + "check:watch": "svelte-kit sync && svelte-check --tsconfig ./tsconfig.json --watch", + "lint": "prettier --check . && eslint .", + "format": "prettier --write ." + }, + "devDependencies": { + "@sveltejs/adapter-auto": "^3.0.0", + "@sveltejs/adapter-static": "^3.0.1", + "@sveltejs/kit": "^2.0.0", + "@sveltejs/vite-plugin-svelte": "^3.0.0", + "@types/eslint": "^8.56.0", + "@typescript-eslint/eslint-plugin": "^7.0.0", + "@typescript-eslint/parser": "^7.0.0", + "autoprefixer": "^10.4.16", + "eslint": "^8.56.0", + "eslint-config-prettier": "^9.1.0", + "eslint-plugin-svelte": "^2.35.1", + "postcss": "^8.4.32", + "postcss-load-config": "^5.0.2", + "prettier": "^3.1.1", + "prettier-plugin-svelte": "^3.1.2", + "prettier-plugin-tailwindcss": "^0.5.9", + "svelte": "^4.2.7", + "svelte-check": "^3.6.0", + "tailwindcss": "^3.3.6", + "tslib": "^2.4.1", + "typescript": "^5.0.0", + "vite": "^5.0.3" + }, + "type": "module", + "dependencies": { + "@tauri-apps/api": "^1.5.4", + "bits-ui": "^0.21.7", + "clsx": "^2.1.1", + "embla-carousel-autoplay": "^8.0.2", + "embla-carousel-svelte": "^8.0.4", + "lucide-svelte": "^0.377.0", + "mode-watcher": "^0.3.0", + "svelte-sonner": "^0.3.24", + "tailwind-merge": "^2.3.0", + "tailwind-variants": "^0.2.1" + } +} diff --git a/client/app/postcss.config.cjs b/client/app/postcss.config.cjs new file mode 100644 index 00000000..65e0bb1f --- /dev/null +++ b/client/app/postcss.config.cjs @@ -0,0 +1,13 @@ +const tailwindcss = require("tailwindcss"); +const autoprefixer = require("autoprefixer"); + +const config = { + plugins: [ + //Some plugins, like tailwindcss/nesting, need to run before Tailwind, + tailwindcss(), + //But others, like autoprefixer, need to run after, + autoprefixer + ] +}; + +module.exports = config; \ No newline at end of file diff --git a/client/app/settings.yml.example b/client/app/settings.yml.example deleted file mode 100644 index be88b63e..00000000 --- a/client/app/settings.yml.example +++ /dev/null @@ -1,46 +0,0 @@ -title: Connect App # Empty -app: - id: connect-app # connect-app - text_multithreading: true # false - antialiasing: true # false - try_opengles_first: true # false -window: - size: [480, 480] # [1024, 768] - position: [0, 0] # [0, 0] - min_size: [480, 480] # None - max_size: null # None - visible: true # true - resizable: true # true - decorations: true # true - transparent: true # false - always_on_top: false # false - icon_path: null # Todo -css: - default: /home/user/.mecha/connect/src/assets/css/style.css -modules: - pages_settings: - app_info: - app_icon: /home/user/.mecha/connect/src/assets/images/mecha_icon.png - virtual_network_icon: /home/user/.mecha/connect/src/assets/images/create_virtual_network.png - real_time_icon: /home/user/.mecha/connect/src/assets/images/real_time.png - encypt_icon: /home/user/.mecha/connect/src/assets/images/encrypt.png - check_internet: - search_wifi: /home/user/.mecha/connect/src/assets/images/searching_wifi.gif - no_internet: - no_internet_found: /home/user/.mecha/connect/src/assets/images/no_wifi.gif - configure_machine: - machine_searching: /home/user/.mecha/connect/src/assets/images/machine_searching.gif - setup_success: - success: /home/user/.mecha/connect/src/assets/images/success.gif - setup_failure: - failure: /home/user/.mecha/connect/src/assets/images/failure.gif - device_info: - user_profile_img: /home/user/.mecha/connect/src/assets/images/mecha_compute.png - active_status_icon: /home/user/.mecha/connect/src/assets/images/active_status.png -widget_configs: - footer: - back_icon: /home/user/.mecha/connect/src/assets/images/back_arrow.png - next_icon: /home/user/.mecha/connect/src/assets/images/next_arrow.png - settings_icon: /home/user/.mecha/connect/src/assets/images/settings_icon.png - refresh_icon: /home/user/.mecha/connect/src/assets/images/refresh_icon.png - trash_icon: /home/user/.mecha/connect/src/assets/images/trash_icon.png \ No newline at end of file diff --git a/client/app/src-tauri/.gitignore b/client/app/src-tauri/.gitignore new file mode 100644 index 00000000..aba21e24 --- /dev/null +++ b/client/app/src-tauri/.gitignore @@ -0,0 +1,3 @@ +# Generated by Cargo +# will have compiled files and executables +/target/ diff --git a/client/app/src-tauri/Cargo.lock b/client/app/src-tauri/Cargo.lock new file mode 100644 index 00000000..f9c62fc2 --- /dev/null +++ b/client/app/src-tauri/Cargo.lock @@ -0,0 +1,4159 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "addr2line" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a30b2e23b9e17a9f90641c7ab1549cd9b44f296d3ccbf309d2863cfe398a0cb" +dependencies = [ + "gimli", +] + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "aho-corasick" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916" +dependencies = [ + "memchr", +] + +[[package]] +name = "alloc-no-stdlib" +version = "2.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc7bb162ec39d46ab1ca8c77bf72e890535becd1751bb45f64c597edb4c8c6b3" + +[[package]] +name = "alloc-stdlib" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94fb8275041c72129eb51b7d0322c29b8387a0386127718b096429201a5d6ece" +dependencies = [ + "alloc-no-stdlib", +] + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anyhow" +version = "1.0.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25bdb32cbbdce2b519a9cd7df3a678443100e265d5e25ca763b7572a5104f5f3" + +[[package]] +name = "app" +version = "0.1.0" +dependencies = [ + "anyhow", + "prost", + "serde", + "serde_json", + "simple-base64", + "tauri", + "tauri-build", + "thiserror", + "tokio", + "tokio-util", + "tonic", + "tonic-build", +] + +[[package]] +name = "async-trait" +version = "0.1.80" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6fa2087f2753a7da8cc1c0dbfcf89579dd57458e36769de5ac750b4671737ca" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.63", +] + +[[package]] +name = "atk" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c3d816ce6f0e2909a96830d6911c2aff044370b1ef92d7f267b43bae5addedd" +dependencies = [ + "atk-sys", + "bitflags 1.3.2", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58aeb089fb698e06db8089971c7ee317ab9644bade33383f63631437b03aafb6" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "axum" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b829e4e32b91e643de6eafe82b1d90675f5874230191a4ffbc1b336dec4d6bf" +dependencies = [ + "async-trait", + "axum-core", + "bitflags 1.3.2", + "bytes", + "futures-util", + "http", + "http-body", + "hyper", + "itoa 1.0.11", + "matchit", + "memchr", + "mime", + "percent-encoding", + "pin-project-lite", + "rustversion", + "serde", + "sync_wrapper", + "tower", + "tower-layer", + "tower-service", +] + +[[package]] +name = "axum-core" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "759fa577a247914fd3f7f76d62972792636412fbfd634cd452f6a385a74d2d2c" +dependencies = [ + "async-trait", + "bytes", + "futures-util", + "http", + "http-body", + "mime", + "rustversion", + "tower-layer", + "tower-service", +] + +[[package]] +name = "backtrace" +version = "0.3.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d" +dependencies = [ + "addr2line", + "cc", + "cfg-if", + "libc", + "miniz_oxide", + "object", + "rustc-demangle", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "brotli" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d640d25bc63c50fb1f0b545ffd80207d2e10a4c965530809b40ba3386825c391" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", + "brotli-decompressor", +] + +[[package]] +name = "brotli-decompressor" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e2e4afe60d7dd600fdd3de8d0f08c2b7ec039712e3b6137ff98b7004e82de4f" +dependencies = [ + "alloc-no-stdlib", + "alloc-stdlib", +] + +[[package]] +name = "bstr" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05efc5cfd9110c8416e471df0e96702d58690178e206e61b7173706673c93706" +dependencies = [ + "memchr", + "serde", +] + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytemuck" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78834c15cb5d5efe3452d58b1e8ba890dd62d21907f867f383358198e56ebca5" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9" + +[[package]] +name = "cairo-rs" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c76ee391b03d35510d9fa917357c7f1855bd9a6659c95a1b392e33f49b3369bc" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "glib", + "libc", + "thiserror", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c55d429bef56ac9172d25fecb85dc8068307d17acd74b377866b7a1ef25d3c8" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "cargo_toml" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "599aa35200ffff8f04c1925aa1acc92fa2e08874379ef42e210a80e527e60838" +dependencies = [ + "serde", + "toml 0.7.8", +] + +[[package]] +name = "cc" +version = "1.0.97" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "099a5357d84c4c61eb35fc8eafa9a79a902c2f76911e5747ced4e032edd8d9b4" + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfb" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38f2da7a0a2c4ccf0065be06397cc26a81f4e528be095826eee9d4adbb8c60f" +dependencies = [ + "byteorder", + "fnv", + "uuid", +] + +[[package]] +name = "cfg-expr" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3431df59f28accaf4cb4eed4a9acc66bea3f3c3753aa6cdc2f024174ef232af7" +dependencies = [ + "smallvec", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "num-traits", + "serde", + "windows-targets 0.52.5", +] + +[[package]] +name = "cocoa" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f425db7937052c684daec3bd6375c8abe2d146dca4b8b143d6db777c39138f3a" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation", + "core-graphics-types", + "libc", + "objc", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "combine" +version = "4.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba5a308b75df32fe02788e748662718f03fde005016435c444eea572398219fd" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "core-graphics" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2581bbab3b8ffc6fcbd550bf46c355135d16e9ff2a6ea032ad6b9bf1d7efe4fb" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab3db02a9c5b5121e1e42fbdb1aeb65f5e02624cc58c43f2884c6ccac0b82f95" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "cssparser" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "754b69d351cdc2d8ee09ae203db831e005560fc6030da058f86ad60c92a9cb0a" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa 0.4.8", + "matches", + "phf 0.8.0", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + +[[package]] +name = "cssparser-macros" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" +dependencies = [ + "quote", + "syn 2.0.63", +] + +[[package]] +name = "ctor" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb49164822f3ee45b17acd4a208cfc1251410cf0cad9a833234c9890774dd9f" +dependencies = [ + "quote", + "syn 2.0.63", +] + +[[package]] +name = "darling" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54e36fcd13ed84ffdfda6f5be89b31287cbb80c439841fe69e04841435464391" +dependencies = [ + "darling_core", + "darling_macro", +] + +[[package]] +name = "darling_core" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c2cf1c23a687a1feeb728783b993c4e1ad83d99f351801977dd809b48d0a70f" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.63", +] + +[[package]] +name = "darling_macro" +version = "0.20.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a668eda54683121533a393014d8692171709ff57a7d61f187b6e782719f8933f" +dependencies = [ + "darling_core", + "quote", + "syn 2.0.63", +] + +[[package]] +name = "deranged" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b42b6fa04a440b495c8b04d0e71b707c585f83cb9cb28cf8cd0d976c315e31b4" +dependencies = [ + "powerfmt", + "serde", +] + +[[package]] +name = "derive_more" +version = "0.99.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb810d30a7c1953f91334de7244731fc3f3c10d7fe163338a35b9f640960321" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if", + "dirs-sys-next", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dtoa" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbb2bf8e87535c23f7a8a321e364ce21462d0ff10cb6407820e8e96dfff6653" + +[[package]] +name = "dtoa-short" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbaceec3c6e4211c79e7b1800fb9680527106beb2f9c51904a3210c03a448c74" +dependencies = [ + "dtoa", +] + +[[package]] +name = "dunce" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56ce8c6da7551ec6c462cbaf3bfbc75131ebbfa1c944aeaa9dab51ca1c5f0c3b" + +[[package]] +name = "either" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47c1c47d2f5964e29c61246e81db715514cd532db6b5116a25ea3c03d6780a2" + +[[package]] +name = "embed-resource" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6985554d0688b687c5cb73898a34fbe3ad6c24c58c238a4d91d5e840670ee9d" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 0.8.12", + "vswhom", + "winreg", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + +[[package]] +name = "encoding_rs" +version = "0.8.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b45de904aa0b010bce2ab45264d0631681847fa7b6f2eaa7dab7619943bc4f59" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[package]] +name = "fdeflate" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "field-offset" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38e2275cc4e4fc009b0669731a1e5ab7ebf11f469eaede2bab9309a5b4d6057f" +dependencies = [ + "memoffset", + "rustc_version", +] + +[[package]] +name = "filetime" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ee447700ac8aa0b2f2bd7bc4462ad686ba06baa6727ac149a2d6277f0d240fd" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.4.1", + "windows-sys 0.52.0", +] + +[[package]] +name = "fixedbitset" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80" + +[[package]] +name = "flate2" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +dependencies = [ + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures-channel" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eac8f7d7865dcb88bd4373ab671c8cf4508703796caa2b1985a9ca867b3fcb78" +dependencies = [ + "futures-core", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-executor" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a576fc72ae164fca6b9db127eaa9a9dda0d61316034f33a0a0d4eda41f02b01d" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-macro" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.63", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-core", + "futures-macro", + "futures-task", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[package]] +name = "fxhash" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c31b6d751ae2c7f11320402d34e41349dd1016f8d5d45e48c4312bc8625af50c" +dependencies = [ + "byteorder", +] + +[[package]] +name = "gdk" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6e05c1f572ab0e1f15be94217f0dc29088c248b14f792a5ff0af0d84bcda9e8" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.15.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad38dd9cc8b099cceecdf41375bb6d481b1b5a7cd5cd603e10a69a9383f8619a" +dependencies = [ + "bitflags 1.3.2", + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140b2f5378256527150350a8346dbdb08fadc13453a7a2d73aecd5fab3c402a7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "gdk-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e7a08c1e8f06f4177fb7e51a777b8c1689f743a7bc11ea91d44d2226073a88" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps 6.2.2", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cca49a59ad8cfdf36ef7330fe7bdfbe1d34323220cc16a0de2679ee773aee2c2" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps 6.2.2", +] + +[[package]] +name = "gdkx11-sys" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4b7f8c7a84b407aa9b143877e267e848ff34106578b64d1e0a24bf550716178" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps 6.2.2", + "x11", +] + +[[package]] +name = "generator" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cc16584ff22b460a382b7feec54b23d2908d858152e5739a120b949293bd74e" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "windows 0.48.0", +] + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "getrandom" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.9.0+wasi-snapshot-preview1", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", +] + +[[package]] +name = "gimli" +version = "0.28.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253" + +[[package]] +name = "gio" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68fdbc90312d462781a395f7a16d96a2b379bb6ef8cd6310a2df272771c4283b" +dependencies = [ + "bitflags 1.3.2", + "futures-channel", + "futures-core", + "futures-io", + "gio-sys", + "glib", + "libc", + "once_cell", + "thiserror", +] + +[[package]] +name = "gio-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32157a475271e2c4a023382e9cab31c4584ee30a97da41d3c4e9fdd605abcf8d" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.2", + "winapi", +] + +[[package]] +name = "glib" +version = "0.15.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edb0306fbad0ab5428b0ca674a23893db909a98582969c9b537be4ced78c505d" +dependencies = [ + "bitflags 1.3.2", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "once_cell", + "smallvec", + "thiserror", +] + +[[package]] +name = "glib-macros" +version = "0.15.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10c6ae9f6fa26f4fb2ac16b528d138d971ead56141de489f8111e259b9df3c4a" +dependencies = [ + "anyhow", + "heck 0.4.1", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "glib-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef4b192f8e65e9cf76cbf4ea71fa8e3be4a0e18ffe3d68b8da6836974cc5bad4" +dependencies = [ + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "globset" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57da3b9b5b85bd66f31093f8c408b90a74431672542466497dcbdfdc02034be1" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata 0.4.6", + "regex-syntax 0.8.3", +] + +[[package]] +name = "gobject-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d57ce44246becd17153bd035ab4d32cfee096a657fc01f2231c9278378d1e0a" +dependencies = [ + "glib-sys", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "gtk" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e3004a2d5d6d8b5057d2b57b3712c9529b62e82c77f25c1fecde1fd5c23bd0" +dependencies = [ + "atk", + "bitflags 1.3.2", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "once_cell", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d5bc2f0587cba247f60246a0ca11fe25fb733eabc3de12d1965fc07efab87c84" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps 6.2.2", +] + +[[package]] +name = "gtk3-macros" +version = "0.15.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "684c0456c086e8e7e9af73ec5b84e35938df394712054550e81558d21c44ab0d" +dependencies = [ + "anyhow", + "proc-macro-crate", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "h2" +version = "0.3.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81fe527a889e1532da5c525686d96d4c2e74cdd345badf8dfef9f6b39dd5f5e8" +dependencies = [ + "bytes", + "fnv", + "futures-core", + "futures-sink", + "futures-util", + "http", + "indexmap 2.2.6", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "hashbrown" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "heck" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d621efb26863f0e9924c6ac577e8275e5e6b77455db64ffa6c65c904e9e132c" +dependencies = [ + "unicode-segmentation", +] + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "html5ever" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bea68cab48b8459f17cf1c944c67ddc572d272d9f2b274140f223ecb1da4a3b7" +dependencies = [ + "log", + "mac", + "markup5ever", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "http" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "601cbb57e577e2f5ef5be8e7b83f0f63994f25aa94d673e54a92d5c516d101f1" +dependencies = [ + "bytes", + "fnv", + "itoa 1.0.11", +] + +[[package]] +name = "http-body" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ceab25649e9960c0311ea418d17bee82c0dcec1bd053b5f9a66e265a693bed2" +dependencies = [ + "bytes", + "http", + "pin-project-lite", +] + +[[package]] +name = "http-range" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21dec9db110f5f872ed9699c3ecf50cf16f423502706ba5c72462e28d3157573" + +[[package]] +name = "httparse" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904" + +[[package]] +name = "httpdate" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b46402a9d5adb4c86a0cf463f42e19994e3ee891101b1841f30a545cb49a9" + +[[package]] +name = "hyper" +version = "0.14.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf96e135eb83a2a8ddf766e426a841d8ddd7449d5f00d34ea02b41d2f19eef80" +dependencies = [ + "bytes", + "futures-channel", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "httparse", + "httpdate", + "itoa 1.0.11", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", + "want", +] + +[[package]] +name = "hyper-timeout" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb958482e8c7be4bc3cf272a766a2b0bf1a6755e7a6ae777f017a31d11b13b1" +dependencies = [ + "hyper", + "pin-project-lite", + "tokio", + "tokio-io-timeout", +] + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "ico" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3804960be0bb5e4edb1e1ad67afd321a9ecfd875c3e65c099468fd2717d7cae" +dependencies = [ + "byteorder", + "png", +] + +[[package]] +name = "ident_case" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "ignore" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b46810df39e66e925525d6e38ce1e7f6e1d208f72dc39757880fcb66e2c58af1" +dependencies = [ + "crossbeam-deque", + "globset", + "log", + "memchr", + "regex-automata 0.4.6", + "same-file", + "walkdir", + "winapi-util", +] + +[[package]] +name = "image" +version = "0.24.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "num-traits", +] + +[[package]] +name = "indexmap" +version = "1.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" +dependencies = [ + "autocfg", + "hashbrown 0.12.3", + "serde", +] + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown 0.14.5", + "serde", +] + +[[package]] +name = "infer" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f551f8c3a39f68f986517db0d1759de85881894fdc7db798bd2a9df9cb04b7fc" +dependencies = [ + "cfb", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "itertools" +version = "0.10.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "javascriptcore-rs" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf053e7843f2812ff03ef5afe34bb9c06ffee120385caad4f6b9967fcd37d41c" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "905fbb87419c5cde6e3269537e4ea7d46431f3008c5d057e915ef3f115e7793c" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + +[[package]] +name = "jni" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "039022cdf4d7b1cf548d31f60ae783138e5fd42013f6271049d7df7afadef96c" +dependencies = [ + "cesu8", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "json-patch" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec9ad60d674508f3ca8f380a928cfe7b096bc729c4e2dbfe3852bc45da3ab30b" +dependencies = [ + "serde", + "serde_json", + "thiserror", +] + +[[package]] +name = "kuchikiki" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e4755b7b995046f510a7520c42b2fed58b77bd94d5a87a8eb43d2fd126da8" +dependencies = [ + "cssparser", + "html5ever", + "indexmap 1.9.3", + "matches", + "selectors", +] + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.154" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae743338b92ff9146ce83992f766a31066a91a8c84a45e0e9f21e7cf6de6d346" + +[[package]] +name = "libredox" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +dependencies = [ + "bitflags 2.5.0", + "libc", +] + +[[package]] +name = "line-wrap" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd1bc4d24ad230d21fb898d1116b1801d7adfc449d42026475862ab48b11e70e" + +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "loom" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff50ecb28bb86013e935fb6683ab1f6d3a20016f123c76fd4c27470076ac30f5" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", + "serde", + "serde_json", + "tracing", + "tracing-subscriber", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "markup5ever" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a2629bb1404f3d34c2e921f21fd34ba00b206124c81f65c50b43b6aaefeb016" +dependencies = [ + "log", + "phf 0.10.1", + "phf_codegen 0.10.0", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "matchers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8263075bb86c5a1b1427b5ae862e8889656f126e9f77c484496e8b47cf5c5558" +dependencies = [ + "regex-automata 0.1.10", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "matchit" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7465ac9959cc2b1404e8e2367b43684a6d13790fe23056cc8c6c5a6b7bcb94" + +[[package]] +name = "memchr" +version = "2.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d" + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "miniz_oxide" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +dependencies = [ + "adler", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "wasi 0.11.0+wasi-snapshot-preview1", + "windows-sys 0.48.0", +] + +[[package]] +name = "multimap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5ce46fe64a9d73be07dcbe690a38ce1b293be448fd8ce1e6c1b8062c9f72c6a" + +[[package]] +name = "ndk" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2032c77e030ddee34a6787a64166008da93f6a352b629261d0fee232b8742dd4" +dependencies = [ + "bitflags 1.3.2", + "jni-sys", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e5a6ae77c8ee183dcbbba6150e2e6b9f3f4196a7666c02a715a95692ec1fa97" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + +[[package]] +name = "nu-ansi-term" +version = "0.46.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +dependencies = [ + "overload", + "winapi", +] + +[[package]] +name = "num-conv" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51d515d32fb182ee37cda2ccdcb92950d6a3c2893aa280e540671c2cd0f3b1d9" + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "num_cpus" +version = "1.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4161fcb6d602d4d2081af7c3a45852d875a03dd337a6bfdd6e06407b61342a43" +dependencies = [ + "hermit-abi", + "libc", +] + +[[package]] +name = "num_enum" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f646caf906c20226733ed5b1374287eb97e3c2a5c227ce668c1f2ce20ae57c9" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcbff9bc912032c62bf65ef1d5aea88983b420f4f839db1e9b0c281a25c9c799" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", + "objc_exception", +] + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "object" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6a622008b6e321afc04970976f62ee297fdbaa6f95318ca343e3eebb9648441" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "overload" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" + +[[package]] +name = "pango" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e4045548659aee5313bde6c582b0d83a627b7904dd20dc2d9ef0895d414e4f" +dependencies = [ + "bitflags 1.3.2", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.15.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2a00081cde4661982ed91d80ef437c20eacaf6aa1a5962c0279ae194662c3aa" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps 6.2.2", +] + +[[package]] +name = "parking_lot" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.1", + "smallvec", + "windows-targets 0.52.5", +] + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "petgraph" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4c5cc86750666a3ed20bdaf5ca2a0344f9c67674cae0515bec2da16fbaa47db" +dependencies = [ + "fixedbitset", + "indexmap 2.2.6", +] + +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_macros 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", +] + +[[package]] +name = "phf" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" +dependencies = [ + "phf_shared 0.10.0", +] + +[[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]] +name = "phf_codegen" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cbffee61585b0411840d3ece935cce9cb6321f01c45477d30066498cd5e1a815" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", +] + +[[package]] +name = "phf_codegen" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fb1c3a8bc4dd4e5cfce29b44ffc14bedd2ee294559a294e2a4d4c9e9a6a13cd" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", +] + +[[package]] +name = "phf_generator" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" +dependencies = [ + "phf_shared 0.8.0", + "rand 0.7.3", +] + +[[package]] +name = "phf_generator" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d5285893bb5eb82e6aaf5d59ee909a06a16737a8970984dd7746ba9283498d6" +dependencies = [ + "phf_shared 0.10.0", + "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" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6fde18ff429ffc8fe78e2bf7f8b7a5a5a6e2a8b58bc5a9ac69198bbda9189c" +dependencies = [ + "phf_generator 0.8.0", + "phf_shared 0.8.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "phf_macros" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3444646e286606587e49f3bcf1679b8cef1dc2c5ecc29ddacaffc305180d464b" +dependencies = [ + "phf_generator 0.11.2", + "phf_shared 0.11.2", + "proc-macro2", + "quote", + "syn 2.0.63", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher", +] + +[[package]] +name = "phf_shared" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096" +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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bf43b791c5b9e34c3d182969b4abb522f9343702850a2e57f460d00d09b4b3" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.63", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "plist" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9d34169e64b3c7a80c8621a48adaf44e0cf62c78a9b25dd9dd35f1881a17cf9" +dependencies = [ + "base64 0.21.7", + "indexmap 2.2.6", + "line-wrap", + "quick-xml", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "powerfmt" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "439ee305def115ba05938db6eb1644ff94165c5ab5e9420d1c1bcedbba909391" + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "precomputed-hash" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c" + +[[package]] +name = "prettyplease" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8646e95016a7a6c4adea95bafa8a16baab64b583356217f2c85db4a39d9a86" +dependencies = [ + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-error" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da25490ff9892aab3fcf7c36f08cfb902dd3e71ca0f9f9517bea02a73a5ce38c" +dependencies = [ + "proc-macro-error-attr", + "proc-macro2", + "quote", + "syn 1.0.109", + "version_check", +] + +[[package]] +name = "proc-macro-error-attr" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1be40180e52ecc98ad80b184934baf3d0d29f979574e439af5a55274b35f869" +dependencies = [ + "proc-macro2", + "quote", + "version_check", +] + +[[package]] +name = "proc-macro-hack" +version = "0.5.20+deprecated" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc375e1527247fe1a97d8b7156678dfe7c1af2fc075c9a4db3690ecd2a148068" + +[[package]] +name = "proc-macro2" +version = "1.0.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ad3d49ab951a01fbaafe34f2ec74122942fe18a3f9814c3268f1bb72042131b" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "prost" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b82eaa1d779e9a4bc1c3217db8ffbeabaae1dca241bf70183242128d48681cd" +dependencies = [ + "bytes", + "prost-derive", +] + +[[package]] +name = "prost-build" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "119533552c9a7ffacc21e099c24a0ac8bb19c2a2a3f363de84cd9b844feab270" +dependencies = [ + "bytes", + "heck 0.4.1", + "itertools", + "lazy_static", + "log", + "multimap", + "petgraph", + "prettyplease", + "prost", + "prost-types", + "regex", + "syn 1.0.109", + "tempfile", + "which", +] + +[[package]] +name = "prost-derive" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d2d8d10f3c6ded6da8b05b5fb3b8a5082514344d56c9f871412d29b4e075b4" +dependencies = [ + "anyhow", + "itertools", + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "prost-types" +version = "0.11.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213622a1460818959ac1181aaeb2dc9c7f63df720db7d788b3e24eacd1983e13" +dependencies = [ + "prost", +] + +[[package]] +name = "quick-xml" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +dependencies = [ + "getrandom 0.1.16", + "libc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc", + "rand_pcg", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +dependencies = [ + "ppv-lite86", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_core" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +dependencies = [ + "getrandom 0.1.16", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "rand_hc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "rand_pcg" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" +dependencies = [ + "rand_core 0.5.1", +] + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e" +dependencies = [ + "bitflags 2.5.0", +] + +[[package]] +name = "redox_users" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd283d9651eeda4b2a83a43c1c91b266c40fd76ecd39a50a8c630ae69dc72891" +dependencies = [ + "getrandom 0.2.15", + "libredox", + "thiserror", +] + +[[package]] +name = "regex" +version = "1.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c117dbdfde9c8308975b6a18d71f3f385c89461f7b3fb054288ecf2a2058ba4c" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata 0.4.6", + "regex-syntax 0.8.3", +] + +[[package]] +name = "regex-automata" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c230d73fb8d8c1b9c0b3135c5142a8acee3a0558fb8db5cf1cb65f8d7862132" +dependencies = [ + "regex-syntax 0.6.29", +] + +[[package]] +name = "regex-automata" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax 0.8.3", +] + +[[package]] +name = "regex-syntax" +version = "0.6.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1" + +[[package]] +name = "regex-syntax" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56" + +[[package]] +name = "rustc-demangle" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f" + +[[package]] +name = "rustc_version" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa0f585226d2e68097d4f95d113b15b83a82e819ab25717ec0590d9584ef366" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.5.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "selectors" +version = "0.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df320f1889ac4ba6bc0cdc9c9af7af4bd64bb927bccdf32d81140dc1f9be12fe" +dependencies = [ + "bitflags 1.3.2", + "cssparser", + "derive_more", + "fxhash", + "log", + "matches", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc", + "smallvec", + "thin-slice", +] + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" +dependencies = [ + "serde", +] + +[[package]] +name = "serde" +version = "1.0.202" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.202" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.63", +] + +[[package]] +name = "serde_json" +version = "1.0.117" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "455182ea6142b14f93f4bc5320a2b31c1f266b66a4a5c858b013302a5d8cbfc3" +dependencies = [ + "indexmap 2.2.6", + "itoa 1.0.11", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c64451ba24fc7a6a2d60fc75dd9c83c90903b19028d4eff35e88fc1e86564e9" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.63", +] + +[[package]] +name = "serde_spanned" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb3622f419d1296904700073ea6cc23ad690adbd66f13ea683df73298736f0c1" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_with" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ad483d2ab0149d5a5ebcd9972a3852711e0153d863bf5a5d0391d28883c4a20" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.2.6", + "serde", + "serde_derive", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65569b702f41443e8bc8bbb1c5779bd0450bbe723b56198980e80ec45780bce2" +dependencies = [ + "darling", + "proc-macro2", + "quote", + "syn 2.0.63", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9823f2d3b6a81d98228151fdeaf848206a7855a7a042bbf9bf870449a66cafb" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74064874e9f6a15f04c1f3cb627902d0e6b410abbf36668afa873c61889f1763" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "servo_arc" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98238b800e0d1576d8b6e3de32827c2d74bee68bb97748dcf5071fb53965432" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + +[[package]] +name = "sha2" +version = "0.10.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "793db75ad2bcafc3ffa7c68b215fee268f537982cd901d132f89c6343f3a3dc8" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "sharded-slab" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40ca3c46823713e0d4209592e8d6e826aa57e928f09752619fc696c499637f6" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "simple-base64" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6385ef05b7bbfddaa8bf6306d059adac087990d659576c73b7da802d9a6ce91f" + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "socket2" +version = "0.5.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "soup2" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2b4d76501d8ba387cf0fefbe055c3e0a59891d09f0f995ae4e4b16f6b60f3c0" +dependencies = [ + "bitflags 1.3.2", + "gio", + "glib", + "libc", + "once_cell", + "soup2-sys", +] + +[[package]] +name = "soup2-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "009ef427103fcb17f802871647a7fa6c60cbb654b4c4e4c0ac60a31c5f6dc9cf" +dependencies = [ + "bitflags 1.3.2", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps 5.0.0", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" + +[[package]] +name = "state" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbe866e1e51e8260c9eed836a042a5e7f6726bb2b411dffeaa712e19c388f23b" +dependencies = [ + "loom", +] + +[[package]] +name = "string_cache" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f91138e76242f575eb1d3b38b4f1362f10d3a43f47d182a5b359af488a02293b" +dependencies = [ + "new_debug_unreachable", + "once_cell", + "parking_lot", + "phf_shared 0.10.0", + "precomputed-hash", + "serde", +] + +[[package]] +name = "string_cache_codegen" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb30289b722be4ff74a408c3cc27edeaad656e06cb1fe8fa9231fa59c728988" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro2", + "quote", +] + +[[package]] +name = "strsim" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf5be731623ca1a1fb7d8be6f261a3be6d3e2337b8a1f97be944d020c8fcb704" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160" + +[[package]] +name = "system-deps" +version = "5.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18db855554db7bd0e73e06cf7ba3df39f97812cb11d3f75e71c39bf45171797e" +dependencies = [ + "cfg-expr 0.9.1", + "heck 0.3.3", + "pkg-config", + "toml 0.5.11", + "version-compare 0.0.11", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr 0.15.8", + "heck 0.5.0", + "pkg-config", + "toml 0.8.12", + "version-compare 0.2.0", +] + +[[package]] +name = "tao" +version = "0.16.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "575c856fc21e551074869dcfaad8f706412bd5b803dfa0fbf6881c4ff4bfafab" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "cc", + "cocoa", + "core-foundation", + "core-graphics", + "crossbeam-channel", + "dispatch", + "gdk", + "gdk-pixbuf", + "gdk-sys", + "gdkwayland-sys", + "gdkx11-sys", + "gio", + "glib", + "glib-sys", + "gtk", + "image", + "instant", + "jni", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc", + "once_cell", + "parking_lot", + "png", + "raw-window-handle", + "scopeguard", + "serde", + "tao-macros", + "unicode-segmentation", + "uuid", + "windows 0.39.0", + "windows-implement", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec114582505d158b669b136e6851f85840c109819d77c42bb7c0709f727d18c2" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tar" +version = "0.4.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b16afcea1f22891c49a00c751c7b63b2233284064f11a200fc624137c51e2ddb" +dependencies = [ + "filetime", + "libc", + "xattr", +] + +[[package]] +name = "target-lexicon" +version = "0.12.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1fc403891a21bcfb7c37834ba66a547a8f402146eba7265b5a6d88059c9ff2f" + +[[package]] +name = "tauri" +version = "1.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13ce04f77bcd40bb57ec7061725c9c415d30b2bf80257637b857ee067f2fa198" +dependencies = [ + "anyhow", + "cocoa", + "dirs-next", + "dunce", + "embed_plist", + "encoding_rs", + "flate2", + "futures-util", + "glib", + "glob", + "gtk", + "heck 0.5.0", + "http", + "ignore", + "objc", + "once_cell", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "semver", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "state", + "tar", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "tempfile", + "thiserror", + "tokio", + "url", + "uuid", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-build" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab30cba12974d0f9b09794f61e72cad6da2142d3ceb81e519321bab86ce53312" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs-next", + "heck 0.5.0", + "json-patch", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3a1d90db526a8cdfd54444ad3f34d8d4d58fa5c536463915942393743bd06f8" +dependencies = [ + "base64 0.21.7", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "tauri-utils", + "thiserror", + "time", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "1.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a582d75414250122e4a597b9dd7d3c910a2c77906648fc2ac9353845ff0feec" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 1.0.109", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-runtime" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd7ffddf36d450791018e63a3ddf54979b9581d9644c584a5fb5611e6b5f20b4" +dependencies = [ + "gtk", + "http", + "http-range", + "rand 0.8.5", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror", + "url", + "uuid", + "webview2-com", + "windows 0.39.0", +] + +[[package]] +name = "tauri-runtime-wry" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2af45aeb15b1cadb4ca91248423f4438a0864b836298cecb436892afbfdff4" +dependencies = [ + "cocoa", + "gtk", + "percent-encoding", + "rand 0.8.5", + "raw-window-handle", + "tauri-runtime", + "tauri-utils", + "uuid", + "webkit2gtk", + "webview2-com", + "windows 0.39.0", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "1.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "450b17a7102e5d46d4bdabae0d1590fd27953e704e691fc081f06c06d2253b35" +dependencies = [ + "brotli", + "ctor", + "dunce", + "glob", + "heck 0.5.0", + "html5ever", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.2", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "serde_with", + "thiserror", + "url", + "walkdir", + "windows-version", +] + +[[package]] +name = "tauri-winres" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5993dc129e544393574288923d1ec447c857f3f644187f4fbf7d9a875fbfc4fb" +dependencies = [ + "embed-resource", + "toml 0.7.8", +] + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "thin-slice" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaa81235c7058867fa8c0e7314f33dcce9c215f535d1913822a2b3f5e289f3c" + +[[package]] +name = "thiserror" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579e9083ca58dd9dcf91a9923bb9054071b9ebbd800b342194c9feb0ee89fc18" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2470041c06ec3ac1ab38d0356a6119054dedaea53e12fbefc0de730a1c08524" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.63", +] + +[[package]] +name = "thread_local" +version = "1.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b9ef9bad013ada3808854ceac7b46812a6465ba368859a37e2100283d2d719c" +dependencies = [ + "cfg-if", + "once_cell", +] + +[[package]] +name = "time" +version = "0.3.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfd88e563464686c916c7e46e623e520ddc6d79fa6641390f2e3fa86e83e885" +dependencies = [ + "deranged", + "itoa 1.0.11", + "num-conv", + "powerfmt", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef927ca75afb808a4d64dd374f00a2adf8d0fcff8e7b184af886c3c87ec4a3f3" + +[[package]] +name = "time-macros" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f252a68540fde3a3877aeea552b832b40ab9a69e318efd078774a01ddee1ccf" +dependencies = [ + "num-conv", + "time-core", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "tokio" +version = "1.37.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1adbebffeca75fcfd058afa480fb6c0b81e165a0323f9c9d39c9697e37c46787" +dependencies = [ + "backtrace", + "bytes", + "libc", + "mio", + "num_cpus", + "parking_lot", + "pin-project-lite", + "signal-hook-registry", + "socket2", + "tokio-macros", + "windows-sys 0.48.0", +] + +[[package]] +name = "tokio-io-timeout" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30b74022ada614a1b4834de765f9bb43877f910cc8ce4be40e89042c9223a8bf" +dependencies = [ + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-macros" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.63", +] + +[[package]] +name = "tokio-stream" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "267ac89e0bec6e691e5813911606935d77c476ff49024f98abcea3e7b15e37af" +dependencies = [ + "futures-core", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.5.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4f7f0dd8d50a853a531c426359045b1998f04219d88799810762cd4ad314234" +dependencies = [ + "serde", +] + +[[package]] +name = "toml" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd79e69d3b627db300ff956027cc6c3798cef26d22526befdfcd12feeb6d2257" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.19.15", +] + +[[package]] +name = "toml" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9dd1545e8208b4a5af1aa9bbd0b4cf7e9ea08fabc5d0a5c67fcaafa17433aa3" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit 0.22.12", +] + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.2.6", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3328d4f68a705b2a4498da1d580585d39a6510f98318a2cec3018a7ec61ddef" +dependencies = [ + "indexmap 2.2.6", + "serde", + "serde_spanned", + "toml_datetime", + "winnow 0.6.8", +] + +[[package]] +name = "tonic" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3082666a3a6433f7f511c7192923fa1fe07c69332d3c6a2e6bb040b569199d5a" +dependencies = [ + "async-trait", + "axum", + "base64 0.21.7", + "bytes", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "hyper", + "hyper-timeout", + "percent-encoding", + "pin-project", + "prost", + "tokio", + "tokio-stream", + "tower", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tonic-build" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6fdaae4c2c638bb70fe42803a26fbd6fc6ac8c72f5c59f67ecc2a2dcabf4b07" +dependencies = [ + "prettyplease", + "proc-macro2", + "prost-build", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "tower" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8fa9be0de6cf49e536ce1851f987bd21a43b771b09473c3549a6c853db37c1c" +dependencies = [ + "futures-core", + "futures-util", + "indexmap 1.9.3", + "pin-project", + "pin-project-lite", + "rand 0.8.5", + "slab", + "tokio", + "tokio-util", + "tower-layer", + "tower-service", + "tracing", +] + +[[package]] +name = "tower-layer" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c20c8dbed6283a09604c3e69b4b7eeb54e298b8a600d4d5ecb5ad39de609f1d0" + +[[package]] +name = "tower-service" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52" + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.63", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", + "valuable", +] + +[[package]] +name = "tracing-log" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee855f1f400bd0e5c02d150ae5de3840039a3f54b025156404e34c23c03f47c3" +dependencies = [ + "log", + "once_cell", + "tracing-core", +] + +[[package]] +name = "tracing-subscriber" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad0f048c97dbd9faa9b7df56362b8ebcaa52adb06b498c050d2f4e32f90a7a8b" +dependencies = [ + "matchers", + "nu-ansi-term", + "once_cell", + "regex", + "sharded-slab", + "smallvec", + "thread_local", + "tracing", + "tracing-core", + "tracing-log", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "uuid" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a183cf7feeba97b4dd1c0d46788634f6221d87fa961b305bed08c851829efcc0" +dependencies = [ + "getrandom 0.2.15", +] + +[[package]] +name = "valuable" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d" + +[[package]] +name = "version-compare" +version = "0.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c18c859eead79d8b95d09e4678566e8d70105c4e7b251f707a03df32442661b" + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b17ae1f6c8a2b28506cd96d412eebf83b4a0ff2cbefeeb952f2f9dfa44ba18" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.63", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.63", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "webkit2gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8f859735e4a452aeb28c6c56a852967a8a76c8eb1cc32dbf931ad28a13d6370" +dependencies = [ + "bitflags 1.3.2", + "cairo-rs", + "gdk", + "gdk-sys", + "gio", + "gio-sys", + "glib", + "glib-sys", + "gobject-sys", + "gtk", + "gtk-sys", + "javascriptcore-rs", + "libc", + "once_cell", + "soup2", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d76ca6ecc47aeba01ec61e480139dda143796abcae6f83bcddf50d6b5b1dcf3" +dependencies = [ + "atk-sys", + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pango-sys", + "pkg-config", + "soup2-sys", + "system-deps 6.2.2", +] + +[[package]] +name = "webview2-com" +version = "0.19.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4a769c9f1a64a8734bde70caafac2b96cada12cd4aefa49196b3a386b8b4178" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows 0.39.0", + "windows-implement", +] + +[[package]] +name = "webview2-com-macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eaebe196c01691db62e9e4ca52c5ef1e4fd837dcae27dae3ada599b5a8fd05ac" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "webview2-com-sys" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aac48ef20ddf657755fdcda8dfed2a7b4fc7e4581acce6fe9b88c3d64f29dee7" +dependencies = [ + "regex", + "serde", + "serde_json", + "thiserror", + "windows 0.39.0", + "windows-bindgen", + "windows-metadata", +] + +[[package]] +name = "which" +version = "4.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" +dependencies = [ + "either", + "home", + "once_cell", + "rustix", +] + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1c4bd0a50ac6020f65184721f758dba47bb9fbc2133df715ec74a237b26794a" +dependencies = [ + "windows-implement", + "windows_aarch64_msvc 0.39.0", + "windows_i686_gnu 0.39.0", + "windows_i686_msvc 0.39.0", + "windows_x86_64_gnu 0.39.0", + "windows_x86_64_msvc 0.39.0", +] + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-bindgen" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68003dbd0e38abc0fb85b939240f4bce37c43a5981d3df37ccbaaa981b47cb41" +dependencies = [ + "windows-metadata", + "windows-tokens", +] + +[[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.5", +] + +[[package]] +name = "windows-implement" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba01f98f509cb5dc05f4e5fc95e535f78260f15fea8fe1a8abdd08f774f1cee7" +dependencies = [ + "syn 1.0.109", + "windows-tokens", +] + +[[package]] +name = "windows-metadata" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ee5e275231f07c6e240d14f34e1b635bf1faa1c76c57cfd59a5cdb9848e4278" + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +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.5", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb" +dependencies = [ + "windows_aarch64_gnullvm 0.52.5", + "windows_aarch64_msvc 0.52.5", + "windows_i686_gnu 0.52.5", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.5", + "windows_x86_64_gnu 0.52.5", + "windows_x86_64_gnullvm 0.52.5", + "windows_x86_64_msvc 0.52.5", +] + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6998aa457c9ba8ff2fb9f13e9d2a930dabcea28f1d0ab94d687d8b3654844515" +dependencies = [ + "windows-targets 0.52.5", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7711666096bd4096ffa835238905bb33fb87267910e154b18b44eaabb340f2" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6" + +[[package]] +name = "windows_i686_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "763fc57100a5f7042e3057e7e8d9bdd7860d330070251a73d003563a3bb49e1b" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9" + +[[package]] +name = "windows_i686_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7bc7cbfe58828921e10a9f446fcaaf649204dcfe6c1ddd712c5eebae6bda1106" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6868c165637d653ae1e8dc4d82c25d4f97dd6605eaa8d784b5c6e0ab2a252b65" + +[[package]] +name = "windows_x86_64_gnu" +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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9" + +[[package]] +name = "windows_x86_64_gnullvm" +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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e4d40883ae9cae962787ca76ba76390ffa29214667a111db9e0a1ad8377e809" + +[[package]] +name = "windows_x86_64_msvc" +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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0" + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c52e9c97a68071b23e836c9380edae937f17b9c4667bd021973efc689f618d" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a277a57398d4bfa075df44f501a17cfdf8542d224f0d36095a2adc7aee4ef0a5" +dependencies = [ + "cfg-if", + "windows-sys 0.48.0", +] + +[[package]] +name = "wry" +version = "0.24.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00711278ed357350d44c749c286786ecac644e044e4da410d466212152383b45" +dependencies = [ + "base64 0.13.1", + "block", + "cocoa", + "core-graphics", + "crossbeam-channel", + "dunce", + "gdk", + "gio", + "glib", + "gtk", + "html5ever", + "http", + "kuchikiki", + "libc", + "log", + "objc", + "objc_id", + "once_cell", + "serde", + "serde_json", + "sha2", + "soup2", + "tao", + "thiserror", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows 0.39.0", + "windows-implement", +] + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "xattr" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8da84f1a25939b27f6820d92aed108f83ff920fdf11a7b19366c27c4cda81d4f" +dependencies = [ + "libc", + "linux-raw-sys", + "rustix", +] diff --git a/client/app/src-tauri/Cargo.toml b/client/app/src-tauri/Cargo.toml new file mode 100644 index 00000000..39d24191 --- /dev/null +++ b/client/app/src-tauri/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "app" +version = "0.1.0" +description = "A Tauri App" +authors = ["you"] +license = "" +repository = "" +default-run = "app" +edition = "2021" +rust-version = "1.60" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[build-dependencies] +tauri-build = { version = "1.5.1", features = [] } +tonic-build = "0.9.2" + +[dependencies] +serde_json = "1.0" +serde = { version = "1.0", features = ["derive"] } +tauri = { version = "1.6.2", features = [] } +tonic = "0.9.2" +tokio = {version = "1.35.1", features = ["full"] } +tokio-util = "0.7.10" +anyhow = "1.0.71" +prost = "0.11.9" +simple-base64 = "0.23.2" +thiserror = "1.0.59" + +[features] +# this feature is used for production builds or when `devPath` points to the filesystem and the built-in dev server is disabled. +# If you use cargo directly instead of tauri's cli you can use this feature flag to switch between tauri's `dev` and `build` modes. +# DO NOT REMOVE!! +custom-protocol = [ "tauri/custom-protocol" ] diff --git a/client/app/src-tauri/build.rs b/client/app/src-tauri/build.rs new file mode 100644 index 00000000..46028de5 --- /dev/null +++ b/client/app/src-tauri/build.rs @@ -0,0 +1,17 @@ +fn main() { + let provisioning_proto = "./proto/provisioning.proto"; + let identity_proto = "./proto/identity.proto"; + let settings_proto = "./proto/settings.proto"; + + tonic_build::configure() + .build_server(true) + .type_attribute(".", "#[derive(serde::Deserialize, serde::Serialize)]") + .compile( + &[provisioning_proto, identity_proto, settings_proto], + &[".proto"], + ) + .unwrap_or_else(|e| panic!("protobuf compile error: {}", e)); + + + tauri_build::build() +} diff --git a/client/app/src-tauri/icons/128x128.png b/client/app/src-tauri/icons/128x128.png new file mode 100644 index 00000000..77e7d233 Binary files /dev/null and b/client/app/src-tauri/icons/128x128.png differ diff --git a/client/app/src-tauri/icons/128x128@2x.png b/client/app/src-tauri/icons/128x128@2x.png new file mode 100644 index 00000000..0f7976f1 Binary files /dev/null and b/client/app/src-tauri/icons/128x128@2x.png differ diff --git a/client/app/src-tauri/icons/32x32.png b/client/app/src-tauri/icons/32x32.png new file mode 100644 index 00000000..98fda06f Binary files /dev/null and b/client/app/src-tauri/icons/32x32.png differ diff --git a/client/app/src-tauri/icons/Square107x107Logo.png b/client/app/src-tauri/icons/Square107x107Logo.png new file mode 100644 index 00000000..f35d84ff Binary files /dev/null and b/client/app/src-tauri/icons/Square107x107Logo.png differ diff --git a/client/app/src-tauri/icons/Square142x142Logo.png b/client/app/src-tauri/icons/Square142x142Logo.png new file mode 100644 index 00000000..1823bb26 Binary files /dev/null and b/client/app/src-tauri/icons/Square142x142Logo.png differ diff --git a/client/app/src-tauri/icons/Square150x150Logo.png b/client/app/src-tauri/icons/Square150x150Logo.png new file mode 100644 index 00000000..dc2b22ce Binary files /dev/null and b/client/app/src-tauri/icons/Square150x150Logo.png differ diff --git a/client/app/src-tauri/icons/Square284x284Logo.png b/client/app/src-tauri/icons/Square284x284Logo.png new file mode 100644 index 00000000..0ed3984c Binary files /dev/null and b/client/app/src-tauri/icons/Square284x284Logo.png differ diff --git a/client/app/src-tauri/icons/Square30x30Logo.png b/client/app/src-tauri/icons/Square30x30Logo.png new file mode 100644 index 00000000..60bf0ead Binary files /dev/null and b/client/app/src-tauri/icons/Square30x30Logo.png differ diff --git a/client/app/src-tauri/icons/Square310x310Logo.png b/client/app/src-tauri/icons/Square310x310Logo.png new file mode 100644 index 00000000..c8ca0ad1 Binary files /dev/null and b/client/app/src-tauri/icons/Square310x310Logo.png differ diff --git a/client/app/src-tauri/icons/Square44x44Logo.png b/client/app/src-tauri/icons/Square44x44Logo.png new file mode 100644 index 00000000..8756459b Binary files /dev/null and b/client/app/src-tauri/icons/Square44x44Logo.png differ diff --git a/client/app/src-tauri/icons/Square71x71Logo.png b/client/app/src-tauri/icons/Square71x71Logo.png new file mode 100644 index 00000000..2c8023cc Binary files /dev/null and b/client/app/src-tauri/icons/Square71x71Logo.png differ diff --git a/client/app/src-tauri/icons/Square89x89Logo.png b/client/app/src-tauri/icons/Square89x89Logo.png new file mode 100644 index 00000000..2c5e6034 Binary files /dev/null and b/client/app/src-tauri/icons/Square89x89Logo.png differ diff --git a/client/app/src-tauri/icons/StoreLogo.png b/client/app/src-tauri/icons/StoreLogo.png new file mode 100644 index 00000000..17d142c0 Binary files /dev/null and b/client/app/src-tauri/icons/StoreLogo.png differ diff --git a/client/app/src-tauri/icons/connect_62x62.png b/client/app/src-tauri/icons/connect_62x62.png new file mode 100644 index 00000000..c1f7985d Binary files /dev/null and b/client/app/src-tauri/icons/connect_62x62.png differ diff --git a/client/app/src-tauri/icons/icon.icns b/client/app/src-tauri/icons/icon.icns new file mode 100644 index 00000000..a2993adc Binary files /dev/null and b/client/app/src-tauri/icons/icon.icns differ diff --git a/client/app/src-tauri/icons/icon.ico b/client/app/src-tauri/icons/icon.ico new file mode 100644 index 00000000..06c23c82 Binary files /dev/null and b/client/app/src-tauri/icons/icon.ico differ diff --git a/client/app/src-tauri/icons/icon.png b/client/app/src-tauri/icons/icon.png new file mode 100644 index 00000000..d1756ce4 Binary files /dev/null and b/client/app/src-tauri/icons/icon.png differ diff --git a/client/app/proto/identity.proto b/client/app/src-tauri/proto/identity.proto similarity index 100% rename from client/app/proto/identity.proto rename to client/app/src-tauri/proto/identity.proto diff --git a/client/app/proto/provisioning.proto b/client/app/src-tauri/proto/provisioning.proto similarity index 100% rename from client/app/proto/provisioning.proto rename to client/app/src-tauri/proto/provisioning.proto diff --git a/client/app/proto/settings.proto b/client/app/src-tauri/proto/settings.proto similarity index 100% rename from client/app/proto/settings.proto rename to client/app/src-tauri/proto/settings.proto diff --git a/client/app/src-tauri/src/main.rs b/client/app/src-tauri/src/main.rs new file mode 100644 index 00000000..16e8c9a6 --- /dev/null +++ b/client/app/src-tauri/src/main.rs @@ -0,0 +1,217 @@ +// Prevents additional console window on Windows in release, DO NOT REMOVE!! +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +mod utils; +use utils::{ + errors::ProvisioningErrorCodes, identity_manager::{GetMachineIdResponse, GetProvisionStatusResponse, IdentityClient}, provision_manager::{ + PingResponse, ProvisionManagerClient, ProvisioningCodeResponse, ProvisioningStatusResponse, + }, settings_manager::{GetSettingsResponse, SettingsClient} +}; + +#[derive(Debug, thiserror::Error)] +enum Error { + #[error(transparent)] + Io(#[from] Box), + #[error("Other error: {0}")] + Other(String), +} + +impl serde::Serialize for Error { + fn serialize(&self, serializer: S) -> Result + where + S: serde::ser::Serializer, + { + serializer.serialize_str(self.to_string().as_ref()) + } +} + +fn check_error(input: String) -> Result { + let error_string = input.to_string().to_lowercase(); + + if error_string.to_lowercase().contains(&ProvisioningErrorCodes::UnknownError.to_string().to_lowercase()) { + Ok("Unknown Error".to_string()) + } else if error_string.to_lowercase().contains(&ProvisioningErrorCodes::UnauthorizedError.to_string().to_lowercase()) { + Ok("Unauthorized Error".to_string()) + } else if error_string.to_lowercase().contains(&ProvisioningErrorCodes::NotFoundError.to_string().to_lowercase()) { + Ok("NotFound Error".to_string()) + } else if error_string.to_lowercase().contains(&ProvisioningErrorCodes::BadRequestError.to_string().to_lowercase()) { + Ok("Bad Request Error".to_string()) + } else if error_string.to_lowercase().contains(&ProvisioningErrorCodes::UnreachableError.to_string().to_lowercase()) { + Ok("Unreachable Error".to_string()) + } else if error_string.to_lowercase().contains(&ProvisioningErrorCodes::InternalServerError.to_string().to_lowercase()) { + Ok("Internal Server Error".to_string()) + } else if error_string.to_lowercase().contains(&ProvisioningErrorCodes::CSRSignReadFileError.to_string().to_lowercase()) { + Ok("CSRSign ReadFile Error".to_string()) + } else if error_string.to_lowercase().contains(&ProvisioningErrorCodes::CertificateWriteError.to_string().to_lowercase()) { + Ok("CertificateWrite Error".to_string()) + } else if error_string.to_lowercase().contains(&ProvisioningErrorCodes::SendEventError.to_string().to_lowercase()) { + Ok("SendEvent Error".to_string()) + } else if error_string.to_lowercase().contains(&ProvisioningErrorCodes::SettingsDatabaseDeleteError.to_string().to_lowercase()) { + Ok("Settings Database Delete Error".to_string()) + } else if error_string.to_lowercase().contains(&ProvisioningErrorCodes::ParseResponseError.to_string().to_lowercase().to_lowercase()) { + Ok("Parse Response Error".to_string()) + } else if error_string.to_lowercase().contains(&ProvisioningErrorCodes::ChannelSendMessageError.to_string().to_lowercase()) { + Ok("Channel Send Message Error".to_string()) + } else if error_string.to_lowercase().contains(&ProvisioningErrorCodes::ChannelReceiveMessageError.to_string().to_lowercase()) { + Ok("Channel Receive Message Error".to_string()) + } else if error_string.to_lowercase().contains(&ProvisioningErrorCodes::MachineMismatchError.to_string().to_lowercase()) { + Ok("Machine Mismatch Error".to_string()) + } else if error_string.to_lowercase().contains(&ProvisioningErrorCodes::ExtractMessagePayloadError.to_string().to_lowercase()) { + Ok("Extract Message Payload Error".to_string()) + } else if error_string.to_lowercase().contains(&ProvisioningErrorCodes::DeprovisioningError.to_string().to_lowercase()) { + Ok("Deprovisioning Error".to_string()) + } else if error_string.to_lowercase().contains(&ProvisioningErrorCodes::SubscribeToNatsError.to_string().to_lowercase()) { + Ok("Subscribe ToNats Error".to_string()) + } else if error_string.to_lowercase().contains(&ProvisioningErrorCodes::PayloadDeserializationError.to_string().to_lowercase()) { + Ok("Payload Deserialization Error".to_string()) + } else if error_string.to_lowercase().contains(&ProvisioningErrorCodes::InvalidMachineIdError.to_string().to_lowercase()) { + Ok("InvalidMachineIdError Error".to_string()) + } + else { + Err(()) + } +} + +#[tauri::command] +async fn get_ping_status() -> Result { + let mut service_client = match ProvisionManagerClient::new().await { + Ok(r) => r, + Err(e) => { + return Err(Error::Io(e.into())); + } + }; + + let response = match service_client.ping().await { + Ok(response) => response.into(), + Err(e) => { + return Err(Error::Io(e.into())); + } + }; + + Ok(response) +} + +#[tauri::command] +async fn get_machine_provision_status() -> Result { + let mut service_client = match IdentityClient::new().await { + Ok(r) => r, + Err(e) => { + println!("get_machine_provision_status error {:?}: ", e); + return Err(Error::Io(e.into())); + } + }; + + let response = match service_client.get_machine_provision_status().await { + Ok(response) => response.into(), + Err(e) => { + return Err(Error::Io(e.into())); + } + }; + + Ok(response) +} + +#[tauri::command] +async fn generate_code() -> anyhow::Result { + let mut provision_manager_client = match ProvisionManagerClient::new().await { + Ok(r) => r, + Err(e) => { + return Err(Error::Io(e.into())); + } + }; + + let response = match provision_manager_client.generate_code().await { + Ok(response) => response, + Err(err) => { + println!("generate_code error :: {:?} ", err); + return Err(Error::Io(err.into())); + } + }; + + Ok(response) +} + +#[tauri::command] +async fn provision_code(code: String) -> Result { + println!("INSIDE provision_code: {:?}", code.to_string()); + let mut provision_manager_client = match ProvisionManagerClient::new().await { + Ok(r) => r, + Err(e) => { + return Err(Error::Io(e.into())); + } + }; + + let response = match provision_manager_client + .provision_by_code(code.to_owned()) + .await + { + Ok(response) => response, + Err(e) => { + println!("provision_code error: {:?}", e); + let error = check_error(e.to_string()); + println!("provision_code final error: {:?}", error); + return Err(Error::Other(error.unwrap())); + } + }; + + Ok(response) +} + +#[tauri::command] +async fn get_machine_id() -> Result { + let mut service_client = match IdentityClient::new().await { + Ok(r) => r, + Err(e) => { + return Err(Error::Io(e.into())); + } + }; + + let response: GetMachineIdResponse = match service_client.getting_machine_id().await { + Ok(response) => response.into(), + Err(e) => { + return Err(Error::Io(e.into())); + } + }; + + Ok(response) +} + +#[tauri::command] +async fn get_machine_info(key: String) -> Result { + let request = SettingsClient::new().await; + + let mut service_client = match request { + Ok(r) => r, + Err(e) => { + return Err(Error::Io(e.into())); + } + }; + + let response: GetSettingsResponse = match service_client.get_settings_data(key.clone()).await { + Ok(response) => response.into(), + Err(e) => { + return Err(Error::Io(e.into())); + } + }; + Ok(response) +} + +#[tauri::command] +fn exit_app() { + std::process::exit(0x0); +} + +fn main() { + tauri::Builder::default() + .invoke_handler(tauri::generate_handler![ + get_ping_status, + get_machine_provision_status, + generate_code, + provision_code, + get_machine_id, + get_machine_info, + exit_app + ]) + .run(tauri::generate_context!()) + .expect("error while running tauri application"); +} diff --git a/client/app/src-tauri/src/utils/errors.rs b/client/app/src-tauri/src/utils/errors.rs new file mode 100644 index 00000000..1ab4ef63 --- /dev/null +++ b/client/app/src-tauri/src/utils/errors.rs @@ -0,0 +1,90 @@ +use std::fmt; + +#[derive(Debug, Default, Clone, Copy)] +pub enum ProvisioningErrorCodes { + #[default] + UnknownError, + UnauthorizedError, + NotFoundError, + BadRequestError, + UnreachableError, + InternalServerError, + CSRSignReadFileError, + CertificateWriteError, + SendEventError, + SettingsDatabaseDeleteError, + ParseResponseError, + ChannelSendMessageError, + ChannelReceiveMessageError, + MachineMismatchError, + ExtractMessagePayloadError, + DeprovisioningError, + SubscribeToNatsError, + PayloadDeserializationError, + InvalidMachineIdError, +} + + +impl fmt::Display for ProvisioningErrorCodes { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + match self { + ProvisioningErrorCodes::UnknownError => { + write!(f, "ProvisioningErrorCodes: UnknownError") + } + ProvisioningErrorCodes::UnauthorizedError => { + write!(f, "ProvisioningErrorCodes: UnauthorizedError") + } + ProvisioningErrorCodes::NotFoundError => { + write!(f, "ProvisioningErrorCodes: NotFoundError") + } + ProvisioningErrorCodes::BadRequestError => { + write!(f, "ProvisioningErrorCodes: BadRequestError") + } + ProvisioningErrorCodes::UnreachableError => { + write!(f, "ProvisioningErrorCodes: UnreachableError") + } + ProvisioningErrorCodes::InternalServerError => { + write!(f, "ProvisioningErrorCodes: InternalServerError") + } + ProvisioningErrorCodes::CSRSignReadFileError => { + write!(f, "ProvisioningErrorCodes: CSRSignReadFileError") + } + ProvisioningErrorCodes::CertificateWriteError => { + write!(f, "ProvisioningErrorCodes: CertificateWriteError") + } + ProvisioningErrorCodes::SendEventError => { + write!(f, "ProvisioningErrorCodes: SendEventError") + } + ProvisioningErrorCodes::SettingsDatabaseDeleteError => { + write!(f, "ProvisioningErrorCodes: SettingsDatabaseDeleteError") + } + ProvisioningErrorCodes::ParseResponseError => { + write!(f, "ProvisioningErrorCodes: ParseResponseError") + } + ProvisioningErrorCodes::ChannelSendMessageError => { + write!(f, "ProvisioningErrorCodes: ChannelSendMessageError") + } + ProvisioningErrorCodes::ChannelReceiveMessageError => { + write!(f, "ProvisioningErrorCodes: ChannelReceiveMessageError") + } + ProvisioningErrorCodes::MachineMismatchError => { + write!(f, "ProvisioningErrorCodes: MachineMismatchError") + } + ProvisioningErrorCodes::ExtractMessagePayloadError => { + write!(f, "ProvisioningErrorCodes: ExtractMessagePayloadError") + } + ProvisioningErrorCodes::DeprovisioningError => { + write!(f, "ProvisioningErrorCodes: DeprovisioningError") + } + ProvisioningErrorCodes::SubscribeToNatsError => { + write!(f, "ProvisioningErrorCodes: SubscribeToNatsError") + } + ProvisioningErrorCodes::PayloadDeserializationError => { + write!(f, "ProvisioningErrorCodes: PayloadDeserializationError") + } + ProvisioningErrorCodes::InvalidMachineIdError => { + write!(f, "ProvisioningErrorCodes: InvalidMachineIdError") + } + } + } +} diff --git a/client/app/src/server/identity_client.rs b/client/app/src-tauri/src/utils/identity_manager.rs similarity index 100% rename from client/app/src/server/identity_client.rs rename to client/app/src-tauri/src/utils/identity_manager.rs diff --git a/client/app/src-tauri/src/utils/mod.rs b/client/app/src-tauri/src/utils/mod.rs new file mode 100644 index 00000000..cd938062 --- /dev/null +++ b/client/app/src-tauri/src/utils/mod.rs @@ -0,0 +1,4 @@ +pub mod provision_manager; +pub mod identity_manager; +pub mod settings_manager; +pub mod errors; \ No newline at end of file diff --git a/client/app/src/server/provision_client.rs b/client/app/src-tauri/src/utils/provision_manager.rs similarity index 96% rename from client/app/src/server/provision_client.rs rename to client/app/src-tauri/src/utils/provision_manager.rs index 9e0c3272..125a135d 100644 --- a/client/app/src/server/provision_client.rs +++ b/client/app/src-tauri/src/utils/provision_manager.rs @@ -58,7 +58,7 @@ impl ProvisionManagerClient { let response = match self.client.provision_by_code(request).await { Ok(response) => { - println!("provisioning_response : {:?}", response); + // println!("provisioning_response : {:?}", response); response.into_inner() } Err(e) => { diff --git a/client/app/src/server/settings_client.rs b/client/app/src-tauri/src/utils/settings_manager.rs similarity index 100% rename from client/app/src/server/settings_client.rs rename to client/app/src-tauri/src/utils/settings_manager.rs diff --git a/client/app/src-tauri/tauri.conf.json b/client/app/src-tauri/tauri.conf.json new file mode 100644 index 00000000..42dba43d --- /dev/null +++ b/client/app/src-tauri/tauri.conf.json @@ -0,0 +1,66 @@ +{ + "build": { + "beforeBuildCommand": "npm run build", + "beforeDevCommand": "npm run dev", + "devPath": "http://localhost:5173", + "distDir": "../build" + }, + "package": { + "productName": "mecha-connect", + "version": "0.1.0" + }, + "tauri": { + "allowlist": { + "all": false + }, + "bundle": { + "active": true, + "category": "DeveloperTool", + "copyright": "", + "deb": { + "depends": [] + }, + "externalBin": [], + "icon": [ + "icons/connect_62x62.png", + "icons/32x32.png", + "icons/128x128.png", + "icons/128x128@2x.png", + "icons/icon.icns", + "icons/icon.ico" + ], + "identifier": "so.mecha.dev", + "longDescription": "", + "macOS": { + "entitlements": null, + "exceptionDomain": "", + "frameworks": [], + "providerShortName": null, + "signingIdentity": null + }, + "resources": [], + "shortDescription": "", + "targets": "all", + "windows": { + "certificateThumbprint": null, + "digestAlgorithm": "sha256", + "timestampUrl": "" + } + }, + "security": { + "csp": null + }, + "updater": { + "active": false + }, + "windows": [ + { + "fullscreen": false, + "height": 600, + "resizable": true, + "title": "Mecha Connect", + "width": 800 + } + ] + } +} diff --git a/client/app/src/app.d.ts b/client/app/src/app.d.ts new file mode 100644 index 00000000..743f07b2 --- /dev/null +++ b/client/app/src/app.d.ts @@ -0,0 +1,13 @@ +// See https://kit.svelte.dev/docs/types#app +// for information about these interfaces +declare global { + namespace App { + // interface Error {} + // interface Locals {} + // interface PageData {} + // interface PageState {} + // interface Platform {} + } +} + +export {}; diff --git a/client/app/src/app.html b/client/app/src/app.html new file mode 100644 index 00000000..4ff44b16 --- /dev/null +++ b/client/app/src/app.html @@ -0,0 +1,18 @@ + + + + + + + + + + + %sveltekit.head% + + + +
%sveltekit.body%
+ + + \ No newline at end of file diff --git a/client/app/src/app.pcss b/client/app/src/app.pcss new file mode 100644 index 00000000..860b9e14 --- /dev/null +++ b/client/app/src/app.pcss @@ -0,0 +1,92 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +* { + box-sizing: border-box; +} + +html, +body { + background: #05070a; + min-height: 100vh; + color: #FAFBFC; +} +::-webkit-scrollbar { + display: none; /* Safari and Chrome */ +} + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 222.2 84% 4.9%; + + --muted: 210 40% 96.1%; + --muted-foreground: 215.4 16.3% 46.9%; + + --popover: 0 0% 100%; + --popover-foreground: 222.2 84% 4.9%; + + --card: 0 0% 100%; + --card-foreground: 222.2 84% 4.9%; + + --border: 214.3 31.8% 91.4%; + --input: 214.3 31.8% 91.4%; + + --primary: 222.2 47.4% 11.2%; + --primary-foreground: 210 40% 98%; + + --secondary: 210 40% 96.1%; + --secondary-foreground: 222.2 47.4% 11.2%; + + --accent: 210 40% 96.1%; + --accent-foreground: 222.2 47.4% 11.2%; + + --destructive: 0 72.2% 50.6%; + --destructive-foreground: 210 40% 98%; + + --ring: 222.2 84% 4.9%; + + --radius: 0.5rem; + } + + .dark { + --background: 222.2 84% 4.9%; + --foreground: 210 40% 98%; + + --muted: 217.2 32.6% 17.5%; + --muted-foreground: 215 20.2% 65.1%; + + --popover: 222.2 84% 4.9%; + --popover-foreground: 210 40% 98%; + + --card: 222.2 84% 4.9%; + --card-foreground: 210 40% 98%; + + --border: 217.2 32.6% 17.5%; + --input: 217.2 32.6% 17.5%; + + --primary: 210 40% 98%; + --primary-foreground: 222.2 47.4% 11.2%; + + --secondary: 217.2 32.6% 17.5%; + --secondary-foreground: 210 40% 98%; + + --accent: 217.2 32.6% 17.5%; + --accent-foreground: 210 40% 98%; + + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 40% 98%; + + --ring: hsl(212.7,26.8%,83.9); + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} \ No newline at end of file diff --git a/client/app/src/assets/css/style.css b/client/app/src/assets/css/style.css deleted file mode 100644 index c43f5fd0..00000000 --- a/client/app/src/assets/css/style.css +++ /dev/null @@ -1,328 +0,0 @@ -.window { - background-color: #070809; - font-family: 'Space Grotesk'; - color: #d47a7a; -} - -.footer-container { - margin: 0px 10px 12px 10px; -} - -.footer-container-button { - min-width: 30px; - min-height: 40px; -} - - -.app-container { - padding: 0px 20px; - color: #FAFBFC; -} - -.start-screen-header { - font-weight: 700; - font-size: 26px; - line-height: 34px; - color: #FAFBFC; - margin: 10px 10px; -} - -/* .start-screen-header-label { - font-weight: 500; - font-size: 16px; - line-height: 22px; - color: #B7BBC8; - margin: 10px 10px; -} */ - -.app-icon { - min-width: 48px; - min-height: 48px; -} - -.info-icon { - min-width: 22px; - min-height: 22px; - margin-right: 10px; -} - -/* .link-machine-header-box */ -.start-screen-header-box { - padding: 10px; -} - -.start-header-p { - font-size: 14px; -} - -.start-screen-steps-container { - margin: 5px 5px; - color: #FAFBFC; -} - -.start-screen-steps-label { - margin: 20px; -} - -.start-screen-steps-box { - font-weight: 500; - font-size: 16px; - line-height: 20px; - background-color: #15171D; - border-radius: 10px; - padding: 15px; - margin-top: 8px; -} - -.start-screen-steps-icon { - min-width: 76px; - min-height: 76px; - margin-bottom: 10px; -} - -.check-internet-text { - font-weight: 500; - font-size: 20px; - line-height: 30px; - color: #FAFBFC; -} - -.link-machine-steps-container { - margin: 10px 0px; - color: #FAFBFC; -} - -.link-machine-header-label { - font-weight: 500; - font-size: 18px; - line-height: 22px; - color: #B7BBC8; - padding: 0px 10px; -} - -.link-machine-border-box { - border-radius: 4px; - font-weight: 500; - font-size: 28px; - line-height: 30px; - padding: 10px 16px 10px 16px; - margin: 5px 0px 0px 0px; - background-color: #15171D; -} - -.bg-gray { - background-color: #202431; -} - -.link-machine-code { - font-weight: 700; - font-size: 28px; - line-height: 35.73px; - letter-spacing: 5px; -} - -.link-machine-steps-box { - /* padding:15px 0px 15px 0px; */ - margin: 8px 2px; - color: #FAFBFC; -} - -.link-machine-steps-text { - font-weight: 500; - font-size: 14px; - line-height: 18px; - color: #E4E7EE; - margin: 0px 3px; -} - -/* .link-machine-progress-box { -} */ - -.square-border-box { - border: 1px solid #E4E7EE; - padding: 4px 6px; - font-weight: 700; - font-size: 11px; - line-height: 14px; - margin-right: 4px; -} - -.circle-border-box { - border-radius: 55px; - font-weight: 700; - font-size: 14px; - line-height: 16px; - margin-right: 4px; - background-color: #3283E8; -} - -.gif-img { - min-width: 200px; - min-height: 200px; - margin: 24px 40px 26px 40px; -} - -.configure-text { - margin: 20px 0px; -} - -.configure-machine-text { - font-weight: 500; - font-size: 18px; - line-height: 28px; - color: #FAFBFC; -} - -.timeout-img { - min-width: 210px; - min-height: 240px; - margin: 24px 40px 26px 40px; -} - -.setup-status-label { - font-weight: 500; - font-size: 18px; - line-height: 28px; -} - -.setup-fail-border-box { - border-radius: 6px; - padding: 20px; - margin: 0px 8px; -} - -.setup-fail-info { - font-weight: 500; - font-size: 16px; - line-height: 22px; - color: red; - margin: 6px 0px; - padding: 4px 10px; - background-color: #202124; - border-radius: 10px; -} - -.device-info-border-box { - /* border: 1px solid #202431; */ - /* border-width: 1px; */ - background-color: #15171D; - border-radius: 4px; - font-weight: 440; - padding: 20px 14px 20px 14px; - margin: 10px 5px 10px 5px; -} - -.about-device-name { - font-size: 20px; - margin: 10px 0px 10px 5px; -} - -.device-id-text { - color: #848DA6; -} - -.about-device-id { - font-size: 18px; - font-weight: 700; - line-height: 22px; -} - -.serial-no-value { - font-size: 14px; - font-weight: 400; - line-height: 18px; -} - -.device-info-sentence { - font-weight: 500; - font-size: 14px; - line-height: 20px; - color: #B7BBC8; - margin: 10px 5px; -} - -.device-info-status-icon { - min-width: 40px; - min-height: 40px; -} - -.device-info-icon { - min-width: 80px; - min-height: 80px; - border-radius: 10px; - /* margin-top: 40px; */ -} - -.device-info-icon-box { - margin-top: 40px; - border-radius: 10px; - background-color: #202431; -} - -.blue { - color: #3283E8; -} - -.gray { - color: #6e6e72; -} - -.custom-circle { - min-width: 35px; - min-height: 35px; - border: 1px solid rgb(59, 61, 201); - border-radius: 50px; - margin: auto; - background: conic-gradient(rgb(44, 47, 236) 40%, #eee 0); -} - -.time-progressbar trough { - background-color: #8da3ba; - border-radius: 50px; - min-width: 40px; - min-height: 40px; - border: 4px solid #8da3ba; -} - -.time-progressbar trough progress { - border-radius: 50px; - min-width: 40px; - min-height: 40px; -} - -/* .window stack box progressbar trough progress{ - background-image: conic-gradient(#2c2fec 100%, #eee 0); -} */ - - -.custom-progress-bar trough { - min-height: 3px; -} - -.custom-progress-bar trough progress { - background-image: conic-gradient(#3283E8 100%, #eee 0); - min-height: 3px; -} - -.carousel { - margin-bottom: -15px; -} - -/* .custom-toast toastoverlay toast { - background-color: #3b3f49; -} */ - -.custom-toast-box { - background-color: rgba(255, 255, 255, 0.2); - border-radius: 10px; - padding: 4px 10px; - margin: 40px 10px 5px 10px; -} - -.custom-toast { - padding: 5px; -} - -.capitalize { - text-transform: capitalize; -} \ No newline at end of file diff --git a/client/app/src/assets/images/gifs/machine_searching.gif b/client/app/src/assets/images/gifs/machine_searching.gif deleted file mode 100644 index 76b0346d..00000000 Binary files a/client/app/src/assets/images/gifs/machine_searching.gif and /dev/null differ diff --git a/client/app/src/assets/images/svgs/active_status.svg b/client/app/src/assets/images/svgs/active_status.svg deleted file mode 100644 index 4e2c100f..00000000 --- a/client/app/src/assets/images/svgs/active_status.svg +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - - - - - - - diff --git a/client/app/src/assets/images/svgs/back_arrow.svg b/client/app/src/assets/images/svgs/back_arrow.svg deleted file mode 100644 index 1a65e66a..00000000 --- a/client/app/src/assets/images/svgs/back_arrow.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/client/app/src/assets/images/svgs/encrypt.svg b/client/app/src/assets/images/svgs/encrypt.svg deleted file mode 100644 index a0ce7dd2..00000000 --- a/client/app/src/assets/images/svgs/encrypt.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/client/app/src/assets/images/svgs/encrypt_1.svg b/client/app/src/assets/images/svgs/encrypt_1.svg deleted file mode 100644 index 111a15fc..00000000 --- a/client/app/src/assets/images/svgs/encrypt_1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/client/app/src/assets/images/svgs/exit_icon.svg b/client/app/src/assets/images/svgs/exit_icon.svg deleted file mode 100644 index c93311de..00000000 --- a/client/app/src/assets/images/svgs/exit_icon.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/client/app/src/assets/images/svgs/gray_status.svg b/client/app/src/assets/images/svgs/gray_status.svg deleted file mode 100644 index 99d6f5f8..00000000 --- a/client/app/src/assets/images/svgs/gray_status.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/client/app/src/assets/images/svgs/info_icon.svg b/client/app/src/assets/images/svgs/info_icon.svg deleted file mode 100644 index 72b15942..00000000 --- a/client/app/src/assets/images/svgs/info_icon.svg +++ /dev/null @@ -1,12 +0,0 @@ - - - - - - - - - - - - diff --git a/client/app/src/assets/images/svgs/next_arrow.svg b/client/app/src/assets/images/svgs/next_arrow.svg deleted file mode 100644 index 4732b04a..00000000 --- a/client/app/src/assets/images/svgs/next_arrow.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/client/app/src/assets/images/svgs/real_time.svg b/client/app/src/assets/images/svgs/real_time.svg deleted file mode 100644 index 0809f73b..00000000 --- a/client/app/src/assets/images/svgs/real_time.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/client/app/src/assets/images/svgs/real_time_1.svg b/client/app/src/assets/images/svgs/real_time_1.svg deleted file mode 100644 index 2cd4e1a7..00000000 --- a/client/app/src/assets/images/svgs/real_time_1.svg +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/client/app/src/assets/images/svgs/refresh_icon.svg b/client/app/src/assets/images/svgs/refresh_icon.svg deleted file mode 100644 index 2c884150..00000000 --- a/client/app/src/assets/images/svgs/refresh_icon.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/client/app/src/assets/images/svgs/settings_icon.svg b/client/app/src/assets/images/svgs/settings_icon.svg deleted file mode 100644 index 59d8e8bd..00000000 --- a/client/app/src/assets/images/svgs/settings_icon.svg +++ /dev/null @@ -1,11 +0,0 @@ - - - - - - - - - - - diff --git a/client/app/src/assets/images/svgs/timeout.svg b/client/app/src/assets/images/svgs/timeout.svg deleted file mode 100644 index 8a81a699..00000000 --- a/client/app/src/assets/images/svgs/timeout.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/client/app/src/assets/images/svgs/timeout_x.svg b/client/app/src/assets/images/svgs/timeout_x.svg deleted file mode 100644 index bfabfca9..00000000 --- a/client/app/src/assets/images/svgs/timeout_x.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/client/app/src/assets/images/svgs/trash_icon.svg b/client/app/src/assets/images/svgs/trash_icon.svg deleted file mode 100644 index 01000d86..00000000 --- a/client/app/src/assets/images/svgs/trash_icon.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/client/app/src/assets/images/svgs/virtual_network.svg b/client/app/src/assets/images/svgs/virtual_network.svg deleted file mode 100644 index 9e6fbd9a..00000000 --- a/client/app/src/assets/images/svgs/virtual_network.svg +++ /dev/null @@ -1,3 +0,0 @@ - - - diff --git a/client/app/src/assets/images/svgs/virtual_network_1.svg b/client/app/src/assets/images/svgs/virtual_network_1.svg deleted file mode 100644 index 1cd37df7..00000000 --- a/client/app/src/assets/images/svgs/virtual_network_1.svg +++ /dev/null @@ -1,4 +0,0 @@ - - - - diff --git a/client/app/src/assets/images/svgs/virtual_network_2.svg b/client/app/src/assets/images/svgs/virtual_network_2.svg deleted file mode 100644 index 26327c8f..00000000 --- a/client/app/src/assets/images/svgs/virtual_network_2.svg +++ /dev/null @@ -1,6 +0,0 @@ - - - - - - diff --git a/client/app/src/errors.rs b/client/app/src/errors.rs deleted file mode 100644 index cf1abf09..00000000 --- a/client/app/src/errors.rs +++ /dev/null @@ -1,81 +0,0 @@ -use std::fmt; - -use tracing::error; - -/// # connect screen error codes -/// -/// Implements standard errors for the connect screens -#[derive(Debug, Default, Clone, Copy)] -pub enum ScreenErrorCodes { - #[default] - UnknownError, - SettingsReadError, - SettingsParseError, - ThemeReadError, - ThemeParseError, - FindLoginManagerUrlError, - LoginManagerStreamConnectError, - StreamWriteUsernameError, - StreamReadEnterPasswordError, - StreamWritePasswordError, - StreamReadCaptchaError, - StreamWriteCaptchaError, - StreamReadAuthResponseError, -} - -impl fmt::Display for ScreenErrorCodes { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self { - ScreenErrorCodes::UnknownError => write!(f, "UnknownError"), - ScreenErrorCodes::SettingsReadError => write!(f, "SettingsReadError"), - ScreenErrorCodes::SettingsParseError => write!(f, "SettingsParseError"), - ScreenErrorCodes::ThemeReadError => write!(f, "ThemeReadError"), - ScreenErrorCodes::ThemeParseError => write!(f, "ThemeParseError"), - ScreenErrorCodes::FindLoginManagerUrlError => write!(f, "FindLoginManagerUrlError"), - ScreenErrorCodes::LoginManagerStreamConnectError => { - write!(f, "LoginManagerStreamConnectError") - } - ScreenErrorCodes::StreamWriteUsernameError => { - write!(f, "StreamWriteUsernameError") - } - ScreenErrorCodes::StreamReadEnterPasswordError => { - write!(f, "StreamReadEnterPasswordError") - } - ScreenErrorCodes::StreamWritePasswordError => { - write!(f, "StreamWritePasswordError") - } - ScreenErrorCodes::StreamReadCaptchaError => { - write!(f, "StreamReadCaptchaError") - } - ScreenErrorCodes::StreamWriteCaptchaError => { - write!(f, "StreamWriteCaptchaError") - } - ScreenErrorCodes::StreamReadAuthResponseError => { - write!(f, "StreamReadAuthResponseError") - } - } - } -} - -/// # ScreenError -/// -/// Implements a standard error type for all connect screen related errors -/// includes the error code (`ScreenErrorCodes`) and a message -#[derive(Debug, Default)] -pub struct ScreenError { - pub code: ScreenErrorCodes, - pub message: String, -} - -impl ScreenError { - pub fn new(code: ScreenErrorCodes, message: String) -> Self { - error!("error: (code: {:?}, message: {})", code, message); - Self { code, message } - } -} - -impl std::fmt::Display for ScreenError { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - write!(f, "(code: {:?}, message: {})", self.code, self.message) - } -} diff --git a/client/app/src/handlers/machine_info/handler.rs b/client/app/src/handlers/machine_info/handler.rs deleted file mode 100644 index c3b1e747..00000000 --- a/client/app/src/handlers/machine_info/handler.rs +++ /dev/null @@ -1,27 +0,0 @@ -use std::time::Duration; - -use crate::{ - pages::machine_info::InputMessage as Message, - server::provision_client::{PingResponse, ProvisionManagerClient}, -}; -use anyhow::{bail, Result}; -use relm4::Sender; -use tokio::{select, time}; - -pub async fn get_status() -> Result { - let mut service_client = match ProvisionManagerClient::new().await { - Ok(r) => r, - Err(e) => { - bail!(e); - } - }; - - let response = match service_client.ping().await { - Ok(response) => response.into(), - Err(e) => { - bail!(e); - } - }; - - Ok(response) -} diff --git a/client/app/src/handlers/machine_info/mod.rs b/client/app/src/handlers/machine_info/mod.rs deleted file mode 100644 index ef7d850d..00000000 --- a/client/app/src/handlers/machine_info/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod handler; \ No newline at end of file diff --git a/client/app/src/handlers/mod.rs b/client/app/src/handlers/mod.rs deleted file mode 100644 index 85b2cb6f..00000000 --- a/client/app/src/handlers/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod machine_info; -pub mod provision; -pub mod start_screen; diff --git a/client/app/src/handlers/provision/handler.rs b/client/app/src/handlers/provision/handler.rs deleted file mode 100644 index f1322ca8..00000000 --- a/client/app/src/handlers/provision/handler.rs +++ /dev/null @@ -1,444 +0,0 @@ -use crate::server::provision_client::ProvisionManagerClient; -use anyhow::{bail, Result}; -use relm4::Sender; -use std::{io::Error, time::Duration}; -use tokio::{select, sync::mpsc, time}; - -use crate::pages::link_machine::InputMessage as Message; -use tracing::{debug, error, info, trace}; -const PACKAGE_NAME: &str = env!("CARGO_PKG_NAME"); - -#[derive(Debug)] -enum HandleMessage { - GenerateCodeRes { response: Result }, - ProvisionCodeRes { response: Result }, - TimeoutCodeRes { response: Result }, -} - -pub struct LinkMachineHandler {} - -impl LinkMachineHandler { - pub fn new() -> Self { - Self {} - } - - pub async fn run(&mut self, sender: Sender) -> Result<(), Error> { - let fn_name = "LinkMachineHandler - run"; - - let (event_tx, mut event_rx) = mpsc::channel(128); - - let (g_code_message_tx, g_code_message_rx) = mpsc::channel(128); - let mut g_code_handler = GenerateCodeHandler::new(event_tx.clone()); - - let g_code_t = tokio::spawn(async move { - g_code_handler.run(g_code_message_rx).await; - }); - - let (p_code_message_tx, p_code_message_rx) = mpsc::channel(128); - let mut p_code_handler = ProvisionCodeHandler::new(event_tx.clone()); - - let p_code_t = tokio::spawn(async move { - p_code_handler.run(p_code_message_rx).await; - }); - - // let (t_code_message_tx, t_code_message_rx) = mpsc::channel(128); - // let mut t_code_handler = TimeoutCodeHandler::new(event_tx); - - // let t_code_t = tokio::spawn(async move { - // t_code_handler.run(t_code_message_rx).await; - // }); - - let _ = sender.send(Message::ProvisioningTasks { - g: g_code_t, - p: p_code_t, - // t: t_code_t - }); - - let mut process_time: f64 = 1.0; - - loop { - select! { - event = event_rx.recv() => { - if event.is_none() { - continue; - } - - match event.unwrap() { - HandleMessage::GenerateCodeRes { response } => { - match response { - Ok(code) => { - let _ = p_code_message_tx.send(PCodeHandlerMessage::CodeChanged { code: code.clone() }).await; - let _ = sender.send(Message::CodeChanged(code.clone())); - - // let _ = t_code_message_tx.send(TCodeHandlerMessage::CodeChanged { code: code.clone() }).await; - - // let mut target_value = 1.0 as f64; - // println!("remaining time : {} ", target_value-0.1); - // let _ = sender.send(Message::UpdateTimer(0.9983)); - - // let mut interval = time::interval(time::Duration::from_secs(1)); - // while process_time > 0.0 { - // interval.tick().await; - // process_time -= 0.01; - // println!("fraction_value {:?} ", process_time.to_owned()); - // let _ = sender.send(Message::UpdateTimer(process_time.to_owned())); - // } - // process_time = 1.0; - - }, - Err(e) => { - let _ = sender.send(Message::GenerateCodeError(e.to_string())); - } - } - } - HandleMessage::TimeoutCodeRes { response } => { - println!("TimeoutCodeRes res event {:?}", response); - match response { - Ok(value) => { - println!("timeout value {:?} ", value.clone()); - let _ = sender.send(Message::UpdateTimer(value)); - }, - Err(e) => { - println!("error in tcode {}", e); - let _ = sender.send(Message::GenerateCodeError("Error".to_owned())); - } - } - } - HandleMessage::ProvisionCodeRes { response } => { - match response { - Ok(success) => { - if success { - let _ = g_code_message_tx.send(GCodeHandlerMessage::ChangeRunningStatus { status: RunningStatus::STOP }).await; - let _ = p_code_message_tx.send(PCodeHandlerMessage::ChangeRunningStatus { status: RunningStatus::STOP }).await; - // let _ = t_code_message_tx.send(TCodeHandlerMessage::ChangeRunningStatus { status: RunningStatus::STOP }).await; - - let _ = sender.send(Message::ProvisionSuccess); - - } - }, - Err(e) => { - debug!(fn_name, package = PACKAGE_NAME, "error in provision code {:?} ", e.to_string()); - let _ = sender.send(Message::ShowError(e.to_string())); - } - } - } - }; - } - } - } - // g_code_t.await.unwrap(); - // p_code_t.await.unwrap(); - } -} - -#[derive(Clone, Copy, Debug, PartialEq)] -pub enum RunningStatus { - INACTIVE, - START, - STOP, -} - -pub enum GCodeHandlerMessage { - ChangeRunningStatus { status: RunningStatus }, -} -struct GenerateCodeHandler { - is_calling: bool, - status: RunningStatus, - event_tx: mpsc::Sender, -} - -impl GenerateCodeHandler { - pub fn new(event_tx: mpsc::Sender) -> Self { - Self { - is_calling: false, - status: RunningStatus::START, - event_tx, - } - } - - pub async fn run(&mut self, mut message_rx: mpsc::Receiver) { - let fn_name = "GenerateCodeHandler-run"; - - let mut g_code_interval = time::interval(Duration::from_secs(60)); - - loop { - select! { - _ = g_code_interval.tick() => { - - if !self.is_calling && self.status == RunningStatus::START { - self.is_calling = true; - let generate_code_response = g_code().await; - - match generate_code_response { - Ok(response) => { - info!(fn_name, package = PACKAGE_NAME, "generated code {:?}", response.code.clone()); - let _ = self.event_tx.send(HandleMessage::GenerateCodeRes {response: Ok(response.code.clone()) }).await; - self.is_calling = false; - } - Err(e) => { - error!( - func = fn_name, - package = PACKAGE_NAME, - "Error in generating code {:?}", - e - ); - let _ = self.event_tx.send(HandleMessage::GenerateCodeRes {response: Err(e) }).await; - - } - } - - } - } - msg = message_rx.recv() => { - if msg.is_none() { - continue; - } - - match msg.unwrap() { - GCodeHandlerMessage::ChangeRunningStatus { status } => { - self.status = status; - if status.clone() != RunningStatus::STOP { println!("continue!") }; - break; - } - }; - } - } - } - } -} - -pub enum TCodeHandlerMessage { - ChangeRunningStatus { status: RunningStatus }, - CodeChanged { code: String }, -} -struct TimeoutCodeHandler { - is_calling: bool, - status: RunningStatus, - code: Option, - event_tx: mpsc::Sender, -} - -impl TimeoutCodeHandler { - pub fn new(event_tx: mpsc::Sender) -> Self { - Self { - is_calling: false, - status: RunningStatus::START, - code: None, - event_tx, - } - } - - pub async fn run(&mut self, mut message_rx: mpsc::Receiver) { - let mut t_code_interval = time::interval(Duration::from_secs(1)); - let mut process_time: f64 = 1.0; - - loop { - select! { - _ = t_code_interval.tick() => { - - if !self.is_calling && self.status == RunningStatus::START && self.code.is_some(){ - - self.is_calling = true; - - process_time -= 0.01; - println!("fraction_value {:?} ", process_time.to_owned()); - let _ = self.event_tx.send(HandleMessage::TimeoutCodeRes { response : Ok(process_time.to_owned())}).await; - self.is_calling = false; - - if process_time <= 0.00 { process_time = 1.0;} - } - } - msg = message_rx.recv() => { - if msg.is_none() { - continue; - } - - match msg.unwrap() { - TCodeHandlerMessage::CodeChanged {code} => { - self.code = Some(code.clone()); - } - TCodeHandlerMessage::ChangeRunningStatus { status } => { - self.status = status; - if status.clone() != RunningStatus::STOP { println!("continue!") }; - break; - } - }; - } - } - } - } -} - -pub enum PCodeHandlerMessage { - ChangeRunningStatus { status: RunningStatus }, - CodeChanged { code: String }, -} - -struct ProvisionCodeHandler { - is_calling: bool, - code: Option, - status: RunningStatus, - event_tx: mpsc::Sender, -} - -impl ProvisionCodeHandler { - pub fn new(event_tx: mpsc::Sender) -> Self { - Self { - is_calling: false, - status: RunningStatus::START, - code: None, - event_tx, - } - } - - pub async fn run(&mut self, mut message_rx: mpsc::Receiver) { - let fn_name = "ProvisionCodeHandler-run"; - - let mut p_code_interval = time::interval(Duration::from_secs(5)); - loop { - select! { - _ = p_code_interval.tick() => { - if !self.is_calling && self.status == RunningStatus::START && self.code.is_some(){ - self.is_calling = true; - let provisioning_res = p_code(self.code.clone().unwrap()).await; - - match provisioning_res { - Ok(response) => { - - if response.success.clone() { - let _ = self.event_tx.send(HandleMessage::ProvisionCodeRes {response: Ok(response.success.clone()) }).await; - self.is_calling = true; - break; - } - else { - self.is_calling = false; - } - }, - Err(e) => { - error!( - func = fn_name, - package = PACKAGE_NAME, - "Error in provisioning code {:?}", - e - ); - let _ = self.event_tx.send(HandleMessage::ProvisionCodeRes {response: Err(e) }).await; - - self.is_calling = false; - } - } - - } - } - msg = message_rx.recv() => { - if msg.is_none() { - continue; - } - - match msg.unwrap() { - PCodeHandlerMessage::ChangeRunningStatus { status } => { - self.status = status; - } - PCodeHandlerMessage::CodeChanged {code} => { - self.code = Some(code); - } - }; - } - - } - } - } -} - -#[derive(Debug)] -pub struct GenerateCodeResp { - pub code: String, - pub message: String, -} - -pub async fn g_code() -> anyhow::Result { - let mut provision_manager_client = match ProvisionManagerClient::new().await { - Ok(r) => r, - Err(e) => { - bail!(e); - } - }; - - let generate_code_response = provision_manager_client.generate_code().await; - let provisioning_code: GenerateCodeResp = match generate_code_response { - Ok(r) => GenerateCodeResp { - code: r.code, - message: String::from(""), - }, - Err(e) => { - // eprintln!("Provision Handler-generate_code error:: {:?}", e); - GenerateCodeResp { - code: String::from(""), - message: e.to_string(), - } - } - }; - - Ok(provisioning_code) -} - -#[derive(Debug)] -pub struct ProvisioningStatusResponse { - pub success: bool, - pub message: String, -} - -pub async fn p_code(code: String) -> anyhow::Result { - let fn_name = "p_code - provision_code"; - - trace!( - func = fn_name, - package = PACKAGE_NAME, - "Provisioning Code : {:?} ", - code.clone() - ); - - let mut provision_manager_client = match ProvisionManagerClient::new().await { - Ok(r) => r, - Err(e) => { - bail!(e); - } - }; - - let provisioning_response: ProvisioningStatusResponse = - match provision_manager_client.provision_by_code(code).await { - Ok(response) => { - info!( - func = fn_name, - package = PACKAGE_NAME, - "PROVISION BY CODE response : {:?}", - response - ); - - let mut message = String::from(""); - if response.success == false { - message = String::from("Something went wrong! Try after some time!"); - } - let resp = ProvisioningStatusResponse { - success: response.success, - message: message, - }; - resp - } - Err(e) => { - let res = ProvisioningStatusResponse { - success: false, - message: e.to_string(), - }; - res - } - }; - - info!( - func = fn_name, - package = PACKAGE_NAME, - "PROVIISION BY CODE response OUT : {:?}", - provisioning_response - ); - - Ok(provisioning_response) -} diff --git a/client/app/src/handlers/provision/mod.rs b/client/app/src/handlers/provision/mod.rs deleted file mode 100644 index ef7d850d..00000000 --- a/client/app/src/handlers/provision/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod handler; \ No newline at end of file diff --git a/client/app/src/handlers/start_screen/handler.rs b/client/app/src/handlers/start_screen/handler.rs deleted file mode 100644 index 5f651056..00000000 --- a/client/app/src/handlers/start_screen/handler.rs +++ /dev/null @@ -1,21 +0,0 @@ -use crate::server::identity_client::{GetProvisionStatusResponse, IdentityClient}; -use anyhow::{bail, Result}; - -pub async fn machine_provision_status() -> Result { - let mut service_client = match IdentityClient::new().await { - Ok(r) => r, - Err(e) => { - bail!(e); - } - }; - - let response: GetProvisionStatusResponse = - match service_client.get_machine_provision_status().await { - Ok(response) => response.into(), - Err(e) => { - bail!(e); - } - }; - - Ok(response) -} diff --git a/client/app/src/handlers/start_screen/mod.rs b/client/app/src/handlers/start_screen/mod.rs deleted file mode 100644 index 062ae9d9..00000000 --- a/client/app/src/handlers/start_screen/mod.rs +++ /dev/null @@ -1 +0,0 @@ -pub mod handler; diff --git a/client/app/src/interfaces.ts b/client/app/src/interfaces.ts new file mode 100644 index 00000000..deeb87ce --- /dev/null +++ b/client/app/src/interfaces.ts @@ -0,0 +1,13 @@ +export enum NEXT_BUTTON_TYPE { + SHOW_CHECK_INTERNET = 'SHOW_CHECK_INTERNET', + REFRESH = 'REFRESH', + SETTINGS = 'SETTINGS', + SHOW_MACHINE_INFO = 'SHOW_MACHINE_INFO', + EXIT = 'EXIT', +}; + +export interface MachineDataType { + id: string, + name?: string, + icon?: string +} \ No newline at end of file diff --git a/client/app/src/lib/components/ui/button/button.svelte b/client/app/src/lib/components/ui/button/button.svelte new file mode 100644 index 00000000..86827f32 --- /dev/null +++ b/client/app/src/lib/components/ui/button/button.svelte @@ -0,0 +1,25 @@ + + + + + diff --git a/client/app/src/lib/components/ui/button/index.ts b/client/app/src/lib/components/ui/button/index.ts new file mode 100644 index 00000000..a9272937 --- /dev/null +++ b/client/app/src/lib/components/ui/button/index.ts @@ -0,0 +1,49 @@ +import { type VariantProps, tv } from "tailwind-variants"; +import type { Button as ButtonPrimitive } from "bits-ui"; +import Root from "./button.svelte"; + +const buttonVariants = tv({ + base: "inline-flex items-center justify-center whitespace-nowrap rounded-md text-sm font-medium ring-offset-background transition-colors focus-visible:outline-none focus-visible:ring-2 focus-visible:ring-ring focus-visible:ring-offset-2 disabled:pointer-events-none disabled:opacity-50", + variants: { + variant: { + default: "bg-primary text-primary-foreground hover:bg-primary/90", + destructive: "bg-destructive text-destructive-foreground hover:bg-destructive/90", + outline: + "border border-input bg-background hover:bg-accent hover:text-accent-foreground", + secondary: "bg-secondary text-secondary-foreground hover:bg-secondary/80", + ghost: "hover:bg-accent hover:text-accent-foreground", + link: "text-primary underline-offset-4 hover:underline", + }, + size: { + default: "h-10 px-4 py-2", + sm: "h-9 rounded-md px-3", + lg: "h-11 rounded-md px-8", + icon: "h-10 w-10", + }, + }, + defaultVariants: { + variant: "default", + size: "default", + }, +}); + +type Variant = VariantProps["variant"]; +type Size = VariantProps["size"]; + +type Props = ButtonPrimitive.Props & { + variant?: Variant; + size?: Size; +}; + +type Events = ButtonPrimitive.Events; + +export { + Root, + type Props, + type Events, + // + Root as Button, + type Props as ButtonProps, + type Events as ButtonEvents, + buttonVariants, +}; diff --git a/client/app/src/lib/components/ui/card/card-content.svelte b/client/app/src/lib/components/ui/card/card-content.svelte new file mode 100644 index 00000000..89d82b20 --- /dev/null +++ b/client/app/src/lib/components/ui/card/card-content.svelte @@ -0,0 +1,13 @@ + + +
+ +
diff --git a/client/app/src/lib/components/ui/card/card-description.svelte b/client/app/src/lib/components/ui/card/card-description.svelte new file mode 100644 index 00000000..9a35919a --- /dev/null +++ b/client/app/src/lib/components/ui/card/card-description.svelte @@ -0,0 +1,13 @@ + + +

+ +

diff --git a/client/app/src/lib/components/ui/card/card-footer.svelte b/client/app/src/lib/components/ui/card/card-footer.svelte new file mode 100644 index 00000000..32f90bbb --- /dev/null +++ b/client/app/src/lib/components/ui/card/card-footer.svelte @@ -0,0 +1,13 @@ + + +
+ +
diff --git a/client/app/src/lib/components/ui/card/card-header.svelte b/client/app/src/lib/components/ui/card/card-header.svelte new file mode 100644 index 00000000..e4745286 --- /dev/null +++ b/client/app/src/lib/components/ui/card/card-header.svelte @@ -0,0 +1,13 @@ + + +
+ +
diff --git a/client/app/src/lib/components/ui/card/card-title.svelte b/client/app/src/lib/components/ui/card/card-title.svelte new file mode 100644 index 00000000..719808ee --- /dev/null +++ b/client/app/src/lib/components/ui/card/card-title.svelte @@ -0,0 +1,21 @@ + + + + + diff --git a/client/app/src/lib/components/ui/card/card.svelte b/client/app/src/lib/components/ui/card/card.svelte new file mode 100644 index 00000000..b4746dfa --- /dev/null +++ b/client/app/src/lib/components/ui/card/card.svelte @@ -0,0 +1,16 @@ + + +
+ +
diff --git a/client/app/src/lib/components/ui/card/index.ts b/client/app/src/lib/components/ui/card/index.ts new file mode 100644 index 00000000..bcc031d0 --- /dev/null +++ b/client/app/src/lib/components/ui/card/index.ts @@ -0,0 +1,24 @@ +import Root from "./card.svelte"; +import Content from "./card-content.svelte"; +import Description from "./card-description.svelte"; +import Footer from "./card-footer.svelte"; +import Header from "./card-header.svelte"; +import Title from "./card-title.svelte"; + +export { + Root, + Content, + Description, + Footer, + Header, + Title, + // + Root as Card, + Content as CardContent, + Description as CardDescription, + Footer as CardFooter, + Header as CardHeader, + Title as CardTitle, +}; + +export type HeadingLevel = "h1" | "h2" | "h3" | "h4" | "h5" | "h6"; diff --git a/client/app/src/lib/components/ui/carousel/carousel-content.svelte b/client/app/src/lib/components/ui/carousel/carousel-content.svelte new file mode 100644 index 00000000..bc85456b --- /dev/null +++ b/client/app/src/lib/components/ui/carousel/carousel-content.svelte @@ -0,0 +1,35 @@ + + +
+
+ +
+
diff --git a/client/app/src/lib/components/ui/carousel/carousel-item.svelte b/client/app/src/lib/components/ui/carousel/carousel-item.svelte new file mode 100644 index 00000000..3d0fdfbb --- /dev/null +++ b/client/app/src/lib/components/ui/carousel/carousel-item.svelte @@ -0,0 +1,25 @@ + + +
+ +
diff --git a/client/app/src/lib/components/ui/carousel/carousel-next.svelte b/client/app/src/lib/components/ui/carousel/carousel-next.svelte new file mode 100644 index 00000000..c6f2e297 --- /dev/null +++ b/client/app/src/lib/components/ui/carousel/carousel-next.svelte @@ -0,0 +1,39 @@ + + + diff --git a/client/app/src/lib/components/ui/carousel/carousel-previous.svelte b/client/app/src/lib/components/ui/carousel/carousel-previous.svelte new file mode 100644 index 00000000..bd3169b7 --- /dev/null +++ b/client/app/src/lib/components/ui/carousel/carousel-previous.svelte @@ -0,0 +1,40 @@ + + + diff --git a/client/app/src/lib/components/ui/carousel/carousel.svelte b/client/app/src/lib/components/ui/carousel/carousel.svelte new file mode 100644 index 00000000..12243036 --- /dev/null +++ b/client/app/src/lib/components/ui/carousel/carousel.svelte @@ -0,0 +1,98 @@ + + +
+ +
diff --git a/client/app/src/lib/components/ui/carousel/context.ts b/client/app/src/lib/components/ui/carousel/context.ts new file mode 100644 index 00000000..c90b4cb8 --- /dev/null +++ b/client/app/src/lib/components/ui/carousel/context.ts @@ -0,0 +1,56 @@ +import type { EmblaCarouselSvelteType } from "embla-carousel-svelte"; +import type emblaCarouselSvelte from "embla-carousel-svelte"; +import { getContext, hasContext, setContext } from "svelte"; +import type { HTMLAttributes } from "svelte/elements"; +import type { Readable, Writable } from "svelte/store"; + +export type CarouselAPI = + NonNullable["on:emblaInit"]> extends ( + evt: CustomEvent + ) => void + ? CarouselAPI + : never; + +type EmblaCarouselConfig = NonNullable[1]>; + +export type CarouselOptions = EmblaCarouselConfig["options"]; +export type CarouselPlugins = EmblaCarouselConfig["plugins"]; + +//// + +export type CarouselProps = { + opts?: CarouselOptions; + plugins?: CarouselPlugins; + api?: CarouselAPI; + orientation?: "horizontal" | "vertical"; +} & HTMLAttributes; + +const EMBLA_CAROUSEL_CONTEXT = Symbol("EMBLA_CAROUSEL_CONTEXT"); + +type EmblaContext = { + api: Writable; + orientation: Writable<"horizontal" | "vertical">; + scrollNext: () => void; + scrollPrev: () => void; + canScrollNext: Readable; + canScrollPrev: Readable; + handleKeyDown: (e: KeyboardEvent) => void; + options: Writable; + plugins: Writable; + onInit: (e: CustomEvent) => void; + scrollTo: (index: number, jump?: boolean) => void; + scrollSnaps: Readable; + selectedIndex: Readable; +}; + +export function setEmblaContext(config: EmblaContext): EmblaContext { + setContext(EMBLA_CAROUSEL_CONTEXT, config); + return config; +} + +export function getEmblaContext(name = "This component") { + if (!hasContext(EMBLA_CAROUSEL_CONTEXT)) { + throw new Error(`${name} must be used within a component`); + } + return getContext>(EMBLA_CAROUSEL_CONTEXT); +} diff --git a/client/app/src/lib/components/ui/carousel/index.ts b/client/app/src/lib/components/ui/carousel/index.ts new file mode 100644 index 00000000..78102bf7 --- /dev/null +++ b/client/app/src/lib/components/ui/carousel/index.ts @@ -0,0 +1,5 @@ +export { default as Root } from "./carousel.svelte"; +export { default as Content } from "./carousel-content.svelte"; +export { default as Item } from "./carousel-item.svelte"; +export { default as Previous } from "./carousel-previous.svelte"; +export { default as Next } from "./carousel-next.svelte"; diff --git a/client/app/src/lib/components/ui/dialog/dialog-content.svelte b/client/app/src/lib/components/ui/dialog/dialog-content.svelte new file mode 100644 index 00000000..808269d0 --- /dev/null +++ b/client/app/src/lib/components/ui/dialog/dialog-content.svelte @@ -0,0 +1,36 @@ + + + + + + + + + diff --git a/client/app/src/lib/components/ui/dialog/dialog-description.svelte b/client/app/src/lib/components/ui/dialog/dialog-description.svelte new file mode 100644 index 00000000..e1d796a8 --- /dev/null +++ b/client/app/src/lib/components/ui/dialog/dialog-description.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/client/app/src/lib/components/ui/dialog/dialog-footer.svelte b/client/app/src/lib/components/ui/dialog/dialog-footer.svelte new file mode 100644 index 00000000..a235d1f8 --- /dev/null +++ b/client/app/src/lib/components/ui/dialog/dialog-footer.svelte @@ -0,0 +1,16 @@ + + +
+ +
diff --git a/client/app/src/lib/components/ui/dialog/dialog-header.svelte b/client/app/src/lib/components/ui/dialog/dialog-header.svelte new file mode 100644 index 00000000..6b4448c7 --- /dev/null +++ b/client/app/src/lib/components/ui/dialog/dialog-header.svelte @@ -0,0 +1,13 @@ + + +
+ +
diff --git a/client/app/src/lib/components/ui/dialog/dialog-overlay.svelte b/client/app/src/lib/components/ui/dialog/dialog-overlay.svelte new file mode 100644 index 00000000..5d416545 --- /dev/null +++ b/client/app/src/lib/components/ui/dialog/dialog-overlay.svelte @@ -0,0 +1,21 @@ + + + diff --git a/client/app/src/lib/components/ui/dialog/dialog-portal.svelte b/client/app/src/lib/components/ui/dialog/dialog-portal.svelte new file mode 100644 index 00000000..eb5d0a57 --- /dev/null +++ b/client/app/src/lib/components/ui/dialog/dialog-portal.svelte @@ -0,0 +1,8 @@ + + + + + diff --git a/client/app/src/lib/components/ui/dialog/dialog-title.svelte b/client/app/src/lib/components/ui/dialog/dialog-title.svelte new file mode 100644 index 00000000..06574f3e --- /dev/null +++ b/client/app/src/lib/components/ui/dialog/dialog-title.svelte @@ -0,0 +1,16 @@ + + + + + diff --git a/client/app/src/lib/components/ui/dialog/index.ts b/client/app/src/lib/components/ui/dialog/index.ts new file mode 100644 index 00000000..b17ba5e6 --- /dev/null +++ b/client/app/src/lib/components/ui/dialog/index.ts @@ -0,0 +1,37 @@ +import { Dialog as DialogPrimitive } from "bits-ui"; + +import Title from "./dialog-title.svelte"; +import Portal from "./dialog-portal.svelte"; +import Footer from "./dialog-footer.svelte"; +import Header from "./dialog-header.svelte"; +import Overlay from "./dialog-overlay.svelte"; +import Content from "./dialog-content.svelte"; +import Description from "./dialog-description.svelte"; + +const Root = DialogPrimitive.Root; +const Trigger = DialogPrimitive.Trigger; +const Close = DialogPrimitive.Close; + +export { + Root, + Title, + Portal, + Footer, + Header, + Trigger, + Overlay, + Content, + Description, + Close, + // + Root as Dialog, + Title as DialogTitle, + Portal as DialogPortal, + Footer as DialogFooter, + Header as DialogHeader, + Trigger as DialogTrigger, + Overlay as DialogOverlay, + Content as DialogContent, + Description as DialogDescription, + Close as DialogClose, +}; diff --git a/client/app/src/lib/components/ui/progress/index.ts b/client/app/src/lib/components/ui/progress/index.ts new file mode 100644 index 00000000..25eee615 --- /dev/null +++ b/client/app/src/lib/components/ui/progress/index.ts @@ -0,0 +1,7 @@ +import Root from "./progress.svelte"; + +export { + Root, + // + Root as Progress, +}; diff --git a/client/app/src/lib/components/ui/progress/progress.svelte b/client/app/src/lib/components/ui/progress/progress.svelte new file mode 100644 index 00000000..1c245369 --- /dev/null +++ b/client/app/src/lib/components/ui/progress/progress.svelte @@ -0,0 +1,23 @@ + + +
+ +
+
+
diff --git a/client/app/src/assets/images/gifs/failure.gif b/client/app/src/lib/images/gifs/Failure.gif similarity index 100% rename from client/app/src/assets/images/gifs/failure.gif rename to client/app/src/lib/images/gifs/Failure.gif diff --git a/client/app/src/assets/images/gifs/no_wifi.gif b/client/app/src/lib/images/gifs/NoInternetFound.gif similarity index 100% rename from client/app/src/assets/images/gifs/no_wifi.gif rename to client/app/src/lib/images/gifs/NoInternetFound.gif diff --git a/client/app/src/lib/images/gifs/SearchingMachine.gif b/client/app/src/lib/images/gifs/SearchingMachine.gif new file mode 100644 index 00000000..a393271b Binary files /dev/null and b/client/app/src/lib/images/gifs/SearchingMachine.gif differ diff --git a/client/app/src/assets/images/gifs/searching_wifi.gif b/client/app/src/lib/images/gifs/SearchingWifi.gif similarity index 100% rename from client/app/src/assets/images/gifs/searching_wifi.gif rename to client/app/src/lib/images/gifs/SearchingWifi.gif diff --git a/client/app/src/assets/images/gifs/success.gif b/client/app/src/lib/images/gifs/Success.gif similarity index 100% rename from client/app/src/assets/images/gifs/success.gif rename to client/app/src/lib/images/gifs/Success.gif diff --git a/client/app/src/lib/images/hourglass.png b/client/app/src/lib/images/hourglass.png new file mode 100644 index 00000000..37083ea6 Binary files /dev/null and b/client/app/src/lib/images/hourglass.png differ diff --git a/client/app/src/assets/images/svgs/mecha_icon.svg b/client/app/src/lib/images/svgs/MecahIcon.svg similarity index 79% rename from client/app/src/assets/images/svgs/mecha_icon.svg rename to client/app/src/lib/images/svgs/MecahIcon.svg index 035643b2..025a3a5c 100644 --- a/client/app/src/assets/images/svgs/mecha_icon.svg +++ b/client/app/src/lib/images/svgs/MecahIcon.svg @@ -1,11 +1,4 @@ - - - - - - - diff --git a/client/app/src/assets/images/svgs/mecha_compute.svg b/client/app/src/lib/images/svgs/MechaCompute.svg similarity index 100% rename from client/app/src/assets/images/svgs/mecha_compute.svg rename to client/app/src/lib/images/svgs/MechaCompute.svg diff --git a/client/app/src/lib/index.ts b/client/app/src/lib/index.ts new file mode 100644 index 00000000..856f2b6c --- /dev/null +++ b/client/app/src/lib/index.ts @@ -0,0 +1 @@ +// place files you want to import through the `$lib` alias in this folder. diff --git a/client/app/src/lib/services.ts b/client/app/src/lib/services.ts new file mode 100644 index 00000000..f8eb4d42 --- /dev/null +++ b/client/app/src/lib/services.ts @@ -0,0 +1,66 @@ +import { invoke } from "@tauri-apps/api"; + +const check_ping_status = async() => { + try { + let response = await invoke('get_ping_status'); + return response; + } catch (error) { + throw error; + } +}; + +const check_machine_provision_status = async () => { + try { + const data: any = await invoke('get_machine_provision_status'); + return data; + } catch (error) { + throw error; + } +}; + +const get_machine_id = async () => { + try { + const data: any = await invoke('get_machine_id'); + return data; + } catch (error) { + throw error; + } +}; + +const get_machine_info = async() => { + try { + let machine_id_data : any = await invoke('get_machine_id'); + let machine_name_data : any = await invoke('get_machine_info', {key: "identity.machine.name"}); + let machine_icon_data : any = await invoke('get_machine_info', {key: "identity.machine.icon_url"}); + return { id: machine_id_data.value, name : machine_name_data.value, icon: machine_icon_data.value}; + } catch (error) { + throw error; + } +}; + +const generate_code = async() => { + try { + let data : any = await invoke('generate_code'); + return data; + } catch (error) { + throw error; + } +}; + +const provision_by_code = async(code: string) => { + try { + let data : any = await invoke('provision_code', {code: code}); + return data; + } catch (error) { + throw error; + } +}; + +export { + check_ping_status, + check_machine_provision_status, + get_machine_id, + get_machine_info, + generate_code, + provision_by_code +} \ No newline at end of file diff --git a/client/app/src/lib/stores.ts b/client/app/src/lib/stores.ts new file mode 100644 index 00000000..d75ae3d7 --- /dev/null +++ b/client/app/src/lib/stores.ts @@ -0,0 +1,6 @@ +import { writable } from 'svelte/store'; +import type { MachineDataType } from '../interfaces'; + +export let machineInfo = writable({} as MachineDataType); + +export const count = writable(0); \ No newline at end of file diff --git a/client/app/src/lib/utils.ts b/client/app/src/lib/utils.ts new file mode 100644 index 00000000..88712453 --- /dev/null +++ b/client/app/src/lib/utils.ts @@ -0,0 +1,62 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; +import { cubicOut } from "svelte/easing"; +import type { TransitionConfig } from "svelte/transition"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} + +type FlyAndScaleParams = { + y?: number; + x?: number; + start?: number; + duration?: number; +}; + +export const flyAndScale = ( + node: Element, + params: FlyAndScaleParams = { y: -8, x: 0, start: 0.95, duration: 150 } +): TransitionConfig => { + const style = getComputedStyle(node); + const transform = style.transform === "none" ? "" : style.transform; + + const scaleConversion = ( + valueA: number, + scaleA: [number, number], + scaleB: [number, number] + ) => { + const [minA, maxA] = scaleA; + const [minB, maxB] = scaleB; + + const percentage = (valueA - minA) / (maxA - minA); + const valueB = percentage * (maxB - minB) + minB; + + return valueB; + }; + + const styleToString = ( + style: Record + ): string => { + return Object.keys(style).reduce((str, key) => { + if (style[key] === undefined) return str; + return str + `${key}:${style[key]};`; + }, ""); + }; + + return { + duration: params.duration ?? 200, + delay: 0, + css: (t) => { + const y = scaleConversion(t, [0, 1], [params.y ?? 5, 0]); + const x = scaleConversion(t, [0, 1], [params.x ?? 0, 0]); + const scale = scaleConversion(t, [0, 1], [params.start ?? 0.95, 1]); + + return styleToString({ + transform: `${transform} translate3d(${x}px, ${y}px, 0) scale(${scale})`, + opacity: t + }); + }, + easing: cubicOut + }; +}; \ No newline at end of file diff --git a/client/app/src/main.rs b/client/app/src/main.rs deleted file mode 100644 index 8216e8f9..00000000 --- a/client/app/src/main.rs +++ /dev/null @@ -1,831 +0,0 @@ -pub mod errors; -mod handlers; -mod pages; -mod server; -mod services; -mod settings; - -use async_trait::async_trait; -use gtk::prelude::{BoxExt, GtkWindowExt}; -use handlers::machine_info; -use init_tracing_opentelemetry::tracing_subscriber_ext::{ - build_logger_text, build_loglevel_filter_layer, build_otel_layer, -}; -use pages::{ - check_internet::{CheckInternet, CheckInternetOutput, Settings as CheckInternetSettings}, - configure_machine::{ConfigureMachine, ConfigureOutput, Settings as ConfigureMachineSettings}, - link_machine::{LinkMachine, LinkMachineOutput, Settings as LinkMachineSettings}, - machine_info::{DevicePageOutput, MachineInfo, Settings as DeviceInfoSettings}, - no_internet::{NoInternet, PageOutput, Settings as NoInternetSettings}, - setup_failed::{Settings as SetupFailedSettings, SetupFailOutput, SetupFailed}, - setup_success::{Settings as SetupSuccessSettings, SetupSuccess, SetupSuccessOutput}, - start_screen::{Settings as StartScreenSettings, StartScreen, StartScreenOutput}, - timeout_screen::{Settings as TimeoutScreenSettings, TimeoutOutput, TimeoutScreen}, -}; -use relm4::{ - component::{AsyncComponent, AsyncComponentController, AsyncComponentParts, AsyncController}, gtk::{glib::clone, prelude::{ApplicationExt, WidgetExt}}, AsyncComponentSender, RelmContainerExt, RelmSetChildExt, SimpleComponent -}; -use relm4::{gtk, ComponentController}; -use relm4::{Component, Controller, RelmApp}; -use sentry_tracing::EventFilter; -use settings::{Modules, ScreenSettings, WidgetConfigs}; -use std::{env, fmt}; -use tracing::{info, level_filters::LevelFilter}; -use tracing_subscriber::{fmt::format, layer::SubscriberExt, EnvFilter}; -mod utils; -mod widgets; -#[derive(Debug)] - -struct ErrorMessage { - error: String, -} - -struct MechaConnectApp { - current_screen: Pages, - screen_stack: gtk::Stack, - link_machine: AsyncController, - start_screen: AsyncController, - check_internet: AsyncController, - no_internet: Controller, - configure_machine: AsyncController, - timeout_screen: Controller, - setup_success: Controller, - setup_failed: Controller, - machine_info: AsyncController, - machine_id: String, -} - -struct errorInfo { - error_message: String, - from_screen: String, -} - -#[derive(Debug)] -enum Pages { - StartScreen, - CheckInternet, - NoInternet, - LinkMachine, - ConfigureMachine, - TimeoutScreen, - SetupSuccess(String), - SetupFailed(String, String), - MachineInfo(String), -} - -impl fmt::Display for Pages { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self { - Pages::StartScreen => write!(f, "start_screen"), - Pages::CheckInternet => write!(f, "check_internet"), - Pages::NoInternet => write!(f, "no_internet"), - Pages::LinkMachine => write!(f, "link_machine"), - Pages::ConfigureMachine => write!(f, "configure_machine"), - Pages::TimeoutScreen => write!(f, "timeout_screen"), - Pages::SetupSuccess(machine_id) => write!(f, "setup_success"), - Pages::SetupFailed(error, from_screen) => write!(f, "setup_failed"), - Pages::MachineInfo(machine_id) => write!(f, "machine_info"), - } - } -} - -#[derive(Debug)] -enum Message { - ChangeScreen(Pages), - Exit, // NextPressed -} -#[derive(Debug)] -enum AppInput {} - -struct AppWidgets { - screen_stack: gtk::Stack, -} - -fn init_window(settings: ScreenSettings) -> gtk::Window { - let window_settings = settings.window; - let window = gtk::Window::builder() - .title("Mecha Connect") - // .default_width(window_settings.size.0) - // .default_height(window_settings.size.1) - .css_classes(["window"]) - .build(); - window.set_resizable(true); - // window.set_default_size(window_settings.size.0, window_settings.size.1); - println!("CHECK WINDOW SIZE {:?} ", window.default_size()); - window -} - -#[async_trait(?Send)] -impl AsyncComponent for MechaConnectApp { - type Input = Message; - type Output = (); - type Init = (); - type Root = gtk::Window; - type Widgets = AppWidgets; - type CommandOutput = Message; - - fn init_root() -> Self::Root { - let settings = match settings::read_settings_yml() { - Ok(settings) => { - println!("main::init_root--- {:?} ", settings); - settings - } - Err(_) => ScreenSettings::default(), - }; - - tracing::info!( - func = "initalize_settings", - package = env!("CARGO_PKG_NAME"), - "settings initialized for Lock Screen", - ); - - let window = init_window(settings); - window - } - - /// Initialize the UI and model. - async fn init( - _: Self::Init, - window: Self::Root, - sender: AsyncComponentSender, - ) -> AsyncComponentParts { - let settings = match settings::read_settings_yml() { - Ok(settings) => { - println!("main::init--- {:?} ", settings); - settings - } - Err(_) => ScreenSettings::default(), - }; - - let start_screen = create_start_screen( - settings.modules.clone(), - settings.widget_configs.clone(), - sender.input_sender().clone(), - ); - - let check_internet = create_check_internet_screen( - settings.modules.clone(), - settings.widget_configs.clone(), - sender.input_sender().clone(), - ); - - let no_internet: Controller = create_no_internet_screen( - settings.modules.clone(), - settings.widget_configs.clone(), - sender.input_sender().clone(), - ); - - let link_machine = create_link_machine_screen( - settings.modules.clone(), - settings.widget_configs.clone(), - sender.input_sender().clone(), - ); - - let configure_machine = create_configure_machine_screen( - settings.modules.clone(), - settings.widget_configs.clone(), - sender.input_sender().clone(), - ); - - let timeout_screen = create_timeout_screen( - settings.modules.clone(), - settings.widget_configs.clone(), - sender.input_sender().clone(), - ); - - let setup_success = create_setup_success_screen( - settings.modules.clone(), - settings.widget_configs.clone(), - sender.input_sender().clone(), - ); - - let setup_failed = create_error_screen( - settings.modules.clone(), - settings.widget_configs.clone(), - sender.input_sender().clone(), - ); - - let machine_info = create_machine_info_screen( - settings.modules.clone(), - settings.widget_configs.clone(), - sender.input_sender().clone(), - ); - - let screen_stack = gtk::Stack::builder().build(); - - screen_stack.add_named( - start_screen.widget(), - Option::from(Pages::StartScreen.to_string().as_str()), - ); - - screen_stack.add_named( - check_internet.widget(), - Option::from(Pages::CheckInternet.to_string().as_str()), - ); - - screen_stack.add_named( - no_internet.widget(), - Option::from(Pages::NoInternet.to_string().as_str()), - ); - - screen_stack.add_named( - link_machine.widget(), - Option::from(Pages::LinkMachine.to_string().as_str()), - ); - - screen_stack.add_named( - configure_machine.widget(), - Option::from(Pages::ConfigureMachine.to_string().as_str()), - ); - - screen_stack.add_named( - timeout_screen.widget(), - Option::from(Pages::TimeoutScreen.to_string().as_str()), - ); - - screen_stack.add_named( - setup_success.widget(), - Option::from(Pages::SetupSuccess(String::from("")).to_string().as_str()), - ); - - screen_stack.add_named( - setup_failed.widget(), - Option::from( - Pages::SetupFailed(String::from(""), String::from("")) - .to_string() - .as_str(), - ), - ); - - screen_stack.add_named( - machine_info.widget(), - Option::from(Pages::MachineInfo(String::from("")).to_string().as_str()), - ); - - //Setting current active screen in stack - let current_screen = Pages::StartScreen; // OG - screen_stack.set_visible_child_name(¤t_screen.to_string()); - screen_stack.set_transition_type(gtk::StackTransitionType::Crossfade); - screen_stack.set_transition_duration(300); - - // window.set_child(Some(&screen_stack)); - window.container_add(&screen_stack); - - let model = MechaConnectApp { - current_screen, - screen_stack: screen_stack.clone(), - start_screen, - check_internet, - no_internet, - link_machine, - configure_machine, - timeout_screen, - setup_success, - setup_failed, - machine_info, - machine_id: String::from("-"), - }; - - let widgets = AppWidgets { screen_stack }; - - AsyncComponentParts { model, widgets } - } - - async fn update( - &mut self, - message: Self::Input, - sender: AsyncComponentSender, - _root: &Self::Root, - ) { - let settings = match settings::read_settings_yml() { - Ok(settings) => { - println!("main::update--- {:?} ", settings); - settings - } - Err(_) => ScreenSettings::default(), - }; - - match message { - Message::ChangeScreen(page) => { - __self.current_screen = page; - - match &self.current_screen { - Pages::StartScreen => { - // self.start_screen.detach_runtime(); - - let start_screen = create_start_screen( - settings.modules.clone(), - settings.widget_configs.clone(), - sender.input_sender().clone(), - ); - - self.screen_stack.remove( - &self - .screen_stack - .child_by_name(Pages::StartScreen.to_string().as_str()) - .unwrap(), - ); - - self.screen_stack.add_named( - start_screen.widget(), - Option::from(Pages::StartScreen.to_string().as_str()), - ); - - self.start_screen = start_screen; - } - Pages::CheckInternet => { - self.check_internet.detach_runtime(); - - let check_internet = create_check_internet_screen( - settings.modules.clone(), - settings.widget_configs.clone(), - sender.input_sender().clone(), - ); - - self.screen_stack.remove( - &self - .screen_stack - .child_by_name(Pages::CheckInternet.to_string().as_str()) - .unwrap(), - ); - - self.screen_stack.add_named( - check_internet.widget(), - Option::from(Pages::CheckInternet.to_string().as_str()), - ); - - self.check_internet = check_internet; - - let _ = self.check_internet.sender().send( - pages::check_internet::InputMessage::ActiveScreen( - self.current_screen.to_string(), - ), - ); - } - Pages::NoInternet => { - self.no_internet.detach_runtime(); - - let no_internet = create_no_internet_screen( - settings.modules.clone(), - settings.widget_configs.clone(), - sender.input_sender().clone(), - ); - - self.screen_stack.remove( - &self - .screen_stack - .child_by_name(Pages::NoInternet.to_string().as_str()) - .unwrap(), - ); - - self.screen_stack.add_named( - no_internet.widget(), - Option::from(Pages::NoInternet.to_string().as_str()), - ); - - self.no_internet = no_internet; - } - Pages::LinkMachine => { - self.link_machine.detach_runtime(); - let link_machine = create_link_machine_screen( - settings.modules.clone(), - settings.widget_configs.clone(), - sender.input_sender().clone(), - ); - - self.screen_stack.remove( - &self - .screen_stack - .child_by_name(Pages::LinkMachine.to_string().as_str()) - .unwrap(), - ); - - self.screen_stack.add_named( - link_machine.widget(), - Option::from(Pages::LinkMachine.to_string().as_str()), - ); - - self.link_machine = link_machine; - - let _ = self.link_machine.sender().send( - pages::link_machine::InputMessage::ActiveScreen( - self.current_screen.to_string(), - ), - ); - } - Pages::ConfigureMachine => { - let configure_machine = create_configure_machine_screen( - settings.modules.clone(), - settings.widget_configs.clone(), - sender.input_sender().clone(), - ); - - self.screen_stack.remove( - &self - .screen_stack - .child_by_name(Pages::ConfigureMachine.to_string().as_str()) - .unwrap(), - ); - - self.screen_stack.add_named( - configure_machine.widget(), - Option::from(Pages::ConfigureMachine.to_string().as_str()), - ); - - self.configure_machine = configure_machine; - - let _ = __self.configure_machine.sender().send( - pages::configure_machine::InputMessage::ActiveScreen( - self.current_screen.to_string(), - ), - ); - } - Pages::TimeoutScreen => { - let timeout_screen = create_timeout_screen( - settings.modules.clone(), - settings.widget_configs.clone(), - sender.input_sender().clone(), - ); - self.screen_stack.remove( - &self - .screen_stack - .child_by_name(Pages::TimeoutScreen.to_string().as_str()) - .unwrap(), - ); - self.screen_stack.add_named( - timeout_screen.widget(), - Option::from(Pages::TimeoutScreen.to_string().as_str()), - ); - - self.timeout_screen = timeout_screen; - } - Pages::SetupSuccess(machine_id) => { - println!("RENDER::SetupSuccess machine_id {:?}", machine_id.clone()); - - self.setup_success.detach_runtime(); - - self.machine_id = machine_id.clone(); - - let setup_success = create_setup_success_screen( - settings.modules.clone(), - settings.widget_configs.clone(), - sender.input_sender().clone(), - ); - - self.screen_stack.remove( - &self - .screen_stack - .child_by_name( - Pages::SetupSuccess(String::from("")).to_string().as_str(), - ) - .unwrap(), - ); - - self.screen_stack.add_named( - setup_success.widget(), - Option::from( - Pages::SetupSuccess(String::from("")).to_string().as_str(), - ), - ); - - self.setup_success = setup_success; - let _ = __self.setup_success.sender().send( - pages::setup_success::InputMessage::ActiveScreen( - self.current_screen.to_string(), - ), - ); - } - Pages::SetupFailed(error, from_screen) => { - self.setup_failed.detach_runtime(); - - let setup_failed = create_error_screen( - settings.modules.clone(), - settings.widget_configs.clone(), - sender.input_sender().clone(), - ); - - self.screen_stack.remove( - &self - .screen_stack - .child_by_name( - Pages::SetupFailed(String::from(""), String::from("")) - .to_string() - .as_str(), - ) - .unwrap(), - ); - - self.screen_stack.add_named( - setup_failed.widget(), - Option::from( - Pages::SetupFailed(String::from(""), String::from("")) - .to_string() - .as_str(), - ), - ); - - self.setup_failed = setup_failed; - - let _ = self.setup_failed.sender().send( - pages::setup_failed::InputMessage::ShowError( - error.to_string(), - from_screen.to_string(), - ), - ); - } - Pages::MachineInfo(machine_id_value) => { - println!( - "RENDER:: MachineInfo :: machine_id_value {:?}", - machine_id_value - ); - let machine_info_screen = create_machine_info_screen( - settings.modules.clone(), - settings.widget_configs.clone(), - sender.input_sender().clone(), - ); - self.screen_stack.remove( - &self - .screen_stack - .child_by_name( - Pages::MachineInfo(String::from("")).to_string().as_str(), - ) - .unwrap(), - ); - self.screen_stack.add_named( - machine_info_screen.widget(), - Option::from( - Pages::MachineInfo(machine_id_value.to_owned()) - .to_string() - .as_str(), - ), - ); - - self.machine_info = machine_info_screen; - - let mut machine_id = self.machine_id.clone(); - if machine_id == "-" || machine_id == "-" { - machine_id = machine_id_value.to_owned(); - } - - let _ = __self - .machine_info - .sender() - .send(pages::machine_info::InputMessage::ActiveScreen(machine_id)); - } - } - } - Message::Exit => relm4::main_application().quit(), - } - } - - fn update_view(&self, widgets: &mut Self::Widgets, _sender: AsyncComponentSender) { - widgets - .screen_stack - .set_visible_child_name(self.current_screen.to_string().as_str()); - } -} - -fn create_start_screen( - modules: Modules, - widget_configs: WidgetConfigs, - sender: relm4::Sender, -) -> AsyncController { - let start_screen: AsyncController = StartScreen::builder() - .launch(StartScreenSettings { - modules: modules.clone(), - widget_configs: widget_configs.clone(), - }) - .forward( - &sender, - clone!(@strong modules => move|msg| match msg { - StartScreenOutput::BackPressed => Message::ChangeScreen(Pages::StartScreen), - StartScreenOutput::ShowMachineInfo(machine_id) => Message::ChangeScreen(Pages::MachineInfo(machine_id)), - StartScreenOutput::ShowCheckInternet => Message::ChangeScreen(Pages::CheckInternet), // OG - - // StartScreenOutput::ShowMachineInfo(machine_id) => Message::ChangeScreen(Pages::ConfigureMachine), // TEMP - TO TEST - }), - ); - - start_screen -} - -fn create_check_internet_screen( - modules: Modules, - widget_configs: WidgetConfigs, - sender: relm4::Sender, -) -> AsyncController { - let check_internet = CheckInternet::builder() - .launch(CheckInternetSettings { - modules: modules.clone(), - widget_configs: widget_configs.clone(), - }) - .forward(&sender, move |msg| match msg { - CheckInternetOutput::BackPressed => Message::ChangeScreen(Pages::StartScreen), - CheckInternetOutput::LinkMachine => Message::ChangeScreen(Pages::LinkMachine), - CheckInternetOutput::ConnectionNotFound => Message::ChangeScreen(Pages::NoInternet), - CheckInternetOutput::ShowError(error) => { - Message::ChangeScreen(Pages::SetupFailed(error, "check_internet".to_string())) - } - }); - check_internet -} - -fn create_no_internet_screen( - modules: Modules, - widget_configs: WidgetConfigs, - sender: relm4::Sender, -) -> Controller { - let no_internet = NoInternet::builder() - .launch(NoInternetSettings { - modules: modules.clone(), - widget_configs: widget_configs.clone(), - }) - .forward( - &sender, - clone!(@strong modules => move|msg| match msg { - PageOutput::BackPressed => Message::ChangeScreen(Pages::CheckInternet), - // TODO : navigate - PageOutput::SettingsPressed => Message::ChangeScreen(Pages::CheckInternet) - }), - ); - no_internet -} - -fn create_link_machine_screen( - modules: Modules, - widget_configs: WidgetConfigs, - sender: relm4::Sender, -) -> AsyncController { - let link_machine = LinkMachine::builder().launch(LinkMachineSettings{ - modules: modules.clone(), - widget_configs: widget_configs.clone() - }) - .forward( - &sender, - clone!(@strong modules => move|msg| match msg { - LinkMachineOutput::BackPressed => Message::ChangeScreen(Pages::CheckInternet), - LinkMachineOutput::NextPressed => Message::ChangeScreen(Pages::ConfigureMachine), - LinkMachineOutput::ShowError(error) => Message::ChangeScreen(Pages::SetupFailed(error, "link_machine".to_owned())), - }), - ); - link_machine -} - -fn create_configure_machine_screen( - modules: Modules, - widget_configs: WidgetConfigs, - sender: relm4::Sender, -) -> AsyncController { - let configure_machine = ConfigureMachine::builder() - .launch(ConfigureMachineSettings { - modules: modules.clone(), - widget_configs: widget_configs.clone(), - }) - .forward( - &sender, - clone!(@strong modules => move|msg| match msg { - ConfigureOutput::Timeout => Message::ChangeScreen(Pages::TimeoutScreen), - ConfigureOutput::SetupSuccess(machine_id) => Message::ChangeScreen(Pages::SetupSuccess(machine_id)), - ConfigureOutput::ShowError(error) => { - Message::ChangeScreen(Pages::SetupFailed(error, "configure_machine".to_string())) - }, - - }), - ); - configure_machine -} - -fn create_timeout_screen( - modules: Modules, - widget_configs: WidgetConfigs, - sender: relm4::Sender, -) -> Controller { - let timeout_screen = TimeoutScreen::builder() - .launch(TimeoutScreenSettings { - modules: modules.clone(), - widget_configs: widget_configs.clone(), - }) - .forward( - &sender, - clone!(@strong modules => move|msg| match msg { - TimeoutOutput::refreshPressed => Message::ChangeScreen(Pages::ConfigureMachine), - TimeoutOutput::BackPressed => Message::ChangeScreen(Pages::ConfigureMachine) - }), - ); - timeout_screen -} - -fn create_setup_success_screen( - modules: Modules, - widget_configs: WidgetConfigs, - sender: relm4::Sender, -) -> Controller { - let setup_success = SetupSuccess::builder() - .launch(SetupSuccessSettings { - modules: modules.clone(), - widget_configs: widget_configs.clone(), - }) - .forward( - &sender, - clone!(@strong modules => move|msg| match msg { - SetupSuccessOutput::BackPressed => Message::ChangeScreen(Pages::ConfigureMachine), // remove - SetupSuccessOutput::NextPressed => - Message::ChangeScreen(Pages::MachineInfo(String::from(""))) - }), - ); - setup_success -} - -fn create_error_screen( - modules: Modules, - widget_configs: WidgetConfigs, - sender: relm4::Sender, -) -> Controller { - let setup_failed: Controller = SetupFailed::builder() - .launch(SetupFailedSettings { - modules: modules.clone(), - widget_configs: widget_configs.clone(), - }) - .forward( - &sender, - clone!(@strong modules => move|msg| match msg { - SetupFailOutput::refresh(screen) => { - info!("REFRESH SCREEN: {:?}", screen.to_owned()); - - match screen { - screen if screen == String::from("check_internet") => Message::ChangeScreen(Pages::CheckInternet), - screen if screen == String::from("configure_machine") => Message::ChangeScreen(Pages::ConfigureMachine), - screen if screen == String::from("link_machine") => Message::ChangeScreen(Pages::LinkMachine), - _ => { - println!("Found something else"); - Message::ChangeScreen(Pages::StartScreen)}, - } - } - - }), - ); - - setup_failed -} - -fn create_machine_info_screen( - modules: Modules, - widget_configs: WidgetConfigs, - sender: relm4::Sender, -) -> AsyncController { - let machine_info = MachineInfo::builder() - .launch(DeviceInfoSettings { - modules: modules.clone(), - widget_configs: widget_configs.clone(), - }) - .forward( - &sender, - clone!(@strong modules => move|msg| match msg { - DevicePageOutput::Exit=>Message::Exit, - }), - ); - machine_info -} - -#[tokio::main] -async fn main() { - let app = RelmApp::new("mecha.connect.app"); - - let settings = match settings::read_settings_yml() { - Ok(settings) => { - println!("main::main--- {:?} ", settings); - settings - } - Err(_) => ScreenSettings::default(), - }; - - let css = settings.css.clone(); - let _ = app.set_global_css_from_file(css.default); - - env::set_var("RUST_LOG", "connect=trace,debug,info,error,warn"); - - let subscriber = tracing_subscriber::registry() - .with(sentry_tracing::layer().event_filter(|_| EventFilter::Ignore)) - .with(build_loglevel_filter_layer()) - .with(build_logger_text()) - // .with( - // EnvFilter::try_new("connect") - // .unwrap_or_else(|_| EnvFilter::new::(LevelFilter::current().to_string())), - // ) - .with(build_otel_layer().unwrap()); - - match tracing::subscriber::set_global_default(subscriber) { - Ok(_) => (), - Err(e) => { - eprintln!("Error setting global default subscriber: {}", e) - } - }; - - tracing::info!( - func = "set_tracing", - package = env!("CARGO_PKG_NAME"), - "tracing set up - info", - ); - - app.run_async::(()); -} diff --git a/client/app/src/pages/check_internet.rs b/client/app/src/pages/check_internet.rs deleted file mode 100644 index 9c97fa34..00000000 --- a/client/app/src/pages/check_internet.rs +++ /dev/null @@ -1,210 +0,0 @@ -use crate::{ - handlers::machine_info::handler::get_status, - settings::{Modules, WidgetConfigs}, - utils, -}; -use async_trait::async_trait; -use gtk::prelude::*; -use relm4::{ - component::{AsyncComponent, AsyncComponentParts}, - gtk::{ - self, - glib::{self, clone}, - prelude::{ButtonExt, WidgetExt}, - Button, - }, - AsyncComponentSender, -}; -use std::time::Duration; -use tracing::{error, info, trace}; -use utils::{get_gif_from_path, get_image_from_path}; - -pub struct Settings { - pub modules: Modules, - pub widget_configs: WidgetConfigs, -} -pub struct CheckInternet { - settings: Settings, - task: Option>, -} -const PACKAGE_NAME: &str = env!("CARGO_PKG_NAME"); - -#[derive(Debug)] -enum AppInput {} - -#[derive(Debug)] -pub enum InputMessage { - ActiveScreen(String), - NextScreen, - ConnectionNotFound, - ShowError(String), - BackScreen, -} - -#[derive(Debug)] -pub enum CheckInternetOutput { - BackPressed, - LinkMachine, - ConnectionNotFound, - ShowError(String), -} - -pub struct AppWidgets {} - -#[async_trait(?Send)] -impl AsyncComponent for CheckInternet { - type Init = Settings; - type Input = InputMessage; - type Output = CheckInternetOutput; - type Root = gtk::Box; - type Widgets = AppWidgets; - type CommandOutput = (); - - fn init_root() -> Self::Root { - gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .build() - } - - /// Initialize the UI and model. - async fn init( - init: Self::Init, - root: Self::Root, - sender: AsyncComponentSender, - ) -> AsyncComponentParts { - let modules = init.modules.clone(); - let widget_configs = init.widget_configs.clone(); - - let model = CheckInternet { - settings: init, - task: None, - }; - - let main_content_box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .css_classes(["app-container", "check-internet-text"]) - .build(); - - let footer_content_box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .vexpand(true) - .valign(gtk::Align::End) - .css_classes(["footer-container"]) - .build(); - - // get gif - let gif_path = modules.pages_settings.check_internet.search_wifi.clone(); - let paintable = get_gif_from_path(gif_path); - - let image_from = gtk::Image::builder() - .paintable(&paintable) - .css_classes(["gif-img"]) - .build(); - - let label1: gtk::Label = gtk::Label::builder() - .label("Checking for internet connectivity ...") - .build(); - - main_content_box.append(&image_from); - main_content_box.append(&label1); - - let footer_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .hexpand(true) - .build(); - - let back_icon_img: gtk::Image = get_image_from_path(widget_configs.footer.back_icon, &[]); - let back_button_box = gtk::Box::builder().hexpand(true).build(); - let back_button = Button::builder().build(); - back_button.set_child(Some(&back_icon_img)); - back_button.add_css_class("footer-container-button"); - - back_button.connect_clicked(clone!(@strong sender => move |_| { - let _ = sender.input_sender().send(InputMessage::BackScreen); - })); - - back_button_box.append(&back_button); - footer_box.append(&back_button_box); - - footer_content_box.append(&footer_box); - main_content_box.append(&footer_content_box); - - root.append(&main_content_box); - - let widgets = AppWidgets {}; - - AsyncComponentParts { model, widgets } - } - - async fn update( - &mut self, - message: Self::Input, - sender: AsyncComponentSender, - _root: &Self::Root, - ) { - match message { - InputMessage::ActiveScreen(text) => { - info!("active screen: {:?}", text); - let sender: relm4::Sender = sender.input_sender().clone(); - let relm_task: relm4::prelude::adw::glib::JoinHandle<()> = - relm4::spawn_local(async move { - let _ = tokio::time::sleep(Duration::from_secs(2)).await; - let _ = check_internet_init_services(sender).await; - }); - - self.task = Some(relm_task); - } - InputMessage::BackScreen => { - self.task.as_ref().unwrap().abort(); - let _ = sender.output(CheckInternetOutput::BackPressed); - } - InputMessage::NextScreen => { - let _ = sender.output(CheckInternetOutput::LinkMachine); - } - InputMessage::ConnectionNotFound => { - let _ = sender.output(CheckInternetOutput::ConnectionNotFound); - } - InputMessage::ShowError(text) => { - let _ = sender.output(CheckInternetOutput::ShowError(text)); - } - } - } -} - -async fn check_internet_init_services(sender: relm4::Sender) { - let fn_name = "check_internet_init_services"; - info!( - func = fn_name, - package = PACKAGE_NAME, - "Check Internet Screen - ping" - ); - - match get_status().await { - Ok(response) => { - if response.code == "success" { - trace!( - fn_name, - package = PACKAGE_NAME, - "ping success ==> moving to Link Machine Screen" - ); - let _ = sender.send(InputMessage::NextScreen); - } else { - trace!( - func = fn_name, - package = PACKAGE_NAME, - "ping false ==> moving to No Internet Connection Screen", - ); - let _ = sender.send(InputMessage::ConnectionNotFound); - } - } - Err(e) => { - error!( - func = fn_name, - package = PACKAGE_NAME, - "Error in checking ping {:?}", - e - ); - let _ = sender.send(InputMessage::ShowError(e.to_string())); - } - } -} diff --git a/client/app/src/pages/configure_machine.rs b/client/app/src/pages/configure_machine.rs deleted file mode 100644 index 17ee9d72..00000000 --- a/client/app/src/pages/configure_machine.rs +++ /dev/null @@ -1,173 +0,0 @@ -use crate::{ - services::{self, MachineInformation}, - settings::{Modules, WidgetConfigs}, - utils, -}; -use anyhow::{bail, Result}; -use async_trait::async_trait; -use gtk::prelude::*; -use relm4::{ - component::{AsyncComponent, AsyncComponentParts}, - gtk::{ - self, - prelude::{ButtonExt, WidgetExt}, - }, - AsyncComponentSender, -}; -use std::time::Duration; -use tracing::{debug, info}; -use utils::get_gif_from_path; -const PACKAGE_NAME: &str = env!("CARGO_PKG_NAME"); - -pub struct Settings { - pub modules: Modules, - pub widget_configs: WidgetConfigs, -} - -pub struct ConfigureMachine { - settings: Settings, -} - -#[derive(Debug)] -pub enum ConfigureOutput { - SetupSuccess(String), - ShowError(String), - Timeout, -} - -#[derive(Debug)] -pub enum InputMessage { - ActiveScreen(String), -} - -pub struct AppWidgets {} - -#[async_trait(?Send)] -impl AsyncComponent for ConfigureMachine { - type Init = Settings; - type Input = InputMessage; - type Output = ConfigureOutput; - type Root = gtk::Box; - type Widgets = AppWidgets; - type CommandOutput = (); - - fn init_root() -> Self::Root { - gtk::Box::builder().build() - } - - /// Initialize the UI and model. - async fn init( - init: Self::Init, - root: Self::Root, - sender: AsyncComponentSender, - ) -> AsyncComponentParts { - let modules = init.modules.clone(); - let widget_configs = init.widget_configs.clone(); - - let model = ConfigureMachine { settings: init }; - - let main_content_box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .css_classes(["app-container", "configure-machine-text"]) - .build(); - - // get gif - let gif_path = modules - .pages_settings - .configure_machine - .machine_searching - .clone(); - let paintable = get_gif_from_path(gif_path); - - let image_from = gtk::Image::builder() - .paintable(&paintable) - .css_classes(["gif-img"]) - .build(); - - let label1 = gtk::Label::builder() - .label("Fetching your machine information") - .halign(gtk::Align::Center) - .build(); - - main_content_box.append(&image_from); - main_content_box.append(&label1); - - let footer_content_box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .vexpand(true) - .valign(gtk::Align::End) - .css_classes(["footer-container"]) - .build(); - - // footer_box - let footer_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .hexpand(true) - .build(); - - footer_content_box.append(&footer_box); - main_content_box.append(&footer_content_box); - - root.append(&main_content_box); - - let widgets = AppWidgets {}; - - AsyncComponentParts { model, widgets } - } - - async fn update( - &mut self, - message: Self::Input, - sender: AsyncComponentSender, - _root: &Self::Root, - ) { - match message { - InputMessage::ActiveScreen(text) => { - info!("active screen: {:?}", text); - let sender: AsyncComponentSender = sender.clone(); - let _ = get_machine_info(sender).await; - } - } - } - - fn update_view(&self, widgets: &mut Self::Widgets, sender: AsyncComponentSender) {} -} - -async fn machine_info_sevice_call() -> Result { - let result = match services::get_machine_info().await { - Ok(res) => res, - Err(err) => { - bail!(err); - } - }; - Ok(result) -} - -async fn get_machine_info(sender: AsyncComponentSender) { - let fn_name = "configure_machine_screen -> get_machine_info"; - let result = tokio::time::timeout(Duration::from_secs(15), machine_info_sevice_call()).await; - - match result { - Ok(res) => match res { - Ok(res) => { - println!( - "configure machine for machine_id {:?}", - res.machine_id.clone() - ); - let _ = sender.output(ConfigureOutput::SetupSuccess(res.machine_id)); - } - Err(e) => { - debug!(func = fn_name, PACKAGE_NAME, "API Error {:?}", e); - let _ = tokio::time::sleep(Duration::from_millis(3000)).await; - let _ = sender.output(ConfigureOutput::ShowError(e.to_string())); - } - }, - Err(e) => { - debug!( - func = fn_name, - PACKAGE_NAME, "API Error After Timeout {:?}", e - ); - let _ = sender.output(ConfigureOutput::Timeout); - } - } -} diff --git a/client/app/src/pages/link_machine.rs b/client/app/src/pages/link_machine.rs deleted file mode 100644 index 7d1ef1c8..00000000 --- a/client/app/src/pages/link_machine.rs +++ /dev/null @@ -1,442 +0,0 @@ -use crate::{ - handlers::provision::handler::LinkMachineHandler, - settings::{Modules, WidgetConfigs}, - utils, -}; -use async_trait::async_trait; -use gtk::prelude::*; -use relm4::{ - component::{AsyncComponent, AsyncComponentParts}, - gtk::{ - self, - gdk::Display, - glib::{self, clone}, - pango, - prelude::{ButtonExt, WidgetExt}, - CssProvider, STYLE_PROVIDER_PRIORITY_APPLICATION, - }, - AsyncComponentSender, -}; -use std::time::Duration; -use tracing::info; -use utils::get_image_from_path; -const PACKAGE_NAME: &str = env!("CARGO_PKG_NAME"); - -pub struct Settings { - pub modules: Modules, - pub widget_configs: WidgetConfigs, -} - -pub struct LinkMachine { - settings: Settings, - connect_code: String, - progress: f64, - timer: i32, - provision_status: bool, - current_time: i32, - task: Option>, - g: Option>, - p: Option>, - t: Option>, -} - -#[derive(Debug)] -pub enum LinkMachineOutput { - BackPressed, - NextPressed, - ShowError(String), -} - -#[derive(Debug)] -pub enum InputMessage { - ActiveScreen(String), - CodeChanged(String), - UpdateTimer(f64), - GenerateCodeError(String), - ProvisionSuccess, - ShowError(String), - BackScreen, - ProvisioningTasks { - g: tokio::task::JoinHandle<()>, - p: tokio::task::JoinHandle<()>, - // t: tokio::task::JoinHandle<()>, - }, -} - -pub struct AppWidgets { - connect_code_label: gtk::Label, - progress_bar: gtk::ProgressBar, - // spinner: gtk::Spinner, - // timer_label: gtk::Label, -} - -const TIMER: i32 = 10; - -#[async_trait(?Send)] -impl AsyncComponent for LinkMachine { - type Init = Settings; - type Input = InputMessage; - type Output = LinkMachineOutput; - type Root = gtk::Box; - type Widgets = AppWidgets; - type CommandOutput = (); - - fn init_root() -> Self::Root { - let provider = CssProvider::new(); - //provider.load_from_data(include_str!("../assets/css/style.css")); - gtk::style_context_add_provider_for_display( - &Display::default().expect("Could not connect to a display."), - &provider, - STYLE_PROVIDER_PRIORITY_APPLICATION, - ); - - gtk::Box::builder().build() - } - - async fn init( - init: Self::Init, - root: Self::Root, - sender: AsyncComponentSender, - ) -> AsyncComponentParts { - let modules = init.modules.clone(); - let widget_configs = init.widget_configs.clone(); - - let main_container = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .build(); - - let main_content_box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .css_classes(["app-container"]) - .build(); - - let footer_content_box: gtk::Box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .vexpand(true) - .valign(gtk::Align::End) - .css_classes(["footer-container"]) - .build(); - - let header_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .css_classes(["start-screen-header-box"]) - .build(); - - let app_icon_path: Option = modules.pages_settings.start_screen.app_icon.clone(); - - let app_icon: gtk::Image = get_image_from_path(app_icon_path, &["app-icon"]); - - let header_label = gtk::Label::builder() - .label("Link Your Machine") - .halign(gtk::Align::Start) - .build(); - - header_label - .style_context() - .add_class("start-screen-header"); - - header_box.append(&app_icon); - header_box.append(&header_label); - - main_container.append(&header_box); // main box - - let header_info_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .css_classes(["start-header-p"]) - .build(); - - let info_sentence = gtk::Label::builder() - .label("Use this below code to connect this machine to your Mecha account") - .hexpand(true) - .justify(gtk::Justification::Fill) - .wrap(true) - .wrap_mode(pango::WrapMode::Word) - .build(); - - header_info_box.append(&info_sentence); - main_content_box.append(&header_info_box); - - let info_box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .css_classes(["start-screen-steps-container"]) - .build(); - - // check-code - let main_code_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .hexpand(true) - .css_classes(["link-machine-border-box"]) - .build(); - - let code_label_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .hexpand(true) - .halign(gtk::Align::Start) - .build(); - - // spinner - let spinner = gtk::Spinner::builder() - .css_classes(["blue"]) - .height_request(30) - .width_request(30) - .build(); - spinner.set_spinning(false); - - let connect_code_label = gtk::Label::builder() - .label("") // ABCD 1234 - .css_classes(["link-machine-code"]) - .build(); - - // progress bar - let progress_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .hexpand(true) - .build(); - - // progressbar - let progress_bar = gtk::ProgressBar::builder() - .fraction(1.0) - .hexpand(true) - .build(); - progress_bar - .style_context() - .add_class("custom-progress-bar"); - - progress_box.append(&progress_bar); - - code_label_box.append(&connect_code_label); - main_code_box.append(&code_label_box); - // main_code_box.append(&spinner); - - info_box.append(&main_code_box); - info_box.append(&progress_box); - // main_content_box.append(&main_code_box); - - let main_steps_box: gtk::Box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .css_classes(["link-machine-steps-container"]) - .build(); - - let linking_step1_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .css_classes(["link-machine-steps-box"]) - .hexpand(true) - .build(); - - let step1_label_box = gtk::Box::builder() - .css_classes(["circle-border-box"]) - .valign(gtk::Align::Start) - .build(); - - let step1_label = gtk::Label::builder() - .label("1") - .width_request(25) - .height_request(25) - .build(); - step1_label_box.append(&step1_label); - - let step1_text = gtk::Label::builder() - .label("Create a new account on Mecha, if not signed up earlier.") - .css_classes(["link-machine-steps-text"]) - .wrap(true) - .wrap_mode(pango::WrapMode::Word) - .hexpand(true) - .halign(gtk::Align::Start) - .build(); - - linking_step1_box.append(&step1_label_box); - linking_step1_box.append(&step1_text); - - main_steps_box.append(&linking_step1_box); - - // - let linking_step2_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .css_classes(["link-machine-steps-box"]) - .hexpand(true) - .build(); - - let step2_label_box = gtk::Box::builder() - .css_classes(["circle-border-box"]) - .valign(gtk::Align::Start) - .build(); - - let step2_label = gtk::Label::builder() - .label("2") - .width_request(25) - .height_request(25) - .build(); - step2_label_box.append(&step2_label); - - let step2_text = gtk::Label::builder() - .label("Navigate to Machines > Add Machine") - .css_classes(["link-machine-steps-text"]) - .halign(gtk::Align::Start) - .hexpand(true) - .justify(gtk::Justification::Fill) - .wrap(true) - .wrap_mode(pango::WrapMode::Word) - .build(); - - linking_step2_box.append(&step2_label_box); - linking_step2_box.append(&step2_text); - - main_steps_box.append(&linking_step2_box); - - // - let linking_step3_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .css_classes(["link-machine-steps-box"]) - .hexpand(true) - .build(); - - let step3_label_box = gtk::Box::builder() - .css_classes(["circle-border-box"]) - .valign(gtk::Align::Start) - .build(); - - let step3_label = gtk::Label::builder() - .label("3") - .width_request(25) - .height_request(25) - .build(); - step3_label_box.append(&step3_label); - - let step3_text = gtk::Label::builder() - .label("Enter the code shown above when asked") - .css_classes(["link-machine-steps-text"]) - .halign(gtk::Align::Start) - .hexpand(true) - .justify(gtk::Justification::Fill) - .wrap(true) - .wrap_mode(pango::WrapMode::Word) - .build(); - - linking_step3_box.append(&step3_label_box); - linking_step3_box.append(&step3_text); - - main_steps_box.append(&linking_step3_box); - - info_box.append(&main_steps_box); - main_content_box.append(&info_box); - - // footer_box - let footer_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .hexpand(true) - .valign(gtk::Align::End) - .build(); - - let back_icon_img: gtk::Image = get_image_from_path(widget_configs.footer.back_icon, &[]); - let back_button_box = gtk::Box::builder().hexpand(true).build(); - let back_button = gtk::Button::builder().build(); - back_button.set_child(Some(&back_icon_img)); - back_button.add_css_class("footer-container-button"); - - back_button.connect_clicked(clone!(@strong sender => move |_| { - let _ = sender.input_sender().send(InputMessage::BackScreen); - })); - - back_button_box.append(&back_button); - footer_box.append(&back_button_box); - - footer_content_box.append(&footer_box); - main_content_box.append(&footer_content_box); - main_container.append(&main_content_box); - - root.append(&main_container); - - let model = LinkMachine { - settings: init, - connect_code: "".to_string(), - timer: TIMER, - provision_status: false, - progress: 0.0, - current_time: 0, - task: None, - g: None, - p: None, - t: None, - }; - - let widgets = AppWidgets { - connect_code_label, - progress_bar, - }; - - AsyncComponentParts { model, widgets } - } - - async fn update( - &mut self, - message: Self::Input, - sender: AsyncComponentSender, - _root: &Self::Root, - ) { - match message { - InputMessage::ActiveScreen(text) => { - info!("active screen: {:?}", text); - let sender: relm4::Sender = sender.input_sender().clone(); - let relm_task: glib::JoinHandle<()> = relm4::spawn_local(async move { - let _ = link_machine_init_services(sender).await; - }); - self.task = Some(relm_task) - } - InputMessage::ProvisionSuccess => { - self.task.as_ref().unwrap().abort(); - // self.t.as_ref().unwrap().abort(); - let _ = sender.output(LinkMachineOutput::NextPressed); - } - InputMessage::CodeChanged(code) => { - self.connect_code = code.clone(); - } - InputMessage::UpdateTimer(time_fraction) => { - self.progress = time_fraction.clone(); - } - InputMessage::GenerateCodeError(error) => { - self.task.as_ref().unwrap().abort(); - self.g.as_ref().unwrap().abort(); - self.p.as_ref().unwrap().abort(); - - let _ = tokio::time::sleep(Duration::from_millis(5000)).await; - let _ = sender.output(LinkMachineOutput::ShowError(error)); - } - InputMessage::ShowError(error) => { - self.task.as_ref().unwrap().abort(); - self.g.as_ref().unwrap().abort(); - self.p.as_ref().unwrap().abort(); - let _ = sender.output(LinkMachineOutput::ShowError(error)); - } - InputMessage::BackScreen => { - self.task.as_ref().unwrap().abort(); - self.g.as_ref().unwrap().abort(); - self.p.as_ref().unwrap().abort(); - // self.t.as_ref().unwrap().abort(); - - let _ = sender.output(LinkMachineOutput::BackPressed); - } - InputMessage::ProvisioningTasks { g, p } => { - self.g = Some(g); - self.p = Some(p); - // self.t = Some(t); - } - } - } - - fn update_view(&self, widgets: &mut Self::Widgets, sender: AsyncComponentSender) { - widgets.connect_code_label.set_label(&self.connect_code); - widgets.progress_bar.set_fraction(self.progress); - } -} - -async fn link_machine_init_services(sender: relm4::Sender) { - let fn_name = "link_machine_init_services"; - info!(func = fn_name, package = PACKAGE_NAME); - - let sender_clone_1 = sender.clone(); - let mut link_machine_handler = LinkMachineHandler::new(); - - let _ = relm4::spawn_local(async move { - let _ = link_machine_handler.run(sender_clone_1).await; - }); -} diff --git a/client/app/src/pages/machine_info.rs b/client/app/src/pages/machine_info.rs deleted file mode 100644 index 60fa07aa..00000000 --- a/client/app/src/pages/machine_info.rs +++ /dev/null @@ -1,443 +0,0 @@ -use std::time::Duration; - -use crate::{ - handlers::machine_info::handler::get_status, - services::{get_machine_info, MachineInformation}, - settings::{Modules, WidgetConfigs}, - utils::{self, get_texture_from_base64}, -}; -use gtk::prelude::*; -use relm4::{ - component::{AsyncComponent, AsyncComponentParts}, - gtk::{ - self, - glib::clone, - pango, - prelude::{ButtonExt, WidgetExt}, - Button, - }, - AsyncComponentSender, -}; -use tonic::async_trait; -use tracing::{debug, error, info}; -use utils::get_image_from_path; -// use utils::{get_image_bytes, get_image_from_path, get_image_from_url}; -const PACKAGE_NAME: &str = env!("CARGO_PKG_NAME"); - -pub struct Settings { - pub modules: Modules, - pub widget_configs: WidgetConfigs, -} - -#[derive(Clone, Copy, Debug, PartialEq)] -pub enum MachineInfoStatus { - FETCH, - SUCCESS, - FAILED, -} - -pub struct MachineInfo { - settings: Settings, - machine_id: String, - name: String, - icon_str: Option, - status: MachineInfoStatus, - toast_text: String, // machine_info: Option, -} - -#[derive(Debug)] -pub enum InputMessage { - ActiveScreen(String), - ShowStatus(MachineInfoStatus, String), - UpdateMachineInfo(MachineInformation, MachineInfoStatus, String), -} - -#[derive(Debug)] -pub enum DevicePageOutput { - Exit, -} - -pub struct AppWidgets { - name_label: gtk::Label, - id_label: gtk::Label, - profile_icon: gtk::Image, - active_status_icon: gtk::Image, - not_active_status_icon: gtk::Image, - toast_box: gtk::Box, - toast_label: gtk::Label, - toast_spinner: gtk::Spinner, -} - -#[async_trait(?Send)] -impl AsyncComponent for MachineInfo { - type Init = Settings; - type Input = InputMessage; - type Output = DevicePageOutput; - type Root = gtk::Box; - type Widgets = AppWidgets; - type CommandOutput = (); - - fn init_root() -> Self::Root { - gtk::Box::builder().build() - } - - /// Initialize the UI and model. - async fn init( - init: Self::Init, - root: Self::Root, - sender: AsyncComponentSender, - ) -> AsyncComponentParts { - let modules = init.modules.clone(); - let widget_configs = init.widget_configs.clone(); - - let main_content_box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .css_classes(["app-container"]) - .halign(gtk::Align::Fill) - .build(); - - let footer_content_box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .vexpand(true) - .valign(gtk::Align::End) - .css_classes(["footer-container"]) - .build(); - - // let user_profile_icon = gtk::Image::new(); - let icon_box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .halign(gtk::Align::Center) - .css_classes(["device-info-icon-box"]) - .build(); - - let user_profile_icon: gtk::Image = get_image_from_path( - modules.pages_settings.device_info.user_profile_img.clone(), - &["device-info-icon"], - ); - // user_profile_icon - // .clipboard() - // .bind_property("border-radius", , "border-radius"); - - icon_box.append(&user_profile_icon); - main_content_box.append(&icon_box); - // main_content_box.append(&user_profile_icon); - - let status_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .halign(gtk::Align::Center) - .valign(gtk::Align::Center) - .build(); - - // bold - let machine_name: gtk::Label = gtk::Label::builder() - .label("My Machine".to_string()) - .halign(gtk::Align::Center) - .css_classes(["about-device-name"]) - .build(); - - let active_status_icon: gtk::Image = get_image_from_path( - modules - .pages_settings - .device_info - .active_status_icon - .clone(), - &["device-info-status-icon"], - ); - active_status_icon.set_visible(false); - - let not_active_status_icon: gtk::Image = get_image_from_path( - modules - .pages_settings - .device_info - .not_active_status_icon - .clone(), - &["device-info-status-icon"], - ); - not_active_status_icon.set_visible(false); - - status_box.append(&machine_name); - status_box.append(&active_status_icon); - status_box.append(¬_active_status_icon); - - main_content_box.append(&status_box); - - let id_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .hexpand(true) - .css_classes(["device-info-border-box"]) - .build(); - - let id_label: gtk::Label = gtk::Label::builder() - .label("Machine ID") - .hexpand(true) - .halign(gtk::Align::Start) - .css_classes(["device-id-text", "about-device-id"]) - .build(); - - let id_value: gtk::Label = gtk::Label::builder() - .label("-") - .halign(gtk::Align::End) - .css_classes(["about-device-id"]) - .build(); - - id_box.append(&id_label); - id_box.append(&id_value); - main_content_box.append(&id_box); - - let sentence_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .hexpand(true) - .halign(gtk::Align::Start) - .css_classes(["device-info-sentence"]) - .build(); - - let info_sentence = gtk::Label::builder() - .label("You can unlink your machine from your Mecha account") - .hexpand(true) - .wrap(true) - .wrap_mode(pango::WrapMode::Word) - .build(); - - sentence_box.append(&info_sentence); - main_content_box.append(&sentence_box); - - let toast_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .halign(gtk::Align::Center) - .css_classes(["custom-toast-box"]) - .hexpand(true) - .build(); - - let toast_text = String::from("Fetching Machine Info..."); - - let toast_label = gtk::Label::builder() - .label(toast_text.to_owned()) - .halign(gtk::Align::Center) - .css_classes(["custom-toast"]) - .build(); - toast_label.set_visible(true); - - let spinner = gtk::Spinner::builder() - .css_classes(["blue"]) - .height_request(25) - .width_request(25) - .spinning(true) - .build(); - spinner.set_visible(true); - - toast_box.append(&spinner); - toast_box.append(&toast_label); - - let toast_overlay = gtk::Overlay::builder().build(); - toast_overlay.add_overlay(&toast_box); - toast_overlay.set_accessible_role(gtk::AccessibleRole::Generic); - main_content_box.append(&toast_overlay); - - let footer_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .hexpand(true) - .vexpand(true) - .build(); - - let button_box = gtk::Box::builder().hexpand(true).build(); - - let exit_icon_img: gtk::Image = get_image_from_path(widget_configs.footer.exit_icon, &[]); - - let exit_button = Button::builder().build(); - exit_button.set_child(Some(&exit_icon_img)); - exit_button.add_css_class("footer-container-button"); - - exit_button.connect_clicked(clone!(@strong sender => move |_| { - let _ = sender.output(DevicePageOutput::Exit); - })); - - footer_box.append(&button_box); - footer_box.append(&exit_button); - - footer_content_box.append(&footer_box); - main_content_box.append(&footer_content_box); - - root.append(&main_content_box); - - let model = MachineInfo { - settings: init, - machine_id: String::from("-"), - name: String::from("My Machine"), - icon_str: Some(String::from("")), // base64 - status: MachineInfoStatus::FETCH, - toast_text: toast_text, - }; - - let widgets = AppWidgets { - name_label: machine_name, - id_label: id_value, - profile_icon: user_profile_icon, - active_status_icon: active_status_icon, - not_active_status_icon: not_active_status_icon, - toast_box: toast_box, - toast_label: toast_label, - toast_spinner: spinner, - }; - - AsyncComponentParts { model, widgets } - } - - async fn update( - &mut self, - message: Self::Input, - sender: AsyncComponentSender, - _root: &Self::Root, - ) { - match message { - InputMessage::ActiveScreen(machine_id) => { - info!("active screen: {:?}", machine_id); - - self.machine_id = machine_id.to_owned(); - self.toast_text = String::from("Fetching Machine Information..."); - - let sender: relm4::Sender = sender.input_sender().clone(); - let _ = machine_info_init_services(sender).await; - } - InputMessage::ShowStatus(status, error_toast) => { - self.status = status; - self.toast_text = error_toast; - } - InputMessage::UpdateMachineInfo(data, status, error_toast) => { - info!( - "InputMessage::UpdateMachineInfo::data-name >>>>>>>>{:?}", - &data.name - ); - - self.status = status; - self.toast_text = error_toast; - - self.machine_id = data.machine_id.clone(); - self.name = data.name.clone(); - self.icon_str = data.icon.clone(); // BASE64 - } - } - } - - fn update_view(&self, widgets: &mut Self::Widgets, sender: AsyncComponentSender) { - widgets.name_label.set_label(&self.name); - widgets.id_label.set_label(&self.machine_id); - widgets.active_status_icon.set_visible(false); - widgets.not_active_status_icon.set_visible(true); - - if self.status == MachineInfoStatus::SUCCESS { - if let Some(image_base_str) = &self.icon_str { - if !image_base_str.is_empty() { - match get_texture_from_base64(image_base_str.to_string()) { - Ok(texture) => { - widgets.profile_icon.set_paintable(Some(&texture)); - widgets - .profile_icon - .style_context() - .add_class("device-info-icon"); - } - Err(_) => {} - }; - } - }; - - widgets.active_status_icon.set_visible(true); - widgets.not_active_status_icon.set_visible(false); - widgets.toast_label.set_visible(false); - widgets.toast_box.set_visible(false); - } else if self.status == MachineInfoStatus::FAILED { - widgets.not_active_status_icon.set_visible(true); - widgets.active_status_icon.set_visible(false); - - widgets.toast_label.set_label(&self.toast_text.clone()); - widgets.toast_label.set_visible(true); - widgets.toast_label.set_hexpand(true); - widgets.toast_spinner.hide(); - widgets.toast_box.set_visible(true); - } - } -} - -async fn machine_info_init_services(sender: relm4::Sender) { - let fn_name: &str = "machine_info_init_services"; - let error_toast = String::from("Machine Agent not running or not internet connectivity"); - info!(func = fn_name, package = PACKAGE_NAME); - - let sender_1 = sender.clone(); - - let _ = relm4::spawn(async move { - loop { - let (get_status_result, get_machine_info_result) = - tokio::join!(get_status(), get_machine_info()); - - match (get_status_result, get_machine_info_result) { - (Ok(ping_res), Ok(machine_info_res)) => { - info!( - func = fn_name, - package = PACKAGE_NAME, - "MACHINE INFO IS {:?}", - machine_info_res.name.clone() - ); - - let _ = sender_1.send(InputMessage::UpdateMachineInfo( - machine_info_res.to_owned(), - if ping_res.code == "success" { - MachineInfoStatus::SUCCESS - } else { - MachineInfoStatus::FAILED - }, - String::from(""), - )); - } - (Ok(_), Err(ping_error)) => { - debug!( - func = fn_name, - package = PACKAGE_NAME, - "PING STATUS ERROR {:?}", - ping_error - ); - let _ = sender.send(InputMessage::ShowStatus( - MachineInfoStatus::FAILED, - error_toast.to_owned(), - )); - } - (Err(machine_info_error), Ok(_)) => { - debug!( - func = fn_name, - package = PACKAGE_NAME, - "MACHINE INFO ERROR {:?}", - machine_info_error - ); - - let _ = sender.send(InputMessage::ShowStatus( - MachineInfoStatus::FAILED, - error_toast.to_owned(), - )); - } - (Err(err_1), Err(err_2)) => { - debug!( - func = fn_name, - package = PACKAGE_NAME, - "DEBUG ERR_1 {:?} & ERR_2 {:?}", - err_1, - err_2 - ); - - error!( - func = fn_name, - package = PACKAGE_NAME, - "error ===> ERR_1 {:?} & ERR_2 {:?}", - err_1, - err_2 - ); - - let _ = sender.send(InputMessage::ShowStatus( - MachineInfoStatus::FAILED, - error_toast.to_owned(), - )); - } - } - - let _ = tokio::time::sleep(Duration::from_secs(5)).await; - } - }); -} diff --git a/client/app/src/pages/mod.rs b/client/app/src/pages/mod.rs deleted file mode 100644 index 36bbbe6f..00000000 --- a/client/app/src/pages/mod.rs +++ /dev/null @@ -1,9 +0,0 @@ -pub mod check_internet; -pub mod configure_machine; -pub mod link_machine; -pub mod machine_info; -pub mod no_internet; -pub mod setup_failed; -pub mod setup_success; -pub mod start_screen; -pub mod timeout_screen; diff --git a/client/app/src/pages/no_internet.rs b/client/app/src/pages/no_internet.rs deleted file mode 100644 index 36daf49b..00000000 --- a/client/app/src/pages/no_internet.rs +++ /dev/null @@ -1,121 +0,0 @@ -use crate::{ - settings::{Modules, WidgetConfigs}, - utils, -}; -use gtk::prelude::*; -use relm4::{ - gtk::{ - self, - glib::clone, - prelude::{ButtonExt, WidgetExt}, - }, - ComponentParts, ComponentSender, SimpleComponent, -}; -use utils::{get_gif_from_path, get_image_from_path}; - -pub struct Settings { - pub modules: Modules, - pub widget_configs: WidgetConfigs, -} - -pub struct NoInternet { - settings: Settings, -} - -#[derive(Debug)] -pub enum PageOutput { - BackPressed, - SettingsPressed, -} - -pub struct AppWidgets {} - -impl SimpleComponent for NoInternet { - type Init = Settings; - type Input = (); - type Output = PageOutput; - type Root = gtk::Box; - type Widgets = AppWidgets; - - fn init_root() -> Self::Root { - gtk::Box::builder().build() - } - - fn init( - init: Self::Init, - root: Self::Root, - sender: ComponentSender, - ) -> relm4::ComponentParts { - let modules = init.modules.clone(); - let widget_configs = init.widget_configs.clone(); - let model = NoInternet { settings: init }; - - let main_content_box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .css_classes(["app-container", "check-internet-text"]) - .build(); - - let footer_content_box: gtk::Box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .vexpand(true) - .valign(gtk::Align::End) - .css_classes(["footer-container"]) - .build(); - - let gif_path = modules.pages_settings.no_internet.no_internet_found.clone(); - let paintable = get_gif_from_path(gif_path); - - let image_from = gtk::Image::builder() - .paintable(&paintable) - .css_classes(["gif-img"]) - .build(); - - let label1 = gtk::Label::builder() - .label("Connect to Internet to complete the setup") - .hexpand(true) - .build(); - - main_content_box.append(&image_from); - main_content_box.append(&label1); - - // footer_box - let footer_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .hexpand(true) - .valign(gtk::Align::End) - .build(); - - let back_icon_img: gtk::Image = get_image_from_path(widget_configs.footer.back_icon, &[]); - let back_button_box = gtk::Box::builder().hexpand(true).build(); - let back_button = gtk::Button::builder().build(); - back_button.set_child(Some(&back_icon_img)); - back_button.add_css_class("footer-container-button"); - - back_button.connect_clicked(clone!(@strong sender => move |_| { - let _ = sender.output(PageOutput::BackPressed); - })); - - let settings_icon_img: gtk::Image = - get_image_from_path(widget_configs.footer.settings_icon, &[]); - let settings_button = gtk::Button::new(); - settings_button.set_child(Some(&settings_icon_img)); - settings_button.add_css_class("footer-container-button"); - - settings_button.connect_clicked(clone!(@strong sender => move |_| { - let _ = sender.output(PageOutput::SettingsPressed); - })); - - back_button_box.append(&back_button); - footer_box.append(&back_button_box); - footer_box.append(&settings_button); - - footer_content_box.append(&footer_box); - main_content_box.append(&footer_content_box); - - root.append(&main_content_box); - - let widgets = AppWidgets {}; - - ComponentParts { model, widgets } - } -} diff --git a/client/app/src/pages/setup_failed.rs b/client/app/src/pages/setup_failed.rs deleted file mode 100644 index f3dcd02f..00000000 --- a/client/app/src/pages/setup_failed.rs +++ /dev/null @@ -1,194 +0,0 @@ -use crate::{ - settings::{Modules, WidgetConfigs}, - utils, -}; -use gtk::prelude::*; -use relm4::{ - gtk::{ - self, - gdk::Display, - glib::clone, - pango, - prelude::{ButtonExt, WidgetExt}, - Button, CssProvider, STYLE_PROVIDER_PRIORITY_APPLICATION, - }, - ComponentParts, ComponentSender, SimpleComponent, -}; -use utils::{get_gif_from_path, get_image_from_path}; - -pub struct Settings { - pub modules: Modules, - pub widget_configs: WidgetConfigs, -} -pub struct SetupFailed { - settings: Settings, - error_message: String, - from_screen: String, -} - -#[derive(Debug)] -enum AppInput {} - -#[derive(Debug)] -pub enum SetupFailOutput { - refresh(String), -} - -#[derive(Debug)] -pub enum InputMessage { - ShowError(String, String), - refresh, -} - -pub struct AppWidgets { - error_message: gtk::Label, -} - -impl SimpleComponent for SetupFailed { - type Init = Settings; - type Input = InputMessage; - type Output = SetupFailOutput; - type Root = gtk::Box; - type Widgets = AppWidgets; - - fn init_root() -> Self::Root { - let provider = CssProvider::new(); - //provider.load_from_data(include_str!("../assets/css/style.css")); - gtk::style_context_add_provider_for_display( - &Display::default().expect("Could not connect to a display."), - &provider, - STYLE_PROVIDER_PRIORITY_APPLICATION, - ); - - gtk::Box::builder().build() - } - - fn init( - init: Self::Init, - root: Self::Root, - sender: ComponentSender, - ) -> relm4::ComponentParts { - let modules = init.modules.clone(); - let widget_configs = init.widget_configs.clone(); - - let main_content_box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .css_classes(["app-container"]) - .build(); - - let footer_content_box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .vexpand(true) - .valign(gtk::Align::End) - .css_classes(["footer-container"]) - .build(); - - // get gif - let gif_path = modules.pages_settings.setup_failure.failure.clone(); - let paintable = get_gif_from_path(gif_path); - - let image_from = gtk::Image::builder() - .paintable(&paintable) - .css_classes(["gif-img"]) - .build(); - - main_content_box.append(&image_from); - - // bold - let label: gtk::Label = gtk::Label::builder() - .label("Error connecting to service") - .css_classes(["setup-status-label"]) - .build(); - - main_content_box.append(&label); - - let info_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .hexpand_set(true) - .halign(gtk::Align::Center) - .build(); - - let info_desc: gtk::Label = gtk::Label::builder() - .label("Low internet connectivity") - .css_classes(["setup-fail-info", "capitalize"]) - .justify(gtk::Justification::Center) - .build(); - - // info_box.append(&info_label); - info_box.append(&info_desc); - main_content_box.append(&info_box); - - // footer_box - let footer_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .hexpand(true) - .vexpand(true) - .valign(gtk::Align::End) - .build(); - - let back_icon_img: gtk::Image = get_image_from_path(widget_configs.footer.back_icon, &[]); - - let back_button_box = gtk::Box::builder().hexpand(true).build(); - let back_button = Button::builder().build(); - back_button.set_child(Some(&back_icon_img)); - back_button.add_css_class("footer-container-button"); - - back_button.connect_clicked(clone!(@strong sender => move |_| { - // let _ = sender.output(SetupFailOutput::BackPressed); - let _ = sender.input(InputMessage::refresh); - })); - - let refresh_icon_img: gtk::Image = - get_image_from_path(widget_configs.footer.refresh_icon, &[]); - let refresh_button = Button::new(); - refresh_button.set_child(Some(&refresh_icon_img)); - refresh_button.add_css_class("footer-container-button"); - - refresh_button.connect_clicked(clone!(@strong sender => move |_| { - let _ = sender.input(InputMessage::refresh); - })); - - back_button_box.append(&back_button); - footer_box.append(&back_button_box); - footer_box.append(&refresh_button); - - footer_content_box.append(&footer_box); - main_content_box.append(&footer_content_box); - - root.append(&main_content_box); - - let model = SetupFailed { - settings: init, - error_message: String::from(""), - from_screen: String::from(""), - }; - - let widgets = AppWidgets { - error_message: info_desc, - }; - - ComponentParts { model, widgets } - } - - fn update(&mut self, message: Self::Input, sender: ComponentSender) { - match message { - InputMessage::ShowError(message, from_screen) => { - tracing::info!("active screen: setup_failed from screen {:?}", from_screen); - - self.error_message = message.clone(); - self.from_screen = from_screen.clone(); - } - InputMessage::refresh => { - let _ = sender.output(SetupFailOutput::refresh(self.from_screen.clone())); - } - } - } - - fn update_view(&self, widgets: &mut Self::Widgets, sender: ComponentSender) { - widgets.error_message.set_label(&self.error_message); - widgets.error_message.set_wrap(true); - widgets.error_message.set_wrap_mode(pango::WrapMode::Word); - widgets.error_message.set_hexpand(true); - widgets.error_message.set_justify(gtk::Justification::Fill); - } -} diff --git a/client/app/src/pages/setup_success.rs b/client/app/src/pages/setup_success.rs deleted file mode 100644 index 8dd9055b..00000000 --- a/client/app/src/pages/setup_success.rs +++ /dev/null @@ -1,147 +0,0 @@ -use crate::{ - services::MachineInformation, - settings::{Modules, WidgetConfigs}, - utils, -}; -use gtk::prelude::*; -use relm4::{ - gtk::{ - self, - glib::clone, - pango, - prelude::{ButtonExt, WidgetExt}, - Button, - }, - ComponentParts, ComponentSender, SimpleComponent, -}; -use utils::{get_gif_from_path, get_image_from_path}; - -pub struct Settings { - pub modules: Modules, - pub widget_configs: WidgetConfigs, -} - -pub struct SetupSuccess { - settings: Settings, - machine_id: String, -} - -#[derive(Debug)] -pub enum InputMessage { - ActiveScreen(String), -} - -#[derive(Debug)] -pub enum SetupSuccessOutput { - BackPressed, - NextPressed, -} - -pub struct AppWidgets {} - -impl SimpleComponent for SetupSuccess { - type Init = Settings; - type Input = InputMessage; - type Output = SetupSuccessOutput; - type Root = gtk::Box; - type Widgets = AppWidgets; - - fn init_root() -> Self::Root { - gtk::Box::builder().build() - } - - fn init( - init: Self::Init, - root: Self::Root, - sender: ComponentSender, - ) -> relm4::ComponentParts { - let modules = init.modules.clone(); - let widget_configs = init.widget_configs.clone(); - - let model = SetupSuccess { - settings: init, - machine_id: String::from(""), - }; - - let main_content_box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .css_classes(["app-container", "setup-status-label"]) - .build(); - - let footer_content_box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .vexpand(true) - .valign(gtk::Align::End) - .css_classes(["footer-container"]) - .build(); - - // get gif - let gif_path = modules.pages_settings.setup_success.success.clone(); - let paintable = get_gif_from_path(gif_path); - - let image_from = gtk::Image::builder() - .paintable(&paintable) - .css_classes(["gif-img"]) - .build(); - - // bold - let label1: gtk::Label = gtk::Label::builder() - .label("Machine is now connected to your Mecha account") - .halign(gtk::Align::Center) - .valign(gtk::Align::Center) - .hexpand(true) - .justify(gtk::Justification::Center) - .wrap(true) - .wrap_mode(pango::WrapMode::Word) - .build(); - - main_content_box.append(&image_from); - main_content_box.append(&label1); - - // footer_box - let footer_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .hexpand(true) - .build(); - let button_box = gtk::Box::builder().hexpand(true).build(); - - let back_icon_img: gtk::Image = get_image_from_path(widget_configs.footer.back_icon, &[]); - let back_button = Button::builder().build(); - back_button.set_child(Some(&back_icon_img)); - back_button.add_css_class("footer-container-button"); - - back_button.connect_clicked(clone!(@strong sender => move |_| { - let _ = sender.output(SetupSuccessOutput::BackPressed); - })); - - let next_icon_img: gtk::Image = get_image_from_path(widget_configs.footer.next_icon, &[]); - let next_button = Button::new(); - next_button.set_child(Some(&next_icon_img)); - next_button.add_css_class("footer-container-button"); - - next_button.connect_clicked(clone!(@strong sender => move |_| { - let _ = sender.output(SetupSuccessOutput::NextPressed); - })); - - // button_box.append(&back_button); // remove - footer_box.append(&button_box); - footer_box.append(&next_button); - - footer_content_box.append(&footer_box); - main_content_box.append(&footer_content_box); - - root.append(&main_content_box); - - let widgets = AppWidgets {}; - - ComponentParts { model, widgets } - } - - fn update(&mut self, message: Self::Input, sender: ComponentSender) { - match message { - InputMessage::ActiveScreen(text) => { - tracing::info!("active screen: {:?}", text); - } - } - } -} diff --git a/client/app/src/pages/start_screen.rs b/client/app/src/pages/start_screen.rs deleted file mode 100644 index 4969fc0b..00000000 --- a/client/app/src/pages/start_screen.rs +++ /dev/null @@ -1,349 +0,0 @@ -use crate::{ - handlers::start_screen::handler::machine_provision_status, - services::get_machine_id, - settings::{Modules, WidgetConfigs}, - utils::{self, get_image_from_path}, -}; - -use relm4::{ - adw, - component::{AsyncComponent, AsyncComponentParts}, - gtk::{ - self, - glib::clone, - pango, - prelude::{ButtonExt, StyleContextExt, WidgetExt}, - Button, - }, - AsyncComponentSender, -}; - -use gtk::prelude::*; -use tonic::async_trait; -use tracing::{debug, error, info}; - -const PACKAGE_NAME: &str = env!("CARGO_PKG_NAME"); - -pub struct Settings { - pub modules: Modules, - pub widget_configs: WidgetConfigs, -} -pub struct StartScreen { - settings: Settings, -} - -#[derive(Debug)] -pub enum StartScreenOutput { - ShowCheckInternet, - ShowMachineInfo(String), - BackPressed, -} - -pub struct AppWidgets {} - -#[async_trait(?Send)] -impl AsyncComponent for StartScreen { - type Init = Settings; - type Input = (); - type Output = StartScreenOutput; - type Root = gtk::Box; - type Widgets = AppWidgets; - type CommandOutput = (); - - fn init_root() -> Self::Root { - gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .build() - } - - /// Initialize the UI and model. - async fn init( - init: Self::Init, - root: Self::Root, - sender: AsyncComponentSender, - ) -> AsyncComponentParts { - let modules = init.modules.clone(); - let widget_configs = init.widget_configs.clone(); - - let model = StartScreen { settings: init }; - - let main_container = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .build(); - - let main_content_box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .vexpand(true) - .css_classes(["app-container"]) - .build(); - - let footer_content_box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .vexpand(true) - .valign(gtk::Align::End) - .css_classes(["footer-container"]) - .build(); - - let header_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .css_classes(["start-screen-header-box"]) - .build(); - - let app_icon_path: Option = modules.pages_settings.start_screen.app_icon.clone(); - - let app_icon: gtk::Image = get_image_from_path(app_icon_path, &["app-icon"]); - - let header_label = gtk::Label::builder() - .label("Connect to Mecha") - .halign(gtk::Align::Start) - .build(); - - header_label - .style_context() - .add_class("start-screen-header"); - - header_box.append(&app_icon); - header_box.append(&header_label); - - main_container.append(&header_box); // main box - - let info_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .css_classes(["start-header-p"]) - .build(); - - let info_icon: gtk::Image = get_image_from_path( - modules.pages_settings.start_screen.info_icon.clone(), - &["info-icon"], - ); - - let info_sentence = gtk::Label::builder() - .label("Please sign up on mecha.so before getting started.") - .halign(gtk::Align::Start) - .hexpand(true) - .justify(gtk::Justification::Fill) - .wrap(true) - .wrap_mode(pango::WrapMode::Word) - .build(); - - info_box.append(&info_icon); - info_box.append(&info_sentence); - main_content_box.append(&info_box); - - let hbox_line2 = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .hexpand(true) - .halign(gtk::Align::Center) - .valign(gtk::Align::Center) - .css_classes(["start-screen-steps-box"]) - .build(); - - let icon2: gtk::Image = get_image_from_path( - modules - .pages_settings - .start_screen - .virtual_network_icon - .clone(), - &["start-screen-steps-icon"], - ); - - let label2 = gtk::Label::builder() - .label("Mesh Networking to enable global connectivity between your machines") - .css_classes(["start-screen-steps-label"]) - .wrap(true) - .wrap_mode(pango::WrapMode::Word) - // .vexpand(true) - .halign(gtk::Align::Center) - .valign(gtk::Align::End) - .justify(gtk::Justification::Center) - .build(); - - hbox_line2.append(&icon2); - hbox_line2.append(&label2); - - let hbox_line3 = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .hexpand(true) - .css_classes(["start-screen-steps-box"]) - .build(); - - let icon3: gtk::Image = get_image_from_path( - modules.pages_settings.start_screen.real_time_icon.clone(), - &["start-screen-steps-icon"], - ); - - let label3 = gtk::Label::builder() - .label("Integrated metrics and logs collection, compatible with OpenTelemetry") - .css_classes(["start-screen-steps-label"]) - .wrap(true) - .wrap_mode(pango::WrapMode::Word) - .halign(gtk::Align::Center) - .valign(gtk::Align::End) - .justify(gtk::Justification::Center) - .build(); - - hbox_line3.append(&icon3); - hbox_line3.append(&label3); - - let hbox_line4 = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .hexpand(true) - .css_classes(["start-screen-steps-box"]) - .build(); - - let icon4: gtk::Image = get_image_from_path( - modules.pages_settings.start_screen.encypt_icon.clone(), - &["start-screen-steps-icon"], - ); - - let label4: gtk::Label = gtk::Label::builder() - .label("Identity management using secure x.509 certificates") - .css_classes(["start-screen-steps-label"]) - .wrap(true) - .wrap_mode(pango::WrapMode::Word) - // .vexpand(true) - .halign(gtk::Align::Center) - .valign(gtk::Align::End) - .justify(gtk::Justification::Center) - .build(); - - hbox_line4.append(&icon4); - hbox_line4.append(&label4); - - let carousel = adw::Carousel::builder() - .hexpand(true) - .spacing(15) - .width_request(150) - .height_request(70) - // .css_classes(["carousel"]) - .build(); - - carousel.append(&hbox_line2); - carousel.append(&hbox_line3); - carousel.append(&hbox_line4); - - let carousel_dots = adw::CarouselIndicatorDots::builder().build(); - carousel_dots.set_carousel(Some(&carousel)); - - main_content_box.append(&carousel); - main_content_box.append(&carousel_dots); - - let footer_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .hexpand(true) - .valign(gtk::Align::End) - .build(); - - let back_icon_img: gtk::Image = get_image_from_path(widget_configs.footer.back_icon, &[]); - let back_button_box = gtk::Box::builder().hexpand(true).build(); - let back_button = Button::builder().build(); - back_button.set_child(Some(&back_icon_img)); - back_button.add_css_class("footer-container-button"); - - back_button.connect_clicked(clone!(@strong sender => move |_| { - let _ = sender.output(StartScreenOutput::BackPressed); - })); - - let next_icon_img: gtk::Image = get_image_from_path(widget_configs.footer.next_icon, &[]); - let next_button = Button::new(); - next_button.set_child(Some(&next_icon_img)); - next_button.add_css_class("footer-container-button"); - - next_button.connect_clicked(clone!(@strong sender => move |_| { - let sender: AsyncComponentSender = sender.clone(); - let _ = check_machine_provision(sender); - })); - - back_button_box.append(&back_button); - footer_box.append(&back_button_box); - footer_box.append(&next_button); - - footer_content_box.append(&footer_box); - main_content_box.append(&footer_content_box); - main_container.append(&main_content_box); // main box - - root.append(&main_container); - - let widgets = AppWidgets {}; - - AsyncComponentParts { model, widgets } - } - - async fn update( - &mut self, - message: Self::Input, - sender: AsyncComponentSender, - _root: &Self::Root, - ) { - } -} - -fn check_machine_provision(sender: AsyncComponentSender) { - let fn_name = "check_machine_provision"; - info!( - func = fn_name, - package = PACKAGE_NAME, - "Start screen - get provision status" - ); - - let _ = relm4::spawn(async move { - let _ = match machine_provision_status().await { - Ok(response) => { - if response.status == true { - debug!( - fn_name, - package = PACKAGE_NAME, - "provision completed ==> check machine info" - ); - - let machine_id_response = get_machine_id().await; - - let mut machine_id = String::from("-"); - machine_id = match machine_id_response { - Ok(resp) => { - let mut machine_id = String::from("-"); - if !resp.machine_id.is_empty() { - machine_id = resp.machine_id - } - println!("start_screen::machine_id {:?}", machine_id); - machine_id - } - Err(e) => { - error!( - func = fn_name, - package = PACKAGE_NAME, - "start_screen::get_machine_id::error {:?}", - e - ); - String::from("-") - } - }; - println!("after::start_screen::machine_id {:?}", machine_id); - let _ = sender - .output_sender() - .send(StartScreenOutput::ShowMachineInfo(machine_id)); - } else { - debug!( - fn_name, - package = PACKAGE_NAME, - "provision not done ==> moving to check internet" - ); - let _ = sender - .output_sender() - .send(StartScreenOutput::ShowCheckInternet); - } - } - Err(e) => { - error!( - func = fn_name, - package = PACKAGE_NAME, - "Error - getting provision status{:?}", - e - ); - let _ = sender - .output_sender() - .send(StartScreenOutput::ShowCheckInternet); - } - }; - }); -} diff --git a/client/app/src/pages/timeout_screen.rs b/client/app/src/pages/timeout_screen.rs deleted file mode 100644 index d93fb67f..00000000 --- a/client/app/src/pages/timeout_screen.rs +++ /dev/null @@ -1,119 +0,0 @@ -use crate::{ - settings::{Modules, WidgetConfigs}, - utils, -}; -use gtk::prelude::*; -use relm4::{ - gtk::{ - self, - glib::clone, - prelude::{ButtonExt, WidgetExt}, - Button, - }, - ComponentParts, ComponentSender, SimpleComponent, -}; -use utils::get_image_from_path; - -pub struct Settings { - pub modules: Modules, - pub widget_configs: WidgetConfigs, -} - -pub struct TimeoutScreen { - settings: Settings, -} - -#[derive(Debug)] -pub enum TimeoutOutput { - refreshPressed, - BackPressed, // tmep -} - -pub struct AppWidgets {} - -impl SimpleComponent for TimeoutScreen { - type Init = Settings; - type Input = (); - type Output = TimeoutOutput; - type Root = gtk::Box; - type Widgets = AppWidgets; - - fn init_root() -> Self::Root { - gtk::Box::builder().build() - } - - fn init( - init: Self::Init, - root: Self::Root, - sender: ComponentSender, - ) -> relm4::ComponentParts { - let modules = init.modules.clone(); - let widget_configs = init.widget_configs.clone(); - let model = TimeoutScreen { settings: init }; - - let main_content_box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .css_classes(["app-container", "check-internet-text"]) - .build(); - - let footer_content_box: gtk::Box = gtk::Box::builder() - .orientation(gtk::Orientation::Vertical) - .vexpand(true) - .valign(gtk::Align::End) - .css_classes(["footer-container"]) - .build(); - - let image_path: Option = - modules.pages_settings.timeout_screen.timeout_image.clone(); - let timeout_image: gtk::Image = get_image_from_path(image_path, &["timeout-img"]); - - let label1 = gtk::Label::builder() - .label("Request timed out, please try again") - .hexpand(true) - .build(); - - main_content_box.append(&timeout_image); - main_content_box.append(&label1); - - // footer_box - let footer_box = gtk::Box::builder() - .orientation(gtk::Orientation::Horizontal) - .hexpand(true) - .valign(gtk::Align::End) - .build(); - - let refresh_icon_img: gtk::Image = - get_image_from_path(widget_configs.footer.refresh_icon, &[]); - let refresh_button = Button::new(); - refresh_button.set_child(Some(&refresh_icon_img)); - refresh_button.add_css_class("footer-container-button"); - - refresh_button.connect_clicked(clone!(@strong sender => move |_| { - // let _ = sender.output(SetupFailOutput::NextPressed); - let _ = sender.output(TimeoutOutput::refreshPressed); - })); - let button_box = gtk::Box::builder().hexpand(true).build(); - - let back_icon_img: gtk::Image = get_image_from_path(widget_configs.footer.back_icon, &[]); - let back_button = Button::builder().build(); - back_button.set_child(Some(&back_icon_img)); - back_button.add_css_class("footer-container-button"); - - back_button.connect_clicked(clone!(@strong sender => move |_| { - let _ = sender.output(TimeoutOutput::BackPressed); - })); - - // button_box.append(&back_button); // temp - remove later - footer_box.append(&button_box); - footer_box.append(&refresh_button); - - footer_content_box.append(&footer_box); - main_content_box.append(&footer_content_box); - - root.append(&main_content_box); - - let widgets = AppWidgets {}; - - ComponentParts { model, widgets } - } -} diff --git a/client/app/src/routes/+layout.svelte b/client/app/src/routes/+layout.svelte new file mode 100644 index 00000000..50bcce34 --- /dev/null +++ b/client/app/src/routes/+layout.svelte @@ -0,0 +1,5 @@ + + + \ No newline at end of file diff --git a/client/app/src/routes/+layout.ts b/client/app/src/routes/+layout.ts new file mode 100644 index 00000000..9b6b3ca8 --- /dev/null +++ b/client/app/src/routes/+layout.ts @@ -0,0 +1,2 @@ +export const prerender = true +export const ssr = false \ No newline at end of file diff --git a/client/app/src/routes/+page.svelte b/client/app/src/routes/+page.svelte new file mode 100644 index 00000000..ff6783e6 --- /dev/null +++ b/client/app/src/routes/+page.svelte @@ -0,0 +1,101 @@ + + + +
+
+ + + +
+ + + +
+ +

+ Mesh Networking to enable global connectivity between your machines +

+
+
+ +
+ +

+ Integrated metrics and logs collection, compatible with OpenTelemetry +

+
+
+ +
+ +

+ Identity management using secure x.509 certificates +

+
+
+
+
+
+
+
+
+ + +
+
+
diff --git a/client/app/src/routes/check-internet/+page.svelte b/client/app/src/routes/check-internet/+page.svelte new file mode 100644 index 00000000..51ea6a48 --- /dev/null +++ b/client/app/src/routes/check-internet/+page.svelte @@ -0,0 +1,57 @@ + + + +
+
+
+ check internet +
+
+ Checking for internet connectivity ... +
+
+
+ +
+
+ +
+
+
diff --git a/client/app/src/routes/configure-machine/+page.svelte b/client/app/src/routes/configure-machine/+page.svelte new file mode 100644 index 00000000..d8ad86fd --- /dev/null +++ b/client/app/src/routes/configure-machine/+page.svelte @@ -0,0 +1,62 @@ + + + +
+
+
+ searching info +
+
+ Fetching Machine Information ... +
+
+
+ +
+
diff --git a/client/app/src/routes/link-machine/+page.svelte b/client/app/src/routes/link-machine/+page.svelte new file mode 100644 index 00000000..4f563ce5 --- /dev/null +++ b/client/app/src/routes/link-machine/+page.svelte @@ -0,0 +1,140 @@ + + + +
+
+ + +
+
+ {provision_code} +
+
+ + +
+
+
1
+

Create a new account on Mecha, if not signed up eardiver.

+
+
+
2
+

Navigate to Machines > Add Machine

+
+
+
3
+

Enter the code shown above when asked

+
+
+
+ +
+
+ +
+
+
diff --git a/client/app/src/routes/machine-info/+page.svelte b/client/app/src/routes/machine-info/+page.svelte new file mode 100644 index 00000000..e99d5df2 --- /dev/null +++ b/client/app/src/routes/machine-info/+page.svelte @@ -0,0 +1,167 @@ + + + +
+
+
+ Machine Profile +
+ +
+

{$machineInfo.name}

+ + {#if is_active} + + {:else} + + {/if} +
+
+ +
+
MACHINE ID
+
{$machineInfo.id}
+
+ +
+ You can unlink your machine from your Mecha account +
+ + + + + + + + {error_message} + + + + + + + + + + + + + + + + Fetching machine information... + + + + + + + +
+
+
+ +
+
+
diff --git a/client/app/src/routes/no-internet/+page.svelte b/client/app/src/routes/no-internet/+page.svelte new file mode 100644 index 00000000..20a60ca8 --- /dev/null +++ b/client/app/src/routes/no-internet/+page.svelte @@ -0,0 +1,39 @@ + + + +
+
+
+ check internet +
+
+ Connect to Internet to complete the setup +
+
+
+ +
+
+ + +
+
+
diff --git a/client/app/src/routes/setup-failed/+page.svelte b/client/app/src/routes/setup-failed/+page.svelte new file mode 100644 index 00000000..54da9502 --- /dev/null +++ b/client/app/src/routes/setup-failed/+page.svelte @@ -0,0 +1,47 @@ + + + +
+
+
+ setup failed +
+
+
Error connecting to service
+
+ Error : {error} +
+
+
+
+ +
+
+ + +
+
+
diff --git a/client/app/src/routes/setup-success/+page.svelte b/client/app/src/routes/setup-success/+page.svelte new file mode 100644 index 00000000..9a5e68bc --- /dev/null +++ b/client/app/src/routes/setup-success/+page.svelte @@ -0,0 +1,42 @@ + + + +
+
+
+ check internet +
+
Machine is now connected to your Mecha account
+
+
+ +
+
+ + +
+
+
diff --git a/client/app/src/routes/timeout-service/+page.svelte b/client/app/src/routes/timeout-service/+page.svelte new file mode 100644 index 00000000..2ee45c35 --- /dev/null +++ b/client/app/src/routes/timeout-service/+page.svelte @@ -0,0 +1,32 @@ + + + +
+
+
+ check internet +
+
+ Request timed out, please try again +
+
+
+ +
+
+ +
+
+
diff --git a/client/app/src/server/mod.rs b/client/app/src/server/mod.rs deleted file mode 100644 index 74eeeac0..00000000 --- a/client/app/src/server/mod.rs +++ /dev/null @@ -1,3 +0,0 @@ -pub mod identity_client; -pub mod provision_client; -pub mod settings_client; diff --git a/client/app/src/services.rs b/client/app/src/services.rs deleted file mode 100644 index 1f537848..00000000 --- a/client/app/src/services.rs +++ /dev/null @@ -1,182 +0,0 @@ -use std::time::Duration; - -use crate::server::{ - identity_client::{GetMachineCertResponse, GetMachineIdResponse, IdentityClient}, - settings_client::{GetSettingsResponse, SettingsClient}, -}; -use anyhow::{bail, Result}; -use tracing::warn; - -const PACKAGE_NAME: &str = env!("CARGO_PKG_NAME"); - -#[derive(Debug, Clone)] -pub struct MachineInformation { - pub machine_id: String, - pub name: String, - pub icon: Option, -} -#[derive(Debug, Clone)] -pub struct MachineInformationResponse { - pub machine_information: MachineInformation, -} - -impl MachineInformation { - pub fn new() -> Self { - Self { - machine_id: String::from(""), - name: String::from(""), - icon: Some(String::from("")), - } - } -} - -pub async fn get_machine_id() -> Result { - let mut service_client = match IdentityClient::new().await { - Ok(r) => r, - Err(e) => { - bail!(e); - } - }; - - let response: GetMachineIdResponse = match service_client.getting_machine_id().await { - Ok(response) => response.into(), - Err(e) => { - tracing::debug!( - func = "services -> get_machine_id", - package = env!("CARGO_PKG_NAME"), - "API Error {:?}", - e - ); - bail!(e); - } - }; - - Ok(response) -} - -pub async fn get_machine_name_or_icon(key: String) -> Result { - let request = SettingsClient::new().await; - - let mut service_client = match request { - Ok(r) => r, - Err(e) => { - bail!(e); - } - }; - - let response: GetSettingsResponse = match service_client.get_settings_data(key.clone()).await { - Ok(response) => response.into(), - Err(e) => { - tracing::debug!( - func = "services -> get_machine_name_or_icon", - package = env!("CARGO_PKG_NAME"), - "API Request Key {:?} Error {:?}", - key.clone(), - e - ); - bail!(e); - } - }; - - Ok(response) -} - -pub async fn get_machine_cert_details() -> Result { - let identity_client_response = IdentityClient::new().await; - let mut identity_client: IdentityClient = match identity_client_response { - Ok(result) => result.into(), - Err(e) => { - tracing::debug!( - func = "services -> get_machine_cert_details", - package = env!("CARGO_PKG_NAME"), - "API Error {:?}", - e - ); - bail!(e); - } - }; - - let response: GetMachineCertResponse = match identity_client.get_machine_cert_details().await { - Ok(response) => response.into(), - Err(e) => { - tracing::debug!( - func = "services -> get_machine_cert_details", - package = env!("CARGO_PKG_NAME"), - "API Error {:?}", - e - ); - bail!(e); - } - }; - Ok(response) -} - -pub async fn get_machine_info() -> Result { - let fn_name: &str = "get_machine_info"; - - let machine_id_response = get_machine_id().await; - - let _ = tokio::time::sleep(Duration::from_secs(2)).await; - let machine_name_response = - get_machine_name_or_icon(String::from("identity.machine.name")).await; - - let machine_icon_response = - get_machine_name_or_icon(String::from("identity.machine.icon_base64")).await; - - // let machine_cert_details = get_machine_cert_details().await; - - let response = MachineInformation { - machine_id: match machine_id_response { - Ok(resp) => { - let mut machine_id = String::from("-"); - if resp.machine_id != "" { - machine_id = resp.machine_id - } - machine_id - } - Err(e) => { - bail!(e); - } - }, - name: match machine_name_response { - Ok(resp) => { - let mut machine_name = String::from("My Machine"); - if resp.value != "" { - machine_name = resp.value - } - machine_name - } - Err(e) => { - bail!(e); - } - }, - icon: match machine_icon_response { - Ok(resp) => { - let mut machine_icon = Some(String::from("")); - if !resp.value.is_empty() { - let value = match resp.value.split(",").last() { - Some(result) => result, - None => "", - }; - machine_icon = Some(value.to_string()) - } else { - println!( - "get_machine_info::EMPTY machine_icon_response========> {:?} ", - resp.value - ); - warn!( - func = fn_name, - package = PACKAGE_NAME, - "EMPTY machine_icon_response========> {:?} ", - resp.value - ); - } - machine_icon - } - Err(e) => { - bail!(e); - } - }, - }; - Ok(response) -} diff --git a/client/app/src/settings/mod.rs b/client/app/src/settings/mod.rs deleted file mode 100644 index e7997f3c..00000000 --- a/client/app/src/settings/mod.rs +++ /dev/null @@ -1,343 +0,0 @@ -use crate::errors::{ScreenError, ScreenErrorCodes}; -use anyhow::bail; -use anyhow::Result; -use serde::{Deserialize, Serialize}; -use std::{env, fs::File, path::PathBuf}; -use tracing::debug; - -#[derive(Debug, Deserialize, Clone, Serialize)] -pub struct ScreenSettings { - pub window: WindowSettings, // Window Settings - pub modules: Modules, - pub widget_configs: WidgetConfigs, - pub css: CssConfigs, -} - -impl Default for ScreenSettings { - fn default() -> Self { - Self { - window: WindowSettings::default(), - modules: Modules::default(), - css: CssConfigs::default(), - widget_configs: WidgetConfigs::default(), - } - } -} - -/// # Window Settings -/// -/// Part of the settings.yml to control the behavior of -/// the application window -#[derive(Debug, Deserialize, Clone, Serialize)] -pub struct WindowSettings { - pub size: (i32, i32), // Size of the window - pub position: (i32, i32), // Default position to start window - pub min_size: Option<(u32, u32)>, // Minimum size the window can be resized to - pub max_size: Option<(u32, u32)>, // Maximum size the window can be resized to - pub visible: bool, // Sets visibility of the window - pub resizable: bool, // Enables or disables resizing - pub decorations: bool, // Enables or disables the title bar - pub transparent: bool, // Enables transparency - pub always_on_top: bool, // Forces window to be always on top - pub icon_path: Option, -} - -impl Default for WindowSettings { - fn default() -> Self { - Self { - size: (480, 480), - position: (0, 0), - min_size: None, - max_size: None, - visible: true, - resizable: true, - decorations: true, - transparent: false, - always_on_top: false, - icon_path: None, - } - } -} - -#[derive(Debug, Deserialize, Clone, Serialize)] -pub struct Modules { - pub pages_settings: PagesSettings, -} -impl Default for Modules { - fn default() -> Self { - Self { - pages_settings: PagesSettings::default(), - } - } -} - -/// # Custom Widgets config -/// -/// Custom Widgets config -#[derive(Debug, Deserialize, Clone, Serialize)] -pub struct WidgetConfigs { - pub footer: FooterWidgetConfigs, -} - -impl Default for WidgetConfigs { - fn default() -> Self { - Self { - footer: FooterWidgetConfigs::default(), - } - } -} - -#[derive(Debug, Deserialize, Clone, Serialize)] -pub struct FooterWidgetConfigs { - pub back_icon: Option, - pub next_icon: Option, - pub settings_icon: Option, - pub refresh_icon: Option, - pub exit_icon: Option, - pub trash_icon: Option, -} - -impl Default for FooterWidgetConfigs { - fn default() -> Self { - Self { - back_icon: None, - next_icon: None, - settings_icon: None, - refresh_icon: None, - exit_icon: None, - trash_icon: None, - } - } -} - -#[derive(Debug, Deserialize, Clone, Serialize)] -pub struct PagesSettings { - pub start_screen: StartScreenSettings, - pub check_internet: CheckInternetSettings, - pub no_internet: NoInternetSettings, - pub configure_machine: ConfigureMachineSettings, - pub setup_success: SetupSuccessSettings, - pub setup_failure: SetupFailedSettings, - pub device_info: DeviceInfoSettings, - pub timeout_screen: TimeoutScreenSettings, -} - -impl Default for PagesSettings { - fn default() -> Self { - Self { - start_screen: StartScreenSettings::default(), - check_internet: CheckInternetSettings::default(), - no_internet: NoInternetSettings::default(), - configure_machine: ConfigureMachineSettings::default(), - setup_success: SetupSuccessSettings::default(), - setup_failure: SetupFailedSettings::default(), - device_info: DeviceInfoSettings::default(), - timeout_screen: TimeoutScreenSettings::default(), - } - } -} - -#[derive(Debug, Deserialize, Clone, Serialize)] -pub struct StartScreenSettings { - pub app_icon: Option, - pub virtual_network_icon: Option, - pub real_time_icon: Option, - pub encypt_icon: Option, - pub info_icon: Option, -} - -impl Default for StartScreenSettings { - fn default() -> Self { - Self { - app_icon: None, - virtual_network_icon: None, - real_time_icon: None, - encypt_icon: None, - info_icon: None, - } - } -} - -#[derive(Debug, Deserialize, Clone, Serialize)] -pub struct TimeoutScreenSettings { - pub timeout_image: Option, -} - -impl Default for TimeoutScreenSettings { - fn default() -> Self { - Self { - timeout_image: None, - } - } -} - -#[derive(Debug, Deserialize, Clone, Serialize)] -pub struct CheckInternetSettings { - pub search_wifi: Option, -} - -impl Default for CheckInternetSettings { - fn default() -> Self { - Self { search_wifi: None } - } -} - -#[derive(Debug, Deserialize, Clone, Serialize)] -pub struct NoInternetSettings { - pub no_internet_found: Option, -} - -impl Default for NoInternetSettings { - fn default() -> Self { - Self { - no_internet_found: None, - } - } -} - -#[derive(Debug, Deserialize, Clone, Serialize)] -pub struct ConfigureMachineSettings { - pub machine_searching: Option, -} - -impl Default for ConfigureMachineSettings { - fn default() -> Self { - Self { - machine_searching: None, - } - } -} - -#[derive(Debug, Deserialize, Clone, Serialize)] -pub struct SetupSuccessSettings { - pub success: Option, -} - -impl Default for SetupSuccessSettings { - fn default() -> Self { - Self { success: None } - } -} - -#[derive(Debug, Deserialize, Clone, Serialize)] -pub struct SetupFailedSettings { - pub failure: Option, -} - -impl Default for SetupFailedSettings { - fn default() -> Self { - Self { failure: None } - } -} - -#[derive(Debug, Deserialize, Clone, Serialize)] -pub struct DeviceInfoSettings { - pub user_profile_img: Option, - pub active_status_icon: Option, - pub not_active_status_icon: Option, -} - -impl Default for DeviceInfoSettings { - fn default() -> Self { - Self { - user_profile_img: None, - active_status_icon: None, - not_active_status_icon: None, - } - } -} - -#[derive(Debug, Deserialize, Clone, Serialize)] -pub struct CssConfigs { - pub default: String, -} - -impl Default for CssConfigs { - fn default() -> Self { - Self { - default: "".to_string(), - } - } -} - -/// # Reads Settings path from arg -/// -/// Reads the `-s` or `--settings` argument for the path -pub fn read_settings_path_from_args() -> Option { - let args: Vec = env::args().collect(); - if args.len() > 2 && (args[1] == "-s" || args[1] == "--settings") { - println!("Using settings path from argument - {}", args[2]); - debug!("Using settings path from argument - {}", args[2]); - return Some(String::from(args[2].clone())); - } - None -} - -/// # Reads Settings YML -/// -/// Reads the `settings.yml` and parsers to pages/screens -/// -/// **Important**: Ensure all fields are present in the yml due to strict parsing -pub fn read_settings_yml() -> Result { - let mut file_path = PathBuf::from( - std::env::var("MECHA_CONNECT_APP_SETTINGS_PATH").unwrap_or(String::from("settings.yml")), - ); // Get path of the library - println!( - "settings::mod::read_settings_yml-file_path : {:?}", - file_path - ); - - // read from args - let file_path_in_args = read_settings_path_from_args(); - if file_path_in_args.is_some() { - file_path = PathBuf::from(file_path_in_args.unwrap()); - println!( - "IF read_settings_yml::settings file location - {:?}", - file_path - ); - } - println!( - "read_settings_yml::settings file location - {:?}", - file_path - ); - tracing::info!( - func = "read_settings", - package = env!("CARGO_PKG_NAME"), - "settings file location - {:?}", - file_path, - ); - - tracing::info!("CHECKING LOGS"); - - // open file - let settings_file_handle = match File::open(file_path) { - Ok(file) => { - tracing::info!( - func = "read_settings", - package = env!("CARGO_PKG_NAME"), - "settings_file_handle::open file" - ); - file - } - Err(e) => { - eprintln!("cannot read the settings.yml in the path - {}", e); - bail!(ScreenError::new( - ScreenErrorCodes::SettingsReadError, - format!("cannot read the settings.yml in the path - {}", e), - )); - } - }; - - // read and parse - let config: ScreenSettings = match serde_yaml::from_reader(settings_file_handle) { - Ok(config) => config, - Err(e) => { - bail!(ScreenError::new( - ScreenErrorCodes::SettingsParseError, - format!("error parsing the settings.yml - {}", e), - )); - } - }; - - Ok(config) -} diff --git a/client/app/src/shared/Header.svelte b/client/app/src/shared/Header.svelte new file mode 100644 index 00000000..db6cb5a6 --- /dev/null +++ b/client/app/src/shared/Header.svelte @@ -0,0 +1,7 @@ + + +
+

{title}

+
\ No newline at end of file diff --git a/client/app/src/shared/Icons.svelte b/client/app/src/shared/Icons.svelte new file mode 100644 index 00000000..f8ef746f --- /dev/null +++ b/client/app/src/shared/Icons.svelte @@ -0,0 +1,159 @@ + + +{@html displayIcon.svg} diff --git a/client/app/src/shared/SubHeader.svelte b/client/app/src/shared/SubHeader.svelte new file mode 100644 index 00000000..02db759e --- /dev/null +++ b/client/app/src/shared/SubHeader.svelte @@ -0,0 +1,6 @@ + +
+

{text}

+
\ No newline at end of file diff --git a/client/app/src/shared/layout.svelte b/client/app/src/shared/layout.svelte new file mode 100644 index 00000000..958cce5d --- /dev/null +++ b/client/app/src/shared/layout.svelte @@ -0,0 +1,20 @@ +
+ +{#if $$slots.footer} +
+ +
+{/if} + + \ No newline at end of file diff --git a/client/app/src/utils/mod.rs b/client/app/src/utils/mod.rs deleted file mode 100644 index cdf78d71..00000000 --- a/client/app/src/utils/mod.rs +++ /dev/null @@ -1,65 +0,0 @@ -use gtk::{gdk, gio}; -use relm4::gtk::{self, gdk::Texture, glib::Bytes, prelude::FileExt}; -use widgets::gif_paintable::GifPaintable; - -use crate::widgets; -use simple_base64::decode; - -pub fn get_image_from_path(path: Option, css_classes: &[&str]) -> gtk::Image { - let image = gtk::Image::builder().css_classes(css_classes).build(); - - match path { - Some(p) => { - let image_file = gio::File::for_path(p); - match gdk::Texture::from_file(&image_file) { - Ok(image_asset_paintable) => { - image.set_paintable(Option::from(&image_asset_paintable)); - } - Err(_) => (), - } - } - None => (), - } - image -} - -pub fn get_gif_from_path(gif_path: Option) -> GifPaintable { - let paintable = GifPaintable::new(); - - match gif_path { - Some(path) => { - let image_file = gio::File::for_path(path); - match image_file.load_contents(gio::Cancellable::NONE) { - Ok((bytes, _)) => { - let _ = paintable.load_from_bytes(&bytes); - } - Err(_) => (), - }; - } - None => (), - } - paintable -} - -pub fn get_texture_from_base64( - base64_string: String, -) -> Result> { - let texture_value = match decode(base64_string) { - Ok(response) => { - let bytes = Bytes::from(&response); - let texture = match gdk::Texture::from_bytes(&bytes) { - Ok(response) => response, - Err(texture_error) => { - eprintln!("ERROR::texture_error {:?} ", texture_error); - return Err(Box::new(texture_error)); - } - }; - texture - } - Err(decode_error) => { - eprintln!("ERROR::DecodeError {:?} ", decode_error); - return Err(Box::new(decode_error)); - } - }; - Ok(texture_value) -} diff --git a/client/app/src/widgets/assets/css/style.css b/client/app/src/widgets/assets/css/style.css deleted file mode 100644 index 00349565..00000000 --- a/client/app/src/widgets/assets/css/style.css +++ /dev/null @@ -1,30 +0,0 @@ -entry { - background: transparent; - color: #E4E7EE; - outline: none; - border: none; - padding: 0px; - border-radius: 4px; -} - -entry :focus { - background: transparent; - outline: none; - border: none; -} - -entry :focus-visible { - background: transparent; - outline: none; - border: none; -} - -entry :focus-within { - background: transparent; - outline: none; - border: none; -} - -.icon-input-icon-default { - padding: 10px; -} \ No newline at end of file diff --git a/client/app/src/widgets/gif_paintable/frame.rs b/client/app/src/widgets/gif_paintable/frame.rs deleted file mode 100644 index 253c8ac6..00000000 --- a/client/app/src/widgets/gif_paintable/frame.rs +++ /dev/null @@ -1,38 +0,0 @@ -use gtk::prelude::*; -use gtk::{gdk, glib}; -use relm4::gtk; -use std::time::Duration; - -pub struct Frame { - pub texture: gdk::Texture, - pub frame_duration: Duration, -} - -impl From for Frame { - fn from(f: image::Frame) -> Self { - let mut frame_duration = Duration::from(f.delay()); - - // convention is to use 100 milliseconds duration if it is defined as 0. - if frame_duration.is_zero() { - frame_duration = Duration::from_millis(100); - } - - let samples = f.into_buffer().into_flat_samples(); - - let bytes = glib::Bytes::from(samples.as_slice()); - let layout = samples.layout; - - let texture = gdk::MemoryTexture::new( - layout.width as i32, - layout.height as i32, - gdk::MemoryFormat::R8g8b8a8, - &bytes, - layout.height_stride, - ); - - Frame { - texture: texture.upcast(), - frame_duration, - } - } -} diff --git a/client/app/src/widgets/gif_paintable/imp.rs b/client/app/src/widgets/gif_paintable/imp.rs deleted file mode 100644 index 33044097..00000000 --- a/client/app/src/widgets/gif_paintable/imp.rs +++ /dev/null @@ -1,54 +0,0 @@ -use std::cell::{Cell, RefCell}; - -use gtk::prelude::*; -use gtk::subclass::prelude::*; -use gtk::{gdk, glib, graphene}; -use relm4::gtk; - -use super::Frame; - -#[derive(Default)] -pub struct GifPaintable { - pub frames: RefCell>>, - pub next_frame: RefCell>, - pub timeout_source_id: RefCell>, - pub current_idx: Cell, -} - -#[glib::object_subclass] -impl ObjectSubclass for GifPaintable { - const NAME: &'static str = "GifPaintable"; - type Type = super::GifPaintable; - type Interfaces = (gdk::Paintable,); -} - -impl ObjectImpl for GifPaintable {} - -impl PaintableImpl for GifPaintable { - fn intrinsic_height(&self) -> i32 { - self.next_frame - .borrow() - .as_ref() - .map(|texture| texture.height()) - .unwrap_or(-1) - } - - fn intrinsic_width(&self) -> i32 { - self.next_frame - .borrow() - .as_ref() - .map(|texture| texture.width()) - .unwrap_or(-1) - } - - fn snapshot(&self, snapshot: &gdk::Snapshot, width: f64, height: f64) { - if let Some(texture) = &*self.next_frame.borrow() { - texture.snapshot(snapshot, width, height); - } else { - snapshot.append_color( - &gdk::RGBA::BLACK, - &graphene::Rect::new(0f32, 0f32, width as f32, height as f32), - ); - } - } -} diff --git a/client/app/src/widgets/gif_paintable/mod.rs b/client/app/src/widgets/gif_paintable/mod.rs deleted file mode 100644 index 955b57f1..00000000 --- a/client/app/src/widgets/gif_paintable/mod.rs +++ /dev/null @@ -1,106 +0,0 @@ -mod imp; -mod frame; - -use relm4::gtk; -use std::io::Cursor; - -use frame::Frame; -use gtk::prelude::*; -use gtk::subclass::prelude::*; -use gtk::{gdk, glib}; -use image::{codecs::gif::GifDecoder, AnimationDecoder}; - -glib::wrapper! { - pub struct GifPaintable(ObjectSubclass) @implements gdk::Paintable; -} - -impl GifPaintable { - pub fn new() -> Self { - glib::Object::new() - } - - /// Loads the bytes of a GIF into the paintable. - /// - /// The loading consists of decoding the gif with a GIFDecoder, then storing - /// the frames so that the paintable can render them. - pub fn load_from_bytes(&self, bytes: &[u8]) -> Result<(), Box> { - let imp = self.imp(); - imp.current_idx.set(0); - - if let Some(source_id) = imp.timeout_source_id.take() { - source_id.remove(); - } - - let read = Cursor::new(bytes); - - // Images from unknown origins make a program vulnerable to - // decompression bombs. That is, malicious images crafted specifically - // to require an enormous amount of memory to process while having a - // disproportionately small file size. - // - // By default, `GifDecoder::new()` limits the allocation of a single - // frame to 50MB, but it can be restricted further with - // `GifDecoder::with_limits()`. - // - // An safety measure to guard against that would be to process each - // frame as needed instead of loading them all with `collect_frames()`. - let decoder = GifDecoder::new(read)?; - - let frames = decoder - .into_frames() - .collect_frames()? - .into_iter() - .map(Frame::from) - .collect::>(); - - imp.frames.replace(Some(frames)); - - // make sure the first frame is queued to play - self.setup_next_frame(); - - Ok(()) - } - - fn setup_next_frame(&self) { - let imp = self.imp(); - let idx = imp.current_idx.get(); - let frames_ref = imp.frames.borrow(); - - // if we have stored no frames then we early return early - // and instead render a default frame in `imp::GifPaintable::snapshot` - let frames = match &*frames_ref { - Some(frames) => frames, - None => return, - }; - - let next_frame = frames.get(idx).unwrap(); - imp.next_frame.replace(Some(next_frame.texture.clone())); - - // invalidate the contents so that the new frame will be rendered - self.invalidate_contents(); - - // setup a callback to this function once the frame has finished so that - // we can play the next frame - let update_next_frame_callback = glib::clone!(@weak self as paintable => move || { - paintable.imp().timeout_source_id.take(); - paintable.setup_next_frame(); - }); - - let source_id = - glib::timeout_add_local_once(next_frame.frame_duration, update_next_frame_callback); - imp.timeout_source_id.replace(Some(source_id)); - - // setup the index for the next call to setup_next_frame - let mut new_idx = idx + 1; - if new_idx >= frames.len() { - new_idx = 0; - } - imp.current_idx.set(new_idx); - } -} - -impl Default for GifPaintable { - fn default() -> Self { - Self::new() - } -} \ No newline at end of file diff --git a/client/app/src/widgets/icon_button.rs b/client/app/src/widgets/icon_button.rs deleted file mode 100644 index 414f362f..00000000 --- a/client/app/src/widgets/icon_button.rs +++ /dev/null @@ -1,194 +0,0 @@ -use gtk::{gdk, gio, glib::clone, prelude::*}; -use relm4::{ - gtk::{self, GestureClick}, - ComponentParts, RelmWidgetExt, SimpleComponent, -}; -use tracing::info; - -#[derive(Debug, Clone)] -pub struct IconButtonCss { - root_container: Option>, - container: Option>, - container_pressing: Option, - icon: Option>, -} - -impl Default for IconButtonCss { - fn default() -> Self { - Self { - root_container: Option::from(vec!["icon-button-root-default".to_string()]), - container: Option::from(vec!["icon-button-container-default".to_string()]), - container_pressing: Option::from("icon-button-container-pressing-default".to_string()), - icon: Option::from(vec!["icon-button-icon-default".to_string()]), - } - } -} - -#[derive(Debug)] -pub struct InitSettings { - pub icon: Option, - pub toggle_icon: Option, - pub css: IconButtonCss, -} - -#[derive(Debug)] -pub enum InputMessage { - Pressed, - Released, -} - -#[derive(Debug)] -pub enum OutputMessage { - Clicked, -} - -pub struct IconButton { - settings: InitSettings, - is_in_pressing_state: bool, -} - -pub struct ComponentWidgets { - container_box: gtk::Box, - icon_image: gtk::Image, -} - -impl SimpleComponent for IconButton { - type Input = InputMessage; - - type Output = OutputMessage; - - type Init = InitSettings; - - type Root = gtk::Box; - - type Widgets = ComponentWidgets; - - fn init_root() -> Self::Root { - let root_box = gtk::Box::builder() - .valign(gtk::Align::Center) - .hexpand(false) - .vexpand(false) - .build(); - root_box - } - - fn init( - init: Self::Init, - root: Self::Root, - sender: relm4::ComponentSender, - ) -> relm4::ComponentParts { - info!("icon button init called"); - - match init.css.root_container.to_owned() { - Some(css) => root.set_css_classes(&[css.join(",").as_str()]), - None => (), - } - - let container_box = gtk::Box::builder() - .valign(gtk::Align::Center) - .hexpand(true) - .vexpand(true) - .build(); - - match init.css.container.to_owned() { - Some(css) => container_box.set_css_classes(&[css.join(",").as_str()]), - None => (), - } - - let icon = init.icon.clone(); - let icon_image = gtk::Image::builder().hexpand(true).vexpand(true).build(); - match icon.to_owned() { - Some(icon) => { - let icon_file = gio::File::for_path(icon); - let asset_paintable = gdk::Texture::from_file(&icon_file).unwrap(); - icon_image.set_paintable(Option::from(&asset_paintable)); - match init.css.icon.to_owned() { - Some(css) => icon_image.set_css_classes(&[css.join(",").as_str()]), - None => (), - }; - container_box.append(&icon_image); - - let left_click_gesture = GestureClick::builder().button(0).build(); - left_click_gesture.connect_pressed(clone!(@strong sender => move |this, _, _,_| { - info!("gesture button pressed is {}", this.current_button()); - sender.input_sender().send(InputMessage::Pressed); - - })); - - left_click_gesture.connect_released(clone!(@strong sender => move |this, _, _,_| { - info!("gesture button released is {}", this.current_button()); - sender.input_sender().send(InputMessage::Released); - - })); - root.add_controller(left_click_gesture); - } - None => (), - } - - root.append(&container_box); - - let model = IconButton { - settings: init, - is_in_pressing_state: false, - }; - - let widgets = ComponentWidgets { - container_box, - icon_image, - }; - - ComponentParts { model, widgets } - } - - fn update(&mut self, message: Self::Input, sender: relm4::ComponentSender) { - info!("icon button update message {:?}", message); - match message { - InputMessage::Pressed => { - self.is_in_pressing_state = true; - } - InputMessage::Released => { - self.is_in_pressing_state = false; - let _ = sender.output_sender().send(OutputMessage::Clicked); - } - } - } - - fn update_view(&self, widgets: &mut Self::Widgets, sender: relm4::ComponentSender) { - match self.settings.css.container_pressing.to_owned() { - Some(css) => { - widgets - .container_box - .set_class_active(&css.as_str(), self.is_in_pressing_state); - } - None => (), - } - match self.settings.toggle_icon.to_owned() { - Some(icon) => match self.is_in_pressing_state { - true => { - widgets.icon_image.set_file(Option::from(icon.as_str())); - } - false => { - widgets - .icon_image - .set_file(Option::from(self.settings.icon.clone().unwrap().as_str())); - } - }, - None => (), - } - } - - fn shutdown(&mut self, widgets: &mut Self::Widgets, output: relm4::Sender) { - info!("icon button sutdown called"); - } -} - -// fn load_image(icon: String, hexpand: bool, vexpand: bool) -> gtk::Image { -// let icon_file = gio::File::for_path(icon); -// let asset_paintable = gdk::Texture::from_file(&icon_file).unwrap(); -// let image = gtk::Image::builder() -// .hexpand(hexpand) -// .vexpand(vexpand) -// .build(); -// image.set_paintable(Option::from(&asset_paintable)); -// image -// } diff --git a/client/app/src/widgets/icon_input.rs b/client/app/src/widgets/icon_input.rs deleted file mode 100644 index b563fb1e..00000000 --- a/client/app/src/widgets/icon_input.rs +++ /dev/null @@ -1,257 +0,0 @@ -use gtk::gdk::Display; -use gtk::{gdk, gio, glib::clone, prelude::*}; -use relm4::gtk::STYLE_PROVIDER_PRIORITY_APPLICATION; -use relm4::{ - gtk::{self, CssProvider, GestureClick}, - ComponentParts, RelmWidgetExt, SimpleComponent, -}; -use tracing::info; - -#[derive(Debug, Clone)] -pub struct IconInputCss { - root_container: Option>, - root_container_focused: Option>, - container: Option>, - icon: Option>, -} - -impl Default for IconInputCss { - fn default() -> Self { - Self { - root_container: Option::from(vec!["icon-input-root-default".to_string()]), - root_container_focused: Option::from(vec![ - "icon-input-root-focused-default".to_string() - ]), - container: Option::from(vec!["icon-input-container-default".to_string()]), - icon: Option::from(vec!["icon-input-icon-default".to_string()]), - } - } -} - -#[derive(Default, Debug, Clone)] -pub enum IconPosition { - #[default] - Left, - Right, -} - -#[derive(Debug, Clone)] -pub struct IconSettings { - pub path: String, - pub position: IconPosition, -} - -#[derive(Debug, Clone)] -pub struct InitSettings { - pub placeholder: Option, - pub icon: Option, - pub clear_icon: Option, - pub css: IconInputCss, -} - -#[derive(Debug)] -pub enum InputMessage { - InputChange(String), - InputFocusEnter, - InputFocusLeave, - Clear, -} - -#[derive(Debug)] -pub enum OutputMessage { - InputChange(String), -} - -pub struct IconInput { - settings: InitSettings, - view_password: bool, - is_focused: bool, - input: gtk::Entry, -} - -pub struct ComponentWidgets { - container_box: gtk::Box, - icon_image: gtk::Image, - root: gtk::Box, - clear_icon_image: gtk::Image, -} - -impl SimpleComponent for IconInput { - type Input = InputMessage; - - type Output = OutputMessage; - - type Init = InitSettings; - - type Root = gtk::Box; - - type Widgets = ComponentWidgets; - - fn init_root() -> Self::Root { - // The CSS "magic" happens here. - let provider = CssProvider::new(); - //provider.load_from_data(include_str!("assets/css/style.css")); - // We give the CssProvided to the default screen so the CSS rules we added - // can be applied to our window. - gtk::style_context_add_provider_for_display( - &Display::default().expect("Could not connect to a display."), - &provider, - STYLE_PROVIDER_PRIORITY_APPLICATION, - ); - let root_box = gtk::Box::builder() - .hexpand(true) - .vexpand(false) - .orientation(gtk::Orientation::Horizontal) - .build(); - root_box - } - - fn init( - init: Self::Init, - root: Self::Root, - sender: relm4::ComponentSender, - ) -> relm4::ComponentParts { - info!("icon button init called"); - - match init.css.root_container.to_owned() { - Some(css) => root.set_css_classes(&[css.join(",").as_str()]), - None => (), - } - - let container_box = gtk::Box::builder() - .valign(gtk::Align::Center) - .hexpand(true) - .vexpand(true) - .build(); - - match init.css.container.to_owned() { - Some(css) => container_box.set_css_classes(&[css.join(",").as_str()]), - None => (), - } - - let input = gtk::Entry::builder().hexpand(true).build(); - - let event_controller = gtk::EventControllerFocus::builder().build(); - - event_controller.connect_enter(clone!(@strong sender => move |_| { - sender.input(InputMessage::InputFocusEnter); - })); - - event_controller.connect_leave(clone!(@strong sender => move |_| { - sender.input(InputMessage::InputFocusLeave); - })); - - input.add_controller(event_controller); - - input.connect_changed(clone!(@strong sender => move |entry| { - sender.input(InputMessage::InputChange(entry.text().into())); - })); - - let icon_image = gtk::Image::builder().hexpand(false).vexpand(false).build(); - - match init.placeholder.clone() { - Some(placeholder) => { - input.set_placeholder_text(Option::from(placeholder.as_str())); - } - None => (), - } - - root.append(&input); - - match init.icon.clone() { - Some(icon) => { - let icon_file = gio::File::for_path(icon.path); - let asset_paintable = gdk::Texture::from_file(&icon_file).unwrap(); - icon_image.set_paintable(Option::from(&asset_paintable)); - match init.css.icon.to_owned() { - Some(css) => icon_image.set_css_classes(&[css.join(",").as_str()]), - None => (), - }; - match icon.position { - IconPosition::Left => root.prepend(&icon_image), - IconPosition::Right => root.append(&icon_image), - }; - } - None => (), - } - - let clear_icon_image = gtk::Image::builder() - .visible(false) - .hexpand(false) - .vexpand(false) - .build(); - match init.clear_icon.clone() { - Some(icon) => { - let icon_file = gio::File::for_path(icon.path); - let asset_paintable = gdk::Texture::from_file(&icon_file).unwrap(); - clear_icon_image.set_paintable(Option::from(&asset_paintable)); - match init.css.icon.to_owned() { - Some(css) => clear_icon_image.set_css_classes(&[css.join(",").as_str()]), - None => (), - }; - match icon.position { - IconPosition::Left => root.prepend(&clear_icon_image), - IconPosition::Right => root.append(&clear_icon_image), - }; - let left_click_gesture = GestureClick::builder().button(0).build(); - - left_click_gesture.connect_released(clone!(@strong sender => move |this, _, _,_| { - sender.input_sender().send(InputMessage::Clear); - - })); - clear_icon_image.add_controller(left_click_gesture); - } - None => (), - } - - let model = IconInput { - settings: init, - view_password: false, - is_focused: false, - input, - }; - - let widgets = ComponentWidgets { - container_box, - icon_image, - root: root.clone(), - clear_icon_image, - }; - - ComponentParts { model, widgets } - } - - fn update(&mut self, message: Self::Input, sender: relm4::ComponentSender) { - info!("icon button update message {:?}", message); - match message { - InputMessage::InputChange(text) => { - let _ = sender - .output_sender() - .send(OutputMessage::InputChange(text)); - } - InputMessage::InputFocusEnter => { - self.is_focused = true; - } - InputMessage::InputFocusLeave => { - self.is_focused = false; - } - InputMessage::Clear => { - self.input.set_text(""); - } - } - } - - fn update_view(&self, widgets: &mut Self::Widgets, sender: relm4::ComponentSender) { - match self.settings.css.root_container_focused.to_owned() { - Some(css) => widgets - .root - .set_class_active(&css.join(",").as_str(), self.is_focused), - None => (), - } - widgets.clear_icon_image.set_visible(self.is_focused); - } - - fn shutdown(&mut self, widgets: &mut Self::Widgets, output: relm4::Sender) { - info!("icon button sutdown called"); - } -} diff --git a/client/app/src/widgets/icon_input_password.rs b/client/app/src/widgets/icon_input_password.rs deleted file mode 100644 index 32367b85..00000000 --- a/client/app/src/widgets/icon_input_password.rs +++ /dev/null @@ -1,244 +0,0 @@ -use gtk::{gdk, gio, glib::clone, prelude::*}; -use relm4::{ - gtk::{self, GestureClick}, - ComponentParts, RelmWidgetExt, SimpleComponent, -}; -use tracing::info; - -#[derive(Debug, Clone)] -pub struct IconInputPasswordCss { - root_container: Option>, - root_container_focused: Option>, - container: Option>, - icon: Option>, -} - -impl Default for IconInputPasswordCss { - fn default() -> Self { - Self { - root_container: Option::from(vec!["icon-input-root-default".to_string()]), - root_container_focused: Option::from(vec![ - "icon-input-root-focused-default".to_string() - ]), - container: Option::from(vec!["icon-input-container-default".to_string()]), - icon: Option::from(vec!["icon-input-icon-default".to_string()]), - } - } -} - -#[derive(Debug)] -pub struct InitSettings { - pub placeholder: Option, - pub icon: Option, - pub toggle_icon: Option, - pub css: IconInputPasswordCss, -} - -#[derive(Debug)] -pub enum InputMessage { - ToggleViewPassword, - InputChange(String), - InputFocusEnter, - InputFocusLeave, -} - -#[derive(Debug)] -pub enum OutputMessage { - InputChange(String), -} - -pub struct IconInputPassword { - settings: InitSettings, - is_text_visible: bool, - is_focused: bool, -} - -pub struct ComponentWidgets { - container_box: gtk::Box, - icon_image: gtk::Image, - root: gtk::Box, - input: gtk::Entry, -} - -impl SimpleComponent for IconInputPassword { - type Input = InputMessage; - - type Output = OutputMessage; - - type Init = InitSettings; - - type Root = gtk::Box; - - type Widgets = ComponentWidgets; - - fn init_root() -> Self::Root { - let root_box = gtk::Box::builder() - .hexpand(true) - .vexpand(false) - .orientation(gtk::Orientation::Horizontal) - .build(); - root_box - } - - fn init( - init: Self::Init, - root: Self::Root, - sender: relm4::ComponentSender, - ) -> relm4::ComponentParts { - info!("icon button init called"); - - match init.css.root_container.to_owned() { - Some(css) => root.set_css_classes(&[css.join(",").as_str()]), - None => (), - } - - let container_box = gtk::Box::builder() - .valign(gtk::Align::Center) - .hexpand(true) - .vexpand(true) - .build(); - - match init.css.container.to_owned() { - Some(css) => container_box.set_css_classes(&[css.join(",").as_str()]), - None => (), - } - - let input = gtk::Entry::builder() - .hexpand(true) - .visibility(false) - .build(); - - let event_controller = gtk::EventControllerFocus::builder().build(); - - event_controller.connect_enter(clone!(@strong sender => move |_| { - sender.input(InputMessage::InputFocusEnter); - })); - - event_controller.connect_leave(clone!(@strong sender => move |_| { - sender.input(InputMessage::InputFocusLeave); - })); - - input.add_controller(event_controller); - - input.connect_changed(clone!(@strong sender => move |entry| { - sender.input(InputMessage::InputChange(entry.text().into())); - })); - - let icon_image = gtk::Image::builder().hexpand(false).vexpand(false).build(); - - match init.placeholder.clone() { - Some(placeholder) => { - input.set_placeholder_text(Option::from(placeholder.as_str())); - } - None => (), - } - - root.append(&input); - - let icon = init.icon.clone(); - match icon.to_owned() { - Some(icon) => { - let icon_file = gio::File::for_path(icon); - let asset_paintable = gdk::Texture::from_file(&icon_file).unwrap(); - // let image = gtk::Image::builder() - // .paintable(&asset_paintable) - // .hexpand(true) - // .vexpand(true) - // .build(); - icon_image.set_paintable(Option::from(&asset_paintable)); - - match init.css.icon.to_owned() { - Some(css) => icon_image.set_css_classes(&[css.join(",").as_str()]), - None => (), - }; - root.append(&icon_image); - let left_click_gesture = GestureClick::builder().button(0).build(); - // left_click_gesture.connect_pressed(clone!(@strong sender => move |this, _, _,_| { - // info!("gesture button pressed is {}", this.current_button()); - // sender.input_sender().send(InputMessage::Pressed); - - // })); - - left_click_gesture.connect_released(clone!(@strong sender => move |this, _, _,_| { - info!("gesture button released is {}", this.current_button()); - sender.input_sender().send(InputMessage::ToggleViewPassword); - - })); - icon_image.add_controller(left_click_gesture); - } - None => (), - } - - let model = IconInputPassword { - settings: init, - is_text_visible: false, - is_focused: false, - }; - - let widgets = ComponentWidgets { - container_box, - icon_image, - root: root.clone(), - input, - }; - - ComponentParts { model, widgets } - } - - fn update(&mut self, message: Self::Input, sender: relm4::ComponentSender) { - info!("icon button update message {:?}", message); - match message { - InputMessage::ToggleViewPassword => { - self.is_text_visible = !self.is_text_visible; - } - InputMessage::InputChange(text) => { - let _ = sender - .output_sender() - .send(OutputMessage::InputChange(text)); - } - InputMessage::InputFocusEnter => { - self.is_focused = true; - } - InputMessage::InputFocusLeave => { - self.is_focused = false; - } - } - } - - fn update_view(&self, widgets: &mut Self::Widgets, sender: relm4::ComponentSender) { - widgets.input.set_visibility(self.is_text_visible); - - match self.is_text_visible { - true => match self.settings.toggle_icon.to_owned() { - Some(icon) => { - let icon_file = gio::File::for_path(icon); - let asset_paintable = gdk::Texture::from_file(&icon_file).unwrap(); - widgets - .icon_image - .set_paintable(Option::from(&asset_paintable)); - } - None => (), - }, - false => match self.settings.icon.to_owned() { - Some(icon) => { - let icon_file = gio::File::for_path(icon); - let asset_paintable = gdk::Texture::from_file(&icon_file).unwrap(); - widgets - .icon_image - .set_paintable(Option::from(&asset_paintable)); - } - None => (), - }, - } - match self.settings.css.root_container_focused.to_owned() { - Some(css) => widgets - .root - .set_class_active(&css.join(",").as_str(), self.is_focused), - None => (), - } - } - - fn shutdown(&mut self, widgets: &mut Self::Widgets, output: relm4::Sender) { - info!("icon button sutdown called"); - } -} diff --git a/client/app/src/widgets/mod.rs b/client/app/src/widgets/mod.rs deleted file mode 100644 index 0c8e3e57..00000000 --- a/client/app/src/widgets/mod.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub mod gif_paintable; -pub mod icon_button; -pub mod icon_input; -pub mod icon_input_password; diff --git a/client/app/static/favicon.png b/client/app/static/favicon.png new file mode 100644 index 00000000..825b9e65 Binary files /dev/null and b/client/app/static/favicon.png differ diff --git a/client/app/svelte.config.js b/client/app/svelte.config.js new file mode 100644 index 00000000..bce0145b --- /dev/null +++ b/client/app/svelte.config.js @@ -0,0 +1,21 @@ +import adapter from '@sveltejs/adapter-static' // This was changed from adapter-auto +import { vitePreprocess } from '@sveltejs/vite-plugin-svelte' + +/** @type {import('@sveltejs/kit').Config} */ +const config = { + // Consult https://kit.svelte.dev/docs/integrations#preprocessors + // for more information about preprocessors + preprocess: [vitePreprocess({})], + + kit: { + // adapter-auto only supports some environments, see https://kit.svelte.dev/docs/adapter-auto for a list. + // If your environment is not supported, or you settled on a specific environment, switch out the adapter. + // See https://kit.svelte.dev/docs/adapters for more information about adapters. + adapter: adapter(), + alias: { + "@/*": "./path/to/lib/*", + }, + } +}; + +export default config; diff --git a/client/app/tailwind.config.js b/client/app/tailwind.config.js new file mode 100644 index 00000000..a7dc970d --- /dev/null +++ b/client/app/tailwind.config.js @@ -0,0 +1,64 @@ +import { fontFamily } from "tailwindcss/defaultTheme"; + +/** @type {import('tailwindcss').Config} */ +const config = { + darkMode: ["class"], + content: ["./src/**/*.{html,js,svelte,ts}"], + safelist: ["dark"], + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px" + } + }, + extend: { + colors: { + border: "hsl(var(--border) / )", + input: "hsl(var(--input) / )", + ring: "hsl(var(--ring) / )", + background: "hsl(var(--background) / )", + foreground: "hsl(var(--foreground) / )", + primary: { + DEFAULT: "hsl(var(--primary) / )", + foreground: "hsl(var(--primary-foreground) / )" + }, + secondary: { + DEFAULT: "hsl(var(--secondary) / )", + foreground: "hsl(var(--secondary-foreground) / )" + }, + destructive: { + DEFAULT: "hsl(var(--destructive) / )", + foreground: "hsl(var(--destructive-foreground) / )" + }, + muted: { + DEFAULT: "hsl(var(--muted) / )", + foreground: "hsl(var(--muted-foreground) / )" + }, + accent: { + DEFAULT: "hsl(var(--accent) / )", + foreground: "hsl(var(--accent-foreground) / )" + }, + popover: { + DEFAULT: "hsl(var(--popover) / )", + foreground: "hsl(var(--popover-foreground) / )" + }, + card: { + DEFAULT: "hsl(var(--card) / )", + foreground: "hsl(var(--card-foreground) / )" + } + }, + borderRadius: { + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)" + }, + fontFamily: { + sans: ['Space Grotesk'], + } + } + }, +}; + +export default config; diff --git a/client/app/tsconfig.json b/client/app/tsconfig.json new file mode 100644 index 00000000..fc93cbd9 --- /dev/null +++ b/client/app/tsconfig.json @@ -0,0 +1,19 @@ +{ + "extends": "./.svelte-kit/tsconfig.json", + "compilerOptions": { + "allowJs": true, + "checkJs": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "resolveJsonModule": true, + "skipLibCheck": true, + "sourceMap": true, + "strict": true, + "moduleResolution": "bundler" + } + // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias + // except $lib which is handled by https://kit.svelte.dev/docs/configuration#files + // + // If you want to overwrite includes/excludes, make sure to copy over the relevant includes/excludes + // from the referenced tsconfig.json - TypeScript does not merge them in +} diff --git a/client/app/vite.config.ts b/client/app/vite.config.ts new file mode 100644 index 00000000..bbf8c7da --- /dev/null +++ b/client/app/vite.config.ts @@ -0,0 +1,6 @@ +import { sveltekit } from '@sveltejs/kit/vite'; +import { defineConfig } from 'vite'; + +export default defineConfig({ + plugins: [sveltekit()] +});