commit e892c2f8a375925f726654aa2f8cb09c4942614b Author: Isaac Mills Date: Mon Mar 18 18:21:35 2024 -0400 Initial commit diff --git a/.cargo/config.toml b/.cargo/config.toml new file mode 100644 index 0000000..bac83fe --- /dev/null +++ b/.cargo/config.toml @@ -0,0 +1,6 @@ +# clipboard api is still unstable, so web-sys requires the below flag to be passed for copy (ctrl + c) to work +# https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html +# check status at https://developer.mozilla.org/en-US/docs/Web/API/Clipboard#browser_compatibility +# we don't use `[build]` because of rust analyzer's build cache invalidation https://github.com/emilk/eframe_template/issues/93 +[target.wasm32-unknown-unknown] +rustflags = ["--cfg=web_sys_unstable_apis"] \ No newline at end of file diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000..c0c4e47 --- /dev/null +++ b/.gitattributes @@ -0,0 +1 @@ +assets/ filter=lfs diff=lfs merge=lfs -text diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml new file mode 100644 index 0000000..36d1f89 --- /dev/null +++ b/.github/workflows/pages.yml @@ -0,0 +1,45 @@ +name: Github Pages + +# By default, runs if you push to master. keeps your deployed app in sync with master branch. +on: + push: + branches: + - master +# to only run when you do a new github release, comment out above part and uncomment the below trigger. +# on: +# release: +# types: +# - published + +permissions: + contents: write # for committing to gh-pages branch. + +jobs: + build-github-pages: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 # repo checkout + - uses: actions-rs/toolchain@v1 # get rust toolchain for wasm + with: + profile: minimal + toolchain: stable + target: wasm32-unknown-unknown + override: true + - name: Rust Cache # cache the rust build artefacts + uses: Swatinem/rust-cache@v1 + - name: Download and install Trunk binary + run: wget -qO- https://github.com/thedodd/trunk/releases/latest/download/trunk-x86_64-unknown-linux-gnu.tar.gz | tar -xzf- + - name: Build # build + # "${GITHUB_REPOSITORY#*/}" evaluates into the name of the repository + # using --public-url something will allow trunk to modify all the href paths like from favicon.ico to repo_name/favicon.ico . + # this is necessary for github pages where the site is deployed to username.github.io/repo_name and all files must be requested + # relatively as eframe_template/favicon.ico. if we skip public-url option, the href paths will instead request username.github.io/favicon.ico which + # will obviously return error 404 not found. + run: ./trunk build --release --public-url "${GITHUB_REPOSITORY#*/}" + - name: Deploy + uses: JamesIves/github-pages-deploy-action@v4 + with: + folder: dist + # this option will not maintain any history of your previous pages deployment + # set to false if you want all page build to be committed to your gh-pages branch history + single-commit: true diff --git a/.github/workflows/rust.yml b/.github/workflows/rust.yml new file mode 100644 index 0000000..64d6e88 --- /dev/null +++ b/.github/workflows/rust.yml @@ -0,0 +1,105 @@ +on: [push, pull_request] + +name: CI + +env: + # This is required to enable the web_sys clipboard API which egui_web uses + # https://rustwasm.github.io/wasm-bindgen/api/web_sys/struct.Clipboard.html + # https://rustwasm.github.io/docs/wasm-bindgen/web-sys/unstable-apis.html + RUSTFLAGS: --cfg=web_sys_unstable_apis + +jobs: + check: + name: Check + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + - uses: actions-rs/cargo@v1 + with: + command: check + args: --all-features + + check_wasm: + name: Check wasm32 + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + target: wasm32-unknown-unknown + override: true + - uses: actions-rs/cargo@v1 + with: + command: check + args: --all-features --lib --target wasm32-unknown-unknown + + test: + name: Test Suite + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + - run: sudo apt-get install libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev libssl-dev + - uses: actions-rs/cargo@v1 + with: + command: test + args: --lib + + fmt: + name: Rustfmt + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + components: rustfmt + - uses: actions-rs/cargo@v1 + with: + command: fmt + args: --all -- --check + + clippy: + name: Clippy + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: stable + override: true + components: clippy + - uses: actions-rs/cargo@v1 + with: + command: clippy + args: -- -D warnings + + trunk: + name: trunk + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: actions-rs/toolchain@v1 + with: + profile: minimal + toolchain: 1.72.0 + target: wasm32-unknown-unknown + override: true + - name: Download and install Trunk binary + run: wget -qO- https://github.com/thedodd/trunk/releases/latest/download/trunk-x86_64-unknown-linux-gnu.tar.gz | tar -xzf- + - name: Build + run: ./trunk build diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..4f96631 --- /dev/null +++ b/.gitignore @@ -0,0 +1,2 @@ +/target +/dist diff --git a/.woodpecker.yml b/.woodpecker.yml new file mode 100644 index 0000000..10108c8 --- /dev/null +++ b/.woodpecker.yml @@ -0,0 +1,17 @@ +steps: + - name: build + image: rust + commands: + - wget https://github.com/mozilla/sccache/releases/download/v0.7.7/sccache-v0.7.7-x86_64-unknown-linux-musl.tar.gz + - tar xzf sccache-v0.7.7-x86_64-unknown-linux-musl.tar.gz + - mv sccache-v0.7.7-x86_64-unknown-linux-musl/sccache /usr/bin/sccache + - chmod +x /usr/bin/sccache + - sccache --start-server + - sccache --show-stats + - curl -L --proto '=https' --tlsv1.2 -sSf https://raw.githubusercontent.com/cargo-bins/cargo-binstall/main/install-from-binstall-release.sh | bash + - cargo binstall trunk + - trunk build --release -- --target-dir /var/woodpecker/portfolio-build + - rm -rf /var/woodpecker/portfolio + - mv dist /var/woodpecker/portfolio + volumes: + - /var/woodpecker:/var/woodpecker diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..fdd1968 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,4225 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "ab_glyph" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80179d7dd5d7e8c285d67c4a1e652972a92de7475beddfb92028c76463b13225" +dependencies = [ + "ab_glyph_rasterizer", + "owned_ttf_parser", +] + +[[package]] +name = "ab_glyph_rasterizer" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046" + +[[package]] +name = "accesskit" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74a4b14f3d99c1255dcba8f45621ab1a2e7540a0009652d33989005a4d0bfc6b" +dependencies = [ + "enumn", + "serde", +] + +[[package]] +name = "accesskit_consumer" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c17cca53c09fbd7288667b22a201274b9becaa27f0b91bf52a526db95de45e6" +dependencies = [ + "accesskit", +] + +[[package]] +name = "accesskit_macos" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd3b6ae1eabbfbced10e840fd3fce8a93ae84f174b3e4ba892ab7bcb42e477a7" +dependencies = [ + "accesskit", + "accesskit_consumer", + "objc2 0.3.0-beta.3.patch-leaks.3", + "once_cell", +] + +[[package]] +name = "accesskit_unix" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09f46c18d99ba61ad7123dd13eeb0c104436ab6af1df6a1cd8c11054ed394a08" +dependencies = [ + "accesskit", + "accesskit_consumer", + "async-channel", + "async-once-cell", + "atspi", + "futures-lite 1.13.0", + "once_cell", + "serde", + "zbus", +] + +[[package]] +name = "accesskit_windows" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "afcae27ec0974fc7c3b0b318783be89fd1b2e66dd702179fe600166a38ff4a0b" +dependencies = [ + "accesskit", + "accesskit_consumer", + "once_cell", + "paste", + "static_assertions", + "windows 0.48.0", +] + +[[package]] +name = "accesskit_winit" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5284218aca17d9e150164428a0ebc7b955f70e3a9a78b4c20894513aabf98a67" +dependencies = [ + "accesskit", + "accesskit_macos", + "accesskit_unix", + "accesskit_windows", + "winit", +] + +[[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", + "getrandom", + "once_cell", + "serde", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2969dcb958b36655471fc61f7e416fa76033bdd4bfed0678d8fee1e2d07a1f0" +dependencies = [ + "memchr", +] + +[[package]] +name = "allocator-api2" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" + +[[package]] +name = "android-activity" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee91c0c2905bae44f84bfa4e044536541df26b7703fd0888deeb9060fcc44289" +dependencies = [ + "android-properties", + "bitflags 2.4.2", + "cc", + "cesu8", + "jni", + "jni-sys", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum", + "thiserror", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + +[[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 = "arboard" +version = "3.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2041f1943049c7978768d84e6d0fd95de98b76d6c4727b09e78ec253d29fa58" +dependencies = [ + "clipboard-win", + "log", + "objc", + "objc-foundation", + "objc_id", + "parking_lot", + "thiserror", + "x11rb", +] + +[[package]] +name = "arrayvec" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "ash" +version = "0.37.3+1.3.251" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39e9c3835d686b0a6084ab4234fcd1b07dbf6e4767dce60874b12356a25ecd4a" +dependencies = [ + "libloading 0.7.4", +] + +[[package]] +name = "async-broadcast" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c48ccdbf6ca6b121e0f586cbc0e73ae440e56c67c30fa0873b4e110d9c26d2b" +dependencies = [ + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f28243a43d821d11341ab73c80bed182dc015c514b951616cf79bd4af39af0c3" +dependencies = [ + "concurrent-queue", + "event-listener 5.2.0", + "event-listener-strategy 0.5.0", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17ae5ebefcc48e7452b4987947920dac9450be1110cadf34d1b8c116bdbaf97c" +dependencies = [ + "async-lock 3.3.0", + "async-task", + "concurrent-queue", + "fastrand 2.0.1", + "futures-lite 2.2.0", + "slab", +] + +[[package]] +name = "async-fs" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "279cf904654eeebfa37ac9bb1598880884924aab82e290aa65c9e77a0e142e06" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "blocking", + "futures-lite 1.13.0", +] + +[[package]] +name = "async-io" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af" +dependencies = [ + "async-lock 2.8.0", + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-lite 1.13.0", + "log", + "parking", + "polling 2.8.0", + "rustix 0.37.27", + "slab", + "socket2", + "waker-fn", +] + +[[package]] +name = "async-io" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dcccb0f599cfa2f8ace422d3555572f47424da5648a4382a9dd0310ff8210884" +dependencies = [ + "async-lock 3.3.0", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.2.0", + "parking", + "polling 3.5.0", + "rustix 0.38.31", + "slab", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "async-lock" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "287272293e9d8c41773cec55e365490fe034813a2f172f502d6ddcf75b2f582b" +dependencies = [ + "event-listener 2.5.3", +] + +[[package]] +name = "async-lock" +version = "3.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d034b430882f8381900d3fe6f0aaa3ad94f2cb4ac519b429692a1bc2dda4ae7b" +dependencies = [ + "event-listener 4.0.3", + "event-listener-strategy 0.4.0", + "pin-project-lite", +] + +[[package]] +name = "async-once-cell" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9338790e78aa95a416786ec8389546c4b6a1dfc3dc36071ed9518a9413a542eb" + +[[package]] +name = "async-process" +version = "1.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6438ba0a08d81529c69b36700fa2f95837bfe3e776ab39cde9c14d9149da88" +dependencies = [ + "async-io 1.13.0", + "async-lock 2.8.0", + "async-signal", + "blocking", + "cfg-if", + "event-listener 3.1.0", + "futures-lite 1.13.0", + "rustix 0.38.31", + "windows-sys 0.48.0", +] + +[[package]] +name = "async-recursion" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5fd55a5ba1179988837d24ab4c7cc8ed6efdeff578ede0416b4225a5fca35bd0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "async-signal" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e47d90f65a225c4527103a8d747001fc56e375203592b25ad103e1ca13124c5" +dependencies = [ + "async-io 2.3.2", + "async-lock 2.8.0", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 0.38.31", + "signal-hook-registry", + "slab", + "windows-sys 0.48.0", +] + +[[package]] +name = "async-task" +version = "4.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbb36e985947064623dbd357f727af08ffd077f93d696782f3c56365fa2e2799" + +[[package]] +name = "async-trait" +version = "0.1.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "461abc97219de0eaaf81fe3ef974a540158f3d079c2ab200f891f1a2ef201e85" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "atspi" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6059f350ab6f593ea00727b334265c4dfc7fd442ee32d264794bd9bdc68e87ca" +dependencies = [ + "atspi-common", + "atspi-connection", + "atspi-proxies", +] + +[[package]] +name = "atspi-common" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92af95f966d2431f962bc632c2e68eda7777330158bf640c4af4249349b2cdf5" +dependencies = [ + "enumflags2", + "serde", + "static_assertions", + "zbus", + "zbus_names", + "zvariant", +] + +[[package]] +name = "atspi-connection" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0c65e7d70f86d4c0e3b2d585d9bf3f979f0b19d635a336725a88d279f76b939" +dependencies = [ + "atspi-common", + "atspi-proxies", + "futures-lite 1.13.0", + "zbus", +] + +[[package]] +name = "atspi-proxies" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6495661273703e7a229356dcbe8c8f38223d697aacfaf0e13590a9ac9977bb52" +dependencies = [ + "atspi-common", + "serde", + "zbus", +] + +[[package]] +name = "autocfg" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" + +[[package]] +name = "base64" +version = "0.21.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d297deb1925b89f2ccc13d7635fa0714f12c87adce1c75356b39ca9b7178567" + +[[package]] +name = "bit-set" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.6.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "349f9b6a179ed607305526ca489b34ad0a41aed5f7980fa90eb03160b69598fb" + +[[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.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed570934406eb16438a4e976b1b4500774099c13b8cb96eec99f620f05090ddf" + +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + +[[package]] +name = "block-buffer" +version = "0.10.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3078c7629b62d3f0439517fa394996acacc5cbc91c5a20d8c658e77abd503a71" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block-sys" +version = "0.1.0-beta.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fa55741ee90902547802152aaf3f8e5248aab7e21468089560d4c8840561146" +dependencies = [ + "objc-sys 0.2.0-beta.2", +] + +[[package]] +name = "block-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae85a0696e7ea3b835a453750bf002770776609115e6d25c6d2ff28a8200f7e7" +dependencies = [ + "objc-sys 0.3.2", +] + +[[package]] +name = "block2" +version = "0.2.0-alpha.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8dd9e63c1744f755c2f60332b88de39d341e5e86239014ad839bd71c106dec42" +dependencies = [ + "block-sys 0.1.0-beta.1", + "objc2-encode 2.0.0-pre.2", +] + +[[package]] +name = "block2" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15b55663a85f33501257357e6421bb33e769d5c9ffb5ba0921c975a123e35e68" +dependencies = [ + "block-sys 0.2.1", + "objc2 0.4.1", +] + +[[package]] +name = "blocking" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a37913e8dc4ddcc604f0c6d3bf2887c995153af3611de9e23c352b44c1b9118" +dependencies = [ + "async-channel", + "async-lock 3.3.0", + "async-task", + "fastrand 2.0.1", + "futures-io", + "futures-lite 2.2.0", + "piper", + "tracing", +] + +[[package]] +name = "bumpalo" +version = "3.15.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ff69b9dd49fd426c69a0db9fc04dd934cdb6645ff000864d98f7e2af8830eaa" + +[[package]] +name = "bytemuck" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d6d68c57235a3a081186990eca2867354726650f42f7516ca50c28d6281fd15" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4da9a32f3fed317401fa3c862968128267c3106685286e15d5aaa3d7389c2f60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "bytes" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2bd12c1caf447e69cd4528f47f94d203fd2582878ecb9e9465484c4148a8223" + +[[package]] +name = "calloop" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fba7adb4dd5aa98e5553510223000e7148f621165ec5f9acd7113f6ca4995298" +dependencies = [ + "bitflags 2.4.2", + "log", + "polling 3.5.0", + "rustix 0.38.31", + "slab", + "thiserror", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f0ea9b9476c7fad82841a8dbb380e2eae480c21910feba80725b46931ed8f02" +dependencies = [ + "calloop", + "rustix 0.38.31", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "cc" +version = "1.0.90" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5" +dependencies = [ + "jobserver", + "libc", +] + +[[package]] +name = "cesu8" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d43a04d8753f35258c91f8ec639f792891f748a1edbd759cf1dcea3382ad83c" + +[[package]] +name = "cfg-if" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" + +[[package]] +name = "cfg_aliases" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd16c4719339c4530435d38e511904438d07cce7950afa3718a84ac36c10e89e" + +[[package]] +name = "clipboard-win" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d517d4b86184dbb111d3556a10f1c8a04da7428d2987bf1081602bf11c3aa9ee" +dependencies = [ + "error-code", +] + +[[package]] +name = "cocoa" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation", + "core-graphics", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation", + "core-graphics-types", + "libc", + "objc", +] + +[[package]] +name = "codespan-reporting" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3538270d33cc669650c4b093848450d380def10c331d38c768e34cac80576e6e" +dependencies = [ + "termcolor", + "unicode-width", +] + +[[package]] +name = "color_quant" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b" + +[[package]] +name = "com" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e17887fd17353b65b1b2ef1c526c83e26cd72e74f598a8dc1bee13a48f3d9f6" +dependencies = [ + "com_macros", +] + +[[package]] +name = "com_macros" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d375883580a668c7481ea6631fc1a8863e33cc335bf56bfad8d7e6d4b04b13a5" +dependencies = [ + "com_macros_support", + "proc-macro2", + "syn 1.0.109", +] + +[[package]] +name = "com_macros_support" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad899a1087a9296d5644792d7cb72b8e34c1bec8e7d4fbc002230169a6e8710c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "combine" +version = "4.6.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35ed6e9d84f0b51a7f52daf1c7d71dd136fd7a3f41a8462b8cdb8c78d920fad4" +dependencies = [ + "bytes", + "memchr", +] + +[[package]] +name = "concurrent-queue" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d16048cd947b08fa32c24458a22f5dc5e835264f689f4f5653210c69fd107363" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const_panic" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6051f239ecec86fde3410901ab7860d458d160371533842974fc61f96d15879b" + +[[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.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "970a29baf4110c26fedbc7f82107d42c23f7e88e404c4577ed73fe99ff85a212" +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 = "cosmic-jotdown" +version = "0.1.0" +dependencies = [ + "cosmic-text", + "jotdown", + "log", + "range-map", +] + +[[package]] +name = "cosmic-text" +version = "0.11.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c578f2b9abb4d5f3fbb12aba4008084d435dc6a8425c195cfe0b3594bfea0c25" +dependencies = [ + "bitflags 2.4.2", + "fontdb", + "libm", + "log", + "rangemap", + "rustc-hash", + "rustybuzz", + "self_cell", + "swash", + "sys-locale", + "ttf-parser", + "unicode-bidi", + "unicode-linebreak", + "unicode-script", + "unicode-segmentation", +] + +[[package]] +name = "cpufeatures" +version = "0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53fe5e26ff1b7aef8bca9c6080520cfb8d9333c7568e1829cef191a9723e5504" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3855a8a784b474f333699ef2bbca9db2c4a1f6d9088a90a2d25b1eb53111eaa" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b82ac4a3c2ca9c3460964f020e1402edd5753411d7737aa39c3714ad1b5420e" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" + +[[package]] +name = "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 = "cursor-icon" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96a6ac251f4a2aca6b3f91340350eab87ae57c3f127ffeb585e92bd336717991" + +[[package]] +name = "d3d12" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3e3d747f100290a1ca24b752186f61f6637e1deffe3bf6320de6fcb29510a307" +dependencies = [ + "bitflags 2.4.2", + "libloading 0.8.3", + "winapi", +] + +[[package]] +name = "databake" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82175d72e69414ceafbe2b49686794d3a8bed846e0d50267355f83ea8fdd953a" +dependencies = [ + "databake-derive", + "proc-macro2", + "quote", +] + +[[package]] +name = "databake-derive" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "377af281d8f23663862a7c84623bc5dcf7f8c44b13c7496a590bdc157f941a43" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", + "synstructure", +] + +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +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 = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading 0.8.3", +] + +[[package]] +name = "document-features" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef5282ad69563b5fc40319526ba27e0e7363d552a896f0297d54f767717f9b95" +dependencies = [ + "litrs", +] + +[[package]] +name = "downcast-rs" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ea835d29036a4087793836fa931b08837ad5e957da9e23886b29586fb9b6650" + +[[package]] +name = "ecolor" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03cfe80b1890e1a8cdbffc6044d6872e814aaf6011835a2a5e2db0e5c5c4ef4e" +dependencies = [ + "bytemuck", + "serde", +] + +[[package]] +name = "eframe" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c456c1bb6d13bf68b780257484703d750c70a23ff891ba35f4d6e23a4dbdf26f" +dependencies = [ + "bytemuck", + "cocoa", + "document-features", + "egui", + "egui-wgpu", + "egui-winit", + "egui_glow", + "image", + "js-sys", + "log", + "objc", + "parking_lot", + "percent-encoding", + "pollster", + "raw-window-handle 0.6.0", + "static_assertions", + "thiserror", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "web-time", + "wgpu", + "winapi", + "winit", +] + +[[package]] +name = "egui" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "180f595432a5b615fc6b74afef3955249b86cfea72607b40740a4cd60d5297d0" +dependencies = [ + "accesskit", + "ahash", + "epaint", + "log", + "nohash-hasher", + "serde", +] + +[[package]] +name = "egui-glyphon" +version = "0.1.0" +dependencies = [ + "egui", + "egui-wgpu", + "glyphon", +] + +[[package]] +name = "egui-wgpu" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86f2d75e1e70228e7126f828bac05f9fe0e7ea88e9660c8cebe609bb114c61d4" +dependencies = [ + "bytemuck", + "document-features", + "egui", + "epaint", + "log", + "thiserror", + "type-map", + "web-time", + "wgpu", + "winit", +] + +[[package]] +name = "egui-winit" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa4d44f8d89f70d4480545eb2346b76ea88c3022e9f4706cebc799dbe8b004a2" +dependencies = [ + "accesskit_winit", + "arboard", + "egui", + "log", + "raw-window-handle 0.6.0", + "smithay-clipboard", + "web-time", + "webbrowser", + "winit", +] + +[[package]] +name = "egui_extras" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4a6962241a76da5be5e64e41b851ee1c95fda11f76635522a3c82b119b5475" +dependencies = [ + "egui", + "ehttp", + "enum-map", + "image", + "log", + "mime_guess2", + "serde", +] + +[[package]] +name = "egui_glow" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a08e3be8728b4c59493dbfec041c657e6725bdeafdbd49aef3f1dbb9e551fa01" +dependencies = [ + "bytemuck", + "egui", + "glow", + "log", + "memoffset 0.9.0", + "wasm-bindgen", + "web-sys", + "winit", +] + +[[package]] +name = "ehttp" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e598cc2bfc28612f26426259ed99a978270e9433d63ae6d2843e30fb0974cd02" +dependencies = [ + "document-features", + "js-sys", + "ureq", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "either" +version = "1.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" + +[[package]] +name = "emath" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6916301ecf80448f786cdf3eb51d9dbdd831538732229d49119e2d4312eaaf09" +dependencies = [ + "bytemuck", + "serde", +] + +[[package]] +name = "encase" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95ed933078d2e659745df651f4c180511cd582e5b9414ff896e7d50d207e3103" +dependencies = [ + "const_panic", + "encase_derive", + "glam", + "thiserror", +] + +[[package]] +name = "encase_derive" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4ce1449c7d19eba6cc0abd231150ad81620a8dce29601d7f8d236e5d431d72a" +dependencies = [ + "encase_derive_impl", +] + +[[package]] +name = "encase_derive_impl" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92959a9e8d13eaa13b8ae8c7b583c3bf1669ca7a8e7708a088d12587ba86effc" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "enum-map" +version = "2.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" +dependencies = [ + "enum-map-derive", + "serde", +] + +[[package]] +name = "enum-map-derive" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "enumflags2" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3278c9d5fb675e0a51dabcf4c0d355f692b064171535ba72361be1528a9d8e8d" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c785274071b1b420972453b306eeca06acf4633829db4223b58a2a8c5953bc4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "enumn" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fd000fd6988e73bbe993ea3db9b1aa64906ab88766d654973924340c8cddb42" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "env_logger" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4cd405aab171cb85d6735e5c8d9db038c17d3ca007a4d2c25f337935c3d90580" +dependencies = [ + "humantime", + "is-terminal", + "log", + "regex", + "termcolor", +] + +[[package]] +name = "epaint" +version = "0.26.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77b9fdf617dd7f58b0c8e6e9e4a1281f730cde0831d40547da446b2bb76a47af" +dependencies = [ + "ab_glyph", + "ahash", + "bytemuck", + "ecolor", + "emath", + "log", + "nohash-hasher", + "parking_lot", + "serde", +] + +[[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.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245" +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 = "etagere" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "306960881d6c46bd0dd6b7f07442a441418c08d0d3e63d8d080b0f64c6343e4e" +dependencies = [ + "euclid", + "svg_fmt", +] + +[[package]] +name = "euclid" +version = "0.22.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87f253bc5c813ca05792837a0ff4b3a580336b224512d48f7eda1d7dd9210787" +dependencies = [ + "num-traits", +] + +[[package]] +name = "event-listener" +version = "2.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" + +[[package]] +name = "event-listener" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d93877bcde0eb80ca09131a08d23f0a5c18a620b01db137dba666d18cd9b30c2" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "4.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67b215c49b2b248c855fb73579eb1f4f26c38ffdc12973e20e07b91d78d5646e" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener" +version = "5.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b5fb89194fa3cad959b833185b3063ba881dbfc7030680b314250779fb4cc91" +dependencies = [ + "concurrent-queue", + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "958e4d70b6d5e81971bebec42271ec641e7ff4e170a6fa605f2b8a8b65cb97d3" +dependencies = [ + "event-listener 4.0.3", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "feedafcaa9b749175d5ac357452a9d41ea2911da598fde46ce1fe02c37751291" +dependencies = [ + "event-listener 5.2.0", + "pin-project-lite", +] + +[[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 = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be" +dependencies = [ + "instant", +] + +[[package]] +name = "fastrand" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25cbce373ec4653f1a01a31e8a5e5ec0c622dc27ff9c4e6606eefef5cbbed4a5" + +[[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.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46303f565772937ffe1d394a4fac6f411c6013172fadde9dcdb1e147a086940e" +dependencies = [ + "crc32fast", + "miniz_oxide", +] + +[[package]] +name = "flume" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ac459de2512911e4b674ce33cf20befaba382d05b62b008afc1c8b57cbf181" +dependencies = [ + "spin", +] + +[[package]] +name = "font-types" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b7f6040d337bd44434ab21fc6509154edf2cece88b23758d9d64654c4e7730b" + +[[package]] +name = "fontconfig-parser" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a595cb550439a117696039dfc69830492058211b771a2a165379f2a1a53d84d" +dependencies = [ + "roxmltree", +] + +[[package]] +name = "fontdb" +version = "0.16.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0299020c3ef3f60f526a4f64ab4a3d4ce116b1acbf24cdd22da0068e5d81dc3" +dependencies = [ + "fontconfig-parser", + "log", + "memmap2", + "slotmap", + "tinyvec", + "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.53", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "futures-core" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfc6580bb841c5a68e9ef15c77ccc837b40a7504914d52e47b8b0e9bbda25a1d" + +[[package]] +name = "futures-io" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a44623e20b9681a318efdd71c299b6b222ed6f231972bfe2f224ebad6311f0c1" + +[[package]] +name = "futures-lite" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce" +dependencies = [ + "fastrand 1.9.0", + "futures-core", + "futures-io", + "memchr", + "parking", + "pin-project-lite", + "waker-fn", +] + +[[package]] +name = "futures-lite" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "445ba825b27408685aaecefd65178908c36c6e96aaf6d8599419d46e624192ba" +dependencies = [ + "fastrand 2.0.1", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-sink" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb8e00e87438d937621c1c6269e53f536c14d3fbd6a042bb24879e57d474fb5" + +[[package]] +name = "futures-task" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38d84fa142264698cdce1a9f9172cf383a0c82de1bddcf3092901442c4097004" + +[[package]] +name = "futures-util" +version = "0.3.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d6401deb83407ab3da39eba7e33987a73c3df0c82b4bb5813ee871c19c41d48" +dependencies = [ + "futures-core", + "futures-io", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "pin-utils", + "slab", +] + +[[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.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +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 = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + +[[package]] +name = "glam" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "151665d9be52f9bb40fc7966565d39666f2d1e69233571b71b87791c7e0528b3" + +[[package]] +name = "glob" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" + +[[package]] +name = "glow" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd348e04c43b32574f2de31c8bb397d96c9fcfa1371bd4ca6d8bdc464ab121b1" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c8098adac955faa2d31079b65dc48841251f69efd3ac25477903fc424362ead" +dependencies = [ + "gl_generator", +] + +[[package]] +name = "glyphon" +version = "0.5.0" +dependencies = [ + "cosmic-text", + "etagere", + "lru", + "wgpu", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbcd2dba93594b227a1f57ee09b8b9da8892c34d55aa332e034a228d0fe6a171" +dependencies = [ + "bitflags 2.4.2", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98ff03b468aa837d70984d55f5d3f846f6ec31fe34bbb97c4f85219caeee1ca4" +dependencies = [ + "bitflags 2.4.2", +] + +[[package]] +name = "gpu-allocator" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f56f6318968d03c18e1bcf4857ff88c61157e9da8e47c5f29055d60e1228884" +dependencies = [ + "log", + "presser", + "thiserror", + "winapi", + "windows 0.52.0", +] + +[[package]] +name = "gpu-descriptor" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc11df1ace8e7e564511f53af41f3e42ddc95b56fd07b3f4445d2a6048bc682c" +dependencies = [ + "bitflags 2.4.2", + "gpu-descriptor-types", + "hashbrown", +] + +[[package]] +name = "gpu-descriptor-types" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bf0b36e6f090b7e1d8a4b49c0cb81c1f8376f72198c65dd3ad9ff3556b8b78c" +dependencies = [ + "bitflags 2.4.2", +] + +[[package]] +name = "half" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5eceaaeec696539ddaf7b333340f1af35a5aa87ae3e4f3ead0532f72affab2e" +dependencies = [ + "cfg-if", + "crunchy", +] + +[[package]] +name = "hashbrown" +version = "0.14.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604" +dependencies = [ + "ahash", + "allocator-api2", +] + +[[package]] +name = "hassle-rs" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af2a7e73e1f34c48da31fb668a907f250794837e08faa144fd24f0b8b741e890" +dependencies = [ + "bitflags 2.4.2", + "com", + "libc", + "libloading 0.8.3", + "thiserror", + "widestring", + "winapi", +] + +[[package]] +name = "hermit-abi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" + +[[package]] +name = "hex" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70" + +[[package]] +name = "hexf-parse" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa686283ad6dd069f105e5ab091b04c62850d3e4cf5d67debad1933f55023df" + +[[package]] +name = "home" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3d1354bf6b7235cb4a0576c2619fd4ed18183f689b12b006a0ee7329eeff9a5" +dependencies = [ + "windows-sys 0.52.0", +] + +[[package]] +name = "humantime" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4" + +[[package]] +name = "icrate" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99d3aaff8a54577104bafdf686ff18565c3b6903ca5782a2026ef06e2c7aa319" +dependencies = [ + "block2 0.3.0", + "dispatch", + "objc2 0.4.1", +] + +[[package]] +name = "idna" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "634d9b1461af396cad843f47fdba5597a4f9e6ddd4bfb6ff5d85028c25cb12f6" +dependencies = [ + "unicode-bidi", + "unicode-normalization", +] + +[[package]] +name = "image" +version = "0.24.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5690139d2f55868e080017335e4b94cb7414274c74f1669c84fb5feba2c9f69d" +dependencies = [ + "bytemuck", + "byteorder", + "color_quant", + "exr", + "gif", + "jpeg-decoder", + "num-traits", + "png", + "qoi", + "tiff", +] + +[[package]] +name = "indexmap" +version = "2.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4" +dependencies = [ + "equivalent", + "hashbrown", +] + +[[package]] +name = "instant" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "io-lifetimes" +version = "1.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.48.0", +] + +[[package]] +name = "is-terminal" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f23ff5ef2b80d608d61efee834934d862cd92461afc0560dedf493e4c033738b" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys 0.52.0", +] + +[[package]] +name = "jni" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a87aa2bb7d2af34197c04845522473242e1aa17c12f4935d5856491a7fb8c97" +dependencies = [ + "cesu8", + "cfg-if", + "combine", + "jni-sys", + "log", + "thiserror", + "walkdir", + "windows-sys 0.45.0", +] + +[[package]] +name = "jni-sys" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" + +[[package]] +name = "jobserver" +version = "0.1.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab46a6e9526ddef3ae7f787c06f0f2600639ba80ea3eade3d8e670a2230f51d6" +dependencies = [ + "libc", +] + +[[package]] +name = "jotdown" +version = "0.3.2" +dependencies = [ + "databake", +] + +[[package]] +name = "jpeg-decoder" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f5d4a7da358eff58addd2877a45865158f0d78c911d43a5784ceb7bbf52833b0" +dependencies = [ + "rayon", +] + +[[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 = "keyframe" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60708bf7981518d09095d6f5673ce5cf6a64f1e0d9708b554f670e6d9d2bd9a9" +dependencies = [ + "num-traits", +] + +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading 0.8.3", + "pkg-config", +] + +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + +[[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.153" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" + +[[package]] +name = "libloading" +version = "0.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67380fd3b2fbe7527a606e18729d21c6f3951633d0500574c4dc22d2d638b9f" +dependencies = [ + "cfg-if", + "winapi", +] + +[[package]] +name = "libloading" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c2a198fb6b0eada2a8df47933734e6d35d350665a33a3593d7164fa52c75c19" +dependencies = [ + "cfg-if", + "windows-targets 0.52.4", +] + +[[package]] +name = "libm" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ec2a862134d2a7d32d7983ddcdd1c4923530833c9f2ea1a44fc5fa473989058" + +[[package]] +name = "libredox" +version = "0.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3af92c55d7d839293953fcd0fda5ecfe93297cfde6ffbdec13b41d99c0ba6607" +dependencies = [ + "bitflags 2.4.2", + "libc", + "redox_syscall 0.4.1", +] + +[[package]] +name = "linux-raw-sys" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519" + +[[package]] +name = "linux-raw-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c" + +[[package]] +name = "litrs" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" + +[[package]] +name = "lock_api" +version = "0.4.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45" +dependencies = [ + "autocfg", + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ed8c1e510134f979dbc4f070f87d4313098b704861a105fe34231c70a3901c" + +[[package]] +name = "lru" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3262e75e648fce39813cb56ac41f3c3e3f65217ebf3844d818d1f9398cfb0dc" +dependencies = [ + "hashbrown", +] + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "memchr" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149" + +[[package]] +name = "memmap2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe751422e4a8caa417e13c3ea66452215d7d63e19e604f4980461212f3ae1322" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5de893c32cde5f383baa4c04c5d6dbdd735cfd4a794b0debdb2bb1b421da5ff4" +dependencies = [ + "autocfg", +] + +[[package]] +name = "memoffset" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a634b1c61a95585bd15607c6ab0c4e5b226e695ff2800ba0cdccddf208c406c" +dependencies = [ + "autocfg", +] + +[[package]] +name = "metal" +version = "0.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c43f73953f8cbe511f021b58f18c3ce1c3d1ae13fe953293e13345bf83217f25" +dependencies = [ + "bitflags 2.4.2", + "block", + "core-graphics-types", + "foreign-types", + "log", + "objc", + "paste", +] + +[[package]] +name = "mime" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" + +[[package]] +name = "mime_guess2" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25a3333bb1609500601edc766a39b4c1772874a4ce26022f4d866854dc020c41" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "miniz_oxide" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7" +dependencies = [ + "adler", + "simd-adler32", +] + +[[package]] +name = "naga" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50e3524642f53d9af419ab5e8dd29d3ba155708267667c2f3f06c88c9e130843" +dependencies = [ + "bit-set", + "bitflags 2.4.2", + "codespan-reporting", + "hexf-parse", + "indexmap", + "log", + "num-traits", + "rustc-hash", + "spirv", + "termcolor", + "thiserror", + "unicode-xid", +] + +[[package]] +name = "ndk" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7" +dependencies = [ + "bitflags 2.4.2", + "jni-sys", + "log", + "ndk-sys", + "num_enum", + "raw-window-handle 0.6.0", + "thiserror", +] + +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + +[[package]] +name = "ndk-sys" +version = "0.5.0+25.2.9519653" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691" +dependencies = [ + "jni-sys", +] + +[[package]] +name = "nix" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "598beaf3cc6fdd9a5dfb1630c2800c7acd31df7aaf0f565796fba2b53ca1af1b" +dependencies = [ + "bitflags 1.3.2", + "cfg-if", + "libc", + "memoffset 0.7.1", +] + +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + +[[package]] +name = "num-traits" +version = "0.2.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0df0e5185db44f69b44f26786fe401b6c293d1907744beaa7fa62b2e5a517a" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_enum" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "02339744ee7253741199f897151b38e72257d13802d4ee837285cc2990a90845" +dependencies = [ + "num_enum_derive", +] + +[[package]] +name = "num_enum_derive" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "681030a937600a36906c185595136d26abfebb4aa9c65701cefcaf8578bb982b" +dependencies = [ + "proc-macro-crate 3.1.0", + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", + "objc_exception", +] + +[[package]] +name = "objc-foundation" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1add1b659e36c9607c7aab864a76c7a4c2760cd0cd2e120f3fb8b952c7e22bf9" +dependencies = [ + "block", + "objc", + "objc_id", +] + +[[package]] +name = "objc-sys" +version = "0.2.0-beta.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df3b9834c1e95694a05a828b59f55fa2afec6288359cda67146126b3f90a55d7" + +[[package]] +name = "objc-sys" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c7c71324e4180d0899963fc83d9d241ac39e699609fc1025a850aadac8257459" + +[[package]] +name = "objc2" +version = "0.3.0-beta.3.patch-leaks.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e01640f9f2cb1220bbe80325e179e532cb3379ebcd1bf2279d703c19fe3a468" +dependencies = [ + "block2 0.2.0-alpha.6", + "objc-sys 0.2.0-beta.2", + "objc2-encode 2.0.0-pre.2", +] + +[[package]] +name = "objc2" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "559c5a40fdd30eb5e344fbceacf7595a81e242529fb4e21cf5f43fb4f11ff98d" +dependencies = [ + "objc-sys 0.3.2", + "objc2-encode 3.0.0", +] + +[[package]] +name = "objc2-encode" +version = "2.0.0-pre.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "abfcac41015b00a120608fdaa6938c44cb983fee294351cc4bac7638b4e50512" +dependencies = [ + "objc-sys 0.2.0-beta.2", +] + +[[package]] +name = "objc2-encode" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d079845b37af429bfe5dfa76e6d087d788031045b25cfc6fd898486fd9847666" + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "once_cell" +version = "1.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fdb12b2476b595f9358c5161aa467c2438859caa136dec86c26fdd2efe17b92" + +[[package]] +name = "orbclient" +version = "0.3.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52f0d54bde9774d3a51dcf281a5def240c71996bc6ca05d2c847ec8b2b216166" +dependencies = [ + "libredox", +] + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "owned_ttf_parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d4586edfe4c648c71797a74c84bacb32b52b212eff5dfe2bb9f2c599844023e7" +dependencies = [ + "ttf-parser", +] + +[[package]] +name = "parking" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb813b8af86854136c6922af0598d719255ecb2179515e6e7730d468f05c9cae" + +[[package]] +name = "parking_lot" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.4.1", + "smallvec", + "windows-targets 0.48.5", +] + +[[package]] +name = "paste" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c" + +[[package]] +name = "percent-encoding" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e" + +[[package]] +name = "pin-project-lite" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58" + +[[package]] +name = "pin-utils" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" + +[[package]] +name = "piper" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "668d31b1c4eba19242f2088b2bf3316b82ca31082a8335764db4e083db7485d4" +dependencies = [ + "atomic-waker", + "fastrand 2.0.1", + "futures-io", +] + +[[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 = "polling" +version = "2.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce" +dependencies = [ + "autocfg", + "bitflags 1.3.2", + "cfg-if", + "concurrent-queue", + "libc", + "log", + "pin-project-lite", + "windows-sys 0.48.0", +] + +[[package]] +name = "polling" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24f040dee2588b4963afb4e420540439d126f73fdacf4a9c486a96d840bac3c9" +dependencies = [ + "cfg-if", + "concurrent-queue", + "pin-project-lite", + "rustix 0.38.31", + "tracing", + "windows-sys 0.52.0", +] + +[[package]] +name = "pollster" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22686f4785f02a4fcc856d3b3bb19bf6c8160d103f7a99cc258bddd0251dc7f2" + +[[package]] +name = "portfolio" +version = "0.1.0" +dependencies = [ + "cosmic-jotdown", + "databake", + "eframe", + "egui-glyphon", + "egui_extras", + "encase", + "env_logger", + "glam", + "glob", + "image", + "jotdown", + "keyframe", + "log", + "range-map", + "wasm-bindgen-futures", + "wgpu", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" + +[[package]] +name = "presser" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e8cf8e6a8aa66ce33f63993ffc4ea4271eb5b0530a9002db8455ea6050c77bfa" + +[[package]] +name = "proc-macro-crate" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f4c021e1093a56626774e81216a4ce732a735e5bad4868a03f3ed65ca0c3919" +dependencies = [ + "once_cell", + "toml_edit 0.19.15", +] + +[[package]] +name = "proc-macro-crate" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d37c51ca738a55da99dc0c4a34860fd675453b8b36209178c2249bb13651284" +dependencies = [ + "toml_edit 0.21.1", +] + +[[package]] +name = "proc-macro2" +version = "1.0.79" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d84d1d7a6ac92673717f9f6d1518374ef257669c24ebc5ac25d5033828be58" + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-xml" +version = "0.31.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1004a344b30a54e2ee58d66a71b32d2db2feb0a31f9a2d302bf0536f15de2a33" +dependencies = [ + "memchr", +] + +[[package]] +name = "quote" +version = "1.0.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +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 = "range-alloc" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c8a99fddc9f0ba0a85884b8d14e3592853e787d581ca1816c91349b10e4eeab" + +[[package]] +name = "range-map" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12a5a2d6c7039059af621472a4389be1215a816df61aa4d531cfe85264aee95f" +dependencies = [ + "num-traits", +] + +[[package]] +name = "rangemap" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60fcc7d6849342eff22c4350c8b9a989ee8ceabc4b481253e8946b9fe83d684" + +[[package]] +name = "raw-window-handle" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2ff9a1f06a88b01621b7ae906ef0211290d1c8a168a15542486a8f61c0833b9" + +[[package]] +name = "raw-window-handle" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42a9830a0e1b9fb145ebb365b8bc4ccd75f290f98c0247deafbbe2c75cefb544" + +[[package]] +name = "rayon" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" +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 = "read-fonts" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81c524658d3b77930a391f559756d91dbe829ab6cf4687083f615d395df99722" +dependencies = [ + "font-types", +] + +[[package]] +name = "redox_syscall" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "567664f262709473930a4bf9e51bf2ebf3348f2e748ccc50dea20646858f8f29" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "regex" +version = "1.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "86b83b8b9847f9bf95ef68afb0b8e6cdb80f498442f5179a29fad448fcc1eaea" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c08c74e62047bb2de4ff487b251e4a92e24f48745648451635cec7d591162d9f" + +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + +[[package]] +name = "ring" +version = "0.17.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17fa4cb658e3583423e915b9f3acc01cceaee1860e33d59ebae66adc3a2dc0d" +dependencies = [ + "cc", + "cfg-if", + "getrandom", + "libc", + "spin", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "roxmltree" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3cd14fd5e3b777a7422cca79358c57a8f6e3a703d9ac187448d0daf220c2407f" + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustix" +version = "0.37.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2" +dependencies = [ + "bitflags 1.3.2", + "errno", + "io-lifetimes", + "libc", + "linux-raw-sys 0.3.8", + "windows-sys 0.48.0", +] + +[[package]] +name = "rustix" +version = "0.38.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea3e1a662af26cd7a3ba09c0297a31af215563ecf42817c98df621387f4e949" +dependencies = [ + "bitflags 2.4.2", + "errno", + "libc", + "linux-raw-sys 0.4.13", + "windows-sys 0.52.0", +] + +[[package]] +name = "rustls" +version = "0.22.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e87c9956bd9807afa1f77e0f7594af32566e830e088a5576d27c5b6f30f49d41" +dependencies = [ + "log", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-pki-types" +version = "1.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ede67b28608b4c60685c7d54122d4400d90f62b40caee7700e700380a390fa8" + +[[package]] +name = "rustls-webpki" +version = "0.102.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "faaa0a62740bedb9b2ef5afa303da42764c012f743917351dc9a237ea1663610" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustybuzz" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0ae5692c5beaad6a9e22830deeed7874eae8a4e3ba4076fb48e12c56856222c" +dependencies = [ + "bitflags 2.4.2", + "bytemuck", + "libm", + "smallvec", + "ttf-parser", + "unicode-bidi-mirroring", + "unicode-ccc", + "unicode-properties", + "unicode-script", +] + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "scoped-tls" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" + +[[package]] +name = "scopeguard" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49" + +[[package]] +name = "self_cell" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "58bf37232d3bb9a2c4e641ca2a11d83b5062066f88df7fed36c28772046d65ba" + +[[package]] +name = "serde" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.197" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "serde_repr" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b2e6b945e9d3df726b65d6ee24060aff8e3533d431f677a9695db04eff9dfdb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[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-registry" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +dependencies = [ + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" + +[[package]] +name = "slab" +version = "0.4.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f92a496fb766b417c996b9c5e57daf2f7ad3b0bebe1ccfca4856390e3d3bb67" +dependencies = [ + "autocfg", +] + +[[package]] +name = "slotmap" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7" + +[[package]] +name = "smithay-client-toolkit" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "922fd3eeab3bd820d76537ce8f582b1cf951eceb5475c28500c7457d9d17f53a" +dependencies = [ + "bitflags 2.4.2", + "calloop", + "calloop-wayland-source", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix 0.38.31", + "thiserror", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-clipboard" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c091e7354ea8059d6ad99eace06dd13ddeedbb0ac72d40a9a6e7ff790525882d" +dependencies = [ + "libc", + "smithay-client-toolkit", + "wayland-backend", +] + +[[package]] +name = "smol_str" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6845563ada680337a52d43bb0b29f396f2d911616f6573012645b9e3d048a49" +dependencies = [ + "serde", +] + +[[package]] +name = "socket2" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7916fc008ca5542385b89a3d3ce689953c143e9304a9bf8beec1de48994c0d" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "spin" +version = "0.9.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6980e8d7511241f8acf4aebddbb1ff938df5eebe98691418c4468d0b72a96a67" +dependencies = [ + "lock_api", +] + +[[package]] +name = "spirv" +version = "0.3.0+sdk-1.3.268.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eda41003dc44290527a59b13432d4a0379379fa074b70174882adfbdfd917844" +dependencies = [ + "bitflags 2.4.2", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "subtle" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" + +[[package]] +name = "svg_fmt" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83ba502a3265efb76efb89b0a2f7782ad6f2675015d4ce37e4b547dda42b499" + +[[package]] +name = "swash" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9af636fb90d39858650cae1088a37e2862dab4e874a0bb49d6dfb5b2dacf0e24" +dependencies = [ + "read-fonts", + "yazi", + "zeno", +] + +[[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.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "synstructure" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "sys-locale" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e801cf239ecd6ccd71f03d270d67dd53d13e90aab208bf4b8fe4ad957ea949b0" +dependencies = [ + "libc", +] + +[[package]] +name = "tempfile" +version = "3.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85b77fafb263dd9d05cbeac119526425676db3784113aa9295c88498cbf8bff1" +dependencies = [ + "cfg-if", + "fastrand 2.0.1", + "rustix 0.38.31", + "windows-sys 0.52.0", +] + +[[package]] +name = "termcolor" +version = "1.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06794f8f6c5c898b3275aebefa6b8a1cb24cd2c6c79397ab15774837a0bc5755" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "thiserror" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297" +dependencies = [ + "thiserror-impl", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "tiff" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba1310fcea54c6a9a4fd1aad794ecc02c31682f6bfbecdf460bf19533eed1e3e" +dependencies = [ + "flate2", + "jpeg-decoder", + "weezl", +] + +[[package]] +name = "tinyvec" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50" +dependencies = [ + "tinyvec_macros", +] + +[[package]] +name = "tinyvec_macros" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20" + +[[package]] +name = "toml_datetime" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1" + +[[package]] +name = "toml_edit" +version = "0.19.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "toml_edit" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a8534fd7f78b5405e860340ad6575217ce99f38d4d5c8f2442cb5ecb50090e1" +dependencies = [ + "indexmap", + "toml_datetime", + "winnow", +] + +[[package]] +name = "tracing" +version = "0.1.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3523ab5a71916ccf420eebdf5521fcef02141234bbc0b8a49f2fdc4544364ef" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "tracing-core" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c06d3da6113f116aaee68e4d601191614c9053067f9ab7f6edbcb161237daa54" +dependencies = [ + "once_cell", +] + +[[package]] +name = "ttf-parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" + +[[package]] +name = "type-map" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "deb68604048ff8fa93347f02441e4487594adc20bb8a084f9e564d2b827a0a9f" +dependencies = [ + "rustc-hash", +] + +[[package]] +name = "typenum" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" + +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset 0.9.0", + "tempfile", + "winapi", +] + +[[package]] +name = "unicase" +version = "2.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7d2d4dafb69621809a81864c9c1b864479e1235c0dd4e199924b9742439ed89" +dependencies = [ + "version_check", +] + +[[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-ident" +version = "1.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" + +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + +[[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-properties" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4259d9d4425d9f0661581b804cb85fe66a4c631cadd8f490d1c13a35d5d9291" + +[[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-width" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e51733f11c9c4f72aa0c160008246859e340b00807569a0da0e7a1079b27ba85" + +[[package]] +name = "unicode-xid" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "ureq" +version = "2.9.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11f214ce18d8b2cbe84ed3aa6486ed3f5b285cf8d8fbdbce9f3f767a724adc35" +dependencies = [ + "base64", + "flate2", + "log", + "once_cell", + "rustls", + "rustls-pki-types", + "rustls-webpki", + "url", + "webpki-roots", +] + +[[package]] +name = "url" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "31e6302e3bb753d46e83516cae55ae196fc0c309407cf11ab35cc51a4c2a4633" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", +] + +[[package]] +name = "version_check" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f" + +[[package]] +name = "waker-fn" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c4517f54858c779bbcbf228f4fca63d121bf85fbecb2dc578cdf4a39395690" + +[[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.53", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76bc14366121efc8dbb487ab05bcc9d346b3b5ec0eaa76e46594cabbe51762c0" +dependencies = [ + "cfg-if", + "js-sys", + "wasm-bindgen", + "web-sys", +] + +[[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.53", + "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 = "wayland-backend" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9d50fa61ce90d76474c87f5fc002828d81b32677340112b4ef08079a9d459a40" +dependencies = [ + "cc", + "downcast-rs", + "rustix 0.38.31", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82fb96ee935c2cea6668ccb470fb7771f6215d1691746c2d896b447a00ad3f1f" +dependencies = [ + "bitflags 2.4.2", + "rustix 0.38.31", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-csd-frame" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" +dependencies = [ + "bitflags 2.4.2", + "cursor-icon", + "wayland-backend", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71ce5fa868dd13d11a0d04c5e2e65726d0897be8de247c0c5a65886e283231ba" +dependencies = [ + "rustix 0.38.31", + "wayland-client", + "xcursor", +] + +[[package]] +name = "wayland-protocols" +version = "0.31.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f81f365b8b4a97f422ac0e8737c438024b5951734506b0e1d775c73030561f4" +dependencies = [ + "bitflags 2.4.2", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23803551115ff9ea9bce586860c5c5a971e360825a0309264102a9495a5ff479" +dependencies = [ + "bitflags 2.4.2", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad1f61b76b6c2d8742e10f9ba5c3737f6530b4c243132c2a2ccc8aa96fe25cd6" +dependencies = [ + "bitflags 2.4.2", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b3a62929287001986fb58c789dce9b67604a397c15c611ad9f747300b6c283" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15a0c8eaff5216d07f226cb7a549159267f3467b289d9a2e52fd3ef5aae2b7af" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77afa9a11836342370f4817622a2f0f418b134426d91a82dfb48f532d2ec13ef" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa30049b1c872b72c89866d458eae9f20380ab280ffd1b1e18df2d3e2d98cfe0" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "webbrowser" +version = "0.8.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1b04c569c83a9bb971dd47ec6fd48753315f4bf989b9b04a2e7ca4d7f0dc950" +dependencies = [ + "core-foundation", + "home", + "jni", + "log", + "ndk-context", + "objc", + "raw-window-handle 0.5.2", + "url", + "web-sys", +] + +[[package]] +name = "webpki-roots" +version = "0.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b3de34ae270483955a94f4b21bdaaeb83d508bb84a01435f393818edb0012009" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "weezl" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" + +[[package]] +name = "wgpu" +version = "0.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4b1213b52478a7631d6e387543ed8f642bc02c578ef4e3b49aca2a29a7df0cb" +dependencies = [ + "arrayvec", + "cfg-if", + "cfg_aliases", + "js-sys", + "log", + "naga", + "parking_lot", + "profiling", + "raw-window-handle 0.6.0", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "0.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9f6b033c2f00ae0bc8ea872c5989777c60bc241aac4e58b24774faa8b391f78" +dependencies = [ + "arrayvec", + "bit-vec", + "bitflags 2.4.2", + "cfg_aliases", + "codespan-reporting", + "indexmap", + "log", + "naga", + "once_cell", + "parking_lot", + "profiling", + "raw-window-handle 0.6.0", + "rustc-hash", + "smallvec", + "thiserror", + "web-sys", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-hal" +version = "0.19.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "49f972c280505ab52ffe17e94a7413d9d54b58af0114ab226b9fc4999a47082e" +dependencies = [ + "android_system_properties", + "arrayvec", + "ash", + "bit-set", + "bitflags 2.4.2", + "block", + "cfg_aliases", + "core-graphics-types", + "d3d12", + "glow", + "glutin_wgl_sys", + "gpu-alloc", + "gpu-allocator", + "gpu-descriptor", + "hassle-rs", + "js-sys", + "khronos-egl", + "libc", + "libloading 0.8.3", + "log", + "metal", + "naga", + "ndk-sys", + "objc", + "once_cell", + "parking_lot", + "profiling", + "range-alloc", + "raw-window-handle 0.6.0", + "renderdoc-sys", + "rustc-hash", + "smallvec", + "thiserror", + "wasm-bindgen", + "web-sys", + "wgpu-types", + "winapi", +] + +[[package]] +name = "wgpu-types" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b671ff9fb03f78b46ff176494ee1ebe7d603393f42664be55b64dc8d53969805" +dependencies = [ + "bitflags 2.4.2", + "js-sys", + "web-sys", +] + +[[package]] +name = "widestring" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "653f141f39ec16bba3c5abe400a0c60da7468261cc2cbf36805022876bc721a8" + +[[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.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f29e6f9198ba0d26b4c9f07dbe6f9ed633e1f3d5b8b414090084349e46a52596" +dependencies = [ + "winapi", +] + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" + +[[package]] +name = "windows" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e686886bc078bc1b0b600cac0147aadb815089b6e4da64016cbd754b6342700f" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-targets 0.48.5", +] + +[[package]] +name = "windows" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e48a53791691ab099e5e2ad123536d0fff50652600abaf43bbf952894110d0be" +dependencies = [ + "windows-core", + "windows-targets 0.52.4", +] + +[[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.4", +] + +[[package]] +name = "windows-implement" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e2ee588991b9e7e6c8338edf3333fbe4da35dc72092643958ebb43f0ab2c49c" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "windows-interface" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6fb8df20c9bcaa8ad6ab513f7b40104840c8867d5751126e4df3b08388d0cc7" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "windows-sys" +version = "0.45.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75283be5efb2831d37ea142365f009c02ec203cd29a3ebecbc093d52315b66d0" +dependencies = [ + "windows-targets 0.42.2", +] + +[[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.4", +] + +[[package]] +name = "windows-targets" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e5180c00cd44c9b1c88adb3693291f1cd93605ded80c250a75d472756b4d071" +dependencies = [ + "windows_aarch64_gnullvm 0.42.2", + "windows_aarch64_msvc 0.42.2", + "windows_i686_gnu 0.42.2", + "windows_i686_msvc 0.42.2", + "windows_x86_64_gnu 0.42.2", + "windows_x86_64_gnullvm 0.42.2", + "windows_x86_64_msvc 0.42.2", +] + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b" +dependencies = [ + "windows_aarch64_gnullvm 0.52.4", + "windows_aarch64_msvc 0.52.4", + "windows_i686_gnu 0.52.4", + "windows_i686_msvc 0.52.4", + "windows_x86_64_gnu 0.52.4", + "windows_x86_64_gnullvm 0.52.4", + "windows_x86_64_msvc 0.52.4", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675" + +[[package]] +name = "windows_i686_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3" + +[[package]] +name = "windows_i686_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.42.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" + +[[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.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8" + +[[package]] +name = "winit" +version = "0.29.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d59ad965a635657faf09c8f062badd885748428933dad8e8bdd64064d92e5ca" +dependencies = [ + "ahash", + "android-activity", + "atomic-waker", + "bitflags 2.4.2", + "bytemuck", + "calloop", + "cfg_aliases", + "core-foundation", + "core-graphics", + "cursor-icon", + "icrate", + "js-sys", + "libc", + "log", + "memmap2", + "ndk", + "ndk-sys", + "objc2 0.4.1", + "once_cell", + "orbclient", + "percent-encoding", + "raw-window-handle 0.6.0", + "redox_syscall 0.3.5", + "rustix 0.38.31", + "smithay-client-toolkit", + "smol_str", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.48.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + +[[package]] +name = "winnow" +version = "0.5.40" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f593a95398737aeed53e489c785df13f3618e41dbcd6718c6addbf1395aa6876" +dependencies = [ + "memchr", +] + +[[package]] +name = "x11-dl" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38735924fedd5314a6e548792904ed8c6de6636285cb9fec04d5b1db85c1516f" +dependencies = [ + "libc", + "once_cell", + "pkg-config", +] + +[[package]] +name = "x11rb" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8f25ead8c7e4cba123243a6367da5d3990e0d3affa708ea19dce96356bd9f1a" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "libloading 0.8.3", + "once_cell", + "rustix 0.38.31", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e63e71c4b8bd9ffec2c963173a4dc4cbde9ee96961d4fcb4429db9929b606c34" + +[[package]] +name = "xcursor" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a0ccd7b4a5345edfcd0c3535718a4e9ff7798ffc536bb5b5a0e26ff84732911" + +[[package]] +name = "xdg-home" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "21e5a325c3cb8398ad6cf859c1135b25dd29e186679cf2da7581d9679f63b38e" +dependencies = [ + "libc", + "winapi", +] + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.4.2", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "054a8e68b76250b253f671d1268cb7f1ae089ec35e195b2efb2a4e9a836d0621" + +[[package]] +name = "xml-rs" +version = "0.8.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fcb9cbac069e033553e8bb871be2fbdffcab578eb25bd0f7c508cedc6dcd75a" + +[[package]] +name = "yazi" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c94451ac9513335b5e23d7a8a2b61a7102398b8cca5160829d313e84c9d98be1" + +[[package]] +name = "zbus" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "675d170b632a6ad49804c8cf2105d7c31eddd3312555cffd4b740e08e97c25e6" +dependencies = [ + "async-broadcast", + "async-executor", + "async-fs", + "async-io 1.13.0", + "async-lock 2.8.0", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "byteorder", + "derivative", + "enumflags2", + "event-listener 2.5.3", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix", + "once_cell", + "ordered-stream", + "rand", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "winapi", + "xdg-home", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7131497b0f887e8061b430c530240063d33bf9455fa34438f388a245da69e0a5" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "regex", + "syn 1.0.109", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "437d738d3750bed6ca9b8d423ccc7a8eb284f6b1d6d4e225a0e4e6258d864c8d" +dependencies = [ + "serde", + "static_assertions", + "zvariant", +] + +[[package]] +name = "zeno" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd15f8e0dbb966fd9245e7498c7e9e5055d9e5c8b676b95bd67091cd11a1e697" + +[[package]] +name = "zerocopy" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "74d4d3961e53fa4c9a25a8637fc2bfaf2595b3d3ae34875568a5cf64787716be" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.7.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ce1b18ccd8e73a9321186f97e46f9f04b778851177567b1975109d26a08d2a6" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.53", +] + +[[package]] +name = "zeroize" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525b4ec142c6b68a2d10f01f7bbf6755599ca3f81ea53b8431b7dd348f5fdb2d" + +[[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 = "zvariant" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4eef2be88ba09b358d3b58aca6e41cd853631d44787f319a1383ca83424fb2db" +dependencies = [ + "byteorder", + "enumflags2", + "libc", + "serde", + "static_assertions", + "zvariant_derive", +] + +[[package]] +name = "zvariant_derive" +version = "3.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "37c24dc0bed72f5f90d1f8bb5b07228cbf63b3c6e9f82d82559d4bae666e7ed9" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7234f0d811589db492d16893e3f21e8e2fd282e6d01b0cddee310322062cc200" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..be1c693 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,61 @@ +[package] +name = "portfolio" +version = "0.1.0" +authors = ["Isaac Mills "] +edition = "2021" +rust-version = "1.72" + + +[dependencies] +cosmic-jotdown = { version = "0.1.0", path = "../cosmic-jotdown" } +eframe = { version = "0.26.2", default-features = false, features = [ + "accesskit", # Make egui comptaible with screen readers. NOTE: adds a lot of dependencies. + # "default_fonts", + "wgpu", # Use the glow rendering backend. Alternative: "wgpu". + "x11", + "wayland", +] } +egui-glyphon = { version = "0.1.0", path = "../egui-glyphon" } +egui_extras = { version = "0.26.2", features = ["image", "http", "file"] } +encase = { version = "0.7.0", features = ["glam"] } +glam = "0.25.0" +image = { version = "0.24.9", features = ["jpeg", "png"] } +keyframe = { version = "1.1.1", default-features = false } +log = "0.4" +range-map = "0.2.0" + +# native: +[target.'cfg(not(target_arch = "wasm32"))'.dependencies] +env_logger = "0.10" + +# web: +[target.'cfg(target_arch = "wasm32")'.dependencies] +wgpu = { version = "0.19.3", features = ["webgpu", "webgl"] } +wasm-bindgen-futures = "0.4" + + +[profile.release] +opt-level = 2 # fast and small wasm +lto = true +panic = "abort" +strip = true + +# Optimize all dependencies even in debug builds: +[profile.dev.package."*"] +opt-level = 2 + + +[patch.crates-io] + +[build-dependencies] +databake = "0.1.7" +glob = "0.3.1" +jotdown = { version = "0.3.2", path = "../jotdown", features = ["parser"] } + +# If you want to use the bleeding edge version of egui and eframe: +# egui = { git = "https://github.com/emilk/egui", branch = "master" } +# eframe = { git = "https://github.com/emilk/egui", branch = "master" } + +# If you fork https://github.com/emilk/egui you can test with: +# egui = { path = "../egui/crates/egui" } +# eframe = { path = "../egui/crates/eframe" } diff --git a/README.md b/README.md new file mode 100644 index 0000000..549b18b --- /dev/null +++ b/README.md @@ -0,0 +1,76 @@ +# eframe template + +[![dependency status](https://deps.rs/repo/github/emilk/eframe_template/status.svg)](https://deps.rs/repo/github/emilk/eframe_template) +[![Build Status](https://github.com/emilk/eframe_template/workflows/CI/badge.svg)](https://github.com/emilk/eframe_template/actions?workflow=CI) + +This is a template repo for [eframe](https://github.com/emilk/egui/tree/master/crates/eframe), a framework for writing apps using [egui](https://github.com/emilk/egui/). + +The goal is for this to be the simplest way to get started writing a GUI app in Rust. + +You can compile your app natively or for the web, and share it using Github Pages. + +## Getting started + +Start by clicking "Use this template" at https://github.com/emilk/eframe_template/ or follow [these instructions](https://docs.github.com/en/free-pro-team@latest/github/creating-cloning-and-archiving-repositories/creating-a-repository-from-a-template). + +Change the name of the crate: Chose a good name for your project, and change the name to it in: +* `Cargo.toml` + * Change the `package.name` from `eframe_template` to `your_crate`. + * Change the `package.authors` +* `main.rs` + * Change `eframe_template::TemplateApp` to `your_crate::TemplateApp` +* `index.html` + * Change the `eframe template` to `your_crate`. optional. +* `assets/sw.js` + * Change the `'./eframe_template.js'` to `./your_crate.js` (in `filesToCache` array) + * Change the `'./eframe_template_bg.wasm'` to `./your_crate_bg.wasm` (in `filesToCache` array) + +### Learning about egui + +`src/app.rs` contains a simple example app. This is just to give some inspiration - most of it can be removed if you like. + +The official egui docs are at . If you prefer watching a video introduction, check out . For inspiration, check out the [the egui web demo](https://emilk.github.io/egui/index.html) and follow the links in it to its source code. + +### Testing locally + +Make sure you are using the latest version of stable rust by running `rustup update`. + +`cargo run --release` + +On Linux you need to first run: + +`sudo apt-get install libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev libxkbcommon-dev libssl-dev` + +On Fedora Rawhide you need to run: + +`dnf install clang clang-devel clang-tools-extra libxkbcommon-devel pkg-config openssl-devel libxcb-devel gtk3-devel atk fontconfig-devel` + +### Web Locally + +You can compile your app to [WASM](https://en.wikipedia.org/wiki/WebAssembly) and publish it as a web page. + +We use [Trunk](https://trunkrs.dev/) to build for web target. +1. Install the required target with `rustup target add wasm32-unknown-unknown`. +2. Install Trunk with `cargo install --locked trunk`. +3. Run `trunk serve` to build and serve on `http://127.0.0.1:8080`. Trunk will rebuild automatically if you edit the project. +4. Open `http://127.0.0.1:8080/index.html#dev` in a browser. See the warning below. + +> `assets/sw.js` script will try to cache our app, and loads the cached version when it cannot connect to server allowing your app to work offline (like PWA). +> appending `#dev` to `index.html` will skip this caching, allowing us to load the latest builds during development. + +### Web Deploy +1. Just run `trunk build --release`. +2. It will generate a `dist` directory as a "static html" website +3. Upload the `dist` directory to any of the numerous free hosting websites including [GitHub Pages](https://docs.github.com/en/free-pro-team@latest/github/working-with-github-pages/configuring-a-publishing-source-for-your-github-pages-site). +4. we already provide a workflow that auto-deploys our app to GitHub pages if you enable it. +> To enable Github Pages, you need to go to Repository -> Settings -> Pages -> Source -> set to `gh-pages` branch and `/` (root). +> +> If `gh-pages` is not available in `Source`, just create and push a branch called `gh-pages` and it should be available. + +You can test the template app at . + +## Updating egui + +As of 2023, egui is in active development with frequent releases with breaking changes. [eframe_template](https://github.com/emilk/eframe_template/) will be updated in lock-step to always use the latest version of egui. + +When updating `egui` and `eframe` it is recommended you do so one version at the time, and read about the changes in [the egui changelog](https://github.com/emilk/egui/blob/master/CHANGELOG.md) and [eframe changelog](https://github.com/emilk/egui/blob/master/crates/eframe/CHANGELOG.md). diff --git a/Trunk.toml b/Trunk.toml new file mode 100644 index 0000000..a7b19c9 --- /dev/null +++ b/Trunk.toml @@ -0,0 +1 @@ +[build] diff --git a/assets/favicon.ico b/assets/favicon.ico new file mode 100755 index 0000000..61ad031 Binary files /dev/null and b/assets/favicon.ico differ diff --git a/assets/icon-1024.png b/assets/icon-1024.png new file mode 100644 index 0000000..1b5868a Binary files /dev/null and b/assets/icon-1024.png differ diff --git a/assets/icon-256.png b/assets/icon-256.png new file mode 100644 index 0000000..ae72287 Binary files /dev/null and b/assets/icon-256.png differ diff --git a/assets/icon_ios_touch_192.png b/assets/icon_ios_touch_192.png new file mode 100644 index 0000000..8472802 Binary files /dev/null and b/assets/icon_ios_touch_192.png differ diff --git a/assets/images/artix.png b/assets/images/artix.png new file mode 100644 index 0000000..ecd01b3 Binary files /dev/null and b/assets/images/artix.png differ diff --git a/assets/images/bitogo.jpg b/assets/images/bitogo.jpg new file mode 100644 index 0000000..d174ef9 Binary files /dev/null and b/assets/images/bitogo.jpg differ diff --git a/assets/images/block_scrappapercircus.jpg b/assets/images/block_scrappapercircus.jpg new file mode 100644 index 0000000..60c07c1 Binary files /dev/null and b/assets/images/block_scrappapercircus.jpg differ diff --git a/assets/images/chicanery.jpg b/assets/images/chicanery.jpg new file mode 100644 index 0000000..8f1a785 Binary files /dev/null and b/assets/images/chicanery.jpg differ diff --git a/assets/images/classic_scrappapercircus.jpg b/assets/images/classic_scrappapercircus.jpg new file mode 100644 index 0000000..0760b7d Binary files /dev/null and b/assets/images/classic_scrappapercircus.jpg differ diff --git a/assets/images/coptic_scrappapercircus.jpg b/assets/images/coptic_scrappapercircus.jpg new file mode 100644 index 0000000..06a7e17 Binary files /dev/null and b/assets/images/coptic_scrappapercircus.jpg differ diff --git a/assets/images/doggo.jpg b/assets/images/doggo.jpg new file mode 100644 index 0000000..378fb54 Binary files /dev/null and b/assets/images/doggo.jpg differ diff --git a/assets/images/dotfiles.jpg b/assets/images/dotfiles.jpg new file mode 100644 index 0000000..e1ea548 Binary files /dev/null and b/assets/images/dotfiles.jpg differ diff --git a/assets/images/gimp.png b/assets/images/gimp.png new file mode 100644 index 0000000..95a3a85 Binary files /dev/null and b/assets/images/gimp.png differ diff --git a/assets/images/hiking.jpg b/assets/images/hiking.jpg new file mode 100644 index 0000000..9da66a2 Binary files /dev/null and b/assets/images/hiking.jpg differ diff --git a/assets/images/inkscape.png b/assets/images/inkscape.png new file mode 100644 index 0000000..08b14bb Binary files /dev/null and b/assets/images/inkscape.png differ diff --git a/assets/images/java.png b/assets/images/java.png new file mode 100644 index 0000000..a597c48 Binary files /dev/null and b/assets/images/java.png differ diff --git a/assets/images/kdenlive.png b/assets/images/kdenlive.png new file mode 100644 index 0000000..54dce38 Binary files /dev/null and b/assets/images/kdenlive.png differ diff --git a/assets/images/linux.png b/assets/images/linux.png new file mode 100644 index 0000000..d00c5f1 Binary files /dev/null and b/assets/images/linux.png differ diff --git a/assets/images/me.jpg b/assets/images/me.jpg new file mode 100644 index 0000000..2ef5dba Binary files /dev/null and b/assets/images/me.jpg differ diff --git a/assets/images/mta.jpg b/assets/images/mta.jpg new file mode 100644 index 0000000..02c9875 Binary files /dev/null and b/assets/images/mta.jpg differ diff --git a/assets/images/narrative1.jpg b/assets/images/narrative1.jpg new file mode 100644 index 0000000..8f6e84c Binary files /dev/null and b/assets/images/narrative1.jpg differ diff --git a/assets/images/narrative2.jpg b/assets/images/narrative2.jpg new file mode 100644 index 0000000..1b54058 Binary files /dev/null and b/assets/images/narrative2.jpg differ diff --git a/assets/images/narrative3.jpg b/assets/images/narrative3.jpg new file mode 100644 index 0000000..c5c9168 Binary files /dev/null and b/assets/images/narrative3.jpg differ diff --git a/assets/images/narrative4.jpg b/assets/images/narrative4.jpg new file mode 100644 index 0000000..d86f121 Binary files /dev/null and b/assets/images/narrative4.jpg differ diff --git a/assets/images/narrative5.jpg b/assets/images/narrative5.jpg new file mode 100644 index 0000000..47a2f2a Binary files /dev/null and b/assets/images/narrative5.jpg differ diff --git a/assets/images/neumont.jpg b/assets/images/neumont.jpg new file mode 100644 index 0000000..9776b1b Binary files /dev/null and b/assets/images/neumont.jpg differ diff --git a/assets/images/nice_beat.jpg b/assets/images/nice_beat.jpg new file mode 100644 index 0000000..b50a563 Binary files /dev/null and b/assets/images/nice_beat.jpg differ diff --git a/assets/images/pac1.jpg b/assets/images/pac1.jpg new file mode 100644 index 0000000..83f3fa6 Binary files /dev/null and b/assets/images/pac1.jpg differ diff --git a/assets/images/postgresql.png b/assets/images/postgresql.png new file mode 100644 index 0000000..26829fa Binary files /dev/null and b/assets/images/postgresql.png differ diff --git a/assets/images/pufferfish.jpg b/assets/images/pufferfish.jpg new file mode 100644 index 0000000..6a6ecc5 Binary files /dev/null and b/assets/images/pufferfish.jpg differ diff --git a/assets/images/python.png b/assets/images/python.png new file mode 100644 index 0000000..0d6e651 Binary files /dev/null and b/assets/images/python.png differ diff --git a/assets/images/reaper.png b/assets/images/reaper.png new file mode 100644 index 0000000..03ae8c0 Binary files /dev/null and b/assets/images/reaper.png differ diff --git a/assets/images/rovio.jpg b/assets/images/rovio.jpg new file mode 100644 index 0000000..4fe69eb Binary files /dev/null and b/assets/images/rovio.jpg differ diff --git a/assets/images/rust.png b/assets/images/rust.png new file mode 100644 index 0000000..1eaa770 Binary files /dev/null and b/assets/images/rust.png differ diff --git a/assets/images/saul_goodman.jpg b/assets/images/saul_goodman.jpg new file mode 100644 index 0000000..3da14f0 Binary files /dev/null and b/assets/images/saul_goodman.jpg differ diff --git a/assets/images/scratch.png b/assets/images/scratch.png new file mode 100644 index 0000000..3d8b4b3 Binary files /dev/null and b/assets/images/scratch.png differ diff --git a/assets/images/scratch_medal.jpg b/assets/images/scratch_medal.jpg new file mode 100644 index 0000000..1669bc3 Binary files /dev/null and b/assets/images/scratch_medal.jpg differ diff --git a/assets/images/scratch_winner1.jpg b/assets/images/scratch_winner1.jpg new file mode 100644 index 0000000..dec8d1e Binary files /dev/null and b/assets/images/scratch_winner1.jpg differ diff --git a/assets/images/scratch_winner2.jpg b/assets/images/scratch_winner2.jpg new file mode 100644 index 0000000..317465f Binary files /dev/null and b/assets/images/scratch_winner2.jpg differ diff --git a/assets/images/sewer_surfin.jpg b/assets/images/sewer_surfin.jpg new file mode 100644 index 0000000..cdaecb7 Binary files /dev/null and b/assets/images/sewer_surfin.jpg differ diff --git a/assets/images/sonic_remix.jpg b/assets/images/sonic_remix.jpg new file mode 100644 index 0000000..ea87f5e Binary files /dev/null and b/assets/images/sonic_remix.jpg differ diff --git a/assets/images/tree_sitter.png b/assets/images/tree_sitter.png new file mode 100644 index 0000000..8efe4ce Binary files /dev/null and b/assets/images/tree_sitter.png differ diff --git a/assets/maskable_icon_x512.png b/assets/maskable_icon_x512.png new file mode 100644 index 0000000..db8df3e Binary files /dev/null and b/assets/maskable_icon_x512.png differ diff --git a/build.rs b/build.rs new file mode 100644 index 0000000..a1a135b --- /dev/null +++ b/build.rs @@ -0,0 +1,23 @@ +use std::{borrow::Cow, path::Path}; + +use databake::Bake; +use jotdown::Event; + +fn main() { + let out = std::env::var("OUT_DIR").unwrap(); + + let jots = glob::glob("src/*.jot").unwrap(); + + for path in jots.map(|p| p.unwrap()) { + let file = std::fs::read_to_string(&path).unwrap(); + let name = path.file_name().unwrap(); + + let jot: Cow<'_, [Event<'_>]> = Cow::Owned(jotdown::Parser::new(&file).collect::>()); + + std::fs::write( + Path::new(&out).join(name), + jot.bake(&Default::default()).to_string(), + ) + .unwrap(); + } +} diff --git a/certs/192.168.1.44-key.pem b/certs/192.168.1.44-key.pem new file mode 100644 index 0000000..bf9b3fb --- /dev/null +++ b/certs/192.168.1.44-key.pem @@ -0,0 +1,28 @@ +-----BEGIN PRIVATE KEY----- +MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKYwggSiAgEAAoIBAQDStvYGRPeqk766 +ySSzJ1SvQOi4I689ukgKT/TxbX4rdCBSmeERXoIt4qb8eHFz4BHPtrkDta/mTFJ2 +R2knMaSHHcSwh/eJKN6lcTCN+qpnKLm3i2yKFKcXcHiqJg2tCbGj00kIkGPB4iBV +lpMF107xuukCRJAInqau6evseOITT4aXlTx/A7YJP3z3Y1qPfvAgN4ej4TDo6DtG +DSEJpsyjtC5thcCnF4vkAoIhpIbH1iNryxj1Hc75lfxdeQztUeJLjGQixLfOWjY1 +EuSHjhbB3eFXQ447AOdnohohMEuurbBNfX7FvoYsLMuG4dhHPLV8HXhk/YsnrH18 +ai4qBzbZAgMBAAECggEAK5+1T5b3r1jnI8SA1JZP8fh+NaEtppnqUDg9fb4tYNGp +32/8KJxoVxeVeq90zYiWJ2qs4xe6UvN6HwKpwnOEnHSNQ/7iQIM1lQraAorivHix ++k3jKrMb5L5kPNWj/y8Cl+gmNp+uB3XJO+7wgUUSEvmfQ9jt+Nrfp1bGgS6Fn3l3 +DP8tq0/bRuDxfkhLOuZzXAGqXATjEDR5jfJmqoPucLjdVe9C8hXOPu2+xBiJY244 +df90qjkDNiGLFBL7WsctNTy0tJaRmF+qHfXhvj2eY6fvYlXA3m2rbH5wmTaBRD7G +l6g3GCRJF7mhP2ownbcA8yzMv9DYgiH7EiclrncQAQKBgQD2heLaAT5rtgYIVkgX +OczqOwqg8Vf9z+PzA3bQ9UZybyojY/uVsy3Y1f04gQq5sdygnHE2Qr2pYpBs7gqt +yN9aNTY8NpZulRUvpRnVQqPWVIlI0xBcaDqSK7BIwnU50pLze56/u+BrJSHARFWL +SvrLAr9D2Mx57ET3RTSc72/FHQKBgQDa0KxymGIlq3JaroG5nTX6+x5KXR2+xnWb +iQDKtC0qHg/Qy7eVy5jJm2EazNchsLLybbE7RNWhE+nDjkKb3SeDUyFwpyNNKw6j +lp1KqcHcx8b0GKGf7uC2jUSW9iTVlNu9mqW2lDgLZ5h1p8QmMdl8/8AEnIn3g/YR +TrbtzV637QKBgB6dlAW0/9aKnYcth/hycjNor7I7Js1boxiMBpZ+z4forFgG07jM +rtXuBWueAwH6x8aehyTQ9xLxLbSJf4QDnVFrqFekA9yp4R6wp1un0gcNKpuDstV3 +EEcU6+itVbefoiZg5N806vMDgoSJOAJ7hlft+GjppMNDh3EaBCW1SrE1AoGAboSJ +JRQcNmSCzJRpRyPFWO+u2+ZuGKZKTnWDJd6dFTG70TyjjBAaKnHFOPEPE6AYseN/ +aa0ZrVLOdgwLTogD5gt9z1VLujUuHqf65/QXy3hH34/1Sj8v1mRBqXHHJu0Zk4lh +e3cfW3tGgN5sbtIsxDq0dF/QO2i2RwWX1UIuPf0CgYAbh59OslAq2Y4+8B/Ss45p +3H7fBeRAlN65X+YjkwdZi0zy5Hlczp38hurTjYlvc/vSXSUDeeAVWxQIUnFT/qQu +UyDvwzVWnx1V3EV53NsYzMP0rYV/2EYVkcJCn5RtSyDcYOFiDaxtY1liTpCjvzJz +m5blo7Angaths0lBj/sLAQ== +-----END PRIVATE KEY----- diff --git a/certs/192.168.1.44.pem b/certs/192.168.1.44.pem new file mode 100644 index 0000000..f2d864d --- /dev/null +++ b/certs/192.168.1.44.pem @@ -0,0 +1,24 @@ +-----BEGIN CERTIFICATE----- +MIIECDCCAnCgAwIBAgIRAK1O4JEC2N5FRJYJwsqP7nYwDQYJKoZIhvcNAQELBQAw +XzEeMBwGA1UEChMVbWtjZXJ0IGRldmVsb3BtZW50IENBMRowGAYDVQQLDBFpc2Fh +Y21AQUNFUkxhcHRvcDEhMB8GA1UEAwwYbWtjZXJ0IGlzYWFjbUBBQ0VSTGFwdG9w +MB4XDTI0MDMxNzIzMjkzMVoXDTI2MDYxNzIzMjkzMVowRTEnMCUGA1UEChMebWtj +ZXJ0IGRldmVsb3BtZW50IGNlcnRpZmljYXRlMRowGAYDVQQLDBFpc2FhY21AQUNF +UkxhcHRvcDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBANK29gZE96qT +vrrJJLMnVK9A6Lgjrz26SApP9PFtfit0IFKZ4RFegi3ipvx4cXPgEc+2uQO1r+ZM +UnZHaScxpIcdxLCH94ko3qVxMI36qmcoubeLbIoUpxdweKomDa0JsaPTSQiQY8Hi +IFWWkwXXTvG66QJEkAiepq7p6+x44hNPhpeVPH8Dtgk/fPdjWo9+8CA3h6PhMOjo +O0YNIQmmzKO0Lm2FwKcXi+QCgiGkhsfWI2vLGPUdzvmV/F15DO1R4kuMZCLEt85a +NjUS5IeOFsHd4VdDjjsA52eiGiEwS66tsE19fsW+hiwsy4bh2Ec8tXwdeGT9iyes +fXxqLioHNtkCAwEAAaNZMFcwDgYDVR0PAQH/BAQDAgWgMBMGA1UdJQQMMAoGCCsG +AQUFBwMBMB8GA1UdIwQYMBaAFHvuXKJyKje/MuhO/0EpQEactUBbMA8GA1UdEQQI +MAaHBMCoASwwDQYJKoZIhvcNAQELBQADggGBAGrQiTUghaQwb5XenFdt7/pfK4Xp +vSt0g+dP/9EKkrjM4FB0qeOnjM6bcMs37NhoJwmpn+d52Y1gbjMXBgg6ZCm4ZuR4 +pPQgmmiiv0/DSNwjjVpNJy+qy8iW2xujY+Mca6f8ww6XHx4mqALe113hKUMcKgk0 +WwraLNk+RSZQYDUxad497V3DNXEsn9Zj3k/4hKXHNf2u2MKPqSiP4XAoEC01DtYl +LwLwx/2pyw3QBoZdskxYbCu0gEW1elTZTEmCrCo1Va8tcUOqrpdFlXQpyfIDDClI +IFlArcGG6Ya7ZAoe6TJQdSh/fh4zsf4ryxDWHOroy+UG4Nh6lQ3fezH+TkLvL4nD +nf1Zm+zLnwKiKfW7Y30OZhA/B7cxSFYd0pcnjNDzoi6/x4ONL9wjadxa7qTaJgxW +hzJZli+Efh1hFPJJDCOU/eSJ0+aVRkblca8ns9GvSD1LChpccxZTUkonVeIHaAf+ +551o9FPhtSswLHWlNgL8XAhBK4vOHa/7zz8xgQ== +-----END CERTIFICATE----- diff --git a/check.sh b/check.sh new file mode 100755 index 0000000..522dab1 --- /dev/null +++ b/check.sh @@ -0,0 +1,11 @@ +#!/usr/bin/env bash +# This scripts runs various CI-like checks in a convenient way. +set -eux + +cargo check --quiet --workspace --all-targets +cargo check --quiet --workspace --all-features --lib --target wasm32-unknown-unknown +cargo fmt --all -- --check +cargo clippy --quiet --workspace --all-targets --all-features -- -D warnings -W clippy::all +cargo test --quiet --workspace --all-targets --all-features +cargo test --quiet --workspace --doc +trunk build diff --git a/config.toml b/config.toml new file mode 100644 index 0000000..96b624f --- /dev/null +++ b/config.toml @@ -0,0 +1,2 @@ +[target.wasm32-unknown-unknown] +rustflags = ["-C", "target-feature=+simd128"] diff --git a/index.html b/index.html new file mode 100644 index 0000000..0918173 --- /dev/null +++ b/index.html @@ -0,0 +1,129 @@ + + + + + + + + + + Isaac Mills's Portfolio + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/opt.sh b/opt.sh new file mode 100644 index 0000000..01c4380 --- /dev/null +++ b/opt.sh @@ -0,0 +1,11 @@ +#!/bin/sh +wasm=dist/portfolio-*_bg.wasm +js=dist/portfolio-*.js +wasm-opt -O2 --fast-math $wasm -o $wasm +find dist/ \ + -name "*.js" -o \ + -name "*.pdf" -o \ + -name "*.ico" -o \ + -name "*.wasm" -o \ + -name "*.html" -o \ + -name "*.json" | parallel brotli -f diff --git a/rust-toolchain b/rust-toolchain new file mode 100644 index 0000000..2f0708c --- /dev/null +++ b/rust-toolchain @@ -0,0 +1,9 @@ +# If you see this, run "rustup self update" to get rustup 1.23 or newer. + +# NOTE: above comment is for older `rustup` (before TOML support was added), +# which will treat the first line as the toolchain name, and therefore show it +# to the user in the error, instead of "error: invalid channel name '[toolchain]'". + +[toolchain] +components = [ "rustfmt", "clippy" ] +targets = [ "wasm32-unknown-unknown" ] diff --git a/src/about_me.jot b/src/about_me.jot new file mode 100644 index 0000000..30fae43 --- /dev/null +++ b/src/about_me.jot @@ -0,0 +1,16 @@ +# About me + +*Hi!* My name is Isaac Mills. I'm a software engineer and computer scientist who loves harnessing the power of technology to solve problems! + +![Myself](images/me.jpg#256x192) +![Me and my dogoo](images/doggo.jpg#192x256) +![My family and I on a hike](images/hiking.jpg#256x192) +![Me in a Neumont CS T-Shirt](images/neumont.jpg#192x256) + +- I love learning about computers. Everything from how they work, to new languages, to new ways to use them (I even learned a bit of WGSL and WGPU to make the shader in the background\*) +- I love looking for problems to solve, and working with people to solve them +- As a Boy Scout at heart, I love camping, hiking, backpacking, and just the outdoors generally +- I'm a loyal friend who will be there for you through thick and thin +- I know how to both write code for computers, as well as whip them into shape when they start having problems. I am the IT guy in my family + +\*Special thanks to _meico_ from Shadertoy for the GLSL version of your Spectrum Ring shader diff --git a/src/app.rs b/src/app.rs new file mode 100644 index 0000000..d638f07 --- /dev/null +++ b/src/app.rs @@ -0,0 +1,1026 @@ +use std as alloc; +use std::borrow::Cow; +use std::ops::DerefMut; +use std::sync::Arc; + +use cosmic_jotdown::jotdown::{self, Event, ListKind}; +use cosmic_jotdown::{Indent, INDENT_AMOUNT}; +use eframe::egui::mutex::{Mutex, RwLock}; +use eframe::egui::{ + self, lerp, Align2, Image, ImageSize, ImageSource, OpenUrl, Pos2, Rect, Rounding, Sense, + Stroke, Vec2, +}; +use eframe::egui_wgpu::{self, wgpu}; +use egui::{Color32, Frame}; +use egui_glyphon::glyphon::cosmic_text::{Align, BufferRef}; +use egui_glyphon::glyphon::{self, Attrs, Color, Edit, Editor, Weight}; +use egui_glyphon::{BufferWithTextArea, GlyphonRenderer, GlyphonRendererCallback}; +use encase::ShaderType; +use glam::Mat2; +use glyphon::{Buffer, FontSystem, Metrics}; +use keyframe::functions; +use range_map::RangeMap; +use wgpu::util::DeviceExt; + +/// We derive Deserialize/Serialize so we can persist app state on shutdown. +pub struct Portfolio { + custom: Custom3d, + zoomed: bool, + hovered: bool, + click_time_offset: f64, + hover_time_offset: f64, + from_size: f32, + to_size: f32, + from_pos: [f32; 2], + to_pos: [f32; 2], + from_beamwidth: f32, + to_beamwidth: f32, + font_system: Arc>, + name_buffers: [(Arc>, Vec2); 3], + click_anywhere_buffer: (Vec2, Arc>), + window: ContextWindow, + buffer_size: Vec2, + max_size: Rect, +} + +#[derive(Default)] +pub struct ContextWindow { + pub size: Vec2, + pub text: Vec<(Rect, Indent, ContextBlock)>, +} + +pub struct ContextIcon { + pub icon: ImageSource<'static>, + pub content: &'static Cow<'static, [Event<'static>]>, + pub angle_at: f32, + pub name: &'static str, +} + +#[derive(Clone)] +pub enum ContextBlock { + Buffer(Arc>, Option>), + Image { + alt_text: Arc>, + image: Image<'static>, + size: Vec2, + }, +} + +const CONTEXT_METRICS: Metrics = Metrics::new(16.0, 18.0); + +const ABOUT_ME: Cow<'static, [Event<'static>]> = + include!(concat!(env!("OUT_DIR"), "/about_me.jot")); +const INKSCAPE: Cow<'static, [Event<'static>]> = + include!(concat!(env!("OUT_DIR"), "/inkscape.jot")); +const RUST: Cow<'static, [Event<'static>]> = include!(concat!(env!("OUT_DIR"), "/rust.jot")); +const GIMP: Cow<'static, [Event<'static>]> = include!(concat!(env!("OUT_DIR"), "/gimp.jot")); +const REAPER: Cow<'static, [Event<'static>]> = include!(concat!(env!("OUT_DIR"), "/reaper.jot")); +const TREE_SITTER: Cow<'static, [Event<'static>]> = + include!(concat!(env!("OUT_DIR"), "/tree_sitter.jot")); +const LINUX: Cow<'static, [Event<'static>]> = include!(concat!(env!("OUT_DIR"), "/linux.jot")); +const PYTHON: Cow<'static, [Event<'static>]> = include!(concat!(env!("OUT_DIR"), "/python.jot")); +const KDENLIVE: Cow<'static, [Event<'static>]> = + include!(concat!(env!("OUT_DIR"), "/kdenlive.jot")); +const JAVA: Cow<'static, [Event<'static>]> = include!(concat!(env!("OUT_DIR"), "/java.jot")); +const SCRATCH: Cow<'static, [Event<'static>]> = include!(concat!(env!("OUT_DIR"), "/scratch.jot")); +const POSTGRESQL: Cow<'static, [Event<'static>]> = + include!(concat!(env!("OUT_DIR"), "/postgresql.jot")); + +const CONTEXT_ICONS: [ContextIcon; 11] = [ + ContextIcon { + #[cfg(target_arch = "wasm32")] + icon: ImageSource::Uri(Cow::Borrowed(concat!( + env!("PHOST"), + "/images/inkscape.png" + ))), + #[cfg(not(target_arch = "wasm32"))] + icon: ImageSource::Uri(Cow::Borrowed("file://assets/images/inkscape.png")), + content: &INKSCAPE, + angle_at: -142.0, + name: "inkscape", + }, + ContextIcon { + #[cfg(target_arch = "wasm32")] + icon: ImageSource::Uri(Cow::Borrowed(concat!(env!("PHOST"), "/images/rust.png"))), + #[cfg(not(target_arch = "wasm32"))] + icon: ImageSource::Uri(Cow::Borrowed("file://assets/images/rust.png")), + content: &RUST, + angle_at: -66.0, + name: "rust", + }, + ContextIcon { + #[cfg(target_arch = "wasm32")] + icon: ImageSource::Uri(Cow::Borrowed(concat!(env!("PHOST"), "/images/gimp.png"))), + #[cfg(not(target_arch = "wasm32"))] + icon: ImageSource::Uri(Cow::Borrowed("file://assets/images/gimp.png")), + content: &GIMP, + angle_at: -223.0, + name: "gimp", + }, + ContextIcon { + #[cfg(target_arch = "wasm32")] + icon: ImageSource::Uri(Cow::Borrowed(concat!(env!("PHOST"), "/images/reaper.png"))), + #[cfg(not(target_arch = "wasm32"))] + icon: ImageSource::Uri(Cow::Borrowed("file://assets/images/reaper.png")), + content: &REAPER, + angle_at: -90.0, + name: "reaper", + }, + ContextIcon { + #[cfg(target_arch = "wasm32")] + icon: ImageSource::Uri(Cow::Borrowed(concat!( + env!("PHOST"), + "/images/tree_sitter.png" + ))), + #[cfg(not(target_arch = "wasm32"))] + icon: ImageSource::Uri(Cow::Borrowed("file://assets/images/tree_sitter.png")), + content: &TREE_SITTER, + angle_at: 37.0, + name: "tree_sitter", + }, + ContextIcon { + #[cfg(target_arch = "wasm32")] + icon: ImageSource::Uri(Cow::Borrowed(concat!(env!("PHOST"), "/images/linux.png"))), + #[cfg(not(target_arch = "wasm32"))] + icon: ImageSource::Uri(Cow::Borrowed("file://assets/images/linux.png")), + content: &LINUX, + angle_at: -270.0, + name: "linux", + }, + ContextIcon { + #[cfg(target_arch = "wasm32")] + icon: ImageSource::Uri(Cow::Borrowed(concat!(env!("PHOST"), "/images/python.png"))), + #[cfg(not(target_arch = "wasm32"))] + icon: ImageSource::Uri(Cow::Borrowed("file://assets/images/python.png")), + content: &PYTHON, + angle_at: -40.0, + name: "python", + }, + ContextIcon { + #[cfg(target_arch = "wasm32")] + icon: ImageSource::Uri(Cow::Borrowed(concat!( + env!("PHOST"), + "/images/kdenlive.png" + ))), + #[cfg(not(target_arch = "wasm32"))] + icon: ImageSource::Uri(Cow::Borrowed("file://assets/images/kdenlive.png")), + content: &KDENLIVE, + angle_at: -205.0, + name: "kdenlive", + }, + ContextIcon { + #[cfg(target_arch = "wasm32")] + icon: ImageSource::Uri(Cow::Borrowed(concat!(env!("PHOST"), "/images/java.png"))), + #[cfg(not(target_arch = "wasm32"))] + icon: ImageSource::Uri(Cow::Borrowed("file://assets/images/java.png")), + content: &JAVA, + angle_at: -105.0, + name: "java", + }, + ContextIcon { + #[cfg(target_arch = "wasm32")] + icon: ImageSource::Uri(Cow::Borrowed(concat!(env!("PHOST"), "/images/scratch.png"))), + #[cfg(not(target_arch = "wasm32"))] + icon: ImageSource::Uri(Cow::Borrowed("file://assets/images/scratch.png")), + content: &SCRATCH, + angle_at: -52.0, + name: "scratch", + }, + ContextIcon { + #[cfg(target_arch = "wasm32")] + icon: ImageSource::Uri(Cow::Borrowed(concat!( + env!("PHOST"), + "/images/postgresql.png" + ))), + #[cfg(not(target_arch = "wasm32"))] + icon: ImageSource::Uri(Cow::Borrowed("file://assets/images/postgresql.png")), + content: &POSTGRESQL, + angle_at: -235.0, + name: "postgresql", + }, +]; + +const NAME_PLATE: [&str; 3] = [ + "Isaac Mills", + "Computer Scientist; Software Engineer", + "My portfolio", +]; + +impl ContextWindow { + pub fn set_content( + &mut self, + content: &Cow<'static, [Event<'static>]>, + font_system: &mut FontSystem, + mut max_width: f32, + ) { + self.size = Vec2::new(max_width / 1.5, 0.0); + let mut last_indent = None; + let mut last_image_size: Option = None; + max_width /= 1.5; + self.text = cosmic_jotdown::jotdown_into_buffers( + content.iter().cloned(), + font_system, + CONTEXT_METRICS, + max_width, + ) + .map(|buffer| { + let measurement = measure_buffer(&buffer.buffer, self.size); + let paragraph_height = if last_indent.is_none() || buffer.indent.modifier.is_none() { + CONTEXT_METRICS.line_height * 1.5 + } else { + 8.0 + }; + last_indent = buffer.indent.modifier; + let buffer = if let Some(url) = buffer.image_url { + let image; + let url = url.split_once('#').unwrap(); + let size = url.1.split_once('x').unwrap(); + let size = Vec2::new(size.0.parse().unwrap(), size.1.parse().unwrap()); + #[cfg(target_arch = "wasm32")] + { + image = Image::from_uri(format!(concat!(env!("PHOST"), "/{}"), url.0)); + } + #[cfg(not(target_arch = "wasm32"))] + { + image = Image::from_uri(format!("file://assets/{}", url.0)); + } + let mut res = ( + Rect::from_min_size( + Pos2::new(buffer.indent.indent, self.size.y + paragraph_height), + size, + ), + buffer.indent, + ContextBlock::Image { + alt_text: Arc::new(RwLock::new(buffer.buffer)), + image, + size, + }, + ); + const IMAGE_PADDING: f32 = 8.0; + if let Some(last_size) = last_image_size.as_mut() { + let ls = *last_size; + last_size.x += size.x + IMAGE_PADDING; + + if last_size.x > max_width { + self.size.y += last_size.y + paragraph_height; + last_size.x = size.x + IMAGE_PADDING; + last_size.y = size.y; + res.0 = Rect::from_min_size( + Pos2::new(buffer.indent.indent, self.size.y + paragraph_height), + size, + ); + } else { + last_size.y = last_size.y.max(size.y); + res.0 = res.0.translate(Vec2::new(ls.x, 0.0)); + } + } else { + last_image_size = Some(size + Vec2::new(IMAGE_PADDING, 0.0)); + } + res + } else { + if let Some(size) = last_image_size { + self.size.y += size.y + paragraph_height; + } + let res = ( + Rect::from_min_size( + Pos2::new(buffer.indent.indent, self.size.y + paragraph_height), + measurement.size(), + ), + buffer.indent, + ContextBlock::Buffer(Arc::new(RwLock::new(buffer.buffer)), buffer.url_map), + ); + last_image_size = None; + self.size.y += measurement.height() + paragraph_height; + res + }; + self.size.x = self.size.x.max(measurement.width()); + buffer + }) + .collect(); + + if let Some(size) = last_image_size { + self.size.y += size.y; + } + self.size.y += CONTEXT_METRICS.line_height * 3.0; + } +} + +fn make_buffers( + font_system: &mut FontSystem, + scale: f32, +) -> (Vec2, [(Arc>, Vec2); 3]) { + let mut buffers = [ + ( + Buffer::new(font_system, Metrics::new(64.0 * scale, 70.0 * scale)), + Vec2::ZERO, + Weight::NORMAL, + ), + ( + Buffer::new(font_system, Metrics::new(24.0 * scale, 30.0 * scale)), + Vec2::ZERO, + Weight::LIGHT, + ), + ( + Buffer::new(font_system, Metrics::new(24.0 * scale, 30.0 * scale)), + Vec2::ZERO, + Weight::LIGHT, + ), + ]; + let mut buffer_size = Vec2::ZERO; + for buffer in buffers.iter_mut().zip(NAME_PLATE.into_iter()) { + buffer.0 .0.set_size(font_system, f32::MAX, f32::MAX); + buffer.0 .0.set_text( + font_system, + buffer.1, + Attrs::new() + .family(glyphon::Family::SansSerif) + .weight(buffer.0 .2), + glyphon::Shaping::Basic, + ); + buffer.0 .0.shape_until_scroll(font_system, true); + let size = measure_buffer(&buffer.0 .0, Vec2::INFINITY).size(); + buffer_size.y += size.y; + buffer_size.x = buffer_size.x.max(size.x); + buffer.0 .1 = size; + } + ( + buffer_size, + buffers.map(|b| (Arc::new(RwLock::new(b.0)), b.1)), + ) +} + +impl Portfolio { + /// Called once before the first frame. + pub fn new(cc: &eframe::CreationContext<'_>) -> Self { + // This is also where you can customize the look and feel of egui using + // `cc.egui_ctx.set_visuals` and `cc.egui_ctx.set_fonts`. + + // Load previous app state (if any). + // Note that you must enable the `persistence` feature for this to work. + + egui_extras::install_image_loaders(&cc.egui_ctx); + let mut font_system = FontSystem::new(); + font_system + .db_mut() + .load_font_source(glyphon::fontdb::Source::Binary(Arc::new(include_bytes!( + "/usr/share/fonts/ubuntu/Ubuntu-L.ttf" + )))); + font_system + .db_mut() + .load_font_source(glyphon::fontdb::Source::Binary(Arc::new(include_bytes!( + "/usr/share/fonts/ubuntu/Ubuntu-R.ttf" + )))); + font_system + .db_mut() + .load_font_source(glyphon::fontdb::Source::Binary(Arc::new(include_bytes!( + "/usr/share/fonts/ubuntu/Ubuntu-RI.ttf" + )))); + font_system + .db_mut() + .load_font_source(glyphon::fontdb::Source::Binary(Arc::new(include_bytes!( + "/usr/share/fonts/ubuntu/Ubuntu-B.ttf" + )))); + font_system + .db_mut() + .load_font_source(glyphon::fontdb::Source::Binary(Arc::new(include_bytes!( + "/usr/share/fonts/TTF/FiraCode-Regular.ttf" + )))); + let (buffer_size, name_buffers) = make_buffers(&mut font_system, 1.0); + let mut click_anywhere_buffer = + egui_glyphon::glyphon::Buffer::new(&mut font_system, Metrics::new(16.0, 18.0)); + click_anywhere_buffer.set_size(&mut font_system, f32::MAX, f32::MAX); + click_anywhere_buffer.set_text( + &mut font_system, + "Click anywhere to return to home page", + Attrs::new() + .family(glyphon::Family::SansSerif) + .weight(Weight::LIGHT), + glyphon::Shaping::Basic, + ); + click_anywhere_buffer.shape_until_scroll(&mut font_system, true); + let font_system = Arc::new(Mutex::new(font_system)); + GlyphonRenderer::insert( + cc.wgpu_render_state.as_ref().unwrap(), + Arc::clone(&font_system), + ); + + Self { + custom: Custom3d::new(cc).unwrap(), + zoomed: false, + hovered: false, + click_time_offset: 0.0, + hover_time_offset: 0.0, + from_size: 0.6, + to_size: 0.6, + from_pos: [0.0, 0.0], + to_pos: [0.0, 0.0], + from_beamwidth: 2.0, + to_beamwidth: 2.0, + font_system, + name_buffers, + click_anywhere_buffer: ( + measure_buffer(&click_anywhere_buffer, Vec2::INFINITY).size(), + Arc::new(RwLock::new(click_anywhere_buffer)), + ), + buffer_size, + window: ContextWindow::default(), + max_size: Rect::ZERO, + } + } + + pub fn click(&mut self, ui: &egui::Ui, transform: Option) { + self.from_size = self.to_size; + self.from_pos = self.to_pos; + self.click_time_offset = ui.input(|i| i.time); + if self.zoomed { + self.to_size = 0.6; + self.to_pos = [0.0, 0.0]; + self.zoomed = false; + } else { + self.to_size = 0.1; + if let Some(transform) = transform { + let point = transform.mul_vec2(glam::Vec2::new(2150.0, 0.0)); + self.to_pos = point.into(); + } + self.zoomed = true; + log::info!("{:?}", (self.from_size, self.from_pos)); + } + } + + pub fn hover(&mut self, hovered: bool, ui: &egui::Ui) { + if self.hovered != hovered { + self.hover_time_offset = ui.input(|i| i.time); + } + self.hovered = hovered; + if hovered { + self.to_beamwidth = 6.0; + self.from_beamwidth = 2.0; + } else { + self.to_beamwidth = 2.0; + self.from_beamwidth = 6.0; + } + } +} + +pub fn measure_buffer(buffer: &Buffer, vb: Vec2) -> Rect { + let mut rtl = false; + let (width, total_lines) = + buffer + .layout_runs() + .fold((0.0, 0usize), |(width, total_lines), run| { + if run.rtl { + rtl = true; + } + (run.line_w.max(width), total_lines + 1) + }); + + let (max_width, max_height) = buffer.size(); + + let size = Vec2::new( + if rtl { vb.x } else { width.min(max_width) }, + (total_lines as f32 * buffer.metrics().line_height).min(max_height), + ); + match buffer.lines[0].align() { + Some(Align::Right) | Some(Align::End) => { + Align2::RIGHT_TOP.align_size_within_rect(size, Rect::from_min_size(Pos2::ZERO, vb)) + } + Some(Align::Center) | Some(Align::Justified) => { + Align2::CENTER_TOP.align_size_within_rect(size, Rect::from_min_size(Pos2::ZERO, vb)) + } + Some(Align::Left) | None => Rect::from_min_size(Pos2::ZERO, size), + } +} + +impl Portfolio { + fn update_customs(&mut self, ui: &mut egui::Ui) { + let ppi = ui.ctx().pixels_per_point(); + self.custom.resolution = + glam::Vec2::new(ui.max_rect().width() * ppi, ui.max_rect().height() * ppi); + self.custom.time = ui.input(|i| i.time as f32); + if let Some(pos) = ui.input(|i| i.pointer.latest_pos()) { + let pos = pos * ppi; + self.custom.cursor = glam::Vec2::new(pos.x, self.custom.resolution.y - pos.y); + } + self.custom.size = keyframe::ease_with_scaled_time( + functions::EaseOutCubic, + self.from_size, + self.to_size, + ui.input(|i| i.time) - self.click_time_offset, + 1.0, + ); + self.custom.offset = glam::Vec2::from_array(keyframe::ease_with_scaled_time( + functions::EaseOutCubic, + self.from_pos, + self.to_pos, + ui.input(|i| i.time) - self.click_time_offset, + 1.0, + )); + self.custom.beam_width = keyframe::ease_with_scaled_time( + functions::EaseOutCubic, + self.from_beamwidth, + self.to_beamwidth, + ui.input(|i| i.time) - self.hover_time_offset, + 0.5, + ); + } +} + +impl eframe::App for Portfolio { + /// Called each time the UI needs repainting, which may be many times per second. + fn update(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { + // Put your widgets into a `SidePanel`, `TopBottomPanel`, `CentralPanel`, `Window` or `Area`. + // For inspiration and more examples, go to https://emilk.github.io/egui + + egui::CentralPanel::default() + .frame(Frame::default().fill(Color32::BLACK)) + .show(ctx, |ui| { + self.update_customs(ui); + self.custom.custom_painting(ui); + if ui.max_rect() != self.max_size { + let scale = Vec2::from(self.custom.resolution.to_array()) + / ui.ctx().pixels_per_point() + / Vec2::new(800.0, 800.0); + let (buffer_size, name_buffers) = + make_buffers(self.font_system.lock().deref_mut(), scale.x.min(scale.y)); + + self.buffer_size = buffer_size; + self.name_buffers = name_buffers; + } + self.max_size = ui.max_rect(); + let mut scroll_area = egui::ScrollArea::vertical().show_viewport(ui, |ui, rect| { + let max_rect = ui.max_rect(); + ui.allocate_exact_size( + Vec2::new( + max_rect.width(), + self.window.size.y + CONTEXT_METRICS.line_height * 8.0, + ), + Sense::hover(), + ); + rect.translate(Vec2::new(0.0, (-rect.min.y) * 2.0)) + }); + let name_rect = + Align2::CENTER_CENTER.align_size_within_rect(self.buffer_size, ui.max_rect()); + let name_opacity = keyframe::ease_with_scaled_time( + functions::EaseOutCubic, + if self.zoomed { 1.0 } else { 0.0 }, + if self.zoomed { 0.0 } else { 1.0 }, + ui.input(|i| i.time) + - self.click_time_offset + - if self.zoomed { 0.0 } else { 0.5 }, + 1.0, + ); + let zoom_view_opacity = keyframe::ease_with_scaled_time( + functions::EaseOutCubic, + if self.zoomed { 0.0 } else { 1.0 }, + if self.zoomed { 1.0 } else { 0.0 }, + ui.input(|i| i.time) - self.click_time_offset, + 1.0, + ); + let mut buffer_offset = 0.0; + let mut buffers: Vec = self + .name_buffers + .iter() + .map(|b| { + let res = BufferWithTextArea::new( + b.0.clone(), + name_rect.translate(Vec2::new(0.0, buffer_offset)), + name_opacity, + egui_glyphon::glyphon::Color::rgb(255, 255, 255), + ui.ctx(), + ); + buffer_offset += b.1.y; + res + }) + .collect(); + let name_resp = ui.allocate_rect(name_rect, Sense::click()); + let center = Pos2::new(ui.max_rect().width() / 2.0, ui.max_rect().height() / 2.0); + let reference_rect = if ui.max_rect().height() > ui.max_rect().width() { + let size = Vec2::new(ui.max_rect().width(), ui.max_rect().width()) + * Vec2::new(0.85, 0.85); + Align2::CENTER_CENTER.align_size_within_rect(size, ui.max_rect()) + } else { + let size = Vec2::new(ui.max_rect().height(), ui.max_rect().height()) + * Vec2::new(0.85, 0.85); + Align2::CENTER_CENTER.align_size_within_rect(size, ui.max_rect()) + }; + let mut icon_link = None; + let rect = if ui.max_rect().height() > self.window.size.y { + Align2::CENTER_CENTER + .align_size_within_rect(self.window.size, scroll_area.inner) + } else { + Align2::CENTER_TOP + .align_size_within_rect(self.window.size, scroll_area.inner) + .translate(Vec2::new(0.0, CONTEXT_METRICS.line_height * 4.0)) + }; + let mut link_clicked = false; + if zoom_view_opacity > 0.0 { + ui.painter().rect_filled( + Rect::from_min_size(rect.min, self.window.size).expand(25.0), + Rounding::same(25.0), + Color32::BLACK.gamma_multiply(lerp(0.0..=0.5, zoom_view_opacity)), + ); + self.window + .text + .iter() + .for_each(|context_block| match &context_block.2 { + ContextBlock::Buffer(buffer, url_map) => { + let text_rect = context_block.0.translate(rect.min.to_vec2()); + // ui.painter().debug_rect(text_rect, Color32::GREEN, ""); + if let Some(url_map) = url_map { + let text_response = ui.allocate_rect(text_rect, Sense::click()); + if text_response.clicked() { + let mut buffer = buffer.write(); + let mut editor = + Editor::new(BufferRef::Borrowed(buffer.deref_mut())); + + let mouse_click = ui.input(|i| { + i.pointer.interact_pos().unwrap_or_default() + }) - text_rect.min.to_vec2(); + + editor.action( + self.font_system.lock().deref_mut(), + glyphon::Action::Click { + x: mouse_click.x as i32, + y: mouse_click.y as i32, + }, + ); + + let mut location = editor.cursor(); + match location.affinity { + glyphon::Affinity::After => location.index += 1, + glyphon::Affinity::Before => {} + } + if let Some(url) = url_map.get(location.index) { + link_clicked = true; + if url.starts_with('#') { + if let Some(icon) = CONTEXT_ICONS + .iter() + .find(|i| i.name == &url[1..]) + { + icon_link = Some(icon); + } + } else { + ui.ctx().open_url(OpenUrl::new_tab(url)); + } + // clicked = false; + } + } + } + buffers.push(BufferWithTextArea::new( + buffer.clone(), + text_rect, + zoom_view_opacity, + Color::rgb(255, 255, 255), + ui.ctx(), + )); + match context_block.1.modifier { + Some(ListKind::Unordered) => { + ui.painter().circle( + text_rect.min + + Vec2::new( + -INDENT_AMOUNT, + CONTEXT_METRICS.line_height / 2.0, + ), + 2.5, + Color32::WHITE.gamma_multiply(zoom_view_opacity), + Stroke::NONE, + ); + } + _ => {} + } + } + ContextBlock::Image { image, size, .. } => { + image + .clone() + .tint(Color32::WHITE.gamma_multiply(zoom_view_opacity)) + .paint_at( + ui, + Rect::from_min_size( + context_block.0.translate(rect.min.to_vec2()).min, + if size.x > rect.width() { + let max_size = Vec2::new(rect.width(), size.y); + ImageSize { + max_size, + ..Default::default() + } + .calc_size(max_size, *size) + } else { + *size + }, + ), + ); + } + }); + buffers.push(BufferWithTextArea::new( + self.click_anywhere_buffer.1.clone(), + Rect::from_min_size( + Pos2::new(rect.min.x + 4.0, rect.max.y - 8.0), + self.click_anywhere_buffer.0, + ), + zoom_view_opacity, + egui_glyphon::glyphon::Color::rgb(255, 255, 255), + ui.ctx(), + )); + } + let mut hovered = false; + if self.zoomed { + if ui.input(|i| i.pointer.any_click()) && icon_link.is_none() && !link_clicked { + self.click(ui, None); + } + } else { + if ui.input(|i| i.pointer.secondary_clicked()) { + let mouse = ui.input(|i| i.pointer.interact_pos().unwrap_or_default()); + let center = glam::Vec2::new( + ui.max_rect().width() / 2.0, + ui.max_rect().height() / 2.0, + ); + let angle = ((mouse.x - center.x).atan2(mouse.y - center.y) * 180.0 + / std::f32::consts::PI) + - 90.0; + log::info!("{}", angle); + } + + if name_resp.clicked() { + self.click(ui, None); + self.window.set_content( + &ABOUT_ME, + self.font_system.lock().deref_mut(), + ui.max_rect().width(), + ); + } + + hovered = name_resp.hovered() || hovered; + for i in CONTEXT_ICONS.iter() { + let transform = glam::Mat2::from_angle((-i.angle_at).to_radians()); + let factor = reference_rect.size() / 775.0; + let point = center + + Vec2::from( + transform + .mul_vec2(glam::Vec2::new(reference_rect.width() / 2.0, 0.0)) + .to_array(), + ) + - (Vec2::splat(32.0) * factor); + + let rect = Rect::from_min_size(point, Vec2::new(64.0, 64.0) * factor); + + let response = ui.allocate_rect(rect, Sense::click()); + let response_hovered = response.hovered(); + let time = ui.input(|i| i.time); + let opacity = ui.memory_mut(|m| { + let icon_state = + m.data.get_temp_mut_or_insert_with(response.id, || { + (0.0, response_hovered) + }); + + if response_hovered != icon_state.1 { + icon_state.0 = time; + icon_state.1 = response_hovered; + } + + lerp( + 0.0..=keyframe::ease_with_scaled_time( + functions::EaseOutCubic, + if response_hovered { 0.5 } else { 1.0 }, + if response_hovered { 1.0 } else { 0.5 }, + time - icon_state.0, + 0.5, + ), + name_opacity, + ) + }); + + if response.clicked() { + self.window.set_content( + i.content, + self.font_system.lock().deref_mut(), + ui.max_rect().width(), + ); + self.click(ui, Some(transform)); + scroll_area.state.offset = Vec2::ZERO; + scroll_area.state.store(ui.ctx(), scroll_area.id); + } + + hovered = response_hovered || hovered; + + egui::Image::new(i.icon.clone()) + .tint(Color32::WHITE.gamma_multiply(opacity)) + .paint_at(ui, rect); + } + } + + if let Some(icon) = icon_link { + self.window.set_content( + icon.content, + self.font_system.lock().deref_mut(), + ui.max_rect().width(), + ); + + self.zoomed = false; + self.click( + ui, + Some(glam::Mat2::from_angle((-icon.angle_at).to_radians())), + ); + self.zoomed = true; + + scroll_area.state.offset = Vec2::ZERO; + scroll_area.state.store(ui.ctx(), scroll_area.id); + } + self.hover(hovered, ui); + ui.painter().add(egui_wgpu::Callback::new_paint_callback( + ui.max_rect(), + GlyphonRendererCallback { buffers }, + )); + }); + + ctx.request_repaint(); + } +} + +#[derive(Copy, Clone, Default, ShaderType, Debug)] +#[allow(unused_attributes)] +#[repr(C)] +pub struct Custom3d { + pub resolution: glam::Vec2, + pub time: f32, + pub cursor: glam::Vec2, + pub size: f32, + pub offset: glam::Vec2, + pub beam_width: f32, + paddingtwo: f32, +} + +impl Custom3d { + pub fn new<'a>(cc: &'a eframe::CreationContext<'a>) -> Option { + // Get the WGPU render state from the eframe creation context. This can also be retrieved + // from `eframe::Frame` when you don't have a `CreationContext` available. + let wgpu_render_state = cc.wgpu_render_state.as_ref()?; + + let device = &wgpu_render_state.device; + + let shader = device.create_shader_module(wgpu::ShaderModuleDescriptor { + label: Some("3d"), + source: wgpu::ShaderSource::Wgsl(include_str!("shader.wgsl").into()), + }); + + let constants = Self::default(); + + let uniform_buffer = device.create_buffer_init(&wgpu::util::BufferInitDescriptor { + label: Some("Uniform Buffer"), + contents: { + let mut buffer = encase::UniformBuffer::new(Vec::new()); + buffer.write(&constants).unwrap(); + buffer.into_inner().as_slice() + }, + usage: wgpu::BufferUsages::UNIFORM | wgpu::BufferUsages::COPY_DST, + }); + let uniform_bind_group_layout = + device.create_bind_group_layout(&wgpu::BindGroupLayoutDescriptor { + entries: &[wgpu::BindGroupLayoutEntry { + binding: 0, + visibility: wgpu::ShaderStages::all(), + ty: wgpu::BindingType::Buffer { + ty: wgpu::BufferBindingType::Uniform, + has_dynamic_offset: false, + min_binding_size: None, + }, + count: None, + }], + label: Some("uniform_bind_group_layout"), + }); + let bind_group = device.create_bind_group(&wgpu::BindGroupDescriptor { + layout: &uniform_bind_group_layout, + entries: &[wgpu::BindGroupEntry { + binding: 0, + resource: uniform_buffer.as_entire_binding(), + }], + label: Some("uniform_bind_group"), + }); + + let pipeline_layout = device.create_pipeline_layout(&wgpu::PipelineLayoutDescriptor { + label: None, + bind_group_layouts: &[&uniform_bind_group_layout], + push_constant_ranges: &[], + }); + + let pipeline = device.create_render_pipeline(&wgpu::RenderPipelineDescriptor { + label: None, + layout: Some(&pipeline_layout), + vertex: wgpu::VertexState { + module: &shader, + entry_point: "vs_main", + buffers: &[], + }, + fragment: Some(wgpu::FragmentState { + module: &shader, + entry_point: "fs_main", + targets: &[Some(wgpu::ColorTargetState { + format: wgpu_render_state.target_format, + blend: Some(wgpu::BlendState { + color: wgpu::BlendComponent::REPLACE, + alpha: wgpu::BlendComponent::REPLACE, + }), + write_mask: wgpu::ColorWrites::ALL, + })], + }), + primitive: wgpu::PrimitiveState::default(), + depth_stencil: None, + multisample: wgpu::MultisampleState::default(), + multiview: None, + }); + + // Because the graphics pipeline must have the same lifetime as the egui render pass, + // instead of storing the pipeline in our `Custom3D` struct, we insert it into the + // `paint_callback_resources` type map, which is stored alongside the render pass. + wgpu_render_state + .renderer + .write() + .callback_resources + .insert(TriangleRenderResources { + pipeline, + bind_group, + uniform_buffer, + }); + + Some(constants) + } +} + +// Callbacks in egui_wgpu have 3 stages: +// * prepare (per callback impl) +// * finish_prepare (once) +// * paint (per callback impl) +// +// The prepare callback is called every frame before paint and is given access to the wgpu +// Device and Queue, which can be used, for instance, to update buffers and uniforms before +// rendering. +// If [`egui_wgpu::Renderer`] has [`egui_wgpu::FinishPrepareCallback`] registered, +// it will be called after all `prepare` callbacks have been called. +// You can use this to update any shared resources that need to be updated once per frame +// after all callbacks have been processed. +// +// On both prepare methods you can use the main `CommandEncoder` that is passed-in, +// return an arbitrary number of user-defined `CommandBuffer`s, or both. +// The main command buffer, as well as all user-defined ones, will be submitted together +// to the GPU in a single call. +// +// The paint callback is called after finish prepare and is given access to egui's main render pass, +// which can be used to issue draw commands. +struct CustomTriangleCallback { + constants: Custom3d, +} + +impl egui_wgpu::CallbackTrait for CustomTriangleCallback { + fn prepare( + &self, + device: &wgpu::Device, + queue: &wgpu::Queue, + _screen_descriptor: &egui_wgpu::ScreenDescriptor, + _egui_encoder: &mut wgpu::CommandEncoder, + resources: &mut egui_wgpu::CallbackResources, + ) -> Vec { + let resources: &TriangleRenderResources = resources.get().unwrap(); + resources.prepare(device, queue, &self.constants); + Vec::new() + } + + fn paint<'a>( + &self, + _info: egui::PaintCallbackInfo, + render_pass: &mut wgpu::RenderPass<'a>, + resources: &'a egui_wgpu::CallbackResources, + ) { + let resources: &TriangleRenderResources = resources.get().unwrap(); + resources.paint(render_pass); + } +} + +impl Custom3d { + fn custom_painting(&mut self, ui: &mut egui::Ui) { + ui.painter().add(egui_wgpu::Callback::new_paint_callback( + ui.max_rect(), + CustomTriangleCallback { constants: *self }, + )); + } +} + +struct TriangleRenderResources { + pipeline: wgpu::RenderPipeline, + bind_group: wgpu::BindGroup, + uniform_buffer: wgpu::Buffer, +} + +impl TriangleRenderResources { + fn prepare(&self, _device: &wgpu::Device, queue: &wgpu::Queue, constants: &Custom3d) { + // Update our uniform buffer with the angle from the UI + let mut buffer = encase::UniformBuffer::new(Vec::new()); + buffer.write(constants).unwrap(); + queue.write_buffer(&self.uniform_buffer, 0, buffer.into_inner().as_slice()); + } + + fn paint<'rp>(&'rp self, render_pass: &mut wgpu::RenderPass<'rp>) { + // Draw our triangle! + render_pass.set_pipeline(&self.pipeline); + render_pass.set_bind_group(0, &self.bind_group, &[]); + render_pass.draw(0..3, 0..1); + } +} diff --git a/src/font.wgsl b/src/font.wgsl new file mode 100644 index 0000000..82c6f0a --- /dev/null +++ b/src/font.wgsl @@ -0,0 +1,3 @@ +@fragment +fn fs_main(@location(1) : vec4) -> @location(0) vec4 { +} diff --git a/src/gimp.jot b/src/gimp.jot new file mode 100644 index 0000000..c13515d --- /dev/null +++ b/src/gimp.jot @@ -0,0 +1,7 @@ +# GIMP Experience + +GIMP is a lot like Photoshop, but open source and free. Much like Photoshop, I don't think anyone can say they're _"100% fluent"_ in it, but I can say that I _am_ pretty experienced in it. + +- This is a funny image I manipulated of a Pillsburry cookie jar that I thought looked like a pufferfish + +![Pufferfish Doughboy](images/pufferfish.jpg#256x320) diff --git a/src/inkscape.jot b/src/inkscape.jot new file mode 100644 index 0000000..497b418 --- /dev/null +++ b/src/inkscape.jot @@ -0,0 +1,24 @@ +# Inkscape Experience + +For those who don't know, *Inkscape* is very similar to Adobe Illustrator, but open source and free. I am fluent, and have made numerous things in this program + +- This project was for my Senior US Government class. It's a mock political advertisement for the fictional Political Action Comittee _Care_. + +![Political Ad Campaign](images/pac1.jpg#256x362) + +- This project was for my Senior Web Development class, and the assignment was to make a logo for a fictional company using what knowledge of Adobe Illustrator (Inkscape) we had + +![Bitogo Corp logo and sologan](images/bitogo.jpg#256x362) + +- This project was also for my Senior US Government class. It's a flag representing the mock country where the Angry Birds franchise takes place + +![A mock flag for Bird Island](images/rovio.jpg#256x181) + +- This project was for my mother, who is an educator who teaches people how to make books from upcycled materials you can find in your own home. These are a few of the colorways for an Instagram ad campaign I helped her make. + +![Classic colorway](images/classic_scrappapercircus.jpg#256x256) +![Block colorway](images/block_scrappapercircus.jpg#256x256) +![Coptic colorway](images/coptic_scrappapercircus.jpg#256x256) + + + diff --git a/src/java.jot b/src/java.jot new file mode 100644 index 0000000..72e0bce --- /dev/null +++ b/src/java.jot @@ -0,0 +1,25 @@ +# Java Experience + +I've taken *AP Computer Science A*, as well as my school's post-AP course: *CS Data Structures*. Both courses are in Java. + +- This is a painting of Saul Goodman using the [code.org](https://code.org) Neighborhood Painter. It's done using only it's named colors, and was made by generating Java code from an image file. [You can run it here](https://studio.code.org/projects/javalab/fsGVkmFdUWUeePTV6rYXnb21BD3bAjq6oVTMtKd13lE). + +![Saul Goodman](images/saul_goodman.jpg#256x256) + +- This is an auditory project done with [code.org](https://code.org)'s Java Theater. By using Rust code to parse MIDI files and generate an intermediate format which is parsed by Java, this project contains a library of 27 tracks from various video games which are played using the Theater's comically bad synthesizer. [You can run it here](https://studio.code.org/projects/javalab/SCaGR1_Et1sgc7sxNEvRSf-4RKplGVwIjd7O7WOeKmg) + +![Theater playing Sewer Surfin](images/sewer_surfin.jpg#256x256) + +- This was my most complicated [code.org](https://code.org) project. It's an entire 30 second short film about my personal narrative composed using only the synthesizer, and the shape drawing functions of the Theater. This was composed using a wide variety of tools + + - The frames were composed in [Inkscape](#inkscape). + - The MIDI file was based on the Bad Piggies theme song, and was edited using [MIDIEditor](http://www.midieditor.org/). Within the MIDI file, custom events were used to interleave the frames of the animation with the MIDI notes. + - The MIDI file was put into a big converter which converted the MIDI, as well as all the SVG frames, into a lot of Java code, which in turn generated the movie using the code.org Theater. + +[You can view the full movie here](https://studio.code.org/projects/javalab/kvhEgxPPEVMkjFFfNZz_n5L6ADRjLOSM2GMNJjGEcUc) + +![Narrative frame 1](images/narrative1.jpg#256x256) +![Narrative frame 2](images/narrative2.jpg#256x256) +![Narrative frame 3](images/narrative3.jpg#256x256) +![Narrative frame 4](images/narrative4.jpg#256x256) +![Narrative frame 5](images/narrative5.jpg#256x256) diff --git a/src/kdenlive.jot b/src/kdenlive.jot new file mode 100644 index 0000000..54790f9 --- /dev/null +++ b/src/kdenlive.jot @@ -0,0 +1 @@ +# Kdenlive Experience diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..8c94b11 --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,4 @@ +#![warn(clippy::all, rust_2018_idioms)] + +mod app; +pub use app::Portfolio; diff --git a/src/linux.jot b/src/linux.jot new file mode 100644 index 0000000..38d19f2 --- /dev/null +++ b/src/linux.jot @@ -0,0 +1,27 @@ +# GNU/Linux Experience + +I've been daily driving Linux since the beginning of 2020, and have been hosting a home server running Linux since 2023. + +- On my server at home, I am currently hosting + + - [WireGuard](https://www.wireguard.com/) + - [Nextcloud](https://nextcloud.com/) + - [code-server](https://coder.com/docs/code-server/latest/install) + - [Forgejo](https://forgejo.org/) + - [Woodpecker CI](https://woodpecker-ci.org/) + - [Vaultwarden](https://github.com/dani-garcia/vaultwarden) + - [scrutiny](https://github.com/AnalogJ/scrutiny) + +My daily driver right now, and the distro my server is running on, is the S6 variant of [Artix Linux](https://artixlinux.org/). + +![Artix Linux](images/artix.png#128x128) + +I've not only daily driven Linux, but I've also tailor made programs for it; using technologies such as Wayland, DBus, Wireplumber, and more. + +- An image of my current Linux desktop. The status bar was written entirely by me in Rust ([dotfiles](https://github.com/StratusFearMe21/dotfiles)) + +![Dotfiles](images/dotfiles.jpg#512x288) + +- Linux silliness (also uses my [dotfiles](https://github.com/StratusFearMe21/dotfiles)) + +![Chicanery](images/chicanery.jpg#512x288) diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..6f1663d --- /dev/null +++ b/src/main.rs @@ -0,0 +1,49 @@ +#![warn(clippy::all, rust_2018_idioms)] +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] // hide console window on Windows in release + +use eframe::egui; + +// When compiling natively: +#[cfg(not(target_arch = "wasm32"))] +fn main() -> eframe::Result<()> { + env_logger::init(); // Log to stderr (if you run with `RUST_LOG=debug`). + + let native_options = eframe::NativeOptions { + viewport: egui::ViewportBuilder::default() + .with_inner_size([400.0, 300.0]) + .with_min_inner_size([300.0, 220.0]) + .with_icon( + // NOTE: Adding an icon is optional + eframe::icon_data::from_png_bytes(&include_bytes!("../assets/icon-256.png")[..]) + .unwrap(), + ), + ..Default::default() + }; + eframe::run_native( + "Isaac Mills's Portfolio", + native_options, + Box::new(|cc| Box::new(portfolio::Portfolio::new(cc))), + ) +} + +// When compiling to web using trunk: +#[cfg(target_arch = "wasm32")] +fn main() { + // Redirect `log` message to `console.log` and friends: + eframe::WebLogger::init(log::LevelFilter::Debug).ok(); + + let web_options = eframe::WebOptions { + ..Default::default() + }; + + wasm_bindgen_futures::spawn_local(async { + eframe::WebRunner::new() + .start( + "the_canvas_id", // hardcode it + web_options, + Box::new(|cc| Box::new(portfolio::Portfolio::new(cc))), + ) + .await + .expect("failed to start eframe"); + }); +} diff --git a/src/postgresql.jot b/src/postgresql.jot new file mode 100644 index 0000000..84c35c6 --- /dev/null +++ b/src/postgresql.jot @@ -0,0 +1,3 @@ +# PostgreSQL Experience + +If data needs basing, my database of choice is PostgreSQL. I've made a couple Discord bots that use PostgreSQL, and every service on my server that uses a DB, I have it hooked up to PostgreSQL. See my [GNU/Linux Experience page](#linux) diff --git a/src/python.jot b/src/python.jot new file mode 100644 index 0000000..16384e3 --- /dev/null +++ b/src/python.jot @@ -0,0 +1,3 @@ +# Python Experience + +![Microsoft Technology Associate certificate](images/mta.jpg#512x377) diff --git a/src/reaper.jot b/src/reaper.jot new file mode 100644 index 0000000..9fa56e4 --- /dev/null +++ b/src/reaper.jot @@ -0,0 +1,13 @@ +# REAPER Experience + +*REAPER* is a lot like Audacity, but paid and _waaaay_ better. + +- This is a short piece of upbeat music I made in REAPER. [You can listen to it here](https://nations.lol/s/pbAN8y6rRw8T6nr) + +![Nice Beat](images/nice_beat.jpg#512x288) + +- In a Discord chat, a student from my college sent the chat [this piece of music he made](https://www.bandlab.com/track/fefa6cac-62a4-ee11-8926-000d3a428257?revId=fdfa6cac-62a4-ee11-8926-000d3a428257). Someone in chat said they thought it sounded like a Sonic theme, so I remixed his music with [For True Story by Circuit Freq RMX](https://www.youtube.com/watch?v=fgweT5OdLQY&pp=ygUgZm9yIHRydWUgc3Rvcnkgc29uaWMgZ2VuZXJhdGlvbnM%3D). A song from Sonic Generations. [You can listen to the remix here](https://cdn.discordapp.com/attachments/1110262902482542781/1193022053964582943/Get_down_wit_da_true_story_sonic_hedgehog.webm?ex=66077c5e&is=65f5075e&hm=e873c49de116e38e7f048615c6adafd8719913da7640107d15b4b537c4ca031e&) + +![The Sonic remix](images/sonic_remix.jpg#512x288) + +- I've also edited a podcast using REAPER. However, the podcast was for an assignment my friends were doing, and they would rather the recording not be floating around on the interwebs. diff --git a/src/rust.jot b/src/rust.jot new file mode 100644 index 0000000..d9bc18b --- /dev/null +++ b/src/rust.jot @@ -0,0 +1,14 @@ +# Rust Experience + +My language of choice is Rust. Everything I write on my own time, and everything I write if I can, I write it in Rust. Even this portfolio is written in Rust! + +This portfolio uses these Rust crates: + +- `jotdown` +- `databake` +- `eframe` +- `glyphon` +- `cosmic-text` +- `keyframe` +- `glam` +- `wgpu` diff --git a/src/scratch.jot b/src/scratch.jot new file mode 100644 index 0000000..b09eb10 --- /dev/null +++ b/src/scratch.jot @@ -0,0 +1,10 @@ +# Scratch Experience + +Every software developer worth their salt can say they're proficient in Scratch, but very few can say that they've made an award winning Scratch project. In 3rd grade, [my Scratch project](https://scratch.mit.edu/projects/144210368/) won 3rd place in the The Discovery's 2017 Scratch Code Challenge, hosted by the [Terry Lee Wells Discovery Museum](https://nvdm.org) in Reno, Nevada. To my memory, the competition was separated by grade level, and had ~1,000 international participants. + +![Scratch Winner Image 1](images/scratch_winner1.jpg#256x192) +![Scratch Winner Image 2](images/scratch_winner2.jpg#256x192) + +- And yes, I do have the medal and the Windows 10 Pro license to prove it + +![Medal](images/scratch_medal.jpg#231x512) diff --git a/src/shader.wgsl b/src/shader.wgsl new file mode 100644 index 0000000..918435b --- /dev/null +++ b/src/shader.wgsl @@ -0,0 +1,68 @@ +struct Uniforms { + iResolution: vec2, + time: f32, + iMouse: vec2, + size: f32, + offset: vec2, + beamwidth: f32, + paddingtwo: f32 +}; + +@group(0) @binding(0) +var uni: Uniforms; + +@vertex +fn vs_main(@builtin(vertex_index) vertex_index: u32) -> @builtin(position) vec4 { + var x = f32(i32((vertex_index << u32(1)) & u32(2))); + var y = f32(i32(vertex_index & u32(2))); + var uv = vec2(x, y); + var out = 2.0 * uv - vec2(1.0, 1.0); + return vec4(out.x, out.y, 0.0, 1.0); +} + +fn modulo(a: f32, b: f32) -> f32 { + return ((a % b) + b) % b; +} + +@fragment +fn fs_main(@builtin(position) fragCoord: vec4) -> @location(0) vec4 { + let iMouse = uni.iMouse + uni.offset; + let frag_coord = fragCoord + uni.offset.xyxy; + var p: vec2; + var m: vec2; + if (uni.iResolution.x < uni.iResolution.y) { + m = (2. * iMouse - uni.iResolution) / uni.iResolution.x; + p = (2. * frag_coord.xy - uni.iResolution) / uni.iResolution.x; + } else { + m = (2. * iMouse - uni.iResolution) / uni.iResolution.y; + p = (2. * frag_coord.xy - uni.iResolution) / uni.iResolution.y; + } + let tau: f32 = 3.1415927 * 2.; + let a: f32 = atan2(p.x, p.y); + let mousexy: f32 = atan2(m.x, m.y); + var r: f32 = length(p) * uni.size; + var l: f32 = length(m) * uni.size; + var mouse: vec2 = vec2(mousexy / tau, l); + var uv: vec2 = vec2(a / tau, r); + var xCol: f32 = uv.x * 3.; + xCol = modulo((xCol), (3.)); + var horColour: vec3 = vec3(0.25, 0.25, 0.25); + if (xCol < 1.) { + horColour.r = horColour.r + (1. - xCol); + horColour.g = horColour.g + (xCol); + } else { if (xCol < 2.) { + xCol = xCol - (1.); + horColour.g = horColour.g + (1. - xCol); + horColour.b = horColour.b + (xCol); + } else { + xCol = xCol - (2.); + horColour.b = horColour.b + (1. - xCol); + horColour.r = horColour.r + (xCol); + } + } + uv = 2. * uv - 1.; + mouse = 2. * mouse - 1.; + let beamWidth: f32 = (0.7 + 0.5 * sin((uv.x + (mouse.x - 0.2)) * 2. * tau * 0.15 * clamp(5., 0., 10.))) * abs(uni.beamwidth / (30. * uv.y)); + let horBeam: vec3 = vec3(beamWidth); + return vec4(horBeam * horColour, 1.); +} diff --git a/src/tree_sitter.jot b/src/tree_sitter.jot new file mode 100644 index 0000000..78394d1 --- /dev/null +++ b/src/tree_sitter.jot @@ -0,0 +1 @@ +# Tree-sitter Experience