diff --git a/Cargo.lock b/Cargo.lock index 1c4f78dd3..cb540bd66 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -80,7 +80,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -118,7 +118,7 @@ dependencies = [ "parse-size", "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -201,7 +201,7 @@ dependencies = [ "bytes", "bytestring", "cfg-if", - "cookie", + "cookie 0.16.2", "derive_more 2.0.1", "encoding_rs", "foldhash 0.1.5", @@ -235,7 +235,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -459,6 +459,141 @@ version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +[[package]] +name = "ashpd" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cbdf310d77fd3aaee6ea2093db7011dc2d35d2eb3481e5607f1f8d942ed99df" +dependencies = [ + "enumflags2", + "futures-channel", + "futures-util", + "rand 0.9.2", + "raw-window-handle", + "serde", + "serde_repr", + "tokio", + "url", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "zbus", +] + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "497c00e0fd83a72a79a39fcbd8e3e2f055d6f6c7e025f3b3d91f4f8e76527fb8" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd03604047cee9b6ce9de9f70c6cd540a0520c813cbd49bae61f33ab80ed1dc" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "async-signal" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43c070bbf59cd3570b6b2dd54cd772527c7c3620fce8be898406dd3ed6adc64c" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + [[package]] name = "async-stream" version = "0.3.6" @@ -478,9 +613,15 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + [[package]] name = "async-trait" version = "0.1.89" @@ -489,7 +630,30 @@ checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", +] + +[[package]] +name = "atk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "241b621213072e993be4f6f3a9e4b45f65b7e6faad43001be957184b7bb1824b" +dependencies = [ + "atk-sys", + "glib", + "libc", +] + +[[package]] +name = "atk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e48b684b0ca77d2bbadeef17424c2ea3c897d44d566a1617e7e8f30614d086" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", ] [[package]] @@ -551,7 +715,7 @@ dependencies = [ "cmake", "dunce", "fs_extra", - "libloading", + "libloading 0.8.8", ] [[package]] @@ -955,7 +1119,7 @@ dependencies = [ "regex", "rustc-hash", "shlex", - "syn", + "syn 2.0.106", ] [[package]] @@ -969,6 +1133,9 @@ name = "bitflags" version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" +dependencies = [ + "serde", +] [[package]] name = "blake2" @@ -997,6 +1164,37 @@ dependencies = [ "generic-array", ] +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2 0.5.2", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2 0.6.3", +] + +[[package]] +name = "blocking" +version = "1.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e83f8d02be6967315521be875afa792a316e28d57b5a2d401897e2a7921b7f21" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + [[package]] name = "bmrng" version = "0.5.2" @@ -1052,6 +1250,10 @@ dependencies = [ "serde_json", "sha2", "smartstring", + "tauri", + "tauri-build", + "tauri-plugin-dialog", + "tauri-plugin-opener", "tempfile", "time", "tokio", @@ -1103,6 +1305,12 @@ version = "0.6.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "175812e0be2bccb6abe50bb8d566126198344f707e304f45c648fd8f2cc0365e" +[[package]] +name = "bytemuck" +version = "1.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbdf580320f38b612e485521afda1ee26d10cc9884efaaa750d383e13e3c5f4" + [[package]] name = "byteorder" version = "1.5.0" @@ -1114,6 +1322,9 @@ name = "bytes" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" +dependencies = [ + "serde", +] [[package]] name = "bytes-utils" @@ -1163,6 +1374,73 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "cairo-rs" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" +dependencies = [ + "bitflags 2.9.4", + "cairo-sys-rs", + "glib", + "libc", + "once_cell", + "thiserror 1.0.69", +] + +[[package]] +name = "cairo-sys-rs" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "685c9fa8e590b8b3d678873528d83411db17242a73fccaed827770ea0fedda51" +dependencies = [ + "glib-sys", + "libc", + "system-deps", +] + +[[package]] +name = "camino" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "276a59bf2b2c967788139340c9f0c5b12d7fd6630315c15c217e559de85d2609" +dependencies = [ + "serde_core", +] + +[[package]] +name = "cargo-platform" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e35af189006b9c0f00a064685c727031e3ed2d8020f7ba284d78cc2671bd36ea" +dependencies = [ + "serde", +] + +[[package]] +name = "cargo_metadata" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd5eb614ed4c27c5d706420e4320fbe3216ab31fa1c33cd8246ac36dae4479ba" +dependencies = [ + "camino", + "cargo-platform", + "semver", + "serde", + "serde_json", + "thiserror 2.0.17", +] + +[[package]] +name = "cargo_toml" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "374b7c592d9c00c1f4972ea58390ac6b18cbb6ab79011f3bdc90a0b82ca06b77" +dependencies = [ + "serde", + "toml 0.9.8", +] + [[package]] name = "cbc" version = "0.1.2" @@ -1199,12 +1477,33 @@ dependencies = [ "nom 7.1.3", ] +[[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 = "cff-parser" version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "31f5b6e9141c036f3ff4ce7b2f7e432b0f00dee416ddcd4f17741d189ddc2e9d" +[[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.3" @@ -1269,7 +1568,7 @@ checksum = "0b023947811758c97c59bf9d1c188fd619ad4718dcaa767947df1cadb14f39f4" dependencies = [ "glob", "libc", - "libloading", + "libloading 0.8.8", ] [[package]] @@ -1338,6 +1637,15 @@ dependencies = [ "tokio-util", ] +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "console" version = "0.16.1" @@ -1406,6 +1714,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "cookie" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ddef33a339a91ea89fb53151bd0a4689cfce27055c291dfa69945475d22c747" +dependencies = [ + "time", + "version_check", +] + [[package]] name = "core-foundation" version = "0.9.4" @@ -1432,6 +1750,30 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "core-graphics" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" +dependencies = [ + "bitflags 2.9.4", + "core-foundation 0.10.1", + "core-graphics-types", + "foreign-types 0.5.0", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.9.4", + "core-foundation 0.10.1", + "libc", +] + [[package]] name = "cpufeatures" version = "0.2.17" @@ -1478,6 +1820,15 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "crossbeam-channel" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2" +dependencies = [ + "crossbeam-utils", +] + [[package]] name = "crossbeam-utils" version = "0.8.21" @@ -1523,6 +1874,23 @@ dependencies = [ "typenum", ] +[[package]] +name = "cssparser" +version = "0.29.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f93d03419cb5950ccfd3daf3ff1c7a36ace64609a1a8746d493df1ca0afde0fa" +dependencies = [ + "cssparser-macros", + "dtoa-short", + "itoa", + "matches", + "phf 0.10.1", + "proc-macro2", + "quote", + "smallvec", + "syn 1.0.109", +] + [[package]] name = "cssparser" version = "0.31.2" @@ -1543,7 +1911,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331" dependencies = [ "quote", - "syn", + "syn 2.0.106", +] + +[[package]] +name = "ctor" +version = "0.2.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a2785755761f3ddc1492979ce1e48d2c00d09311c39e4466429188f3dd6501" +dependencies = [ + "quote", + "syn 2.0.106", ] [[package]] @@ -1582,7 +1960,7 @@ dependencies = [ "proc-macro2", "quote", "scratch", - "syn", + "syn 2.0.106", ] [[package]] @@ -1596,7 +1974,7 @@ dependencies = [ "indexmap 2.11.4", "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -1615,7 +1993,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn", + "syn 2.0.106", ] [[package]] @@ -1649,7 +2027,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.106", ] [[package]] @@ -1663,7 +2041,7 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn", + "syn 2.0.106", ] [[package]] @@ -1674,7 +2052,7 @@ checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ "darling_core 0.20.11", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -1685,7 +2063,7 @@ checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" dependencies = [ "darling_core 0.21.3", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -1717,6 +2095,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" dependencies = [ "powerfmt", + "serde_core", ] [[package]] @@ -1727,7 +2106,7 @@ checksum = "1e567bd82dcff979e4b03460c307b3cdc9e96fde3d73bed1496d2bc75d9dd62a" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -1748,7 +2127,7 @@ dependencies = [ "darling 0.20.11", "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -1758,7 +2137,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ab63b0e2bf4d5928aff72e83a7dace85d7bba5fe12dcc3c5a572d78caffd3f3c" dependencies = [ "derive_builder_core", - "syn", + "syn 2.0.106", ] [[package]] @@ -1771,7 +2150,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn", + "syn 2.0.106", ] [[package]] @@ -1791,7 +2170,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", "unicode-xid", ] @@ -1805,7 +2184,7 @@ dependencies = [ "byteorder", "chrono", "diesel_derives", - "downcast-rs", + "downcast-rs 2.0.2", "itoa", "pq-sys", "serde_json", @@ -1822,7 +2201,7 @@ dependencies = [ "dsl_auto_type", "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -1831,7 +2210,7 @@ version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fe2444076b48641147115697648dc743c2c00b61adade0f01ce67133c7babe8c" dependencies = [ - "syn", + "syn 2.0.106", ] [[package]] @@ -1845,6 +2224,45 @@ dependencies = [ "subtle", ] +[[package]] +name = "dirs" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3e8aa94d75141228480295a7d0e7feb620b1a5ad9f12bc40be62411e38cce4e" +dependencies = [ + "dirs-sys", +] + +[[package]] +name = "dirs-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01a3366d27ee9890022452ee61b2b63a67e6f13f58900b651ff5665f0bb1fab" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.61.2", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +dependencies = [ + "bitflags 2.9.4", + "block2 0.6.2", + "libc", + "objc2 0.6.3", +] + [[package]] name = "displaydoc" version = "0.2.5" @@ -1853,7 +2271,39 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", +] + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading 0.8.8", +] + +[[package]] +name = "dlopen2" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b54f373ccf864bf587a89e880fb7610f8d73f3045f13580948ccbcaff26febff" +dependencies = [ + "dlopen2_derive", + "libc", + "once_cell", + "winapi", +] + +[[package]] +name = "dlopen2_derive" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "788160fb30de9cdd857af31c6a2675904b16ece8fc2737b2c7127ba368c9d0f4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", ] [[package]] @@ -1862,6 +2312,12 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + [[package]] name = "downcast-rs" version = "2.0.2" @@ -1881,6 +2337,15 @@ dependencies = [ "tokio", ] +[[package]] +name = "dpi" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8b14ccef22fc6f5a8f4d7d768562a182c04ce9a3b3157b91390b52ddfdf1a76" +dependencies = [ + "serde", +] + [[package]] name = "dsl_auto_type" version = "0.2.0" @@ -1892,7 +2357,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -1916,6 +2381,12 @@ version = "1.0.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + [[package]] name = "ecb" version = "0.1.2" @@ -1985,6 +2456,26 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e079f19b08ca6239f47f8ba8509c11cf3ea30095831f7fed61441475edd8c449" +[[package]] +name = "embed-resource" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55a075fc573c64510038d7ee9abc7990635863992f83ebc52c8b433b8411a02e" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 0.9.8", + "vswhom", + "winreg 0.55.0", +] + +[[package]] +name = "embed_plist" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ef6b89e5b37196644d8796de5268852ff179b44e96276cf4290264843743bb7" + [[package]] name = "encode_unicode" version = "1.0.0" @@ -2000,6 +2491,33 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "endi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "env_filter" version = "0.1.3" @@ -2035,6 +2553,17 @@ version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" +[[package]] +name = "erased-serde" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "259d404d09818dec19332e31d94558aeb442fea04c817006456c24b5460bbd4b" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + [[package]] name = "errno" version = "0.3.14" @@ -2054,12 +2583,42 @@ dependencies = [ "num-traits", ] +[[package]] +name = "event-listener" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener", + "pin-project-lite", +] + [[package]] name = "fastrand" version = "2.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37909eebbb50d72f9059c3b6d82c0463f2ff062c9e95845c43a6c9c0355411be" +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + [[package]] name = "ff" version = "0.12.1" @@ -2070,6 +2629,16 @@ dependencies = [ "subtle", ] +[[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 = "find-msvc-tools" version = "0.1.4" @@ -2116,7 +2685,28 @@ version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" dependencies = [ - "foreign-types-shared", + "foreign-types-shared 0.1.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared 0.3.1", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", ] [[package]] @@ -2125,6 +2715,12 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + [[package]] name = "form_urlencoded" version = "1.2.2" @@ -2208,6 +2804,19 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +[[package]] +name = "futures-lite" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.31" @@ -2216,7 +2825,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -2258,6 +2867,105 @@ dependencies = [ "byteorder", ] +[[package]] +name = "gdk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9f245958c627ac99d8e529166f9823fb3b838d1d41fd2b297af3075093c2691" +dependencies = [ + "cairo-rs", + "gdk-pixbuf", + "gdk-sys", + "gio", + "glib", + "libc", + "pango", +] + +[[package]] +name = "gdk-pixbuf" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e1f5f1b0bfb830d6ccc8066d18db35c487b1b2b1e8589b5dfe9f07e8defaec" +dependencies = [ + "gdk-pixbuf-sys", + "gio", + "glib", + "libc", + "once_cell", +] + +[[package]] +name = "gdk-pixbuf-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9839ea644ed9c97a34d129ad56d38a25e6756f99f3a88e15cd39c20629caf7" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "gdk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c2d13f38594ac1e66619e188c6d5a1adb98d11b2fcf7894fc416ad76aa2f3f7" +dependencies = [ + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkwayland-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "140071d506d223f7572b9f09b5e155afbd77428cd5cc7af8f2694c41d98dfe69" +dependencies = [ + "gdk-sys", + "glib-sys", + "gobject-sys", + "libc", + "pkg-config", + "system-deps", +] + +[[package]] +name = "gdkx11" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3caa00e14351bebbc8183b3c36690327eb77c49abc2268dd4bd36b856db3fbfe" +dependencies = [ + "gdk", + "gdkx11-sys", + "gio", + "glib", + "libc", + "x11", +] + +[[package]] +name = "gdkx11-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e7445fe01ac26f11601db260dd8608fe172514eb63b3b5e261ea6b0f4428d" +dependencies = [ + "gdk-sys", + "glib-sys", + "libc", + "system-deps", + "x11", +] + [[package]] name = "generic-array" version = "0.14.7" @@ -2277,6 +2985,17 @@ dependencies = [ "unicode-width", ] +[[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.16" @@ -2320,12 +3039,102 @@ version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" +[[package]] +name = "gio" +version = "0.18.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4fc8f532f87b79cbc51a79748f16a6828fb784be93145a322fa14d06d354c73" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-util", + "gio-sys", + "glib", + "libc", + "once_cell", + "pin-project-lite", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "gio-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37566df850baf5e4cb0dfb78af2e4b9898d817ed9263d1090a2df958c64737d2" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", + "winapi", +] + +[[package]] +name = "glib" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" +dependencies = [ + "bitflags 2.9.4", + "futures-channel", + "futures-core", + "futures-executor", + "futures-task", + "futures-util", + "gio-sys", + "glib-macros", + "glib-sys", + "gobject-sys", + "libc", + "memchr", + "once_cell", + "smallvec", + "thiserror 1.0.69", +] + +[[package]] +name = "glib-macros" +version = "0.18.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" +dependencies = [ + "heck 0.4.1", + "proc-macro-crate 2.0.2", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "glib-sys" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "063ce2eb6a8d0ea93d2bf8ba1957e78dbab6be1c2220dd3daca57d5a9d869898" +dependencies = [ + "libc", + "system-deps", +] + [[package]] name = "glob" version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" +[[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 = "group" version = "0.12.1" @@ -2337,6 +3146,58 @@ dependencies = [ "subtle", ] +[[package]] +name = "gtk" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd56fb197bfc42bd5d2751f4f017d44ff59fbb58140c6b49f9b3b2bdab08506a" +dependencies = [ + "atk", + "cairo-rs", + "field-offset", + "futures-channel", + "gdk", + "gdk-pixbuf", + "gio", + "glib", + "gtk-sys", + "gtk3-macros", + "libc", + "pango", + "pkg-config", +] + +[[package]] +name = "gtk-sys" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f29a1c21c59553eb7dd40e918be54dccd60c52b049b75119d5d96ce6b624414" +dependencies = [ + "atk-sys", + "cairo-sys-rs", + "gdk-pixbuf-sys", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "pango-sys", + "system-deps", +] + +[[package]] +name = "gtk3-macros" +version = "0.18.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ff3c5b21f14f0736fed6dcfc0bfb4225ebf5725f3c0209edeec181e4d73e9d" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro-error", + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "h2" version = "0.3.27" @@ -2443,6 +3304,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + [[package]] name = "hex" version = "0.4.3" @@ -2477,10 +3344,22 @@ checksum = "c13771afe0e6e846f1e67d038d4cb29998a6779f93c809212e4e9c32efd244d4" dependencies = [ "log", "mac", - "markup5ever", + "markup5ever 0.12.1", "proc-macro2", "quote", - "syn", + "syn 2.0.106", +] + +[[package]] +name = "html5ever" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b7410cae13cbc75623c98ac4cbfd1f0bedddf3227afc24f370cf0f50a44a11c" +dependencies = [ + "log", + "mac", + "markup5ever 0.14.1", + "match_token", ] [[package]] @@ -2699,7 +3578,7 @@ dependencies = [ "js-sys", "log", "wasm-bindgen", - "windows-core", + "windows-core 0.62.2", ] [[package]] @@ -2711,6 +3590,16 @@ dependencies = [ "cc", ] +[[package]] +name = "ico" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc50b891e4acf8fe0e71ef88ec43ad82ee07b3810ad09de10f1d01f072ed4b98" +dependencies = [ + "byteorder", + "png", +] + [[package]] name = "icu_collections" version = "2.0.0" @@ -2883,6 +3772,7 @@ checksum = "bd070e393353796e801d209ad339e89596eb4c8d430d18ede6a1cced8fafbd99" dependencies = [ "autocfg", "hashbrown 0.12.3", + "serde", ] [[package]] @@ -2893,6 +3783,8 @@ checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", "hashbrown 0.16.0", + "serde", + "serde_core", ] [[package]] @@ -2908,6 +3800,15 @@ dependencies = [ "web-time", ] +[[package]] +name = "infer" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a588916bfdfd92e71cacef98a63d9b1f0d74d6599980d11894290e7ddefffcf7" +dependencies = [ + "cfb", +] + [[package]] name = "inout" version = "0.1.4" @@ -2945,6 +3846,25 @@ dependencies = [ "serde", ] +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + [[package]] name = "is_terminal_polyfill" version = "1.70.1" @@ -2993,6 +3913,29 @@ version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +[[package]] +name = "javascriptcore-rs" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca5671e9ffce8ffba57afc24070e906da7fc4b1ba66f2cabebf61bf2ea257fcc" +dependencies = [ + "bitflags 1.3.2", + "glib", + "javascriptcore-rs-sys", +] + +[[package]] +name = "javascriptcore-rs-sys" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af1be78d14ffa4b75b66df31840478fef72b51f8c2465d4ca7c194da9f7a5124" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + [[package]] name = "jiff" version = "0.2.15" @@ -3014,7 +3957,7 @@ checksum = "03343451ff899767262ec32146f6d559dd759fdadf42ff0e227c7c48f72594b4" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -3059,6 +4002,28 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "json-patch" +version = "3.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "863726d7afb6bc2590eeff7135d923545e5e964f004c2ccf8716c25e70a86f08" +dependencies = [ + "jsonptr", + "serde", + "serde_json", + "thiserror 1.0.69", +] + +[[package]] +name = "jsonptr" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dea2b27dd239b2556ed7a25ba842fe47fd602e7fc7433c2a8d6106d4d9edd70" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "jsonwebtoken" version = "9.3.1" @@ -3072,6 +4037,29 @@ dependencies = [ "serde_json", ] +[[package]] +name = "keyboard-types" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" +dependencies = [ + "bitflags 2.9.4", + "serde", + "unicode-segmentation", +] + +[[package]] +name = "kuchikiki" +version = "0.8.8-speedreader" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02cb977175687f33fa4afa0c95c112b987ea1443e5a51c8f8ff27dc618270cc2" +dependencies = [ + "cssparser 0.29.6", + "html5ever 0.29.1", + "indexmap 2.11.4", + "selectors 0.24.0", +] + [[package]] name = "language-tags" version = "0.3.2" @@ -3112,12 +4100,46 @@ dependencies = [ "url", ] +[[package]] +name = "libappindicator" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03589b9607c868cc7ae54c0b2a22c8dc03dd41692d48f2d7df73615c6a95dc0a" +dependencies = [ + "glib", + "gtk", + "gtk-sys", + "libappindicator-sys", + "log", +] + +[[package]] +name = "libappindicator-sys" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9ec52138abedcc58dc17a7c6c0c00a2bdb4f3427c7f63fa97fd0d859155caf" +dependencies = [ + "gtk-sys", + "libloading 0.7.4", + "once_cell", +] + [[package]] name = "libc" version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + [[package]] name = "libloading" version = "0.8.8" @@ -3128,6 +4150,16 @@ dependencies = [ "windows-targets 0.53.5", ] +[[package]] +name = "libredox" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "416f7e718bdb06000964960ffa43b4335ad4012ae8b99060261aa4a8088d5ccb" +dependencies = [ + "bitflags 2.9.4", + "libc", +] + [[package]] name = "libwebrtc" version = "0.3.16" @@ -3184,7 +4216,7 @@ dependencies = [ "chrono", "futures-util", "lazy_static", - "libloading", + "libloading 0.8.8", "libwebrtc", "livekit-api", "livekit-protocol", @@ -3382,6 +4414,37 @@ dependencies = [ "tendril", ] +[[package]] +name = "markup5ever" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a7213d12e1864c0f002f52c2923d4556935a43dec5e71355c2760e0f6e7a18" +dependencies = [ + "log", + "phf 0.11.3", + "phf_codegen 0.11.3", + "string_cache", + "string_cache_codegen", + "tendril", +] + +[[package]] +name = "match_token" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88a9689d8d44bf9964484516275f5cd4c9b59457a6940c1d5d0ecbb94510a36b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[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" @@ -3404,6 +4467,15 @@ version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" +[[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" @@ -3438,6 +4510,27 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "muda" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01c1738382f66ed56b3b9c8119e794a2e23148ac8ea214eda86622d4cb9d415a" +dependencies = [ + "crossbeam-channel", + "dpi", + "gtk", + "keyboard-types", + "objc2 0.6.3", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "once_cell", + "png", + "serde", + "thiserror 2.0.17", + "windows-sys 0.60.2", +] + [[package]] name = "multimap" version = "0.10.1" @@ -3461,12 +4554,61 @@ dependencies = [ "tempfile", ] +[[package]] +name = "ndk" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" +dependencies = [ + "bitflags 2.9.4", + "jni-sys", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle", + "thiserror 1.0.69", +] + +[[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.6.0+11769913" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" +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 = "nix" +version = "0.30.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74523f3a35e05aba87a1d978330aef40f67b0304ac79c1c00b294c9830543db6" +dependencies = [ + "bitflags 2.9.4", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset", +] + +[[package]] +name = "nodrop" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" + [[package]] name = "nom" version = "7.1.3" @@ -3550,6 +4692,292 @@ dependencies = [ "autocfg", ] +[[package]] +name = "num_enum" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1207a7e20ad57b847bbddc6776b968420d38292bbfe2089accff5e19e82454c" +dependencies = [ + "num_enum_derive", + "rustversion", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff32365de1b6743cb203b710788263c44a03de03802daf96092f2da4fe6ba4d7" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7c2599ce0ec54857b29ce62166b0ed9b4f6f1a70ccc9a71165b6154caca8c05" +dependencies = [ + "objc2-encode", + "objc2-exception-helper", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.9.4", + "block2 0.6.2", + "libc", + "objc2 0.6.3", + "objc2-cloud-kit", + "objc2-core-data", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-core-image", + "objc2-core-text", + "objc2-core-video", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.9.4", + "objc2 0.6.3", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" +dependencies = [ + "bitflags 2.9.4", + "objc2 0.6.3", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.9.4", + "dispatch2", + "objc2 0.6.3", +] + +[[package]] +name = "objc2-core-graphics" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" +dependencies = [ + "bitflags 2.9.4", + "dispatch2", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-io-surface", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" +dependencies = [ + "objc2 0.6.3", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.9.4", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-core-graphics", +] + +[[package]] +name = "objc2-core-video" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d425caf1df73233f29fd8a5c3e5edbc30d2d4307870f802d18f00d83dc5141a6" +dependencies = [ + "bitflags 2.9.4", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-io-surface", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-exception-helper" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7a1c5fbb72d7735b076bb47b578523aedc40f3c439bea6dfd595c089d79d98a" +dependencies = [ + "cc", +] + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.9.4", + "block2 0.5.1", + "libc", + "objc2 0.5.2", +] + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.9.4", + "block2 0.6.2", + "libc", + "objc2 0.6.3", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-io-surface" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" +dependencies = [ + "bitflags 2.9.4", + "objc2 0.6.3", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-javascript-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a1e6550c4caed348956ce3370c9ffeca70bb1dbed4fa96112e7c6170e074586" +dependencies = [ + "objc2 0.6.3", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.9.4", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.9.4", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.9.4", + "objc2 0.6.3", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-security" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe137109bd1e8b5a99390f77a7d8b2961dafc1a1c5db8f2e60329ad6d895a" +dependencies = [ + "bitflags 2.9.4", + "objc2 0.6.3", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.9.4", + "objc2 0.6.3", + "objc2-core-foundation", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-web-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e5aaab980c433cf470df9d7af96a7b46a9d892d521a2cbbb2f8a4c16751e7f" +dependencies = [ + "bitflags 2.9.4", + "block2 0.6.2", + "objc2 0.6.3", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-javascript-core", + "objc2-security", +] + [[package]] name = "object" version = "0.37.3" @@ -3580,6 +5008,18 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c08d65885ee38876c4f86fa503fb49d7b507c2b62552df7c70b2fce627e06381" +[[package]] +name = "open" +version = "5.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2483562e62ea94312f3576a7aca397306df7990b8d89033e18766744377ef95" +dependencies = [ + "dunce", + "is-wsl", + "libc", + "pathdiff", +] + [[package]] name = "openssl" version = "0.10.73" @@ -3588,7 +5028,7 @@ checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ "bitflags 2.9.4", "cfg-if", - "foreign-types", + "foreign-types 0.3.2", "libc", "once_cell", "openssl-macros", @@ -3603,7 +5043,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -3624,6 +5064,22 @@ dependencies = [ "vcpkg", ] +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + [[package]] name = "ouroboros" version = "0.18.5" @@ -3645,7 +5101,7 @@ dependencies = [ "proc-macro2", "proc-macro2-diagnostics", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -3665,6 +5121,37 @@ dependencies = [ "sha2", ] +[[package]] +name = "pango" +version = "0.18.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ca27ec1eb0457ab26f3036ea52229edbdb74dee1edd29063f5b9b010e7ebee4" +dependencies = [ + "gio", + "glib", + "libc", + "once_cell", + "pango-sys", +] + +[[package]] +name = "pango-sys" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "436737e391a843e5933d6d9aa102cb126d501e815b83601365a948a518555dc5" +dependencies = [ + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + [[package]] name = "parking_lot" version = "0.12.5" @@ -3716,6 +5203,12 @@ dependencies = [ "subtle", ] +[[package]] +name = "pathdiff" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df94ce210e5bc13cb6651479fa48d14f601d9858cfe0467f43ae157023b938d3" + [[package]] name = "pbjson" version = "0.6.0" @@ -3808,13 +5301,24 @@ dependencies = [ "indexmap 2.11.4", ] +[[package]] +name = "phf" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12" +dependencies = [ + "phf_shared 0.8.0", +] + [[package]] name = "phf" version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fabbf1ead8a5bcbc20f5f8b939ee3f5b0f6f281b6ad3468b84656b658b455259" dependencies = [ + "phf_macros 0.10.0", "phf_shared 0.10.0", + "proc-macro-hack", ] [[package]] @@ -3823,10 +5327,20 @@ version = "0.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fd6780a80ae0c52cc120a26a1a42c1ae51b247a253e4e06113d23d2c2edd078" dependencies = [ - "phf_macros", + "phf_macros 0.11.3", "phf_shared 0.11.3", ] +[[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" @@ -3847,6 +5361,16 @@ dependencies = [ "phf_shared 0.11.3", ] +[[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" @@ -3867,6 +5391,20 @@ dependencies = [ "rand 0.8.5", ] +[[package]] +name = "phf_macros" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58fdf3184dd560f160dd73922bea2d5cd6e8f064bf4b13110abd81b03697b4e0" +dependencies = [ + "phf_generator 0.10.0", + "phf_shared 0.10.0", + "proc-macro-hack", + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "phf_macros" version = "0.11.3" @@ -3877,7 +5415,16 @@ dependencies = [ "phf_shared 0.11.3", "proc-macro2", "quote", - "syn", + "syn 2.0.106", +] + +[[package]] +name = "phf_shared" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7" +dependencies = [ + "siphasher 0.3.11", ] [[package]] @@ -3915,7 +5462,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -3930,6 +5477,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + [[package]] name = "pkcs8" version = "0.9.0" @@ -3946,6 +5504,46 @@ version = "0.3.32" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" +[[package]] +name = "plist" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "740ebea15c5d1428f910cd1a5f52cebf8d25006245ed8ade92702f4943d91e07" +dependencies = [ + "base64 0.22.1", + "indexmap 2.11.4", + "quick-xml 0.38.3", + "serde", + "time", +] + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "windows-sys 0.61.2", +] + [[package]] name = "polyval" version = "0.6.2" @@ -4033,9 +5631,68 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.106", ] +[[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-crate" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +dependencies = [ + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "proc-macro-crate" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "219cb19e96be00ab2e37d6e299658a0cfa83e52429179969b0f0121b4ac46983" +dependencies = [ + "toml_edit 0.23.7", +] + +[[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.101" @@ -4053,7 +5710,7 @@ checksum = "af066a9c399a26e020ada66a034357a868728e72cd426f3adcd35f80d88d88c8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", "version_check", "yansi", ] @@ -4095,7 +5752,7 @@ dependencies = [ "prost 0.12.6", "prost-types 0.12.6", "regex", - "syn", + "syn 2.0.106", "tempfile", ] @@ -4109,7 +5766,7 @@ dependencies = [ "itertools 0.12.1", "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -4122,7 +5779,7 @@ dependencies = [ "itertools 0.14.0", "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -4173,6 +5830,24 @@ dependencies = [ "tonic", ] +[[package]] +name = "quick-xml" +version = "0.37.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "331e97a1af0bf59823e6eadffe373d7b27f485be8748f71471c662c1f269b7fb" +dependencies = [ + "memchr", +] + +[[package]] +name = "quick-xml" +version = "0.38.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42a232e7487fc2ef313d96dde7948e7a3c05101870d8985e4fd8d26aedd27b89" +dependencies = [ + "memchr", +] + [[package]] name = "quinn" version = "0.11.9" @@ -4249,6 +5924,20 @@ version = "5.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" +[[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" @@ -4270,6 +5959,16 @@ dependencies = [ "rand_core 0.9.3", ] +[[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" @@ -4290,6 +5989,15 @@ dependencies = [ "rand_core 0.9.3", ] +[[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" @@ -4308,12 +6016,36 @@ dependencies = [ "getrandom 0.3.3", ] +[[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 = "rangemap" version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f93e7e49bb0bf967717f7bd674458b3d6b0c5f48ec7e3038166026a69fc22223" +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + [[package]] name = "redis" version = "0.27.6" @@ -4347,6 +6079,37 @@ dependencies = [ "bitflags 2.9.4", ] +[[package]] +name = "redox_users" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4e608c6638b9c18977b00b475ac1f28d14e84b27d8d42f70e0bf1e3dec127ac" +dependencies = [ + "getrandom 0.2.16", + "libredox", + "thiserror 2.0.17", +] + +[[package]] +name = "ref-cast" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + [[package]] name = "regex" version = "1.12.1" @@ -4481,6 +6244,31 @@ dependencies = [ "zeroize", ] +[[package]] +name = "rfd" +version = "0.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef2bee61e6cffa4635c72d7d81a84294e28f0930db0ddcb0f66d10244674ebed" +dependencies = [ + "ashpd", + "block2 0.6.2", + "dispatch2", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "log", + "objc2 0.6.3", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-sys 0.59.0", +] + [[package]] name = "rhai" version = "1.22.2" @@ -4505,7 +6293,7 @@ source = "git+https://github.com/therealprof/rhai.git?branch=features%2Fuse-web- dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -4688,6 +6476,63 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "schemars" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fbf2ae1b8bc8e02df939598064d22402220cd5bbcca1c76f7d6a310974d5615" +dependencies = [ + "dyn-clone", + "indexmap 1.9.3", + "schemars_derive", + "serde", + "serde_json", + "url", + "uuid", +] + +[[package]] +name = "schemars" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd191f9397d57d581cddd31014772520aa448f65ef991055d7f61582c65165f" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82d20c4491bc164fa2f6c5d44565947a52ad80b9505d8e36f8d54c27c739fcd0" +dependencies = [ + "dyn-clone", + "ref-cast", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "0.8.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32e265784ad618884abaea0600a9adf15393368d840e0222d101a072f3f7534d" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 2.0.106", +] + +[[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" @@ -4701,12 +6546,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b90460b31bfe1fc07be8262e42c665ad97118d4585869de9345a84d501a9eaf0" dependencies = [ "ahash", - "cssparser", + "cssparser 0.31.2", "ego-tree", "getopts", - "html5ever", + "html5ever 0.27.0", "once_cell", - "selectors", + "selectors 0.25.0", "tendril", ] @@ -4776,6 +6621,24 @@ dependencies = [ "libc", ] +[[package]] +name = "selectors" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c37578180969d00692904465fb7f6b3d50b9a2b952b87c23d0e2e5cb5013416" +dependencies = [ + "bitflags 1.3.2", + "cssparser 0.29.6", + "derive_more 0.99.20", + "fxhash", + "log", + "phf 0.8.0", + "phf_codegen 0.8.0", + "precomputed-hash", + "servo_arc 0.2.0", + "smallvec", +] + [[package]] name = "selectors" version = "0.25.0" @@ -4783,7 +6646,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4eb30575f3638fc8f6815f448d50cb1a2e255b0897985c8c59f4d37b72a07b06" dependencies = [ "bitflags 2.9.4", - "cssparser", + "cssparser 0.31.2", "derive_more 0.99.20", "fxhash", "log", @@ -4791,7 +6654,7 @@ dependencies = [ "phf 0.10.1", "phf_codegen 0.10.0", "precomputed-hash", - "servo_arc", + "servo_arc 0.3.0", "smallvec", ] @@ -4800,6 +6663,10 @@ name = "semver" version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" +dependencies = [ + "serde", + "serde_core", +] [[package]] name = "serde" @@ -4811,6 +6678,18 @@ dependencies = [ "serde_derive", ] +[[package]] +name = "serde-untagged" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9faf48a4a2d2693be24c6289dbe26552776eb7737074e6722891fadbe6c5058" +dependencies = [ + "erased-serde", + "serde", + "serde_core", + "typeid", +] + [[package]] name = "serde_core" version = "1.0.228" @@ -4828,7 +6707,18 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", +] + +[[package]] +name = "serde_derive_internals" +version = "0.29.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", ] [[package]] @@ -4853,6 +6743,35 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_repr" +version = "0.1.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175ee3e80ae9982737ca543e96133087cbd9a485eecc3bc4de9c1a37b47ea59c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" +dependencies = [ + "serde_core", +] + [[package]] name = "serde_urlencoded" version = "0.7.1" @@ -4865,6 +6784,69 @@ dependencies = [ "serde", ] +[[package]] +name = "serde_with" +version = "3.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa66c845eee442168b2c8134fec70ac50dc20e760769c8ba0ad1319ca1959b04" +dependencies = [ + "base64 0.22.1", + "chrono", + "hex", + "indexmap 1.9.3", + "indexmap 2.11.4", + "schemars 0.9.0", + "schemars 1.0.4", + "serde_core", + "serde_json", + "serde_with_macros", + "time", +] + +[[package]] +name = "serde_with_macros" +version = "3.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b91a903660542fced4e99881aa481bdbaec1634568ee02e0b8bd57c64cb38955" +dependencies = [ + "darling 0.21.3", + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "serialize-to-javascript" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04f3666a07a197cdb77cdf306c32be9b7f598d7060d50cfd4d5aa04bfd92f6c5" +dependencies = [ + "serde", + "serde_json", + "serialize-to-javascript-impl", +] + +[[package]] +name = "serialize-to-javascript-impl" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "772ee033c0916d670af7860b6e1ef7d658a4629a6d0b4c8c3e67f09b3765b75d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "servo_arc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d52aa42f8fdf0fed91e5ce7f23d8138441002fa31dca008acf47e6fd4721f741" +dependencies = [ + "nodrop", + "stable_deref_trait", +] + [[package]] name = "servo_arc" version = "0.3.0" @@ -5008,6 +6990,54 @@ dependencies = [ "winapi", ] +[[package]] +name = "softbuffer" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "18051cdd562e792cad055119e0cdb2cfc137e44e3987532e0f9659a77931bb08" +dependencies = [ + "bytemuck", + "cfg_aliases", + "core-graphics", + "foreign-types 0.5.0", + "js-sys", + "log", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-quartz-core 0.2.2", + "raw-window-handle", + "redox_syscall", + "wasm-bindgen", + "web-sys", + "windows-sys 0.59.0", +] + +[[package]] +name = "soup3" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "471f924a40f31251afc77450e781cb26d55c0b650842efafc9c6cbd2f7cc4f9f" +dependencies = [ + "futures-channel", + "gio", + "glib", + "libc", + "soup3-sys", +] + +[[package]] +name = "soup3-sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ebe8950a680a12f24f15ebe1bf70db7af98ad242d9db43596ad3108aab86c27" +dependencies = [ + "gio-sys", + "glib-sys", + "gobject-sys", + "libc", + "system-deps", +] + [[package]] name = "spki" version = "0.6.0" @@ -5091,6 +7121,28 @@ version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" +[[package]] +name = "swift-rs" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4057c98e2e852d51fdcfca832aac7b571f6b351ad159f9eda5db1655f8d0c4d7" +dependencies = [ + "base64 0.21.7", + "serde", + "serde_json", +] + +[[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.106" @@ -5125,7 +7177,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -5170,6 +7222,369 @@ dependencies = [ "libc", ] +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck 0.5.0", + "pkg-config", + "toml 0.8.2", + "version-compare", +] + +[[package]] +name = "tao" +version = "0.34.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" +dependencies = [ + "bitflags 2.9.4", + "block2 0.6.2", + "core-foundation 0.10.1", + "core-graphics", + "crossbeam-channel", + "dispatch", + "dlopen2", + "dpi", + "gdkwayland-sys", + "gdkx11-sys", + "gtk", + "jni", + "lazy_static", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "objc2 0.6.3", + "objc2-app-kit", + "objc2-foundation 0.3.2", + "once_cell", + "parking_lot", + "raw-window-handle", + "scopeguard", + "tao-macros", + "unicode-segmentation", + "url", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[package]] +name = "tao-macros" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4e16beb8b2ac17db28eab8bca40e62dbfbb34c0fcdc6d9826b11b7b5d047dfd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "target-lexicon" +version = "0.12.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c41af27dd6d1e27b1b16b489db798443478cef1f06a660c96db617ba5de3b1" + +[[package]] +name = "tauri" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9871670c6711f50fddd4e20350be6b9dd6e6c2b5d77d8ee8900eb0d58cd837a" +dependencies = [ + "anyhow", + "bytes", + "cookie 0.18.1", + "dirs", + "dunce", + "embed_plist", + "getrandom 0.3.3", + "glob", + "gtk", + "heck 0.5.0", + "http 1.3.1", + "jni", + "libc", + "log", + "mime", + "muda", + "objc2 0.6.3", + "objc2-app-kit", + "objc2-foundation 0.3.2", + "objc2-ui-kit", + "objc2-web-kit", + "percent-encoding", + "plist", + "raw-window-handle", + "reqwest 0.12.23", + "serde", + "serde_json", + "serde_repr", + "serialize-to-javascript", + "swift-rs", + "tauri-build", + "tauri-macros", + "tauri-runtime", + "tauri-runtime-wry", + "tauri-utils", + "thiserror 2.0.17", + "tokio", + "tray-icon", + "url", + "webkit2gtk", + "webview2-com", + "window-vibrancy", + "windows", +] + +[[package]] +name = "tauri-build" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a924b6c50fe83193f0f8b14072afa7c25b7a72752a2a73d9549b463f5fe91a38" +dependencies = [ + "anyhow", + "cargo_toml", + "dirs", + "glob", + "heck 0.5.0", + "json-patch", + "schemars 0.8.22", + "semver", + "serde", + "serde_json", + "tauri-utils", + "tauri-winres", + "toml 0.9.8", + "walkdir", +] + +[[package]] +name = "tauri-codegen" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c1fe64c74cc40f90848281a90058a6db931eb400b60205840e09801ee30f190" +dependencies = [ + "base64 0.22.1", + "brotli", + "ico", + "json-patch", + "plist", + "png", + "proc-macro2", + "quote", + "semver", + "serde", + "serde_json", + "sha2", + "syn 2.0.106", + "tauri-utils", + "thiserror 2.0.17", + "time", + "url", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-macros" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "260c5d2eb036b76206b9fca20b7be3614cfd21046c5396f7959e0e64a4b07f2f" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.106", + "tauri-codegen", + "tauri-utils", +] + +[[package]] +name = "tauri-plugin" +version = "2.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "076c78a474a7247c90cad0b6e87e593c4c620ed4efdb79cbe0214f0021f6c39d" +dependencies = [ + "anyhow", + "glob", + "plist", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri-utils", + "toml 0.9.8", + "walkdir", +] + +[[package]] +name = "tauri-plugin-dialog" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0beee42a4002bc695550599b011728d9dfabf82f767f134754ed6655e434824e" +dependencies = [ + "log", + "raw-window-handle", + "rfd", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tauri-plugin-fs", + "thiserror 2.0.17", + "url", +] + +[[package]] +name = "tauri-plugin-fs" +version = "2.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "315784ec4be45e90a987687bae7235e6be3d6e9e350d2b75c16b8a4bf22c1db7" +dependencies = [ + "anyhow", + "dunce", + "glob", + "percent-encoding", + "schemars 0.8.22", + "serde", + "serde_json", + "serde_repr", + "tauri", + "tauri-plugin", + "tauri-utils", + "thiserror 2.0.17", + "toml 0.9.8", + "url", +] + +[[package]] +name = "tauri-plugin-opener" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "786156aa8e89e03d271fbd3fe642207da8e65f3c961baa9e2930f332bf80a1f5" +dependencies = [ + "dunce", + "glob", + "objc2-app-kit", + "objc2-foundation 0.3.2", + "open", + "schemars 0.8.22", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "thiserror 2.0.17", + "url", + "windows", + "zbus", +] + +[[package]] +name = "tauri-runtime" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9368f09358496f2229313fccb37682ad116b7f46fa76981efe116994a0628926" +dependencies = [ + "cookie 0.18.1", + "dpi", + "gtk", + "http 1.3.1", + "jni", + "objc2 0.6.3", + "objc2-ui-kit", + "objc2-web-kit", + "raw-window-handle", + "serde", + "serde_json", + "tauri-utils", + "thiserror 2.0.17", + "url", + "webkit2gtk", + "webview2-com", + "windows", +] + +[[package]] +name = "tauri-runtime-wry" +version = "2.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "929f5df216f5c02a9e894554401bcdab6eec3e39ec6a4a7731c7067fc8688a93" +dependencies = [ + "gtk", + "http 1.3.1", + "jni", + "log", + "objc2 0.6.3", + "objc2-app-kit", + "objc2-foundation 0.3.2", + "once_cell", + "percent-encoding", + "raw-window-handle", + "softbuffer", + "tao", + "tauri-runtime", + "tauri-utils", + "url", + "webkit2gtk", + "webview2-com", + "windows", + "wry", +] + +[[package]] +name = "tauri-utils" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b8bbe426abdbf52d050e52ed693130dbd68375b9ad82a3fb17efb4c8d85673" +dependencies = [ + "anyhow", + "brotli", + "cargo_metadata", + "ctor", + "dunce", + "glob", + "html5ever 0.29.1", + "http 1.3.1", + "infer", + "json-patch", + "kuchikiki", + "log", + "memchr", + "phf 0.11.3", + "proc-macro2", + "quote", + "regex", + "schemars 0.8.22", + "semver", + "serde", + "serde-untagged", + "serde_json", + "serde_with", + "swift-rs", + "thiserror 2.0.17", + "toml 0.9.8", + "url", + "urlpattern", + "uuid", + "walkdir", +] + +[[package]] +name = "tauri-winres" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd21509dd1fa9bd355dc29894a6ff10635880732396aa38c0066c1e6c1ab8074" +dependencies = [ + "embed-resource", + "toml 0.9.8", +] + [[package]] name = "tempfile" version = "3.23.0" @@ -5235,7 +7650,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -5246,7 +7661,7 @@ checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -5340,6 +7755,7 @@ dependencies = [ "slab", "socket2 0.6.0", "tokio-macros", + "tracing", "windows-sys 0.59.0", ] @@ -5351,7 +7767,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -5420,6 +7836,102 @@ dependencies = [ "tokio", ] +[[package]] +name = "toml" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "185d8ab0dfbb35cf1399a6344d8484209c088f75f8f68230da55d48d95d43e3d" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "toml_edit 0.20.2", +] + +[[package]] +name = "toml" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" +dependencies = [ + "indexmap 2.11.4", + "serde_core", + "serde_spanned 1.0.3", + "toml_datetime 0.7.3", + "toml_parser", + "toml_writer", + "winnow 0.7.13", +] + +[[package]] +name = "toml_datetime" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap 2.11.4", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.20.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "396e4d48bbb2b7554c944bde63101b5ae446cff6ec4a24227428f15eb72ef338" +dependencies = [ + "indexmap 2.11.4", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.3", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.23.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6485ef6d0d9b5d0ec17244ff7eb05310113c3f316f2d14200d4de56b3cb98f8d" +dependencies = [ + "indexmap 2.11.4", + "toml_datetime 0.7.3", + "toml_parser", + "winnow 0.7.13", +] + +[[package]] +name = "toml_parser" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" +dependencies = [ + "winnow 0.7.13", +] + +[[package]] +name = "toml_writer" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" + [[package]] name = "tonic" version = "0.12.3" @@ -5539,7 +8051,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -5577,6 +8089,28 @@ dependencies = [ "tracing-log", ] +[[package]] +name = "tray-icon" +version = "0.21.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d5572781bee8e3f994d7467084e1b1fd7a93ce66bd480f8156ba89dee55a2b" +dependencies = [ + "crossbeam-channel", + "dirs", + "libappindicator", + "muda", + "objc2 0.6.3", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.2", + "once_cell", + "png", + "serde", + "thiserror 2.0.17", + "windows-sys 0.60.2", +] + [[package]] name = "try-lock" version = "0.2.5" @@ -5634,12 +8168,70 @@ dependencies = [ "pom", ] +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + [[package]] name = "typenum" version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset", + "tempfile", + "winapi", +] + +[[package]] +name = "unic-char-property" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8c57a407d9b6fa02b4795eb81c5b6652060a15a7903ea981f3d723e6c0be221" +dependencies = [ + "unic-char-range", +] + +[[package]] +name = "unic-char-range" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0398022d5f700414f6b899e10b8348231abf9173fa93144cbc1a43b9793c1fbc" + +[[package]] +name = "unic-common" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80d7ff825a6a654ee85a63e80f92f054f904f21e7d12da4e22f9834a4aaa35bc" + +[[package]] +name = "unic-ucd-ident" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e230a37c0381caa9219d67cf063aa3a375ffed5bf541a452db16e744bdab6987" +dependencies = [ + "unic-char-property", + "unic-char-range", + "unic-ucd-version", +] + +[[package]] +name = "unic-ucd-version" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96bd2f2237fe450fcd0a1d2f5f4e91711124f7857ba2e964247776ebeeb7b0c4" +dependencies = [ + "unic-common", +] + [[package]] name = "unicode-bidi" version = "0.3.18" @@ -5667,6 +8259,12 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0" +[[package]] +name = "unicode-segmentation" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" + [[package]] name = "unicode-width" version = "0.2.2" @@ -5766,6 +8364,18 @@ version = "2.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da" +[[package]] +name = "urlpattern" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70acd30e3aa1450bc2eece896ce2ad0d178e9c079493819301573dae3c37ba6d" +dependencies = [ + "regex", + "serde", + "unic-ucd-ident", + "url", +] + [[package]] name = "utf-8" version = "0.7.6" @@ -5808,6 +8418,12 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[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.5" @@ -5820,6 +8436,26 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c3082ca00d5a5ef149bb8b555a72ae84c9c59f7250f013ac822ac2e49b19c64" +[[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.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + [[package]] name = "walkdir" version = "2.5.0" @@ -5839,6 +8475,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.1+wasi-snapshot-preview1" @@ -5886,7 +8528,7 @@ dependencies = [ "log", "proc-macro2", "quote", - "syn", + "syn 2.0.106", "wasm-bindgen-shared", ] @@ -5921,7 +8563,7 @@ checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -5948,6 +8590,66 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wayland-backend" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "673a33c33048a5ade91a6b139580fa174e19fb0d23f396dca9fa15f2e1e49b35" +dependencies = [ + "cc", + "downcast-rs 1.2.1", + "rustix", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c66a47e840dc20793f2264eb4b3e4ecb4b75d91c0dd4af04b456128e0bdd449d" +dependencies = [ + "bitflags 2.9.4", + "rustix", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa790ed75fbfd71283bd2521a1cfdc022aabcc28bdcff00851f9e4ae88d9901" +dependencies = [ + "bitflags 2.9.4", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54cb1e9dc49da91950bdfd8b848c49330536d9d1fb03d4bfec8cae50caa50ae3" +dependencies = [ + "proc-macro2", + "quick-xml 0.37.5", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34949b42822155826b41db8e5d0c1be3a2bd296c747577a43a3e6daefc296142" +dependencies = [ + "dlib", + "log", + "pkg-config", +] + [[package]] name = "web-sys" version = "0.3.81" @@ -5968,6 +8670,50 @@ dependencies = [ "wasm-bindgen", ] +[[package]] +name = "webkit2gtk" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76b1bc1e54c581da1e9f179d0b38512ba358fb1af2d634a1affe42e37172361a" +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", + "soup3", + "webkit2gtk-sys", +] + +[[package]] +name = "webkit2gtk-sys" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62daa38afc514d1f8f12b8693d30d5993ff77ced33ce30cd04deebc267a6d57c" +dependencies = [ + "bitflags 1.3.2", + "cairo-sys-rs", + "gdk-sys", + "gio-sys", + "glib-sys", + "gobject-sys", + "gtk-sys", + "javascriptcore-rs-sys", + "libc", + "pkg-config", + "soup3-sys", + "system-deps", +] + [[package]] name = "webpki-roots" version = "0.26.11" @@ -6015,6 +8761,42 @@ dependencies = [ "zip 0.6.6", ] +[[package]] +name = "webview2-com" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4ba622a989277ef3886dd5afb3e280e3dd6d974b766118950a08f8f678ad6a4" +dependencies = [ + "webview2-com-macros", + "webview2-com-sys", + "windows", + "windows-core 0.61.2", + "windows-implement", + "windows-interface", +] + +[[package]] +name = "webview2-com-macros" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d228f15bba3b9d56dde8bddbee66fa24545bd17b48d5128ccf4a8742b18e431" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.106", +] + +[[package]] +name = "webview2-com-sys" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" +dependencies = [ + "thiserror 2.0.17", + "windows", + "windows-core 0.61.2", +] + [[package]] name = "weezl" version = "0.1.10" @@ -6063,6 +8845,56 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +[[package]] +name = "window-vibrancy" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" +dependencies = [ + "objc2 0.6.3", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "raw-window-handle", + "windows-sys 0.59.0", + "windows-version", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + [[package]] name = "windows-core" version = "0.62.2" @@ -6076,6 +8908,17 @@ dependencies = [ "windows-strings 0.5.1", ] +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + [[package]] name = "windows-implement" version = "0.60.2" @@ -6084,7 +8927,7 @@ checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -6095,7 +8938,7 @@ checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -6110,6 +8953,16 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + [[package]] name = "windows-registry" version = "0.5.3" @@ -6274,6 +9127,24 @@ dependencies = [ "windows_x86_64_msvc 0.53.1", ] +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-version" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4060a1da109b9d0326b7262c8e12c84df67cc0dbc9e33cf49e01ccc2eb63631" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows_aarch64_gnullvm" version = "0.42.2" @@ -6454,6 +9325,24 @@ version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" +[[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.7.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.50.0" @@ -6492,6 +9381,72 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ea2f10b9bb0928dfb1b42b65e1f9e36f7f54dbdf08457afefb38afcdec4fa2bb" +[[package]] +name = "wry" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "728b7d4c8ec8d81cab295e0b5b8a4c263c0d41a785fb8f8c4df284e5411140a2" +dependencies = [ + "base64 0.22.1", + "block2 0.6.2", + "cookie 0.18.1", + "crossbeam-channel", + "dirs", + "dpi", + "dunce", + "gdkx11", + "gtk", + "html5ever 0.29.1", + "http 1.3.1", + "javascriptcore-rs", + "jni", + "kuchikiki", + "libc", + "ndk", + "objc2 0.6.3", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "objc2-ui-kit", + "objc2-web-kit", + "once_cell", + "percent-encoding", + "raw-window-handle", + "sha2", + "soup3", + "tao-macros", + "thiserror 2.0.17", + "url", + "webkit2gtk", + "webkit2gtk-sys", + "webview2-com", + "windows", + "windows-core 0.61.2", + "windows-version", + "x11-dl", +] + +[[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 = "xmlparser" version = "0.13.6" @@ -6533,10 +9488,72 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", "synstructure", ] +[[package]] +name = "zbus" +version = "5.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b622b18155f7a93d1cd2dc8c01d2d6a44e08fb9ebb7b3f9e6ed101488bad6c91" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener", + "futures-core", + "futures-lite", + "hex", + "nix", + "ordered-stream", + "serde", + "serde_repr", + "tokio", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 0.7.13", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cdb94821ca8a87ca9c298b5d1cbd80e2a8b67115d99f6e4551ac49e42b6a314" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.106", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7be68e64bf6ce8db94f63e72f0c7eb9a60d733f7e0499e628dfab0f84d6bcb97" +dependencies = [ + "serde", + "static_assertions", + "winnow 0.7.13", + "zvariant", +] + [[package]] name = "zerocopy" version = "0.8.27" @@ -6554,7 +9571,7 @@ checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -6574,7 +9591,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", "synstructure", ] @@ -6595,7 +9612,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -6628,7 +9645,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.106", ] [[package]] @@ -6739,3 +9756,44 @@ dependencies = [ "cc", "pkg-config", ] + +[[package]] +name = "zvariant" +version = "5.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2be61892e4f2b1772727be11630a62664a1826b62efa43a6fe7449521cb8744c" +dependencies = [ + "endi", + "enumflags2", + "serde", + "url", + "winnow 0.7.13", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da58575a1b2b20766513b1ec59d8e2e68db2745379f961f86650655e862d2006" +dependencies = [ + "proc-macro-crate 3.4.0", + "proc-macro2", + "quote", + "syn 2.0.106", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "3.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6949d142f89f6916deca2232cf26a8afacf2b9fdc35ce766105e104478be599" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 2.0.106", + "winnow 0.7.13", +] diff --git a/Cargo.toml b/Cargo.toml index 7cf562a5c..4693bad04 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,7 +11,6 @@ authors = [ "Arenas.io", "Atylla L", "Christopher de Castilho", - "Dario Lima", "Dario Junior", "David Lerner", "Experimentation Garage", @@ -38,10 +37,12 @@ license = "AGPL-3.0" repository = "https://github.com/GeneralBots/BotServer" [features] -default = ["vectordb"] +desktop = ["tauri", "tauri-plugin-opener", "tauri-plugin-dialog"] +default = [ "vectordb"] vectordb = ["qdrant-client"] email = ["imap"] web_automation = ["headless_chrome"] +webapp = ["tauri", "tauri-plugin-opener", "tauri-plugin-dialog"] [dependencies] actix-cors = "0.7" @@ -70,7 +71,6 @@ log = "0.4" mailparse = "0.15" native-tls = "0.2" - num-format = "0.4" qdrant-client = { version = "1.12", optional = true } rhai = { git = "https://github.com/therealprof/rhai.git", branch = "features/use-web-time" } @@ -97,3 +97,17 @@ scraper = "0.20" sha2 = "0.10.9" ureq = "3.1.2" indicatif = "0.18.0" + +tauri = { version = "2", features = ["unstable"], optional = true } +tauri-plugin-opener = { version = "2", optional = true } +tauri-plugin-dialog = { version = "2", optional = true } + +[build-dependencies] +tauri-build = { version = "2", features = [] } + +[profile.release] +lto = true # Enables Link-Time Optimization +opt-level = "z" # Optimizes for size instead of speed +strip = true # Strips debug symbols +panic = "abort" # Reduces size by removing panic unwinding +codegen-units = 1 # More aggressive optimization diff --git a/src/main.rs b/src/main.rs index 87e151555..ee1cf6e0a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,4 +1,5 @@ #![allow(dead_code)] +#![cfg_attr(feature = "desktop", windows_subsystem = "windows")] use actix_cors::Cors; use actix_web::middleware::Logger; use actix_web::{web, App, HttpServer}; @@ -18,6 +19,10 @@ mod context; mod drive_monitor; #[cfg(feature = "email")] mod email; + +#[cfg(feature = "desktop")] +mod ui; + mod file; mod kb; mod llm; @@ -56,6 +61,7 @@ use crate::web_server::{bot_index, index, static_files}; use crate::whatsapp::whatsapp_webhook_verify; use crate::whatsapp::WhatsAppAdapter; +#[cfg(not(feature = "desktop"))] #[tokio::main] async fn main() -> std::io::Result<()> { let args: Vec = std::env::args().collect(); diff --git a/src/riot_compiler/mod.rs b/src/riot_compiler/mod.rs new file mode 100644 index 000000000..6a6822368 --- /dev/null +++ b/src/riot_compiler/mod.rs @@ -0,0 +1,39 @@ +use boa_engine::{Context, JsValue, Source}; + +fn compile_riot_component(riot_code: &str) -> Result> { + let mut context = Context::default(); + + let compiler = include_str!("riot_compiler.js"); // Your Riot compiler logic + + context.eval(Source::from_bytes(compiler))?; + + let result = context.eval(Source::from_bytes(&format!( + "compileRiot(`{}`)", + riot_code.replace('`', "\\`") + )))?; + + Ok(result) +} + +fn main() { + let riot_component = r#" + +

{ props.title }

+ + ✓ Done + + +
+ "#; + + match compile_riot_component(riot_component) { + Ok(compiled) => println!("Compiled: {:?}", compiled), + Err(e) => eprintln!("Compilation failed: {}", e), + } +} \ No newline at end of file diff --git a/src/ui/drive.rs b/src/ui/drive.rs new file mode 100644 index 000000000..71acadba3 --- /dev/null +++ b/src/ui/drive.rs @@ -0,0 +1,101 @@ +use serde::{Deserialize, Serialize}; +use std::fs; +use std::path::{Path, PathBuf}; +use tauri::{Emitter, Window}; + +#[derive(Debug, Serialize, Deserialize)] +pub struct FileItem { + name: String, + path: String, + is_dir: bool, +} + +#[tauri::command] +pub fn list_files(path: &str) -> Result, String> { + let base_path = Path::new(path); + let mut files = Vec::new(); + + if !base_path.exists() { + return Err("Path does not exist".into()); + } + + for entry in fs::read_dir(base_path).map_err(|e| e.to_string())? { + let entry = entry.map_err(|e| e.to_string())?; + let path = entry.path(); + let name = path + .file_name() + .and_then(|n| n.to_str()) + .unwrap_or("") + .to_string(); + + files.push(FileItem { + name, + path: path.to_str().unwrap_or("").to_string(), + is_dir: path.is_dir(), + }); + } + + // Sort directories first, then files + files.sort_by(|a, b| { + if a.is_dir && !b.is_dir { + std::cmp::Ordering::Less + } else if !a.is_dir && b.is_dir { + std::cmp::Ordering::Greater + } else { + a.name.cmp(&b.name) + } + }); + + Ok(files) +} + +#[tauri::command] +pub async fn upload_file(window: Window, src_path: String, dest_path: String) -> Result<(), String> { + use std::fs::File; + use std::io::{Read, Write}; + + let src = PathBuf::from(&src_path); + let dest_dir = PathBuf::from(&dest_path); + let dest = dest_dir.join(src.file_name().ok_or("Invalid source file")?); + + // Create destination directory if it doesn't exist + if !dest_dir.exists() { + fs::create_dir_all(&dest_dir).map_err(|e| e.to_string())?; + } + + let mut source_file = File::open(&src).map_err(|e| e.to_string())?; + let mut dest_file = File::create(&dest).map_err(|e| e.to_string())?; + + let file_size = source_file.metadata().map_err(|e| e.to_string())?.len(); + let mut buffer = [0; 8192]; + let mut total_read = 0; + + loop { + let bytes_read = source_file.read(&mut buffer).map_err(|e| e.to_string())?; + if bytes_read == 0 { + break; + } + + dest_file + .write_all(&buffer[..bytes_read]) + .map_err(|e| e.to_string())?; + total_read += bytes_read as u64; + + let progress = (total_read as f64 / file_size as f64) * 100.0; + window + .emit("upload_progress", progress) + .map_err(|e| e.to_string())?; + } + + Ok(()) +} + +#[tauri::command] +pub fn create_folder(path: String, name: String) -> Result<(), String> { + let full_path = Path::new(&path).join(&name); + if full_path.exists() { + return Err("Folder already exists".into()); + } + fs::create_dir(full_path).map_err(|e| e.to_string())?; + Ok(()) +} diff --git a/src/ui/local-sync.rs b/src/ui/local-sync.rs new file mode 100644 index 000000000..dd2e6f7bc --- /dev/null +++ b/src/ui/local-sync.rs @@ -0,0 +1,444 @@ +use dioxus::prelude::*; +use dioxus_desktop::{use_window, LogicalSize}; +use std::env; +use std::fs::{File, OpenOptions, create_dir_all}; +use std::io::{BufRead, BufReader, Write}; +use std::path::Path; +use std::process::{Command as ProcCommand, Child, Stdio}; +use std::sync::{Arc, Mutex}; +use std::thread; +use std::time::{Duration, Instant}; +use notify_rust::Notification; +use serde::{Deserialize, Serialize}; +use serde_json::Value; + +// App state +#[derive(Debug, Clone)] +struct AppState { + name: String, + access_key: String, + secret_key: String, + status_text: String, + sync_processes: Arc>>, + sync_active: Arc>, + sync_statuses: Arc>>, + show_config_dialog: bool, + show_about_dialog: bool, + current_screen: Screen, +} + +#[derive(Debug, Clone)] +enum Screen { + Main, + Status, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct RcloneConfig { + name: String, + remote_path: String, + local_path: String, + access_key: String, + secret_key: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +struct SyncStatus { + name: String, + status: String, + transferred: String, + bytes: String, + errors: usize, + last_updated: String, +} + +#[derive(Debug, Clone)] +enum Message { + NameChanged(String), + AccessKeyChanged(String), + SecretKeyChanged(String), + SaveConfig, + StartSync, + StopSync, + UpdateStatus(Vec), + ShowConfigDialog(bool), + ShowAboutDialog(bool), + ShowStatusScreen, + BackToMain, + None, +} + +fn main() { + dioxus_desktop::launch(app); +} + +fn app(cx: Scope) -> Element { + let window = use_window(); + window.set_inner_size(LogicalSize::new(800, 600)); + + let state = use_ref(cx, || AppState { + name: String::new(), + access_key: String::new(), + secret_key: String::new(), + status_text: "Enter credentials to set up sync".to_string(), + sync_processes: Arc::new(Mutex::new(Vec::new())), + sync_active: Arc::new(Mutex::new(false)), + sync_statuses: Arc::new(Mutex::new(Vec::new())), + show_config_dialog: false, + show_about_dialog: false, + current_screen: Screen::Main, + }); + + // Monitor sync status + use_future( async move { + let state = state.clone(); + async move { + let mut last_check = Instant::now(); + let check_interval = Duration::from_secs(5); + + loop { + tokio::time::sleep(Duration::from_secs(1)).await; + + if !*state.read().sync_active.lock().unwrap() { + continue; + } + + if last_check.elapsed() < check_interval { + continue; + } + + last_check = Instant::now(); + + match read_rclone_configs() { + Ok(configs) => { + let mut new_statuses = Vec::new(); + for config in configs { + match get_rclone_status(&config.name) { + Ok(status) => new_statuses.push(status), + Err(e) => eprintln!("Failed to get status: {}", e), + } + } + *state.write().sync_statuses.lock().unwrap() = new_statuses.clone(); + state.write().status_text = format!("Syncing {} repositories...", new_statuses.len()); + } + Err(e) => eprintln!("Failed to read configs: {}", e), + } + } + } + }); + + cx.render(rsx! { + div { + class: "app", + // Main menu bar + div { + class: "menu-bar", + button { + onclick: move |_| state.write().show_config_dialog = true, + "Add Sync Configuration" + } + button { + onclick: move |_| state.write().show_about_dialog = true, + "About" + } + } + + // Main content + {match state.read().current_screen { + Screen::Main => rsx! { + div { + class: "main-screen", + h1 { "General Bots" } + p { "{state.read().status_text}" } + button { + onclick: move |_| start_sync(&state), + "Start Sync" + } + button { + onclick: move |_| stop_sync(&state), + "Stop Sync" + } + button { + onclick: move |_| state.write().current_screen = Screen::Status, + "Show Status" + } + } + }, + Screen::Status => rsx! { + div { + class: "status-screen", + h1 { "Sync Status" } + div { + class: "status-list", + for status in state.read().sync_statuses.lock().unwrap().iter() { + div { + class: "status-item", + h2 { "{status.name}" } + p { "Status: {status.status}" } + p { "Transferred: {status.transferred}" } + p { "Bytes: {status.bytes}" } + p { "Errors: {status.errors}" } + p { "Last Updated: {status.last_updated}" } + } + } + } + button { + onclick: move |_| state.write().current_screen = Screen::Main, + "Back" + } + } + } + }} + + // Config dialog + if state.read().show_config_dialog { + div { + class: "dialog", + h2 { "Add Sync Configuration" } + input { + value: "{state.read().name}", + oninput: move |e| state.write().name = e.value.clone(), + placeholder: "Enter sync name", + } + input { + value: "{state.read().access_key}", + oninput: move |e| state.write().access_key = e.value.clone(), + placeholder: "Enter access key", + } + input { + value: "{state.read().secret_key}", + oninput: move |e| state.write().secret_key = e.value.clone(), + placeholder: "Enter secret key", + } + button { + onclick: move |_| { + save_config(&state); + state.write().show_config_dialog = false; + }, + "Save" + } + button { + onclick: move |_| state.write().show_config_dialog = false, + "Cancel" + } + } + } + + // About dialog + if state.read().show_about_dialog { + div { + class: "dialog", + h2 { "About General Bots" } + p { "Version: 1.0.0" } + p { "A professional-grade sync tool for OneDrive/Dropbox-like functionality." } + button { + onclick: move |_| state.write().show_about_dialog = false, + "Close" + } + } + } + } + }) +} + +// Save sync configuration +fn save_config(state: &UseRef) { + if state.read().name.is_empty() || state.read().access_key.is_empty() || state.read().secret_key.is_empty() { + state.write_with(|state| state.status_text = "All fields are required!".to_string()); + return; + } + + let new_config = RcloneConfig { + name: state.read().name.clone(), + remote_path: format!("s3://{}", state.read().name), + local_path: Path::new(&env::var("HOME").unwrap()).join("General Bots").join(&state.read().name).to_string_lossy().to_string(), + access_key: state.read().access_key.clone(), + secret_key: state.read().secret_key.clone(), + }; + + if let Err(e) = save_rclone_config(&new_config) { + state.write_with(|state| state.status_text = format!("Failed to save config: {}", e)); + } else { + state.write_with(|state| state.status_text = "New sync saved!".to_string()); + } +} + +// Start sync process +fn start_sync(state: &UseRef) { + let mut processes = state.write_with(|state| state.sync_processes.lock().unwrap()); + processes.clear(); + + match read_rclone_configs() { + Ok(configs) => { + for config in configs { + match run_sync(&config) { + Ok(child) => processes.push(child), + Err(e) => eprintln!("Failed to start sync: {}", e), + } + } + state.write_with(|state| *state.sync_active.lock().unwrap() = true); + state.write_with(|state| state.status_text = format!("Syncing with {} configurations.", processes.len())); + } + Err(e) => state.write_with(|state| state.status_text = format!("Failed to read configurations: {}", e)), + } +} + +// Stop sync process +fn stop_sync(state: &UseRef) { + let mut processes = state.write_with(|state| state.sync_processes.lock().unwrap()); + for child in processes.iter_mut() { + let _ = child.kill(); + } + processes.clear(); + state.write_with(|state| *state.sync_active.lock().unwrap() = false); + state.write_with(|state| state.status_text = "Sync stopped.".to_string()); +} + +// Utility functions (rclone, notifications, etc.) +fn save_rclone_config(config: &RcloneConfig) -> Result<(), String> { + let home_dir = env::var("HOME").map_err(|_| "HOME environment variable not set".to_string())?; + let config_path = Path::new(&home_dir).join(".config/rclone/rclone.conf"); + + let mut file = OpenOptions::new() + .create(true) + .append(true) + .open(&config_path) + .map_err(|e| format!("Failed to open config file: {}", e))?; + + writeln!(file, "[{}]", config.name) + .and_then(|_| writeln!(file, "type = s3")) + .and_then(|_| writeln!(file, "provider = Other")) + .and_then(|_| writeln!(file, "access_key_id = {}", config.access_key)) + .and_then(|_| writeln!(file, "secret_access_key = {}", config.secret_key)) + .and_then(|_| writeln!(file, "endpoint = https://drive-api.pragmatismo.com.br")) + .and_then(|_| writeln!(file, "acl = private")) + .map_err(|e| format!("Failed to write config: {}", e)) +} + +fn read_rclone_configs() -> Result, String> { + let home_dir = env::var("HOME").map_err(|_| "HOME environment variable not set".to_string())?; + let config_path = Path::new(&home_dir).join(".config/rclone/rclone.conf"); + + if !config_path.exists() { + return Ok(Vec::new()); + } + + let file = File::open(&config_path).map_err(|e| format!("Failed to open config file: {}", e))?; + let reader = BufReader::new(file); + let mut configs = Vec::new(); + let mut current_config: Option = None; + + for line in reader.lines() { + let line = line.map_err(|e| format!("Failed to read line: {}", e))?; + if line.is_empty() || line.starts_with('#') { + continue; + } + + if line.starts_with('[') && line.ends_with(']') { + if let Some(config) = current_config.take() { + configs.push(config); + } + let name = line[1..line.len()-1].to_string(); + current_config = Some(RcloneConfig { + name: name.clone(), + remote_path: format!("s3://{}", name), + local_path: Path::new(&home_dir).join("General Bots").join(&name).to_string_lossy().to_string(), + access_key: String::new(), + secret_key: String::new(), + }); + } else if let Some(ref mut config) = current_config { + if let Some(pos) = line.find('=') { + let key = line[..pos].trim().to_string(); + let value = line[pos+1..].trim().to_string(); + match key.as_str() { + "access_key_id" => config.access_key = value, + "secret_access_key" => config.secret_key = value, + _ => {} + } + } + } + } + + if let Some(config) = current_config { + configs.push(config); + } + + Ok(configs) +} + +fn run_sync(config: &RcloneConfig) -> Result { + let local_path = Path::new(&config.local_path); + if !local_path.exists() { + create_dir_all(local_path)?; + } + + ProcCommand::new("rclone") + .arg("sync") + .arg(&config.remote_path) + .arg(&config.local_path) + .arg("--no-check-certificate") + .arg("--verbose") + .arg("--rc") + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .spawn() +} + +fn get_rclone_status(remote_name: &str) -> Result { + let output = ProcCommand::new("rclone") + .arg("rc") + .arg("core/stats") + .arg("--json") + .output() + .map_err(|e| format!("Failed to execute rclone rc: {}", e))?; + + if !output.status.success() { + return Err(format!("rclone rc failed: {}", String::from_utf8_lossy(&output.stderr))); + } + + let json = String::from_utf8_lossy(&output.stdout); + let parsed: Result = serde_json::from_str(&json); + match parsed { + Ok(value) => { + let transferred = value.get("bytes").and_then(|v| v.as_u64()).unwrap_or(0); + let errors = value.get("errors").and_then(|v| v.as_u64()).unwrap_or(0); + let speed = value.get("speed").and_then(|v| v.as_f64()).unwrap_or(0.0); + + let status = if errors > 0 { + "Error occurred".to_string() + } else if speed > 0.0 { + "Transferring".to_string() + } else if transferred > 0 { + "Completed".to_string() + } else { + "Initializing".to_string() + }; + + Ok(SyncStatus { + name: remote_name.to_string(), + status, + transferred: format_bytes(transferred), + bytes: format!("{}/s", format_bytes(speed as u64)), + errors: errors as usize, + last_updated: chrono::Local::now().format("%H:%M:%S").to_string(), + }) + } + Err(e) => Err(format!("Failed to parse rclone status: {}", e)), + } +} + +fn format_bytes(bytes: u64) -> String { + const KB: u64 = 1024; + const MB: u64 = KB * 1024; + const GB: u64 = MB * 1024; + + if bytes >= GB { + format!("{:.2} GB", bytes as f64 / GB as f64) + } else if bytes >= MB { + format!("{:.2} MB", bytes as f64 / MB as f64) + } else if bytes >= KB { + format!("{:.2} KB", bytes as f64 / KB as f64) + } else { + format!("{} B", bytes) + } +} \ No newline at end of file diff --git a/src/ui/mod.rs b/src/ui/mod.rs new file mode 100644 index 000000000..02710787a --- /dev/null +++ b/src/ui/mod.rs @@ -0,0 +1,4 @@ +// Prevents additional console window on Windows in release, DO NOT REMOVE!! +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] +pub mod drive; +pub mod sync; \ No newline at end of file diff --git a/src/ui/sync.rs b/src/ui/sync.rs new file mode 100644 index 000000000..3732b0a98 --- /dev/null +++ b/src/ui/sync.rs @@ -0,0 +1,145 @@ +use serde::{Deserialize, Serialize}; +use std::sync::Mutex; +use std::process::{Command, Stdio}; +use std::path::Path; +use std::fs::{OpenOptions, create_dir_all}; +use std::io::Write; +use std::env; + + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct RcloneConfig { + name: String, + remote_path: String, + local_path: String, + access_key: String, + secret_key: String, +} + +#[derive(Debug, Clone, Serialize, Deserialize)] +pub struct SyncStatus { + name: String, + status: String, + transferred: String, + bytes: String, + errors: usize, + last_updated: String, +} + +pub(crate) struct AppState { + pub sync_processes: Mutex>, + pub sync_active: Mutex, +} + +#[tauri::command] +pub fn save_config(config: RcloneConfig) -> Result<(), String> { + let home_dir = env::var("HOME").map_err(|_| "HOME environment variable not set".to_string())?; + let config_path = Path::new(&home_dir).join(".config/rclone/rclone.conf"); + + let mut file = OpenOptions::new() + .create(true) + .append(true) + .open(&config_path) + .map_err(|e| format!("Failed to open config file: {}", e))?; + + writeln!(file, "[{}]", config.name) + .and_then(|_| writeln!(file, "type = s3")) + .and_then(|_| writeln!(file, "provider = Other")) + .and_then(|_| writeln!(file, "access_key_id = {}", config.access_key)) + .and_then(|_| writeln!(file, "secret_access_key = {}", config.secret_key)) + .and_then(|_| writeln!(file, "endpoint = https://drive-api.pragmatismo.com.br")) + .and_then(|_| writeln!(file, "acl = private")) + .map_err(|e| format!("Failed to write config: {}", e)) +} + +#[tauri::command] +pub fn start_sync(config: RcloneConfig, state: tauri::State) -> Result<(), String> { + let local_path = Path::new(&config.local_path); + if !local_path.exists() { + create_dir_all(local_path).map_err(|e| format!("Failed to create local path: {}", e))?; + } + + let child = Command::new("rclone") + .arg("sync") + .arg(&config.remote_path) + .arg(&config.local_path) + .arg("--no-check-certificate") + .arg("--verbose") + .arg("--rc") + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .spawn() + .map_err(|e| format!("Failed to start rclone: {}", e))?; + + state.sync_processes.lock().unwrap().push(child); + *state.sync_active.lock().unwrap() = true; + Ok(()) +} + +#[tauri::command] +pub fn stop_sync(state: tauri::State) -> Result<(), String> { + let mut processes = state.sync_processes.lock().unwrap(); + for child in processes.iter_mut() { + child.kill().map_err(|e| format!("Failed to kill process: {}", e))?; + } + processes.clear(); + *state.sync_active.lock().unwrap() = false; + Ok(()) +} + +#[tauri::command] +pub fn get_status(remote_name: String) -> Result { + let output = Command::new("rclone") + .arg("rc") + .arg("core/stats") + .arg("--json") + .output() + .map_err(|e| format!("Failed to execute rclone rc: {}", e))?; + + if !output.status.success() { + return Err(format!("rclone rc failed: {}", String::from_utf8_lossy(&output.stderr))); + } + + let json = String::from_utf8_lossy(&output.stdout); + let value: serde_json::Value = serde_json::from_str(&json) + .map_err(|e| format!("Failed to parse rclone status: {}", e))?; + + let transferred = value.get("bytes").and_then(|v| v.as_u64()).unwrap_or(0); + let errors = value.get("errors").and_then(|v| v.as_u64()).unwrap_or(0); + let speed = value.get("speed").and_then(|v| v.as_f64()).unwrap_or(0.0); + + let status = if errors > 0 { + "Error occurred".to_string() + } else if speed > 0.0 { + "Transferring".to_string() + } else if transferred > 0 { + "Completed".to_string() + } else { + "Initializing".to_string() + }; + + Ok(SyncStatus { + name: remote_name, + status, + transferred: format_bytes(transferred), + bytes: format!("{}/s", format_bytes(speed as u64)), + errors: errors as usize, + last_updated: chrono::Local::now().format("%H:%M:%S").to_string(), + }) +} + +pub fn format_bytes(bytes: u64) -> String { + const KB: u64 = 1024; + const MB: u64 = KB * 1024; + const GB: u64 = MB * 1024; + + if bytes >= GB { + format!("{:.2} GB", bytes as f64 / GB as f64) + } else if bytes >= MB { + format!("{:.2} MB", bytes as f64 / MB as f64) + } else if bytes >= KB { + format!("{:.2} KB", bytes as f64 / KB as f64) + } else { + format!("{} B", bytes) + } +} diff --git a/src/web_server/mod.rs b/src/web_server/mod.rs index 1e8c513e0..a0ff1ba9b 100644 --- a/src/web_server/mod.rs +++ b/src/web_server/mod.rs @@ -4,7 +4,7 @@ use std::fs; #[actix_web::get("/")] async fn index() -> Result { - match fs::read_to_string("web/index.html") { + match fs::read_to_string("web/app/index.html") { Ok(html) => Ok(HttpResponse::Ok().content_type("text/html").body(html)), Err(e) => { error!("Failed to load index page: {}", e); @@ -26,10 +26,10 @@ async fn bot_index(req: HttpRequest) -> Result { } } -#[actix_web::get("/static/{filename:.*}")] +#[actix_web::get("/{filename:.*}")] async fn static_files(req: HttpRequest) -> Result { let filename = req.match_info().query("filename"); - let path = format!("web/static/{}", filename); + let path = format!("web/app/{}", filename); match fs::read(&path) { Ok(content) => { debug!( @@ -39,6 +39,8 @@ async fn static_files(req: HttpRequest) -> Result { ); let content_type = match filename { f if f.ends_with(".js") => "application/javascript", + f if f.ends_with(".riot") => "application/javascript", + f if f.ends_with(".html") => "application/javascript", f if f.ends_with(".css") => "text/css", f if f.ends_with(".png") => "image/png", f if f.ends_with(".jpg") | f.ends_with(".jpeg") => "image/jpeg", diff --git a/web/app/app.html b/web/app/app.html new file mode 100644 index 000000000..6db829470 --- /dev/null +++ b/web/app/app.html @@ -0,0 +1,450 @@ + + + +
+
+
+ +
+

"Errar é Humano."

+

General Bots

+
+
+ +
+
+

Sign in to your account

+

Choose your preferred login method

+
+ +
{error}
+ +
+ + + + + + + +
+ +
+ OR +
+ +
+
+ + this.email = e.target.value} + placeholder="your@email.com" required /> +
+ +
+ + this.password = e.target.value} + placeholder="••••••••" required /> +
+ +
+
+ + +
+ Forgot password? +
+ + +
+ + + +

+ By continuing, you agree to our Terms of Service and Privacy Policy. +

+
+
+ + +
+
\ No newline at end of file diff --git a/web/app/chat/chat.page.html b/web/app/chat/chat.page.html new file mode 100644 index 000000000..aeac00368 --- /dev/null +++ b/web/app/chat/chat.page.html @@ -0,0 +1,298 @@ + + + + diff --git a/web/app/client-nav.css b/web/app/client-nav.css new file mode 100644 index 000000000..3502c8580 --- /dev/null +++ b/web/app/client-nav.css @@ -0,0 +1,414 @@ +.nav-container { + position: fixed; + top: 0; + left: 0; + right: 0; + z-index: 50; + background: hsl(var(--background)); + height: auto; + min-height: 40px; + box-shadow: 0 2px 10px rgba(0, 0, 0, 0.5); + border-bottom: 1px solid hsl(var(--border)); +} + +.nav-inner { + max-width: 100%; + margin: 0 auto; + padding: 0 16px; + height: 100%; +} + +.nav-content { + display: flex; + align-items: center; + height: 100%; + gap: 8px; +} + +.auth-controls { + display: flex; + align-items: center; + gap: 8px; + flex-shrink: 0; +} + +.login-container, +.theme-container { + position: relative; +} + +.login-button, +.theme-toggle { + background: hsl(var(--accent)); + border: 1px solid hsl(var(--border)); + color: hsl(var(--accent-foreground)); + width: 32px; + height: 32px; + border-radius: 50%; + cursor: pointer; + font-size: 16px; + display: flex; + align-items: center; + justify-content: center; + transition: all 0.3s ease; +} + +.login-button:hover, +.theme-toggle:hover { + transform: scale(1.1); + box-shadow: 0 0 10px hsla(var(--primary), 0.5); +} + +.login-menu, +.theme-menu { + position: absolute; + top: calc(100% + 8px); + right: 0; + background: hsl(var(--popover)); + border: 1px solid hsl(var(--border)); + border-radius: 6px; + min-width: 120px; + z-index: 100; + box-shadow: 0 4px 10px rgba(0, 0, 0, 0.2); + padding: 4px; + display: flex; + flex-direction: column; + gap: 2px; +} + +.menu-item, +.theme-menu-item { + width: 100%; + padding: 8px 12px; + background: transparent; + border: none; + color: hsl(var(--foreground)); + font-size: 13px; + cursor: pointer; + transition: all 0.2s ease; + text-align: left; + border-radius: 4px; +} + +.menu-item:hover, +.theme-menu-item:hover { + background: hsl(var(--accent)); + color: hsl(var(--accent-foreground)); +} + +.active-theme { + background: hsl(var(--primary)); + color: hsl(var(--primary-foreground)); +} + +.scroll-btn { + background: hsl(var(--accent)); + border: 1px solid hsl(var(--border)); + color: hsl(var(--accent-foreground)); + width: 32px; + height: 32px; + border-radius: 50%; + cursor: pointer; + font-size: 18px; + font-weight: bold; + transition: all 0.3s ease; + flex-shrink: 0; + z-index: 10; + display: flex; + align-items: center; + justify-content: center; +} + +.scroll-btn:hover { + transform: scale(1.1); + box-shadow: 0 0 10px hsla(var(--primary), 0.5); +} + +.scroll-btn:active { + transform: scale(0.95); +} + +.nav-scroll { + flex: 1; + overflow-x: auto; + overflow-y: hidden; + height: 100%; + -ms-overflow-style: none; + scrollbar-width: none; + scroll-behavior: smooth; + position: relative; +} + +.nav-scroll::-webkit-scrollbar { + display: none; +} + +.nav-items { + display: flex; + align-items: center; + height: 100%; + white-space: nowrap; + gap: 3px; + padding: 0 8px; +} + +.nav-item { + position: relative; + background: hsl(var(--card)); + border: 1px solid hsl(var(--border)); + color: hsl(var(--foreground)); + font-size: 13px; + font-weight: 500; + padding: 6px 14px; + cursor: pointer; + border-radius: 6px; + height: 32px; + display: inline-flex; + align-items: center; + justify-content: center; + text-decoration: none; + white-space: nowrap; + transition: all 0.3s ease; + overflow: hidden; + min-width: 70px; +} + +.nav-item::before { + content: ''; + position: absolute; + top: 0; + left: -100%; + width: 100%; + height: 100%; + background: linear-gradient(90deg, transparent, rgba(var(--neon-color-rgb, 0, 255, 255), 0.2), transparent); + transition: left 0.5s; +} + +.nav-item:hover::before { + left: 100%; +} + +.nav-item:hover { + border-color: var(--neon-color, hsl(var(--primary))); + color: var(--neon-color, hsl(var(--primary))); + box-shadow: 0 0 15px rgba(var(--neon-color-rgb, 0, 255, 255), 0.3); + text-shadow: 0 0 6px rgba(var(--neon-color-rgb, 0, 255, 255), 0.4); +} + +.nav-item.active { + border-color: var(--neon-color, hsl(var(--primary))); + color: var(--neon-color, hsl(var(--primary))); + box-shadow: 0 0 20px rgba(var(--neon-color-rgb, 0, 255, 255), 0.4); + text-shadow: 0 0 8px rgba(var(--neon-color-rgb, 0, 255, 255), 0.6); +} + +.nav-item.active:hover { + box-shadow: 0 0 25px rgba(var(--neon-color-rgb, 0, 255, 255), 0.6); +} + +.neon-glow { + position: absolute; + top: -2px; + left: -2px; + right: -2px; + bottom: -2px; + background: linear-gradient(45deg, transparent, rgba(var(--neon-color-rgb, 0, 255, 255), 0.3), transparent); + border-radius: 8px; + opacity: 0; + transition: opacity 0.3s ease; + z-index: -1; +} + +.nav-item:hover .neon-glow, +.nav-item.active .neon-glow { + opacity: 1; +} + +.nav-spacer { + height: 40px; +} + +/* Set CSS custom properties for each neon color */ +.nav-item[style*="--neon-color: #25D366"] { + --neon-color-rgb: 37, 211, 102; +} + +.nav-item[style*="--neon-color: #6366F1"] { + --neon-color-rgb: 99, 102, 241; +} + +.nav-item[style*="--neon-color: #FFD700"] { + --neon-color-rgb: 255, 215, 0; +} + +.nav-item[style*="--neon-color: #10B981"] { + --neon-color-rgb: 16, 185, 129; +} + +.nav-item[style*="--neon-color: #2563EB"] { + --neon-color-rgb: 37, 99, 235; +} + +.nav-item[style*="--neon-color: #8B5CF6"] { + --neon-color-rgb: 139, 92, 246; +} + +.nav-item[style*="--neon-color: #059669"] { + --neon-color-rgb: 5, 150, 105; +} + +.nav-item[style*="--neon-color: #DC2626"] { + --neon-color-rgb: 220, 38, 38; +} + +.nav-item[style*="--neon-color: #1DB954"] { + --neon-color-rgb: 29, 185, 84; +} + +.nav-item[style*="--neon-color: #F59E0B"] { + --neon-color-rgb: 245, 158, 11; +} + +.nav-item[style*="--neon-color: #6B7280"] { + --neon-color-rgb: 107, 114, 128; +} + +@media (max-width: 768px) { + .nav-container { + height: 44px; + } + + .nav-spacer { + height: 44px; + } + + .nav-inner { + padding: 0 12px; + } + + .nav-content { + gap: 6px; + } + + .scroll-btn { + width: 30px; + height: 30px; + font-size: 16px; + } + + .theme-toggle, + .login-button { + width: 30px; + height: 30px; + font-size: 14px; + } + + .nav-item { + font-size: 13px; + padding: 8px 16px; + height: 36px; + margin: 0 2px; + } + + .nav-items { + gap: 6px; + padding: 0 8px; + } + + .auth-controls { + gap: 6px; + } +} + +@media (max-width: 480px) { + .nav-container { + height: 48px; + } + + .nav-spacer { + height: 48px; + } + + .nav-inner { + padding: 0 8px; + } + + .nav-content { + gap: 6px; + } + + .scroll-btn { + width: 28px; + height: 28px; + font-size: 16px; + } + + .theme-toggle, + .login-button { + width: 28px; + height: 28px; + font-size: 12px; + } + + .nav-item { + font-size: 12px; + padding: 10px 14px; + height: 34px; + margin: 0 2px; + } + + .nav-items { + gap: 4px; + padding: 0 6px; + } + + .auth-controls { + gap: 4px; + } +} + +@media (max-width: 320px) { + .nav-inner { + padding: 0 6px; + } + + .nav-content { + gap: 4px; + } + + .nav-item { + padding: 8px 12px; + height: 32px; + font-size: 11px; + } + + .nav-items { + gap: 3px; + padding: 0 4px; + } + + .theme-toggle, + .login-button { + width: 26px; + height: 26px; + font-size: 11px; + } + + .scroll-btn { + width: 26px; + height: 26px; + font-size: 14px; + } +} + +/* Touch-friendly scrolling for mobile */ +@media (hover: none) and (pointer: coarse) { + .nav-scroll { + -webkit-overflow-scrolling: touch; + scroll-snap-type: x mandatory; + } + + .nav-item { + scroll-snap-align: start; + } +} \ No newline at end of file diff --git a/web/app/client-nav.html b/web/app/client-nav.html new file mode 100644 index 000000000..8ac14721c --- /dev/null +++ b/web/app/client-nav.html @@ -0,0 +1,340 @@ + + + + + + +
+
+
+
+ + RETRO NAVIGATOR v4.0 +
+
+
+ READY +
+
+ THEME: + {theme.label} +
+
+
+ {formatDate(currentTime)} + {formatTime(currentTime)} +
+ + SYS +
+
+
+
+ + + + + diff --git a/web/app/dashboard/dashboard.page.html b/web/app/dashboard/dashboard.page.html new file mode 100644 index 000000000..6c8e61e2a --- /dev/null +++ b/web/app/dashboard/dashboard.page.html @@ -0,0 +1,145 @@ + + + + diff --git a/web/app/drive/drive.page.html b/web/app/drive/drive.page.html new file mode 100644 index 000000000..7403089b0 --- /dev/null +++ b/web/app/drive/drive.page.html @@ -0,0 +1,227 @@ + + + + diff --git a/web/app/drive/prompt.md b/web/app/drive/prompt.md new file mode 100644 index 000000000..88780fb7b --- /dev/null +++ b/web/app/drive/prompt.md @@ -0,0 +1 @@ +- The UI shoule look exactly xtree gold but using shadcn with keyborad shortcut well explicit. diff --git a/web/app/editor/editor.page.html b/web/app/editor/editor.page.html new file mode 100644 index 000000000..e961a2f7c --- /dev/null +++ b/web/app/editor/editor.page.html @@ -0,0 +1,340 @@ + + + + + + diff --git a/web/app/editor/style.css b/web/app/editor/style.css new file mode 100644 index 000000000..18ed1e603 --- /dev/null +++ b/web/app/editor/style.css @@ -0,0 +1,423 @@ +:root { + /* 3DBevel Theme */ + --background: 0 0% 80%; + --foreground: 0 0% 10%; + --card: 0 0% 75%; + --card-foreground: 0 0% 10%; + --popover: 0 0% 80%; + --popover-foreground: 0 0% 10%; + --primary: 210 80% 40%; + --primary-foreground: 0 0% 80%; + --secondary: 0 0% 70%; + --secondary-foreground: 0 0% 10%; + --muted: 0 0% 65%; + --muted-foreground: 0 0% 30%; + --accent: 30 80% 40%; + --accent-foreground: 0 0% 80%; + --destructive: 0 85% 60%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 70%; + --input: 0 0% 70%; + --ring: 210 80% 40%; + --radius: 0.5rem; +} + +* { + box-sizing: border-box; +} + +.word-clone { + min-height: 100vh; + background: hsl(var(--background)); + color: hsl(var(--foreground)); + font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif; +} + +/* Title Bar */ +.title-bar { + background: hsl(var(--primary)); + color: hsl(var(--primary-foreground)); + padding: 8px 16px; + display: flex; + align-items: center; + justify-content: space-between; + border-bottom: 2px solid hsl(var(--border)); +} + +.title-bar h1 { + font-size: 14px; + font-weight: 600; + margin: 0; +} + +.title-controls { + display: flex; + gap: 8px; +} + +.title-input { + background: hsl(var(--input)); + border: 1px solid hsl(var(--border)); + border-radius: var(--radius); + padding: 4px 8px; + font-size: 12px; + color: hsl(var(--foreground)); +} + +/* Quick Access Toolbar */ +.quick-access { + background: hsl(var(--card)); + border-bottom: 1px solid hsl(var(--border)); + padding: 4px 8px; + display: flex; + align-items: center; + gap: 2px; +} + +.quick-access-btn { + background: transparent; + border: 1px solid transparent; + border-radius: 3px; + padding: 4px; + cursor: pointer; + color: hsl(var(--foreground)); + transition: all 0.2s; +} + +.quick-access-btn:hover { + background: hsl(var(--muted)); + border-color: hsl(var(--border)); +} + +/* Ribbon */ +.ribbon { + background: hsl(var(--card)); + border-bottom: 2px solid hsl(var(--border)); +} + +.ribbon-tabs { + display: flex; + background: hsl(var(--muted)); + border-bottom: 1px solid hsl(var(--border)); +} + +.ribbon-tab-button { + background: transparent; + border: none; + padding: 8px 16px; + cursor: pointer; + font-size: 12px; + color: hsl(var(--muted-foreground)); + border-bottom: 2px solid transparent; + transition: all 0.2s; +} + +.ribbon-tab-button:hover { + background: hsl(var(--secondary)); + color: hsl(var(--foreground)); +} + +.ribbon-tab-button.active { + background: hsl(var(--card)); + color: hsl(var(--foreground)); + border-bottom-color: hsl(var(--primary)); + font-weight: 600; +} + +.ribbon-content { + display: flex; + padding: 8px; + gap: 2px; + min-height: 80px; + align-items: stretch; +} + +.ribbon-group { + display: flex; + flex-direction: column; + border-right: 1px solid hsl(var(--border)); + padding-right: 8px; + margin-right: 8px; +} + +.ribbon-group:last-child { + border-right: none; +} + +.ribbon-group-content { + display: flex; + flex-wrap: wrap; + gap: 2px; + flex: 1; + align-items: flex-start; + padding: 4px 0; +} + +.ribbon-group-title { + font-size: 10px; + color: hsl(var(--muted-foreground)); + text-align: center; + margin-top: 4px; + border-top: 1px solid hsl(var(--border)); + padding-top: 2px; +} + +.ribbon-button { + background: transparent; + border: 1px solid transparent; + border-radius: 3px; + cursor: pointer; + color: hsl(var(--foreground)); + transition: all 0.2s; + position: relative; +} + +.ribbon-button:hover { + background: hsl(var(--muted)); + border-color: hsl(var(--border)); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} + +.ribbon-button.active { + background: hsl(var(--primary)); + color: hsl(var(--primary-foreground)); + border-color: hsl(var(--primary)); +} + +.ribbon-button.medium { + padding: 6px; + min-width: 32px; + min-height: 32px; +} + +.ribbon-button.large { + padding: 8px; + min-width: 48px; + min-height: 48px; + flex-direction: column; +} + +.ribbon-button-content { + display: flex; + flex-direction: column; + align-items: center; + gap: 2px; +} + +.ribbon-button-label { + font-size: 10px; + text-align: center; + line-height: 1.1; +} + +.dropdown-arrow { + position: absolute; + bottom: 2px; + right: 2px; +} + +/* Format Controls */ +.format-select { + background: hsl(var(--input)); + border: 1px solid hsl(var(--border)); + border-radius: 3px; + padding: 4px 6px; + font-size: 11px; + color: hsl(var(--foreground)); + margin: 2px; +} + +.color-picker-wrapper { + position: relative; + display: inline-block; +} + +.color-picker { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + opacity: 0; + cursor: pointer; +} + +.color-indicator { + position: absolute; + bottom: 2px; + left: 50%; + transform: translateX(-50%); + width: 16px; + height: 3px; + border-radius: 1px; +} + +/* Editor Area */ +.editor-container { + display: flex; + flex: 1; + background: hsl(var(--muted)); +} + +.editor-sidebar { + width: 200px; + background: hsl(var(--card)); + border-right: 1px solid hsl(var(--border)); + padding: 16px; +} + +.editor-main { + flex: 1; + display: flex; + flex-direction: column; + align-items: center; + padding: 20px; + overflow-y: auto; + max-height: calc(100vh - 200px); +} + +.pages-container { + display: flex; + flex-direction: column; + gap: 20px; + + /* Example: Use a CSS variable for zoom, set --zoom: 1 for 100% */ + transform: scale(var(--zoom, 1)); + transform-origin: top center; +} + +.page { + width: 210mm; + min-height: 297mm; + background: white; + box-shadow: + 0 0 0 1px hsl(var(--border)), + 0 4px 8px rgba(0, 0, 0, 0.1), + 0 8px 16px rgba(0, 0, 0, 0.05); + position: relative; + margin: 0 auto; +} + +.page-number { + position: absolute; + top: -30px; + left: 50%; + transform: translateX(-50%); + font-size: 12px; + color: hsl(var(--muted-foreground)); + background: hsl(var(--background)); + padding: 2px 8px; + border-radius: 10px; +} + +.page-content { + padding: 25mm; + min-height: 247mm; +} + +.ProseMirror { + outline: none; + min-height: 100%; +} + +.ProseMirror img { + max-width: 100%; + height: auto; + border-radius: 4px; +} + +.ProseMirror a { + color: hsl(var(--primary)); + text-decoration: underline; +} + +/* Table styles */ +.editor-table { + border-collapse: collapse; + margin: 16px 0; + width: 100%; + border: 1px solid hsl(var(--border)); +} + +.editor-table td, +.editor-table th { + border: 1px solid hsl(var(--border)); + padding: 8px 12px; + min-width: 50px; + position: relative; +} + +.editor-table th { + background: hsl(var(--muted)); + font-weight: 600; +} + +/* Bubble Menu */ +.bubble-menu { + background: hsl(var(--card)); + border: 1px solid hsl(var(--border)); + border-radius: var(--radius); + box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15); + display: flex; + padding: 4px; + gap: 2px; +} + +.bubble-menu .ribbon-button { + min-width: 28px; + min-height: 28px; + padding: 4px; +} + +/* Status Bar */ +.status-bar { + background: hsl(var(--card)); + border-top: 1px solid hsl(var(--border)); + padding: 4px 12px; + display: flex; + justify-content: space-between; + align-items: center; + font-size: 11px; + color: hsl(var(--muted-foreground)); +} + +.zoom-controls { + display: flex; + align-items: center; + gap: 8px; +} + +.zoom-slider { + width: 100px; +} + +@media print { + + .title-bar, + .quick-access, + .ribbon, + .editor-sidebar, + .status-bar { + display: none !important; + } + + .editor-main { + padding: 0; + max-height: none; + } + + .pages-container { + transform: none; + gap: 0; + } + + .page { + box-shadow: none; + margin: 0; + break-after: page; + } + + .page-number { + display: none; + } +} \ No newline at end of file diff --git a/web/app/index.html b/web/app/index.html new file mode 100644 index 000000000..7b3d48e8c --- /dev/null +++ b/web/app/index.html @@ -0,0 +1,24 @@ + + + + + General Bots + + + + + + + + + + + + + \ No newline at end of file diff --git a/web/app/mail/use-mail.ts b/web/app/mail/use-mail.ts new file mode 100644 index 000000000..d197ac9d2 --- /dev/null +++ b/web/app/mail/use-mail.ts @@ -0,0 +1,15 @@ +import { atom, useAtom } from "jotai" + +import { Mail, mails } from "./data" + +type Config = { + selected: Mail["id"] | null +} + +const configAtom = atom({ + selected: mails[0].id, +}) + +export function useMail() { + return useAtom(configAtom) +} diff --git a/web/app/news/news.page.html b/web/app/news/news.page.html new file mode 100644 index 000000000..8f003263e --- /dev/null +++ b/web/app/news/news.page.html @@ -0,0 +1,14 @@ + + + + diff --git a/web/app/paper/paper.page.html b/web/app/paper/paper.page.html new file mode 100644 index 000000000..1da9ced8c --- /dev/null +++ b/web/app/paper/paper.page.html @@ -0,0 +1,179 @@ + + + + diff --git a/web/app/paper/style.css b/web/app/paper/style.css new file mode 100644 index 000000000..a209b911d --- /dev/null +++ b/web/app/paper/style.css @@ -0,0 +1,103 @@ + .ProseMirror { + outline: none; + font-family: 'Inter', system-ui, -apple-system, sans-serif; + font-size: 16px; + line-height: 1.7; + color: hsl(var(--foreground)); + padding: 3rem; + + min-height: calc(100vh - 12rem); + } + + .ProseMirror h1 { + font-size: 2.5rem; + font-weight: 700; + margin: 2rem 0 1rem 0; + color: hsl(var(--primary)); + } + + .ProseMirror h2 { + font-size: 2rem; + font-weight: 600; + margin: 1.5rem 0 0.75rem 0; + color: hsl(var(--primary)); + } + + .ProseMirror h3 { + font-size: 1.5rem; + font-weight: 600; + margin: 1.25rem 0 0.5rem 0; + color: hsl(var(--primary)); + } + + .ProseMirror p { + margin: 0.75rem 0; + } + + .ProseMirror a { + color: hsl(var(--accent)); + text-decoration: underline; + text-underline-offset: 2px; + } + + .ProseMirror a:hover { + color: hsl(var(--primary)); + } + + .ProseMirror mark { + background-color: #ffff0040; + border-radius: 2px; + padding: 0 2px; + } + + .ProseMirror ul, .ProseMirror ol { + margin: 1rem 0; + padding-left: 1.5rem; + } + + .ProseMirror li { + margin: 0.25rem 0; + } + + .ProseMirror blockquote { + border-left: 4px solid hsl(var(--primary)); + padding-left: 1rem; + margin: 1rem 0; + font-style: italic; + color: hsl(var(--muted-foreground)); + } + + .ProseMirror code { + background-color: hsl(var(--muted)); + padding: 0.25rem 0.5rem; + border-radius: 4px; + font-family: 'JetBrains Mono', monospace; + font-size: 0.9em; + } + + .ProseMirror pre { + background-color: hsl(var(--muted)); + padding: 1rem; + border-radius: 8px; + overflow-x: auto; + margin: 1rem 0; + } + + .ProseMirror pre code { + background: none; + padding: 0; + } + + /* Selection highlighting */ + .ProseMirror ::selection { + background-color: hsl(var(--primary) / 0.2); + } + + /* Placeholder styling */ + .ProseMirror p.is-editor-empty:first-child::before { + content: attr(data-placeholder); + float: left; + color: hsl(var(--muted-foreground)); + pointer-events: none; + height: 0; + } diff --git a/web/app/player/style.css b/web/app/player/style.css new file mode 100644 index 000000000..cc5ef6eab --- /dev/null +++ b/web/app/player/style.css @@ -0,0 +1,32 @@ +.slider::-webkit-slider-thumb { + appearance: none; + height: 12px; + width: 12px; + border-radius: 50%; + background: hsl(var(--primary)); + cursor: pointer; + border: 2px solid hsl(var(--primary-foreground)); +} + +.slider::-moz-range-thumb { + height: 12px; + width: 12px; + border-radius: 50%; + background: hsl(var(--primary)); + cursor: pointer; + border: 2px solid hsl(var(--primary-foreground)); +} + +.slider::-webkit-slider-track { + height: 4px; + cursor: pointer; + background: hsl(var(--muted)); + border-radius: 2px; +} + +.slider::-moz-range-track { + height: 4px; + cursor: pointer; + background: hsl(var(--muted)); + border-radius: 2px; +} \ No newline at end of file diff --git a/web/app/public/images/generalbots-192x192.png b/web/app/public/images/generalbots-192x192.png new file mode 100644 index 000000000..651fe52e9 Binary files /dev/null and b/web/app/public/images/generalbots-192x192.png differ diff --git a/web/app/public/output.css b/web/app/public/output.css new file mode 100644 index 000000000..ef3ff7a20 --- /dev/null +++ b/web/app/public/output.css @@ -0,0 +1,4751 @@ +/* +! tailwindcss v3.3.0 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +5. Use the user's configured `sans` font-feature-settings by default. +6. Use the user's configured `sans` font-variation-settings by default. +*/ + +html { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ + font-feature-settings: normal; + /* 5 */ + font-variation-settings: normal; + /* 6 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +/* Make elements with the HTML hidden attribute stay hidden by default */ + +[hidden] { + display: none; +} + +:root { + --background: 0 0% 100%; + --foreground: 0 0% 3.9%; + --card: 0 0% 100%; + --card-foreground: 0 0% 3.9%; + --popover: 0 0% 100%; + --popover-foreground: 0 0% 3.9%; + --primary: 0 0% 9%; + --primary-foreground: 0 0% 98%; + --secondary: 0 0% 96.1%; + --secondary-foreground: 0 0% 9%; + --muted: 0 0% 96.1%; + --muted-foreground: 0 0% 45.1%; + --accent: 0 0% 96.1%; + --accent-foreground: 0 0% 9%; + --destructive: 0 84.2% 60.2%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 89.8%; + --input: 0 0% 89.8%; + --ring: 0 0% 3.9%; + --chart-1: 12 76% 61%; + --chart-2: 173 58% 39%; + --chart-3: 197 37% 24%; + --chart-4: 43 74% 66%; + --chart-5: 27 87% 67%; + --radius: 0.5rem + ; + --sidebar-background: 0 0% 98%; + --sidebar-foreground: 240 5.3% 26.1%; + --sidebar-primary: 240 5.9% 10%; + --sidebar-primary-foreground: 0 0% 98%; + --sidebar-accent: 240 4.8% 95.9%; + --sidebar-accent-foreground: 240 5.9% 10%; + --sidebar-border: 220 13% 91%; + --sidebar-ring: 217.2 91.2% 59.8% +} + +.dark { + --background: 0 0% 3.9%; + --foreground: 0 0% 98%; + --card: 0 0% 3.9%; + --card-foreground: 0 0% 98%; + --popover: 0 0% 3.9%; + --popover-foreground: 0 0% 98%; + --primary: 0 0% 98%; + --primary-foreground: 0 0% 9%; + --secondary: 0 0% 14.9%; + --secondary-foreground: 0 0% 98%; + --muted: 0 0% 14.9%; + --muted-foreground: 0 0% 63.9%; + --accent: 0 0% 14.9%; + --accent-foreground: 0 0% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 14.9%; + --input: 0 0% 14.9%; + --ring: 0 0% 83.1%; + --chart-1: 220 70% 50%; + --chart-2: 160 60% 45%; + --chart-3: 30 80% 55%; + --chart-4: 280 65% 60%; + --chart-5: 340 75% 55% + ; + --sidebar-background: 240 5.9% 10%; + --sidebar-foreground: 240 4.8% 95.9%; + --sidebar-primary: 224.3 76.3% 48%; + --sidebar-primary-foreground: 0 0% 100%; + --sidebar-accent: 240 3.7% 15.9%; + --sidebar-accent-foreground: 240 4.8% 95.9%; + --sidebar-border: 240 3.7% 15.9%; + --sidebar-ring: 217.2 91.2% 59.8% +} + +* { + border-color: hsl(var(--border)); +} + +body { + background-color: hsl(var(--background)); + color: hsl(var(--foreground)); +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +.container { + width: 100%; +} + +@media (min-width: 640px) { + .container { + max-width: 640px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 768px; + } +} + +@media (min-width: 1024px) { + .container { + max-width: 1024px; + } +} + +@media (min-width: 1280px) { + .container { + max-width: 1280px; + } +} + +@media (min-width: 1536px) { + .container { + max-width: 1536px; + } +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +.pointer-events-none { + pointer-events: none; +} + +.pointer-events-auto { + pointer-events: auto; +} + +.visible { + visibility: visible; +} + +.invisible { + visibility: hidden; +} + +.static { + position: static; +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.inset-0 { + inset: 0px; +} + +.inset-x-0 { + left: 0px; + right: 0px; +} + +.inset-y-0 { + top: 0px; + bottom: 0px; +} + +.-bottom-12 { + bottom: -3rem; +} + +.-left-12 { + left: -3rem; +} + +.-right-1 { + right: -0.25rem; +} + +.-right-12 { + right: -3rem; +} + +.-top-1 { + top: -0.25rem; +} + +.-top-12 { + top: -3rem; +} + +.bottom-0 { + bottom: 0px; +} + +.bottom-3 { + bottom: 0.75rem; +} + +.left-0 { + left: 0px; +} + +.left-1 { + left: 0.25rem; +} + +.left-1\/2 { + left: 50%; +} + +.left-2 { + left: 0.5rem; +} + +.left-3 { + left: 0.75rem; +} + +.left-\[50\%\] { + left: 50%; +} + +.right-0 { + right: 0px; +} + +.right-1 { + right: 0.25rem; +} + +.right-2 { + right: 0.5rem; +} + +.right-3 { + right: 0.75rem; +} + +.right-4 { + right: 1rem; +} + +.right-6 { + right: 1.5rem; +} + +.top-0 { + top: 0px; +} + +.top-1 { + top: 0.25rem; +} + +.top-1\.5 { + top: 0.375rem; +} + +.top-1\/2 { + top: 50%; +} + +.top-2 { + top: 0.5rem; +} + +.top-2\.5 { + top: 0.625rem; +} + +.top-3 { + top: 0.75rem; +} + +.top-3\.5 { + top: 0.875rem; +} + +.top-4 { + top: 1rem; +} + +.top-\[1px\] { + top: 1px; +} + +.top-\[50\%\] { + top: 50%; +} + +.top-\[60\%\] { + top: 60%; +} + +.top-full { + top: 100%; +} + +.z-10 { + z-index: 10; +} + +.z-20 { + z-index: 20; +} + +.z-50 { + z-index: 50; +} + +.z-\[100\] { + z-index: 100; +} + +.z-\[1\] { + z-index: 1; +} + +.m-0 { + margin: 0px; +} + +.-mx-1 { + margin-left: -0.25rem; + margin-right: -0.25rem; +} + +.mx-1 { + margin-left: 0.25rem; + margin-right: 0.25rem; +} + +.mx-2 { + margin-left: 0.5rem; + margin-right: 0.5rem; +} + +.mx-3 { + margin-left: 0.75rem; + margin-right: 0.75rem; +} + +.mx-3\.5 { + margin-left: 0.875rem; + margin-right: 0.875rem; +} + +.mx-4 { + margin-left: 1rem; + margin-right: 1rem; +} + +.mx-auto { + margin-left: auto; + margin-right: auto; +} + +.my-0 { + margin-top: 0px; + margin-bottom: 0px; +} + +.my-0\.5 { + margin-top: 0.125rem; + margin-bottom: 0.125rem; +} + +.my-1 { + margin-top: 0.25rem; + margin-bottom: 0.25rem; +} + +.my-4 { + margin-top: 1rem; + margin-bottom: 1rem; +} + +.my-6 { + margin-top: 1.5rem; + margin-bottom: 1.5rem; +} + +.my-8 { + margin-top: 2rem; + margin-bottom: 2rem; +} + +.-ml-4 { + margin-left: -1rem; +} + +.-mt-4 { + margin-top: -1rem; +} + +.mb-1 { + margin-bottom: 0.25rem; +} + +.mb-1\.5 { + margin-bottom: 0.375rem; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.mb-3 { + margin-bottom: 0.75rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.mb-6 { + margin-bottom: 1.5rem; +} + +.ml-1 { + margin-left: 0.25rem; +} + +.ml-2 { + margin-left: 0.5rem; +} + +.ml-4 { + margin-left: 1rem; +} + +.ml-auto { + margin-left: auto; +} + +.mr-1 { + margin-right: 0.25rem; +} + +.mr-2 { + margin-right: 0.5rem; +} + +.mt-0 { + margin-top: 0px; +} + +.mt-0\.5 { + margin-top: 0.125rem; +} + +.mt-1 { + margin-top: 0.25rem; +} + +.mt-1\.5 { + margin-top: 0.375rem; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.mt-24 { + margin-top: 6rem; +} + +.mt-3 { + margin-top: 0.75rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.mt-8 { + margin-top: 2rem; +} + +.mt-auto { + margin-top: auto; +} + +.line-clamp-1 { + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; +} + +.line-clamp-2 { + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 2; +} + +.block { + display: block; +} + +.inline-block { + display: inline-block; +} + +.flex { + display: flex; +} + +.inline-flex { + display: inline-flex; +} + +.table { + display: table; +} + +.grid { + display: grid; +} + +.hidden { + display: none; +} + +.aspect-square { + aspect-ratio: 1 / 1; +} + +.aspect-video { + aspect-ratio: 16 / 9; +} + +.h-1 { + height: 0.25rem; +} + +.h-1\.5 { + height: 0.375rem; +} + +.h-1\/3 { + height: 33.333333%; +} + +.h-10 { + height: 2.5rem; +} + +.h-12 { + height: 3rem; +} + +.h-2 { + height: 0.5rem; +} + +.h-2\.5 { + height: 0.625rem; +} + +.h-20 { + height: 5rem; +} + +.h-24 { + height: 6rem; +} + +.h-3 { + height: 0.75rem; +} + +.h-3\.5 { + height: 0.875rem; +} + +.h-4 { + height: 1rem; +} + +.h-40 { + height: 10rem; +} + +.h-48 { + height: 12rem; +} + +.h-5 { + height: 1.25rem; +} + +.h-6 { + height: 1.5rem; +} + +.h-7 { + height: 1.75rem; +} + +.h-8 { + height: 2rem; +} + +.h-80 { + height: 20rem; +} + +.h-9 { + height: 2.25rem; +} + +.h-\[1px\] { + height: 1px; +} + +.h-\[470px\] { + height: 470px; +} + +.h-\[52px\] { + height: 52px; +} + +.h-\[calc\(100vh-40px\)\] { + height: calc(100vh - 40px); +} + +.h-\[calc\(100vh-50px\)\] { + height: calc(100vh - 50px); +} + +.h-\[var\(--radix-navigation-menu-viewport-height\)\] { + height: var(--radix-navigation-menu-viewport-height); +} + +.h-\[var\(--radix-select-trigger-height\)\] { + height: var(--radix-select-trigger-height); +} + +.h-auto { + height: auto; +} + +.h-full { + height: 100%; +} + +.h-px { + height: 1px; +} + +.h-screen { + height: 100vh; +} + +.max-h-\[--radix-context-menu-content-available-height\] { + max-height: var(--radix-context-menu-content-available-height); +} + +.max-h-\[--radix-select-content-available-height\] { + max-height: var(--radix-select-content-available-height); +} + +.max-h-\[300px\] { + max-height: 300px; +} + +.max-h-\[800px\] { + max-height: 800px; +} + +.max-h-\[calc\(100vh-200px\)\] { + max-height: calc(100vh - 200px); +} + +.max-h-\[var\(--radix-dropdown-menu-content-available-height\)\] { + max-height: var(--radix-dropdown-menu-content-available-height); +} + +.max-h-screen { + max-height: 100vh; +} + +.min-h-0 { + min-height: 0px; +} + +.min-h-\[100px\] { + min-height: 100px; +} + +.min-h-\[200px\] { + min-height: 200px; +} + +.min-h-\[60px\] { + min-height: 60px; +} + +.min-h-\[calc\(100vh-12rem\)\] { + min-height: calc(100vh - 12rem); +} + +.min-h-\[calc\(100vh-43px\)\] { + min-height: calc(100vh - 43px); +} + +.min-h-\[calc\(100vh-8rem\)\] { + min-height: calc(100vh - 8rem); +} + +.min-h-screen { + min-height: 100vh; +} + +.w-0 { + width: 0px; +} + +.w-1 { + width: 0.25rem; +} + +.w-10 { + width: 2.5rem; +} + +.w-12 { + width: 3rem; +} + +.w-2 { + width: 0.5rem; +} + +.w-2\.5 { + width: 0.625rem; +} + +.w-20 { + width: 5rem; +} + +.w-24 { + width: 6rem; +} + +.w-3 { + width: 0.75rem; +} + +.w-3\.5 { + width: 0.875rem; +} + +.w-3\/4 { + width: 75%; +} + +.w-4 { + width: 1rem; +} + +.w-5 { + width: 1.25rem; +} + +.w-56 { + width: 14rem; +} + +.w-6 { + width: 1.5rem; +} + +.w-64 { + width: 16rem; +} + +.w-7 { + width: 1.75rem; +} + +.w-72 { + width: 18rem; +} + +.w-8 { + width: 2rem; +} + +.w-80 { + width: 20rem; +} + +.w-9 { + width: 2.25rem; +} + +.w-\[--sidebar-width\] { + width: var(--sidebar-width); +} + +.w-\[100px\] { + width: 100px; +} + +.w-\[140px\] { + width: 140px; +} + +.w-\[1px\] { + width: 1px; +} + +.w-\[200px\] { + width: 200px; +} + +.w-\[280px\] { + width: 280px; +} + +.w-\[40\%\] { + width: 40%; +} + +.w-\[535px\] { + width: 535px; +} + +.w-\[60\%\] { + width: 60%; +} + +.w-auto { + width: auto; +} + +.w-full { + width: 100%; +} + +.w-max { + width: -moz-max-content; + width: max-content; +} + +.w-px { + width: 1px; +} + +.min-w-0 { + min-width: 0px; +} + +.min-w-\[12rem\] { + min-width: 12rem; +} + +.min-w-\[250px\] { + min-width: 250px; +} + +.min-w-\[50px\] { + min-width: 50px; +} + +.min-w-\[8rem\] { + min-width: 8rem; +} + +.min-w-\[var\(--radix-select-trigger-width\)\] { + min-width: var(--radix-select-trigger-width); +} + +.min-w-fit { + min-width: -moz-fit-content; + min-width: fit-content; +} + +.min-w-max { + min-width: -moz-max-content; + min-width: max-content; +} + +.max-w-4xl { + max-width: 56rem; +} + +.max-w-\[--skeleton-width\] { + max-width: var(--skeleton-width); +} + +.max-w-\[85\%\] { + max-width: 85%; +} + +.max-w-full { + max-width: 100%; +} + +.max-w-lg { + max-width: 32rem; +} + +.max-w-max { + max-width: -moz-max-content; + max-width: max-content; +} + +.max-w-md { + max-width: 28rem; +} + +.max-w-none { + max-width: none; +} + +.flex-1 { + flex: 1 1 0%; +} + +.flex-shrink-0 { + flex-shrink: 0; +} + +.shrink-0 { + flex-shrink: 0; +} + +.flex-grow { + flex-grow: 1; +} + +.grow { + flex-grow: 1; +} + +.grow-0 { + flex-grow: 0; +} + +.basis-full { + flex-basis: 100%; +} + +.caption-bottom { + caption-side: bottom; +} + +.border-collapse { + border-collapse: collapse; +} + +.origin-\[--radix-context-menu-content-transform-origin\] { + transform-origin: var(--radix-context-menu-content-transform-origin); +} + +.origin-\[--radix-dropdown-menu-content-transform-origin\] { + transform-origin: var(--radix-dropdown-menu-content-transform-origin); +} + +.origin-\[--radix-hover-card-content-transform-origin\] { + transform-origin: var(--radix-hover-card-content-transform-origin); +} + +.origin-\[--radix-menubar-content-transform-origin\] { + transform-origin: var(--radix-menubar-content-transform-origin); +} + +.origin-\[--radix-popover-content-transform-origin\] { + transform-origin: var(--radix-popover-content-transform-origin); +} + +.origin-\[--radix-select-content-transform-origin\] { + transform-origin: var(--radix-select-content-transform-origin); +} + +.origin-\[--radix-tooltip-content-transform-origin\] { + transform-origin: var(--radix-tooltip-content-transform-origin); +} + +.-translate-x-1\/2 { + --tw-translate-x: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.-translate-x-px { + --tw-translate-x: -1px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.-translate-y-1\/2 { + --tw-translate-y: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-x-\[-50\%\] { + --tw-translate-x: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-x-px { + --tw-translate-x: 1px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-y-\[-50\%\] { + --tw-translate-y: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.rotate-45 { + --tw-rotate: 45deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.rotate-90 { + --tw-rotate: 90deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +@keyframes bounce { + 0%, 100% { + transform: translateY(-25%); + animation-timing-function: cubic-bezier(0.8,0,1,1); + } + + 50% { + transform: none; + animation-timing-function: cubic-bezier(0,0,0.2,1); + } +} + +.animate-bounce { + animation: bounce 1s infinite; +} + +@keyframes pulse { + 50% { + opacity: .5; + } +} + +.animate-pulse { + animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; +} + +.cursor-default { + cursor: default; +} + +.cursor-not-allowed { + cursor: not-allowed; +} + +.cursor-pointer { + cursor: pointer; +} + +.touch-none { + touch-action: none; +} + +.select-none { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.resize-none { + resize: none; +} + +.resize { + resize: both; +} + +.list-none { + list-style-type: none; +} + +.appearance-none { + -webkit-appearance: none; + -moz-appearance: none; + appearance: none; +} + +.grid-cols-1 { + grid-template-columns: repeat(1, minmax(0, 1fr)); +} + +.grid-cols-7 { + grid-template-columns: repeat(7, minmax(0, 1fr)); +} + +.flex-row { + flex-direction: row; +} + +.flex-col { + flex-direction: column; +} + +.flex-col-reverse { + flex-direction: column-reverse; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.items-start { + align-items: flex-start; +} + +.items-end { + align-items: flex-end; +} + +.items-center { + align-items: center; +} + +.items-stretch { + align-items: stretch; +} + +.justify-start { + justify-content: flex-start; +} + +.justify-end { + justify-content: flex-end; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.gap-1 { + gap: 0.25rem; +} + +.gap-1\.5 { + gap: 0.375rem; +} + +.gap-2 { + gap: 0.5rem; +} + +.gap-3 { + gap: 0.75rem; +} + +.gap-4 { + gap: 1rem; +} + +.gap-6 { + gap: 1.5rem; +} + +.space-x-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.25rem * var(--tw-space-x-reverse)); + margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-x-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.5rem * var(--tw-space-x-reverse)); + margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-x-3 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.75rem * var(--tw-space-x-reverse)); + margin-left: calc(0.75rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-x-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(1rem * var(--tw-space-x-reverse)); + margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-y-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); +} + +.space-y-1\.5 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.375rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.375rem * var(--tw-space-y-reverse)); +} + +.space-y-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); +} + +.space-y-3 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.75rem * var(--tw-space-y-reverse)); +} + +.space-y-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1rem * var(--tw-space-y-reverse)); +} + +.space-y-6 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); +} + +.overflow-auto { + overflow: auto; +} + +.overflow-hidden { + overflow: hidden; +} + +.overflow-x-auto { + overflow-x: auto; +} + +.overflow-y-auto { + overflow-y: auto; +} + +.overflow-x-hidden { + overflow-x: hidden; +} + +.truncate { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.whitespace-nowrap { + white-space: nowrap; +} + +.whitespace-pre-wrap { + white-space: pre-wrap; +} + +.break-words { + overflow-wrap: break-word; +} + +.rounded { + border-radius: 0.25rem; +} + +.rounded-2xl { + border-radius: 1rem; +} + +.rounded-\[2px\] { + border-radius: 2px; +} + +.rounded-\[inherit\] { + border-radius: inherit; +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-lg { + border-radius: var(--radius); +} + +.rounded-md { + border-radius: calc(var(--radius) - 2px); +} + +.rounded-none { + border-radius: 0px; +} + +.rounded-sm { + border-radius: calc(var(--radius) - 4px); +} + +.rounded-xl { + border-radius: 0.75rem; +} + +.rounded-r-md { + border-top-right-radius: calc(var(--radius) - 2px); + border-bottom-right-radius: calc(var(--radius) - 2px); +} + +.rounded-t-\[10px\] { + border-top-left-radius: 10px; + border-top-right-radius: 10px; +} + +.rounded-tl-sm { + border-top-left-radius: calc(var(--radius) - 4px); +} + +.border { + border-width: 1px; +} + +.border-0 { + border-width: 0px; +} + +.border-2 { + border-width: 2px; +} + +.border-\[1\.5px\] { + border-width: 1.5px; +} + +.border-y { + border-top-width: 1px; + border-bottom-width: 1px; +} + +.border-b { + border-bottom-width: 1px; +} + +.border-b-2 { + border-bottom-width: 2px; +} + +.border-l { + border-left-width: 1px; +} + +.border-l-2 { + border-left-width: 2px; +} + +.border-l-4 { + border-left-width: 4px; +} + +.border-r { + border-right-width: 1px; +} + +.border-t { + border-top-width: 1px; +} + +.border-dashed { + border-style: dashed; +} + +.border-\[--color-border\] { + border-color: var(--color-border); +} + +.border-accent { + border-color: hsl(var(--accent)); +} + +.border-background { + border-color: hsl(var(--background)); +} + +.border-blue-100 { + --tw-border-opacity: 1; + border-color: rgb(219 234 254 / var(--tw-border-opacity)); +} + +.border-blue-500 { + --tw-border-opacity: 1; + border-color: rgb(59 130 246 / var(--tw-border-opacity)); +} + +.border-border { + border-color: hsl(var(--border)); +} + +.border-border\/50 { + border-color: hsl(var(--border) / 0.5); +} + +.border-current { + border-color: currentColor; +} + +.border-destructive { + border-color: hsl(var(--destructive)); +} + +.border-destructive\/50 { + border-color: hsl(var(--destructive) / 0.5); +} + +.border-gray-100 { + --tw-border-opacity: 1; + border-color: rgb(243 244 246 / var(--tw-border-opacity)); +} + +.border-gray-200 { + --tw-border-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-border-opacity)); +} + +.border-gray-300 { + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity)); +} + +.border-green-500 { + --tw-border-opacity: 1; + border-color: rgb(34 197 94 / var(--tw-border-opacity)); +} + +.border-green-600 { + --tw-border-opacity: 1; + border-color: rgb(22 163 74 / var(--tw-border-opacity)); +} + +.border-input { + border-color: hsl(var(--input)); +} + +.border-muted { + border-color: hsl(var(--muted)); +} + +.border-primary { + border-color: hsl(var(--primary)); +} + +.border-primary\/50 { + border-color: hsl(var(--primary) / 0.5); +} + +.border-purple-500 { + --tw-border-opacity: 1; + border-color: rgb(168 85 247 / var(--tw-border-opacity)); +} + +.border-red-500 { + --tw-border-opacity: 1; + border-color: rgb(239 68 68 / var(--tw-border-opacity)); +} + +.border-red-600 { + --tw-border-opacity: 1; + border-color: rgb(220 38 38 / var(--tw-border-opacity)); +} + +.border-secondary { + border-color: hsl(var(--secondary)); +} + +.border-sidebar-border { + border-color: hsl(var(--sidebar-border)); +} + +.border-transparent { + border-color: transparent; +} + +.border-yellow-600 { + --tw-border-opacity: 1; + border-color: rgb(202 138 4 / var(--tw-border-opacity)); +} + +.border-l-blue-500 { + --tw-border-opacity: 1; + border-left-color: rgb(59 130 246 / var(--tw-border-opacity)); +} + +.border-l-green-500 { + --tw-border-opacity: 1; + border-left-color: rgb(34 197 94 / var(--tw-border-opacity)); +} + +.border-l-muted { + border-left-color: hsl(var(--muted)); +} + +.border-l-purple-500 { + --tw-border-opacity: 1; + border-left-color: rgb(168 85 247 / var(--tw-border-opacity)); +} + +.border-l-red-500 { + --tw-border-opacity: 1; + border-left-color: rgb(239 68 68 / var(--tw-border-opacity)); +} + +.border-l-transparent { + border-left-color: transparent; +} + +.border-t-transparent { + border-top-color: transparent; +} + +.bg-\[--color-bg\] { + background-color: var(--color-bg); +} + +.bg-accent { + background-color: hsl(var(--accent)); +} + +.bg-accent\/50 { + background-color: hsl(var(--accent) / 0.5); +} + +.bg-background { + background-color: hsl(var(--background)); +} + +.bg-background\/95 { + background-color: hsl(var(--background) / 0.95); +} + +.bg-black { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity)); +} + +.bg-black\/20 { + background-color: rgb(0 0 0 / 0.2); +} + +.bg-black\/80 { + background-color: rgb(0 0 0 / 0.8); +} + +.bg-blue-100 { + --tw-bg-opacity: 1; + background-color: rgb(219 234 254 / var(--tw-bg-opacity)); +} + +.bg-blue-50 { + --tw-bg-opacity: 1; + background-color: rgb(239 246 255 / var(--tw-bg-opacity)); +} + +.bg-blue-500 { + --tw-bg-opacity: 1; + background-color: rgb(59 130 246 / var(--tw-bg-opacity)); +} + +.bg-blue-500\/20 { + background-color: rgb(59 130 246 / 0.2); +} + +.bg-blue-600 { + --tw-bg-opacity: 1; + background-color: rgb(37 99 235 / var(--tw-bg-opacity)); +} + +.bg-border { + background-color: hsl(var(--border)); +} + +.bg-card { + background-color: hsl(var(--card)); +} + +.bg-destructive { + background-color: hsl(var(--destructive)); +} + +.bg-foreground { + background-color: hsl(var(--foreground)); +} + +.bg-gray-100 { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity)); +} + +.bg-gray-200 { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)); +} + +.bg-gray-400 { + --tw-bg-opacity: 1; + background-color: rgb(156 163 175 / var(--tw-bg-opacity)); +} + +.bg-gray-50 { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity)); +} + +.bg-gray-500 { + --tw-bg-opacity: 1; + background-color: rgb(107 114 128 / var(--tw-bg-opacity)); +} + +.bg-gray-800 { + --tw-bg-opacity: 1; + background-color: rgb(31 41 55 / var(--tw-bg-opacity)); +} + +.bg-gray-900 { + --tw-bg-opacity: 1; + background-color: rgb(17 24 39 / var(--tw-bg-opacity)); +} + +.bg-green-100 { + --tw-bg-opacity: 1; + background-color: rgb(220 252 231 / var(--tw-bg-opacity)); +} + +.bg-green-400 { + --tw-bg-opacity: 1; + background-color: rgb(74 222 128 / var(--tw-bg-opacity)); +} + +.bg-green-500 { + --tw-bg-opacity: 1; + background-color: rgb(34 197 94 / var(--tw-bg-opacity)); +} + +.bg-green-500\/20 { + background-color: rgb(34 197 94 / 0.2); +} + +.bg-input { + background-color: hsl(var(--input)); +} + +.bg-muted { + background-color: hsl(var(--muted)); +} + +.bg-muted-foreground { + background-color: hsl(var(--muted-foreground)); +} + +.bg-muted\/50 { + background-color: hsl(var(--muted) / 0.5); +} + +.bg-orange-500 { + --tw-bg-opacity: 1; + background-color: rgb(249 115 22 / var(--tw-bg-opacity)); +} + +.bg-pink-500 { + --tw-bg-opacity: 1; + background-color: rgb(236 72 153 / var(--tw-bg-opacity)); +} + +.bg-popover { + background-color: hsl(var(--popover)); +} + +.bg-primary { + background-color: hsl(var(--primary)); +} + +.bg-primary\/10 { + background-color: hsl(var(--primary) / 0.1); +} + +.bg-primary\/20 { + background-color: hsl(var(--primary) / 0.2); +} + +.bg-purple-500 { + --tw-bg-opacity: 1; + background-color: rgb(168 85 247 / var(--tw-bg-opacity)); +} + +.bg-purple-500\/20 { + background-color: rgb(168 85 247 / 0.2); +} + +.bg-red-400 { + --tw-bg-opacity: 1; + background-color: rgb(248 113 113 / var(--tw-bg-opacity)); +} + +.bg-red-500 { + --tw-bg-opacity: 1; + background-color: rgb(239 68 68 / var(--tw-bg-opacity)); +} + +.bg-red-500\/20 { + background-color: rgb(239 68 68 / 0.2); +} + +.bg-secondary { + background-color: hsl(var(--secondary)); +} + +.bg-secondary\/20 { + background-color: hsl(var(--secondary) / 0.2); +} + +.bg-secondary\/50 { + background-color: hsl(var(--secondary) / 0.5); +} + +.bg-sidebar { + background-color: hsl(var(--sidebar-background)); +} + +.bg-sidebar-border { + background-color: hsl(var(--sidebar-border)); +} + +.bg-transparent { + background-color: transparent; +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.bg-yellow-100 { + --tw-bg-opacity: 1; + background-color: rgb(254 249 195 / var(--tw-bg-opacity)); +} + +.bg-yellow-400 { + --tw-bg-opacity: 1; + background-color: rgb(250 204 21 / var(--tw-bg-opacity)); +} + +.bg-gradient-to-br { + background-image: linear-gradient(to bottom right, var(--tw-gradient-stops)); +} + +.from-gray-50 { + --tw-gradient-from: #f9fafb var(--tw-gradient-from-position); + --tw-gradient-from-position: ; + --tw-gradient-to: rgb(249 250 251 / 0) var(--tw-gradient-from-position); + --tw-gradient-to-position: ; + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-primary\/10 { + --tw-gradient-from: hsl(var(--primary) / 0.1) var(--tw-gradient-from-position); + --tw-gradient-from-position: ; + --tw-gradient-to: hsl(var(--primary) / 0) var(--tw-gradient-from-position); + --tw-gradient-to-position: ; + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.from-secondary\/50 { + --tw-gradient-from: hsl(var(--secondary) / 0.5) var(--tw-gradient-from-position); + --tw-gradient-from-position: ; + --tw-gradient-to: hsl(var(--secondary) / 0) var(--tw-gradient-from-position); + --tw-gradient-to-position: ; + --tw-gradient-stops: var(--tw-gradient-from), var(--tw-gradient-to); +} + +.to-accent\/10 { + --tw-gradient-to: hsl(var(--accent) / 0.1) var(--tw-gradient-to-position); + --tw-gradient-to-position: ; +} + +.to-gray-100 { + --tw-gradient-to: #f3f4f6 var(--tw-gradient-to-position); + --tw-gradient-to-position: ; +} + +.to-muted\/30 { + --tw-gradient-to: hsl(var(--muted) / 0.3) var(--tw-gradient-to-position); + --tw-gradient-to-position: ; +} + +.fill-current { + fill: currentColor; +} + +.fill-primary { + fill: hsl(var(--primary)); +} + +.object-contain { + -o-object-fit: contain; + object-fit: contain; +} + +.p-0 { + padding: 0px; +} + +.p-1 { + padding: 0.25rem; +} + +.p-1\.5 { + padding: 0.375rem; +} + +.p-2 { + padding: 0.5rem; +} + +.p-2\.5 { + padding: 0.625rem; +} + +.p-3 { + padding: 0.75rem; +} + +.p-4 { + padding: 1rem; +} + +.p-5 { + padding: 1.25rem; +} + +.p-6 { + padding: 1.5rem; +} + +.p-8 { + padding: 2rem; +} + +.p-\[1px\] { + padding: 1px; +} + +.px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} + +.px-1\.5 { + padding-left: 0.375rem; + padding-right: 0.375rem; +} + +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.px-2\.5 { + padding-left: 0.625rem; + padding-right: 0.625rem; +} + +.px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; +} + +.px-8 { + padding-left: 2rem; + padding-right: 2rem; +} + +.py-0 { + padding-top: 0px; + padding-bottom: 0px; +} + +.py-0\.5 { + padding-top: 0.125rem; + padding-bottom: 0.125rem; +} + +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +.py-1\.5 { + padding-top: 0.375rem; + padding-bottom: 0.375rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.py-3 { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.py-6 { + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} + +.py-8 { + padding-top: 2rem; + padding-bottom: 2rem; +} + +.pb-1 { + padding-bottom: 0.25rem; +} + +.pb-3 { + padding-bottom: 0.75rem; +} + +.pb-4 { + padding-bottom: 1rem; +} + +.pl-10 { + padding-left: 2.5rem; +} + +.pl-2 { + padding-left: 0.5rem; +} + +.pl-2\.5 { + padding-left: 0.625rem; +} + +.pl-3 { + padding-left: 0.75rem; +} + +.pl-4 { + padding-left: 1rem; +} + +.pl-8 { + padding-left: 2rem; +} + +.pl-9 { + padding-left: 2.25rem; +} + +.pr-14 { + padding-right: 3.5rem; +} + +.pr-2 { + padding-right: 0.5rem; +} + +.pr-2\.5 { + padding-right: 0.625rem; +} + +.pr-3 { + padding-right: 0.75rem; +} + +.pr-4 { + padding-right: 1rem; +} + +.pr-6 { + padding-right: 1.5rem; +} + +.pr-8 { + padding-right: 2rem; +} + +.pt-0 { + padding-top: 0px; +} + +.pt-1 { + padding-top: 0.25rem; +} + +.pt-3 { + padding-top: 0.75rem; +} + +.pt-4 { + padding-top: 1rem; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.align-middle { + vertical-align: middle; +} + +.font-mono { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + +.text-3xl { + font-size: 1.875rem; + line-height: 2.25rem; +} + +.text-\[0\.8rem\] { + font-size: 0.8rem; +} + +.text-base { + font-size: 1rem; + line-height: 1.5rem; +} + +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.text-xs { + font-size: 0.75rem; + line-height: 1rem; +} + +.font-bold { + font-weight: 700; +} + +.font-medium { + font-weight: 500; +} + +.font-normal { + font-weight: 400; +} + +.font-semibold { + font-weight: 600; +} + +.italic { + font-style: italic; +} + +.tabular-nums { + --tw-numeric-spacing: tabular-nums; + font-variant-numeric: var(--tw-ordinal) var(--tw-slashed-zero) var(--tw-numeric-figure) var(--tw-numeric-spacing) var(--tw-numeric-fraction); +} + +.leading-none { + line-height: 1; +} + +.leading-relaxed { + line-height: 1.625; +} + +.tracking-tight { + letter-spacing: -0.025em; +} + +.tracking-widest { + letter-spacing: 0.1em; +} + +.text-accent { + color: hsl(var(--accent)); +} + +.text-accent-foreground { + color: hsl(var(--accent-foreground)); +} + +.text-blue-500 { + --tw-text-opacity: 1; + color: rgb(59 130 246 / var(--tw-text-opacity)); +} + +.text-blue-600 { + --tw-text-opacity: 1; + color: rgb(37 99 235 / var(--tw-text-opacity)); +} + +.text-blue-800 { + --tw-text-opacity: 1; + color: rgb(30 64 175 / var(--tw-text-opacity)); +} + +.text-card-foreground { + color: hsl(var(--card-foreground)); +} + +.text-current { + color: currentColor; +} + +.text-destructive { + color: hsl(var(--destructive)); +} + +.text-destructive-foreground { + color: hsl(var(--destructive-foreground)); +} + +.text-foreground { + color: hsl(var(--foreground)); +} + +.text-foreground\/50 { + color: hsl(var(--foreground) / 0.5); +} + +.text-foreground\/80 { + color: hsl(var(--foreground) / 0.8); +} + +.text-gray-500 { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity)); +} + +.text-gray-700 { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity)); +} + +.text-gray-800 { + --tw-text-opacity: 1; + color: rgb(31 41 55 / var(--tw-text-opacity)); +} + +.text-green-300 { + --tw-text-opacity: 1; + color: rgb(134 239 172 / var(--tw-text-opacity)); +} + +.text-green-400 { + --tw-text-opacity: 1; + color: rgb(74 222 128 / var(--tw-text-opacity)); +} + +.text-green-500 { + --tw-text-opacity: 1; + color: rgb(34 197 94 / var(--tw-text-opacity)); +} + +.text-green-600 { + --tw-text-opacity: 1; + color: rgb(22 163 74 / var(--tw-text-opacity)); +} + +.text-green-800 { + --tw-text-opacity: 1; + color: rgb(22 101 52 / var(--tw-text-opacity)); +} + +.text-indigo-600 { + --tw-text-opacity: 1; + color: rgb(79 70 229 / var(--tw-text-opacity)); +} + +.text-muted-foreground { + color: hsl(var(--muted-foreground)); +} + +.text-muted-foreground\/70 { + color: hsl(var(--muted-foreground) / 0.7); +} + +.text-pink-500 { + --tw-text-opacity: 1; + color: rgb(236 72 153 / var(--tw-text-opacity)); +} + +.text-popover-foreground { + color: hsl(var(--popover-foreground)); +} + +.text-primary { + color: hsl(var(--primary)); +} + +.text-primary-foreground { + color: hsl(var(--primary-foreground)); +} + +.text-primary-foreground\/80 { + color: hsl(var(--primary-foreground) / 0.8); +} + +.text-purple-500 { + --tw-text-opacity: 1; + color: rgb(168 85 247 / var(--tw-text-opacity)); +} + +.text-purple-600 { + --tw-text-opacity: 1; + color: rgb(147 51 234 / var(--tw-text-opacity)); +} + +.text-red-500 { + --tw-text-opacity: 1; + color: rgb(239 68 68 / var(--tw-text-opacity)); +} + +.text-red-600 { + --tw-text-opacity: 1; + color: rgb(220 38 38 / var(--tw-text-opacity)); +} + +.text-secondary-foreground { + color: hsl(var(--secondary-foreground)); +} + +.text-sidebar-foreground { + color: hsl(var(--sidebar-foreground)); +} + +.text-sidebar-foreground\/70 { + color: hsl(var(--sidebar-foreground) / 0.7); +} + +.text-teal-600 { + --tw-text-opacity: 1; + color: rgb(13 148 136 / var(--tw-text-opacity)); +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.text-yellow-400 { + --tw-text-opacity: 1; + color: rgb(250 204 21 / var(--tw-text-opacity)); +} + +.text-yellow-500 { + --tw-text-opacity: 1; + color: rgb(234 179 8 / var(--tw-text-opacity)); +} + +.text-yellow-600 { + --tw-text-opacity: 1; + color: rgb(202 138 4 / var(--tw-text-opacity)); +} + +.text-yellow-800 { + --tw-text-opacity: 1; + color: rgb(133 77 14 / var(--tw-text-opacity)); +} + +.underline { + text-decoration-line: underline; +} + +.underline-offset-4 { + text-underline-offset: 4px; +} + +.opacity-0 { + opacity: 0; +} + +.opacity-50 { + opacity: 0.5; +} + +.opacity-60 { + opacity: 0.6; +} + +.opacity-70 { + opacity: 0.7; +} + +.opacity-90 { + opacity: 0.9; +} + +.shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-2xl { + --tw-shadow: 0 25px 50px -12px rgb(0 0 0 / 0.25); + --tw-shadow-colored: 0 25px 50px -12px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-\[0_0_0_1px_hsl\(var\(--sidebar-border\)\)\] { + --tw-shadow: 0 0 0 1px hsl(var(--sidebar-border)); + --tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-lg { + --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-md { + --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-none { + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-sm { + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-xl { + --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-black\/20 { + --tw-shadow-color: rgb(0 0 0 / 0.2); + --tw-shadow: var(--tw-shadow-colored); +} + +.outline-none { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.outline { + outline-style: solid; +} + +.ring-0 { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.ring-1 { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.ring-ring { + --tw-ring-color: hsl(var(--ring)); +} + +.ring-sidebar-ring { + --tw-ring-color: hsl(var(--sidebar-ring)); +} + +.ring-offset-background { + --tw-ring-offset-color: hsl(var(--background)); +} + +.filter { + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.backdrop-blur { + --tw-backdrop-blur: blur(8px); + -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); +} + +.backdrop-filter { + -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); +} + +.transition { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-\[left\2c right\2c width\] { + transition-property: left,right,width; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-\[margin\2c opacity\] { + transition-property: margin,opacity; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-\[width\2c height\2c padding\] { + transition-property: width,height,padding; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-\[width\] { + transition-property: width; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-all { + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-colors { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-opacity { + transition-property: opacity; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-shadow { + transition-property: box-shadow; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-transform { + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.duration-1000 { + transition-duration: 1000ms; +} + +.duration-200 { + transition-duration: 200ms; +} + +.duration-300 { + transition-duration: 300ms; +} + +.ease-in-out { + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} + +.ease-linear { + transition-timing-function: linear; +} + +@keyframes enter { + from { + opacity: var(--tw-enter-opacity, 1); + transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0)); + } +} + +@keyframes exit { + to { + opacity: var(--tw-exit-opacity, 1); + transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0)); + } +} + +.animate-in { + animation-name: enter; + animation-duration: 150ms; + --tw-enter-opacity: initial; + --tw-enter-scale: initial; + --tw-enter-rotate: initial; + --tw-enter-translate-x: initial; + --tw-enter-translate-y: initial; +} + +.fade-in-0 { + --tw-enter-opacity: 0; +} + +.zoom-in-95 { + --tw-enter-scale: .95; +} + +.duration-1000 { + animation-duration: 1000ms; +} + +.duration-200 { + animation-duration: 200ms; +} + +.duration-300 { + animation-duration: 300ms; +} + +.ease-in-out { + animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} + +.ease-linear { + animation-timing-function: linear; +} + +.running { + animation-play-state: running; +} + +.dark .scrollbar-thin::-webkit-scrollbar-thumb { + background: #4b5563; +} + +.dark .scrollbar-thin::-webkit-scrollbar-thumb:hover { + background: #374151; +} + +.file\:border-0::file-selector-button { + border-width: 0px; +} + +.file\:bg-transparent::file-selector-button { + background-color: transparent; +} + +.file\:text-sm::file-selector-button { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.file\:font-medium::file-selector-button { + font-weight: 500; +} + +.file\:text-foreground::file-selector-button { + color: hsl(var(--foreground)); +} + +.placeholder\:text-muted-foreground::-moz-placeholder { + color: hsl(var(--muted-foreground)); +} + +.placeholder\:text-muted-foreground::placeholder { + color: hsl(var(--muted-foreground)); +} + +.after\:absolute::after { + content: var(--tw-content); + position: absolute; +} + +.after\:-inset-2::after { + content: var(--tw-content); + inset: -0.5rem; +} + +.after\:inset-y-0::after { + content: var(--tw-content); + top: 0px; + bottom: 0px; +} + +.after\:left-1\/2::after { + content: var(--tw-content); + left: 50%; +} + +.after\:w-1::after { + content: var(--tw-content); + width: 0.25rem; +} + +.after\:w-\[2px\]::after { + content: var(--tw-content); + width: 2px; +} + +.after\:-translate-x-1\/2::after { + content: var(--tw-content); + --tw-translate-x: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.first\:rounded-l-md:first-child { + border-top-left-radius: calc(var(--radius) - 2px); + border-bottom-left-radius: calc(var(--radius) - 2px); +} + +.first\:border-l:first-child { + border-left-width: 1px; +} + +.last\:rounded-r-md:last-child { + border-top-right-radius: calc(var(--radius) - 2px); + border-bottom-right-radius: calc(var(--radius) - 2px); +} + +.focus-within\:relative:focus-within { + position: relative; +} + +.focus-within\:z-20:focus-within { + z-index: 20; +} + +.hover\:scale-105:hover { + --tw-scale-x: 1.05; + --tw-scale-y: 1.05; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.hover\:scale-110:hover { + --tw-scale-x: 1.1; + --tw-scale-y: 1.1; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.hover\:border-accent:hover { + border-color: hsl(var(--accent)); +} + +.hover\:border-green-500:hover { + --tw-border-opacity: 1; + border-color: rgb(34 197 94 / var(--tw-border-opacity)); +} + +.hover\:border-primary:hover { + border-color: hsl(var(--primary)); +} + +.hover\:bg-accent:hover { + background-color: hsl(var(--accent)); +} + +.hover\:bg-accent\/10:hover { + background-color: hsl(var(--accent) / 0.1); +} + +.hover\:bg-blue-600:hover { + --tw-bg-opacity: 1; + background-color: rgb(37 99 235 / var(--tw-bg-opacity)); +} + +.hover\:bg-blue-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(29 78 216 / var(--tw-bg-opacity)); +} + +.hover\:bg-card:hover { + background-color: hsl(var(--card)); +} + +.hover\:bg-destructive\/80:hover { + background-color: hsl(var(--destructive) / 0.8); +} + +.hover\:bg-destructive\/90:hover { + background-color: hsl(var(--destructive) / 0.9); +} + +.hover\:bg-gray-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity)); +} + +.hover\:bg-gray-50:hover { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity)); +} + +.hover\:bg-green-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(21 128 61 / var(--tw-bg-opacity)); +} + +.hover\:bg-green-900\/30:hover { + background-color: rgb(20 83 45 / 0.3); +} + +.hover\:bg-muted:hover { + background-color: hsl(var(--muted)); +} + +.hover\:bg-muted\/50:hover { + background-color: hsl(var(--muted) / 0.5); +} + +.hover\:bg-primary:hover { + background-color: hsl(var(--primary)); +} + +.hover\:bg-primary\/80:hover { + background-color: hsl(var(--primary) / 0.8); +} + +.hover\:bg-primary\/90:hover { + background-color: hsl(var(--primary) / 0.9); +} + +.hover\:bg-secondary:hover { + background-color: hsl(var(--secondary)); +} + +.hover\:bg-secondary\/80:hover { + background-color: hsl(var(--secondary) / 0.8); +} + +.hover\:bg-sidebar-accent:hover { + background-color: hsl(var(--sidebar-accent)); +} + +.hover\:text-accent-foreground:hover { + color: hsl(var(--accent-foreground)); +} + +.hover\:text-foreground:hover { + color: hsl(var(--foreground)); +} + +.hover\:text-green-300:hover { + --tw-text-opacity: 1; + color: rgb(134 239 172 / var(--tw-text-opacity)); +} + +.hover\:text-muted-foreground:hover { + color: hsl(var(--muted-foreground)); +} + +.hover\:text-primary:hover { + color: hsl(var(--primary)); +} + +.hover\:text-primary-foreground:hover { + color: hsl(var(--primary-foreground)); +} + +.hover\:text-secondary-foreground:hover { + color: hsl(var(--secondary-foreground)); +} + +.hover\:text-sidebar-accent-foreground:hover { + color: hsl(var(--sidebar-accent-foreground)); +} + +.hover\:underline:hover { + text-decoration-line: underline; +} + +.hover\:opacity-100:hover { + opacity: 1; +} + +.hover\:opacity-90:hover { + opacity: 0.9; +} + +.hover\:shadow-\[0_0_0_1px_hsl\(var\(--sidebar-accent\)\)\]:hover { + --tw-shadow: 0 0 0 1px hsl(var(--sidebar-accent)); + --tw-shadow-colored: 0 0 0 1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.hover\:shadow-none:hover { + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.hover\:shadow-xl:hover { + --tw-shadow: 0 20px 25px -5px rgb(0 0 0 / 0.1), 0 8px 10px -6px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 20px 25px -5px var(--tw-shadow-color), 0 8px 10px -6px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.hover\:after\:bg-sidebar-border:hover::after { + content: var(--tw-content); + background-color: hsl(var(--sidebar-border)); +} + +.focus\:border-primary:focus { + border-color: hsl(var(--primary)); +} + +.focus\:border-transparent:focus { + border-color: transparent; +} + +.focus\:bg-accent:focus { + background-color: hsl(var(--accent)); +} + +.focus\:bg-primary:focus { + background-color: hsl(var(--primary)); +} + +.focus\:text-accent-foreground:focus { + color: hsl(var(--accent-foreground)); +} + +.focus\:text-destructive:focus { + color: hsl(var(--destructive)); +} + +.focus\:text-primary-foreground:focus { + color: hsl(var(--primary-foreground)); +} + +.focus\:opacity-100:focus { + opacity: 1; +} + +.focus\:outline-none:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.focus\:ring-1:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:ring-2:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:ring-blue-500:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity)); +} + +.focus\:ring-primary:focus { + --tw-ring-color: hsl(var(--primary)); +} + +.focus\:ring-ring:focus { + --tw-ring-color: hsl(var(--ring)); +} + +.focus\:ring-offset-2:focus { + --tw-ring-offset-width: 2px; +} + +.focus-visible\:outline-none:focus-visible { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.focus-visible\:ring-1:focus-visible { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus-visible\:ring-2:focus-visible { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus-visible\:ring-ring:focus-visible { + --tw-ring-color: hsl(var(--ring)); +} + +.focus-visible\:ring-sidebar-ring:focus-visible { + --tw-ring-color: hsl(var(--sidebar-ring)); +} + +.focus-visible\:ring-offset-1:focus-visible { + --tw-ring-offset-width: 1px; +} + +.focus-visible\:ring-offset-2:focus-visible { + --tw-ring-offset-width: 2px; +} + +.focus-visible\:ring-offset-background:focus-visible { + --tw-ring-offset-color: hsl(var(--background)); +} + +.active\:bg-sidebar-accent:active { + background-color: hsl(var(--sidebar-accent)); +} + +.active\:text-sidebar-accent-foreground:active { + color: hsl(var(--sidebar-accent-foreground)); +} + +.disabled\:pointer-events-none:disabled { + pointer-events: none; +} + +.disabled\:cursor-not-allowed:disabled { + cursor: not-allowed; +} + +.disabled\:opacity-50:disabled { + opacity: 0.5; +} + +.group\/menu-item:focus-within .group-focus-within\/menu-item\:opacity-100 { + opacity: 1; +} + +.group:hover .group-hover\:text-accent { + color: hsl(var(--accent)); +} + +.group\/menu-item:hover .group-hover\/menu-item\:opacity-100 { + opacity: 1; +} + +.group:hover .group-hover\:opacity-100 { + opacity: 1; +} + +.group:hover .group-hover\:shadow-sm { + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.group[data-collapsed=true] .group-\[\[data-collapsed\=true\]\]\:justify-center { + justify-content: center; +} + +.group.destructive .group-\[\.destructive\]\:border-muted\/40 { + border-color: hsl(var(--muted) / 0.4); +} + +.group.toaster .group-\[\.toaster\]\:border-border { + border-color: hsl(var(--border)); +} + +.group.toast .group-\[\.toast\]\:bg-muted { + background-color: hsl(var(--muted)); +} + +.group.toast .group-\[\.toast\]\:bg-primary { + background-color: hsl(var(--primary)); +} + +.group.toaster .group-\[\.toaster\]\:bg-background { + background-color: hsl(var(--background)); +} + +.group[data-collapsed=true] .group-\[\[data-collapsed\=true\]\]\:px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.group.destructive .group-\[\.destructive\]\:text-red-300 { + --tw-text-opacity: 1; + color: rgb(252 165 165 / var(--tw-text-opacity)); +} + +.group.toast .group-\[\.toast\]\:text-muted-foreground { + color: hsl(var(--muted-foreground)); +} + +.group.toast .group-\[\.toast\]\:text-primary-foreground { + color: hsl(var(--primary-foreground)); +} + +.group.toaster .group-\[\.toaster\]\:text-foreground { + color: hsl(var(--foreground)); +} + +.group.toaster .group-\[\.toaster\]\:shadow-lg { + --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.group.destructive .group-\[\.destructive\]\:hover\:border-destructive\/30:hover { + border-color: hsl(var(--destructive) / 0.3); +} + +.group.destructive .group-\[\.destructive\]\:hover\:bg-destructive:hover { + background-color: hsl(var(--destructive)); +} + +.group.destructive .group-\[\.destructive\]\:hover\:text-destructive-foreground:hover { + color: hsl(var(--destructive-foreground)); +} + +.group.destructive .group-\[\.destructive\]\:hover\:text-red-50:hover { + --tw-text-opacity: 1; + color: rgb(254 242 242 / var(--tw-text-opacity)); +} + +.group.destructive .group-\[\.destructive\]\:focus\:ring-destructive:focus { + --tw-ring-color: hsl(var(--destructive)); +} + +.group.destructive .group-\[\.destructive\]\:focus\:ring-red-400:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(248 113 113 / var(--tw-ring-opacity)); +} + +.group.destructive .group-\[\.destructive\]\:focus\:ring-offset-red-600:focus { + --tw-ring-offset-color: #dc2626; +} + +.peer\/menu-button:hover ~ .peer-hover\/menu-button\:text-sidebar-accent-foreground { + color: hsl(var(--sidebar-accent-foreground)); +} + +.peer:disabled ~ .peer-disabled\:cursor-not-allowed { + cursor: not-allowed; +} + +.peer:disabled ~ .peer-disabled\:opacity-70 { + opacity: 0.7; +} + +.aria-disabled\:pointer-events-none[aria-disabled="true"] { + pointer-events: none; +} + +.aria-disabled\:opacity-50[aria-disabled="true"] { + opacity: 0.5; +} + +.aria-selected\:bg-accent[aria-selected="true"] { + background-color: hsl(var(--accent)); +} + +.aria-selected\:bg-accent\/50[aria-selected="true"] { + background-color: hsl(var(--accent) / 0.5); +} + +.aria-selected\:text-accent-foreground[aria-selected="true"] { + color: hsl(var(--accent-foreground)); +} + +.aria-selected\:text-muted-foreground[aria-selected="true"] { + color: hsl(var(--muted-foreground)); +} + +.aria-selected\:opacity-100[aria-selected="true"] { + opacity: 1; +} + +.data-\[disabled\=true\]\:pointer-events-none[data-disabled=true] { + pointer-events: none; +} + +.data-\[disabled\]\:pointer-events-none[data-disabled] { + pointer-events: none; +} + +.data-\[panel-group-direction\=vertical\]\:h-px[data-panel-group-direction=vertical] { + height: 1px; +} + +.data-\[panel-group-direction\=vertical\]\:w-full[data-panel-group-direction=vertical] { + width: 100%; +} + +.data-\[side\=bottom\]\:translate-y-1[data-side=bottom] { + --tw-translate-y: 0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.data-\[side\=left\]\:-translate-x-1[data-side=left] { + --tw-translate-x: -0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.data-\[side\=right\]\:translate-x-1[data-side=right] { + --tw-translate-x: 0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.data-\[side\=top\]\:-translate-y-1[data-side=top] { + --tw-translate-y: -0.25rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.data-\[state\=checked\]\:translate-x-4[data-state=checked] { + --tw-translate-x: 1rem; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.data-\[state\=unchecked\]\:translate-x-0[data-state=unchecked] { + --tw-translate-x: 0px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.data-\[swipe\=cancel\]\:translate-x-0[data-swipe=cancel] { + --tw-translate-x: 0px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.data-\[swipe\=end\]\:translate-x-\[var\(--radix-toast-swipe-end-x\)\][data-swipe=end] { + --tw-translate-x: var(--radix-toast-swipe-end-x); + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.data-\[swipe\=move\]\:translate-x-\[var\(--radix-toast-swipe-move-x\)\][data-swipe=move] { + --tw-translate-x: var(--radix-toast-swipe-move-x); + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +@keyframes accordion-up { + from { + height: var(--radix-accordion-content-height); + } + + to { + height: 0; + } +} + +.data-\[state\=closed\]\:animate-accordion-up[data-state=closed] { + animation: accordion-up 0.2s ease-out; +} + +@keyframes accordion-down { + from { + height: 0; + } + + to { + height: var(--radix-accordion-content-height); + } +} + +.data-\[state\=open\]\:animate-accordion-down[data-state=open] { + animation: accordion-down 0.2s ease-out; +} + +.data-\[panel-group-direction\=vertical\]\:flex-col[data-panel-group-direction=vertical] { + flex-direction: column; +} + +.data-\[active\=true\]\:bg-sidebar-accent[data-active=true] { + background-color: hsl(var(--sidebar-accent)); +} + +.data-\[selected\=true\]\:bg-accent[data-selected=true] { + background-color: hsl(var(--accent)); +} + +.data-\[state\=active\]\:bg-accent[data-state=active] { + background-color: hsl(var(--accent)); +} + +.data-\[state\=active\]\:bg-background[data-state=active] { + background-color: hsl(var(--background)); +} + +.data-\[state\=checked\]\:bg-primary[data-state=checked] { + background-color: hsl(var(--primary)); +} + +.data-\[state\=on\]\:bg-accent[data-state=on] { + background-color: hsl(var(--accent)); +} + +.data-\[state\=open\]\:bg-accent[data-state=open] { + background-color: hsl(var(--accent)); +} + +.data-\[state\=open\]\:bg-accent\/50[data-state=open] { + background-color: hsl(var(--accent) / 0.5); +} + +.data-\[state\=open\]\:bg-secondary[data-state=open] { + background-color: hsl(var(--secondary)); +} + +.data-\[state\=selected\]\:bg-muted[data-state=selected] { + background-color: hsl(var(--muted)); +} + +.data-\[state\=unchecked\]\:bg-input[data-state=unchecked] { + background-color: hsl(var(--input)); +} + +.data-\[collapsed\=true\]\:py-2[data-collapsed=true] { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.data-\[active\=true\]\:font-medium[data-active=true] { + font-weight: 500; +} + +.data-\[active\=true\]\:text-sidebar-accent-foreground[data-active=true] { + color: hsl(var(--sidebar-accent-foreground)); +} + +.data-\[placeholder\]\:text-muted-foreground[data-placeholder] { + color: hsl(var(--muted-foreground)); +} + +.data-\[selected\=true\]\:text-accent-foreground[data-selected=true] { + color: hsl(var(--accent-foreground)); +} + +.data-\[state\=active\]\:text-foreground[data-state=active] { + color: hsl(var(--foreground)); +} + +.data-\[state\=checked\]\:text-primary-foreground[data-state=checked] { + color: hsl(var(--primary-foreground)); +} + +.data-\[state\=on\]\:text-accent-foreground[data-state=on] { + color: hsl(var(--accent-foreground)); +} + +.data-\[state\=open\]\:text-accent-foreground[data-state=open] { + color: hsl(var(--accent-foreground)); +} + +.data-\[state\=open\]\:text-muted-foreground[data-state=open] { + color: hsl(var(--muted-foreground)); +} + +.data-\[disabled\=true\]\:opacity-50[data-disabled=true] { + opacity: 0.5; +} + +.data-\[disabled\]\:opacity-50[data-disabled] { + opacity: 0.5; +} + +.data-\[state\=open\]\:opacity-100[data-state=open] { + opacity: 1; +} + +.data-\[state\=active\]\:shadow[data-state=active] { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.data-\[swipe\=move\]\:transition-none[data-swipe=move] { + transition-property: none; +} + +.data-\[state\=closed\]\:duration-300[data-state=closed] { + transition-duration: 300ms; +} + +.data-\[state\=open\]\:duration-500[data-state=open] { + transition-duration: 500ms; +} + +.data-\[motion\^\=from-\]\:animate-in[data-motion^=from-] { + animation-name: enter; + animation-duration: 150ms; + --tw-enter-opacity: initial; + --tw-enter-scale: initial; + --tw-enter-rotate: initial; + --tw-enter-translate-x: initial; + --tw-enter-translate-y: initial; +} + +.data-\[state\=open\]\:animate-in[data-state=open] { + animation-name: enter; + animation-duration: 150ms; + --tw-enter-opacity: initial; + --tw-enter-scale: initial; + --tw-enter-rotate: initial; + --tw-enter-translate-x: initial; + --tw-enter-translate-y: initial; +} + +.data-\[state\=visible\]\:animate-in[data-state=visible] { + animation-name: enter; + animation-duration: 150ms; + --tw-enter-opacity: initial; + --tw-enter-scale: initial; + --tw-enter-rotate: initial; + --tw-enter-translate-x: initial; + --tw-enter-translate-y: initial; +} + +.data-\[motion\^\=to-\]\:animate-out[data-motion^=to-] { + animation-name: exit; + animation-duration: 150ms; + --tw-exit-opacity: initial; + --tw-exit-scale: initial; + --tw-exit-rotate: initial; + --tw-exit-translate-x: initial; + --tw-exit-translate-y: initial; +} + +.data-\[state\=closed\]\:animate-out[data-state=closed] { + animation-name: exit; + animation-duration: 150ms; + --tw-exit-opacity: initial; + --tw-exit-scale: initial; + --tw-exit-rotate: initial; + --tw-exit-translate-x: initial; + --tw-exit-translate-y: initial; +} + +.data-\[state\=hidden\]\:animate-out[data-state=hidden] { + animation-name: exit; + animation-duration: 150ms; + --tw-exit-opacity: initial; + --tw-exit-scale: initial; + --tw-exit-rotate: initial; + --tw-exit-translate-x: initial; + --tw-exit-translate-y: initial; +} + +.data-\[swipe\=end\]\:animate-out[data-swipe=end] { + animation-name: exit; + animation-duration: 150ms; + --tw-exit-opacity: initial; + --tw-exit-scale: initial; + --tw-exit-rotate: initial; + --tw-exit-translate-x: initial; + --tw-exit-translate-y: initial; +} + +.data-\[motion\^\=from-\]\:fade-in[data-motion^=from-] { + --tw-enter-opacity: 0; +} + +.data-\[motion\^\=to-\]\:fade-out[data-motion^=to-] { + --tw-exit-opacity: 0; +} + +.data-\[state\=closed\]\:fade-out-0[data-state=closed] { + --tw-exit-opacity: 0; +} + +.data-\[state\=closed\]\:fade-out-80[data-state=closed] { + --tw-exit-opacity: 0.8; +} + +.data-\[state\=hidden\]\:fade-out[data-state=hidden] { + --tw-exit-opacity: 0; +} + +.data-\[state\=open\]\:fade-in-0[data-state=open] { + --tw-enter-opacity: 0; +} + +.data-\[state\=visible\]\:fade-in[data-state=visible] { + --tw-enter-opacity: 0; +} + +.data-\[state\=closed\]\:zoom-out-95[data-state=closed] { + --tw-exit-scale: .95; +} + +.data-\[state\=open\]\:zoom-in-90[data-state=open] { + --tw-enter-scale: .9; +} + +.data-\[state\=open\]\:zoom-in-95[data-state=open] { + --tw-enter-scale: .95; +} + +.data-\[motion\=from-end\]\:slide-in-from-right-52[data-motion=from-end] { + --tw-enter-translate-x: 13rem; +} + +.data-\[motion\=from-start\]\:slide-in-from-left-52[data-motion=from-start] { + --tw-enter-translate-x: -13rem; +} + +.data-\[motion\=to-end\]\:slide-out-to-right-52[data-motion=to-end] { + --tw-exit-translate-x: 13rem; +} + +.data-\[motion\=to-start\]\:slide-out-to-left-52[data-motion=to-start] { + --tw-exit-translate-x: -13rem; +} + +.data-\[side\=bottom\]\:slide-in-from-top-2[data-side=bottom] { + --tw-enter-translate-y: -0.5rem; +} + +.data-\[side\=left\]\:slide-in-from-right-2[data-side=left] { + --tw-enter-translate-x: 0.5rem; +} + +.data-\[side\=right\]\:slide-in-from-left-2[data-side=right] { + --tw-enter-translate-x: -0.5rem; +} + +.data-\[side\=top\]\:slide-in-from-bottom-2[data-side=top] { + --tw-enter-translate-y: 0.5rem; +} + +.data-\[state\=closed\]\:slide-out-to-bottom[data-state=closed] { + --tw-exit-translate-y: 100%; +} + +.data-\[state\=closed\]\:slide-out-to-left[data-state=closed] { + --tw-exit-translate-x: -100%; +} + +.data-\[state\=closed\]\:slide-out-to-left-1\/2[data-state=closed] { + --tw-exit-translate-x: -50%; +} + +.data-\[state\=closed\]\:slide-out-to-right[data-state=closed] { + --tw-exit-translate-x: 100%; +} + +.data-\[state\=closed\]\:slide-out-to-right-full[data-state=closed] { + --tw-exit-translate-x: 100%; +} + +.data-\[state\=closed\]\:slide-out-to-top[data-state=closed] { + --tw-exit-translate-y: -100%; +} + +.data-\[state\=closed\]\:slide-out-to-top-\[48\%\][data-state=closed] { + --tw-exit-translate-y: -48%; +} + +.data-\[state\=open\]\:slide-in-from-bottom[data-state=open] { + --tw-enter-translate-y: 100%; +} + +.data-\[state\=open\]\:slide-in-from-left[data-state=open] { + --tw-enter-translate-x: -100%; +} + +.data-\[state\=open\]\:slide-in-from-left-1\/2[data-state=open] { + --tw-enter-translate-x: -50%; +} + +.data-\[state\=open\]\:slide-in-from-right[data-state=open] { + --tw-enter-translate-x: 100%; +} + +.data-\[state\=open\]\:slide-in-from-top[data-state=open] { + --tw-enter-translate-y: -100%; +} + +.data-\[state\=open\]\:slide-in-from-top-\[48\%\][data-state=open] { + --tw-enter-translate-y: -48%; +} + +.data-\[state\=open\]\:slide-in-from-top-full[data-state=open] { + --tw-enter-translate-y: -100%; +} + +.data-\[state\=closed\]\:duration-300[data-state=closed] { + animation-duration: 300ms; +} + +.data-\[state\=open\]\:duration-500[data-state=open] { + animation-duration: 500ms; +} + +.data-\[panel-group-direction\=vertical\]\:after\:left-0[data-panel-group-direction=vertical]::after { + content: var(--tw-content); + left: 0px; +} + +.data-\[panel-group-direction\=vertical\]\:after\:h-1[data-panel-group-direction=vertical]::after { + content: var(--tw-content); + height: 0.25rem; +} + +.data-\[panel-group-direction\=vertical\]\:after\:w-full[data-panel-group-direction=vertical]::after { + content: var(--tw-content); + width: 100%; +} + +.data-\[panel-group-direction\=vertical\]\:after\:-translate-y-1\/2[data-panel-group-direction=vertical]::after { + content: var(--tw-content); + --tw-translate-y: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.data-\[panel-group-direction\=vertical\]\:after\:translate-x-0[data-panel-group-direction=vertical]::after { + content: var(--tw-content); + --tw-translate-x: 0px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.data-\[state\=open\]\:hover\:bg-accent:hover[data-state=open] { + background-color: hsl(var(--accent)); +} + +.data-\[state\=open\]\:hover\:bg-sidebar-accent:hover[data-state=open] { + background-color: hsl(var(--sidebar-accent)); +} + +.data-\[state\=open\]\:hover\:text-sidebar-accent-foreground:hover[data-state=open] { + color: hsl(var(--sidebar-accent-foreground)); +} + +.data-\[state\=open\]\:focus\:bg-accent:focus[data-state=open] { + background-color: hsl(var(--accent)); +} + +.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:left-\[calc\(var\(--sidebar-width\)\*-1\)\] { + left: calc(var(--sidebar-width) * -1); +} + +.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:right-\[calc\(var\(--sidebar-width\)\*-1\)\] { + right: calc(var(--sidebar-width) * -1); +} + +.group[data-side=left] .group-data-\[side\=left\]\:-right-4 { + right: -1rem; +} + +.group[data-side=right] .group-data-\[side\=right\]\:left-0 { + left: 0px; +} + +.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:-mt-8 { + margin-top: -2rem; +} + +.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:hidden { + display: none; +} + +.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:w-\[--sidebar-width-icon\] { + width: var(--sidebar-width-icon); +} + +.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)\)\] { + width: calc(var(--sidebar-width-icon) + 1rem); +} + +.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:w-\[calc\(var\(--sidebar-width-icon\)_\+_theme\(spacing\.4\)_\+2px\)\] { + width: calc(var(--sidebar-width-icon) + 1rem +2px); +} + +.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:w-0 { + width: 0px; +} + +.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:translate-x-0 { + --tw-translate-x: 0px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.group[data-side=right] .group-data-\[side\=right\]\:rotate-180 { + --tw-rotate: 180deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.group[data-state=open] .group-data-\[state\=open\]\:rotate-180 { + --tw-rotate: 180deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:overflow-hidden { + overflow: hidden; +} + +.group[data-variant=floating] .group-data-\[variant\=floating\]\:rounded-lg { + border-radius: var(--radius); +} + +.group[data-variant=floating] .group-data-\[variant\=floating\]\:border { + border-width: 1px; +} + +.group[data-side=left] .group-data-\[side\=left\]\:border-r { + border-right-width: 1px; +} + +.group[data-side=right] .group-data-\[side\=right\]\:border-l { + border-left-width: 1px; +} + +.group[data-variant=floating] .group-data-\[variant\=floating\]\:border-sidebar-border { + border-color: hsl(var(--sidebar-border)); +} + +.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:\!p-0 { + padding: 0px !important; +} + +.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:\!p-2 { + padding: 0.5rem !important; +} + +.group[data-collapsible=icon] .group-data-\[collapsible\=icon\]\:opacity-0 { + opacity: 0; +} + +.group[data-variant=floating] .group-data-\[variant\=floating\]\:shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:after\:left-full::after { + content: var(--tw-content); + left: 100%; +} + +.group[data-collapsible=offcanvas] .group-data-\[collapsible\=offcanvas\]\:hover\:bg-sidebar:hover { + background-color: hsl(var(--sidebar-background)); +} + +.peer\/menu-button[data-size=default] ~ .peer-data-\[size\=default\]\/menu-button\:top-1\.5 { + top: 0.375rem; +} + +.peer\/menu-button[data-size=lg] ~ .peer-data-\[size\=lg\]\/menu-button\:top-2\.5 { + top: 0.625rem; +} + +.peer\/menu-button[data-size=sm] ~ .peer-data-\[size\=sm\]\/menu-button\:top-1 { + top: 0.25rem; +} + +.peer\/menu-button[data-active=true] ~ .peer-data-\[active\=true\]\/menu-button\:text-sidebar-accent-foreground { + color: hsl(var(--sidebar-accent-foreground)); +} + +@supports ((-webkit-backdrop-filter: var(--tw)) or (backdrop-filter: var(--tw))) { + .supports-\[backdrop-filter\]\:bg-background\/60 { + background-color: hsl(var(--background) / 0.6); + } +} + +:is(.dark .dark\:border-destructive) { + border-color: hsl(var(--destructive)); +} + +:is(.dark .dark\:bg-primary\/10) { + background-color: hsl(var(--primary) / 0.1); +} + +:is(.dark .dark\:text-primary-foreground) { + color: hsl(var(--primary-foreground)); +} + +@media (min-width: 640px) { + .sm\:bottom-0 { + bottom: 0px; + } + + .sm\:right-0 { + right: 0px; + } + + .sm\:top-auto { + top: auto; + } + + .sm\:mt-0 { + margin-top: 0px; + } + + .sm\:flex { + display: flex; + } + + .sm\:max-w-sm { + max-width: 24rem; + } + + .sm\:flex-row { + flex-direction: row; + } + + .sm\:flex-col { + flex-direction: column; + } + + .sm\:justify-end { + justify-content: flex-end; + } + + .sm\:gap-2 { + gap: 0.5rem; + } + + .sm\:gap-2\.5 { + gap: 0.625rem; + } + + .sm\:space-x-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.5rem * var(--tw-space-x-reverse)); + margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); + } + + .sm\:space-x-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(1rem * var(--tw-space-x-reverse)); + margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); + } + + .sm\:space-y-0 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0px * var(--tw-space-y-reverse)); + } + + .sm\:rounded-lg { + border-radius: var(--radius); + } + + .sm\:text-left { + text-align: left; + } + + .data-\[state\=open\]\:sm\:slide-in-from-bottom-full[data-state=open] { + --tw-enter-translate-y: 100%; + } +} + +@media (min-width: 768px) { + .md\:absolute { + position: absolute; + } + + .md\:block { + display: block; + } + + .md\:flex { + display: flex; + } + + .md\:w-1\/4 { + width: 25%; + } + + .md\:w-\[var\(--radix-navigation-menu-viewport-width\)\] { + width: var(--radix-navigation-menu-viewport-width); + } + + .md\:w-auto { + width: auto; + } + + .md\:max-w-\[420px\] { + max-width: 420px; + } + + .md\:max-w-\[75\%\] { + max-width: 75%; + } + + .md\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .md\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .md\:flex-row { + flex-direction: row; + } + + .md\:text-sm { + font-size: 0.875rem; + line-height: 1.25rem; + } + + .md\:opacity-0 { + opacity: 0; + } + + .after\:md\:hidden::after { + content: var(--tw-content); + display: none; + } + + .peer[data-variant=inset] ~ .md\:peer-data-\[variant\=inset\]\:m-2 { + margin: 0.5rem; + } + + .peer[data-state=collapsed][data-variant=inset] ~ .md\:peer-data-\[state\=collapsed\]\:peer-data-\[variant\=inset\]\:ml-2 { + margin-left: 0.5rem; + } + + .peer[data-variant=inset] ~ .md\:peer-data-\[variant\=inset\]\:ml-0 { + margin-left: 0px; + } + + .peer[data-variant=inset] ~ .md\:peer-data-\[variant\=inset\]\:rounded-xl { + border-radius: 0.75rem; + } + + .peer[data-variant=inset] ~ .md\:peer-data-\[variant\=inset\]\:shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); + } +} + +@media (min-width: 1024px) { + .lg\:grid-cols-3 { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .lg\:grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } +} + +.\[\&\+div\]\:text-xs+div { + font-size: 0.75rem; + line-height: 1rem; +} + +.\[\&\:has\(\>\.day-range-end\)\]\:rounded-r-md:has(>.day-range-end) { + border-top-right-radius: calc(var(--radius) - 2px); + border-bottom-right-radius: calc(var(--radius) - 2px); +} + +.\[\&\:has\(\>\.day-range-start\)\]\:rounded-l-md:has(>.day-range-start) { + border-top-left-radius: calc(var(--radius) - 2px); + border-bottom-left-radius: calc(var(--radius) - 2px); +} + +.\[\&\:has\(\[aria-selected\]\)\]\:rounded-md:has([aria-selected]) { + border-radius: calc(var(--radius) - 2px); +} + +.\[\&\:has\(\[aria-selected\]\)\]\:bg-accent:has([aria-selected]) { + background-color: hsl(var(--accent)); +} + +.first\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-l-md:has([aria-selected]):first-child { + border-top-left-radius: calc(var(--radius) - 2px); + border-bottom-left-radius: calc(var(--radius) - 2px); +} + +.last\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-r-md:has([aria-selected]):last-child { + border-top-right-radius: calc(var(--radius) - 2px); + border-bottom-right-radius: calc(var(--radius) - 2px); +} + +.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside) { + background-color: hsl(var(--accent) / 0.5); +} + +.\[\&\:has\(\[aria-selected\]\.day-range-end\)\]\:rounded-r-md:has([aria-selected].day-range-end) { + border-top-right-radius: calc(var(--radius) - 2px); + border-bottom-right-radius: calc(var(--radius) - 2px); +} + +.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]) { + padding-right: 0px; +} + +.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox] { + --tw-translate-y: 2px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.\[\&\>button\]\:hidden>button { + display: none; +} + +.\[\&\>span\:last-child\]\:truncate>span:last-child { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.\[\&\>span\]\:line-clamp-1>span { + overflow: hidden; + display: -webkit-box; + -webkit-box-orient: vertical; + -webkit-line-clamp: 1; +} + +.\[\&\>span\]\:flex>span { + display: flex; +} + +.\[\&\>span\]\:w-auto>span { + width: auto; +} + +.\[\&\>span\]\:w-full>span { + width: 100%; +} + +.\[\&\>span\]\:items-center>span { + align-items: center; +} + +.\[\&\>span\]\:gap-1>span { + gap: 0.25rem; +} + +.\[\&\>span\]\:truncate>span { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} + +.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div { + --tw-translate-y: -3px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.\[\&\>svg\]\:absolute>svg { + position: absolute; +} + +.\[\&\>svg\]\:left-4>svg { + left: 1rem; +} + +.\[\&\>svg\]\:top-4>svg { + top: 1rem; +} + +.\[\&\>svg\]\:hidden>svg { + display: none; +} + +.\[\&\>svg\]\:h-2\.5>svg { + height: 0.625rem; +} + +.\[\&\>svg\]\:h-3>svg { + height: 0.75rem; +} + +.\[\&\>svg\]\:h-3\.5>svg { + height: 0.875rem; +} + +.\[\&\>svg\]\:w-2\.5>svg { + width: 0.625rem; +} + +.\[\&\>svg\]\:w-3>svg { + width: 0.75rem; +} + +.\[\&\>svg\]\:w-3\.5>svg { + width: 0.875rem; +} + +.\[\&\>svg\]\:shrink-0>svg { + flex-shrink: 0; +} + +.\[\&\>svg\]\:text-destructive>svg { + color: hsl(var(--destructive)); +} + +.\[\&\>svg\]\:text-foreground>svg { + color: hsl(var(--foreground)); +} + +.\[\&\>svg\]\:text-muted-foreground>svg { + color: hsl(var(--muted-foreground)); +} + +.\[\&\>svg\]\:text-sidebar-accent-foreground>svg { + color: hsl(var(--sidebar-accent-foreground)); +} + +.\[\&\>svg\~\*\]\:pl-7>svg~* { + padding-left: 1.75rem; +} + +.\[\&\>tr\]\:last\:border-b-0:last-child>tr { + border-bottom-width: 0px; +} + +.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div { + --tw-rotate: 90deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg { + --tw-rotate: 180deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.\[\&_\.recharts-cartesian-axis-tick_text\]\:fill-muted-foreground .recharts-cartesian-axis-tick text { + fill: hsl(var(--muted-foreground)); +} + +.\[\&_\.recharts-cartesian-grid_line\[stroke\=\'\#ccc\'\]\]\:stroke-border\/50 .recharts-cartesian-grid line[stroke='#ccc'] { + stroke: hsl(var(--border) / 0.5); +} + +.\[\&_\.recharts-curve\.recharts-tooltip-cursor\]\:stroke-border .recharts-curve.recharts-tooltip-cursor { + stroke: hsl(var(--border)); +} + +.\[\&_\.recharts-dot\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-dot[stroke='#fff'] { + stroke: transparent; +} + +.\[\&_\.recharts-layer\]\:outline-none .recharts-layer { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.\[\&_\.recharts-polar-grid_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-polar-grid [stroke='#ccc'] { + stroke: hsl(var(--border)); +} + +.\[\&_\.recharts-radial-bar-background-sector\]\:fill-muted .recharts-radial-bar-background-sector { + fill: hsl(var(--muted)); +} + +.\[\&_\.recharts-rectangle\.recharts-tooltip-cursor\]\:fill-muted .recharts-rectangle.recharts-tooltip-cursor { + fill: hsl(var(--muted)); +} + +.\[\&_\.recharts-reference-line_\[stroke\=\'\#ccc\'\]\]\:stroke-border .recharts-reference-line [stroke='#ccc'] { + stroke: hsl(var(--border)); +} + +.\[\&_\.recharts-sector\[stroke\=\'\#fff\'\]\]\:stroke-transparent .recharts-sector[stroke='#fff'] { + stroke: transparent; +} + +.\[\&_\.recharts-sector\]\:outline-none .recharts-sector { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.\[\&_\.recharts-surface\]\:outline-none .recharts-surface { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading] { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading] { + padding-top: 0.375rem; + padding-bottom: 0.375rem; +} + +.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading] { + font-size: 0.75rem; + line-height: 1rem; +} + +.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading] { + font-weight: 500; +} + +.\[\&_\[cmdk-group-heading\]\]\:text-muted-foreground [cmdk-group-heading] { + color: hsl(var(--muted-foreground)); +} + +.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden]) ~[cmdk-group] { + padding-top: 0px; +} + +.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group] { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg { + height: 1.25rem; +} + +.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg { + width: 1.25rem; +} + +.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input] { + height: 3rem; +} + +.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item] { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item] { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + +.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg { + height: 1.25rem; +} + +.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg { + width: 1.25rem; +} + +.\[\&_p\]\:leading-relaxed p { + line-height: 1.625; +} + +.\[\&_svg\]\:pointer-events-none svg { + pointer-events: none; +} + +.\[\&_svg\]\:h-4 svg { + height: 1rem; +} + +.\[\&_svg\]\:w-4 svg { + width: 1rem; +} + +.\[\&_svg\]\:shrink-0 svg { + flex-shrink: 0; +} + +.\[\&_svg\]\:text-foreground svg { + color: hsl(var(--foreground)); +} + +.\[\&_tr\:last-child\]\:border-0 tr:last-child { + border-width: 0px; +} + +.\[\&_tr\]\:border-b tr { + border-bottom-width: 1px; +} + +[data-side=left][data-collapsible=offcanvas] .\[\[data-side\=left\]\[data-collapsible\=offcanvas\]_\&\]\:-right-2 { + right: -0.5rem; +} + +[data-side=left][data-state=collapsed] .\[\[data-side\=left\]\[data-state\=collapsed\]_\&\]\:cursor-e-resize { + cursor: e-resize; +} + +[data-side=left] .\[\[data-side\=left\]_\&\]\:cursor-w-resize { + cursor: w-resize; +} + +[data-side=right][data-collapsible=offcanvas] .\[\[data-side\=right\]\[data-collapsible\=offcanvas\]_\&\]\:-left-2 { + left: -0.5rem; +} + +[data-side=right][data-state=collapsed] .\[\[data-side\=right\]\[data-state\=collapsed\]_\&\]\:cursor-w-resize { + cursor: w-resize; +} + +[data-side=right] .\[\[data-side\=right\]_\&\]\:cursor-e-resize { + cursor: e-resize; +} + diff --git a/web/app/public/sounds/click.mp3 b/web/app/public/sounds/click.mp3 new file mode 100644 index 000000000..5a9b52fcf --- /dev/null +++ b/web/app/public/sounds/click.mp3 @@ -0,0 +1,46 @@ + + + + Example Domain + + + + + + + + +
+

Example Domain

+

This domain is for use in illustrative examples in documents. You may use this + domain in literature without prior coordination or asking for permission.

+

More information...

+
+ + diff --git a/web/app/public/sounds/error.mp3 b/web/app/public/sounds/error.mp3 new file mode 100644 index 000000000..5a9b52fcf --- /dev/null +++ b/web/app/public/sounds/error.mp3 @@ -0,0 +1,46 @@ + + + + Example Domain + + + + + + + + +
+

Example Domain

+

This domain is for use in illustrative examples in documents. You may use this + domain in literature without prior coordination or asking for permission.

+

More information...

+
+ + diff --git a/web/app/public/sounds/hover.mp3 b/web/app/public/sounds/hover.mp3 new file mode 100644 index 000000000..5a9b52fcf --- /dev/null +++ b/web/app/public/sounds/hover.mp3 @@ -0,0 +1,46 @@ + + + + Example Domain + + + + + + + + +
+

Example Domain

+

This domain is for use in illustrative examples in documents. You may use this + domain in literature without prior coordination or asking for permission.

+

More information...

+
+ + diff --git a/web/app/public/sounds/manifest.ts b/web/app/public/sounds/manifest.ts new file mode 100644 index 000000000..b98ef7fee --- /dev/null +++ b/web/app/public/sounds/manifest.ts @@ -0,0 +1,13 @@ +export const soundAssets = { + send: '/assets/sounds/send.mp3', + receive: '/assets/sounds/receive.mp3', + typing: '/assets/sounds/typing.mp3', + notification: '/assets/sounds/notification.mp3', + click: '/assets/sounds/click.mp3', + hover: '/assets/sounds/hover.mp3', + success: '/assets/sounds/success.mp3', + error: '/assets/sounds/error.mp3' +} as const; + +// Type for sound names +export type SoundName = keyof typeof soundAssets; diff --git a/web/app/public/sounds/notification.mp3 b/web/app/public/sounds/notification.mp3 new file mode 100644 index 000000000..5a9b52fcf --- /dev/null +++ b/web/app/public/sounds/notification.mp3 @@ -0,0 +1,46 @@ + + + + Example Domain + + + + + + + + +
+

Example Domain

+

This domain is for use in illustrative examples in documents. You may use this + domain in literature without prior coordination or asking for permission.

+

More information...

+
+ + diff --git a/web/app/public/sounds/receive.mp3 b/web/app/public/sounds/receive.mp3 new file mode 100644 index 000000000..5a9b52fcf --- /dev/null +++ b/web/app/public/sounds/receive.mp3 @@ -0,0 +1,46 @@ + + + + Example Domain + + + + + + + + +
+

Example Domain

+

This domain is for use in illustrative examples in documents. You may use this + domain in literature without prior coordination or asking for permission.

+

More information...

+
+ + diff --git a/web/app/public/sounds/send.mp3 b/web/app/public/sounds/send.mp3 new file mode 100644 index 000000000..5a9b52fcf --- /dev/null +++ b/web/app/public/sounds/send.mp3 @@ -0,0 +1,46 @@ + + + + Example Domain + + + + + + + + +
+

Example Domain

+

This domain is for use in illustrative examples in documents. You may use this + domain in literature without prior coordination or asking for permission.

+

More information...

+
+ + diff --git a/web/app/public/sounds/success.mp3 b/web/app/public/sounds/success.mp3 new file mode 100644 index 000000000..5a9b52fcf --- /dev/null +++ b/web/app/public/sounds/success.mp3 @@ -0,0 +1,46 @@ + + + + Example Domain + + + + + + + + +
+

Example Domain

+

This domain is for use in illustrative examples in documents. You may use this + domain in literature without prior coordination or asking for permission.

+

More information...

+
+ + diff --git a/web/app/public/sounds/typing.mp3 b/web/app/public/sounds/typing.mp3 new file mode 100644 index 000000000..5a9b52fcf --- /dev/null +++ b/web/app/public/sounds/typing.mp3 @@ -0,0 +1,46 @@ + + + + Example Domain + + + + + + + + +
+

Example Domain

+

This domain is for use in illustrative examples in documents. You may use this + domain in literature without prior coordination or asking for permission.

+

More information...

+
+ + diff --git a/web/app/public/styles/output.css b/web/app/public/styles/output.css new file mode 100644 index 000000000..cd05315b6 --- /dev/null +++ b/web/app/public/styles/output.css @@ -0,0 +1,2801 @@ +/* +! tailwindcss v3.1.8 | MIT License | https://tailwindcss.com +*/ + +/* +1. Prevent padding and border from affecting element width. (https://github.com/mozdevs/cssremedy/issues/4) +2. Allow adding a border to an element by just adding a border-width. (https://github.com/tailwindcss/tailwindcss/pull/116) +*/ + +*, +::before, +::after { + box-sizing: border-box; + /* 1 */ + border-width: 0; + /* 2 */ + border-style: solid; + /* 2 */ + border-color: #e5e7eb; + /* 2 */ +} + +::before, +::after { + --tw-content: ''; +} + +/* +1. Use a consistent sensible line-height in all browsers. +2. Prevent adjustments of font size after orientation changes in iOS. +3. Use a more readable tab size. +4. Use the user's configured `sans` font-family by default. +*/ + +html { + line-height: 1.5; + /* 1 */ + -webkit-text-size-adjust: 100%; + /* 2 */ + -moz-tab-size: 4; + /* 3 */ + -o-tab-size: 4; + tab-size: 4; + /* 3 */ + font-family: ui-sans-serif, system-ui, -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, "Noto Sans", sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji"; + /* 4 */ +} + +/* +1. Remove the margin in all browsers. +2. Inherit line-height from `html` so users can set them as a class directly on the `html` element. +*/ + +body { + margin: 0; + /* 1 */ + line-height: inherit; + /* 2 */ +} + +/* +1. Add the correct height in Firefox. +2. Correct the inheritance of border color in Firefox. (https://bugzilla.mozilla.org/show_bug.cgi?id=190655) +3. Ensure horizontal rules are visible by default. +*/ + +hr { + height: 0; + /* 1 */ + color: inherit; + /* 2 */ + border-top-width: 1px; + /* 3 */ +} + +/* +Add the correct text decoration in Chrome, Edge, and Safari. +*/ + +abbr:where([title]) { + -webkit-text-decoration: underline dotted; + text-decoration: underline dotted; +} + +/* +Remove the default font size and weight for headings. +*/ + +h1, +h2, +h3, +h4, +h5, +h6 { + font-size: inherit; + font-weight: inherit; +} + +/* +Reset links to optimize for opt-in styling instead of opt-out. +*/ + +a { + color: inherit; + text-decoration: inherit; +} + +/* +Add the correct font weight in Edge and Safari. +*/ + +b, +strong { + font-weight: bolder; +} + +/* +1. Use the user's configured `mono` font family by default. +2. Correct the odd `em` font sizing in all browsers. +*/ + +code, +kbd, +samp, +pre { + font-family: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace; + /* 1 */ + font-size: 1em; + /* 2 */ +} + +/* +Add the correct font size in all browsers. +*/ + +small { + font-size: 80%; +} + +/* +Prevent `sub` and `sup` elements from affecting the line height in all browsers. +*/ + +sub, +sup { + font-size: 75%; + line-height: 0; + position: relative; + vertical-align: baseline; +} + +sub { + bottom: -0.25em; +} + +sup { + top: -0.5em; +} + +/* +1. Remove text indentation from table contents in Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=999088, https://bugs.webkit.org/show_bug.cgi?id=201297) +2. Correct table border color inheritance in all Chrome and Safari. (https://bugs.chromium.org/p/chromium/issues/detail?id=935729, https://bugs.webkit.org/show_bug.cgi?id=195016) +3. Remove gaps between table borders by default. +*/ + +table { + text-indent: 0; + /* 1 */ + border-color: inherit; + /* 2 */ + border-collapse: collapse; + /* 3 */ +} + +/* +1. Change the font styles in all browsers. +2. Remove the margin in Firefox and Safari. +3. Remove default padding in all browsers. +*/ + +button, +input, +optgroup, +select, +textarea { + font-family: inherit; + /* 1 */ + font-size: 100%; + /* 1 */ + font-weight: inherit; + /* 1 */ + line-height: inherit; + /* 1 */ + color: inherit; + /* 1 */ + margin: 0; + /* 2 */ + padding: 0; + /* 3 */ +} + +/* +Remove the inheritance of text transform in Edge and Firefox. +*/ + +button, +select { + text-transform: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Remove default button styles. +*/ + +button, +[type='button'], +[type='reset'], +[type='submit'] { + -webkit-appearance: button; + /* 1 */ + background-color: transparent; + /* 2 */ + background-image: none; + /* 2 */ +} + +/* +Use the modern Firefox focus style for all focusable elements. +*/ + +:-moz-focusring { + outline: auto; +} + +/* +Remove the additional `:invalid` styles in Firefox. (https://github.com/mozilla/gecko-dev/blob/2f9eacd9d3d995c937b4251a5557d95d494c9be1/layout/style/res/forms.css#L728-L737) +*/ + +:-moz-ui-invalid { + box-shadow: none; +} + +/* +Add the correct vertical alignment in Chrome and Firefox. +*/ + +progress { + vertical-align: baseline; +} + +/* +Correct the cursor style of increment and decrement buttons in Safari. +*/ + +::-webkit-inner-spin-button, +::-webkit-outer-spin-button { + height: auto; +} + +/* +1. Correct the odd appearance in Chrome and Safari. +2. Correct the outline style in Safari. +*/ + +[type='search'] { + -webkit-appearance: textfield; + /* 1 */ + outline-offset: -2px; + /* 2 */ +} + +/* +Remove the inner padding in Chrome and Safari on macOS. +*/ + +::-webkit-search-decoration { + -webkit-appearance: none; +} + +/* +1. Correct the inability to style clickable types in iOS and Safari. +2. Change font properties to `inherit` in Safari. +*/ + +::-webkit-file-upload-button { + -webkit-appearance: button; + /* 1 */ + font: inherit; + /* 2 */ +} + +/* +Add the correct display in Chrome and Safari. +*/ + +summary { + display: list-item; +} + +/* +Removes the default spacing and border for appropriate elements. +*/ + +blockquote, +dl, +dd, +h1, +h2, +h3, +h4, +h5, +h6, +hr, +figure, +p, +pre { + margin: 0; +} + +fieldset { + margin: 0; + padding: 0; +} + +legend { + padding: 0; +} + +ol, +ul, +menu { + list-style: none; + margin: 0; + padding: 0; +} + +/* +Prevent resizing textareas horizontally by default. +*/ + +textarea { + resize: vertical; +} + +/* +1. Reset the default placeholder opacity in Firefox. (https://github.com/tailwindlabs/tailwindcss/issues/3300) +2. Set the default placeholder color to the user's configured gray 400 color. +*/ + +input::-moz-placeholder, textarea::-moz-placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +input::placeholder, +textarea::placeholder { + opacity: 1; + /* 1 */ + color: #9ca3af; + /* 2 */ +} + +/* +Set the default cursor for buttons. +*/ + +button, +[role="button"] { + cursor: pointer; +} + +/* +Make sure disabled buttons don't get the pointer cursor. +*/ + +:disabled { + cursor: default; +} + +/* +1. Make replaced elements `display: block` by default. (https://github.com/mozdevs/cssremedy/issues/14) +2. Add `vertical-align: middle` to align replaced elements more sensibly by default. (https://github.com/jensimmons/cssremedy/issues/14#issuecomment-634934210) + This can trigger a poorly considered lint error in some tools but is included by design. +*/ + +img, +svg, +video, +canvas, +audio, +iframe, +embed, +object { + display: block; + /* 1 */ + vertical-align: middle; + /* 2 */ +} + +/* +Constrain images and videos to the parent width and preserve their intrinsic aspect ratio. (https://github.com/mozdevs/cssremedy/issues/14) +*/ + +img, +video { + max-width: 100%; + height: auto; +} + +*, ::before, ::after { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +::backdrop { + --tw-border-spacing-x: 0; + --tw-border-spacing-y: 0; + --tw-translate-x: 0; + --tw-translate-y: 0; + --tw-rotate: 0; + --tw-skew-x: 0; + --tw-skew-y: 0; + --tw-scale-x: 1; + --tw-scale-y: 1; + --tw-pan-x: ; + --tw-pan-y: ; + --tw-pinch-zoom: ; + --tw-scroll-snap-strictness: proximity; + --tw-ordinal: ; + --tw-slashed-zero: ; + --tw-numeric-figure: ; + --tw-numeric-spacing: ; + --tw-numeric-fraction: ; + --tw-ring-inset: ; + --tw-ring-offset-width: 0px; + --tw-ring-offset-color: #fff; + --tw-ring-color: rgb(59 130 246 / 0.5); + --tw-ring-offset-shadow: 0 0 #0000; + --tw-ring-shadow: 0 0 #0000; + --tw-shadow: 0 0 #0000; + --tw-shadow-colored: 0 0 #0000; + --tw-blur: ; + --tw-brightness: ; + --tw-contrast: ; + --tw-grayscale: ; + --tw-hue-rotate: ; + --tw-invert: ; + --tw-saturate: ; + --tw-sepia: ; + --tw-drop-shadow: ; + --tw-backdrop-blur: ; + --tw-backdrop-brightness: ; + --tw-backdrop-contrast: ; + --tw-backdrop-grayscale: ; + --tw-backdrop-hue-rotate: ; + --tw-backdrop-invert: ; + --tw-backdrop-opacity: ; + --tw-backdrop-saturate: ; + --tw-backdrop-sepia: ; +} + +.container { + width: 100%; +} + +@media (min-width: 640px) { + .container { + max-width: 640px; + } +} + +@media (min-width: 768px) { + .container { + max-width: 768px; + } +} + +@media (min-width: 1024px) { + .container { + max-width: 1024px; + } +} + +@media (min-width: 1280px) { + .container { + max-width: 1280px; + } +} + +@media (min-width: 1536px) { + .container { + max-width: 1536px; + } +} + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + margin: -1px; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border-width: 0; +} + +.pointer-events-none { + pointer-events: none; +} + +.pointer-events-auto { + pointer-events: auto; +} + +.visible { + visibility: visible; +} + +.\!visible { + visibility: visible !important; +} + +.invisible { + visibility: hidden; +} + +.fixed { + position: fixed; +} + +.absolute { + position: absolute; +} + +.relative { + position: relative; +} + +.inset-0 { + top: 0px; + right: 0px; + bottom: 0px; + left: 0px; +} + +.inset-x-0 { + left: 0px; + right: 0px; +} + +.inset-y-0 { + top: 0px; + bottom: 0px; +} + +.left-\[50\%\] { + left: 50%; +} + +.top-\[50\%\] { + top: 50%; +} + +.left-1 { + left: 0.25rem; +} + +.right-1 { + right: 0.25rem; +} + +.left-2 { + left: 0.5rem; +} + +.right-4 { + right: 1rem; +} + +.top-4 { + top: 1rem; +} + +.top-\[1px\] { + top: 1px; +} + +.left-0 { + left: 0px; +} + +.top-0 { + top: 0px; +} + +.top-full { + top: 100%; +} + +.top-\[60\%\] { + top: 60%; +} + +.right-2 { + right: 0.5rem; +} + +.bottom-0 { + bottom: 0px; +} + +.right-0 { + right: 0px; +} + +.top-1 { + top: 0.25rem; +} + +.left-2\.5 { + left: 0.625rem; +} + +.top-2\.5 { + top: 0.625rem; +} + +.top-2 { + top: 0.5rem; +} + +.z-50 { + z-index: 50; +} + +.z-10 { + z-index: 10; +} + +.z-\[1\] { + z-index: 1; +} + +.z-\[100\] { + z-index: 100; +} + +.z-0 { + z-index: 0; +} + +.m-0 { + margin: 0px; +} + +.my-4 { + margin-top: 1rem; + margin-bottom: 1rem; +} + +.my-6 { + margin-top: 1.5rem; + margin-bottom: 1.5rem; +} + +.-mx-1 { + margin-left: -0.25rem; + margin-right: -0.25rem; +} + +.my-1 { + margin-top: 0.25rem; + margin-bottom: 0.25rem; +} + +.mx-1 { + margin-left: 0.25rem; + margin-right: 0.25rem; +} + +.mx-2 { + margin-left: 0.5rem; + margin-right: 0.5rem; +} + +.mt-1 { + margin-top: 0.25rem; +} + +.mb-4 { + margin-bottom: 1rem; +} + +.mb-6 { + margin-bottom: 1.5rem; +} + +.mb-1 { + margin-bottom: 0.25rem; +} + +.mb-8 { + margin-bottom: 2rem; +} + +.mt-2 { + margin-top: 0.5rem; +} + +.mr-2 { + margin-right: 0.5rem; +} + +.ml-auto { + margin-left: auto; +} + +.ml-1 { + margin-left: 0.25rem; +} + +.mt-1\.5 { + margin-top: 0.375rem; +} + +.mt-4 { + margin-top: 1rem; +} + +.ml-2 { + margin-left: 0.5rem; +} + +.mt-auto { + margin-top: auto; +} + +.mb-2 { + margin-bottom: 0.5rem; +} + +.mb-3 { + margin-bottom: 0.75rem; +} + +.ml-3 { + margin-left: 0.75rem; +} + +.mr-4 { + margin-right: 1rem; +} + +.ml-4 { + margin-left: 1rem; +} + +.mb-5 { + margin-bottom: 1.25rem; +} + +.block { + display: block; +} + +.flex { + display: flex; +} + +.inline-flex { + display: inline-flex; +} + +.table { + display: table; +} + +.grid { + display: grid; +} + +.hidden { + display: none; +} + +.aspect-square { + aspect-ratio: 1 / 1; +} + +.aspect-\[3\/4\] { + aspect-ratio: 3/4; +} + +.h-16 { + height: 4rem; +} + +.h-screen { + height: 100vh; +} + +.h-\[calc\(100vh-80px\)\] { + height: calc(100vh - 80px); +} + +.h-4 { + height: 1rem; +} + +.h-10 { + height: 2.5rem; +} + +.h-full { + height: 100%; +} + +.h-9 { + height: 2.25rem; +} + +.h-8 { + height: 2rem; +} + +.h-7 { + height: 1.75rem; +} + +.h-px { + height: 1px; +} + +.h-3\.5 { + height: 0.875rem; +} + +.h-3 { + height: 0.75rem; +} + +.h-2 { + height: 0.5rem; +} + +.h-\[var\(--radix-navigation-menu-viewport-height\)\] { + height: var(--radix-navigation-menu-viewport-height); +} + +.h-1\.5 { + height: 0.375rem; +} + +.h-1 { + height: 0.25rem; +} + +.h-2\.5 { + height: 0.625rem; +} + +.h-\[var\(--radix-select-trigger-height\)\] { + height: var(--radix-select-trigger-height); +} + +.h-\[1px\] { + height: 1px; +} + +.h-5 { + height: 1.25rem; +} + +.h-6 { + height: 1.5rem; +} + +.h-\[52px\] { + height: 52px; +} + +.max-h-\[300px\] { + max-height: 300px; +} + +.max-h-\[--radix-context-menu-content-available-height\] { + max-height: --radix-context-menu-content-available-height; +} + +.max-h-\[var\(--radix-dropdown-menu-content-available-height\)\] { + max-height: var(--radix-dropdown-menu-content-available-height); +} + +.max-h-\[--radix-select-content-available-height\] { + max-height: --radix-select-content-available-height; +} + +.max-h-screen { + max-height: 100vh; +} + +.max-h-\[800px\] { + max-height: 800px; +} + +.max-h-72 { + max-height: 18rem; +} + +.min-h-screen { + min-height: 100vh; +} + +.min-h-\[60px\] { + min-height: 60px; +} + +.w-full { + width: 100%; +} + +.w-64 { + width: 16rem; +} + +.w-4 { + width: 1rem; +} + +.w-10 { + width: 2.5rem; +} + +.w-9 { + width: 2.25rem; +} + +.w-7 { + width: 1.75rem; +} + +.w-8 { + width: 2rem; +} + +.w-3\.5 { + width: 0.875rem; +} + +.w-3 { + width: 0.75rem; +} + +.w-2 { + width: 0.5rem; +} + +.w-max { + width: -moz-max-content; + width: max-content; +} + +.w-72 { + width: 18rem; +} + +.w-px { + width: 1px; +} + +.w-2\.5 { + width: 0.625rem; +} + +.w-\[1px\] { + width: 1px; +} + +.w-3\/4 { + width: 75%; +} + +.w-56 { + width: 14rem; +} + +.w-48 { + width: 12rem; +} + +.w-\[535px\] { + width: 535px; +} + +.min-w-\[8rem\] { + min-width: 8rem; +} + +.min-w-\[12rem\] { + min-width: 12rem; +} + +.min-w-\[var\(--radix-select-trigger-width\)\] { + min-width: var(--radix-select-trigger-width); +} + +.min-w-\[250px\] { + min-width: 250px; +} + +.min-w-\[50px\] { + min-width: 50px; +} + +.min-w-full { + min-width: 100%; +} + +.max-w-lg { + max-width: 32rem; +} + +.max-w-max { + max-width: -moz-max-content; + max-width: max-content; +} + +.max-w-md { + max-width: 28rem; +} + +.flex-1 { + flex: 1 1 0%; +} + +.flex-shrink-0 { + flex-shrink: 0; +} + +.shrink-0 { + flex-shrink: 0; +} + +.flex-grow { + flex-grow: 1; +} + +.grow { + flex-grow: 1; +} + +.border-collapse { + border-collapse: collapse; +} + +.origin-\[--radix-context-menu-content-transform-origin\] { + transform-origin: --radix-context-menu-content-transform-origin; +} + +.origin-\[--radix-dropdown-menu-content-transform-origin\] { + transform-origin: --radix-dropdown-menu-content-transform-origin; +} + +.origin-\[--radix-hover-card-content-transform-origin\] { + transform-origin: --radix-hover-card-content-transform-origin; +} + +.origin-\[--radix-menubar-content-transform-origin\] { + transform-origin: --radix-menubar-content-transform-origin; +} + +.origin-\[--radix-popover-content-transform-origin\] { + transform-origin: --radix-popover-content-transform-origin; +} + +.origin-\[--radix-select-content-transform-origin\] { + transform-origin: --radix-select-content-transform-origin; +} + +.origin-\[--radix-tooltip-content-transform-origin\] { + transform-origin: --radix-tooltip-content-transform-origin; +} + +.origin-top-right { + transform-origin: top right; +} + +.translate-x-\[-50\%\] { + --tw-translate-x: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.translate-y-\[-50\%\] { + --tw-translate-y: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.rotate-45 { + --tw-rotate: 45deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.transform { + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +@keyframes pulse { + 50% { + opacity: .5; + } +} + +.animate-pulse { + animation: pulse 2s cubic-bezier(0.4, 0, 0.6, 1) infinite; +} + +.cursor-default { + cursor: default; +} + +.cursor-pointer { + cursor: pointer; +} + +.touch-none { + touch-action: none; +} + +.select-none { + -webkit-user-select: none; + -moz-user-select: none; + user-select: none; +} + +.list-none { + list-style-type: none; +} + +.flex-col { + flex-direction: column; +} + +.flex-col-reverse { + flex-direction: column-reverse; +} + +.flex-wrap { + flex-wrap: wrap; +} + +.items-start { + align-items: flex-start; +} + +.items-end { + align-items: flex-end; +} + +.items-center { + align-items: center; +} + +.items-stretch { + align-items: stretch; +} + +.justify-start { + justify-content: flex-start; +} + +.justify-end { + justify-content: flex-end; +} + +.justify-center { + justify-content: center; +} + +.justify-between { + justify-content: space-between; +} + +.justify-around { + justify-content: space-around; +} + +.gap-4 { + gap: 1rem; +} + +.gap-6 { + gap: 1.5rem; +} + +.gap-2 { + gap: 0.5rem; +} + +.gap-1 { + gap: 0.25rem; +} + +.gap-3 { + gap: 0.75rem; +} + +.space-x-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(1rem * var(--tw-space-x-reverse)); + margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-y-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1rem * var(--tw-space-y-reverse)); +} + +.space-x-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.5rem * var(--tw-space-x-reverse)); + margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-y-6 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(1.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(1.5rem * var(--tw-space-y-reverse)); +} + +.space-y-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.5rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.5rem * var(--tw-space-y-reverse)); +} + +.space-x-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.25rem * var(--tw-space-x-reverse)); + margin-left: calc(0.25rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-y-1 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.25rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.25rem * var(--tw-space-y-reverse)); +} + +.space-y-1\.5 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.375rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.375rem * var(--tw-space-y-reverse)); +} + +.space-x-3 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.75rem * var(--tw-space-x-reverse)); + margin-left: calc(0.75rem * calc(1 - var(--tw-space-x-reverse))); +} + +.space-y-3 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0.75rem * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0.75rem * var(--tw-space-y-reverse)); +} + +.-space-x-px > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(-1px * var(--tw-space-x-reverse)); + margin-left: calc(-1px * calc(1 - var(--tw-space-x-reverse))); +} + +.divide-y > :not([hidden]) ~ :not([hidden]) { + --tw-divide-y-reverse: 0; + border-top-width: calc(1px * calc(1 - var(--tw-divide-y-reverse))); + border-bottom-width: calc(1px * var(--tw-divide-y-reverse)); +} + +.divide-gray-200 > :not([hidden]) ~ :not([hidden]) { + --tw-divide-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-divide-opacity)); +} + +.overflow-auto { + overflow: auto; +} + +.overflow-hidden { + overflow: hidden; +} + +.overflow-x-auto { + overflow-x: auto; +} + +.overflow-y-auto { + overflow-y: auto; +} + +.overflow-x-hidden { + overflow-x: hidden; +} + +.whitespace-nowrap { + white-space: nowrap; +} + +.whitespace-pre-wrap { + white-space: pre-wrap; +} + +.rounded { + border-radius: 0.25rem; +} + +.rounded-lg { + border-radius: var(--radius); +} + +.rounded-full { + border-radius: 9999px; +} + +.rounded-md { + border-radius: calc(var(--radius) - 2px); +} + +.rounded-xl { + border-radius: 0.75rem; +} + +.rounded-sm { + border-radius: calc(var(--radius) - 4px); +} + +.rounded-\[inherit\] { + border-radius: inherit; +} + +.rounded-l-md { + border-top-left-radius: calc(var(--radius) - 2px); + border-bottom-left-radius: calc(var(--radius) - 2px); +} + +.rounded-r-md { + border-top-right-radius: calc(var(--radius) - 2px); + border-bottom-right-radius: calc(var(--radius) - 2px); +} + +.rounded-tl-sm { + border-top-left-radius: calc(var(--radius) - 4px); +} + +.border { + border-width: 1px; +} + +.border-2 { + border-width: 2px; +} + +.border-b { + border-bottom-width: 1px; +} + +.border-t { + border-top-width: 1px; +} + +.border-r { + border-right-width: 1px; +} + +.border-l { + border-left-width: 1px; +} + +.border-gray-200 { + --tw-border-opacity: 1; + border-color: rgb(229 231 235 / var(--tw-border-opacity)); +} + +.border-red-500 { + --tw-border-opacity: 1; + border-color: rgb(239 68 68 / var(--tw-border-opacity)); +} + +.border-gray-300 { + --tw-border-opacity: 1; + border-color: rgb(209 213 219 / var(--tw-border-opacity)); +} + +.border-destructive\/50 { + border-color: hsl(var(--destructive) / 0.5); +} + +.border-transparent { + border-color: transparent; +} + +.border-input { + border-color: hsl(var(--input)); +} + +.border-primary { + border-color: hsl(var(--primary)); +} + +.border-primary\/50 { + border-color: hsl(var(--primary) / 0.5); +} + +.border-destructive { + border-color: hsl(var(--destructive)); +} + +.border-l-transparent { + border-left-color: transparent; +} + +.border-t-transparent { + border-top-color: transparent; +} + +.bg-gray-50 { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity)); +} + +.bg-white { + --tw-bg-opacity: 1; + background-color: rgb(255 255 255 / var(--tw-bg-opacity)); +} + +.bg-blue-500 { + --tw-bg-opacity: 1; + background-color: rgb(59 130 246 / var(--tw-bg-opacity)); +} + +.bg-black\/80 { + background-color: rgb(0 0 0 / 0.8); +} + +.bg-background { + background-color: hsl(var(--background)); +} + +.bg-muted { + background-color: hsl(var(--muted)); +} + +.bg-primary { + background-color: hsl(var(--primary)); +} + +.bg-secondary { + background-color: hsl(var(--secondary)); +} + +.bg-destructive { + background-color: hsl(var(--destructive)); +} + +.bg-transparent { + background-color: transparent; +} + +.bg-accent { + background-color: hsl(var(--accent)); +} + +.bg-card { + background-color: hsl(var(--card)); +} + +.bg-popover { + background-color: hsl(var(--popover)); +} + +.bg-border { + background-color: hsl(var(--border)); +} + +.bg-primary\/20 { + background-color: hsl(var(--primary) / 0.2); +} + +.bg-primary\/10 { + background-color: hsl(var(--primary) / 0.1); +} + +.bg-muted\/50 { + background-color: hsl(var(--muted) / 0.5); +} + +.bg-gray-200 { + --tw-bg-opacity: 1; + background-color: rgb(229 231 235 / var(--tw-bg-opacity)); +} + +.bg-black { + --tw-bg-opacity: 1; + background-color: rgb(0 0 0 / var(--tw-bg-opacity)); +} + +.bg-green-500 { + --tw-bg-opacity: 1; + background-color: rgb(34 197 94 / var(--tw-bg-opacity)); +} + +.bg-blue-600 { + --tw-bg-opacity: 1; + background-color: rgb(37 99 235 / var(--tw-bg-opacity)); +} + +.bg-background\/95 { + background-color: hsl(var(--background) / 0.95); +} + +.bg-gray-100 { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity)); +} + +.bg-opacity-50 { + --tw-bg-opacity: 0.5; +} + +.fill-current { + fill: currentColor; +} + +.fill-primary { + fill: hsl(var(--primary)); +} + +.object-cover { + -o-object-fit: cover; + object-fit: cover; +} + +.p-4 { + padding: 1rem; +} + +.p-6 { + padding: 1.5rem; +} + +.p-5 { + padding: 1.25rem; +} + +.p-2 { + padding: 0.5rem; +} + +.p-3 { + padding: 0.75rem; +} + +.p-0 { + padding: 0px; +} + +.p-1 { + padding: 0.25rem; +} + +.p-\[1px\] { + padding: 1px; +} + +.p-8 { + padding: 2rem; +} + +.px-4 { + padding-left: 1rem; + padding-right: 1rem; +} + +.py-2 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} + +.px-6 { + padding-left: 1.5rem; + padding-right: 1.5rem; +} + +.py-4 { + padding-top: 1rem; + padding-bottom: 1rem; +} + +.py-3 { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + +.px-2\.5 { + padding-left: 0.625rem; + padding-right: 0.625rem; +} + +.py-0\.5 { + padding-top: 0.125rem; + padding-bottom: 0.125rem; +} + +.px-2 { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.py-0 { + padding-top: 0px; + padding-bottom: 0px; +} + +.px-3 { + padding-left: 0.75rem; + padding-right: 0.75rem; +} + +.px-8 { + padding-left: 2rem; + padding-right: 2rem; +} + +.py-6 { + padding-top: 1.5rem; + padding-bottom: 1.5rem; +} + +.py-1\.5 { + padding-top: 0.375rem; + padding-bottom: 0.375rem; +} + +.py-1 { + padding-top: 0.25rem; + padding-bottom: 0.25rem; +} + +.px-1\.5 { + padding-left: 0.375rem; + padding-right: 0.375rem; +} + +.px-1 { + padding-left: 0.25rem; + padding-right: 0.25rem; +} + +.pb-4 { + padding-bottom: 1rem; +} + +.pt-0 { + padding-top: 0px; +} + +.pt-1 { + padding-top: 0.25rem; +} + +.pl-8 { + padding-left: 2rem; +} + +.pr-2 { + padding-right: 0.5rem; +} + +.pl-2 { + padding-left: 0.5rem; +} + +.pr-8 { + padding-right: 2rem; +} + +.pr-6 { + padding-right: 1.5rem; +} + +.pr-4 { + padding-right: 1rem; +} + +.pl-4 { + padding-left: 1rem; +} + +.text-left { + text-align: left; +} + +.text-center { + text-align: center; +} + +.align-middle { + vertical-align: middle; +} + +.text-2xl { + font-size: 1.5rem; + line-height: 2rem; +} + +.text-sm { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.text-xs { + font-size: 0.75rem; + line-height: 1rem; +} + +.text-lg { + font-size: 1.125rem; + line-height: 1.75rem; +} + +.text-\[0\.8rem\] { + font-size: 0.8rem; +} + +.text-base { + font-size: 1rem; + line-height: 1.5rem; +} + +.text-xl { + font-size: 1.25rem; + line-height: 1.75rem; +} + +.font-bold { + font-weight: 700; +} + +.font-medium { + font-weight: 500; +} + +.font-semibold { + font-weight: 600; +} + +.font-normal { + font-weight: 400; +} + +.uppercase { + text-transform: uppercase; +} + +.leading-none { + line-height: 1; +} + +.tracking-tight { + letter-spacing: -0.025em; +} + +.tracking-widest { + letter-spacing: 0.1em; +} + +.tracking-wider { + letter-spacing: 0.05em; +} + +.text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.text-gray-500 { + --tw-text-opacity: 1; + color: rgb(107 114 128 / var(--tw-text-opacity)); +} + +.text-red-500 { + --tw-text-opacity: 1; + color: rgb(239 68 68 / var(--tw-text-opacity)); +} + +.text-gray-900 { + --tw-text-opacity: 1; + color: rgb(17 24 39 / var(--tw-text-opacity)); +} + +.text-muted-foreground { + color: hsl(var(--muted-foreground)); +} + +.text-foreground { + color: hsl(var(--foreground)); +} + +.text-destructive { + color: hsl(var(--destructive)); +} + +.text-primary-foreground { + color: hsl(var(--primary-foreground)); +} + +.text-secondary-foreground { + color: hsl(var(--secondary-foreground)); +} + +.text-destructive-foreground { + color: hsl(var(--destructive-foreground)); +} + +.text-primary { + color: hsl(var(--primary)); +} + +.text-accent-foreground { + color: hsl(var(--accent-foreground)); +} + +.text-card-foreground { + color: hsl(var(--card-foreground)); +} + +.text-current { + color: currentColor; +} + +.text-popover-foreground { + color: hsl(var(--popover-foreground)); +} + +.text-foreground\/50 { + color: hsl(var(--foreground) / 0.5); +} + +.text-gray-400 { + --tw-text-opacity: 1; + color: rgb(156 163 175 / var(--tw-text-opacity)); +} + +.text-zinc-600 { + --tw-text-opacity: 1; + color: rgb(82 82 91 / var(--tw-text-opacity)); +} + +.text-background { + color: hsl(var(--background)); +} + +.text-blue-600 { + --tw-text-opacity: 1; + color: rgb(37 99 235 / var(--tw-text-opacity)); +} + +.text-blue-500 { + --tw-text-opacity: 1; + color: rgb(59 130 246 / var(--tw-text-opacity)); +} + +.text-gray-700 { + --tw-text-opacity: 1; + color: rgb(55 65 81 / var(--tw-text-opacity)); +} + +.underline-offset-4 { + text-underline-offset: 4px; +} + +.opacity-50 { + opacity: 0.5; +} + +.opacity-70 { + opacity: 0.7; +} + +.opacity-60 { + opacity: 0.6; +} + +.opacity-0 { + opacity: 0; +} + +.opacity-90 { + opacity: 0.9; +} + +.shadow-lg { + --tw-shadow: 0 10px 15px -3px rgb(0 0 0 / 0.1), 0 4px 6px -4px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 10px 15px -3px var(--tw-shadow-color), 0 4px 6px -4px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow { + --tw-shadow: 0 1px 3px 0 rgb(0 0 0 / 0.1), 0 1px 2px -1px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 1px 3px 0 var(--tw-shadow-color), 0 1px 2px -1px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-sm { + --tw-shadow: 0 1px 2px 0 rgb(0 0 0 / 0.05); + --tw-shadow-colored: 0 1px 2px 0 var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.shadow-md { + --tw-shadow: 0 4px 6px -1px rgb(0 0 0 / 0.1), 0 2px 4px -2px rgb(0 0 0 / 0.1); + --tw-shadow-colored: 0 4px 6px -1px var(--tw-shadow-color), 0 2px 4px -2px var(--tw-shadow-color); + box-shadow: var(--tw-ring-offset-shadow, 0 0 #0000), var(--tw-ring-shadow, 0 0 #0000), var(--tw-shadow); +} + +.outline-none { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.outline { + outline-style: solid; +} + +.ring-0 { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(0px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.ring-1 { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.ring-black { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(0 0 0 / var(--tw-ring-opacity)); +} + +.ring-opacity-5 { + --tw-ring-opacity: 0.05; +} + +.ring-offset-background { + --tw-ring-offset-color: hsl(var(--background)); +} + +.filter { + filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow); +} + +.backdrop-blur { + --tw-backdrop-blur: blur(8px); + -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); +} + +.backdrop-filter { + -webkit-backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); + backdrop-filter: var(--tw-backdrop-blur) var(--tw-backdrop-brightness) var(--tw-backdrop-contrast) var(--tw-backdrop-grayscale) var(--tw-backdrop-hue-rotate) var(--tw-backdrop-invert) var(--tw-backdrop-opacity) var(--tw-backdrop-saturate) var(--tw-backdrop-sepia); +} + +.transition-all { + transition-property: all; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-transform { + transition-property: transform; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-colors { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition-opacity { + transition-property: opacity; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.transition { + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, -webkit-backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter; + transition-property: color, background-color, border-color, text-decoration-color, fill, stroke, opacity, box-shadow, transform, filter, backdrop-filter, -webkit-backdrop-filter; + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); + transition-duration: 150ms; +} + +.duration-200 { + transition-duration: 200ms; +} + +.duration-300 { + transition-duration: 300ms; +} + +.ease-in-out { + transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} + +@keyframes enter { + from { + opacity: var(--tw-enter-opacity, 1); + transform: translate3d(var(--tw-enter-translate-x, 0), var(--tw-enter-translate-y, 0), 0) scale3d(var(--tw-enter-scale, 1), var(--tw-enter-scale, 1), var(--tw-enter-scale, 1)) rotate(var(--tw-enter-rotate, 0)); + } +} + +@keyframes exit { + to { + opacity: var(--tw-exit-opacity, 1); + transform: translate3d(var(--tw-exit-translate-x, 0), var(--tw-exit-translate-y, 0), 0) scale3d(var(--tw-exit-scale, 1), var(--tw-exit-scale, 1), var(--tw-exit-scale, 1)) rotate(var(--tw-exit-rotate, 0)); + } +} + +.animate-in { + animation-name: enter; + animation-duration: 150ms; + --tw-enter-opacity: initial; + --tw-enter-scale: initial; + --tw-enter-rotate: initial; + --tw-enter-translate-x: initial; + --tw-enter-translate-y: initial; +} + +.fade-in-0 { + --tw-enter-opacity: 0; +} + +.zoom-in-95 { + --tw-enter-scale: .95; +} + +.duration-200 { + animation-duration: 200ms; +} + +.duration-300 { + animation-duration: 300ms; +} + +.ease-in-out { + animation-timing-function: cubic-bezier(0.4, 0, 0.2, 1); +} + +.file\:border-0::file-selector-button { + border-width: 0px; +} + +.file\:bg-transparent::file-selector-button { + background-color: transparent; +} + +.file\:text-sm::file-selector-button { + font-size: 0.875rem; + line-height: 1.25rem; +} + +.file\:font-medium::file-selector-button { + font-weight: 500; +} + +.file\:text-foreground::file-selector-button { + color: hsl(var(--foreground)); +} + +.placeholder\:text-muted-foreground::-moz-placeholder { + color: hsl(var(--muted-foreground)); +} + +.placeholder\:text-muted-foreground::placeholder { + color: hsl(var(--muted-foreground)); +} + +.after\:absolute::after { + content: var(--tw-content); + position: absolute; +} + +.after\:inset-y-0::after { + content: var(--tw-content); + top: 0px; + bottom: 0px; +} + +.after\:left-1\/2::after { + content: var(--tw-content); + left: 50%; +} + +.after\:w-1::after { + content: var(--tw-content); + width: 0.25rem; +} + +.after\:-translate-x-1\/2::after { + content: var(--tw-content); + --tw-translate-x: -50%; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.focus-within\:relative:focus-within { + position: relative; +} + +.focus-within\:z-20:focus-within { + z-index: 20; +} + +.hover\:scale-105:hover { + --tw-scale-x: 1.05; + --tw-scale-y: 1.05; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.hover\:bg-blue-600:hover { + --tw-bg-opacity: 1; + background-color: rgb(37 99 235 / var(--tw-bg-opacity)); +} + +.hover\:bg-primary\/80:hover { + background-color: hsl(var(--primary) / 0.8); +} + +.hover\:bg-secondary\/80:hover { + background-color: hsl(var(--secondary) / 0.8); +} + +.hover\:bg-destructive\/80:hover { + background-color: hsl(var(--destructive) / 0.8); +} + +.hover\:bg-primary\/90:hover { + background-color: hsl(var(--primary) / 0.9); +} + +.hover\:bg-destructive\/90:hover { + background-color: hsl(var(--destructive) / 0.9); +} + +.hover\:bg-accent:hover { + background-color: hsl(var(--accent)); +} + +.hover\:bg-primary:hover { + background-color: hsl(var(--primary)); +} + +.hover\:bg-muted\/50:hover { + background-color: hsl(var(--muted) / 0.5); +} + +.hover\:bg-secondary:hover { + background-color: hsl(var(--secondary)); +} + +.hover\:bg-muted:hover { + background-color: hsl(var(--muted)); +} + +.hover\:bg-gray-100:hover { + --tw-bg-opacity: 1; + background-color: rgb(243 244 246 / var(--tw-bg-opacity)); +} + +.hover\:bg-green-600:hover { + --tw-bg-opacity: 1; + background-color: rgb(22 163 74 / var(--tw-bg-opacity)); +} + +.hover\:bg-gray-50:hover { + --tw-bg-opacity: 1; + background-color: rgb(249 250 251 / var(--tw-bg-opacity)); +} + +.hover\:bg-blue-700:hover { + --tw-bg-opacity: 1; + background-color: rgb(29 78 216 / var(--tw-bg-opacity)); +} + +.hover\:text-accent-foreground:hover { + color: hsl(var(--accent-foreground)); +} + +.hover\:text-primary-foreground:hover { + color: hsl(var(--primary-foreground)); +} + +.hover\:text-foreground:hover { + color: hsl(var(--foreground)); +} + +.hover\:text-muted-foreground:hover { + color: hsl(var(--muted-foreground)); +} + +.hover\:text-primary:hover { + color: hsl(var(--primary)); +} + +.hover\:text-blue-700:hover { + --tw-text-opacity: 1; + color: rgb(29 78 216 / var(--tw-text-opacity)); +} + +.hover\:underline:hover { + text-decoration-line: underline; +} + +.hover\:opacity-100:hover { + opacity: 1; +} + +.focus\:border-indigo-300:focus { + --tw-border-opacity: 1; + border-color: rgb(165 180 252 / var(--tw-border-opacity)); +} + +.focus\:border-indigo-500:focus { + --tw-border-opacity: 1; + border-color: rgb(99 102 241 / var(--tw-border-opacity)); +} + +.focus\:bg-primary:focus { + background-color: hsl(var(--primary)); +} + +.focus\:bg-accent:focus { + background-color: hsl(var(--accent)); +} + +.focus\:text-primary-foreground:focus { + color: hsl(var(--primary-foreground)); +} + +.focus\:text-accent-foreground:focus { + color: hsl(var(--accent-foreground)); +} + +.focus\:opacity-100:focus { + opacity: 1; +} + +.focus\:outline-none:focus { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.focus\:ring-2:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:ring-1:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:ring:focus { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(3px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus\:ring-ring:focus { + --tw-ring-color: hsl(var(--ring)); +} + +.focus\:ring-blue-500:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(59 130 246 / var(--tw-ring-opacity)); +} + +.focus\:ring-indigo-200:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(199 210 254 / var(--tw-ring-opacity)); +} + +.focus\:ring-indigo-500:focus { + --tw-ring-opacity: 1; + --tw-ring-color: rgb(99 102 241 / var(--tw-ring-opacity)); +} + +.focus\:ring-opacity-50:focus { + --tw-ring-opacity: 0.5; +} + +.focus\:ring-offset-2:focus { + --tw-ring-offset-width: 2px; +} + +.focus-visible\:outline-none:focus-visible { + outline: 2px solid transparent; + outline-offset: 2px; +} + +.focus-visible\:ring-1:focus-visible { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(1px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus-visible\:ring-2:focus-visible { + --tw-ring-offset-shadow: var(--tw-ring-inset) 0 0 0 var(--tw-ring-offset-width) var(--tw-ring-offset-color); + --tw-ring-shadow: var(--tw-ring-inset) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color); + box-shadow: var(--tw-ring-offset-shadow), var(--tw-ring-shadow), var(--tw-shadow, 0 0 #0000); +} + +.focus-visible\:ring-ring:focus-visible { + --tw-ring-color: hsl(var(--ring)); +} + +.focus-visible\:ring-offset-1:focus-visible { + --tw-ring-offset-width: 1px; +} + +.focus-visible\:ring-offset-2:focus-visible { + --tw-ring-offset-width: 2px; +} + +.focus-visible\:ring-offset-background:focus-visible { + --tw-ring-offset-color: hsl(var(--background)); +} + +.disabled\:pointer-events-none:disabled { + pointer-events: none; +} + +.disabled\:cursor-not-allowed:disabled { + cursor: not-allowed; +} + +.disabled\:opacity-50:disabled { + opacity: 0.5; +} + +.group:hover .group-hover\:opacity-100 { + opacity: 1; +} + +.peer:disabled ~ .peer-disabled\:cursor-not-allowed { + cursor: not-allowed; +} + +.peer:disabled ~ .peer-disabled\:opacity-70 { + opacity: 0.7; +} + +.dark .dark\:block { + display: block; +} + +.dark .dark\:hidden { + display: none; +} + +.dark .dark\:border-destructive { + border-color: hsl(var(--destructive)); +} + +.dark .dark\:bg-muted { + background-color: hsl(var(--muted)); +} + +.dark .dark\:text-zinc-200 { + --tw-text-opacity: 1; + color: rgb(228 228 231 / var(--tw-text-opacity)); +} + +.dark .dark\:text-muted-foreground { + color: hsl(var(--muted-foreground)); +} + +.dark .dark\:text-white { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +.dark .dark\:hover\:bg-muted:hover { + background-color: hsl(var(--muted)); +} + +.dark .dark\:hover\:text-white:hover { + --tw-text-opacity: 1; + color: rgb(255 255 255 / var(--tw-text-opacity)); +} + +@media (min-width: 640px) { + .sm\:bottom-0 { + bottom: 0px; + } + + .sm\:right-0 { + right: 0px; + } + + .sm\:top-auto { + top: auto; + } + + .sm\:mt-0 { + margin-top: 0px; + } + + .sm\:flex { + display: flex; + } + + .sm\:hidden { + display: none; + } + + .sm\:max-w-sm { + max-width: 24rem; + } + + .sm\:flex-1 { + flex: 1 1 0%; + } + + .sm\:flex-row { + flex-direction: row; + } + + .sm\:flex-col { + flex-direction: column; + } + + .sm\:items-center { + align-items: center; + } + + .sm\:justify-end { + justify-content: flex-end; + } + + .sm\:justify-between { + justify-content: space-between; + } + + .sm\:space-x-2 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(0.5rem * var(--tw-space-x-reverse)); + margin-left: calc(0.5rem * calc(1 - var(--tw-space-x-reverse))); + } + + .sm\:space-x-4 > :not([hidden]) ~ :not([hidden]) { + --tw-space-x-reverse: 0; + margin-right: calc(1rem * var(--tw-space-x-reverse)); + margin-left: calc(1rem * calc(1 - var(--tw-space-x-reverse))); + } + + .sm\:space-y-0 > :not([hidden]) ~ :not([hidden]) { + --tw-space-y-reverse: 0; + margin-top: calc(0px * calc(1 - var(--tw-space-y-reverse))); + margin-bottom: calc(0px * var(--tw-space-y-reverse)); + } + + .sm\:rounded-lg { + border-radius: var(--radius); + } + + .sm\:text-left { + text-align: left; + } +} + +@media (min-width: 768px) { + .md\:absolute { + position: absolute; + } + + .md\:flex { + display: flex; + } + + .md\:hidden { + display: none; + } + + .md\:w-1\/4 { + width: 25%; + } + + .md\:w-auto { + width: auto; + } + + .md\:w-\[var\(--radix-navigation-menu-viewport-width\)\] { + width: var(--radix-navigation-menu-viewport-width); + } + + .md\:max-w-\[420px\] { + max-width: 420px; + } + + .md\:grid-cols-2 { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .md\:flex-row { + flex-direction: row; + } + + .md\:text-sm { + font-size: 0.875rem; + line-height: 1.25rem; + } +} + +@media (min-width: 1024px) { + .lg\:grid-cols-4 { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } +} + +.\[\&\[data-state\=open\]\>svg\]\:rotate-180[data-state=open]>svg { + --tw-rotate: 180deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.\[\&\>svg\+div\]\:translate-y-\[-3px\]>svg+div { + --tw-translate-y: -3px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.\[\&\>svg\]\:absolute>svg { + position: absolute; +} + +.\[\&\>svg\]\:left-4>svg { + left: 1rem; +} + +.\[\&\>svg\]\:top-4>svg { + top: 1rem; +} + +.\[\&\>svg\]\:hidden>svg { + display: none; +} + +.\[\&\>svg\]\:shrink-0>svg { + flex-shrink: 0; +} + +.\[\&\>svg\]\:text-foreground>svg { + color: hsl(var(--foreground)); +} + +.\[\&\>svg\]\:text-destructive>svg { + color: hsl(var(--destructive)); +} + +.\[\&\>svg\~\*\]\:pl-7>svg~* { + padding-left: 1.75rem; +} + +.\[\&_p\]\:leading-relaxed p { + line-height: 1.625; +} + +.\[\&_svg\]\:pointer-events-none svg { + pointer-events: none; +} + +.\[\&_svg\]\:h-4 svg { + height: 1rem; +} + +.\[\&_svg\]\:w-4 svg { + width: 1rem; +} + +.\[\&_svg\]\:shrink-0 svg { + flex-shrink: 0; +} + +.\[\&_svg\]\:text-foreground svg { + color: hsl(var(--foreground)); +} + +.\[\&\:has\(\[aria-selected\]\)\]\:rounded-md:has([aria-selected]) { + border-radius: calc(var(--radius) - 2px); +} + +.\[\&\:has\(\[aria-selected\]\)\]\:bg-accent:has([aria-selected]) { + background-color: hsl(var(--accent)); +} + +.first\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-l-md:has([aria-selected]):first-child { + border-top-left-radius: calc(var(--radius) - 2px); + border-bottom-left-radius: calc(var(--radius) - 2px); +} + +.last\:\[\&\:has\(\[aria-selected\]\)\]\:rounded-r-md:has([aria-selected]):last-child { + border-top-right-radius: calc(var(--radius) - 2px); + border-bottom-right-radius: calc(var(--radius) - 2px); +} + +.\[\&\:has\(\[aria-selected\]\.day-outside\)\]\:bg-accent\/50:has([aria-selected].day-outside) { + background-color: hsl(var(--accent) / 0.5); +} + +.\[\&\:has\(\[aria-selected\]\.day-range-end\)\]\:rounded-r-md:has([aria-selected].day-range-end) { + border-top-right-radius: calc(var(--radius) - 2px); + border-bottom-right-radius: calc(var(--radius) - 2px); +} + +.\[\&\:has\(\>\.day-range-end\)\]\:rounded-r-md:has(>.day-range-end) { + border-top-right-radius: calc(var(--radius) - 2px); + border-bottom-right-radius: calc(var(--radius) - 2px); +} + +.\[\&\:has\(\>\.day-range-start\)\]\:rounded-l-md:has(>.day-range-start) { + border-top-left-radius: calc(var(--radius) - 2px); + border-bottom-left-radius: calc(var(--radius) - 2px); +} + +.\[\&_\[cmdk-group-heading\]\]\:px-2 [cmdk-group-heading] { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.\[\&_\[cmdk-group-heading\]\]\:py-1\.5 [cmdk-group-heading] { + padding-top: 0.375rem; + padding-bottom: 0.375rem; +} + +.\[\&_\[cmdk-group-heading\]\]\:text-xs [cmdk-group-heading] { + font-size: 0.75rem; + line-height: 1rem; +} + +.\[\&_\[cmdk-group-heading\]\]\:font-medium [cmdk-group-heading] { + font-weight: 500; +} + +.\[\&_\[cmdk-group-heading\]\]\:text-muted-foreground [cmdk-group-heading] { + color: hsl(var(--muted-foreground)); +} + +.\[\&_\[cmdk-group\]\:not\(\[hidden\]\)_\~\[cmdk-group\]\]\:pt-0 [cmdk-group]:not([hidden]) ~[cmdk-group] { + padding-top: 0px; +} + +.\[\&_\[cmdk-group\]\]\:px-2 [cmdk-group] { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.\[\&_\[cmdk-input-wrapper\]_svg\]\:h-5 [cmdk-input-wrapper] svg { + height: 1.25rem; +} + +.\[\&_\[cmdk-input-wrapper\]_svg\]\:w-5 [cmdk-input-wrapper] svg { + width: 1.25rem; +} + +.\[\&_\[cmdk-input\]\]\:h-12 [cmdk-input] { + height: 3rem; +} + +.\[\&_\[cmdk-item\]\]\:px-2 [cmdk-item] { + padding-left: 0.5rem; + padding-right: 0.5rem; +} + +.\[\&_\[cmdk-item\]\]\:py-3 [cmdk-item] { + padding-top: 0.75rem; + padding-bottom: 0.75rem; +} + +.\[\&_\[cmdk-item\]_svg\]\:h-5 [cmdk-item] svg { + height: 1.25rem; +} + +.\[\&_\[cmdk-item\]_svg\]\:w-5 [cmdk-item] svg { + width: 1.25rem; +} + +.\[\&\[data-panel-group-direction\=vertical\]\>div\]\:rotate-90[data-panel-group-direction=vertical]>div { + --tw-rotate: 90deg; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.\[\&_tr\]\:border-b tr { + border-bottom-width: 1px; +} + +.\[\&_tr\:last-child\]\:border-0 tr:last-child { + border-width: 0px; +} + +.\[\&\>tr\]\:last\:border-b-0:last-child>tr { + border-bottom-width: 0px; +} + +.\[\&\:has\(\[role\=checkbox\]\)\]\:pr-0:has([role=checkbox]) { + padding-right: 0px; +} + +.\[\&\>\[role\=checkbox\]\]\:translate-y-\[2px\]>[role=checkbox] { + --tw-translate-y: 2px; + transform: translate(var(--tw-translate-x), var(--tw-translate-y)) rotate(var(--tw-rotate)) skewX(var(--tw-skew-x)) skewY(var(--tw-skew-y)) scaleX(var(--tw-scale-x)) scaleY(var(--tw-scale-y)); +} + +.\[\&\+div\]\:text-xs+div { + font-size: 0.75rem; + line-height: 1rem; +} + +.\[\&\>span\]\:flex>span { + display: flex; +} + +.\[\&\>span\]\:w-full>span { + width: 100%; +} + +.\[\&\>span\]\:w-auto>span { + width: auto; +} + +.\[\&\>span\]\:items-center>span { + align-items: center; +} + +.\[\&\>span\]\:gap-1>span { + gap: 0.25rem; +} + +.\[\&\>span\]\:truncate>span { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} diff --git a/web/app/public/themes/3dbevel.css b/web/app/public/themes/3dbevel.css new file mode 100644 index 000000000..68093914d --- /dev/null +++ b/web/app/public/themes/3dbevel.css @@ -0,0 +1,66 @@ +body, .card, .popover, .input, .button, .menu, .dialog { + font-family: 'IBM Plex Mono', 'Courier New', monospace !important; + background: #c0c0c0 !important; + color: #000 !important; + border-radius: 0 !important; + box-shadow: none !important; +} + +.card, .popover, .menu, .dialog { + border: 2px solid #fff !important; + border-bottom: 2px solid #404040 !important; + border-right: 2px solid #404040 !important; + padding: 8px !important; + background: #e0e0e0 !important; +} + +.button, button, input[type="button"], input[type="submit"] { + background: #e0e0e0 !important; + color: #000 !important; + border: 2px solid #fff !important; + border-bottom: 2px solid #404040 !important; + border-right: 2px solid #404040 !important; + padding: 4px 12px !important; + font-weight: bold !important; + box-shadow: none !important; + outline: none !important; +} + +input, textarea, select { + background: #fff !important; + color: #000 !important; + border: 2px solid #fff !important; + border-bottom: 2px solid #404040 !important; + border-right: 2px solid #404040 !important; + font-family: inherit !important; + box-shadow: none !important; +} + +.menu { + background: #d0d0d0 !important; + border: 2px solid #fff !important; + border-bottom: 2px solid #404040 !important; + border-right: 2px solid #404040 !important; +} + +::-webkit-scrollbar { + width: 16px !important; + background: #c0c0c0 !important; +} +::-webkit-scrollbar-thumb { + background: #404040 !important; + border: 2px solid #fff !important; + border-bottom: 2px solid #404040 !important; + border-right: 2px solid #404040 !important; +} + +a { + color: #0000aa !important; + text-decoration: underline !important; +} + +hr { + border: none !important; + border-top: 2px solid #404040 !important; + margin: 8px 0 !important; +} diff --git a/web/app/public/themes/arcadeflash.css b/web/app/public/themes/arcadeflash.css new file mode 100644 index 000000000..5c79b0a2a --- /dev/null +++ b/web/app/public/themes/arcadeflash.css @@ -0,0 +1,28 @@ +:root { + /* ArcadeFlash Theme */ + --background: 0 0% 5%; + --foreground: 0 0% 98%; + --card: 0 0% 8%; + --card-foreground: 0 0% 98%; + --popover: 0 0% 5%; + --popover-foreground: 0 0% 98%; + --primary: 120 100% 50%; + --primary-foreground: 0 0% 5%; + --secondary: 0 0% 15%; + --secondary-foreground: 0 0% 98%; + --muted: 0 0% 10%; + --muted-foreground: 0 0% 60%; + --accent: 240 100% 50%; + --accent-foreground: 0 0% 98%; + --destructive: 0 100% 50%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 15%; + --input: 0 0% 15%; + --ring: 120 100% 50%; + --radius: 0.5rem; + --chart-1: 120 100% 50%; + --chart-2: 240 100% 50%; + --chart-3: 60 100% 50%; + --chart-4: 0 100% 50%; + --chart-5: 300 100% 50%; +} diff --git a/web/app/public/themes/cyberpunk.css b/web/app/public/themes/cyberpunk.css new file mode 100644 index 000000000..3c7a959f4 --- /dev/null +++ b/web/app/public/themes/cyberpunk.css @@ -0,0 +1,28 @@ +:root { + /* CyberPunk Theme */ + --background: 240 30% 5%; + --foreground: 60 100% 80%; + --card: 240 30% 8%; + --card-foreground: 60 100% 80%; + --popover: 240 30% 5%; + --popover-foreground: 60 100% 80%; + --primary: 330 100% 60%; + --primary-foreground: 240 30% 5%; + --secondary: 240 30% 15%; + --secondary-foreground: 60 100% 80%; + --muted: 240 30% 10%; + --muted-foreground: 60 100% 60%; + --accent: 180 100% 60%; + --accent-foreground: 240 30% 5%; + --destructive: 0 85% 60%; + --destructive-foreground: 0 0% 98%; + --border: 240 30% 15%; + --input: 240 30% 15%; + --ring: 330 100% 60%; + --radius: 0.5rem; + --chart-1: 330 100% 60%; + --chart-2: 180 100% 60%; + --chart-3: 60 100% 60%; + --chart-4: 0 100% 60%; + --chart-5: 270 100% 60%; +} diff --git a/web/app/public/themes/discofever.css b/web/app/public/themes/discofever.css new file mode 100644 index 000000000..d5e06d9bd --- /dev/null +++ b/web/app/public/themes/discofever.css @@ -0,0 +1,28 @@ +:root { + /* DiscoFever Theme */ + --background: 270 20% 10%; + --foreground: 0 0% 98%; + --card: 270 20% 15%; + --card-foreground: 0 0% 98%; + --popover: 270 20% 10%; + --popover-foreground: 0 0% 98%; + --primary: 330 100% 60%; + --primary-foreground: 0 0% 98%; + --secondary: 270 20% 20%; + --secondary-foreground: 0 0% 98%; + --muted: 270 20% 25%; + --muted-foreground: 270 10% 60%; + --accent: 60 100% 60%; + --accent-foreground: 270 20% 10%; + --destructive: 0 85% 60%; + --destructive-foreground: 0 0% 98%; + --border: 270 20% 20%; + --input: 270 20% 20%; + --ring: 330 100% 60%; + --radius: 0.5rem; + --chart-1: 330 100% 60%; + --chart-2: 60 100% 60%; + --chart-3: 120 100% 60%; + --chart-4: 240 100% 60%; + --chart-5: 0 100% 60%; +} diff --git a/web/app/public/themes/grungeera.css b/web/app/public/themes/grungeera.css new file mode 100644 index 000000000..140e7d5c6 --- /dev/null +++ b/web/app/public/themes/grungeera.css @@ -0,0 +1,28 @@ +:root { + /* GrungeEra Theme */ + --background: 30 10% 10%; + --foreground: 30 30% 80%; + --card: 30 10% 15%; + --card-foreground: 30 30% 80%; + --popover: 30 10% 10%; + --popover-foreground: 30 30% 80%; + --primary: 10 70% 50%; + --primary-foreground: 30 30% 80%; + --secondary: 30 10% 20%; + --secondary-foreground: 30 30% 80%; + --muted: 30 10% 25%; + --muted-foreground: 30 30% 60%; + --accent: 200 70% 50%; + --accent-foreground: 30 30% 80%; + --destructive: 0 85% 60%; + --destructive-foreground: 0 0% 98%; + --border: 30 10% 20%; + --input: 30 10% 20%; + --ring: 10 70% 50%; + --radius: 0.5rem; + --chart-1: 10 70% 50%; + --chart-2: 200 70% 50%; + --chart-3: 90 70% 50%; + --chart-4: 300 70% 50%; + --chart-5: 30 70% 50%; +} diff --git a/web/app/public/themes/jazzage.css b/web/app/public/themes/jazzage.css new file mode 100644 index 000000000..fe6857ba1 --- /dev/null +++ b/web/app/public/themes/jazzage.css @@ -0,0 +1,28 @@ +:root { + /* JazzAge Theme */ + --background: 30 20% 10%; + --foreground: 40 30% 85%; + --card: 30 20% 15%; + --card-foreground: 40 30% 85%; + --popover: 30 20% 10%; + --popover-foreground: 40 30% 85%; + --primary: 20 80% 50%; + --primary-foreground: 40 30% 85%; + --secondary: 30 20% 20%; + --secondary-foreground: 40 30% 85%; + --muted: 30 20% 25%; + --muted-foreground: 40 30% 60%; + --accent: 200 80% 50%; + --accent-foreground: 40 30% 85%; + --destructive: 0 85% 60%; + --destructive-foreground: 0 0% 98%; + --border: 30 20% 20%; + --input: 30 20% 20%; + --ring: 20 80% 50%; + --radius: 0.5rem; + --chart-1: 20 80% 50%; + --chart-2: 200 80% 50%; + --chart-3: 350 80% 50%; + --chart-4: 140 80% 50%; + --chart-5: 260 80% 50%; +} diff --git a/web/app/public/themes/mellowgold.css b/web/app/public/themes/mellowgold.css new file mode 100644 index 000000000..25346354b --- /dev/null +++ b/web/app/public/themes/mellowgold.css @@ -0,0 +1,28 @@ +:root { + /* MellowGold Theme */ + --background: 45 30% 90%; + --foreground: 30 20% 20%; + --card: 45 30% 85%; + --card-foreground: 30 20% 20%; + --popover: 45 30% 90%; + --popover-foreground: 30 20% 20%; + --primary: 35 80% 50%; + --primary-foreground: 45 30% 90%; + --secondary: 45 30% 80%; + --secondary-foreground: 30 20% 20%; + --muted: 45 30% 75%; + --muted-foreground: 30 20% 40%; + --accent: 25 80% 50%; + --accent-foreground: 45 30% 90%; + --destructive: 0 85% 60%; + --destructive-foreground: 0 0% 98%; + --border: 45 30% 80%; + --input: 45 30% 80%; + --ring: 35 80% 50%; + --radius: 0.5rem; + --chart-1: 35 80% 50%; + --chart-2: 25 80% 50%; + --chart-3: 15 80% 50%; + --chart-4: 5 80% 50%; + --chart-5: 55 80% 50%; +} diff --git a/web/app/public/themes/midcenturymod.css b/web/app/public/themes/midcenturymod.css new file mode 100644 index 000000000..a56dcd4a7 --- /dev/null +++ b/web/app/public/themes/midcenturymod.css @@ -0,0 +1,28 @@ +:root { + /* MidCenturyMod Theme */ + --background: 40 30% 95%; + --foreground: 30 20% 20%; + --card: 40 30% 90%; + --card-foreground: 30 20% 20%; + --popover: 40 30% 95%; + --popover-foreground: 30 20% 20%; + --primary: 180 60% 40%; + --primary-foreground: 40 30% 95%; + --secondary: 40 30% 85%; + --secondary-foreground: 30 20% 20%; + --muted: 40 30% 80%; + --muted-foreground: 30 20% 40%; + --accent: 350 60% 40%; + --accent-foreground: 40 30% 95%; + --destructive: 0 85% 60%; + --destructive-foreground: 0 0% 98%; + --border: 40 30% 85%; + --input: 40 30% 85%; + --ring: 180 60% 40%; + --radius: 0.5rem; + --chart-1: 180 60% 40%; + --chart-2: 350 60% 40%; + --chart-3: 40 60% 40%; + --chart-4: 220 60% 40%; + --chart-5: 300 60% 40%; +} diff --git a/web/app/public/themes/orange.css b/web/app/public/themes/orange.css new file mode 100644 index 000000000..d7fc3030d --- /dev/null +++ b/web/app/public/themes/orange.css @@ -0,0 +1,27 @@ +:root { + --background: 0 0% 100%; /* White */ + --foreground: 0 0% 13%; /* #212121 - near black */ + --card: 0 0% 98%; /* #faf9f8 - light gray */ + --card-foreground: 0 0% 13%; /* #212121 */ + --popover: 0 0% 100%; /* White */ + --popover-foreground: 0 0% 13%; /* #212121 */ + --primary: 24 90% 54%; /* #d83b01 - Office orange */ + --primary-foreground: 0 0% 100%; /* White */ + --secondary: 210 36% 96%; /* #f3f2f1 - light blue-gray */ + --secondary-foreground: 0 0% 13%; /* #212121 */ + --muted: 0 0% 90%; /* #e1dfdd - muted gray */ + --muted-foreground: 0 0% 40%; /* #666666 */ + --accent: 207 90% 54%; /* #0078d4 - Office blue */ + --accent-foreground: 0 0% 100%; /* White */ + --destructive: 0 85% 60%; /* #e81123 - Office red */ + --destructive-foreground: 0 0% 100%; /* White */ + --border: 0 0% 85%; /* #d2d0ce - light border */ + --input: 0 0% 100%; /* White */ + --ring: 207 90% 54%; /* #0078d4 */ + --radius: 0.25rem; /* Slightly less rounded */ + --chart-1: 24 90% 54%; /* Office orange */ + --chart-2: 207 90% 54%; /* Office blue */ + --chart-3: 120 60% 40%; /* Office green */ + --chart-4: 340 82% 52%; /* Office magenta */ + --chart-5: 44 100% 50%; /* Office yellow */ +} diff --git a/web/app/public/themes/polaroidmemories.css b/web/app/public/themes/polaroidmemories.css new file mode 100644 index 000000000..88cbe311e --- /dev/null +++ b/web/app/public/themes/polaroidmemories.css @@ -0,0 +1,28 @@ +:root { + /* PolaroidMemories Theme */ + --background: 50 30% 95%; + --foreground: 30 20% 20%; + --card: 50 30% 90%; + --card-foreground: 30 20% 20%; + --popover: 50 30% 95%; + --popover-foreground: 30 20% 20%; + --primary: 200 80% 50%; + --primary-foreground: 50 30% 95%; + --secondary: 50 30% 85%; + --secondary-foreground: 30 20% 20%; + --muted: 50 30% 80%; + --muted-foreground: 30 20% 40%; + --accent: 350 80% 50%; + --accent-foreground: 50 30% 95%; + --destructive: 0 85% 60%; + --destructive-foreground: 0 0% 98%; + --border: 50 30% 85%; + --input: 50 30% 85%; + --ring: 200 80% 50%; + --radius: 0.5rem; + --chart-1: 200 80% 50%; + --chart-2: 350 80% 50%; + --chart-3: 50 80% 50%; + --chart-4: 140 80% 50%; + --chart-5: 260 80% 50%; +} diff --git a/web/app/public/themes/retrowave.css b/web/app/public/themes/retrowave.css new file mode 100644 index 000000000..529746bdd --- /dev/null +++ b/web/app/public/themes/retrowave.css @@ -0,0 +1,28 @@ +:root { + /* RetroWave Theme */ + --background: 240 21% 15%; + --foreground: 0 0% 98%; + --card: 240 21% 18%; + --card-foreground: 0 0% 98%; + --popover: 240 21% 15%; + --popover-foreground: 0 0% 98%; + --primary: 334 89% 62%; + --primary-foreground: 0 0% 100%; + --secondary: 240 21% 25%; + --secondary-foreground: 0 0% 98%; + --muted: 240 21% 20%; + --muted-foreground: 240 5% 65%; + --accent: 41 99% 60%; + --accent-foreground: 240 21% 15%; + --destructive: 0 85% 60%; + --destructive-foreground: 0 0% 98%; + --border: 240 21% 25%; + --input: 240 21% 25%; + --ring: 334 89% 62%; + --radius: 0.5rem; + --chart-1: 334 89% 62%; + --chart-2: 41 99% 60%; + --chart-3: 190 90% 50%; + --chart-4: 280 89% 65%; + --chart-5: 80 75% 55%; +} diff --git a/web/app/public/themes/saturdaycartoons.css b/web/app/public/themes/saturdaycartoons.css new file mode 100644 index 000000000..054f1f545 --- /dev/null +++ b/web/app/public/themes/saturdaycartoons.css @@ -0,0 +1,28 @@ +:root { + /* SaturdayCartoons Theme */ + --background: 220 50% 95%; + --foreground: 220 50% 20%; + --card: 220 50% 90%; + --card-foreground: 220 50% 20%; + --popover: 220 50% 95%; + --popover-foreground: 220 50% 20%; + --primary: 30 100% 55%; + --primary-foreground: 220 50% 95%; + --secondary: 220 50% 85%; + --secondary-foreground: 220 50% 20%; + --muted: 220 50% 80%; + --muted-foreground: 220 50% 40%; + --accent: 120 100% 55%; + --accent-foreground: 220 50% 95%; + --destructive: 0 85% 60%; + --destructive-foreground: 0 0% 98%; + --border: 220 50% 85%; + --input: 220 50% 85%; + --ring: 30 100% 55%; + --radius: 0.5rem; + --chart-1: 30 100% 55%; + --chart-2: 120 100% 55%; + --chart-3: 240 100% 55%; + --chart-4: 330 100% 55%; + --chart-5: 60 100% 55%; +} diff --git a/web/app/public/themes/seasidepostcard.css b/web/app/public/themes/seasidepostcard.css new file mode 100644 index 000000000..208415ba4 --- /dev/null +++ b/web/app/public/themes/seasidepostcard.css @@ -0,0 +1,28 @@ +:root { + /* SeasidePostcard Theme */ + --background: 200 50% 95%; + --foreground: 200 50% 20%; + --card: 200 50% 90%; + --card-foreground: 200 50% 20%; + --popover: 200 50% 95%; + --popover-foreground: 200 50% 20%; + --primary: 30 100% 55%; + --primary-foreground: 200 50% 95%; + --secondary: 200 50% 85%; + --secondary-foreground: 200 50% 20%; + --muted: 200 50% 80%; + --muted-foreground: 200 50% 40%; + --accent: 350 100% 55%; + --accent-foreground: 200 50% 95%; + --destructive: 0 85% 60%; + --destructive-foreground: 0 0% 98%; + --border: 200 50% 85%; + --input: 200 50% 85%; + --ring: 30 100% 55%; + --radius: 0.5rem; + --chart-1: 30 100% 55%; + --chart-2: 350 100% 55%; + --chart-3: 200 100% 55%; + --chart-4: 140 100% 55%; + --chart-5: 260 100% 55%; +} diff --git a/web/app/public/themes/typewriter.css b/web/app/public/themes/typewriter.css new file mode 100644 index 000000000..9efbc47bb --- /dev/null +++ b/web/app/public/themes/typewriter.css @@ -0,0 +1,28 @@ +:root { + /* Typewriter Theme */ + --background: 0 0% 95%; + --foreground: 0 0% 10%; + --card: 0 0% 90%; + --card-foreground: 0 0% 10%; + --popover: 0 0% 95%; + --popover-foreground: 0 0% 10%; + --primary: 0 0% 20%; + --primary-foreground: 0 0% 95%; + --secondary: 0 0% 85%; + --secondary-foreground: 0 0% 10%; + --muted: 0 0% 80%; + --muted-foreground: 0 0% 40%; + --accent: 0 0% 70%; + --accent-foreground: 0 0% 10%; + --destructive: 0 85% 60%; + --destructive-foreground: 0 0% 98%; + --border: 0 0% 85%; + --input: 0 0% 85%; + --ring: 0 0% 20%; + --radius: 0.5rem; + --chart-1: 0 0% 20%; + --chart-2: 0 0% 40%; + --chart-3: 0 0% 60%; + --chart-4: 0 0% 30%; + --chart-5: 0 0% 50%; +} diff --git a/web/app/public/themes/vapordream.css b/web/app/public/themes/vapordream.css new file mode 100644 index 000000000..07fdb79db --- /dev/null +++ b/web/app/public/themes/vapordream.css @@ -0,0 +1,28 @@ +:root { + /* VaporDream Theme */ + --background: 260 20% 10%; + --foreground: 0 0% 98%; + --card: 260 20% 13%; + --card-foreground: 0 0% 98%; + --popover: 260 20% 10%; + --popover-foreground: 0 0% 98%; + --primary: 300 100% 70%; + --primary-foreground: 260 20% 10%; + --secondary: 260 20% 20%; + --secondary-foreground: 0 0% 98%; + --muted: 260 20% 15%; + --muted-foreground: 260 10% 60%; + --accent: 200 100% 70%; + --accent-foreground: 260 20% 10%; + --destructive: 0 85% 60%; + --destructive-foreground: 0 0% 98%; + --border: 260 20% 20%; + --input: 260 20% 20%; + --ring: 300 100% 70%; + --radius: 0.5rem; + --chart-1: 300 100% 70%; + --chart-2: 200 100% 70%; + --chart-3: 50 100% 60%; + --chart-4: 330 100% 70%; + --chart-5: 150 100% 60%; +} diff --git a/web/app/public/themes/xeroxui.css b/web/app/public/themes/xeroxui.css new file mode 100644 index 000000000..ef174c2d1 --- /dev/null +++ b/web/app/public/themes/xeroxui.css @@ -0,0 +1,71 @@ +:root { + /* Windows 3.1 White & Blue Theme */ + --background: 0 0% 100%; /* Pure white */ + --foreground: 0 0% 0%; /* Black text */ + --card: 0 0% 98%; /* Slightly off-white for cards */ + --card-foreground: 0 0% 0%; /* Black text */ + --popover: 0 0% 100%; /* White */ + --popover-foreground: 0 0% 0%; /* Black */ + --primary: 240 100% 27%; /* Windows blue */ + --primary-foreground: 0 0% 100%; /* White text on blue */ + --secondary: 0 0% 90%; /* Light gray for secondary */ + --secondary-foreground: 0 0% 0%; /* Black text */ + --muted: 0 0% 85%; /* Muted gray */ + --muted-foreground: 240 10% 40%; /* Muted blue-gray */ + --accent: 60 100% 50%; /* Classic yellow accent */ + --accent-foreground: 240 100% 27%; /* Blue */ + --destructive: 0 100% 50%; /* Red for destructive */ + --destructive-foreground: 0 0% 100%; /* White */ + --border: 240 100% 27%; /* Blue borders */ + --input: 0 0% 100%; /* White input */ + --ring: 240 100% 27%; /* Blue ring/focus */ + --radius: 0.125rem; /* Small radius, almost square */ + --chart-1: 240 100% 27%; /* Blue */ + --chart-2: 0 0% 60%; /* Gray */ + --chart-3: 60 100% 50%; /* Yellow */ + --chart-4: 0 100% 50%; /* Red */ + --chart-5: 120 100% 25%; /* Green */ + --border-light: 0 0% 100%; /* White for top/left border */ + --border-dark: 240 100% 20%; /* Dark blue for bottom/right border */ +} + +/* Windows 3.11 style border */ +.win311-border { + border-top: 2px solid hsl(var(--border-light)); + border-left: 2px solid hsl(var(--border-light)); + border-bottom: 2px solid hsl(var(--border-dark)); + border-right: 2px solid hsl(var(--border-dark)); + background: hsl(var(--background)); +} + +/* Titles */ +.win311-title { + color: hsl(var(--primary)); + border-bottom: 2px solid hsl(var(--primary)); + font-weight: bold; + padding: 0.25em 0.5em; + background: hsl(var(--background)); +} + +/* General text */ +body, .filemanager, .filemanager * { + color: hsl(var(--foreground)); + background: hsl(var(--background)); +} + +button, .win311-button { + font-family: inherit; + font-size: 1em; + padding: 0.25em 1.5em; + background: #c0c0c0; /* classic light gray */ + color: #000; + border-top: 2px solid #fff; /* light bevel */ + border-left: 2px solid #fff; /* light bevel */ + border-bottom: 2px solid #808080;/* dark bevel */ + border-right: 2px solid #808080; /* dark bevel */ + border-radius: 0; + box-shadow: inset 1px 1px 0 #fff, inset -1px -1px 0 #808080 !important; + outline: none !important; + cursor: pointer !important; + transition: none !important; +} diff --git a/web/app/public/themes/xtreegold.css b/web/app/public/themes/xtreegold.css new file mode 100644 index 000000000..aa3d88914 --- /dev/null +++ b/web/app/public/themes/xtreegold.css @@ -0,0 +1,228 @@ +:root { + /* XTree Gold DOS File Manager Theme - Authentic 1980s Interface */ + + /* Core XTree Gold Palette - Exact Match */ + --background: 240 100% 16%; /* Classic XTree blue background */ + --foreground: 60 100% 88%; /* Bright yellow text */ + + /* Card Elements - File Panels */ + --card: 240 100% 16%; /* Same blue as main background */ + --card-foreground: 60 100% 88%; /* Bright yellow panel text */ + + /* Popover Elements - Context Menus */ + --popover: 240 100% 12%; /* Slightly darker blue for menus */ + --popover-foreground: 60 100% 90%; /* Bright yellow menu text */ + + /* Primary - XTree Gold Highlight (Cyan Selection) */ + --primary: 180 100% 70%; /* Bright cyan for selections */ + --primary-foreground: 240 100% 10%; /* Dark blue text on cyan */ + + /* Secondary - Directory Highlights */ + --secondary: 180 100% 50%; /* Pure cyan for directories */ + --secondary-foreground: 240 100% 10%; /* Dark blue on cyan */ + + /* Muted - Status Areas */ + --muted: 240 100% 14%; /* Slightly darker blue */ + --muted-foreground: 60 80% 75%; /* Dimmed yellow */ + + /* Accent - Function Keys & Highlights */ + --accent: 60 100% 50%; /* Pure yellow for F-keys */ + --accent-foreground: 240 100% 10%; /* Dark blue on yellow */ + + /* Destructive - Delete/Error */ + --destructive: 0 100% 60%; /* Bright red for warnings */ + --destructive-foreground: 60 90% 95%; /* Light yellow on red */ + + /* Interactive Elements */ + --border: 60 100% 70%; /* Yellow border lines */ + --input: 240 100% 14%; /* Dark blue input fields */ + --ring: 180 100% 70%; /* Cyan focus ring */ + + /* Border Radius - Sharp DOS aesthetic */ + --radius: 0rem; /* No rounding - pure DOS */ + + /* Chart Colors - Authentic DOS 16-color palette */ + --chart-1: 180 100% 70%; /* Bright cyan */ + --chart-2: 60 100% 50%; /* Yellow */ + --chart-3: 120 100% 50%; /* Green */ + --chart-4: 300 100% 50%; /* Magenta */ + --chart-5: 0 100% 60%; /* Red */ + + /* Authentic XTree Gold Colors */ + --xtree-blue: 240 100% 16%; /* Main background blue */ + --xtree-yellow: 60 100% 88%; /* Text yellow */ + --xtree-cyan: 180 100% 70%; /* Selection cyan */ + --xtree-white: 0 0% 100%; /* Pure white */ + --xtree-green: 120 100% 50%; /* DOS green */ + --xtree-magenta: 300 100% 50%; /* DOS magenta */ + --xtree-red: 0 100% 60%; /* DOS red */ + + /* File Type Colors - Authentic XTree */ + --executable-color: 0 0% 100%; /* White for executables */ + --directory-color: 180 100% 70%; /* Cyan for directories */ + --archive-color: 300 100% 50%; /* Magenta for archives */ + --text-color: 60 100% 88%; /* Yellow for text */ + --system-color: 0 100% 60%; /* Red for system files */ + + /* Menu Bar Colors */ + --menu-bar: 240 100% 8%; /* Dark blue menu bar */ + --menu-text: 60 100% 88%; /* Yellow menu text */ + --menu-highlight: 180 100% 50%; /* Cyan menu highlight */ +} + +/* Authentic XTree Gold Enhancement Classes */ +.xtree-main-panel { + background: hsl(var(--xtree-blue)); + color: hsl(var(--xtree-yellow)); + font-family: 'Perfect DOS VGA 437', 'Courier New', monospace; + font-size: 16px; + line-height: 1; + border: none; +} + +.xtree-menu-bar { + background: hsl(var(--menu-bar)); + color: hsl(var(--menu-text)); + padding: 0; + height: 20px; + display: flex; + align-items: center; + font-weight: normal; +} + +.xtree-menu-item { + padding: 0 8px; + color: hsl(var(--xtree-yellow)); + background: transparent; +} + +.xtree-menu-item:hover, +.xtree-menu-item.active { + background: hsl(var(--xtree-cyan)); + color: hsl(240 100% 10%); +} + +.xtree-dual-pane { + display: flex; + height: calc(100vh - 60px); +} + +.xtree-left-pane, +.xtree-right-pane { + flex: 1; + background: hsl(var(--xtree-blue)); + color: hsl(var(--xtree-yellow)); + padding: 0; + margin: 0; +} + +.xtree-directory-tree { + color: hsl(var(--directory-color)); + background: hsl(var(--xtree-blue)); + padding: 4px; +} + +.xtree-file-list { + background: hsl(var(--xtree-blue)); + color: hsl(var(--xtree-yellow)); + font-family: 'Perfect DOS VGA 437', 'Courier New', monospace; + font-size: 16px; + line-height: 20px; + padding: 4px; +} + +.xtree-file-selected { + background: hsl(var(--xtree-cyan)); + color: hsl(240 100% 10%); +} + +.xtree-directory { + color: hsl(var(--directory-color)); +} + +.xtree-executable { + color: hsl(var(--executable-color)); +} + +.xtree-archive { + color: hsl(var(--archive-color)); +} + +.xtree-text-file { + color: hsl(var(--text-color)); +} + +.xtree-system-file { + color: hsl(var(--system-color)); +} + +.xtree-status-line { + background: hsl(var(--xtree-blue)); + color: hsl(var(--xtree-yellow)); + height: 20px; + padding: 0 8px; + display: flex; + align-items: center; + font-size: 16px; +} + +.xtree-function-bar { + background: hsl(var(--menu-bar)); + color: hsl(var(--xtree-yellow)); + height: 20px; + display: flex; + padding: 0; + font-size: 14px; +} + +.xtree-function-key { + padding: 0 4px; + color: hsl(var(--xtree-yellow)); + border-right: 1px solid hsl(var(--xtree-yellow)); +} + +.xtree-function-key:last-child { + border-right: none; +} + +.xtree-path-bar { + background: hsl(var(--xtree-blue)); + color: hsl(var(--xtree-yellow)); + padding: 2px 8px; + border-bottom: 1px solid hsl(var(--xtree-yellow)); +} + +.xtree-disk-info { + background: hsl(var(--xtree-blue)); + color: hsl(var(--xtree-yellow)); + padding: 4px 8px; + text-align: right; + font-size: 14px; +} + +/* Authentic DOS Box Drawing Characters */ +.xtree-box-char { + font-family: 'Perfect DOS VGA 437', 'Courier New', monospace; + line-height: 1; + letter-spacing: 0; +} + +/* Classic Text Mode Cursor */ +.xtree-cursor { + background: hsl(var(--xtree-yellow)); + color: hsl(var(--xtree-blue)); + animation: blink 1s infinite; +} + +@keyframes blink { + 0%, 50% { opacity: 1; } + 51%, 100% { opacity: 0; } +} + +/* Authentic DOS Window Styling */ +.xtree-window { + border: 2px outset hsl(var(--xtree-blue)); + background: hsl(var(--xtree-blue)); + box-shadow: none; + border-radius: 0; +} \ No newline at end of file diff --git a/web/app/public/themes/y2kglow.css b/web/app/public/themes/y2kglow.css new file mode 100644 index 000000000..64dcaf064 --- /dev/null +++ b/web/app/public/themes/y2kglow.css @@ -0,0 +1,28 @@ +:root { + /* Y2KGlow Theme */ + --background: 240 10% 10%; + --foreground: 0 0% 98%; + --card: 240 10% 13%; + --card-foreground: 0 0% 98%; + --popover: 240 10% 10%; + --popover-foreground: 0 0% 98%; + --primary: 190 90% 50%; + --primary-foreground: 240 10% 10%; + --secondary: 240 10% 20%; + --secondary-foreground: 0 0% 98%; + --muted: 240 10% 15%; + --muted-foreground: 240 5% 60%; + --accent: 280 89% 65%; + --accent-foreground: 240 10% 10%; + --destructive: 0 85% 60%; + --destructive-foreground: 0 0% 98%; + --border: 240 10% 20%; + --input: 240 10% 20%; + --ring: 190 90% 50%; + --radius: 0.5rem; + --chart-1: 190 90% 50%; + --chart-2: 280 89% 65%; + --chart-3: 80 75% 55%; + --chart-4: 334 89% 62%; + --chart-5: 41 99% 60%; +} diff --git a/web/app/settings/README.md b/web/app/settings/README.md new file mode 100644 index 000000000..43749eda4 --- /dev/null +++ b/web/app/settings/README.md @@ -0,0 +1,14 @@ + https://whoapi.com/domain-availability-api-pricing/ + + + - **Ports Used**: + Main website: (https://www.pragmatismo.com.br). + Webmail (Stalwart): (https://mail.pragmatismo.com.br). + Database (PostgreSQL): . + SSO (Zitadel): (https://sso.pragmatismo.com.br). + Storage (MinIO): (https://drive.pragmatismo.com.br). + ALM (Forgejo): (https://alm.pragmatismo.com.br). + BotServer : (https://gb.pragmatismo.com.br). + Meeting: (https://call.pragmatismo.com.br). + IMAP: 993. + SMTP: 465. diff --git a/web/app/settings/account/account-form.html b/web/app/settings/account/account-form.html new file mode 100644 index 000000000..72ca58e23 --- /dev/null +++ b/web/app/settings/account/account-form.html @@ -0,0 +1,30 @@ + +