diff --git a/Cargo.lock b/Cargo.lock index 3a7a77ee..48ad44b7 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -8,7 +8,7 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5f7b0a21988c1bf877cf4759ef5ddaac04c1c9fe808c9142ecb78ba97d97a28a" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "bytes", "futures-core", "futures-sink", @@ -21,17 +21,17 @@ dependencies = [ [[package]] name = "actix-files" -version = "0.6.6" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0773d59061dedb49a8aed04c67291b9d8cf2fe0b60130a381aab53c6dd86e9be" +checksum = "6c0d87f10d70e2948ad40e8edea79c8e77c6c66e0250a4c1f09b690465199576" dependencies = [ "actix-http", "actix-service", "actix-utils", "actix-web", - "bitflags 2.9.1", + "bitflags 2.9.4", "bytes", - "derive_more 0.99.20", + "derive_more 2.0.1", "futures-core", "http-range", "log", @@ -44,9 +44,9 @@ dependencies = [ [[package]] name = "actix-http" -version = "3.11.0" +version = "3.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "44dfe5c9e0004c623edc65391dfd51daa201e7e30ebd9c9bedf873048ec32bc2" +checksum = "7926860314cbe2fb5d1f13731e387ab43bd32bca224e82e6e2db85de0a3dba49" dependencies = [ "actix-codec", "actix-rt", @@ -54,7 +54,7 @@ dependencies = [ "actix-tls", "actix-utils", "base64 0.22.1", - "bitflags 2.9.1", + "bitflags 2.9.4", "brotli", "bytes", "bytestring", @@ -89,7 +89,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb" dependencies = [ "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -109,9 +109,9 @@ dependencies = [ [[package]] name = "actix-rt" -version = "2.10.0" +version = "2.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "24eda4e2a6e042aa4e55ac438a2ae052d3b5da0ecf83d7411e1a368946925208" +checksum = "92589714878ca59a7626ea19734f0e07a6a875197eec751bb5d3f99e64998c63" dependencies = [ "futures-core", "tokio", @@ -158,7 +158,7 @@ dependencies = [ "pin-project-lite", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tokio-util", "tracing", ] @@ -226,7 +226,7 @@ dependencies = [ "actix-router", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -260,9 +260,9 @@ dependencies = [ [[package]] name = "addr2line" -version = "0.24.2" +version = "0.25.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dfbe277e56a376000877090da837660b4427aad530e3028d44e0bffe4f89a1c1" +checksum = "1b5d307320b3181d6d7954e663bd7c774a838b8220fe0593c86d9fb09f498b4b" dependencies = [ "gimli", ] @@ -316,12 +316,6 @@ version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" -[[package]] -name = "android-tzdata" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" - [[package]] name = "android_system_properties" version = "0.1.5" @@ -374,18 +368,18 @@ checksum = "c7c24de15d275a1ecfd47a380fb4d5ec9bfe0933f309ed5e705b775596a3574d" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "async-trait" -version = "0.1.88" +version = "0.1.89" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e539d3fca749fcee5236ab05e93a52867dd549cc157c8cb7f99595f3cedffdb5" +checksum = "9035ad2d096bed7955a320ee7e2230574d28fd3c3a0f186cbea1ff3c7eed5dbb" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -402,9 +396,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8" [[package]] name = "aws-lc-rs" -version = "1.13.3" +version = "1.14.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c953fe1ba023e6b7730c0d4b031d06f267f23a46167dcbd40316644b10a17ba" +checksum = "879b6c89592deb404ba4dc0ae6b58ffd1795c78991cbb5b8bc441c48a070440d" dependencies = [ "aws-lc-sys", "zeroize", @@ -412,15 +406,16 @@ dependencies = [ [[package]] name = "aws-lc-sys" -version = "0.30.0" +version = "0.32.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dbfd150b5dbdb988bcc8fb1fe787eb6b7ee6180ca24da683b61ea5405f3d43ff" +checksum = "a2b715a6010afb9e457ca2b7c9d2b9c344baa8baed7b38dc476034c171b32575" dependencies = [ "bindgen", "cc", "cmake", "dunce", "fs_extra", + "libloading", ] [[package]] @@ -436,9 +431,9 @@ dependencies = [ [[package]] name = "backtrace" -version = "0.3.75" +version = "0.3.76" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6806a6321ec58106fea15becdad98371e28d92ccbc7c8f1b3b6dd724fe8f1002" +checksum = "bb531853791a215d7c62a30daf0dde835f381ab5de4589cfe7c649d2cbe92bd6" dependencies = [ "addr2line", "cfg-if", @@ -446,7 +441,7 @@ dependencies = [ "miniz_oxide", "object", "rustc-demangle", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -481,25 +476,22 @@ checksum = "55248b47b0caf0546f7988906588779981c43bb1bc9d0c44087278f80cdb44ba" [[package]] name = "bindgen" -version = "0.69.5" +version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271383c67ccabffb7381723dea0672a673f292304fcb45c01cc648c7a8d58088" +checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "cexpr", "clang-sys", - "itertools 0.12.1", - "lazy_static", - "lazycell", + "itertools 0.13.0", "log", "prettyplease", "proc-macro2", "quote", "regex", - "rustc-hash 1.1.0", + "rustc-hash", "shlex", - "syn 2.0.104", - "which", + "syn 2.0.106", ] [[package]] @@ -510,9 +502,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.9.1" +version = "2.9.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +checksum = "2261d10cca569e4643e526d8dc2e62e433cc8aba21ab764233731f8d369bf394" [[package]] name = "bitvec" @@ -548,9 +540,9 @@ dependencies = [ [[package]] name = "brotli" -version = "8.0.1" +version = "8.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9991eea70ea4f293524138648e41ee89b0b2b12ddef3b255effa43c8056e0e0d" +checksum = "4bd8b9603c7aa97359dbd97ecf258968c95f3adddd6db2f7e7a5bef101c84560" dependencies = [ "alloc-no-stdlib", "alloc-stdlib", @@ -579,7 +571,7 @@ dependencies = [ "getrandom 0.2.16", "getrandom 0.3.3", "hex", - "indexmap 2.10.0", + "indexmap 2.11.4", "js-sys", "once_cell", "rand 0.9.2", @@ -620,19 +612,20 @@ checksum = "d71b6127be86fdcfddb610f7182ac57211d4b18a3e9c82eb2d17662f2227ad6a" [[package]] name = "bytestring" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e465647ae23b2823b0753f50decb2d5a86d2bb2cac04788fafd1f80e45378e5f" +checksum = "113b4343b5f6617e7ad401ced8de3cc8b012e73a594347c307b90db3e9271289" dependencies = [ "bytes", ] [[package]] name = "cc" -version = "1.2.31" +version = "1.2.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c3a42d84bb6b69d3a8b3eaacf0d88f179e1929695e1ad012b6cf64d9caaa5fd2" +checksum = "ac9fe6cdbb24b6ade63616c0a0688e45bb56732262c158df3c0c4bea4ca47cb7" dependencies = [ + "find-msvc-tools", "jobserver", "libc", "shlex", @@ -649,9 +642,9 @@ dependencies = [ [[package]] name = "cfg-if" -version = "1.0.1" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +checksum = "2fd1289c04a9ea8cb22300a459a72a385d7c73d3259e2ed7dcb2af674838cfa9" [[package]] name = "cfg_aliases" @@ -661,17 +654,25 @@ checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" [[package]] name = "chrono" -version = "0.4.41" +version = "0.4.42" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +checksum = "145052bdd345b87320e369255277e3fb5152762ad123a901ef5c262dd38fe8d2" dependencies = [ - "android-tzdata", "iana-time-zone", "js-sys", "num-traits", "serde", "wasm-bindgen", - "windows-link", + "windows-link 0.2.1", +] + +[[package]] +name = "chrono-humanize" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "799627e6b4d27827a814e837b9d8a504832086081806d45b1afa34dc982b023b" +dependencies = [ + "chrono", ] [[package]] @@ -915,7 +916,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -924,8 +925,18 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc7f46116c46ff9ab3eb1597a45688b6715c6e628b5c133e288e709a29bcb4ee" dependencies = [ - "darling_core", - "darling_macro", + "darling_core 0.20.11", + "darling_macro 0.20.11", +] + +[[package]] +name = "darling" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9cdf337090841a411e2a7f3deb9187445851f91b309c0c0a29e05f74a00a48c0" +dependencies = [ + "darling_core 0.21.3", + "darling_macro 0.21.3", ] [[package]] @@ -939,7 +950,21 @@ dependencies = [ "proc-macro2", "quote", "strsim", - "syn 2.0.104", + "syn 2.0.106", +] + +[[package]] +name = "darling_core" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1247195ecd7e3c85f83c8d2a366e4210d588e802133e1e355180a9870b517ea4" +dependencies = [ + "fnv", + "ident_case", + "proc-macro2", + "quote", + "strsim", + "syn 2.0.106", ] [[package]] @@ -948,9 +973,20 @@ version = "0.20.11" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fc34b93ccb385b40dc71c6fceac4b2ad23662c7eeb248cf10d529b7e055b6ead" dependencies = [ - "darling_core", + "darling_core 0.20.11", "quote", - "syn 2.0.104", + "syn 2.0.106", +] + +[[package]] +name = "darling_macro" +version = "0.21.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d38308df82d1080de0afee5d069fa14b0326a88c14f15c5ccda35b4a6c414c81" +dependencies = [ + "darling_core 0.21.3", + "quote", + "syn 2.0.106", ] [[package]] @@ -972,12 +1008,12 @@ dependencies = [ [[package]] name = "deranged" -version = "0.4.0" +version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c9e6a11ca8224451684bc0d7d5a7adbf8f2fd6887261a1cfc3c0432f9d4068e" +checksum = "a41953f86f8a05768a6cda24def994fd2f424b04ec5c719cf89989779f199071" dependencies = [ "powerfmt", - "serde", + "serde_core", ] [[package]] @@ -988,18 +1024,18 @@ checksum = "d65d7ce8132b7c0e54497a4d9a55a1c2a0912a0d786cf894472ba818fba45762" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "derive-where" -version = "1.5.0" +version = "1.6.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "510c292c8cf384b1a340b816a9a6cf2599eb8f566a44949024af88418000c50b" +checksum = "ef941ded77d15ca19b40374869ac6000af1c9f2a4c0f3d4c70926287e6364a8f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1012,7 +1048,7 @@ dependencies = [ "proc-macro2", "quote", "rustc_version", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1032,7 +1068,7 @@ checksum = "bda628edc44c4bb645fbe0f758797143e4e07926f7ebf4e9bdfbd3d2ce621df3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "unicode-xid", ] @@ -1062,7 +1098,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1124,7 +1160,7 @@ dependencies = [ "enum-ordinalize", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1175,7 +1211,7 @@ dependencies = [ "heck", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1195,7 +1231,7 @@ checksum = "0d28318a75d4aead5c4db25382e8ef717932d0346600cacae6357eb5941bc5ff" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1206,12 +1242,12 @@ checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "errno" -version = "0.3.13" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "778e2ac28f6c47af28e4907f13ffd1e1ddbd400980a9abd7c8df189bf578a5ad" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.60.2", + "windows-sys 0.61.2", ] [[package]] @@ -1257,11 +1293,17 @@ version = "0.2.9" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "28dea519a9695b9977216879a3ebfddf92f1c08c05d984f8996aecd6ecdc811d" +[[package]] +name = "find-msvc-tools" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52051878f80a721bb68ebfbc930e07b65ba72f2da88968ea5c06fd6ca3d3a127" + [[package]] name = "flate2" -version = "1.1.2" +version = "1.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a3d7db9596fecd151c5f638c0ee5d5bd487b6e0ea232e5dc96d5250f6f94b1d" +checksum = "dc5a4e564e38c699f2880d3fda590bedc2e69f3f84cd48b457bd892ce61d0aa9" dependencies = [ "crc32fast", "miniz_oxide", @@ -1296,9 +1338,9 @@ checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" [[package]] name = "form_urlencoded" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" dependencies = [ "percent-encoding", ] @@ -1371,7 +1413,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -1438,21 +1480,21 @@ dependencies = [ "js-sys", "libc", "r-efi", - "wasi 0.14.2+wasi-0.2.4", + "wasi 0.14.7+wasi-0.2.4", "wasm-bindgen", ] [[package]] name = "gimli" -version = "0.31.1" +version = "0.32.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "07e28edb80900c19c28f1072f2e8aeca7fa06b23cd4169cefe1af5aa3260783f" +checksum = "e629b9b98ef3dd8afe6ca2bd0f89306cec16d43d907889945bc5d6687f2f13c7" [[package]] name = "glob" -version = "0.3.2" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8d1add55171497b4705a648c6b583acafb01d58050a51727785f0b2c8e0a2b2" +checksum = "0cc23270f6e1808e30a928bdc84dea0b9b4136a8bc82338574f23baf47bbd280" [[package]] name = "globset" @@ -1473,7 +1515,7 @@ version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bf760ebf69878d9fd8f110c89703d90ce35095324d1f1edcb595c63945ee757" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "ignore", "walkdir", ] @@ -1513,7 +1555,7 @@ dependencies = [ "futures-sink", "futures-util", "http 0.2.12", - "indexmap 2.10.0", + "indexmap 2.11.4", "slab", "tokio", "tokio-util", @@ -1522,9 +1564,9 @@ dependencies = [ [[package]] name = "h2" -version = "0.4.11" +version = "0.4.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17da50a276f1e01e0ba6c029e47b7100754904ee8a278f886546e98575380785" +checksum = "f3c0b69cfcb4e1b9f1bf2f53f95f766e4661169728ec61cd3fe5a0166f2d1386" dependencies = [ "atomic-waker", "bytes", @@ -1532,7 +1574,7 @@ dependencies = [ "futures-core", "futures-sink", "http 1.3.1", - "indexmap 2.10.0", + "indexmap 2.11.4", "slab", "tokio", "tokio-util", @@ -1547,15 +1589,21 @@ checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888" [[package]] name = "hashbrown" -version = "0.15.4" +version = "0.15.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5971ac85611da7067dbfcabef3c70ebb5606018acd9e2a3903a0da507521e0d5" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" dependencies = [ "allocator-api2", "equivalent", "foldhash", ] +[[package]] +name = "hashbrown" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5419bdc4f6a9207fbeba6d11b604d481addf78ecd10c11ad51e76c2f6482748d" + [[package]] name = "headers" version = "0.4.1" @@ -1672,7 +1720,7 @@ checksum = "a56f203cd1c76362b69e3863fd987520ac36cf70a8c92627449b2f64a8cf7d65" dependencies = [ "cfg-if", "libc", - "windows-link", + "windows-link 0.1.3", ] [[package]] @@ -1749,19 +1797,21 @@ dependencies = [ [[package]] name = "hyper" -version = "1.6.0" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc2b571658e38e0c01b1fdca3bbbe93c00d3d71693ff2770043f8c29bc7d6f80" +checksum = "eb3aa54a13a0dfe7fbe3a59e0c76093041720fdc77b110cc0fc260fafb4dc51e" dependencies = [ + "atomic-waker", "bytes", "futures-channel", - "futures-util", - "h2 0.4.11", + "futures-core", + "h2 0.4.12", "http 1.3.1", "http-body", "httparse", "itoa", "pin-project-lite", + "pin-utils", "smallvec", "tokio", "want", @@ -1783,7 +1833,7 @@ dependencies = [ "pin-project-lite", "rustls-native-certs 0.7.3", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tower-service", ] @@ -1797,13 +1847,13 @@ dependencies = [ "hyper", "hyper-util", "log", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tower-service", - "webpki-roots 1.0.2", + "webpki-roots 1.0.3", ] [[package]] @@ -1837,9 +1887,9 @@ dependencies = [ [[package]] name = "hyper-util" -version = "0.1.16" +version = "0.1.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d9b05277c7e8da2c93a568989bb6207bef0112e8d17df7a6eda4a3cf143bc5e" +checksum = "3c6995591a8f1380fcb4ba966a252a4b29188d51d2b89e3a252f5305be65aea8" dependencies = [ "base64 0.22.1", "bytes", @@ -1863,9 +1913,9 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.63" +version = "0.1.64" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +checksum = "33e57f83510bb73707521ebaffa789ec8caf86f9657cad665b092b581d40e9fb" dependencies = [ "android_system_properties", "core-foundation-sys", @@ -1979,9 +2029,9 @@ checksum = "b9e0384b61958566e926dc50660321d12159025e767c18e043daf26b70104c39" [[package]] name = "idna" -version = "1.0.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" dependencies = [ "idna_adapter", "smallvec", @@ -2033,22 +2083,23 @@ dependencies = [ [[package]] name = "indexmap" -version = "2.10.0" +version = "2.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661" +checksum = "4b0f83760fb341a774ed326568e19f5a863af4a952def8c39f9ab92fd95b88e5" dependencies = [ "equivalent", - "hashbrown 0.15.4", + "hashbrown 0.16.0", "serde", + "serde_core", ] [[package]] name = "io-uring" -version = "0.7.9" +version = "0.7.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4" +checksum = "046fa2d4d00aea763528b4950358d0ead425372445dc8ff86312b3c69ff7727b" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "cfg-if", "libc", ] @@ -2092,9 +2143,9 @@ dependencies = [ [[package]] name = "itertools" -version = "0.12.1" +version = "0.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" dependencies = [ "either", ] @@ -2107,9 +2158,9 @@ checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" [[package]] name = "jobserver" -version = "0.1.33" +version = "0.1.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "38f262f097c174adebe41eb73d66ae9c06b2844fb0da69969647bbddd9b0538a" +checksum = "9afb3de4395d6b3e67a780b6de64b51c978ecf11cb9a462c66be7d4ca9039d33" dependencies = [ "getrandom 0.3.3", "libc", @@ -2117,9 +2168,9 @@ dependencies = [ [[package]] name = "js-sys" -version = "0.3.77" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +checksum = "ec48937a97411dcb524a265206ccd4c90bb711fca92b2792c407f268825b9305" dependencies = [ "once_cell", "wasm-bindgen", @@ -2127,9 +2178,9 @@ dependencies = [ [[package]] name = "json-patch" -version = "4.0.0" +version = "4.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "159294d661a039f7644cea7e4d844e6b25aaf71c1ffe9d73a96d768c24b0faf4" +checksum = "f300e415e2134745ef75f04562dd0145405c2f7fd92065db029ac4b16b57fe90" dependencies = [ "jsonptr", "serde", @@ -2147,7 +2198,7 @@ dependencies = [ "pest_derive", "regex", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -2256,12 +2307,12 @@ dependencies = [ "k8s-openapi", "kube-core", "pem 3.0.5", - "rustls 0.23.31", + "rustls 0.23.32", "secrecy", "serde", "serde_json", "serde_yaml", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-util", "tower", @@ -2285,7 +2336,7 @@ dependencies = [ "serde", "serde-value", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", ] [[package]] @@ -2294,12 +2345,12 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "079fc8c1c397538628309cfdee20696ebdcc26745f9fb17f89b78782205bd995" dependencies = [ - "darling", + "darling 0.20.11", "proc-macro2", "quote", "serde", "serde_json", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2314,7 +2365,7 @@ dependencies = [ "backon", "educe", "futures", - "hashbrown 0.15.4", + "hashbrown 0.15.5", "hostname", "json-patch", "k8s-openapi", @@ -2323,7 +2374,7 @@ dependencies = [ "pin-project", "serde", "serde_json", - "thiserror 2.0.12", + "thiserror 2.0.17", "tokio", "tokio-util", "tracing", @@ -2344,17 +2395,11 @@ dependencies = [ "spin 0.9.8", ] -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "libc" -version = "0.2.174" +version = "0.2.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1171693293099992e19cddea4e8b849964e9846f4acee11b3948bcc337be8776" +checksum = "2874a2af47a2325c2001a6e6fad9b16a53b802102b528163885171cf92b15976" [[package]] name = "libloading" @@ -2363,7 +2408,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "07033963ba89ebaf1584d767badaa2e8fcec21aedea6b8c0346d487d49c28667" dependencies = [ "cfg-if", - "windows-targets 0.53.3", + "windows-targets 0.53.5", ] [[package]] @@ -2374,9 +2419,9 @@ checksum = "f9fbbcab51052fe104eb5e5d351cf728d30a5be1fe14d9be8a3b097481fb97de" [[package]] name = "libmimalloc-sys" -version = "0.1.43" +version = "0.1.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bf88cd67e9de251c1781dbe2f641a1a3ad66eaae831b8a2c38fbdc5ddae16d4d" +checksum = "667f4fec20f29dfc6bc7357c582d91796c169ad7e2fce709468aefeb2c099870" dependencies = [ "cc", "libc", @@ -2390,15 +2435,9 @@ checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f" [[package]] name = "linux-raw-sys" -version = "0.4.15" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" - -[[package]] -name = "linux-raw-sys" -version = "0.9.4" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cd945864f07fe9f5371a27ad7b52a172b4b499999f1d97574c9fa68373937e12" +checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" [[package]] name = "litemap" @@ -2425,19 +2464,18 @@ checksum = "4d873d7c67ce09b42110d801813efbc9364414e356be9935700d368351657487" [[package]] name = "lock_api" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96936507f153605bddfcda068dd804796c84324ed2510809e5b2a624c81da765" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" dependencies = [ - "autocfg", "scopeguard", ] [[package]] name = "log" -version = "0.4.27" +version = "0.4.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" +checksum = "34080505efa8e45a4b816c349525ebe327ceaa8559756f0356cba97ef3bf7432" [[package]] name = "lru-cache" @@ -2463,7 +2501,7 @@ dependencies = [ "macro_magic_core", "macro_magic_macros", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2477,7 +2515,7 @@ dependencies = [ "macro_magic_core_macros", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2488,7 +2526,7 @@ checksum = "b02abfe41815b5bd98dbd4260173db2c116dda171dc0fe7838cb206333b83308" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2499,7 +2537,7 @@ checksum = "73ea28ee64b88876bf45277ed9a5817c1817df061a74f2b988971a12570e5869" dependencies = [ "macro_magic_core", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2514,15 +2552,15 @@ dependencies = [ [[package]] name = "memchr" -version = "2.7.5" +version = "2.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" +checksum = "f52b00d39961fc5b2736ea853c9cc86238e165017a493d1d5c8eac6bdc4cc273" [[package]] name = "mimalloc" -version = "0.1.47" +version = "0.1.48" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1791cbe101e95af5764f06f20f6760521f7158f69dbf9d6baf941ee1bf6bc40" +checksum = "e1ee66a4b64c74f4ef288bcbb9192ad9c3feaad75193129ac8509af543894fd8" dependencies = [ "libmimalloc-sys", ] @@ -2556,6 +2594,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" dependencies = [ "adler2", + "simd-adler32", ] [[package]] @@ -2572,9 +2611,9 @@ dependencies = [ [[package]] name = "mongodb" -version = "3.2.4" +version = "3.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0f8c69f13acf07eae386a2974f48ffd9187ea2aba8defbea9aa34e7e272c5f3" +checksum = "f6e3788f35159bbcf461227af84711950525343b64451fdd90de4e237a0b8a13" dependencies = [ "async-trait", "base64 0.13.1", @@ -2621,14 +2660,14 @@ dependencies = [ [[package]] name = "mongodb-internal-macros" -version = "3.2.4" +version = "3.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b9202de265a3a8bbb43f9fe56db27c93137d4f9fb04c093f47e9c7de0c61ac7d" +checksum = "63981427a0f26b89632fd2574280e069d09fb2912a3138da15de0174d11dd077" dependencies = [ "macro_magic", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2660,12 +2699,11 @@ dependencies = [ [[package]] name = "nu-ansi-term" -version = "0.46.0" +version = "0.50.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "77a8165726e8236064dbb45459242600304b42a5ea24ee2948e18e023bf7ba84" +checksum = "d4a28e057d01f97e61255210fcff094d74ed0466038633e95017f5beb68e4399" dependencies = [ - "overload", - "winapi", + "windows-sys 0.52.0", ] [[package]] @@ -2753,9 +2791,9 @@ dependencies = [ [[package]] name = "object" -version = "0.36.7" +version = "0.37.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87" +checksum = "ff76201f031d8863c38aa7f905eca4f53abbfa15f609db4277d44cd8938f33fe" dependencies = [ "memchr", ] @@ -2775,6 +2813,8 @@ dependencies = [ "actix-web-httpauth", "actix-ws", "base64 0.22.1", + "chrono", + "chrono-humanize", "either", "futures", "futures-util", @@ -2795,7 +2835,7 @@ dependencies = [ "regex", "reqwest", "rust-argon2", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pemfile 2.2.0", "rustls-pki-types", "schemars 0.8.22", @@ -2804,10 +2844,10 @@ dependencies = [ "serde_urlencoded", "sha2", "tera", - "thiserror 2.0.12", + "thiserror 2.0.17", "time", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tokio-stream", "tokio-tungstenite", "toml", @@ -2856,7 +2896,7 @@ version = "0.10.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8505734d46c8ab1e19a1dce3aef597ad87dcb4c37e7188231769bd6bd51cebf8" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "cfg-if", "foreign-types", "libc", @@ -2873,7 +2913,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -2903,12 +2943,6 @@ dependencies = [ "num-traits", ] -[[package]] -name = "overload" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" - [[package]] name = "p256" version = "0.13.2" @@ -2941,9 +2975,9 @@ checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" [[package]] name = "parking_lot" -version = "0.12.4" +version = "0.12.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70d58bf43669b5795d1576d0641cfb6fbb2057bf629506267a92807158584a13" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" dependencies = [ "lock_api", "parking_lot_core", @@ -2951,15 +2985,15 @@ dependencies = [ [[package]] name = "parking_lot_core" -version = "0.9.11" +version = "0.9.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc838d2a56b5b1a6c25f55575dfc605fabb63bb2365f6c2353ef9159aa69e4a5" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", "redox_syscall", "smallvec", - "windows-targets 0.52.6", + "windows-link 0.2.1", ] [[package]] @@ -3010,26 +3044,25 @@ dependencies = [ [[package]] name = "percent-encoding" -version = "2.3.1" +version = "2.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" [[package]] name = "pest" -version = "2.8.1" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1db05f56d34358a8b1066f67cbb203ee3e7ed2ba674a6263a1d5ec6db2204323" +checksum = "989e7521a040efde50c3ab6bbadafbe15ab6dc042686926be59ac35d74607df4" dependencies = [ "memchr", - "thiserror 2.0.12", "ucd-trie", ] [[package]] name = "pest_derive" -version = "2.8.1" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bb056d9e8ea77922845ec74a1c4e8fb17e7c218cc4fc11a15c5d25e189aa40bc" +checksum = "187da9a3030dbafabbbfb20cb323b976dc7b7ce91fcd84f2f74d6e31d378e2de" dependencies = [ "pest", "pest_generator", @@ -3037,22 +3070,22 @@ dependencies = [ [[package]] name = "pest_generator" -version = "2.8.1" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87e404e638f781eb3202dc82db6760c8ae8a1eeef7fb3fa8264b2ef280504966" +checksum = "49b401d98f5757ebe97a26085998d6c0eecec4995cad6ab7fc30ffdf4b052843" dependencies = [ "pest", "pest_meta", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "pest_meta" -version = "2.8.1" +version = "2.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edd1101f170f5903fde0914f899bb503d9ff5271d7ba76bbb70bea63690cc0d5" +checksum = "72f27a2cfee9f9039c4d86faa5af122a0ac3851441a34865b8a043b46be0065a" dependencies = [ "pest", "sha2", @@ -3113,7 +3146,7 @@ checksum = "6e918e4ff8c4549eb882f14b3a4bc8c8bc93de829416eacf579f1207a8fbf861" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3157,9 +3190,9 @@ checksum = "7edddbd0b52d732b21ad9a5fab5c704c14cd949e5e9a1ec5929a24fded1b904c" [[package]] name = "potential_utf" -version = "0.1.2" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585" +checksum = "84df19adbe5b5a0782edcab45899906947ab039ccf4573713735ee7de1e6b08a" dependencies = [ "zerovec", ] @@ -3181,12 +3214,12 @@ dependencies = [ [[package]] name = "prettyplease" -version = "0.2.36" +version = "0.2.37" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff24dfcda44452b9816fff4cd4227e1bb73ff5a2f1bc1105aa92fb8565ce44d2" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3200,28 +3233,28 @@ dependencies = [ [[package]] name = "proc-macro2" -version = "1.0.95" +version = "1.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" +checksum = "89ae43fd86e4158d6db51ad8e2b80f313af9cc74f5c0e03ccb87de09998732de" dependencies = [ "unicode-ident", ] [[package]] name = "quinn" -version = "0.11.8" +version = "0.11.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "626214629cda6781b6dc1d316ba307189c85ba657213ce642d9c77670f8202c8" +checksum = "b9e20a958963c291dc322d98411f541009df2ced7b5a4f2bd52337638cfccf20" dependencies = [ "bytes", "cfg_aliases", "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash 2.1.1", - "rustls 0.23.31", - "socket2 0.5.10", - "thiserror 2.0.12", + "rustc-hash", + "rustls 0.23.32", + "socket2 0.6.0", + "thiserror 2.0.17", "tokio", "tracing", "web-time", @@ -3229,20 +3262,20 @@ dependencies = [ [[package]] name = "quinn-proto" -version = "0.11.12" +version = "0.11.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49df843a9161c85bb8aae55f101bc0bac8bcafd637a620d9122fd7e0b2f7422e" +checksum = "f1906b49b0c3bc04b5fe5d86a77925ae6524a19b816ae38ce1e426255f1d8a31" dependencies = [ "bytes", "getrandom 0.3.3", "lru-slab", "rand 0.9.2", "ring 0.17.14", - "rustc-hash 2.1.1", - "rustls 0.23.31", + "rustc-hash", + "rustls 0.23.32", "rustls-pki-types", "slab", - "thiserror 2.0.12", + "thiserror 2.0.17", "tinyvec", "tracing", "web-time", @@ -3250,23 +3283,23 @@ dependencies = [ [[package]] name = "quinn-udp" -version = "0.5.13" +version = "0.5.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcebb1209ee276352ef14ff8732e24cc2b02bbac986cd74a4c81bcb2f9881970" +checksum = "addec6a0dcad8a8d96a771f815f0eaf55f9d1805756410b39f5fa81332574cbd" dependencies = [ "cfg_aliases", "libc", "once_cell", - "socket2 0.5.10", + "socket2 0.6.0", "tracing", - "windows-sys 0.59.0", + "windows-sys 0.60.2", ] [[package]] name = "quote" -version = "1.0.40" +version = "1.0.41" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" +checksum = "ce25767e7b499d1b604768e7cde645d14cc8584231ea6b295e9c9eb22c02e1d1" dependencies = [ "proc-macro2", ] @@ -3344,9 +3377,9 @@ dependencies = [ [[package]] name = "redis" -version = "0.32.4" +version = "0.32.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1f66bf4cac9733a23bcdf1e0e01effbaaad208567beba68be8f67e5f4af3ee1" +checksum = "014cc767fefab6a3e798ca45112bccad9c6e0e218fbd49720042716c73cfef44" dependencies = [ "bytes", "cfg-if", @@ -3366,38 +3399,38 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.17" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5407465600fb0548f1442edf71dd20683c6ed326200ace4b1ef0763521bb3b77" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", ] [[package]] name = "ref-cast" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4a0ae411dbe946a674d89546582cea4ba2bb8defac896622d6496f14c23ba5cf" +checksum = "f354300ae66f76f1c85c5f84693f0ce81d747e2c3f21a45fef496d89c960bf7d" dependencies = [ "ref-cast-impl", ] [[package]] name = "ref-cast-impl" -version = "1.0.24" +version = "1.0.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1165225c21bff1f3bbce98f5a1f889949bc902d3575308cc7b0de30b4f6d27c7" +checksum = "b7186006dcb21920990093f30e3dea63b7d6e977bf1256be20c3563a5db070da" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "regex" -version = "1.11.1" +version = "1.11.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191" +checksum = "8b5288124840bee7b386bc413c487869b360b2b4ec421ea56425128692f2a82c" dependencies = [ "aho-corasick", "memchr", @@ -3407,9 +3440,9 @@ dependencies = [ [[package]] name = "regex-automata" -version = "0.4.9" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908" +checksum = "833eb9ce86d40ef33cb1306d8accf7bc8ec2bfea4355cbdebb3df68b40925cad" dependencies = [ "aho-corasick", "memchr", @@ -3418,28 +3451,28 @@ dependencies = [ [[package]] name = "regex-lite" -version = "0.1.6" +version = "0.1.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" +checksum = "943f41321c63ef1c92fd763bfe054d2668f7f225a5c29f0105903dc2fc04ba30" [[package]] name = "regex-syntax" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c" +checksum = "caf4aa5b0f434c91fe5c7f1ecb6a5ece2130b02ad2a590589dda5146df959001" [[package]] name = "reqwest" -version = "0.12.22" +version = "0.12.23" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cbc931937e6ca3a06e3b6c0aa7841849b160a90351d6ab467a8b9b9959767531" +checksum = "d429f34c8092b2d42c7c93cec323bb4adeb7c67698f70839adec842ec10c7ceb" dependencies = [ "base64 0.22.1", "bytes", "encoding_rs", "futures-core", "futures-util", - "h2 0.4.11", + "h2 0.4.12", "http 1.3.1", "http-body", "http-body-util", @@ -3454,7 +3487,7 @@ dependencies = [ "percent-encoding", "pin-project-lite", "quinn", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pki-types", "serde", "serde_json", @@ -3462,7 +3495,7 @@ dependencies = [ "sync_wrapper", "tokio", "tokio-native-tls", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tokio-util", "tower", "tower-http", @@ -3472,14 +3505,14 @@ dependencies = [ "wasm-bindgen-futures", "wasm-streams", "web-sys", - "webpki-roots 1.0.2", + "webpki-roots 1.0.3", ] [[package]] name = "resolv-conf" -version = "0.7.4" +version = "0.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3" +checksum = "6b3789b30bd25ba102de4beabd95d21ac45b69b1be7d14522bab988c526d6799" [[package]] name = "rfc6979" @@ -3558,12 +3591,6 @@ version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" -[[package]] -name = "rustc-hash" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" - [[package]] name = "rustc-hash" version = "2.1.1" @@ -3591,28 +3618,15 @@ dependencies = [ [[package]] name = "rustix" -version = "0.38.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" -dependencies = [ - "bitflags 2.9.1", - "errno", - "libc", - "linux-raw-sys 0.4.15", - "windows-sys 0.59.0", -] - -[[package]] -name = "rustix" -version = "1.0.8" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11181fbabf243db407ef8df94a6ce0b2f9a733bd8be4ad02b4eda9602296cac8" +checksum = "cd15f8a2c5551a84d56efdc1cd049089e409ac19a3072d5037a17fd70719ff3e" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "errno", "libc", - "linux-raw-sys 0.9.4", - "windows-sys 0.60.2", + "linux-raw-sys", + "windows-sys 0.61.2", ] [[package]] @@ -3629,16 +3643,16 @@ dependencies = [ [[package]] name = "rustls" -version = "0.23.31" +version = "0.23.32" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ebcbd2f03de0fc1122ad9bb24b127a5a6cd51d72604a3f3c50ac459762b6cc" +checksum = "cd3c25631629d034ce7cd9940adc9d45762d46de2b0f57193c4443b92c6d4d40" dependencies = [ "aws-lc-rs", "log", "once_cell", "ring 0.17.14", "rustls-pki-types", - "rustls-webpki 0.103.4", + "rustls-webpki 0.103.7", "subtle", "zeroize", ] @@ -3665,7 +3679,7 @@ dependencies = [ "openssl-probe", "rustls-pki-types", "schannel", - "security-framework 3.2.0", + "security-framework 3.5.1", ] [[package]] @@ -3708,9 +3722,9 @@ dependencies = [ [[package]] name = "rustls-webpki" -version = "0.103.4" +version = "0.103.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a17884ae0c1b773f1ccd2bd4a8c72f16da897310a98b0e84bf349ad5ead92fc" +checksum = "e10b3f4191e8a80e6b43eebabfac91e5dcecebb27a71f04e820c47ec41d314bf" dependencies = [ "aws-lc-rs", "ring 0.17.14", @@ -3720,9 +3734,9 @@ dependencies = [ [[package]] name = "rustversion" -version = "1.0.21" +version = "1.0.22" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a0d197bd2c9dc6e53b84da9556a69ba4cdfab8619eb41a8bd1cc2027a0f6b1d" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" [[package]] name = "ryu" @@ -3741,11 +3755,11 @@ dependencies = [ [[package]] name = "schannel" -version = "0.1.27" +version = "0.1.28" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d" +checksum = "891d81b926048e76efe18581bf793546b4c0eaf8448d72be8de2bbee5fd166e1" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -3793,7 +3807,7 @@ dependencies = [ "proc-macro2", "quote", "serde_derive_internals", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3842,7 +3856,7 @@ version = "2.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "897b2245f0b511c87893af39b033e5ca9cce68824c4d7e7630b5a1d339658d02" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "core-foundation 0.9.4", "core-foundation-sys", "libc", @@ -3851,11 +3865,11 @@ dependencies = [ [[package]] name = "security-framework" -version = "3.2.0" +version = "3.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271720403f46ca04f7ba6f55d438f8bd878d6b8ca0a1046e8228c4145bcbb316" +checksum = "b3297343eaf830f66ede390ea39da1d462b6b0c1b000f420d0a83f898bbbe6ef" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "core-foundation 0.10.1", "core-foundation-sys", "libc", @@ -3864,9 +3878,9 @@ dependencies = [ [[package]] name = "security-framework-sys" -version = "2.14.0" +version = "2.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "49db231d56a190491cb4aeda9527f1ad45345af50b0851622a7adb8c03b01c32" +checksum = "cc1f0cbffaac4852523ce30d8bd3c5cdc873501d96ff467ca09b6767bb8cd5c0" dependencies = [ "core-foundation-sys", "libc", @@ -3874,16 +3888,17 @@ dependencies = [ [[package]] name = "semver" -version = "1.0.26" +version = "1.0.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56e6fa9c48d24d85fb3de5ad847117517440f6beceb7798af16b4a87d616b8d0" +checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2" [[package]] name = "serde" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" +checksum = "9a8e94ea7f378bd32cbbd37198a4a91436180c5bb472411e48b5ec2e2124ae9e" dependencies = [ + "serde_core", "serde_derive", ] @@ -3899,22 +3914,32 @@ dependencies = [ [[package]] name = "serde_bytes" -version = "0.11.17" +version = "0.11.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8437fd221bde2d4ca316d61b90e337e9e702b3820b87d63caa9ba6c02bd06d96" +checksum = "a5d440709e79d88e51ac01c4b72fc6cb7314017bb7da9eeff678aa94c10e3ea8" dependencies = [ "serde", + "serde_core", +] + +[[package]] +name = "serde_core" +version = "1.0.228" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41d385c7d4ca58e59fc732af25c3983b67ac852c1a25000afe1175de458b67ad" +dependencies = [ + "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.219" +version = "1.0.228" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" +checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -3925,30 +3950,32 @@ checksum = "18d26a20a969b9e3fdf2fc2d9f21eda6c40e2de84c9408bb5d3b05d499aae711" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "serde_json" -version = "1.0.142" +version = "1.0.145" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "030fedb782600dcbd6f02d479bf0d817ac3bb40d644745b769d6a96bc3afc5a7" +checksum = "402a6f66d8c709116cf22f558eab210f5a50187f702eb4d7e5ef38d9a7f1c79c" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.11.4", "itoa", "memchr", "ryu", "serde", + "serde_core", ] [[package]] name = "serde_path_to_error" -version = "0.1.17" +version = "0.1.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59fab13f937fa393d08645bf3a84bdfe86e296747b506ada67bb15f10f218b2a" +checksum = "10a9ff822e371bb5403e391ecd83e182e0e77ba7f6fe0160b795797109d1b457" dependencies = [ "itoa", "serde", + "serde_core", ] [[package]] @@ -3962,11 +3989,11 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.0" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "40734c41988f7306bb04f0ecf60ec0f3f1caa34290e4e8ea471dcd3346483b83" +checksum = "e24345aa0fe688594e73770a5f6d1b216508b4f93484c0026d521acd30134392" dependencies = [ - "serde", + "serde_core", ] [[package]] @@ -3983,19 +4010,18 @@ dependencies = [ [[package]] name = "serde_with" -version = "3.14.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f2c45cd61fefa9db6f254525d46e392b852e0e61d9a1fd36e5bd183450a556d5" +checksum = "6093cd8c01b25262b84927e0f7151692158fab02d961e04c979d3903eba7ecc5" dependencies = [ "base64 0.22.1", "chrono", "hex", "indexmap 1.9.3", - "indexmap 2.10.0", + "indexmap 2.11.4", "schemars 0.9.0", "schemars 1.0.4", - "serde", - "serde_derive", + "serde_core", "serde_json", "serde_with_macros", "time", @@ -4003,14 +4029,14 @@ dependencies = [ [[package]] name = "serde_with_macros" -version = "3.14.0" +version = "3.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "de90945e6565ce0d9a25098082ed4ee4002e047cb59892c318d66821e14bb30f" +checksum = "a7e6c180db0816026a61afa1cff5344fb7ebded7e4d3062772179f2501481c27" dependencies = [ - "darling", + "darling 0.21.3", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4019,7 +4045,7 @@ version = "0.9.34+deprecated" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6a8b1a1a2ebf674015cc02edccce75287f1a0130d394307b36743c2f5d504b47" dependencies = [ - "indexmap 2.10.0", + "indexmap 2.11.4", "itoa", "ryu", "serde", @@ -4098,6 +4124,12 @@ dependencies = [ "rand_core 0.6.4", ] +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + [[package]] name = "simple_asn1" version = "0.6.3" @@ -4106,7 +4138,7 @@ checksum = "297f631f50729c8c99b84667867963997ec0b50f32b2a7dbcab828ef0541e8bb" dependencies = [ "num-bigint", "num-traits", - "thiserror 2.0.12", + "thiserror 2.0.17", "time", ] @@ -4118,9 +4150,9 @@ checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" [[package]] name = "slab" -version = "0.4.10" +version = "0.4.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04dc19736151f35336d325007ac991178d504a119863a2fcb3758cdb5e52c50d" +checksum = "7a2ae44ef20feb57a68b23d846850f861394c2e02dc425a50098ae8c90267589" [[package]] name = "slug" @@ -4182,9 +4214,9 @@ dependencies = [ [[package]] name = "stable_deref_trait" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" [[package]] name = "stringprep" @@ -4222,9 +4254,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.104" +version = "2.0.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17b6f705963418cdb9927482fa304bc562ece2fdd4f616084c50b7023b435a40" +checksum = "ede7c438028d4436d71104916910f5bb611972c5cfd7f89b8300a8186e6fada6" dependencies = [ "proc-macro2", "quote", @@ -4248,7 +4280,7 @@ checksum = "728a70f3dbaf5bab7f0c4b1ac8d7ae5ea60a4b5549c8a5914361c99147a709d2" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4257,7 +4289,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.9.1", + "bitflags 2.9.4", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -4286,15 +4318,15 @@ checksum = "55937e1799185b12863d447f42597ed69d9928686b8d88a1df17376a097d8369" [[package]] name = "tempfile" -version = "3.20.0" +version = "3.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1" +checksum = "2d31c77bdf42a745371d260a26ca7163f1e0924b64afa0b688e61b5a9fa02f16" dependencies = [ "fastrand", "getrandom 0.3.3", "once_cell", - "rustix 1.0.8", - "windows-sys 0.59.0", + "rustix", + "windows-sys 0.61.2", ] [[package]] @@ -4330,11 +4362,11 @@ dependencies = [ [[package]] name = "thiserror" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "567b8a2dae586314f7be2a752ec7474332959c6460e02bde30d702a66d488708" +checksum = "f63587ca0f12b72a0600bcba1d40081f830876000bb46dd2337a3051618f4fc8" dependencies = [ - "thiserror-impl 2.0.12", + "thiserror-impl 2.0.17", ] [[package]] @@ -4345,18 +4377,18 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "thiserror-impl" -version = "2.0.12" +version = "2.0.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7f7cf42b4507d8ea322120659672cf1b9dbb93f8f2d4ecfd6e51350ff5b17a1d" +checksum = "3ff15c8ecd7de3849db632e14d18d2571fa09dfc5ed93479bc4485c7a517c913" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4370,9 +4402,9 @@ dependencies = [ [[package]] name = "time" -version = "0.3.41" +version = "0.3.44" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8a7619e19bc266e0f9c5e6686659d394bc57973859340060a69221e57dbc0c40" +checksum = "91e7d9e3bb61134e77bde20dd4825b97c010155709965fedf0f49bb138e52a9d" dependencies = [ "deranged", "itoa", @@ -4385,15 +4417,15 @@ dependencies = [ [[package]] name = "time-core" -version = "0.1.4" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c9e9a38711f559d9e3ce1cdb06dd7c5b8ea546bc90052da6d06bb76da74bb07c" +checksum = "40868e7c1d2f0b8d73e4a8c7f0ff63af4f6d19be117e90bd73eb1d62cf831c6b" [[package]] name = "time-macros" -version = "0.2.22" +version = "0.2.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3526739392ec93fd8b359c8e98514cb3e8e021beb4e5f597b00a0221f8ed8a49" +checksum = "30cfb0125f12d9c277f35663a0a33f8c30190f4e4574868a330595412d34ebf3" dependencies = [ "num-conv", "time-core", @@ -4420,9 +4452,9 @@ dependencies = [ [[package]] name = "tinyvec" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "09b3661f17e86524eccd4371ab0429194e0d7c008abb45f7a7495b1719463c71" +checksum = "bfa5fdc3bce6191a1dbc8c02d5c8bffcf557bafa17c124c5264a458f1b0613fa" dependencies = [ "tinyvec_macros", ] @@ -4461,7 +4493,7 @@ checksum = "6e06d43f1345a3bcd39f6a56dbb7dcab2ba47e68e8ac134855e7e2bdbaf8cab8" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4486,11 +4518,11 @@ dependencies = [ [[package]] name = "tokio-rustls" -version = "0.26.2" +version = "0.26.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8e727b36a1a0e8b74c376ac2211e40c2c8af09fb4013c60d910495810f008e9b" +checksum = "1729aa945f29d91ba541258c8df89027d5792d85a8841fb65e8bf0f4ede4ef61" dependencies = [ - "rustls 0.23.31", + "rustls 0.23.32", "tokio", ] @@ -4514,11 +4546,11 @@ checksum = "489a59b6730eda1b0171fcfda8b121f4bee2b35cba8645ca35c5f7ba3eb736c1" dependencies = [ "futures-util", "log", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-native-certs 0.8.1", "rustls-pki-types", "tokio", - "tokio-rustls 0.26.2", + "tokio-rustls 0.26.4", "tungstenite", ] @@ -4539,12 +4571,12 @@ dependencies = [ [[package]] name = "toml" -version = "0.9.5" +version = "0.9.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75129e1dc5000bfbaa9fee9d1b21f974f9fbad9daec557a521ee6e080825f6e8" +checksum = "f0dc8b1fb61449e27716ec0e1bdf0f6b8f3e8f6b05391e8497b8b6d7804ea6d8" dependencies = [ - "indexmap 2.10.0", - "serde", + "indexmap 2.11.4", + "serde_core", "serde_spanned", "toml_datetime", "toml_parser", @@ -4554,27 +4586,27 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.7.0" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bade1c3e902f58d73d3f294cd7f20391c1cb2fbcb643b73566bc773971df91e3" +checksum = "f2cdb639ebbc97961c51720f858597f7f24c4fc295327923af55b74c3c724533" dependencies = [ - "serde", + "serde_core", ] [[package]] name = "toml_parser" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b551886f449aa90d4fe2bdaa9f4a2577ad2dde302c61ecf262d80b116db95c10" +checksum = "c0cbe268d35bdb4bb5a56a2de88d0ad0eb70af5384a99d648cd4b3d04039800e" dependencies = [ "winnow", ] [[package]] name = "toml_writer" -version = "1.0.2" +version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcc842091f2def52017664b53082ecbbeb5c7731092bad69d2c63050401dfd64" +checksum = "df8b2b54733674ad286d16267dcfc7a71ed5c776e4ac7aa3c3e2561f7c637bf2" [[package]] name = "tower" @@ -4600,7 +4632,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "adc82fd73de2a9722ac5da747f12383d2bfdb93591ee6c58486e0097890f05f2" dependencies = [ "base64 0.22.1", - "bitflags 2.9.1", + "bitflags 2.9.4", "bytes", "futures-util", "http 1.3.1", @@ -4646,7 +4678,7 @@ checksum = "81383ab64e72a7a8b8e13130c49e3dab29def6d0c7d76a03087b3cf71c5c6903" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4672,9 +4704,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.3.19" +version = "0.3.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e8189decb5ac0fa7bc8b96b7cb9b2701d60d48805aca84a238004d665fcc4008" +checksum = "2054a14f5307d601f88daf0553e1cbf472acc4f2c51afab632431cdcd72124d5" dependencies = [ "nu-ansi-term", "sharded-slab", @@ -4702,10 +4734,10 @@ dependencies = [ "httparse", "log", "rand 0.9.2", - "rustls 0.23.31", + "rustls 0.23.32", "rustls-pki-types", "sha1", - "thiserror 2.0.12", + "thiserror 2.0.17", "url", "utf-8", ] @@ -4723,9 +4755,9 @@ dependencies = [ [[package]] name = "typenum" -version = "1.18.0" +version = "1.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1dccffe3ce07af9386bfd29e80c0ab1a8205a2fc34e4bcd40364df902cfa8f3f" +checksum = "562d481066bde0658276a35467c4af00bdc6ee726305698a55b86e61d7ad82bb" [[package]] name = "ucd-trie" @@ -4797,9 +4829,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" [[package]] name = "unicode-ident" -version = "1.0.18" +version = "1.0.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" +checksum = "f63a545481291138910575129486daeaf8ac54aee4387fe7906919f7830c7d9d" [[package]] name = "unicode-normalization" @@ -4842,9 +4874,9 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" [[package]] name = "url" -version = "2.5.4" +version = "2.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60" +checksum = "08bc136a29a3d1758e07a9cca267be308aeebf5cfd5a10f3f67ab2097683ef5b" dependencies = [ "form_urlencoded", "idna", @@ -4875,7 +4907,7 @@ name = "utils" version = "0.1.0" dependencies = [ "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -4941,44 +4973,54 @@ checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" -version = "0.14.2+wasi-0.2.4" +version = "0.14.7+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +checksum = "883478de20367e224c0090af9cf5f9fa85bed63a95c1abf3afc5c083ebc06e8c" dependencies = [ - "wit-bindgen-rt", + "wasip2", +] + +[[package]] +name = "wasip2" +version = "1.0.1+wasi-0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0562428422c63773dad2c345a1882263bbf4d65cf3f42e90921f787ef5ad58e7" +dependencies = [ + "wit-bindgen", ] [[package]] name = "wasm-bindgen" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +checksum = "c1da10c01ae9f1ae40cbfac0bac3b1e724b320abfcf52229f80b547c0d250e2d" dependencies = [ "cfg-if", "once_cell", "rustversion", "wasm-bindgen-macro", + "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-backend" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +checksum = "671c9a5a66f49d8a47345ab942e2cb93c7d1d0339065d4f8139c486121b43b19" dependencies = [ "bumpalo", "log", "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-futures" -version = "0.4.50" +version = "0.4.54" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "555d470ec0bc3bb57890405e5d4322cc9ea83cebb085523ced7be4144dac1e61" +checksum = "7e038d41e478cc73bae0ff9b36c60cff1c98b8f38f8d7e8061e79ee63608ac5c" dependencies = [ "cfg-if", "js-sys", @@ -4989,9 +5031,9 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +checksum = "7ca60477e4c59f5f2986c50191cd972e3a50d8a95603bc9434501cf156a9a119" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -4999,22 +5041,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +checksum = "9f07d2f20d4da7b26400c9f4a0511e6e0345b040694e8a75bd41d578fa4421d7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "wasm-bindgen-backend", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.100" +version = "0.2.104" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +checksum = "bad67dc8b2a1a6e5448428adec4c3e84c43e561d8c9ee8a9e5aabeb193ec41d1" dependencies = [ "unicode-ident", ] @@ -5034,9 +5076,9 @@ dependencies = [ [[package]] name = "web-sys" -version = "0.3.77" +version = "0.3.81" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33b6dd2ef9186f1f2072e409e99cd22a975331a6b3591b12c764e0e55c60d5d2" +checksum = "9367c417a924a74cae129e6a2ae3b47fabb1f8995595ab474029da749a8be120" dependencies = [ "js-sys", "wasm-bindgen", @@ -5060,30 +5102,18 @@ checksum = "5f20c57d8d7db6d3b86154206ae5d8fba62dd39573114de97c2cb0578251f8e1" [[package]] name = "webpki-roots" -version = "1.0.2" +version = "1.0.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7e8983c3ab33d6fb807cfcdad2491c4ea8cbc8ed839181c7dfd9c67c83e261b2" +checksum = "32b130c0d2d49f8b6889abc456e795e82525204f27c42cf767cf0d7734e089b8" dependencies = [ "rustls-pki-types", ] -[[package]] -name = "which" -version = "4.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7" -dependencies = [ - "either", - "home", - "once_cell", - "rustix 0.38.44", -] - [[package]] name = "widestring" -version = "1.2.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d" +checksum = "72069c3113ab32ab29e5584db3c6ec55d416895e60715417b5b883a357c3e471" [[package]] name = "winapi" @@ -5103,11 +5133,11 @@ checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" [[package]] name = "winapi-util" -version = "0.1.9" +version = "0.1.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" dependencies = [ - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -5118,37 +5148,37 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" [[package]] name = "windows-core" -version = "0.61.2" +version = "0.62.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" dependencies = [ "windows-implement", "windows-interface", - "windows-link", - "windows-result", - "windows-strings", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", ] [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -5157,15 +5187,21 @@ version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + [[package]] name = "windows-registry" version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" dependencies = [ - "windows-link", - "windows-result", - "windows-strings", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] @@ -5174,7 +5210,16 @@ version = "0.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" dependencies = [ - "windows-link", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", ] [[package]] @@ -5183,7 +5228,16 @@ version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" dependencies = [ - "windows-link", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", ] [[package]] @@ -5219,7 +5273,16 @@ version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2f500e4d28234f72040990ec9d39e3a6b950f9f22d3dba18416c35882612bcb" dependencies = [ - "windows-targets 0.53.3", + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", ] [[package]] @@ -5255,19 +5318,19 @@ dependencies = [ [[package]] name = "windows-targets" -version = "0.53.3" +version = "0.53.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" dependencies = [ - "windows-link", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", - "windows_x86_64_msvc 0.53.0", + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", ] [[package]] @@ -5284,9 +5347,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -5302,9 +5365,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -5320,9 +5383,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -5332,9 +5395,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -5350,9 +5413,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -5368,9 +5431,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -5386,9 +5449,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -5404,15 +5467,15 @@ checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" [[package]] name = "windows_x86_64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" [[package]] name = "winnow" -version = "0.7.12" +version = "0.7.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3edebf492c8125044983378ecb5766203ad3b4c2f7a922bd7dd207f6d443e95" +checksum = "21a0236b59786fed61e2a80582dd500fe61f18b5dca67a4a067d0bc9039339cf" [[package]] name = "winreg" @@ -5425,13 +5488,10 @@ dependencies = [ ] [[package]] -name = "wit-bindgen-rt" -version = "0.39.0" +name = "wit-bindgen" +version = "0.46.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags 2.9.1", -] +checksum = "f17a85883d4e6d00e8a97c586de764dabcc06133f7f1d55dce5cdc070ad7fe59" [[package]] name = "writeable" @@ -5477,28 +5537,28 @@ checksum = "38da3c9736e16c5d3c8c597a9aaa5d1fa565d0532ae05e27c24aa62fb32c0ab6" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "synstructure", ] [[package]] name = "zerocopy" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1039dd0d3c310cf05de012d8a39ff557cb0d23087fd44cad61df08fc31907a2f" +checksum = "0894878a5fa3edfd6da3f88c4805f4c8558e2b996227a3d864f47fe11e38282c" dependencies = [ "zerocopy-derive", ] [[package]] name = "zerocopy-derive" -version = "0.8.26" +version = "0.8.27" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ecf5b4cc5364572d7f4c329661bcc82724222973f2cab6f050a4e5c22f75181" +checksum = "88d2b8d9c68ad2b9e4340d7832716a4d21a22a1154777ad56ea55c51a9cf3831" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -5518,15 +5578,15 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", "synstructure", ] [[package]] name = "zeroize" -version = "1.8.1" +version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ced3678a2879b30306d323f4542626697a464a97c0a07c9aebf7ebca65cd4dde" +checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" dependencies = [ "zeroize_derive", ] @@ -5539,7 +5599,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -5555,9 +5615,9 @@ dependencies = [ [[package]] name = "zerovec" -version = "0.11.3" +version = "0.11.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bdbb9122ea75b11bf96e7492afb723e8a7fbe12c67417aa95e7e3d18144d37cd" +checksum = "e7aa2bd55086f1ab526693ecbe444205da57e25f4489879da80635a46d90e73b" dependencies = [ "yoke", "zerofrom", @@ -5572,7 +5632,7 @@ checksum = "5b96237efa0c878c64bd89c436f661be4e46b2f3eff1ebb976f7ef2321d2f58f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.104", + "syn 2.0.106", ] [[package]] @@ -5595,9 +5655,9 @@ dependencies = [ [[package]] name = "zstd-sys" -version = "2.0.15+zstd.1.5.7" +version = "2.0.16+zstd.1.5.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eb81183ddd97d0c74cedf1d50d85c8d08c1b8b68ee863bdee9e706eedba1a237" +checksum = "91e19ebc2adc8f83e43039e79776e3fda8ca919132d68a1fed6a5faca2683748" dependencies = [ "cc", "pkg-config", diff --git a/Cargo.toml b/Cargo.toml index b4c38c15..30b6430c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -30,6 +30,8 @@ tokio-stream = { version = "0.1.15", features = ["sync"] } pin-project = "1" # Other dep time = { version = "0.3.36", features = ["serde"] } +chrono = { version = "0.4", features = ["serde"] } +chrono-humanize = "0.2" parking_lot = "~0.12" num-bigint = "~0.4" # Web deps diff --git a/config/database_sample.toml b/config/database_sample.toml index 85a2f502..9f72b28d 100644 --- a/config/database_sample.toml +++ b/config/database_sample.toml @@ -2,6 +2,12 @@ url = "mongodb://bridge-user:admin123456789@127.0.0.1:27017/?authSource=bridge" url_local = "mongodb://bridge-user:admin123456789@127.0.0.1:27017/?authSource=bridge" url_prod = "mongodb://bridge-user:admin123456789@127.0.0.1:27017/?authSource=bridge" + + # Apple Silicon: + # url = "mongodb://127.0.0.1:27017/bridge" + # url_local = "mongodb://127.0.0.1:27017/bridge" + # url_prod = "mongodb://127.0.0.1:27017/bridge" + name = "bridge" [keydb] diff --git a/doc/deployment.md b/doc/deployment.md index ca1f4c16..d72374f9 100644 --- a/doc/deployment.md +++ b/doc/deployment.md @@ -11,46 +11,88 @@ just certs just gen-curve ``` -- If you intend to public face Bridge, properly obtain certificates from a trusted authority + + > **Note:** If you intend to deploy Bridge publicly, properly obtain certificates from a trusted authority. 3. Copy or rename the provided configuration files: - `config/configurations_sample.toml` → `config/configurations.toml` - `config/database_sample.toml` → `config/database.toml` +4. Update the relevant variables: + + **configurations.toml** + + - `redirect_url`: Set to their localhost versions (commented out) + - `client_id` / `client_secret`: If you're with IBM, you can find instructions on how to generate these [here](https://github.com/acceleratedscience/configurations/tree/main/bridge/prod). + If you're developing your own application, you will need to register it with IBM ID to use the IBM ID authentication. For now, no other auth methods are supported (PRs welcome) + + **database.toml** + + - `[mongodb]`: Use the urls without auth (commented out) if you're using an Apple Silicon device (M1/M2/M3 etc.) + +
+ ### Running Bridge locally -1. Start a local DB instances +1. Start a local DB instance - Ensure you have Podman installed on your local machine. If you prefer Docker, updated "podman" commands to "docker" commands + Ensure you have Podman installed and running on your local machine. ```shell just local-mongo ``` - Optionally you can start a cache instance + > **Apple Silicon Support:** Use the ARM install instead, and set the DB urls in `database.toml` without auth: `url="mongodb://127.0.0.1:27017/bridge"` + > + > ``` + > just local-mongo-arm + > ``` + + > **Docker Support:** If you prefer Docker, updated "podman" commands to "docker" commands in the [justfile](../justfile). + +2. Optionally you can start a cache instance ```shell just local-keydb ``` -2. Start the Bridge server +3. Start the Bridge server ```shell - cargo run --feature=full --release + cargo run --features=full ``` - The release flag will enable all optimizations and compilation will take a longer time - - Look in the Cargo.toml for the available feature flags + Refer to [Cargo.toml](../Cargo.toml) for the available `--features` flags. -3. See the result at [localhost:8080](https://localhost:8080) + The `--release` flag will enable all optimizations and compilation will take a longer time: + + ```shell + cargo run --features=full --release + ``` + + > **Development:** + > To have the server restart on change, use cargo-watch: + > + > ``` + > cargo install cargo-watch + > ``` + > + > ``` + > cargo watch -x 'run --features=full + > ``` + > + > **Note:** Be patient as the initial build may take multiple minutes. + +4. See the result at [localhost:8080](https://localhost:8080) (HTTPS required) + +
### Destroying Bridge running locally 1. Stop the Bridge server - Press `Ctrl + C` in the terminal where the server is running or send a sigterm. + Simply press `Ctrl` + `C` in the terminal where the server is running or send a sigterm. 2. Stop the local DB instances @@ -64,13 +106,17 @@ cargo clean ``` +
+ ### Deployment to Kubernetes / Openshift + > [!NOTE] > This is one possible way to deploy and it is not a hard requirement. 1. Build the Bridge container image Check what features you want to enable for your deployment + ```shell just build-full ``` @@ -78,91 +124,93 @@ 2. Tag and push the image to your choice of Image repository 3. Apply this service as a deployment - - Ensure you give it the proper permission to access various namespaces and create CRDs - - The following was generated with Helm - ```yaml - kind: Deployment - metadata: - annotations: - deployment.kubernetes.io/revision: "39" - meta.helm.sh/release-name: bridge-openad - meta.helm.sh/release-namespace: openbridge - creationTimestamp: "2025-05-15T03:42:42Z" - generation: 39 - labels: - app.kubernetes.io/instance: bridge-openad - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/name: bridge-openad - app.kubernetes.io/version: 1.16.0 - helm.sh/chart: bridge-openad-0.1.0 - name: bridge-openad - namespace: bridge - resourceVersion: "" - uid: "" - spec: - progressDeadlineSeconds: 600 - replicas: 1 - revisionHistoryLimit: 10 - selector: - matchLabels: - app.kubernetes.io/instance: bridge-openad - app.kubernetes.io/name: bridge-openad - strategy: - rollingUpdate: - maxSurge: 25% - maxUnavailable: 25% - type: RollingUpdate - template: + + - Ensure you give it the proper permission to access various namespaces and create CRDs + - The following was generated with Helm: + + ```yaml + kind: Deployment metadata: - annotations: - kubectl.kubernetes.io/restartedAt: "2025-07-04T22:24:19-04:00" - creationTimestamp: null - labels: - app.kubernetes.io/instance: bridge-openad - app.kubernetes.io/managed-by: Helm - app.kubernetes.io/name: bridge-openad - app.kubernetes.io/version: 1.16.0 - helm.sh/chart: bridge-openad-0.1.0 - spec: - containers: - - image: xxx.amazonaws.com/bridge/openad:v0.0.1 - imagePullPolicy: Always - livenessProbe: - failureThreshold: 3 - httpGet: - path: /health - port: 8080 - scheme: HTTPS - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 1 + annotations: + deployment.kubernetes.io/revision: "39" + meta.helm.sh/release-name: bridge-openad + meta.helm.sh/release-namespace: openbridge + creationTimestamp: "2025-05-15T03:42:42Z" + generation: 39 + labels: + app.kubernetes.io/instance: bridge-openad + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: bridge-openad + app.kubernetes.io/version: 1.16.0 + helm.sh/chart: bridge-openad-0.1.0 name: bridge-openad - ports: - - containerPort: 8080 - name: http - protocol: TCP - readinessProbe: - failureThreshold: 3 - httpGet: - path: /health - port: 8080 - scheme: HTTPS - periodSeconds: 10 - successThreshold: 1 - timeoutSeconds: 1 - resources: - requests: - cpu: 100m - memory: 1Gi - terminationMessagePath: /dev/termination-log - terminationMessagePolicy: File - dnsPolicy: ClusterFirst - imagePullSecrets: - - name: ecr-registry-openad - restartPolicy: Always - schedulerName: default-scheduler - securityContext: {} - serviceAccount: bridge-openad - serviceAccountName: bridge-openad - terminationGracePeriodSeconds: 30 - ``` + namespace: bridge + resourceVersion: "" + uid: "" + spec: + progressDeadlineSeconds: 600 + replicas: 1 + revisionHistoryLimit: 10 + selector: + matchLabels: + app.kubernetes.io/instance: bridge-openad + app.kubernetes.io/name: bridge-openad + strategy: + rollingUpdate: + maxSurge: 25% + maxUnavailable: 25% + type: RollingUpdate + template: + metadata: + annotations: + kubectl.kubernetes.io/restartedAt: "2025-07-04T22:24:19-04:00" + creationTimestamp: null + labels: + app.kubernetes.io/instance: bridge-openad + app.kubernetes.io/managed-by: Helm + app.kubernetes.io/name: bridge-openad + app.kubernetes.io/version: 1.16.0 + helm.sh/chart: bridge-openad-0.1.0 + spec: + containers: + - image: xxx.amazonaws.com/bridge/openad:v0.0.1 + imagePullPolicy: Always + livenessProbe: + failureThreshold: 3 + httpGet: + path: /health + port: 8080 + scheme: HTTPS + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + name: bridge-openad + ports: + - containerPort: 8080 + name: http + protocol: TCP + readinessProbe: + failureThreshold: 3 + httpGet: + path: /health + port: 8080 + scheme: HTTPS + periodSeconds: 10 + successThreshold: 1 + timeoutSeconds: 1 + resources: + requests: + cpu: 100m + memory: 1Gi + terminationMessagePath: /dev/termination-log + terminationMessagePolicy: File + dnsPolicy: ClusterFirst + imagePullSecrets: + - name: ecr-registry-openad + restartPolicy: Always + schedulerName: default-scheduler + securityContext: {} + serviceAccount: bridge-openad + serviceAccountName: bridge-openad + terminationGracePeriodSeconds: 30 + ``` diff --git a/justfile b/justfile index a88970e4..6d86e5fa 100644 --- a/justfile +++ b/justfile @@ -73,12 +73,12 @@ build-full: (build-features "notebook,lifecycle,observe,mcp,openwebui") # --- Frontend & Minification --- mini-js: - uglifyjs ./static/js/main.js -o ./static/js/main.js -c -m + npx uglifyjs ./static/js/main.js -o ./static/js/main.js -c -m build-front: - tailwindcss -i ./static/css/input.css -o ./static/css/output.css --minify - tsc - uglifyjs ./static/js/main.js -o ./static/js/main.js -c -m + npx tailwindcss -i ./static/css/input.css -o ./static/css/output.css --minify + npx tsc + npx uglifyjs ./static/js/main.js -o ./static/js/main.js -c -m # --- Local Development Services --- local-mongo: @@ -123,6 +123,6 @@ certs: mkdir certs @openssl req -x509 -newkey rsa:2048 -nodes -keyout certs/key.pem -out certs/cert.pem -days 365 -subj '/CN=open.accelerator.cafe' -gen_curve: +gen-curve: @openssl ecparam -name prime256v1 -genkey -noout -out certs/private.ec.key @openssl ec -in certs/private.ec.key -pubout -out certs/public-key.pem diff --git a/src/config/mod.rs b/src/config/mod.rs index f326a71a..2f112158 100644 --- a/src/config/mod.rs +++ b/src/config/mod.rs @@ -137,14 +137,10 @@ pub fn init_once() -> Configuration { validation.set_audience(&AUD); validation.leeway = 0; - let (config_location_str, database_location_str) = if cfg!(debug_assertions) { - ( - "config/configurations_sample.toml", - "config/database_sample.toml", - ) - } else { - ("config/configurations.toml", "config/database.toml") - }; + let (config_location_str, database_location_str) = ( + "config/configurations.toml", + "config/database.toml", + ); let conf_table: toml::Table = toml::from_str(&read_to_string(PathBuf::from_str(config_location_str).unwrap()).unwrap()) diff --git a/src/templating/mod.rs b/src/templating/mod.rs index 74c21764..df29a6b8 100644 --- a/src/templating/mod.rs +++ b/src/templating/mod.rs @@ -1,12 +1,55 @@ -use tera::Tera; +use tera::{Tera, Value, Result as TeraResult}; use tracing::error; +use chrono::{DateTime, Utc}; +use chrono_humanize::HumanTime; +use std::collections::HashMap; pub fn start_template_eng() -> Tera { match Tera::new("templates/**/*.html") { - Ok(t) => t, + Ok(mut tera) => { + // Add custom filter for relative time + tera.register_filter("time_ago", time_ago_filter); + tera + }, Err(e) => { error!("Parsing error(s): {}", e); ::std::process::exit(1); } } } + +fn time_ago_filter(value: &Value, _: &HashMap) -> TeraResult { + let time_str = value.as_str().ok_or_else(|| { + tracing::error!("time_ago filter received non-string value: {:?}", value); + tera::Error::msg("time_ago filter can only be applied to strings") + })?; + + tracing::debug!("time_ago filter processing timestamp: {}", time_str); + + // Parse the timestamp - handle the format "2025-08-27 14:49:07.498643 +00:00:00" + // Note: the timezone has an extra :00 at the end, so we need to handle that + let normalized_time_str = if time_str.len() > 6 && time_str.ends_with(":00") { + let trimmed = &time_str[..time_str.len() - 3]; // Remove the last ":00" + tracing::debug!("Normalized timestamp from '{}' to '{}'", time_str, trimmed); + trimmed + } else { + time_str + }; + + let parsed_time = DateTime::parse_from_str(normalized_time_str, "%Y-%m-%d %H:%M:%S%.f %z") + .or_else(|_| { + tracing::debug!("Failed to parse with first format, trying RFC3339"); + DateTime::parse_from_rfc3339(normalized_time_str) + }) + .map_err(|e| { + tracing::error!("Failed to parse timestamp '{}': {}", time_str, e); + tera::Error::msg(format!("Failed to parse timestamp '{}': {}", time_str, e)) + })?; + + let utc_time: DateTime = parsed_time.with_timezone(&Utc); + let human_time = HumanTime::from(utc_time); + let result = human_time.to_string(); + + tracing::debug!("time_ago filter result: {}", result); + Ok(Value::String(result)) +} diff --git a/src/web/route/portal/group_admin/mod.rs b/src/web/route/portal/group_admin/mod.rs index 06f690fc..857c7c10 100644 --- a/src/web/route/portal/group_admin/mod.rs +++ b/src/web/route/portal/group_admin/mod.rs @@ -97,12 +97,25 @@ pub(super) async fn group( Err(_) => (vec![], "".to_string(), "".to_string(), "".to_string()), }; + // Placeholder: need to fetch subscription parameters from services.toml + let subs_expanded: Vec = subs + .iter() + .map(|service_name| { + serde_json::json!({ + "type": "openad_model", + "url": "https://dummy.url", + "name": service_name, + "nickname": &service_name.strip_prefix("mcp-").unwrap_or(service_name)[0..4], + }) + }) + .collect(); + let mut ctx = (**context).clone(); ctx.insert("name", &user.user_name); ctx.insert("user_type", &user.user_type); ctx.insert("email", &user.email); ctx.insert("group", &user.groups); - ctx.insert("subscriptions", &subs); + ctx.insert("subscriptions", &subs_expanded); ctx.insert("group_created_at", &group_created_at); ctx.insert("group_updated_at", &group_updated_at); ctx.insert("group_last_updated", &group_last_updated); diff --git a/src/web/route/portal/profile_htmx.rs b/src/web/route/portal/profile_htmx.rs index dbf92792..a01fa92c 100644 --- a/src/web/route/portal/profile_htmx.rs +++ b/src/web/route/portal/profile_htmx.rs @@ -31,8 +31,22 @@ impl Profile { pub fn render(&self, tera: Data) -> Result { let mut context = tera::Context::new(); + + // Placeholder: need to fetch subscription parameters from services.toml + let subs_expanded: Vec = self.subscriptions + .iter() + .map(|service_name| { + serde_json::json!({ + "type": "openad_model", + "url": "https://dummy.url", + "name": service_name, + "nickname": &service_name.strip_prefix("mcp-").unwrap_or(service_name)[0..4], + }) + }) + .collect(); + context.insert("group", &self.groups.join(", ")); - context.insert("subscriptions", &self.subscriptions); + context.insert("subscriptions", &subs_expanded); context.insert("name", &self.name); Ok(tera.render(PROFILE, &context)?) diff --git a/src/web/route/portal/system_admin/htmx.rs b/src/web/route/portal/system_admin/htmx.rs index e0b3597e..29be6592 100644 --- a/src/web/route/portal/system_admin/htmx.rs +++ b/src/web/route/portal/system_admin/htmx.rs @@ -7,7 +7,7 @@ pub struct GroupContent { pub items: Vec, } -pub(super) static VIEW_GROUP: &str = "components/group_view.html"; +pub(super) static VIEW_GROUP: &str = "components/systems_group.html"; pub(super) static MODIFY_GROUP: &str = "components/group_edit.html"; pub(super) static CREATE_GROUP: &str = "components/group_create.html"; diff --git a/src/web/route/portal/system_admin/mod.rs b/src/web/route/portal/system_admin/mod.rs index 5be97483..1760ebce 100644 --- a/src/web/route/portal/system_admin/mod.rs +++ b/src/web/route/portal/system_admin/mod.rs @@ -99,12 +99,39 @@ pub(super) async fn system( Err(_) => (vec![], "".to_string(), "".to_string(), "".to_string()), }; + // @placeholder: need to fetch subscription parameters from services.toml + let subs_expanded: Vec = subs + .iter() + .enumerate() + .map(|(i, service_name)| { + if i % 2 == 1 { + serde_json::json!({ + "type": "mcp", + "url": "https://dummy.url", + "name": service_name, + "code": format!("http://openad.accelerate.science/mcp/{}/mcp", service_name) + }) + } else { + serde_json::json!({ + "type": "openad_model", + "url": "https://dummy.url", + "name": service_name, + "code": format!( + "catalog model service from remote 'https://open.accelerate.science/proxy' as {} using (auth_group=default inference-service={})", + "foobar", + service_name + ) + }) + } + }) + .collect(); + let mut ctx = (**context).clone(); ctx.insert("name", &user.user_name); ctx.insert("user_type", &user.user_type); ctx.insert("email", &user.email); ctx.insert("group", &user.groups); - ctx.insert("subscriptions", &subs); + ctx.insert("subscriptions", &subs_expanded); ctx.insert("group_created_at", &group_created_at); ctx.insert("group_updated_at", &group_updated_at); ctx.insert("group_last_updated", &group_last_updated); @@ -193,12 +220,12 @@ async fn system_create_group( // TODO: check if group already exists, and not rely one dup key from DB let result = helper::log_with_level!(db.insert(group, GROUP).await, error); let content = match result { - Ok(r) => format!("

Group created with id: {r}

"), + Ok(r) => format!("Group created with id: {r}"), Err(e) if e.to_string().contains("dup key") => { return Ok(HttpResponse::BadRequest() .append_header(( HTMX_ERROR_RES, - format!("

Group '{}' already exists

", gf.name), + format!("Group '{}' already exists", gf.name), )) .finish()); } @@ -219,7 +246,7 @@ async fn system_create_group( // .delete(doc! {"name": &group.name}, GROUP, PhantomData::) // .await?; // -// let content = format!("

Group '{}' has been deleted

", group.name); +// let content = format!("Group '{}' has been deleted", group.name); // Ok(HttpResponse::Ok() // .content_type(ContentType::form_url_encoded()) // .body(content)) @@ -256,14 +283,14 @@ async fn system_update_group( return Ok(HttpResponse::BadRequest() .append_header(( HTMX_ERROR_RES, - format!("

Group '{}' does not exist

", gf.name), + format!("Group '{}' does not exist", gf.name), )) .finish()); } Ok(HttpResponse::Ok() .content_type(ContentType::form_url_encoded()) - .body(format!("

Group '{}' has been updated

", gf.name))) + .body(format!("Group '{}' has been updated", gf.name))) } #[patch("user")] @@ -279,7 +306,7 @@ async fn system_update_user( // stop self update if uf.email.eq(&uf.last_updated_by) { return Ok(HttpResponse::BadRequest() - .append_header((HTMX_ERROR_RES, "

Cannot update self

".to_string())) + .append_header((HTMX_ERROR_RES, "Cannot update self".to_string())) .finish()); } @@ -300,7 +327,7 @@ async fn system_update_user( return Ok(HttpResponse::BadRequest() .append_header(( HTMX_ERROR_RES, - format!("

User with email address {} does not exist

", uf.email), + format!("User '{}' does not exist", uf.email), )) .finish()); } @@ -308,7 +335,7 @@ async fn system_update_user( Ok(HttpResponse::Ok() .content_type(ContentType::form_url_encoded()) .body(format!( - "

User with email address {} has been updated

", + "User '{}' has been updated", uf.email ))) } @@ -329,7 +356,7 @@ async fn system_delete_user( // stop self delete if uf.email.eq(&uf.last_updated_by) { return Ok(HttpResponse::BadRequest() - .append_header((HTMX_ERROR_RES, "

Cannot delete self

".to_string())) + .append_header((HTMX_ERROR_RES, "Cannot delete self".to_string())) .finish()); } @@ -374,7 +401,6 @@ async fn system_tab_htmx( | AdminTab::GroupCreate | AdminTab::GroupView => { let mut group_form = GroupContent::new(); - CATALOG.get_all_by_name().iter().for_each(|name| { // TODO: remove this clone and use &'static str group_form.add(name.clone()); @@ -403,7 +429,7 @@ async fn system_tab_htmx( let groups: Vec = db.find_many(doc! {}, GROUP).await.unwrap_or(vec![]); let groups: Vec = groups.into_iter().map(|group| group.into()).collect(); - + helper::log_with_level!( group_form.render( &user.email, @@ -490,6 +516,21 @@ async fn system_tab_htmx( data.render("components/systems_group.html", &tera::Context::new()), error )?, + + // Failed attempt at making groups available on page load + // AdminTab::Main => { + // let groups: Vec = db.find_many(doc! {}, GROUP).await.unwrap_or(vec![]); + // let groups: Vec = + // groups.into_iter().map(|group| group.into()).collect(); + + // let mut context = tera::Context::new(); + // context.insert("groups", &groups); + + // helper::log_with_level!( + // data.render("components/systems_group.html", &context), + // error + // )? + // }, }; Ok(HttpResponse::Ok() diff --git a/src/web/route/portal/token.rs b/src/web/route/portal/token.rs index 3d5e1a97..63485e48 100644 --- a/src/web/route/portal/token.rs +++ b/src/web/route/portal/token.rs @@ -103,6 +103,7 @@ pub async fn get_token_for_user( let mut context = tera::Context::new(); context.insert("token", &Some(token)); + context.insert("fresh", &true); context.insert("token_exp", &exp); let content = helper::log_with_level!(data.render("components/token.html", &context), error)?; diff --git a/src/web/route/portal/user_htmx.rs b/src/web/route/portal/user_htmx.rs index add6b2f6..cfbd600c 100644 --- a/src/web/route/portal/user_htmx.rs +++ b/src/web/route/portal/user_htmx.rs @@ -57,10 +57,23 @@ impl<'p> Profile<'p> { return Ok((tera.render(EMPTY_PROFILE, &context)?, None)); } + // Placeholder: need to fetch subscription parameters from services.toml + let subs_expanded: Vec = self.subscriptions + .iter() + .map(|service_name| { + serde_json::json!({ + "type": "openad_model", + "url": "https://dummy.url", + "name": service_name, + "nickname": &service_name.strip_prefix("mcp-").unwrap_or(service_name)[0..4], + }) + }) + .collect(); + context.insert("user_type", &self.user.user_type); context.insert("email", &self.user.email); context.insert("group", &self.groups); - context.insert("subscriptions", &self.subscriptions); + context.insert("subscriptions", &subs_expanded); context.insert("token", &self.user.token); // add in the expiration time if token is present if let Some(t) = &self.user.token { diff --git a/src/web/route/proxy/services.rs b/src/web/route/proxy/services.rs index 507e4abb..9041fca6 100644 --- a/src/web/route/proxy/services.rs +++ b/src/web/route/proxy/services.rs @@ -9,9 +9,7 @@ use crate::errors::{BridgeError, Result}; pub struct Catalog(pub toml::Table); pub static CATALOG: LazyLock = LazyLock::new(|| { - let service_config = if cfg!(debug_assertions) { - "config/services_sample.toml" - } else { + let service_config = { "config/services.toml" }; diff --git a/src/web/tls/mod.rs b/src/web/tls/mod.rs index c0c566bf..56e9a7ad 100644 --- a/src/web/tls/mod.rs +++ b/src/web/tls/mod.rs @@ -8,6 +8,10 @@ pub fn load_certs(cert: &str, key: &str) -> ServerConfig { // init server config builder with safe defaults let config = ServerConfig::builder().with_no_client_auth(); + // Print cer and key + // println!("Using cert: {cert}"); + // println!("Using key: {key}"); + // load TLS key/cert files let cert_file = &mut BufReader::new(File::open(cert).expect("Could not open cert file")); let key_file = &mut BufReader::new(File::open(key).expect("Could not open key file")); diff --git a/static/css/input.css b/static/css/input.css index 6b9e93f9..25015562 100644 --- a/static/css/input.css +++ b/static/css/input.css @@ -1,51 +1,562 @@ -@import 'tailwindcss'; +@import "tailwindcss"; -/* - The default border color has changed to `currentColor` in Tailwind CSS v4, - so we've added these compatibility styles to make sure everything still - looks the same as it did with Tailwind CSS v3. +/* #region ----------------------------------------------- Base */ - If we ever want to remove these styles, we need to add an explicit border - color utility to any element that depends on these defaults. -*/ +body { + /* Colors - light */ + --cb-blue: #0f62fe; + --cb-blue-hover: #0353e9; + --cb-blue-active: #0043ce; + --cb-main: #393939; + --cb-main-weak: #4c4c4c; + --cb-main-strong: #161616; + --cb-soft-text: #bbbbbb; + --cb-soft-border: #e5e5e5; + --cb-soft-bg: #f4f4f4; + --cb-highlight: #fff7cc; + + /* Font styles */ + --cb-font-fam: "IBM Plex Sans", sans-serif; + --cb-font-size: 14px; + --cb-line-height: 18px; +} + +@media (prefers-color-scheme: dark) { + body { + /* Colors - dark */ + --cb-blue: #0f62fe; + --cb-blue-hover: #0353e9; + --cb-blue-active: #0043ce; + --cb-main: #393939; + --cb-main-weak: #4c4c4c; + --cb-main-strong: #161616; + --cb-soft-text: #bbbbbb; + --cb-soft-border: #e5e5e5; + --cb-soft-bg: #f4f4f4; + } +} + +/* Base styles to overwrite HTML defaults */ @layer base { - *, - ::after, - ::before, - ::backdrop, - ::file-selector-button { - border-color: var(--color-gray-200, currentColor); - } + p { + margin-bottom: 0.5rem; + } } -.menu_selected { - @apply bg-[#c6c6c6] dark:bg-[#4d5358] border-l-2 border-[#4589ff]; +/* Links */ +a.cb-link { + text-decoration: none; + cursor: pointer; + color: var(--cb-blue); + @apply hover:text-[var(--cb-blue-active)] + hover:underline + dark:text-[#73a0ff] + dark:hover:text-[#ffffff]; } -.mobile_menu_selected { - @apply border-l-4 border-[#4589ff]; +/* Set default border color */ +.border, +.border-t, +.border-b, +.border-l, +.border-r { + border-color: rgba(0, 0, 0, 0.1); + /* @apply dark:border-[rgba(255,255,255,.1)]; */ +} + +/* #endregion */ +/* #region ----------------------------------------------- Layout */ + +html { + font-size: 14px; + /* Disable elastic scroll which looks terrible with sticky nav */ + overscroll-behavior-y: none; +} +body { + display: flex; + flex-direction: column; + min-height: 100vh; + background: #ffffff; + @apply text-[var(--cb-main)] + dark:bg-[rgba(0,0,0,.85)] + text-slate-900 + dark:text-slate-200 + dark:text-[var(--cb-soft-bg)]; +} + +/* Sidenav + page content wrapper */ +#main { + min-height: 100%; + flex: 1; + padding-top: 0.5rem; + padding-right: 0.25rem; + @apply md:pl-65; +} +#main > div { + height: 100%; +} + +/* Page content grid wrapper */ +.cb_grid { + min-height: 100%; + @apply grid xl:grid-cols-3 lg:grid-cols-2 grid-cols-1; +} + +/* Side nav wrapper */ +#side_nav_wrap { + flex: 0 0; + position: fixed; + width: 16rem; + padding-top: 0.5rem; + background: var(--cb-soft-bg); + @apply dark:bg-[var(--cb-main)] + md:block hidden; +} + +/* Page columns */ +.page-column { + padding: 2rem; + margin: 0 0.25rem 0.5rem 0.25rem; + background: var(--cb-soft-bg); + @apply dark:bg-[var(--cb-main)]; +} + +/* Section headers */ +.section-header { + border-bottom: solid 1px var(--cb-soft-text); + font-weight: bold; + padding-bottom: 0.5rem; + margin-bottom: 2rem; + @apply dark:border-[rgba(255,255,255,.2)]; } +.section-header-right { + display: flex; + flex-direction: row; + justify-content: end; + flex-grow: 1; +} + +/* #endregion */ +/* #region ----------------------------------------------- Buttons */ .cb_button { - @apply bg-[#0050e6] hover:bg-blue-700 text-slate-200 - focus:ring-3 dark:focus:outline-hidden active:bg-[#002d9c] - dark:focus:ring-white focus:ring-[#0050e6]; + height: 3rem; + background: var(--cb-blue); + border: none; + color: #fff; + padding: 0 32px 0 16px; + font-family: var(--cb-font-fam); + font-size: var(--cb-font-size); + cursor: pointer; + + /* For icons */ + display: flex; + align-items: center; + justify-content: center; + gap: 0.5em; + + @apply hover:bg-[var(--cb-blue-hover)]; +} +.cb_button.secondary { + color: #fff; + background: var(--cb-main); + @apply dark:bg-[rgba(255,255,255,.1)] + hover:bg-[var(--cb-main-weak)] + dark:hover:bg-[rgba(255,255,255,.05)]; +} +.cb_button.tertiary { + background: transparent; + color: var(--cb-main); + border: 1px solid var(--cb-main); +} +.cb_button.tertiary:hover { + border-color: var(--cb-blue-hover); +} + +.cb-button-wrap { + display: flex; + flex-direction: row; + gap: 0.5rem; +} + +/* #endregion */ +/* #region ----------------------------------------------- Inputs */ + +/* Form labels */ +label { + font-size: var(--text-sm); + display: block; + margin-bottom: 0.25rem; + color: var(--cb-main-weak); + @apply dark:text-[var(--cb-soft-text)]; +} + +/* Text inputs & dropdown */ +select, +input:not([type="checkbox"]):not([type="radio"]) { + background: white; + height: 3rem; + padding: 0 1rem; + border-bottom: solid 1px var(--cb-main); + /* Text inputs are white so text should stay dark */ + @apply dark:text-[var(--cb-main)]; +} + +/* Text inputs & dropdown - focus */ +select:focus, +input:not([type="checkbox"]):not([type="radio"]):focus { + outline: solid 2px var(--cb-blue); + border-bottom-color: transparent; +} + +/* Text inputs & dropdown - icons */ +input:not([type="checkbox"]):not([type="radio"]) ~ .input-icon { + position: absolute; + right: 1em; + top: 50%; + margin-top: -8px; +} + +/* Grouped input + submit button */ +.input-submit > div { + display: flex; + gap: 0.5rem; +} + +/* #endregion */ +/* #region ----------------------------------------------- Tables */ + +.table-display { + width: calc(100% + 2rem); + padding: 0.5rem 1rem; + margin-left: -1rem; + margin-left: -1rem; + text-align: left; + background: white; + @apply dark:bg-[rgba(0,0,0,.3)]; +} + +/* Row borders */ +.table-display tr { + border-bottom: solid 1px var(--cb-soft-border); + @apply dark:border-[rgba(255,255,255,.1)]; +} +.table-display tr:not(.expandable):last-child, +.table-display tr.expandable:nth-last-child(2) { + border-bottom: none; +} + +/* Header */ +.table-display thead tr { + background: var(--cb-soft-border); + @apply dark:bg-[rgba(0,0,0,.4)]; +} + +/* Cells */ +.table-display td, +.table-display th { + padding: 0.5rem 1rem; +} + +/* Clickable rows */ +.table-display tr.clickable { + cursor: pointer; +} + +/* Expandable row */ +.table-display tr.expandable { + cursor: pointer; + position: relative; +} +.table-display tr.expandable:not(.expanded) + tr { + display: none; } -.cb_button_secondary { - @apply bg-[#ffffff] hover:bg-blue-700 hover:text-slate-200 text-slate-900 - focus:ring-3 dark:focus:outline-hidden active:bg-[#002d9c] active:text-[#ffffff] - dark:focus:ring-white focus:ring-[#0050e6]; +/* Expanded state */ +.table-display tr.expanded { + border-bottom: none; + font-weight: bold; +} +.table-display tr.expanded, +.table-display tr.expanded + tr { + position: relative; + @apply dark:bg-[rgba(255,255,255,0.05)]; +} +.table-display tr.expanded td::before, +.table-display tr.expanded + tr td::before { + content: ""; + display: block; + position: absolute; + top: 0; + left: 0; + width: 3px; + height: calc(100% + 1px); + background: var(--cb-blue); +} +.table-display tr:not(.expandable):last-child td::before { + /* Last row doesn't have bottom border */ + height: 100%; +} + +/* Expandable tray */ +.table-display tr.expandable + tr { + font-size: 0.9rem; + position: relative; +} +.table-display tr.expandable + tr td { + padding-bottom: 2rem; +} +.table-display tr.expandable + tr::after { + content: ""; + display: block; + position: absolute; + top: 0; + left: 1rem; + width: calc(100% - 2rem); + border-bottom: dashed 1px var(--cb-soft-border); + @apply dark:border-[rgba(255,255,255,.2)]; +} + +/* Code blocks */ +.table-display code { + margin: 0.25rem 0; +} + +/* Clickable / expandable hover */ +.table-display tr.clickable, +.table-display tr.expandable:not(.expanded) { + @apply hover:bg-[var(--cb-highlight)] + dark:hover:bg-[rgba(255,247,204,0.2)]; +} + +/* #endregion */ +/* #region ----------------------------------------------- Various UI Elements */ + +/** + * Subscription options + */ + +ul.sub-options li { + display: flex; + gap: 1rem; + height: 40px; + line-height: 40px; + cursor: pointer; + margin: 0 -1rem; + padding: 0 1rem; + @apply hover:bg-[rgba(255,255,255,.5)] + dark:hover:bg-[rgba(0,0,0,.2)]; +} +ul.sub-options li label { + flex: 1; + margin-bottom: 0; + font-size: var(--text-base); + user-select: none; + cursor: pointer; +} +ul.sub-options li:has(input:checked) { + background: white; + @apply dark:bg-[rgba(0,0,0,.3)]; +} + +/** + * Code blocks + */ + +code { + color: var(--cb-highlight); + position: relative; + cursor: pointer; + background: var(--cb-main); + @apply dark:bg-[rgba(0,0,0,.3)]; +} +code.block { + display: block; + border-radius: 3px; + padding: 0.7rem 1rem; +} +code .copy { + position: absolute; + z-index: 1; + top: 5px; + right: 8px; + text-align: right; + display: none; + color: white; +} +code .copy::before { + content: ""; + position: absolute; + z-index: -1; + top: 0; + right: 0; + bottom: 0; + left: 0; + background: var(--cb-main); + filter: blur(4px); +} +code.copied, +code.copied .copy::before { + animation: code-copied 120ms 3; + color: #9c9882; +} +code.copied .copy { + display: block; +} + +@media (hover: hover) { + code:not(.copied):hover { + background: var(--cb-main-strong); + } +} + +@keyframes code-copied { + 0% { + background: green; + } + 49% { + background: green; + } + 50% { + background: var(--cb-main); + } + 100% { + background: var(--cb-main); + } +} + +/* #endregion */ +/* #region ----------------------------------------------- Navigation */ + +/** + * Top navigation bar + */ + +#navigation { + background: var(--cb-main); + color: white; + position: sticky; + top: 0; + z-index: 10; + width: 100%; + flex: none; + @apply dark:bg-[var(--cb-main-strong)]; +} + +/** + * Desktop side nav + */ + +#menu_big .menu-item { + display: flex; + align-items: center; + gap: 1rem; + height: 3.5rem; + padding-left: 1.5rem; +} +#menu_big .menu-item.menu_selected { + pointer-events: none; + border-left: solid 3px var(--cb-blue); + background: rgba(0, 0, 0, 0.08); + @apply dark:bg-[rgba(0,0,0,.3)]; +} +#menu_big .menu-item:not(.menu_selected):hover { + @media (hover: hover) { + background: rgba(0, 0, 0, 0.04); + } +} + +/** + * Mobile side nav + */ + +#menu_button { + @apply relative + inline-flex + items-center + justify-center + p-2 + text-gray-400 + hover:text-white + cursor-pointer; +} +#menu_button:focus { + outline: none; + box-shadow: none; +} +#menu { + position: fixed; + flex-direction: column; + left: 0; + top: 3rem; + width: 100%; + box-shadow: 0 5px 20px rgba(0, 0, 0, 0.15); + /* padding-bottom: 1rem; */ + background: var(--cb-soft-bg); + @apply dark:bg-[#121619]; +} +#menu > a { + display: block; + padding: 0.75rem 1rem; + background: var(--cb-soft-bg); + @apply dark:bg-[#121619] + hover:bg-[rgba(0,0,0,.2)] + dark:hover:bg-[#4d5358]; +} +#menu::before { + content: ""; + position: fixed; + top: 0; + left: 0; + bottom: 0; + right: 0; + z-index: -1; + background: rgba(0, 0, 0, 0.7); +} +.mobile_menu_selected { + border-left: 4px solid var(--cb-blue); +} + +/* #endregion */ +/* #region ----------------------------------------------- Animations */ + +.cb-blink { + animation: blink 2s infinite; +} + +@keyframes blink { + 0% { + opacity: 1; + } + 49% { + opacity: 1; + } + 50% { + opacity: 0.3; + } + 100% { + opacity: 0.3; + } +} + +/* #endregion */ +/* #region ----------------------------------------------- Various */ + +.soft-text { + color: var(--cb-soft-text); + @apply dark:text-[rgba(255,255,255,.4)]; } .htmx-indicator { - opacity:0; + opacity: 0; } .htmx-request .htmx-indicator { - opacity:1; + opacity: 1; transition: opacity 200ms ease-in; } .htmx-request.htmx-indicator { - opacity:1; + opacity: 1; transition: opacity 200ms ease-in; } + +/* #endregion */ diff --git a/static/css/output.css b/static/css/output.css index a29c48ea..cad67391 100644 --- a/static/css/output.css +++ b/static/css/output.css @@ -1,2 +1,2 @@ -/*! tailwindcss v4.1.4 | MIT License | https://tailwindcss.com */ -@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-leading:initial;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-backdrop-blur:initial;--tw-backdrop-brightness:initial;--tw-backdrop-contrast:initial;--tw-backdrop-grayscale:initial;--tw-backdrop-hue-rotate:initial;--tw-backdrop-invert:initial;--tw-backdrop-opacity:initial;--tw-backdrop-saturate:initial;--tw-backdrop-sepia:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-900:oklch(39.3% .095 152.535);--color-blue-500:oklch(62.3% .214 259.815);--color-blue-700:oklch(48.8% .243 264.376);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-900:oklch(20.8% .042 265.755);--color-gray-200:oklch(92.8% .006 264.531);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-gray-700:oklch(37.3% .034 259.733);--color-black:#000;--color-white:#fff;--spacing:.25rem;--container-7xl:80rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25/1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--font-weight-medium:500;--font-weight-bold:700;--leading-tight:1.25;--radius-md:.375rem;--drop-shadow-md:0 3px 3px #0000001f;--ease-in:cubic-bezier(.4,0,1,1);--animate-spin:spin 1s linear infinite;--animate-bounce:bounce 1s infinite;--blur-xs:4px;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}*,:after,:before,::backdrop{border-color:var(--color-gray-200,currentColor)}::file-selector-button{border-color:var(--color-gray-200,currentColor)}}@layer components;@layer utilities{.visible{visibility:visible}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.sticky{position:sticky}.-inset-0\.5{inset:calc(var(--spacing)*-.5)}.inset-y-0{inset-block:calc(var(--spacing)*0)}.top-0{top:calc(var(--spacing)*0)}.top-12{top:calc(var(--spacing)*12)}.left-0{left:calc(var(--spacing)*0)}.z-10{z-index:10}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.m-0{margin:calc(var(--spacing)*0)}.mx-3{margin-inline:calc(var(--spacing)*3)}.mx-5{margin-inline:calc(var(--spacing)*5)}.mx-auto{margin-inline:auto}.my-2{margin-block:calc(var(--spacing)*2)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mr-1{margin-right:calc(var(--spacing)*1)}.mr-2{margin-right:calc(var(--spacing)*2)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.ml-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.contents{display:contents}.flex{display:flex}.grid{display:grid}.hidden{display:none}.inline{display:inline}.inline-flex{display:inline-flex}.table{display:table}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-16{height:calc(var(--spacing)*16)}.h-\[42px\]{height:42px}.h-\[50px\]{height:50px}.h-full{height:100%}.max-h-80{max-height:calc(var(--spacing)*80)}.min-h-60{min-height:calc(var(--spacing)*60)}.min-h-96{min-height:calc(var(--spacing)*96)}.min-h-\[calc\(100vh-3rem\)\]{min-height:calc(100vh - 3rem)}.min-h-full{min-height:100%}.min-h-screen{min-height:100vh}.w-16{width:calc(var(--spacing)*16)}.w-56{width:calc(var(--spacing)*56)}.w-64{width:calc(var(--spacing)*64)}.w-\[220px\]{width:220px}.w-\[384px\]{width:384px}.w-full{width:100%}.max-w-7xl{max-width:var(--container-7xl)}.min-w-52{min-width:calc(var(--spacing)*52)}.min-w-full{min-width:100%}.flex-1{flex:1}.flex-none{flex:none}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-bounce{animation:var(--animate-bounce)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize{resize:both}.list-none{list-style-type:none}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.self-center{align-self:center}.overflow-hidden{overflow:hidden}.overflow-y-auto{overflow-y:auto}.rounded-full{border-radius:3.40282e38px}.rounded-md{border-radius:var(--radius-md)}.rounded-br-md{border-bottom-right-radius:var(--radius-md)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-t-4{border-top-style:var(--tw-border-style);border-top-width:4px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-4{border-bottom-style:var(--tw-border-style);border-bottom-width:4px}.border-l-4{border-left-style:var(--tw-border-style);border-left-width:4px}.border-\[\#4589ff\]{border-color:#4589ff}.border-\[\#e0e0e0\]{border-color:#e0e0e0}.border-blue-500{border-color:var(--color-blue-500)}.bg-\[\#f4f4f4\]{background-color:#f4f4f4}.bg-\[\#f4f4f4\]\/70{background-color:oklab(96.7153% -5.96046e-8 5.96046e-8/.7)}.bg-\[\#ffffff\]{background-color:#fff}.bg-inherit{background-color:inherit}.bg-slate-300{background-color:var(--color-slate-300)}.bg-white{background-color:var(--color-white)}.p-0{padding:calc(var(--spacing)*0)}.p-1{padding:calc(var(--spacing)*1)}.p-2{padding:calc(var(--spacing)*2)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.py-6{padding-block:calc(var(--spacing)*6)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-10{padding-top:calc(var(--spacing)*10)}.pr-2{padding-right:calc(var(--spacing)*2)}.pr-8{padding-right:calc(var(--spacing)*8)}.pb-0\.5{padding-bottom:calc(var(--spacing)*.5)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pb-5{padding-bottom:calc(var(--spacing)*5)}.pb-10{padding-bottom:calc(var(--spacing)*10)}.pb-20{padding-bottom:calc(var(--spacing)*20)}.pl-1{padding-left:calc(var(--spacing)*1)}.pl-2{padding-left:calc(var(--spacing)*2)}.pl-4{padding-left:calc(var(--spacing)*4)}.text-center{text-align:center}.text-left{text-align:left}.align-top{vertical-align:top}.font-mono{font-family:var(--font-mono)}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.leading-tight{--tw-leading:var(--leading-tight);line-height:var(--leading-tight)}.font-bold{--tw-font-weight:var(--font-weight-bold);font-weight:var(--font-weight-bold)}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.break-all{word-break:break-all}.text-black{color:var(--color-black)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-green-600{color:var(--color-green-600)}.text-green-900{color:var(--color-green-900)}.text-red-600{color:var(--color-red-600)}.text-slate-900{color:var(--color-slate-900)}.capitalize{text-transform:capitalize}.ring{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.drop-shadow-md{--tw-drop-shadow-size:drop-shadow(0 3px 3px var(--tw-drop-shadow-color,#0000001f));--tw-drop-shadow:drop-shadow(var(--drop-shadow-md));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,)}.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-xs{--tw-backdrop-blur:blur(var(--blur-xs));-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,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.last\:border-b-0:last-child{border-bottom-style:var(--tw-border-style);border-bottom-width:0}.focus-within\:border-transparent:focus-within{border-color:#0000}.focus-within\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-within\:ring-blue-500:focus-within{--tw-ring-color:var(--color-blue-500)}.focus-within\:outline-none:focus-within{--tw-outline-style:none;outline-style:none}@media (hover:hover){.hover\:border-gray-400:hover{border-color:var(--color-gray-400)}.hover\:bg-\[\#c6c6c6\]:hover{background-color:#c6c6c6}.hover\:bg-gray-700:hover{background-color:var(--color-gray-700)}.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:border-blue-500:focus{border-color:var(--color-blue-500)}.focus\:ring-2:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\:ring-white:focus{--tw-ring-color:var(--color-white)}.focus\:outline-hidden:focus{--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.focus\:outline-hidden:focus{outline-offset:2px;outline:2px solid #0000}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}.focus\:ring-inset:focus{--tw-ring-inset:inset}@media not all and (min-width:64rem){.max-lg\:hidden{display:none}}@media not all and (min-width:40rem){.max-sm\:hidden{display:none}}@media (min-width:40rem){.sm\:items-stretch{align-items:stretch}.sm\:px-6{padding-inline:calc(var(--spacing)*6)}}@media (min-width:48rem){.md\:block{display:block}.md\:hidden{display:none}.md\:w-\[384px\]{width:384px}.md\:justify-center{justify-content:center}.md\:justify-start{justify-content:flex-start}.md\:pt-0{padding-top:calc(var(--spacing)*0)}.md\:pb-0{padding-bottom:calc(var(--spacing)*0)}.md\:pl-56{padding-left:calc(var(--spacing)*56)}.md\:pl-64{padding-left:calc(var(--spacing)*64)}.md\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}}@media (min-width:64rem){.lg\:w-\[300px\]{width:300px}.lg\:w-\[500px\]{width:500px}.lg\:grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.lg\:px-8{padding-inline:calc(var(--spacing)*8)}.lg\:py-2{padding-block:calc(var(--spacing)*2)}}@media (min-width:80rem){.xl\:my-0{margin-block:calc(var(--spacing)*0)}.xl\:grid-cols-3{grid-template-columns:repeat(3,minmax(0,1fr))}}@media (prefers-color-scheme:dark){.dark\:border-\[\#4d5358\]{border-color:#4d5358}.dark\:bg-\[\#343a3f\]{background-color:#343a3f}.dark\:bg-\[\#21272a\]{background-color:#21272a}.dark\:bg-\[\#42484e\]{background-color:#42484e}.dark\:bg-\[\#121619\]{background-color:#121619}.dark\:bg-\[\#121619\]\/70{background-color:oklab(19.7278% -.00427963 -.00752458/.7)}.dark\:text-gray-400{color:var(--color-gray-400)}.dark\:text-green-700{color:var(--color-green-700)}.dark\:text-red-500{color:var(--color-red-500)}.dark\:text-slate-200{color:var(--color-slate-200)}@media (hover:hover){.dark\:hover\:bg-\[\#4d5358\]:hover{background-color:#4d5358}}}}.menu_selected{border-left-style:var(--tw-border-style);background-color:#c6c6c6;border-color:#4589ff;border-left-width:2px}@media (prefers-color-scheme:dark){.menu_selected{background-color:#4d5358}}.mobile_menu_selected{border-left-style:var(--tw-border-style);border-color:#4589ff;border-left-width:4px}.cb_button{color:var(--color-slate-200);background-color:#0050e6}@media (hover:hover){.cb_button:hover{background-color:var(--color-blue-700)}}.cb_button:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:#0050e6}.cb_button:active{background-color:#002d9c}@media (prefers-color-scheme:dark){.cb_button:focus{--tw-ring-color:var(--color-white);--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.cb_button:focus{outline-offset:2px;outline:2px solid #0000}}}.cb_button_secondary{color:var(--color-slate-900);background-color:#fff}@media (hover:hover){.cb_button_secondary:hover{background-color:var(--color-blue-700);color:var(--color-slate-200)}}.cb_button_secondary:focus{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(3px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow);--tw-ring-color:#0050e6}.cb_button_secondary:active{color:#fff;background-color:#002d9c}@media (prefers-color-scheme:dark){.cb_button_secondary:focus{--tw-ring-color:var(--color-white);--tw-outline-style:none;outline-style:none}@media (forced-colors:active){.cb_button_secondary:focus{outline-offset:2px;outline:2px solid #0000}}}.htmx-indicator{opacity:0}.htmx-request .htmx-indicator,.htmx-request.htmx-indicator{opacity:1;transition:opacity .2s ease-in}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-leading{syntax:"*";inherits:false}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-backdrop-blur{syntax:"*";inherits:false}@property --tw-backdrop-brightness{syntax:"*";inherits:false}@property --tw-backdrop-contrast{syntax:"*";inherits:false}@property --tw-backdrop-grayscale{syntax:"*";inherits:false}@property --tw-backdrop-hue-rotate{syntax:"*";inherits:false}@property --tw-backdrop-invert{syntax:"*";inherits:false}@property --tw-backdrop-opacity{syntax:"*";inherits:false}@property --tw-backdrop-saturate{syntax:"*";inherits:false}@property --tw-backdrop-sepia{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}} \ No newline at end of file +/*! tailwindcss v4.1.12 | MIT License | https://tailwindcss.com */ +@layer properties{@supports (((-webkit-hyphens:none)) and (not (margin-trim:inline))) or ((-moz-orient:inline) and (not (color:rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-scale-x:1;--tw-scale-y:1;--tw-scale-z:1;--tw-rotate-x:initial;--tw-rotate-y:initial;--tw-rotate-z:initial;--tw-skew-x:initial;--tw-skew-y:initial;--tw-border-style:solid;--tw-font-weight:initial;--tw-shadow:0 0 #0000;--tw-shadow-color:initial;--tw-shadow-alpha:100%;--tw-inset-shadow:0 0 #0000;--tw-inset-shadow-color:initial;--tw-inset-shadow-alpha:100%;--tw-ring-color:initial;--tw-ring-shadow:0 0 #0000;--tw-inset-ring-color:initial;--tw-inset-ring-shadow:0 0 #0000;--tw-ring-inset:initial;--tw-ring-offset-width:0px;--tw-ring-offset-color:#fff;--tw-ring-offset-shadow:0 0 #0000;--tw-outline-style:solid;--tw-blur:initial;--tw-brightness:initial;--tw-contrast:initial;--tw-grayscale:initial;--tw-hue-rotate:initial;--tw-invert:initial;--tw-opacity:initial;--tw-saturate:initial;--tw-sepia:initial;--tw-drop-shadow:initial;--tw-drop-shadow-color:initial;--tw-drop-shadow-alpha:100%;--tw-drop-shadow-size:initial;--tw-ease:initial}}}@layer theme{:root,:host{--font-sans:ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji";--font-mono:ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace;--color-red-500:oklch(63.7% .237 25.331);--color-red-600:oklch(57.7% .245 27.325);--color-green-600:oklch(62.7% .194 149.214);--color-green-700:oklch(52.7% .154 150.069);--color-green-900:oklch(39.3% .095 152.535);--color-blue-500:oklch(62.3% .214 259.815);--color-slate-200:oklch(92.9% .013 255.508);--color-slate-300:oklch(86.9% .022 252.894);--color-slate-900:oklch(20.8% .042 265.755);--color-gray-400:oklch(70.7% .022 261.325);--color-gray-500:oklch(55.1% .027 264.364);--color-black:#000;--color-white:#fff;--spacing:.25rem;--text-xs:.75rem;--text-xs--line-height:calc(1/.75);--text-sm:.875rem;--text-sm--line-height:calc(1.25/.875);--text-base:1rem;--text-base--line-height:calc(1.5/1);--text-lg:1.125rem;--text-lg--line-height:calc(1.75/1.125);--text-xl:1.25rem;--text-xl--line-height:calc(1.75/1.25);--text-2xl:1.5rem;--text-2xl--line-height:calc(2/1.5);--text-3xl:1.875rem;--text-3xl--line-height:calc(2.25/1.875);--text-4xl:2.25rem;--text-4xl--line-height:calc(2.5/2.25);--font-weight-medium:500;--ease-in:cubic-bezier(.4,0,1,1);--animate-spin:spin 1s linear infinite;--animate-bounce:bounce 1s infinite;--default-transition-duration:.15s;--default-transition-timing-function:cubic-bezier(.4,0,.2,1);--default-font-family:var(--font-sans);--default-mono-font-family:var(--font-mono)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family,ui-sans-serif,system-ui,sans-serif,"Apple Color Emoji","Segoe UI Emoji","Segoe UI Symbol","Noto Color Emoji");font-feature-settings:var(--default-font-feature-settings,normal);font-variation-settings:var(--default-font-variation-settings,normal);-webkit-tap-highlight-color:transparent}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,"Liberation Mono","Courier New",monospace);font-feature-settings:var(--default-mono-font-feature-settings,normal);font-variation-settings:var(--default-mono-font-variation-settings,normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1}@supports (not ((-webkit-appearance:-apple-pay-button))) or (contain-intrinsic-size:1px){::placeholder{color:currentColor}@supports (color:color-mix(in lab, red, red)){::placeholder{color:color-mix(in oklab,currentcolor 50%,transparent)}}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}::-webkit-calendar-picker-indicator{line-height:1}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}p{margin-bottom:.5rem}}@layer components;@layer utilities{.visible{visibility:visible}.sr-only{clip:rect(0,0,0,0);white-space:nowrap;border-width:0;width:1px;height:1px;margin:-1px;padding:0;position:absolute;overflow:hidden}.absolute{position:absolute}.fixed{position:fixed}.relative{position:relative}.static{position:static}.-inset-0\.5{inset:calc(var(--spacing)*-.5)}.-bottom-8{bottom:calc(var(--spacing)*-8)}.left-0{left:calc(var(--spacing)*0)}.left-4{left:calc(var(--spacing)*4)}.col-span-1{grid-column:span 1/span 1}.col-start-1{grid-column-start:1}.col-start-2{grid-column-start:2}.row-start-1{grid-row-start:1}.container{width:100%}@media (min-width:40rem){.container{max-width:40rem}}@media (min-width:48rem){.container{max-width:48rem}}@media (min-width:64rem){.container{max-width:64rem}}@media (min-width:80rem){.container{max-width:80rem}}@media (min-width:96rem){.container{max-width:96rem}}.mx-3{margin-inline:calc(var(--spacing)*3)}.mx-5{margin-inline:calc(var(--spacing)*5)}.mx-auto{margin-inline:auto}.-mt-4{margin-top:calc(var(--spacing)*-4)}.mt-2{margin-top:calc(var(--spacing)*2)}.mt-4{margin-top:calc(var(--spacing)*4)}.mt-6{margin-top:calc(var(--spacing)*6)}.mr-1{margin-right:calc(var(--spacing)*1)}.mb-2{margin-bottom:calc(var(--spacing)*2)}.mb-4{margin-bottom:calc(var(--spacing)*4)}.mb-6{margin-bottom:calc(var(--spacing)*6)}.ml-2{margin-left:calc(var(--spacing)*2)}.block{display:block}.contents{display:contents}.flex{display:flex}.hidden{display:none}.inline{display:inline}.inline-block{display:inline-block}.table{display:table}.size-6{width:calc(var(--spacing)*6);height:calc(var(--spacing)*6)}.h-10{height:calc(var(--spacing)*10)}.h-12{height:calc(var(--spacing)*12)}.h-\[42px\]{height:42px}.h-\[50px\]{height:50px}.min-h-\[calc\(100vh-3rem\)\]{min-height:calc(100vh - 3rem)}.min-h-full{min-height:100%}.w-16{width:calc(var(--spacing)*16)}.w-\[220px\]{width:220px}.w-\[384px\]{width:384px}.w-full{width:100%}.min-w-full{min-width:100%}.flex-1{flex:1}.flex-none{flex:none}.shrink-0{flex-shrink:0}.flex-grow,.grow{flex-grow:1}.scale-150{--tw-scale-x:150%;--tw-scale-y:150%;--tw-scale-z:150%;scale:var(--tw-scale-x)var(--tw-scale-y)}.transform{transform:var(--tw-rotate-x,)var(--tw-rotate-y,)var(--tw-rotate-z,)var(--tw-skew-x,)var(--tw-skew-y,)}.animate-bounce{animation:var(--animate-bounce)}.animate-spin{animation:var(--animate-spin)}.cursor-pointer{cursor:pointer}.resize{resize:both}.grid-cols-1{grid-template-columns:repeat(1,minmax(0,1fr))}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-rows-2{grid-template-rows:repeat(2,minmax(0,1fr))}.flex-col{flex-direction:column}.flex-row{flex-direction:row}.flex-wrap{flex-wrap:wrap}.items-center{align-items:center}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.justify-start{justify-content:flex-start}.gap-2{gap:calc(var(--spacing)*2)}.gap-8{gap:calc(var(--spacing)*8)}.border{border-style:var(--tw-border-style);border-width:1px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-\[\#e0e0e0\]{border-color:#e0e0e0}.bg-\[\#f4f4f4\]{background-color:#f4f4f4}.bg-slate-300{background-color:var(--color-slate-300)}.bg-white{background-color:var(--color-white)}.p-1{padding:calc(var(--spacing)*1)}.p-8{padding:calc(var(--spacing)*8)}.px-1{padding-inline:calc(var(--spacing)*1)}.px-2{padding-inline:calc(var(--spacing)*2)}.px-3{padding-inline:calc(var(--spacing)*3)}.px-4{padding-inline:calc(var(--spacing)*4)}.px-6{padding-inline:calc(var(--spacing)*6)}.py-2{padding-block:calc(var(--spacing)*2)}.py-3{padding-block:calc(var(--spacing)*3)}.py-4{padding-block:calc(var(--spacing)*4)}.pt-2{padding-top:calc(var(--spacing)*2)}.pt-3{padding-top:calc(var(--spacing)*3)}.pt-4{padding-top:calc(var(--spacing)*4)}.pt-10{padding-top:calc(var(--spacing)*10)}.pr-2{padding-right:calc(var(--spacing)*2)}.pb-4{padding-bottom:calc(var(--spacing)*4)}.pb-5{padding-bottom:calc(var(--spacing)*5)}.pb-10{padding-bottom:calc(var(--spacing)*10)}.pb-20{padding-bottom:calc(var(--spacing)*20)}.pl-1{padding-left:calc(var(--spacing)*1)}.pl-2{padding-left:calc(var(--spacing)*2)}.text-center{text-align:center}.text-right{text-align:right}.align-top{vertical-align:top}.text-3xl{font-size:var(--text-3xl);line-height:var(--tw-leading,var(--text-3xl--line-height))}.text-base{font-size:var(--text-base);line-height:var(--tw-leading,var(--text-base--line-height))}.text-lg{font-size:var(--text-lg);line-height:var(--tw-leading,var(--text-lg--line-height))}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading,var(--text-sm--line-height))}.text-xl{font-size:var(--text-xl);line-height:var(--tw-leading,var(--text-xl--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading,var(--text-xs--line-height))}.font-medium{--tw-font-weight:var(--font-weight-medium);font-weight:var(--font-weight-medium)}.break-all{word-break:break-all}.text-black{color:var(--color-black)}.text-gray-400{color:var(--color-gray-400)}.text-gray-500{color:var(--color-gray-500)}.text-green-600{color:var(--color-green-600)}.text-green-900{color:var(--color-green-900)}.text-red-600{color:var(--color-red-600)}.text-white{color:var(--color-white)}.capitalize{text-transform:capitalize}.opacity-50{opacity:.5}.ring{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(1px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.outline{outline-style:var(--tw-outline-style);outline-width:1px}.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,)}.transition{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to,opacity,box-shadow,transform,translate,scale,rotate,filter,-webkit-backdrop-filter,backdrop-filter,display,visibility,content-visibility,overlay,pointer-events;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.transition-all{transition-property:all;transition-timing-function:var(--tw-ease,var(--default-transition-timing-function));transition-duration:var(--tw-duration,var(--default-transition-duration))}.ease-in{--tw-ease:var(--ease-in);transition-timing-function:var(--ease-in)}.focus-within\:border-transparent:focus-within{border-color:#0000}.focus-within\:ring-2:focus-within{--tw-ring-shadow:var(--tw-ring-inset,)0 0 0 calc(2px + var(--tw-ring-offset-width))var(--tw-ring-color,currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus-within\:ring-blue-500:focus-within{--tw-ring-color:var(--color-blue-500)}.focus-within\:outline-none:focus-within{--tw-outline-style:none;outline-style:none}@media (hover:hover){.hover\:text-white:hover{color:var(--color-white)}.hover\:underline:hover{text-decoration-line:underline}}.focus\:outline-none:focus{--tw-outline-style:none;outline-style:none}@media not all and (min-width:64rem){.max-lg\:hidden{display:none}}@media not all and (min-width:40rem){.max-sm\:hidden{display:none}}@media (min-width:40rem){.sm\:items-stretch{align-items:stretch}}@media (min-width:48rem){.md\:col-start-1{grid-column-start:1}.md\:row-start-2{grid-row-start:2}.md\:hidden{display:none}.md\:w-\[384px\]{width:384px}.md\:justify-center{justify-content:center}.md\:justify-start{justify-content:flex-start}.md\:pt-0{padding-top:calc(var(--spacing)*0)}.md\:pb-0{padding-bottom:calc(var(--spacing)*0)}.md\:text-2xl{font-size:var(--text-2xl);line-height:var(--tw-leading,var(--text-2xl--line-height))}.md\:text-4xl{font-size:var(--text-4xl);line-height:var(--tw-leading,var(--text-4xl--line-height))}}@media (min-width:64rem){.lg\:col-start-1{grid-column-start:1}.lg\:col-start-2{grid-column-start:2}.lg\:block{display:block}.lg\:hidden{display:none}.lg\:w-\[300px\]{width:300px}.lg\:w-\[500px\]{width:500px}}@media (min-width:80rem){.xl\:col-span-2{grid-column:span 2/span 2}.xl\:col-start-2{grid-column-start:2}.xl\:col-start-3{grid-column-start:3}.xl\:row-span-2{grid-row:span 2/span 2}.xl\:row-start-1{grid-row-start:1}.xl\:my-0{margin-block:calc(var(--spacing)*0)}}@media (prefers-color-scheme:dark){.dark\:border-\[\#4d5358\]{border-color:#4d5358}.dark\:bg-\[\#343a3f\]{background-color:#343a3f}.dark\:bg-\[\#42484e\]{background-color:#42484e}.dark\:text-gray-400{color:var(--color-gray-400)}.dark\:text-green-700{color:var(--color-green-700)}.dark\:text-red-500{color:var(--color-red-500)}}}body{--cb-blue:#0f62fe;--cb-blue-hover:#0353e9;--cb-blue-active:#0043ce;--cb-main:#393939;--cb-main-weak:#4c4c4c;--cb-main-strong:#161616;--cb-soft-text:#bbb;--cb-soft-border:#e5e5e5;--cb-soft-bg:#f4f4f4;--cb-highlight:#fff7cc;--cb-font-fam:"IBM Plex Sans",sans-serif;--cb-font-size:14px;--cb-line-height:18px}@media (prefers-color-scheme:dark){body{--cb-blue:#0f62fe;--cb-blue-hover:#0353e9;--cb-blue-active:#0043ce;--cb-main:#393939;--cb-main-weak:#4c4c4c;--cb-main-strong:#161616;--cb-soft-text:#bbb;--cb-soft-border:#e5e5e5;--cb-soft-bg:#f4f4f4}}a.cb-link{cursor:pointer;color:var(--cb-blue);text-decoration:none}@media (hover:hover){a.cb-link:hover{color:var(--cb-blue-active);text-decoration-line:underline}}@media (prefers-color-scheme:dark){a.cb-link{color:#73a0ff}@media (hover:hover){a.cb-link:hover{color:#fff}}}.border,.border-t,.border-b,.border-l,.border-r{border-color:#0000001a}html{overscroll-behavior-y:none;font-size:14px}body{min-height:100vh;color:var(--color-slate-900);background:#fff;flex-direction:column;display:flex}@media (prefers-color-scheme:dark){body{color:var(--color-slate-200);background-color:#000000d9}}#main{flex:1;min-height:100%;padding-top:.5rem;padding-right:.25rem}@media (min-width:48rem){#main{padding-left:calc(var(--spacing)*65)}}#main>div{height:100%}.cb_grid{grid-template-columns:repeat(1,minmax(0,1fr));min-height:100%;display:grid}@media (min-width:64rem){.cb_grid{grid-template-columns:repeat(2,minmax(0,1fr))}}@media (min-width:80rem){.cb_grid{grid-template-columns:repeat(3,minmax(0,1fr))}}#side_nav_wrap{background:var(--cb-soft-bg);flex:0 0;width:16rem;padding-top:.5rem;display:none;position:fixed}@media (min-width:48rem){#side_nav_wrap{display:block}}@media (prefers-color-scheme:dark){#side_nav_wrap{background-color:var(--cb-main)}}.page-column{background:var(--cb-soft-bg);margin:0 .25rem .5rem;padding:2rem}@media (prefers-color-scheme:dark){.page-column{background-color:var(--cb-main)}}.section-header{border-bottom:solid 1px var(--cb-soft-text);margin-bottom:2rem;padding-bottom:.5rem;font-weight:700}@media (prefers-color-scheme:dark){.section-header{border-color:#fff3}}.section-header-right{flex-direction:row;flex-grow:1;justify-content:end;display:flex}.cb_button{background:var(--cb-blue);color:#fff;height:3rem;font-family:var(--cb-font-fam);font-size:var(--cb-font-size);cursor:pointer;border:none;justify-content:center;align-items:center;gap:.5em;padding:0 32px 0 16px;display:flex}@media (hover:hover){.cb_button:hover{background-color:var(--cb-blue-hover)}}.cb_button.secondary{color:#fff;background:var(--cb-main)}@media (hover:hover){.cb_button.secondary:hover{background-color:var(--cb-main-weak)}}@media (prefers-color-scheme:dark){.cb_button.secondary{background-color:#ffffff1a}@media (hover:hover){.cb_button.secondary:hover{background-color:#ffffff0d}}}.cb_button.tertiary{color:var(--cb-main);border:1px solid var(--cb-main);background:0 0}.cb_button.tertiary:hover{border-color:var(--cb-blue-hover)}.cb-button-wrap{flex-direction:row;gap:.5rem;display:flex}label{font-size:var(--text-sm);color:var(--cb-main-weak);margin-bottom:.25rem;display:block}@media (prefers-color-scheme:dark){label{color:var(--cb-soft-text)}}select,input:not([type=checkbox]):not([type=radio]){border-bottom:solid 1px var(--cb-main);background:#fff;height:3rem;padding:0 1rem}@media (prefers-color-scheme:dark){select,input:not([type=checkbox]):not([type=radio]){color:var(--cb-main)}}select:focus,input:not([type=checkbox]):not([type=radio]):focus{outline:solid 2px var(--cb-blue);border-bottom-color:#0000}input:not([type=checkbox]):not([type=radio])~.input-icon{margin-top:-8px;position:absolute;top:50%;right:1em}.input-submit>div{gap:.5rem;display:flex}.table-display{text-align:left;background:#fff;width:calc(100% + 2rem);margin-left:-1rem;padding:.5rem 1rem}@media (prefers-color-scheme:dark){.table-display{background-color:#0000004d}}.table-display tr{border-bottom:solid 1px var(--cb-soft-border)}@media (prefers-color-scheme:dark){.table-display tr{border-color:#ffffff1a}}.table-display tr:not(.expandable):last-child,.table-display tr.expandable:nth-last-child(2){border-bottom:none}.table-display thead tr{background:var(--cb-soft-border)}@media (prefers-color-scheme:dark){.table-display thead tr{background-color:#0006}}.table-display td,.table-display th{padding:.5rem 1rem}.table-display tr.clickable{cursor:pointer}.table-display tr.expandable{cursor:pointer;position:relative}.table-display tr.expandable:not(.expanded)+tr{display:none}.table-display tr.expanded{border-bottom:none;font-weight:700}.table-display tr.expanded,.table-display tr.expanded+tr{position:relative}@media (prefers-color-scheme:dark){.table-display tr.expanded,.table-display tr.expanded+tr{background-color:#ffffff0d}}.table-display tr.expanded td:before,.table-display tr.expanded+tr td:before{content:"";background:var(--cb-blue);width:3px;height:calc(100% + 1px);display:block;position:absolute;top:0;left:0}.table-display tr:not(.expandable):last-child td:before{height:100%}.table-display tr.expandable+tr{font-size:.9rem;position:relative}.table-display tr.expandable+tr td{padding-bottom:2rem}.table-display tr.expandable+tr:after{content:"";border-bottom:dashed 1px var(--cb-soft-border);width:calc(100% - 2rem);display:block;position:absolute;top:0;left:1rem}@media (prefers-color-scheme:dark){.table-display tr.expandable+tr:after{border-color:#fff3}}.table-display code{margin:.25rem 0}@media (hover:hover){:is(.table-display tr.clickable,.table-display tr.expandable:not(.expanded)):hover{background-color:var(--cb-highlight)}}@media (prefers-color-scheme:dark){@media (hover:hover){:is(.table-display tr.clickable,.table-display tr.expandable:not(.expanded)):hover{background-color:#fff7cc33}}}ul.sub-options li{cursor:pointer;gap:1rem;height:40px;margin:0 -1rem;padding:0 1rem;line-height:40px;display:flex}@media (hover:hover){ul.sub-options li:hover{background-color:#ffffff80}}@media (prefers-color-scheme:dark){@media (hover:hover){ul.sub-options li:hover{background-color:#0003}}}ul.sub-options li label{font-size:var(--text-base);-webkit-user-select:none;user-select:none;cursor:pointer;flex:1;margin-bottom:0}ul.sub-options li:has(input:checked){background:#fff}@media (prefers-color-scheme:dark){ul.sub-options li:has(input:checked){background-color:#0000004d}}code{color:var(--cb-highlight);cursor:pointer;background:var(--cb-main);position:relative}@media (prefers-color-scheme:dark){code{background-color:#0000004d}}code.block{border-radius:3px;padding:.7rem 1rem;display:block}code .copy{z-index:1;text-align:right;color:#fff;display:none;position:absolute;top:5px;right:8px}code .copy:before{content:"";z-index:-1;background:var(--cb-main);filter:blur(4px);position:absolute;inset:0}code.copied,code.copied .copy:before{color:#9c9882;animation:.12s 3 code-copied}code.copied .copy{display:block}@media (hover:hover){code:not(.copied):hover{background:var(--cb-main-strong)}}@keyframes code-copied{0%{background:green}49%{background:green}50%{background:var(--cb-main)}to{background:var(--cb-main)}}#navigation{background:var(--cb-main);color:#fff;z-index:10;flex:none;width:100%;position:sticky;top:0}@media (prefers-color-scheme:dark){#navigation{background-color:var(--cb-main-strong)}}#menu_big .menu-item{align-items:center;gap:1rem;height:3.5rem;padding-left:1.5rem;display:flex}#menu_big .menu-item.menu_selected{pointer-events:none;border-left:solid 3px var(--cb-blue);background:#00000014}@media (prefers-color-scheme:dark){#menu_big .menu-item.menu_selected{background-color:#0000004d}}@media (hover:hover){#menu_big .menu-item:not(.menu_selected):hover{background:#0000000a}}#menu_button{cursor:pointer;padding:calc(var(--spacing)*2);color:var(--color-gray-400);justify-content:center;align-items:center;display:inline-flex;position:relative}@media (hover:hover){#menu_button:hover{color:var(--color-white)}}#menu_button:focus{box-shadow:none;outline:none}#menu{background:var(--cb-soft-bg);flex-direction:column;width:100%;position:fixed;top:3rem;left:0;box-shadow:0 5px 20px #00000026}@media (prefers-color-scheme:dark){#menu{background-color:#121619}}#menu>a{background:var(--cb-soft-bg);padding:.75rem 1rem;display:block}@media (hover:hover){#menu>a:hover{background-color:#0003}}@media (prefers-color-scheme:dark){#menu>a{background-color:#121619}@media (hover:hover){#menu>a:hover{background-color:#4d5358}}}#menu:before{content:"";z-index:-1;background:#000000b3;position:fixed;inset:0}.mobile_menu_selected{border-left:4px solid var(--cb-blue)}.cb-blink{animation:2s infinite blink}@keyframes blink{0%{opacity:1}49%{opacity:1}50%{opacity:.3}to{opacity:.3}}.soft-text{color:var(--cb-soft-text)}@media (prefers-color-scheme:dark){.soft-text{color:#fff6}}.htmx-indicator{opacity:0}.htmx-request .htmx-indicator,.htmx-request.htmx-indicator{opacity:1;transition:opacity .2s ease-in}@property --tw-scale-x{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-y{syntax:"*";inherits:false;initial-value:1}@property --tw-scale-z{syntax:"*";inherits:false;initial-value:1}@property --tw-rotate-x{syntax:"*";inherits:false}@property --tw-rotate-y{syntax:"*";inherits:false}@property --tw-rotate-z{syntax:"*";inherits:false}@property --tw-skew-x{syntax:"*";inherits:false}@property --tw-skew-y{syntax:"*";inherits:false}@property --tw-border-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-font-weight{syntax:"*";inherits:false}@property --tw-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-shadow-color{syntax:"*";inherits:false}@property --tw-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-inset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-shadow-color{syntax:"*";inherits:false}@property --tw-inset-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-ring-color{syntax:"*";inherits:false}@property --tw-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-inset-ring-color{syntax:"*";inherits:false}@property --tw-inset-ring-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-ring-inset{syntax:"*";inherits:false}@property --tw-ring-offset-width{syntax:"";inherits:false;initial-value:0}@property --tw-ring-offset-color{syntax:"*";inherits:false;initial-value:#fff}@property --tw-ring-offset-shadow{syntax:"*";inherits:false;initial-value:0 0 #0000}@property --tw-outline-style{syntax:"*";inherits:false;initial-value:solid}@property --tw-blur{syntax:"*";inherits:false}@property --tw-brightness{syntax:"*";inherits:false}@property --tw-contrast{syntax:"*";inherits:false}@property --tw-grayscale{syntax:"*";inherits:false}@property --tw-hue-rotate{syntax:"*";inherits:false}@property --tw-invert{syntax:"*";inherits:false}@property --tw-opacity{syntax:"*";inherits:false}@property --tw-saturate{syntax:"*";inherits:false}@property --tw-sepia{syntax:"*";inherits:false}@property --tw-drop-shadow{syntax:"*";inherits:false}@property --tw-drop-shadow-color{syntax:"*";inherits:false}@property --tw-drop-shadow-alpha{syntax:"";inherits:false;initial-value:100%}@property --tw-drop-shadow-size{syntax:"*";inherits:false}@property --tw-ease{syntax:"*";inherits:false}@keyframes spin{to{transform:rotate(360deg)}}@keyframes bounce{0%,to{animation-timing-function:cubic-bezier(.8,0,1,1);transform:translateY(-25%)}50%{animation-timing-function:cubic-bezier(0,0,.2,1);transform:none}} \ No newline at end of file diff --git a/static/img/favicon.ico b/static/img/favicon.ico deleted file mode 100644 index 416358f6..00000000 Binary files a/static/img/favicon.ico and /dev/null differ diff --git a/static/img/favicon.svg b/static/img/favicon.svg index 9c6650a8..fc8974a8 100644 --- a/static/img/favicon.svg +++ b/static/img/favicon.svg @@ -1,757 +1,10 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + diff --git a/static/js/main.js b/static/js/main.js index ccbdfc28..c3e0e35d 100644 --- a/static/js/main.js +++ b/static/js/main.js @@ -1 +1,131 @@ -var currentPath=window.location.pathname,Menu=function(t,e){function s(e,n){e instanceof HTMLElement&&(e=e.id.split(n)[1],(n=document.getElementById(e))instanceof HTMLElement)&&n.classList.remove("hidden")}function i(){c.main.forEach(function(e){e instanceof HTMLElement&&e.classList.add("hidden")})}var c=this;this.menu_button=document.getElementById(t.button),this.menu_big=document.getElementById(t.big).childNodes,this.menu=document.getElementById(t.menu),this.menu_mobile=document.getElementById(t.menu).childNodes,this.menu_open=document.getElementById(t.open),this.menu_close=document.getElementById(t.close),this.main=document.getElementById(e).childNodes,this.menu_big.forEach(function(n){n.addEventListener("click",function(){var e;n instanceof HTMLElement&&n.id.startsWith("ignore")||(i(),s(n,"_"),c.menu_big.forEach(function(e){e instanceof HTMLElement&&e.classList.remove(t.menu_selected)}),c.menu_mobile.forEach(function(e){e instanceof HTMLElement&&e.classList.remove(t.mobile_menu_selected)}),n instanceof HTMLElement&&(n.classList.add(t.menu_selected),e=n.id.replace("big_","mobile_"),document.getElementById(e).classList.add(t.mobile_menu_selected)))})}),this.menu_mobile.forEach(function(n){n.addEventListener("click",function(){var e;n instanceof HTMLElement&&n.id.startsWith("ignore")||(i(),s(n,"_"),c.menu_mobile.forEach(function(e){e instanceof HTMLElement&&e.classList.remove(t.mobile_menu_selected)}),c.menu_big.forEach(function(e){e instanceof HTMLElement&&e.classList.remove(t.menu_selected)}),n instanceof HTMLElement&&(n.classList.add(t.mobile_menu_selected),e=n.id.replace("mobile_","big_"),document.getElementById(e).classList.add(t.menu_selected)))})}),this.menu_button.addEventListener("click",function(){c.menu.classList.contains("hidden")?(c.menu.classList.add("flex"),c.menu.classList.remove("hidden"),c.menu_open.classList.add("hidden"),c.menu_close.classList.remove("hidden")):(c.menu.classList.add("hidden"),c.menu.classList.remove("flex"),c.menu_open.classList.remove("hidden"),c.menu_close.classList.add("hidden"))}),document.addEventListener("click",function(e){e.target instanceof HTMLElement&&!c.menu_button.contains(e.target)&&c.menu.classList.contains("flex")&&(c.menu.classList.add("hidden"),c.menu.classList.remove("flex"),c.menu_open.classList.remove("hidden"),c.menu_close.classList.add("hidden"))})};"/"!==currentPath&&window.addEventListener("DOMContentLoaded",function(){new Menu({button:"menu_button",big:"menu_big",menu:"menu",open:"menu_open",close:"menu_close",menu_selected:"menu_selected",mobile_menu_selected:"mobile_menu_selected"},"main")}),htmx.config.includeIndicatorStyles=!1; \ No newline at end of file +var currentPath = window.location.pathname; +var Menu = /** @class */ (function () { + function Menu(menu_labels, main) { + var _this = this; + this.menu_button = document.getElementById(menu_labels.button); + this.menu_big = document.getElementById(menu_labels.big).childNodes; + this.menu = document.getElementById(menu_labels.menu); + this.menu_mobile = document.getElementById(menu_labels.menu).childNodes; + this.menu_open = document.getElementById(menu_labels.open); + this.menu_close = document.getElementById(menu_labels.close); + this.main = document.getElementById(main).childNodes; + var showById = function (node, delimiter) { + if (node instanceof HTMLElement) { + var element = node.id; + var id = element.split(delimiter)[1]; + var target = document.getElementById(id); + if (target instanceof HTMLElement) { + target.classList.remove("hidden"); + } + } + }; + var hideAllMain = function () { + _this.main.forEach(function (node) { + if (node instanceof HTMLElement) { + node.classList.add("hidden"); + } + }); + }; + // Big menu item selection styling + this.menu_big.forEach(function (node) { + node.addEventListener("click", function () { + // if the node name starts with "ignore" skip it + if (node instanceof HTMLElement && + node.id.startsWith("ignore")) { + return; + } + hideAllMain(); + showById(node, "_"); + _this.menu_big.forEach(function (node) { + if (node instanceof HTMLElement) { + node.classList.remove(menu_labels.menu_selected); + } + }); + _this.menu_mobile.forEach(function (node) { + if (node instanceof HTMLElement) { + node.classList.remove(menu_labels.mobile_menu_selected); + } + }); + if (node instanceof HTMLElement) { + node.classList.add(menu_labels.menu_selected); + var mobile_target = node.id.replace("big_", "mobile_"); + document + .getElementById(mobile_target) + .classList.add(menu_labels.mobile_menu_selected); + } + }); + }); + // mobile menu item selection styling + this.menu_mobile.forEach(function (node) { + node.addEventListener("click", function () { + // if the node name starts with "ignore" skip it + if (node instanceof HTMLElement && + node.id.startsWith("ignore")) { + return; + } + hideAllMain(); + showById(node, "_"); + _this.menu_mobile.forEach(function (node) { + if (node instanceof HTMLElement) { + node.classList.remove(menu_labels.mobile_menu_selected); + } + }); + _this.menu_big.forEach(function (node) { + if (node instanceof HTMLElement) { + node.classList.remove(menu_labels.menu_selected); + } + }); + if (node instanceof HTMLElement) { + node.classList.add(menu_labels.mobile_menu_selected); + var big_target = node.id.replace("mobile_", "big_"); + document + .getElementById(big_target) + .classList.add(menu_labels.menu_selected); + } + }); + }); + // Mobile menu + this.menu_button.addEventListener("click", function () { + if (_this.menu.classList.contains("hidden")) { + _this.menu.classList.add("flex"); + _this.menu.classList.remove("hidden"); + _this.menu_open.classList.add("hidden"); + _this.menu_close.classList.remove("hidden"); + } + else { + _this.menu.classList.add("hidden"); + _this.menu.classList.remove("flex"); + _this.menu_open.classList.remove("hidden"); + _this.menu_close.classList.add("hidden"); + } + }); + // Mobile when close when clicking outside the menu + document.addEventListener("click", function (e) { + if (e.target instanceof HTMLElement && + !_this.menu_button.contains(e.target) && + _this.menu.classList.contains("flex")) { + _this.menu.classList.add("hidden"); + _this.menu.classList.remove("flex"); + _this.menu_open.classList.remove("hidden"); + _this.menu_close.classList.add("hidden"); + } + }); + } + return Menu; +}()); +if (currentPath !== "/") { + window.addEventListener("DOMContentLoaded", function () { + var menu_labels = { + button: "menu_button", + big: "menu_big", + menu: "menu", + open: "menu_open", + close: "menu_close", + menu_selected: "menu_selected", + mobile_menu_selected: "mobile_menu_selected", + }; + new Menu(menu_labels, "main"); + }); +} +// @ts-ignore +htmx.config.includeIndicatorStyles = false; diff --git a/static/ts/main.ts b/static/ts/main.ts index 64baf283..c040eda5 100644 --- a/static/ts/main.ts +++ b/static/ts/main.ts @@ -1,136 +1,148 @@ -const currentPath = window.location.pathname; +const currentPath = window.location.pathname interface menuLabels { - button: string; - big: string, - menu: string; - open: string; - close: string; - menu_selected: string; - mobile_menu_selected: string; + button: string + big: string + menu: string + open: string + close: string + menu_selected: string + mobile_menu_selected: string } class Menu { - menu_button: HTMLElement; - menu_big: NodeListOf; - menu: HTMLElement; - menu_mobile: NodeListOf; - menu_open: HTMLElement; - menu_close: HTMLElement; - main: NodeListOf; + menu_button: HTMLElement + menu_big: NodeListOf + menu: HTMLElement + menu_mobile: NodeListOf + menu_open: HTMLElement + menu_close: HTMLElement + main: NodeListOf constructor(menu_labels: menuLabels, main: string) { - this.menu_button = document.getElementById(menu_labels.button); - this.menu_big = document.getElementById(menu_labels.big).childNodes; - this.menu = document.getElementById(menu_labels.menu); - this.menu_mobile = document.getElementById(menu_labels.menu).childNodes; - this.menu_open = document.getElementById(menu_labels.open); - this.menu_close = document.getElementById(menu_labels.close); - this.main = document.getElementById(main).childNodes; + this.menu_button = document.getElementById(menu_labels.button) + this.menu_big = document.getElementById(menu_labels.big).childNodes + this.menu = document.getElementById(menu_labels.menu) + this.menu_mobile = document.getElementById(menu_labels.menu).childNodes + this.menu_open = document.getElementById(menu_labels.open) + this.menu_close = document.getElementById(menu_labels.close) + this.main = document.getElementById(main).childNodes const showById = (node: ChildNode, delimiter: string) => { if (node instanceof HTMLElement) { - const element = node.id; - const id = element.split(delimiter)[1]; - const target = document.getElementById(id); + const element = node.id + const id = element.split(delimiter)[1] + const target = document.getElementById(id) if (target instanceof HTMLElement) { - target.classList.remove("hidden"); + target.classList.remove("hidden") } } - }; + } const hideAllMain = () => { this.main.forEach((node) => { if (node instanceof HTMLElement) { - node.classList.add("hidden"); + node.classList.add("hidden") } - }); - }; + }) + } // Big menu item selection styling this.menu_big.forEach((node) => { node.addEventListener("click", () => { - // if the node name starts with "ignore" skip it - if (node instanceof HTMLElement && node.id.startsWith("ignore")) { - return; + if ( + node instanceof HTMLElement && + node.id.startsWith("ignore") + ) { + return } - hideAllMain(); - showById(node, "_"); + hideAllMain() + showById(node, "_") this.menu_big.forEach((node) => { if (node instanceof HTMLElement) { - node.classList.remove(menu_labels.menu_selected); + node.classList.remove(menu_labels.menu_selected) } - }); + }) this.menu_mobile.forEach((node) => { if (node instanceof HTMLElement) { - node.classList.remove(menu_labels.mobile_menu_selected); + node.classList.remove(menu_labels.mobile_menu_selected) } - }); + }) if (node instanceof HTMLElement) { - node.classList.add(menu_labels.menu_selected); - let mobile_target = node.id.replace("big_", "mobile_"); - document.getElementById(mobile_target).classList.add(menu_labels.mobile_menu_selected); + node.classList.add(menu_labels.menu_selected) + let mobile_target = node.id.replace("big_", "mobile_") + document + .getElementById(mobile_target) + .classList.add(menu_labels.mobile_menu_selected) } - }); - }); + }) + }) // mobile menu item selection styling this.menu_mobile.forEach((node) => { node.addEventListener("click", () => { - // if the node name starts with "ignore" skip it - if (node instanceof HTMLElement && node.id.startsWith("ignore")) { - return; + if ( + node instanceof HTMLElement && + node.id.startsWith("ignore") + ) { + return } - hideAllMain(); - showById(node, "_"); + hideAllMain() + showById(node, "_") this.menu_mobile.forEach((node) => { if (node instanceof HTMLElement) { - node.classList.remove(menu_labels.mobile_menu_selected); + node.classList.remove(menu_labels.mobile_menu_selected) } - }); + }) this.menu_big.forEach((node) => { if (node instanceof HTMLElement) { - node.classList.remove(menu_labels.menu_selected); + node.classList.remove(menu_labels.menu_selected) } - }); + }) if (node instanceof HTMLElement) { - node.classList.add(menu_labels.mobile_menu_selected); - let big_target = node.id.replace("mobile_", "big_"); - document.getElementById(big_target).classList.add(menu_labels.menu_selected); + node.classList.add(menu_labels.mobile_menu_selected) + let big_target = node.id.replace("mobile_", "big_") + document + .getElementById(big_target) + .classList.add(menu_labels.menu_selected) } - }); - }); + }) + }) // Mobile menu this.menu_button.addEventListener("click", () => { if (this.menu.classList.contains("hidden")) { - this.menu.classList.add("flex"); - this.menu.classList.remove("hidden"); - this.menu_open.classList.add("hidden"); - this.menu_close.classList.remove("hidden"); + this.menu.classList.add("flex") + this.menu.classList.remove("hidden") + this.menu_open.classList.add("hidden") + this.menu_close.classList.remove("hidden") } else { - this.menu.classList.add("hidden"); - this.menu.classList.remove("flex"); - this.menu_open.classList.remove("hidden"); - this.menu_close.classList.add("hidden"); + this.menu.classList.add("hidden") + this.menu.classList.remove("flex") + this.menu_open.classList.remove("hidden") + this.menu_close.classList.add("hidden") } - }); + }) // Mobile when close when clicking outside the menu document.addEventListener("click", (e) => { - if (e.target instanceof HTMLElement && !this.menu_button.contains(e.target) && this.menu.classList.contains("flex")) { - this.menu.classList.add("hidden"); - this.menu.classList.remove("flex"); - this.menu_open.classList.remove("hidden"); - this.menu_close.classList.add("hidden"); + if ( + e.target instanceof HTMLElement && + !this.menu_button.contains(e.target) && + this.menu.classList.contains("flex") + ) { + this.menu.classList.add("hidden") + this.menu.classList.remove("flex") + this.menu_open.classList.remove("hidden") + this.menu_close.classList.add("hidden") } - }); + }) } } @@ -143,12 +155,12 @@ if (currentPath !== "/") { open: "menu_open", close: "menu_close", menu_selected: "menu_selected", - mobile_menu_selected: "mobile_menu_selected" - }; + mobile_menu_selected: "mobile_menu_selected", + } - new Menu(menu_labels, "main"); - }); + new Menu(menu_labels, "main") + }) } // @ts-ignore -htmx.config.includeIndicatorStyles = false; +htmx.config.includeIndicatorStyles = false diff --git a/templates/base.html b/templates/base.html index 4864dd00..4aebfed5 100644 --- a/templates/base.html +++ b/templates/base.html @@ -17,7 +17,7 @@ {% endblock head %} - + {% block nav %} {% endblock nav %} diff --git a/templates/components/code_block.html b/templates/components/code_block.html new file mode 100644 index 00000000..c0430666 --- /dev/null +++ b/templates/components/code_block.html @@ -0,0 +1,5 @@ +
✅ copied
{{ code }}
\ No newline at end of file diff --git a/templates/components/group_create.html b/templates/components/group_create.html index 188957e4..2fcd40c3 100644 --- a/templates/components/group_create.html +++ b/templates/components/group_create.html @@ -1,46 +1,29 @@ -
-

Group Create

- +
+ Group Management +   ›  + Create Group
+ hx-target-400="#response-message" class="w-full"> -
- - - -
    - {% for item in items %} -
  • - - -
  • - {% endfor %} -
+
+
+ +
+ + +
- + +
    + {% for item in items %} +
  • + + +
  • + {% endfor %} +
+ -
-
diff --git a/templates/components/group_edit.html b/templates/components/group_edit.html index cfbfd307..2df7d2e7 100644 --- a/templates/components/group_edit.html +++ b/templates/components/group_edit.html @@ -1,42 +1,26 @@ -
-

Group Edit {{ group_name | capitalize }}

- +
+ Group Management +   ›  + {{ group_name | capitalize }} +   ›  + Subscriptions
+ hx-target-400="#response-message" class="w-full"> -
- -
    - {% for item in selections %} -
  • - - -
  • - {% endfor %} -
-
- + +
+ + +
    + {% for item in selections %} +
  • + + +
  • + {% endfor %} +
-
-
diff --git a/templates/components/group_view.html b/templates/components/group_view.html index 8850afbe..ba26c2dc 100644 --- a/templates/components/group_view.html +++ b/templates/components/group_view.html @@ -1,6 +1,17 @@ +{# + + + + +THIS TEMPLATE IS NOT LONGER USED - MARKED FOR DELETION + + + + +#}
-

Group View

-
+

Group View

+
- - +
+ - - - @@ -28,14 +39,14 @@ {% if groups %} {% for group in groups %} - - + - -
+ Name + Updated + Actions
+
{{ group.name }} - {{ group.updated_at | truncate(length=16) }} + + {{ group.updated_at | time_ago }} +