From 546f40c40becc29b68e4c045483509af779b3030 Mon Sep 17 00:00:00 2001 From: Kyosuke Fujimoto Date: Sun, 28 Jul 2024 16:21:31 +0900 Subject: [PATCH] Initial release --- .gitignore | 3 + Cargo.lock | 2514 ++++++++++++++++++++++++++++ Cargo.toml | 38 + LICENSE | 21 + README.md | 245 +++ img/applied.png | Bin 0 -> 1087556 bytes img/demo.gif | Bin 0 -> 3471876 bytes img/detail.png | Bin 0 -> 830281 bytes img/list.png | Bin 0 -> 1251956 bytes img/order-chrono.png | Bin 0 -> 361048 bytes img/order-topo.png | Bin 0 -> 360980 bytes img/refs.png | Bin 0 -> 1185378 bytes img/searching.png | Bin 0 -> 1080391 bytes rustfmt.toml | 25 + src/app.rs | 339 ++++ src/color.rs | 51 + src/config.rs | 170 ++ src/event.rs | 81 + src/external.rs | 7 + src/git.rs | 641 +++++++ src/graph.rs | 8 + src/graph/cache.rs | 110 ++ src/graph/calc.rs | 529 ++++++ src/graph/image.rs | 499 ++++++ src/graph/queue.rs | 98 ++ src/lib.rs | 134 ++ src/macros.rs | 29 + src/main.rs | 3 + src/protocol.rs | 71 + src/view.rs | 8 + src/view/detail.rs | 140 ++ src/view/help.rs | 270 +++ src/view/list.rs | 196 +++ src/view/refs.rs | 125 ++ src/view/views.rs | 79 + src/widget.rs | 3 + src/widget/commit_detail.rs | 305 ++++ src/widget/commit_list.rs | 824 +++++++++ src/widget/ref_list.rs | 293 ++++ tests/graph.rs | 1176 +++++++++++++ tests/graph/branch_001_chrono.png | Bin 0 -> 79233 bytes tests/graph/branch_001_topo.png | Bin 0 -> 79233 bytes tests/graph/branch_002_chrono.png | Bin 0 -> 62974 bytes tests/graph/branch_002_topo.png | Bin 0 -> 61711 bytes tests/graph/branch_003_chrono.png | Bin 0 -> 28344 bytes tests/graph/branch_003_topo.png | Bin 0 -> 28332 bytes tests/graph/branch_004_chrono.png | Bin 0 -> 90435 bytes tests/graph/branch_004_topo.png | Bin 0 -> 90693 bytes tests/graph/branch_005_chrono.png | Bin 0 -> 30490 bytes tests/graph/branch_005_topo.png | Bin 0 -> 31066 bytes tests/graph/complex_001_chrono.png | Bin 0 -> 99274 bytes tests/graph/complex_001_topo.png | Bin 0 -> 99064 bytes tests/graph/merge_001_chrono.png | Bin 0 -> 71579 bytes tests/graph/merge_001_topo.png | Bin 0 -> 72634 bytes tests/graph/merge_002_chrono.png | Bin 0 -> 47476 bytes tests/graph/merge_002_topo.png | Bin 0 -> 47476 bytes tests/graph/merge_003_chrono.png | Bin 0 -> 39807 bytes tests/graph/merge_003_topo.png | Bin 0 -> 39787 bytes tests/graph/merge_004_chrono.png | Bin 0 -> 56301 bytes tests/graph/merge_004_topo.png | Bin 0 -> 56316 bytes tests/graph/merge_005_chrono.png | Bin 0 -> 70213 bytes tests/graph/merge_005_topo.png | Bin 0 -> 70213 bytes tests/graph/orphan_001_chrono.png | Bin 0 -> 30159 bytes tests/graph/orphan_001_topo.png | Bin 0 -> 30159 bytes tests/graph/stash_001_chrono.png | Bin 0 -> 45699 bytes tests/graph/stash_001_topo.png | Bin 0 -> 45699 bytes tests/graph/stash_002_chrono.png | Bin 0 -> 41934 bytes tests/graph/stash_002_topo.png | Bin 0 -> 41934 bytes tests/graph/stash_003_chrono.png | Bin 0 -> 11175 bytes tests/graph/stash_003_topo.png | Bin 0 -> 11175 bytes tests/graph/straight_001.png | Bin 0 -> 376019 bytes 71 files changed, 9035 insertions(+) create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 LICENSE create mode 100644 README.md create mode 100644 img/applied.png create mode 100644 img/demo.gif create mode 100644 img/detail.png create mode 100644 img/list.png create mode 100644 img/order-chrono.png create mode 100644 img/order-topo.png create mode 100644 img/refs.png create mode 100644 img/searching.png create mode 100644 rustfmt.toml create mode 100644 src/app.rs create mode 100644 src/color.rs create mode 100644 src/config.rs create mode 100644 src/event.rs create mode 100644 src/external.rs create mode 100644 src/git.rs create mode 100644 src/graph.rs create mode 100644 src/graph/cache.rs create mode 100644 src/graph/calc.rs create mode 100644 src/graph/image.rs create mode 100644 src/graph/queue.rs create mode 100644 src/lib.rs create mode 100644 src/macros.rs create mode 100644 src/main.rs create mode 100644 src/protocol.rs create mode 100644 src/view.rs create mode 100644 src/view/detail.rs create mode 100644 src/view/help.rs create mode 100644 src/view/list.rs create mode 100644 src/view/refs.rs create mode 100644 src/view/views.rs create mode 100644 src/widget.rs create mode 100644 src/widget/commit_detail.rs create mode 100644 src/widget/commit_list.rs create mode 100644 src/widget/ref_list.rs create mode 100644 tests/graph.rs create mode 100644 tests/graph/branch_001_chrono.png create mode 100644 tests/graph/branch_001_topo.png create mode 100644 tests/graph/branch_002_chrono.png create mode 100644 tests/graph/branch_002_topo.png create mode 100644 tests/graph/branch_003_chrono.png create mode 100644 tests/graph/branch_003_topo.png create mode 100644 tests/graph/branch_004_chrono.png create mode 100644 tests/graph/branch_004_topo.png create mode 100644 tests/graph/branch_005_chrono.png create mode 100644 tests/graph/branch_005_topo.png create mode 100644 tests/graph/complex_001_chrono.png create mode 100644 tests/graph/complex_001_topo.png create mode 100644 tests/graph/merge_001_chrono.png create mode 100644 tests/graph/merge_001_topo.png create mode 100644 tests/graph/merge_002_chrono.png create mode 100644 tests/graph/merge_002_topo.png create mode 100644 tests/graph/merge_003_chrono.png create mode 100644 tests/graph/merge_003_topo.png create mode 100644 tests/graph/merge_004_chrono.png create mode 100644 tests/graph/merge_004_topo.png create mode 100644 tests/graph/merge_005_chrono.png create mode 100644 tests/graph/merge_005_topo.png create mode 100644 tests/graph/orphan_001_chrono.png create mode 100644 tests/graph/orphan_001_topo.png create mode 100644 tests/graph/stash_001_chrono.png create mode 100644 tests/graph/stash_001_topo.png create mode 100644 tests/graph/stash_002_chrono.png create mode 100644 tests/graph/stash_002_topo.png create mode 100644 tests/graph/stash_003_chrono.png create mode 100644 tests/graph/stash_003_topo.png create mode 100644 tests/graph/straight_001.png diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..0f80ee9 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/target + +/out \ No newline at end of file diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..ea12cff --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,2514 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "adler" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" + +[[package]] +name = "ahash" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" +dependencies = [ + "cfg-if", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aligned-vec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4aa90d7ce82d4be67b64039a3d588d38dbcc6736577de4a847025ce5b0c468d1" + +[[package]] +name = "allocator-api2" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" + +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + +[[package]] +name = "anstream" +version = "0.6.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b" + +[[package]] +name = "anstyle-parse" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad186efb764318d35165f1758e7dcef3b10628e26d41a44bc5550652e6804391" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19" +dependencies = [ + "anstyle", + "windows-sys 0.52.0", +] + +[[package]] +name = "anyhow" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" + +[[package]] +name = "arbitrary" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d5a26814d8dcb93b0e5a0ff3c6d80a8843bafb21b39e8e18a6f05471870e110" + +[[package]] +name = "arboard" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb4009533e8ff8f1450a5bcbc30f4242a1d34442221f72314bea1f5dc9c7f89" +dependencies = [ + "clipboard-win", + "core-graphics", + "image", + "log", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "parking_lot", + "windows-sys 0.48.0", + "x11rb", +] + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "arrayref" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b4930d2cb77ce62f89ee5d5289b4ac049559b1c45539271f5ed4fdc7db34545" + +[[package]] +name = "arrayvec" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "autocfg" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0" + +[[package]] +name = "av1-grain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6678909d8c5d46a42abcf571271e15fdbc0a225e3646cf23762cd415046c78bf" +dependencies = [ + "anyhow", + "arrayvec 0.7.4", + "log", + "nom", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "876c75a42f6364451a033496a14c44bffe41f5f4a8236f697391f11024e596d2" +dependencies = [ + "arrayvec 0.7.4", +] + +[[package]] +name = "base64" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8" + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bit_field" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc827186963e592360843fb5ba4b973e145841266c1357f7180c43526f2e5b61" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048fb63fd8b5923fc5aa7b340d8e156aec7ec02f0c78fa8a6ddc2613f6f71de" + +[[package]] +name = "bitstream-io" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3dcde5f311c85b8ca30c2e4198d4326bc342c76541590106f5fa4a50946ea499" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c132eebf10f5cad5289222520a4a058514204aed6d791f1cf4fe8088b82d15f" +dependencies = [ + "objc2", +] + +[[package]] +name = "built" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "236e6289eda5a812bc6b53c3b024039382a2895fbbeef2d748b2931546d392c4" + +[[package]] +name = "bumpalo" +version = "3.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c" + +[[package]] +name = "bytemuck" +version = "1.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b236fc92302c97ed75b38da1f4917b5cdda4984745740f153a5d3059e48d725e" + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "cassowary" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df8670b8c7b9dae1793364eafadf7239c40d669904660c5960d74cfd80b46a53" + +[[package]] +name = "castaway" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0abae9be0aaf9ea96a3b1b8b1b55c602ca751eba1b1500220cea4ecbafe7c0d5" +dependencies = [ + "rustversion", +] + +[[package]] +name = "cc" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47de7e88bbbd467951ae7f5a6f34f70d1b4d9cfce53d5fd70f74ebe118b3db56" +dependencies = [ + "jobserver", + "libc", + "once_cell", +] + +[[package]] +name = "cfg-expr" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d067ad48b8650848b989a59a86c6c36a995d02d2bf778d45c3c5d57bc2718f02" +dependencies = [ + "smallvec", + "target-lexicon", +] + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "chrono" +version = "0.4.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a21f936df1771bf62b77f047b726c4625ff2e8aa607c01ec06e5a05bd8463401" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-targets 0.52.6", +] + +[[package]] +name = "clap" +version = "4.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "64acc1846d54c1fe936a78dc189c34e28d3f5afc348403f28ecf53660b9b8462" +dependencies = [ + "clap_builder", + "clap_derive", +] + +[[package]] +name = "clap_builder" +version = "4.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fb8393d67ba2e7bfaf28a23458e4e2b543cc73a99595511eb207fdb8aede942" +dependencies = [ + "anstream", + "anstyle", + "clap_lex", + "strsim", +] + +[[package]] +name = "clap_derive" +version = "4.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bac35c6dafb060fd4d275d9a4ffae97917c13a6327903a8be2153cd964f7085" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "clap_lex" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b82cf0babdbd58558212896d1a4272303a57bdb245c2bf1147185fb45640e70" + +[[package]] +name = "clipboard-win" +version = "5.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15efe7a882b08f34e38556b14f2fb3daa98769d06c7f0c1b076dfd0d983bc892" +dependencies = [ + "error-code", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "colorchoice" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422" + +[[package]] +name = "compact_str" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f86b9c4c00838774a6d902ef931eff7470720c51d90c2e32cfe15dc304737b3f" +dependencies = [ + "castaway", + "cfg-if", + "itoa", + "ryu", + "static_assertions", +] + +[[package]] +name = "console" +version = "0.15.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e1f83fc076bd6dd27517eacdf25fef6c4dfe5f1d7448bafaaf3a26f13b5e4eb" +dependencies = [ + "encode_unicode", + "lazy_static", + "libc", + "unicode-width", + "windows-sys 0.52.0", +] + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06ea2b9bc92be3c2baa9334a323ebca2d6f074ff852cd1d7b11064035cd3868f" + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "core-graphics-types", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation", + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a97769d94ddab943e4510d138150169a2758b5ef3eb191a9ee688de3e23ef7b3" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1137cd7e7fc0fb5d3c5a8678be38ec56e819125d8d7907411fe24ccb943faca8" +dependencies = [ + "crossbeam-channel", + "crossbeam-deque", + "crossbeam-epoch", + "crossbeam-queue", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-channel" +version = "0.5.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33480d6946193aa8033910124896ca395333cae7e2d1113d1fef6c3272217df2" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df0346b5d5e76ac2fe4e327c5fd1118d6be7c51dfb18f9b7922923f287471e35" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22ec99545bb0ed0ea7bb9b8e1e9122ea386ff8a48c0922e43f36d45ab09e0e80" + +[[package]] +name = "crossterm" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f476fe445d41c9e991fd07515a6f463074b782242ccf4a5b7b1d1012e70824df" +dependencies = [ + "bitflags 2.6.0", + "crossterm_winapi", + "libc", + "mio", + "parking_lot", + "signal-hook", + "signal-hook-mio", + "winapi", +] + +[[package]] +name = "crossterm_winapi" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "acdd7c62a3665c7f6830a51635d9ac9b23ed385797f70a83bb8bafe9c572ab2b" +dependencies = [ + "winapi", +] + +[[package]] +name = "crunchy" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7" + +[[package]] +name = "crypto-common" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3" +dependencies = [ + "generic-array", + "typenum", +] + +[[package]] +name = "data-url" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a30bfce702bcfa94e906ef82421f2c0e61c076ad76030c16ee5d2e9a32fe193" +dependencies = [ + "matches", +] + +[[package]] +name = "derive-new" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3418329ca0ad70234b9735dc4ceed10af4df60eff9c8e7b06cb5e520d92c3535" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer", + "crypto-common", +] + +[[package]] +name = "dircpy" +version = "0.3.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29259db751c34980bfc44100875890c507f585323453b91936960ab1104272ca" +dependencies = [ + "jwalk", + "log", + "walkdir", +] + +[[package]] +name = "either" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60b1af1c220855b6ceac025d3f6ecdd2b7c4894bfe9cd9bda4fbb4bc7c0d4cf0" + +[[package]] +name = "encode_unicode" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a357d28ed41a50f9c765dbfe56cbc04a64e53e5fc58ba79fbc34c10ef3df831f" + +[[package]] +name = "equivalent" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" + +[[package]] +name = "errno" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba" +dependencies = [ + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "error-code" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0474425d51df81997e2f90a21591180b38eccf27292d755f3e30750225c175b" + +[[package]] +name = "exr" +version = "1.72.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "887d93f60543e9a9362ef8a21beedd0a833c5d9610e18c67abe15a5963dcb1a4" +dependencies = [ + "bit_field", + "flume", + "half", + "lebe", + "miniz_oxide", + "rayon-core", + "smallvec", + "zune-inflate", +] + +[[package]] +name = "fastrand" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fc0510504f03c51ada170672ac806f1f105a88aa97a5281117e1ddc3368e51a" + +[[package]] +name = "fdeflate" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4f9bfee30e4dedf0ab8b422f03af778d9612b63f502710fc500a334ebe2de645" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "flate2" +version = "1.0.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f54427cfd1c7829e2a139fcefea601bf088ebca651d2bf53ebc600eac295dae" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" + +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "spin", +] + +[[package]] +name = "fontdb" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01b07f5c05414a0d8caba4c17eef8dc8b5c8955fc7c68d324191c7a56d3f3449" +dependencies = [ + "log", + "memmap2", + "ttf-parser", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5c6c585bc94aaf2c7b51dd4c2ba22680844aba4c687be581871a6f518c5742" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "generic-array" +version = "0.14.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a" +dependencies = [ + "typenum", + "version_check", +] + +[[package]] +name = "gethostname" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0176e0459c2e4a1fe232f984bca6890e681076abb9934f6cea7c326f3fc47818" +dependencies = [ + "libc", + "windows-targets 0.48.5", +] + +[[package]] +name = "getrandom" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4567c8db10ae91089c99af84c68c38da3ec2f087c3f82960bcdbf3656b6f4d7" +dependencies = [ + "cfg-if", + "libc", + "wasi", +] + +[[package]] +name = "gif" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb2d69b19215e18bb912fa30f7ce15846e301408695e44e0ef719f1da9e19f2" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "half" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "iana-time-zone" +version = "0.1.60" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7ffbb5a1b541ea2561f8c41c087286cc091e21e556a4f09a8f6cbf17b69b141" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + +[[package]] +name = "image" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd54d660e773627692c524beaad361aca785a4f9f5730ce91f42aabe5bce3d11" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "exr", + "gif", + "image-webp", + "num-traits", + "png", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d730b085583c4d789dfd07fdcf185be59501666a90c97c40162b37e4fdad272d" +dependencies = [ + "byteorder-lite", + "thiserror", +] + +[[package]] +name = "imgref" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44feda355f4159a7c757171a77de25daf6411e217b4cabd03bd6650690468126" + +[[package]] +name = "indexmap" +version = "2.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800" + +[[package]] +name = "itertools" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b" + +[[package]] +name = "jobserver" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2b099aaa34a9751c5bf0878add70444e1ed2dd73f347be99003d4577277de6e" +dependencies = [ + "libc", +] + +[[package]] +name = "jpeg-decoder" +version = "0.1.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "229d53d58899083193af11e15917b5640cd40b29ff475a1fe4ef725deb02d0f2" + +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" + +[[package]] +name = "js-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29c15563dc2726973df627357ce0c9ddddbea194836909d655df6a75d2cf296d" +dependencies = [ + "wasm-bindgen", +] + +[[package]] +name = "jwalk" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2735847566356cd2179a2a38264839308f7079fa96e6bd5a42d740460e003c56" +dependencies = [ + "crossbeam", + "rayon", +] + +[[package]] +name = "kurbo" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a53776d271cfb873b17c618af0298445c88afc52837f3e948fa3fafd131f449" +dependencies = [ + "arrayvec 0.7.4", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" + +[[package]] +name = "lebe" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8" + +[[package]] +name = "libc" +version = "0.2.155" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c" + +[[package]] +name = "libfuzzer-sys" +version = "0.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a96cfd5557eb82f2b83fed4955246c988d331975a002961b07c81584d107e7f7" +dependencies = [ + "arbitrary", + "cc", + "once_cell", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" + +[[package]] +name = "lock_api" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7a70ba024b9dc04c27ea2f0c0548feb474ec5c54bba33a7f72f873a39d07b24" + +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[package]] +name = "lru" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" +dependencies = [ + "hashbrown", +] + +[[package]] +name = "matches" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2532096657941c2fea9c289d370a250971c689d4f143798ff67113ec042024a5" + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + +[[package]] +name = "memchr" +version = "2.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" + +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8a240ddb74feaf34a79a7add65a741f3167852fba007066dcac1ca548d89c08" +dependencies = [ + "adler", + "simd-adler32", +] + +[[package]] +name = "mio" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4a650543ca06a924e8b371db273b2756685faae30f8487da1b56505a8f78b0c" +dependencies = [ + "libc", + "log", + "wasi", + "windows-sys 0.48.0", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "num-bigint" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5e44f723f1133c9deac646763579fdb3ac745e418f2a7af9cd0c431da1f20b9" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "num-integer" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7969661fd2958a5cb096e56c8e1ad0444ac2bbcd0061bd28660485a44879858f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", +] + +[[package]] +name = "objc-sys" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb91bdd390c7ce1a8607f35f3ca7151b65afc0ff5ff3b34fa350f7d7c7e4310" + +[[package]] +name = "objc2" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46a785d4eeff09c14c487497c162e92766fbb3e4059a71840cecc03d9a50b804" +dependencies = [ + "objc-sys", + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" +dependencies = [ + "bitflags 2.6.0", + "block2", + "libc", + "objc2", + "objc2-core-data", + "objc2-core-image", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-core-data" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-core-image" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-encode" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7891e71393cd1f227313c9379a26a584ff3d7e6e7159e988851f0934c993f0f8" + +[[package]] +name = "objc2-foundation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" +dependencies = [ + "bitflags 2.6.0", + "block2", + "libc", + "objc2", +] + +[[package]] +name = "objc2-metal" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" +dependencies = [ + "bitflags 2.6.0", + "block2", + "objc2", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "olpc-cjson" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d637c9c15b639ccff597da8f4fa968300651ad2f1e968aefc3b4927a6fb2027a" +dependencies = [ + "serde", + "serde_json", + "unicode-normalization", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "parking_lot" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1bf18183cf54e8d6059647fc3063646a1801cf30896933ec2311622cc4b9a27" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall", + "smallvec", + "windows-targets 0.52.6", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pico-args" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db8bcd96cb740d03149cbad5518db9fd87126a10ab519c011893b1754134c468" + +[[package]] +name = "pkg-config" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" + +[[package]] +name = "png" +version = "0.17.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06e4b0d3d1312775e782c86c91a111aa1f910cbb65e1337f9975b5f9a554b5e1" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "proc-macro2" +version = "1.0.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8021cf59c8ec9c432cfc2526ac6b8aa508ecaf29cd415f271b8406c1b851c3fd" +dependencies = [ + "quote", + "syn 2.0.71", +] + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quote" +version = "1.0.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "rand" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +dependencies = [ + "libc", + "rand_chacha", + "rand_core", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom", +] + +[[package]] +name = "ratatui" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16546c5b5962abf8ce6e2881e722b4e0ae3b6f1a08a26ae3573c55853ca68d3" +dependencies = [ + "bitflags 2.6.0", + "cassowary", + "compact_str", + "crossterm", + "itertools 0.13.0", + "lru", + "paste", + "stability", + "strum", + "strum_macros", + "unicode-segmentation", + "unicode-truncate", + "unicode-width", +] + +[[package]] +name = "rav1e" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd87ce80a7665b1cce111f8a16c1f3929f6547ce91ade6addf4ec86a8dda5ce9" +dependencies = [ + "arbitrary", + "arg_enum_proc_macro", + "arrayvec 0.7.4", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.12.1", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "once_cell", + "paste", + "profiling", + "rand", + "rand_chacha", + "simd_helpers", + "system-deps", + "thiserror", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6ba61c28ba24c0cf8406e025cb29a742637e3f70776e61c27a8a8b72a042d12" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + +[[package]] +name = "rayon" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1465873a3dfdaa8ae7cb14b4383657caab0b3e8a0aa9ae8e04b044854c8dfce2" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "rctree" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ae028b272a6e99d9f8260ceefa3caa09300a8d6c8d2b2001316474bc52122e9" + +[[package]] +name = "redox_syscall" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +dependencies = [ + "bitflags 2.6.0", +] + +[[package]] +name = "resvg" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "256cc9203115db152290219f35f3362e729301b59e2a391fb2721fe3fa155352" +dependencies = [ + "jpeg-decoder 0.1.22", + "log", + "pico-args", + "png", + "rgb", + "tiny-skia", + "usvg", +] + +[[package]] +name = "rgb" +version = "0.8.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1aee83dc281d5a3200d37b299acd13b81066ea126a7f16f0eae70fc9aed241d9" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "roxmltree" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b" +dependencies = [ + "xmlparser", +] + +[[package]] +name = "rustix" +version = "0.38.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "70dc5ec042f7a43c4a73241207cecc9873a06d45debb38b329f8541d85c2730f" +dependencies = [ + "bitflags 2.6.0", + "errno", + "libc", + "linux-raw-sys", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustversion" +version = "1.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "955d28af4278de8121b7ebeb796b6a45735dc01436d898801014aced2773a3d6" + +[[package]] +name = "rustybuzz" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44561062e583c4873162861261f16fd1d85fe927c4904d71329a4fe43dc355ef" +dependencies = [ + "bitflags 1.3.2", + "bytemuck", + "smallvec", + "ttf-parser", + "unicode-bidi-mirroring", + "unicode-ccc", + "unicode-general-category", + "unicode-script", +] + +[[package]] +name = "ryu" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f" + +[[package]] +name = "safe_arch" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1ff3d6d9696af502cc3110dacce942840fb06ff4514cad92236ecc455f2ce05" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "semver" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61697e0a1c7e512e84a621326239844a24d8207b4669b41bc18b32ea5cbf988b" + +[[package]] +name = "serde" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc76f558e0cbb2a839d37354c575f1dc3fdc6546b5be373ba43d95f231bf7c12" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.204" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0cd7e117be63d3c3678776753929474f3b04a43a080c744d6b0ae2a8c28e222" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "serde_json" +version = "1.0.120" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e0d21c9a8cae1235ad58a00c11cb40d4b1e5c784f1ef2c537876ed6ffd8b7c5" +dependencies = [ + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "serde_spanned" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb5b1b31579f3811bf615c144393417496f152e12ac8b7663bf664f4a815306d" +dependencies = [ + "serde", +] + +[[package]] +name = "serie" +version = "0.1.0" +dependencies = [ + "arboard", + "base64 0.22.1", + "chrono", + "clap", + "console", + "dircpy", + "image", + "olpc-cjson", + "ratatui", + "rayon", + "semver", + "serde", + "serde_json", + "sha1", + "tempfile", + "text-to-png", + "toml", + "tui-input", + "tui-tree-widget", + "xdg", +] + +[[package]] +name = "sha1" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3bf829a2d51ab4a5ddf1352d8470c140cadc8301b2ae1789db023f01cedd6ba" +dependencies = [ + "cfg-if", + "cpufeatures", + "digest", +] + +[[package]] +name = "signal-hook" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8621587d4798caf8eb44879d42e56b9a93ea5dcd315a6487c357130095b62801" +dependencies = [ + "libc", + "signal-hook-registry", +] + +[[package]] +name = "signal-hook-mio" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29ad2e15f37ec9a6cc544097b78a1ec90001e9f71b81338ca39f430adaca99af" +dependencies = [ + "libc", + "mio", + "signal-hook", +] + +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + +[[package]] +name = "simplecss" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a11be7c62927d9427e9f40f3444d5499d868648e2edbc4e2116de69e7ec0e89d" +dependencies = [ + "log", +] + +[[package]] +name = "siphasher" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38b58827f4464d87d377d175e90bf58eb00fd8716ff0a62f80356b5e61555d0d" + +[[package]] +name = "smallvec" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "stability" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d904e7009df136af5297832a3ace3370cd14ff1546a232f4f185036c2736fcac" +dependencies = [ + "quote", + "syn 2.0.71", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strsim" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f" + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.71", +] + +[[package]] +name = "svgtypes" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22975e8a2bac6a76bb54f898a6b18764633b00e780330f0b689f65afb3975564" +dependencies = [ + "siphasher", +] + +[[package]] +name = "syn" +version = "1.0.109" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b64191b275b66ffe2469e8af2c1cfe3bafa67b529ead792a6d0160888b4237" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "2.0.71" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b146dcf730474b4bcd16c311627b31ede9ab149045db4d6088b3becaea046462" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "system-deps" +version = "6.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3e535eb8dded36d55ec13eddacd30dec501792ff23a0b1682c38601b8cf2349" +dependencies = [ + "cfg-expr", + "heck", + "pkg-config", + "toml", + "version-compare", +] + +[[package]] +name = "target-lexicon" +version = "0.12.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4873307b7c257eddcb50c9bedf158eb669578359fb28428bef438fec8e6ba7c2" + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand", + "rustix", + "windows-sys 0.52.0", +] + +[[package]] +name = "text-to-png" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b77c9daf0c55b10ef445266dbf0d58705c80496526de2c00643459958d956663" +dependencies = [ + "derive-new", + "fontdb", + "lazy_static", + "png", + "resvg", + "siphasher", + "thiserror", + "tiny-skia", + "usvg", + "xml-rs", +] + +[[package]] +name = "thiserror" +version = "1.0.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2675633b1499176c2dff06b0856a27976a8f9d436737b4cf4f312d4d91d8bbb" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.62" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d20468752b09f49e909e55a5d338caa8bedf615594e9d80bc4c565d30faf798c" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder 0.3.1", + "weezl", +] + +[[package]] +name = "tiny-skia" +version = "0.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d049bfef0eaa2521e75d9ffb5ce86ad54480932ae19b85f78bec6f52c4d30d78" +dependencies = [ + "arrayref", + "arrayvec 0.5.2", + "bytemuck", + "cfg-if", + "png", + "safe_arch", +] + +[[package]] +name = "tinyvec" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml" +version = "0.8.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81967dd0dd2c1ab0bc3468bd7caecc32b8a4aa47d0c8c695d8c2b2108168d62c" +dependencies = [ + "serde", + "serde_spanned", + "toml_datetime", + "toml_edit", +] + +[[package]] +name = "toml_datetime" +version = "0.6.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fb9f64314842840f1d940ac544da178732128f1c78c21772e876579e0da1db" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_edit" +version = "0.22.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d9f8729f5aea9562aac1cc0441f5d6de3cff1ee0c5d67293eeca5eb36ee7c16" +dependencies = [ + "indexmap", + "serde", + "serde_spanned", + "toml_datetime", + "winnow", +] + +[[package]] +name = "ttf-parser" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ae2f58a822f08abdaf668897e96a5656fe72f5a9ce66422423e8849384872e6" + +[[package]] +name = "tui-input" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b02e86628a225c39b2602863f244a01668184149928ceb410e47a8022d7597e" +dependencies = [ + "crossterm", + "unicode-width", +] + +[[package]] +name = "tui-tree-widget" +version = "0.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ac69db35529be6a75f9d27516ff33df299e2e8e961a1986d52185cef0427352" +dependencies = [ + "ratatui", + "unicode-width", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "unicode-bidi" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" + +[[package]] +name = "unicode-bidi-mirroring" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56d12260fb92d52f9008be7e4bca09f584780eb2266dc8fecc6a192bec561694" + +[[package]] +name = "unicode-ccc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc2520efa644f8268dce4dcd3050eaa7fc044fca03961e9998ac7e2e92b77cf1" + +[[package]] +name = "unicode-general-category" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07547e3ee45e28326cc23faac56d44f58f16ab23e413db526debce3b0bfd2742" + +[[package]] +name = "unicode-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-normalization" +version = "0.1.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a56d1686db2308d901306f92a263857ef59ea39678a5458e7cb17f01415101f5" +dependencies = [ + "tinyvec", +] + +[[package]] +name = "unicode-script" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8d71f5726e5f285a935e9fe8edfd53f0491eb6e9a5774097fdabee7cd8c9cd" + +[[package]] +name = "unicode-segmentation" +version = "1.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4c87d22b6e3f4a18d4d40ef354e97c90fcb14dd91d7dc0aa9d8a1172ebf7202" + +[[package]] +name = "unicode-truncate" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3644627a5af5fa321c95b9b235a72fd24cd29c648c2c379431e6628655627bf" +dependencies = [ + "itertools 0.13.0", + "unicode-segmentation", + "unicode-width", +] + +[[package]] +name = "unicode-vo" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" + +[[package]] +name = "unicode-width" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0336d538f7abc86d282a4189614dfaa90810dfc2c6f6427eaf88e16311dd225d" + +[[package]] +name = "usvg" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f472f6f5d41d3eaef059bc893dcd2382eefcdda3e04ebe0b2860c56b538e491e" +dependencies = [ + "base64 0.13.1", + "data-url", + "flate2", + "float-cmp", + "fontdb", + "kurbo", + "log", + "pico-args", + "rctree", + "roxmltree", + "rustybuzz", + "simplecss", + "siphasher", + "svgtypes", + "ttf-parser", + "unicode-bidi", + "unicode-script", + "unicode-vo", + "xmlwriter", +] + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "v_frame" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f32aaa24bacd11e488aa9ba66369c7cd514885742c9fe08cfe85884db3e92b" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "version-compare" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "852e951cb7832cb45cb1169900d19760cfa39b82bc0ea9c0e5a14ae88411c98b" + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "wasi" +version = "0.11.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" + +[[package]] +name = "wasm-bindgen" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4be2531df63900aeb2bca0daaaddec08491ee64ceecbee5076636a3b026795a8" +dependencies = [ + "cfg-if", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "614d787b966d3989fa7bb98a654e369c762374fd3213d212cfc0251257e747da" +dependencies = [ + "bumpalo", + "log", + "once_cell", + "proc-macro2", + "quote", + "syn 2.0.71", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1f8823de937b71b9460c0c34e25f3da88250760bec0ebac694b49997550d726" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e94f17b526d0a461a191c78ea52bbce64071ed5c04c9ffe424dcb38f74171bb7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af190c94f2773fdb3729c55b007a722abb5384da03bc0986df4c289bf5567e96" + +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-util" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4d4cc384e1e73b93bafa6fb4f1df8c41695c8a91cf9c4c64358067d15a7b6c6b" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows-core" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33ab640c8d7e35bf8ba19b884ba838ceb4fba93a4e8c65a9059d08afcfc683d9" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "winnow" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59b5e5f6c299a3c7890b876a2a587f3115162487e704907d9b6cd29473052ba1" +dependencies = [ + "memchr", +] + +[[package]] +name = "x11rb" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d91ffca73ee7f68ce055750bf9f6eca0780b8c85eff9bc046a3b0da41755e12" +dependencies = [ + "gethostname", + "rustix", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec107c4503ea0b4a98ef47356329af139c0a4f7750e621cf2973cd3385ebcb3d" + +[[package]] +name = "xdg" +version = "2.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213b7324336b53d2414b2db8537e56544d981803139155afa84f76eeebb7a546" + +[[package]] +name = "xml-rs" +version = "0.8.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791978798f0597cfc70478424c2b4fdc2b7a8024aaff78497ef00f24ef674193" + +[[package]] +name = "xmlparser" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66fee0b777b0f5ac1c69bb06d361268faafa61cd4682ae064a171c16c433e9e4" + +[[package]] +name = "xmlwriter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" + +[[package]] +name = "zerocopy" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.71", +] + +[[package]] +name = "zune-core" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f423a2c17029964870cfaabb1f13dfab7d092a62a29a89264f4d36990ca414a" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec866b44a2a1fd6133d363f073ca1b179f438f99e7e5bfb1e33f7181facfe448" +dependencies = [ + "zune-core", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..2f4f619 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,38 @@ +[package] +name = "serie" +version = "0.1.0" +description = "A rich git commit graph in your terminal, like magic" +authors = ["Kyosuke Fujimoto "] +homepage = "https://github.com/lusingander/serie" +repository = "https://github.com/lusingander/serie" +readme = "README.md" +license = "MIT" +keywords = ["git", "cli", "tui", "terminal"] +categories = ["command-line-utilities"] +edition = "2021" + +exclude = ["/.github", "/img"] + +[dependencies] +arboard = "3.4.0" +base64 = "0.22.1" +chrono = "0.4.38" +clap = { version = "4.5.9", features = ["derive"] } +console = "0.15.8" +image = "0.25.1" +olpc-cjson = "0.1.3" +ratatui = "0.27.0" +rayon = "1.10.0" +semver = "1.0.23" +serde = { version = "1.0.204", features = ["derive"] } +serde_json = "1.0.120" +sha1 = "0.10.6" +toml = "0.8.16" +tui-input = "0.9.0" +tui-tree-widget = "0.21.0" +xdg = "2.5.2" + +[dev-dependencies] +dircpy = "0.3.16" +tempfile = "3.10.1" +text-to-png = "0.2.0" diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..82f132e --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2024 Kyosuke Fujimoto + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..d5c12f7 --- /dev/null +++ b/README.md @@ -0,0 +1,245 @@ +# Serie + +[![Crate Status](https://img.shields.io/crates/v/serie.svg)](https://crates.io/crates/serie) + +A rich git commit graph in your terminal, like magic 📚 + + + +(This demo shows [Ratatui](https://github.com/ratatui-org/ratatui) repository!) + +## About + +Serie (`/zéːriə/`) is a TUI application that uses the terminal emulators' image display protocol to render commit graphs like `git log --graph --all`. + +### Why? + +While some users prefer to use Git via CLI, they often rely on a GUI or feature-rich TUI to view commit logs. Others may find `git log --graph` sufficient. + +Personally, I found the output from `git log --graph` difficult to read, even with additional options. Learning complex tools just to view logs seemed cumbersome. + +### Goals + +- Provide a rich `git log --graph` experience in the terminal. +- Offer commit graph-centric browsing of Git repositories. + +### Non-Goals + +- Implement a fully-featured Git client. +- Create a TUI application with a complex UI. + +## Requirements + +- Git +- Supported terminal emulator + - Refer to [Compatibility](#compatibility) for details. + +## Installation + +### Cargo + +``` +$ cargo install --locked serie +``` + +### Homebrew (macOS) + +``` +$ brew install lusingander/tap/serie +``` + +### Downloading binary + +You can download pre-compiled binaries from [releases](https://github.com/lusingander/serie/releases). + +## Usage + +### Basic + +Run `serie` in the directory where your git repository exists. + +``` +$ cd +$ serie +``` + +### Options + +``` +Serie - A rich git commit graph in your terminal, like magic 📚 + +Usage: serie [OPTIONS] + +Options: + -p, --protocol Image protocol to render graph [default: iterm] [possible values: iterm, kitty] + -o, --order Commit ordering algorithm [default: chrono] [possible values: chrono, topo] + --no-cache Do not use graph image cache + -h, --help Print help + -V, --version Print version +``` + +#### -p, --protocol \ + +A protocol type for rendering images of commit graphs. + +Refer to [Compatibility](#compatibility) for details. + +#### -o, --order \ + +`--order chrono` will order commits by commit date if possible. + + + +`--order topo` will order commits on the same branch consecutively if possible. + + + +#### --no-cache + +The generated graph image is saved in `$XDG_CACHE_HOME/serie` and reused. +If `$XDG_CACHE_HOME` is not set, `~/.cache/` will be used instead. + +If `--no-cache` is specified, this cache image will not be used or saved. + +### Keybindings + +You can see the keybindings by pressing the `?` key. + +
+List of all keybindings + +#### Common + +| Key | Description | +| ------------------------------ | ----------- | +| Ctrl-c q | Quit app | +| ? | Open help | + +#### Commit List + +| Key | Description | +| --------------------------------- | -------------------------------------------------- | +| Down/Up j/k | Move down/up | +| g/G | Go to top/bottom | +| Ctrl-f/b | Scroll page down/up | +| Ctrl-d/u | Scroll half page down/up | +| H/M/L | Select top/middle/bottom of the screen | +| Enter | Show commit details
Apply search (if searching) | +| Tab | Open refs list | +| / | Start search | +| Esc | Cancel search | +| n/N | Go to next/previous search match | +| c/C | Copy commit short/full hash | + +#### Commit Detail + +| Key | Description | +| ----------------------------------- | --------------------------- | +| Esc Backspace | Close commit details | +| Down/Up j/k | Scroll down/up | +| c/C | Copy commit short/full hash | + +#### Refs List + +| Key | Description | +| -------------------------------------------------- | ---------------- | +| Esc Backspace Tab | Close refs list | +| Down/Up j/k | Move down/up | +| g/G | Go to top/bottom | +| Right/Left l/h | Open/Close node | +| c | Copy ref name | + +#### Help + +| Key | Description | +| ------------------------------------------------ | -------------- | +| Esc Backspace ? | Close help | +| Down/Up j/k | Scroll down/up | + +
+ +### Config + +If `$XDG_CONFIG_HOME/serie/config.toml` exists, it will be read and used. +If `$XDG_CONFIG_HOME` is not set, `~/.cache/` will be used instead. + +If the config file does not exist, the default values will be used for all items. +If the config file exists but some items are not set, the default values will be used for those unset items. + +#### Config file format + +The values set in this example are the default values. + +```toml +[ui.list] +# The minimum width of a subject in the commit list. +# type: u16 +subject_min_width = 20 +# The date format of a author date in the commit list. +# The format must be specified in strftime format. +# https://docs.rs/chrono/latest/chrono/format/strftime/index.html +# type: string +date_format = "%Y-%m-%d" +# The width of a author date in the commit list. +# type: u16 +date_width = 10 +# The width of a author name in the commit list. +# type: u16 +name_width = 20 + +[ui.detail] +# The date format of a author/committer date in the commit detail. +# The format must be specified in strftime format. +# https://docs.rs/chrono/latest/chrono/format/strftime/index.html +# type: string +date_format = "%Y-%m-%d %H:%M:%S %z" +``` + +## Compatibility + +### Supported terminals + +These image protocols are supported: + +- [Inline Images Protocol (iTerm2)](https://iterm2.com/documentation-images.html) +- [Terminal graphics protocol (kitty)](https://sw.kovidgoyal.net/kitty/graphics-protocol/) + +The terminals on which each has been confirmed to work are listed below. + +#### Inline Images Protocol + +| Terminal emulator | Support | +| -------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------- | +| [iTerm2](https://iterm2.com) | ○ (But slower than other terminals) | +| [WezTerm](https://wezfurlong.org/wezterm/index.html) | ○ | +| [VSCode integrated terminal](https://code.visualstudio.com/docs/terminal/basics) | ○ | +| [Hyper](https://hyper.is) | △ (>=[v4.0.0](https://github.com/vercel/hyper/releases/tag/v4.0.0-canary.4), not yet officially released) | +| [Tabby](https://tabby.sh) | △ (The graph background is not transparent) | + +#### Terminal graphics protocol + +| Terminal emulator | Support | +| ----------------------------------------- | ------- | +| [kitty](https://sw.kovidgoyal.net/kitty/) | ○ | + +### Reporting Compatibility + +Please share your experience with other terminal emulators on the [Discussions](https://github.com/lusingander/serie/discussions). + +## Screenshots + + + + + + + +The following repositories are used as these examples: + +- [ratatui-org/ratatui](https://github.com/ratatui-org/ratatui) +- [charmbracelet/vhs](https://github.com/charmbracelet/vhs) +- [lusingander/stu](https://github.com/lusingander/stu) + +## License + +MIT diff --git a/img/applied.png b/img/applied.png new file mode 100644 index 0000000000000000000000000000000000000000..179d9b253854ebf3c55d525554dbd5bccefc4c0f GIT binary patch literal 1087556 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