commit abf4cbcfc6fafc8f24f13f0121b1d2456d6bc5e6 Author: 雷电芽衣 Date: Thu Sep 24 23:59:55 2026 -0400 T00 foundation: theme, motion, assets, icon, buttons, gallery Theme tokens in light and dark with high contrast, a palette cross-fade, motion curves and a damped spring, embedded Lucide icons with Inter and JetBrains Mono, Icon, Button, IconButton, and a gallery that captures its own window. Reviewed by codex gpt-6-astra (max): PASS in round 3. diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..87939b3 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +/target +node_modules/ +/frontend/dist/ +.DS_Store diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..a089496 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,46 @@ +# AGENTS.md + +Ely GPUI Component. A component library for GPUI, in light and dark. + +## Stack + +- Rust 1.95, edition 2024. One crate: `ely-gpui-component`. +- gpui 0.2.2 from crates.io. Feature `runtime_shaders` is on by default: machines without Xcode lack the Metal compiler. +- Assets, embedded with `rust-embed`: Lucide 1.48.0 icons (ISC), Inter 4.1 and JetBrains Mono 2.304 (OFL). +- Gallery: `examples/gallery`. Website: `frontend/` (Vite 8, pnpm), built after the components. + +## Commands + +- `cargo run --example gallery` opens the gallery. `-- --page ` starts on a page. +- `cargo run --example gallery -- --capture ` writes PNGs of every page, light and dark, top to bottom. macOS only. +- `cargo test --lib`, `cargo clippy --all-targets -- -D warnings`, `cargo fmt --check`. +- `rm -rf target/debug/incremental` after each task item keeps the disk lean. +- `scripts/icons.sh ...` adds icons. Then add a line to `IconName` in `src/primitives/icon.rs`. + +## Layout + +- `src//`: one folder per chapter of `gpui-components.md`. +- `src/theme`: palettes, tokens, `ActiveTheme`. `src/motion`: durations, easings, spring. +- `examples/gallery/pages/.rs`: one page per chapter, in PRD order. +- `TASKS.md` and `tasks/`: progress. Every PRD entry has a line and a tag. + +## Rules + +- Colors, control and icon sizes, text sizes, radii, shadows come from `cx.theme()`. No raw `px()` literals inside components. +- Gaps and padding use gpui's rem scale helpers (`gap_2`, `px_3`). That scale is the spacing system. +- Borders use gpui's fixed-pixel helpers (`border_1` is 1px). Hairlines do not scale. +- One component, one home. Duplicates point to it. +- Fail fast. No silent fallbacks. Log state changes with `log`. +- Files stay under 500 lines. Comments are one short line, and rare. +- `motion::duration()` honors reduced motion. Springs overshoot: use them inside animators, never as gpui easings, because gpui asserts eased values stay in `0..=1`. +- `svg()` paints only with its own `text_color`. `Icon` always sets one. +- Buttons stay out of focus on click (`prevent_default` on mouse down). Tab still reaches them. +- `hover()` needs an element id. + +## Decisions + +- 2026-09-24: official gpui 0.2.2 over the `gpui-pre` snapshot. Older API, first-party publisher. +- 2026-09-24: one crate. Revisit if an incremental check passes 90 seconds. +- 2026-09-24: gpui 0.2.2 has no accessibility tree and no tray, badge, or notification API. Those entries carry `blocked` or `prove`. +- 2026-09-24: the gallery photographs its own window with `CGWindowListCreateImage`. No Screen Recording permission needed. +- 2026-09-24: license MIT OR Apache-2.0. diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 0000000..69fd4f9 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,7392 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 4 + +[[package]] +name = "adler2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" + +[[package]] +name = "aes" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b169f7a6d4742236a0a00c541b845991d0ac43e546831af1249753ab4c3aa3a0" +dependencies = [ + "cfg-if", + "cipher", + "cpufeatures 0.2.17", + "zeroize", +] + +[[package]] +name = "ahash" +version = "0.8.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a15f179cd60c4584b8a8c596927aadc462e27f2ca70c04e0071964a73ba7a75" +dependencies = [ + "cfg-if", + "const-random", + "once_cell", + "version_check", + "zerocopy", +] + +[[package]] +name = "aho-corasick" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c982642fa9e8606056828ee9a8505737230110bb1099153c79efe865c59d12ba" +dependencies = [ + "memchr", +] + +[[package]] +name = "aligned" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee4508988c62edf04abd8d92897fca0c2995d907ce1dfeaf369dac3716a40685" +dependencies = [ + "as-slice", +] + +[[package]] +name = "aligned-vec" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc890384c8602f339876ded803c97ad529f3842aba97f6392b3dba0dd171769b" +dependencies = [ + "equator", +] + +[[package]] +name = "anstream" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "824a212faf96e9acacdbd09febd34438f8f711fb84e09a8916013cd7815ca28d" +dependencies = [ + "anstyle", + "anstyle-parse", + "anstyle-query", + "anstyle-wincon", + "colorchoice", + "is_terminal_polyfill", + "utf8parse", +] + +[[package]] +name = "anstyle" +version = "1.0.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "940b3a0ca603d1eade50a4846a2afffd5ef57a9feac2c0e2ec2e14f9ead76000" + +[[package]] +name = "anstyle-parse" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52ce7f38b242319f7cabaa6813055467063ecdc9d355bbb4ce0c68908cd8130e" +dependencies = [ + "utf8parse", +] + +[[package]] +name = "anstyle-query" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40c48f72fd53cd289104fc64099abca73db4166ad86ea0b4341abe65af83dadc" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "anstyle-wincon" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d" +dependencies = [ + "anstyle", + "once_cell_polyfill", + "windows-sys 0.61.2", +] + +[[package]] +name = "anyhow" +version = "1.0.104" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330a5ed07fa54e4702c9d6c4174f74427fc0ef6e214bbd677ae50a5099946470" + +[[package]] +name = "ar_archive_writer" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73cd58deff2140a0a8eae87e417bd01db68a33e148aa93d1e8cd837e55e312b6" +dependencies = [ + "object", +] + +[[package]] +name = "arbitrary" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" + +[[package]] +name = "arg_enum_proc_macro" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ae92a5119aa49cdbcf6b9f893fe4e1d98b04ccbf82ee0584ad948a44a734dea" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "arrayref" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb" + +[[package]] +name = "arrayvec" +version = "0.7.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3fb67a6e08acf24fdeccbac2cb6ac4305825bd1f117462e0e6f2f193345ad56" + +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[package]] +name = "as-slice" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "516b6b4f0e40d50dcda9365d53964ec74560ad4284da2e7fc97122cd83174516" +dependencies = [ + "stable_deref_trait", +] + +[[package]] +name = "ash" +version = "0.38.0+1.3.281" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bb44936d800fea8f016d7f2311c6a4f97aebd5dc86f09906139ec848cf3a46f" +dependencies = [ + "libloading", +] + +[[package]] +name = "ash-window" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52bca67b61cb81e5553babde81b8211f713cb6db79766f80168f3e5f40ea6c82" +dependencies = [ + "ash", + "raw-window-handle", + "raw-window-metal", +] + +[[package]] +name = "ashpd" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f3f79755c74fd155000314eb349864caa787c6592eace6c6882dad873d9c39" +dependencies = [ + "async-fs", + "async-net", + "enumflags2", + "futures-channel", + "futures-util", + "rand 0.9.5", + "serde", + "serde_repr", + "url", + "wayland-backend", + "wayland-client", + "wayland-protocols 0.32.13", + "zbus", +] + +[[package]] +name = "ashpd" +version = "0.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33a3c86f3fd70c0ffa500ed189abfa90b5a52398a45d5dc372fcc38ebeb7a645" +dependencies = [ + "async-fs", + "async-net", + "enumflags2", + "futures-channel", + "futures-util", + "rand 0.9.5", + "serde", + "serde_repr", + "url", + "zbus", +] + +[[package]] +name = "async-broadcast" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" +dependencies = [ + "event-listener 5.4.2", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81953c529336010edd6d8e358f886d9581267795c61b19475b71314bffa46d35" +dependencies = [ + "concurrent-queue", + "event-listener 2.5.3", + "futures-core", +] + +[[package]] +name = "async-channel" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-compression" +version = "0.4.48" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb61aea1a7def73ee7c350a184f0e70b32c182344e2e75bf70c9b621b83417fd" +dependencies = [ + "compression-codecs", + "compression-core", + "futures-io", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand 2.5.0", + "futures-lite 2.6.1", + "pin-project-lite", + "slab", +] + +[[package]] +name = "async-fs" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" +dependencies = [ + "async-lock", + "blocking", + "futures-lite 2.6.1", +] + +[[package]] +name = "async-global-executor" +version = "2.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05b1b633a2115cd122d73b955eadd9916c18c8f510ec9cd1686404c60ad1c29c" +dependencies = [ + "async-channel 2.5.0", + "async-executor", + "async-io", + "async-lock", + "blocking", + "futures-lite 2.6.1", + "once_cell", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite 2.6.1", + "parking", + "polling", + "rustix 1.1.5", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-lock" +version = "3.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" +dependencies = [ + "event-listener 5.4.2", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-net" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" +dependencies = [ + "async-io", + "blocking", + "futures-lite 2.6.1", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" +dependencies = [ + "async-channel 2.5.0", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener 5.4.2", + "futures-lite 2.6.1", + "rustix 1.1.5", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "async-signal" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix 1.1.5", + "signal-hook-registry", + "slab", + "windows-sys 0.61.2", +] + +[[package]] +name = "async-std" +version = "1.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c8e079a4ab67ae52b7403632e4618815d6db36d2a010cfe41b02c1b1578f93b" +dependencies = [ + "async-channel 1.9.0", + "async-global-executor", + "async-io", + "async-lock", + "async-process", + "crossbeam-utils", + "futures-channel", + "futures-core", + "futures-io", + "futures-lite 2.6.1", + "gloo-timers", + "kv-log-macro", + "log", + "memchr", + "once_cell", + "pin-project-lite", + "pin-utils", + "slab", + "wasm-bindgen-futures", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.92" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82f6aeea286b8eb4dd3431a1be1b59d290ace00f5bfd8e2a159bc2a05e2c1667" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "async_zip" +version = "0.0.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00b9f7252833d5ed4b00aa9604b563529dd5e11de9c23615de2dcdf91eb87b52" +dependencies = [ + "async-compression", + "crc32fast", + "futures-lite 2.6.1", + "pin-project", + "thiserror 1.0.69", +] + +[[package]] +name = "atomic" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59bdb34bc650a32731b31bd8f0829cc15d24a708ee31559e0bb34f2bc320cba" + +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + +[[package]] +name = "autocfg" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2032f911046de80f0a198e0901378627c33f59ea0ac00e363d481118bd70a53" + +[[package]] +name = "av-scenechange" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f321d77c20e19b92c39e7471cf986812cbb46659d2af674adc4331ef3f18394" +dependencies = [ + "aligned", + "anyhow", + "arg_enum_proc_macro", + "arrayvec", + "log", + "num-rational", + "num-traits", + "pastey", + "rayon", + "thiserror 2.0.21", + "v_frame", + "y4m", +] + +[[package]] +name = "av1-grain" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8cfddb07216410377231960af4fcab838eaa12e013417781b78bd95ee22077f8" +dependencies = [ + "anyhow", + "arrayvec", + "log", + "nom 8.0.0", + "num-rational", + "v_frame", +] + +[[package]] +name = "avif-serialize" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7178fe5f7d460b13895ebb9dcb28a3a6216d2df2574a0806cb51b555d297f38" +dependencies = [ + "arrayvec", +] + +[[package]] +name = "base64" +version = "0.22.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72b3254f16251a8381aa12e40e3c4d2f0199f8c6508fbecb9d91f575e0fbb8c6" + +[[package]] +name = "bindgen" +version = "0.71.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5f58bf3d7db68cfbac37cfc485a8d711e87e064c3d0fe0435b92f7a407f9d6b3" +dependencies = [ + "bitflags 2.13.2", + "cexpr", + "clang-sys", + "itertools 0.13.0", + "log", + "prettyplease", + "proc-macro2", + "quote", + "regex", + "rustc-hash 2.1.3", + "shlex 1.3.0", + "syn 2.0.119", +] + +[[package]] +name = "bit-set" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" +dependencies = [ + "bit-vec", +] + +[[package]] +name = "bit-vec" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" + +[[package]] +name = "bit_field" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e4b40c7323adcfc0a41c4b88143ed58346ff65a288fc144329c5c45e05d70c6" + +[[package]] +name = "bitflags" +version = "1.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" + +[[package]] +name = "bitflags" +version = "2.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" + +[[package]] +name = "bitstream-io" +version = "4.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7eff00be299a18769011411c9def0d827e8f2d7bf0c3dbf53633147a8867fd1f" +dependencies = [ + "no_std_io2", +] + +[[package]] +name = "blade-graphics" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e71cfb73b98eb9f58ee84048aa1bdf4e7497fd20c141b57523499fa066b48fed" +dependencies = [ + "ash", + "ash-window", + "bitflags 2.13.2", + "bytemuck", + "codespan-reporting", + "glow", + "gpu-alloc", + "gpu-alloc-ash", + "hidden-trait", + "js-sys", + "khronos-egl", + "libloading", + "log", + "mint", + "naga", + "objc2", + "objc2-app-kit", + "objc2-core-foundation", + "objc2-foundation", + "objc2-metal", + "objc2-quartz-core", + "objc2-ui-kit", + "once_cell", + "raw-window-handle", + "slab", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "blade-macros" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27142319e2f4c264581067eaccb9f80acccdde60d8b4bf57cc50cd3152f109ca" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "blade-util" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a6be3a82c001ba7a17b6f8e413ede5d1004e6047213f8efaf0ffc15b5c4904c" +dependencies = [ + "blade-graphics", + "bytemuck", + "log", + "profiling", +] + +[[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-buffer" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f6c7dbe95a6ed67ad9f18e57daf93a2f034c524b99fd2b76d18fdfeb6660aa" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "block-padding" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8894febbff9f758034a5b8e12d87918f56dfc64a8e1fe757d65e29041538d93" +dependencies = [ + "generic-array", +] + +[[package]] +name = "block2" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" +dependencies = [ + "objc2", +] + +[[package]] +name = "blocking" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a70e4329df6cb94385eed412ec92375c3cdd8a6e502493d1229b6414e4036dfa" +dependencies = [ + "async-channel 2.5.0", + "async-task", + "futures-io", + "futures-lite 2.6.1", + "piper", +] + +[[package]] +name = "bstr" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6bb31b46c14244e20ee9984b11bf5c992b91fb6939fea616e3512c8baecdbe5f" +dependencies = [ + "memchr", + "serde_core", +] + +[[package]] +name = "built" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c0e531d93d39c34eef561e929e8a7f86d77a5af08aac4f6d6e39976c51858e9" + +[[package]] +name = "bumpalo" +version = "3.20.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72f5acc6cb2ba439de613abc23857ec3d78374d8ed5ac84e9d11336e87da8649" + +[[package]] +name = "bytemuck" +version = "1.25.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95832e849adfb21180ccb6826a99da14e5d266ae5c2e668e1602cf234f153797" +dependencies = [ + "bytemuck_derive", +] + +[[package]] +name = "bytemuck_derive" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a1f896587b6f2c069c73d2f0913e2d590c3990285cd2f0b6aa02b786b4c679c" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "byteorder" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fd0f2584146f6f2ef48085050886acf353beff7305ebd1ae69500e27c67f64b" + +[[package]] +name = "byteorder-lite" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f1fe948ff07f4bd06c30984e69f5b4899c516a3ef74f34df92a2df2ab535495" + +[[package]] +name = "bytes" +version = "1.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc652a48c352aef3ea3aed32080501cf3ef6ed5da78602a020c991775b0aff04" + +[[package]] +name = "calloop" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b99da2f8558ca23c71f4fd15dc57c906239752dd27ff3c00a1d56b685b7cbfec" +dependencies = [ + "bitflags 2.13.2", + "log", + "polling", + "rustix 0.38.44", + "slab", + "thiserror 1.0.69", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop", + "rustix 0.38.44", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "cbc" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "26b52a9543ae338f279b96b0b9fed9c8093744685043739079ce85cd58f289a6" +dependencies = [ + "cipher", +] + +[[package]] +name = "cbindgen" +version = "0.28.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eadd868a2ce9ca38de7eeafdcec9c7065ef89b42b32f0839278d55f35c54d1ff" +dependencies = [ + "heck 0.4.1", + "indexmap", + "log", + "proc-macro2", + "quote", + "serde", + "serde_json", + "syn 2.0.119", + "tempfile", + "toml 0.8.23", +] + +[[package]] +name = "cc" +version = "1.4.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "54413ede23c2daf518f35156dfde027feb2374004d63bd497f983c8db9c0e313" +dependencies = [ + "find-msvc-tools", + "jobserver", + "libc", + "shlex 2.0.1", +] + +[[package]] +name = "cexpr" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6fac387a98bb7c37292057cffc56d62ecb629900026402633ae9160df93a8766" +dependencies = [ + "nom 7.1.3", +] + +[[package]] +name = "cfg-if" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e7648175b45a9a48536d676f68d918270699102aa8dab5496df06904c914600" + +[[package]] +name = "cfg_aliases" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f079e83a288787bcd14a6aea84cee5c87a67c5a3e660c30f557a3d24761b3527" + +[[package]] +name = "cgl" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ced0551234e87afee12411d535648dd89d2e7f34c78b753395567aff3d447ff" +dependencies = [ + "libc", +] + +[[package]] +name = "chacha20" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c35e4b699c7e15ccbe7ee35c005e4fc0a278d22238a2857e6ce2dadeda1b06" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.1", + "rand_core 0.10.1", +] + +[[package]] +name = "cipher" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773f3b9af64447d2ce9850330c473515014aa235e6a783b02db81ff39e4a3dad" +dependencies = [ + "crypto-common 0.1.7", + "inout", + "zeroize", +] + +[[package]] +name = "clang-sys" +version = "1.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "157a8ba7b480713b56f4c09fd13fc3e0a22a5dfab8097ba61cbc5feef950788a" +dependencies = [ + "glob", + "libc", + "libloading", +] + +[[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 0.1.2", + "core-foundation 0.9.4", + "core-graphics 0.23.2", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa" +version = "0.26.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f79398230a6e2c08f5c9760610eb6924b52aa9e7950a619602baba59dcbbdbb2" +dependencies = [ + "bitflags 2.13.2", + "block", + "cocoa-foundation 0.2.0", + "core-foundation 0.10.0", + "core-graphics 0.24.0", + "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 0.9.4", + "core-graphics-types 0.1.3", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e14045fb83be07b5acf1c0884b2180461635b433455fa35d1cd6f17f1450679d" +dependencies = [ + "bitflags 2.13.2", + "block", + "core-foundation 0.10.0", + "core-graphics-types 0.2.0", + "libc", + "objc", +] + +[[package]] +name = "codespan-reporting" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe6d2e5af09e8c8ad56c969f2157a3d4238cebc7c55f0a517728c38f7b200f81" +dependencies = [ + "serde", + "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 = "colorchoice" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d07550c9036bf2ae0c684c4297d503f838287c83c53686d05370d0e139ae570" + +[[package]] +name = "command-fds" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b60b5124979fccd9addd89d8b97a1d6eebb4950694520c75ddd722535ea443f" +dependencies = [ + "nix 0.31.3", + "thiserror 2.0.21", +] + +[[package]] +name = "compression-codecs" +version = "0.4.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bef16c47ba2797aa6a909cc37d39911f3a6743811fe7408ac0b0cc0276b656e9" +dependencies = [ + "compression-core", + "deflate64", + "flate2", + "memchr", +] + +[[package]] +name = "compression-core" +version = "0.4.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e8ccc4ea9f6acc32d102c0f6d471d11d913ad15f20c04de743374861fa1d414" + +[[package]] +name = "concurrent-queue" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ca0197aee26d1ae37445ee532fefce43251d24cc7c166799f4d46817f1d3973" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "const-oid" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6ef517f0926dd24a1582492c791b6a4818a4d94e789a334894aa15b0d12f55c" + +[[package]] +name = "const-random" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87e00182fe74b066627d63b85fd550ac2998d4b0bd86bfed477a0ae4c7c71359" +dependencies = [ + "const-random-macro", +] + +[[package]] +name = "const-random-macro" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9d839f2a20b0aee515dc581a6172f2321f96cab76c1a38a4c584a194955390e" +dependencies = [ + "getrandom 0.2.17", + "once_cell", + "tiny-keccak", +] + +[[package]] +name = "convert_case" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6245d59a3e82a7fc217c5828a6692dbc6dfb63a0c8c90495621f7b9d79704a0e" + +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" +dependencies = [ + "bitflags 2.13.2", + "core-foundation 0.10.0", + "core-graphics-types 0.2.0", + "foreign-types", + "libc", +] + +[[package]] +name = "core-graphics-helmer-fork" +version = "0.24.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32eb7c354ae9f6d437a6039099ce7ecd049337a8109b23d73e48e8ffba8e9cd5" +dependencies = [ + "bitflags 2.13.2", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", + "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 0.9.4", + "libc", +] + +[[package]] +name = "core-graphics-types" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" +dependencies = [ + "bitflags 2.13.2", + "core-foundation 0.10.0", + "libc", +] + +[[package]] +name = "core-graphics2" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e4583956b9806b69f73fcb23aee05eb3620efc282972f08f6a6db7504f8334d" +dependencies = [ + "bitflags 2.13.2", + "block", + "cfg-if", + "core-foundation 0.10.0", + "libc", +] + +[[package]] +name = "core-text" +version = "21.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a593227b66cbd4007b2a050dfdd9e1d1318311409c8d600dc82ba1b15ca9c130" +dependencies = [ + "core-foundation 0.10.0", + "core-graphics 0.24.0", + "foreign-types", + "libc", +] + +[[package]] +name = "core-video" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d45e71d5be22206bed53c3c3cb99315fc4c3d31b8963808c6bc4538168c4f8ef" +dependencies = [ + "block", + "core-foundation 0.10.0", + "core-graphics2", + "io-surface", + "libc", + "metal", +] + +[[package]] +name = "core_detect" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f8f80099a98041a3d1622845c271458a2d73e688351bf3cb999266764b81d48" + +[[package]] +name = "core_maths" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" +dependencies = [ + "libm", +] + +[[package]] +name = "cosmic-text" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da46a9d5a8905cc538a4a5bceb6a4510de7a51049c5588c0114efce102bcbbe8" +dependencies = [ + "bitflags 2.13.2", + "fontdb 0.16.2", + "log", + "rangemap", + "rustc-hash 1.1.0", + "rustybuzz 0.14.1", + "self_cell", + "smol_str", + "swash", + "sys-locale", + "ttf-parser 0.21.1", + "unicode-bidi", + "unicode-linebreak", + "unicode-script", + "unicode-segmentation", +] + +[[package]] +name = "cpufeatures" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "59ed5838eebb26a2bb2e58f6d5b5316989ae9d08bab10e0e6d103e656d1b0280" +dependencies = [ + "libc", +] + +[[package]] +name = "cpufeatures" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5ca28b0ae3115b884660db4118d803791fd6756b6e88f39c0f3f7859060d7566" +dependencies = [ + "libc", +] + +[[package]] +name = "crc32fast" +version = "1.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "01a7799fd6b852db0e61728dde9a204c423b44d689dbd432522543614b490e78" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "crossbeam-deque" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "622f3fc73690be383c7214310406f28a90e6edeadc3cea882f9d71e495b9711a" +dependencies = [ + "crossbeam-epoch", + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-epoch" +version = "0.9.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc74980687109a3b14c72fd458107bf0baa1da1a1a805e178d15501ba9b86d9d" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-queue" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03e8bd762f7479489c70ed6c768ddca99d7296857de437a68dcb2a94365b3fae" +dependencies = [ + "crossbeam-utils", +] + +[[package]] +name = "crossbeam-utils" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a31eee39dddec8330830986fcd7625edb5a24ec90ea038215273bbc3adb08ac6" + +[[package]] +name = "crunchy" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "460fbee9c2c2f33933d720630a6a0bac33ba7053db5344fac858d4b8952d77d5" + +[[package]] +name = "crypto-common" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a" +dependencies = [ + "generic-array", + "rand_core 0.6.4", + "typenum", +] + +[[package]] +name = "crypto-common" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce6e4c961d6cd6c9a86db418387425e8bdeaf05b3c8bc1411e6dca4c252f1453" +dependencies = [ + "hybrid-array", +] + +[[package]] +name = "ctor" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec09e802f5081de6157da9a75701d6c713d8dc3ba52571fd4bd25f412644e8a6" +dependencies = [ + "ctor-proc-macro", + "dtor", +] + +[[package]] +name = "ctor-proc-macro" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2931af7e13dc045d8e9d26afccc6fa115d64e115c9c84b1166288b46f6782c2" + +[[package]] +name = "data-url" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be1e0bca6c3637f992fc1cc7cbc52a78c1ef6db076dbf1059c4323d6a2048376" + +[[package]] +name = "deflate64" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac6b926516df9c60bfa16e107b21086399f8285a44ca9711344b9e553c5146e2" + +[[package]] +name = "defmt" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2953bfe4f93bbd20cc71198842756f77d161884c99ebbabc41d80231ded88d1" +dependencies = [ + "bitflags 1.3.2", + "defmt-macros", +] + +[[package]] +name = "defmt-macros" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad9c72e7ca2137e0dc3813245a0d282fd6daad32fd800af018306a9169b5fe8" +dependencies = [ + "defmt-parser", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "defmt-parser" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10d60334b3b2e7c9d91ef8150abfb6fa4c1c39ebbcf4a81c2e346aad939fee3e" +dependencies = [ + "thiserror 2.0.21", +] + +[[package]] +name = "derive_more" +version = "0.99.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6edb4b64a43d977b8e99788fe3a04d483834fba1215a7e02caa415b626497f7f" +dependencies = [ + "convert_case", + "proc-macro2", + "quote", + "rustc_version", + "syn 2.0.119", +] + +[[package]] +name = "digest" +version = "0.10.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292" +dependencies = [ + "block-buffer 0.10.4", + "crypto-common 0.1.7", + "subtle", +] + +[[package]] +name = "digest" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1dd6dbb5841937940781866fa1281a1ff7bd3bf827091440879f9994983d5c2" +dependencies = [ + "block-buffer 0.12.1", + "const-oid", + "crypto-common 0.2.2", +] + +[[package]] +name = "dirs" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3aa72a6f96ea37bbc5aa912f6788242832f75369bdfdadcb0e38423f100059" +dependencies = [ + "dirs-sys 0.3.7", +] + +[[package]] +name = "dirs" +version = "5.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44c45a9d03d6676652bcb5e724c7e988de1acad23a711b5217ab9cbecbec2225" +dependencies = [ + "dirs-sys 0.4.1", +] + +[[package]] +name = "dirs-sys" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1b1d1d91c932ef41c0f2663aa8b0ca0342d444d842c06914aa0a7e352d0bada6" +dependencies = [ + "libc", + "redox_users", + "winapi", +] + +[[package]] +name = "dirs-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "520f05a5cbd335fae5a99ff7a6ab8627577660ee5cfd6a94a6a929b52ff0321c" +dependencies = [ + "libc", + "option-ext", + "redox_users", + "windows-sys 0.48.0", +] + +[[package]] +name = "dispatch" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" +dependencies = [ + "bitflags 2.13.2", + "objc2", +] + +[[package]] +name = "displaydoc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6232dd377dcc64799954cbd3a9bb882e9cdc1308ccd87b1c098f1fb2eaf82a8" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "dlib" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" +dependencies = [ + "libloading", +] + +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + +[[package]] +name = "dtor" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "97cbdf2ad6846025e8e25df05171abfb30e3ababa12ee0a0e44b9bbe570633a8" +dependencies = [ + "dtor-proc-macro", +] + +[[package]] +name = "dtor-proc-macro" +version = "0.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7454e41ff9012c00d53cf7f475c5e3afa3b91b7c90568495495e8d9bf47a1055" + +[[package]] +name = "dunce" +version = "1.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92773504d58c093f6de2459af4af33faa518c13451eb8f2b5698ed3d36e7c813" + +[[package]] +name = "dwrote" +version = "0.11.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9e1b35532432acc8b19ceed096e35dfa088d3ea037fe4f3c085f1f97f33b4d02" +dependencies = [ + "lazy_static", + "libc", + "winapi", + "wio", +] + +[[package]] +name = "dyn-clone" +version = "1.0.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" + +[[package]] +name = "either" +version = "1.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "252afb9ae5eaa683babdc6a068b3f5726eb19e05070c731f9b2a23a7c3e8ed34" + +[[package]] +name = "ely-gpui-component" +version = "0.1.0" +dependencies = [ + "anyhow", + "core-foundation 0.10.0", + "core-graphics 0.24.0", + "env_logger", + "gpui", + "image", + "log", + "rust-embed", +] + +[[package]] +name = "embed-resource" +version = "3.0.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbfdaacccebec3b28e4866b8973543c7647797db5ada1bdab552e48fe665fbbd" +dependencies = [ + "cc", + "memchr", + "rustc_version", + "toml 1.1.6+spec-1.1.0", + "vswhom", + "winreg", +] + +[[package]] +name = "encoding_rs" +version = "0.8.42" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e985e0451871ad22fb8d2b6b076e2028a502a0d3950998c2c5c0a4f9b5d9679" +dependencies = [ + "cfg-if", + "core_detect", + "multiversion_no_op", + "rustversion", + "scopeguard", + "simdutf8", +] + +[[package]] +name = "endi" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enumflags2" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "env_filter" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "900d271a03799a1ee8d1ca9b19893b48ca674a9284fefcfb85f05e74ed314217" +dependencies = [ + "log", + "regex", +] + +[[package]] +name = "env_logger" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de671bd27a75a797dc9ae289ba1e77276e75e2026408aab65185384e2d5cd3f6" +dependencies = [ + "anstream", + "anstyle", + "env_filter", + "jiff", + "log", +] + +[[package]] +name = "equator" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4711b213838dfee0117e3be6ac926007d7f433d7bbe33595975d4190cb07e6fc" +dependencies = [ + "equator-macro", +] + +[[package]] +name = "equator-macro" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44f23cf4b44bfce11a86ace86f8a73ffdec849c9fd00a386a53d278bd9e81fb3" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "equivalent" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" + +[[package]] +name = "erased-serde" +version = "0.4.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2add8a07dd6a8d93ff627029c51de145e12686fbc36ecb298ac22e74cf02dec" +dependencies = [ + "serde", + "serde_core", + "typeid", +] + +[[package]] +name = "errno" +version = "0.3.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "etagere" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc89bf99e5dc15954a60f707c1e09d7540e5cd9af85fa75caa0b510bc08c5342" +dependencies = [ + "euclid", + "svg_fmt", +] + +[[package]] +name = "euclid" +version = "0.22.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1a05365e3b1c6d1650318537c7460c6923f1abdd272ad6842baa2b509957a06" +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 = "5.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" +dependencies = [ + "parking", + "pin-project-lite", +] + +[[package]] +name = "event-listener-strategy" +version = "0.5.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" +dependencies = [ + "event-listener 5.4.2", + "pin-project-lite", +] + +[[package]] +name = "exr" +version = "1.74.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "711fe42c9964295e01ee3fba3f9fe0e1d24b98886950d68efe81b1c76e21adf3" +dependencies = [ + "bit_field", + "half", + "lebe", + "miniz_oxide 0.8.9", + "num-complex", + "pulp", + "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.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da7c62ceae207dd37ea5b845da6a0696c799f85e97da1ab5b7910be3c1c80223" + +[[package]] +name = "fax" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caf1079563223d5d59d83c85886a56e586cfd5c1a26292e971a0fa266531ac5a" + +[[package]] +name = "fdeflate" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e6853b52649d4ac5c0bd02320cddc5ba956bdb407c4b75a2c6b75bf51500f8c" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "filedescriptor" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e40758ed24c9b2eeb76c35fb0aebc66c626084edd827e07e1552279814c6682d" +dependencies = [ + "libc", + "thiserror 1.0.69", + "winapi", +] + +[[package]] +name = "filetime" +version = "0.2.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c287a33c7f0a620c38e641e7f60827713987b3c0f26e8ddc9462cc69cf75759" +dependencies = [ + "cfg-if", + "libc", +] + +[[package]] +name = "find-msvc-tools" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25905e51abafe4dcea6c15fec58c57b601cdbd0ee53d22ea1d3016c587d39b" + +[[package]] +name = "flate2" +version = "1.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e634e2e0ebac1ee034020da1ca582e17ffe4e0f5e985823721e168928136dcb" +dependencies = [ + "crc32fast", + "miniz_oxide 0.9.1", + "zlib-rs", +] + +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" + +[[package]] +name = "float-ord" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ce81f49ae8a0482e4c55ea62ebbd7e5a686af544c00b9d090bba3ff9be97b3d" + +[[package]] +name = "float_next_after" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bf7cc16383c4b8d58b9905a8509f02926ce3058053c056376248d958c9df1e8" + +[[package]] +name = "flume" +version = "0.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095" +dependencies = [ + "futures-core", + "futures-sink", + "nanorand", + "spin", +] + +[[package]] +name = "fnv" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" + +[[package]] +name = "foldhash" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" + +[[package]] +name = "font-types" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8eb065f3251655b3c90e22e5e363f310fc5332fb3402e37bbc94752283248f6" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "fontconfig-parser" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbc773e24e02d4ddd8395fd30dc147524273a83e54e0f312d986ea30de5f5646" +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 0.20.0", +] + +[[package]] +name = "fontdb" +version = "0.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905" +dependencies = [ + "fontconfig-parser", + "log", + "memmap2", + "slotmap", + "tinyvec", + "ttf-parser 0.25.1", +] + +[[package]] +name = "foreign-types" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d737d9aa519fb7b749cbc3b962edcf310a8dd1f4b67c91c4f83975dbdd17d965" +dependencies = [ + "foreign-types-macros", + "foreign-types-shared", +] + +[[package]] +name = "foreign-types-macros" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea5190182e6915eb873ddbc16e23b711b6eb1f9c00a0d0a3a91b5f6228475225" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "foreign-types-shared" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa9a19cbb55df58761df49b23516a86d432839add4af60fc256da840f66ed35b" + +[[package]] +name = "form_urlencoded" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" +dependencies = [ + "percent-encoding", +] + +[[package]] +name = "freetype-sys" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e7edc5b9669349acfda99533e9e0bcf26a51862ab43b08ee7745c55d28eb134" +dependencies = [ + "cc", + "libc", + "pkg-config", +] + +[[package]] +name = "futf" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df420e2e84819663797d1ec6544b13c5be84629e7bb00dc960d6917db2987843" +dependencies = [ + "mac", + "new_debug_unreachable", +] + +[[package]] +name = "futures" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a31d2a3fbaaeb2af2368bbdd904aa8e812d3c04a1ee10d3171f52d556e5d0a3" +dependencies = [ + "futures-channel", + "futures-core", + "futures-executor", + "futures-io", + "futures-sink", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-channel" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1f9e3d69d39e4862ffed03ed071a76f9a13ba1d9109d355b0f0aa6b15e393c4" +dependencies = [ + "futures-core", + "futures-sink", +] + +[[package]] +name = "futures-core" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92d699e522242e69e3003b94ecc1f960f3a5e015aa7c5d7486e65ad01dd94f5e" + +[[package]] +name = "futures-executor" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "031b47cf1a3c6cc8bc2fc76cd437f521619387907d469316e7c0bc278f1f5432" +dependencies = [ + "futures-core", + "futures-task", + "futures-util", +] + +[[package]] +name = "futures-io" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53c0fa8157de1303bfffdaa1cc2a673bfffb60102f76b0ef4441659124373fed" + +[[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.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" +dependencies = [ + "fastrand 2.5.0", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + +[[package]] +name = "futures-macro" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fb9654ba8355388abeb8dcb4fc62f511300867002afc858860463bdd9fe0c44" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "futures-sink" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1944426bf7d03f1d14f708785e4b33efd750b36d48a157b836b3efc15ede8e1d" + +[[package]] +name = "futures-task" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cd417de3d1d015fc3bfd2b1ea46dfc7bab72ef86f1cc7cc9c78e728b34a6d1fd" + +[[package]] +name = "futures-util" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d50a92467f8ba5dd6e3ee5d4bd04d73ab2e4e1c44474a0674821dfce14b79bc" +dependencies = [ + "futures-channel", + "futures-core", + "futures-io", + "futures-macro", + "futures-sink", + "futures-task", + "memchr", + "pin-project-lite", + "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 = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1bd49230192a3797a9a4d6abe9b3eed6f7fa4c8a8a4947977c6f80025f92cbd8" +dependencies = [ + "rustix 1.1.5", + "windows-link 0.2.1", +] + +[[package]] +name = "getrandom" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff2abc00be7fca6ebc474524697ae276ad847ad0a6b3faa4bcb027e9a4614ad0" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "wasi", + "wasm-bindgen", +] + +[[package]] +name = "getrandom" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "899def5c37c4fd7b2664648c28120ecec138e4d395b459e5ca34f9cce2dd77fd" +dependencies = [ + "cfg-if", + "libc", + "r-efi 5.3.0", + "wasip2", +] + +[[package]] +name = "getrandom" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "300e883d756b2e4ec94e02791f39b04b522276138852cfc41d9fb7e904106099" +dependencies = [ + "cfg-if", + "js-sys", + "libc", + "r-efi 6.0.0", + "rand_core 0.10.1", + "wasm-bindgen", +] + +[[package]] +name = "gif" +version = "0.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ee8cfcc411d9adbbaba82fb72661cc1bcca13e8bba98b364e62b2dba8f960159" +dependencies = [ + "color_quant", + "weezl", +] + +[[package]] +name = "glob" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4eba85ea1d0a966a983acd07deee566e67395d2d96b6fb39e62b5a833f1eb0b" + +[[package]] +name = "globset" +version = "0.4.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07c34a9410465b45bd9787443bc7370f37735bad04b0f0cd57ff1a3186c98988" +dependencies = [ + "aho-corasick", + "bstr", + "log", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "gloo-timers" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbb143cf96099802033e0d4f4963b19fd2e0b728bcf076cd9cf7f6634f092994" +dependencies = [ + "futures-channel", + "futures-core", + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "glow" +version = "0.16.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c5e5ea60d70410161c8bf5da3fdfeaa1c72ed2c15f8bbb9d19fe3a4fad085f08" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "gpu-alloc" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45cf04b2726f02df5508c6de726acdc90cdf97ac771a9a0ffd8ba10a6e696bf9" +dependencies = [ + "bitflags 2.13.2", + "gpu-alloc-types", +] + +[[package]] +name = "gpu-alloc-ash" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "643756f08ef6def813c776199e4766596395a4c6530373c9a4374a64de2f53a1" +dependencies = [ + "ash", + "gpu-alloc-types", + "tinyvec", +] + +[[package]] +name = "gpu-alloc-types" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2bbed164dd10ed526c2e4fe3e721ca4a71c61730e5aafac6844b417b3227058" +dependencies = [ + "bitflags 2.13.2", +] + +[[package]] +name = "gpui" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "979b45cfa6ec723b6f42330915a1b3769b930d02b2d505f9697f8ca602bee707" +dependencies = [ + "anyhow", + "as-raw-xcb-connection", + "ashpd 0.11.1", + "async-task", + "bindgen", + "blade-graphics", + "blade-macros", + "blade-util", + "block", + "bytemuck", + "calloop", + "calloop-wayland-source", + "cbindgen", + "cocoa 0.26.0", + "cocoa-foundation 0.2.0", + "core-foundation 0.10.0", + "core-foundation-sys", + "core-graphics 0.24.0", + "core-text", + "core-video", + "cosmic-text", + "ctor", + "derive_more", + "embed-resource", + "etagere", + "filedescriptor", + "flume", + "foreign-types", + "futures", + "gpui-macros", + "gpui_collections", + "gpui_http_client", + "gpui_media", + "gpui_refineable", + "gpui_semantic_version", + "gpui_sum_tree", + "gpui_util", + "gpui_util_macros", + "image", + "inventory", + "itertools 0.14.0", + "libc", + "log", + "lyon", + "metal", + "naga", + "num_cpus", + "objc", + "oo7", + "open", + "parking", + "parking_lot", + "pathfinder_geometry", + "pin-project", + "postage", + "profiling", + "rand 0.9.5", + "raw-window-handle", + "resvg", + "schemars", + "seahash", + "serde", + "serde_json", + "slotmap", + "smallvec", + "smol", + "stacksafe", + "strum 0.27.2", + "taffy", + "thiserror 2.0.21", + "usvg", + "uuid", + "waker-fn", + "wayland-backend", + "wayland-client", + "wayland-cursor", + "wayland-protocols 0.31.2", + "wayland-protocols-plasma", + "windows 0.61.3", + "windows-core 0.61.2", + "windows-numerics", + "windows-registry 0.5.3", + "x11-clipboard", + "x11rb", + "xkbcommon", + "zed-font-kit", + "zed-scap", + "zed-xim", +] + +[[package]] +name = "gpui-macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bcb02dd63a2859714ac7b6b476937617c3c744157af1b49f7c904023a79039be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "gpui_collections" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae39dc6d3d201be97e4bc08d96dbef2bc5b5c3d5734e05786e8cc3043342351c" +dependencies = [ + "indexmap", + "rustc-hash 2.1.3", +] + +[[package]] +name = "gpui_derive_refineable" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "644de174341a87b3478bd65b66bca38af868bcf2b2e865700523734f83cfc664" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "gpui_http_client" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23822b0a6d2c5e6a42507980a0ab3848610ea908942c8ef98187f646f690335e" +dependencies = [ + "anyhow", + "async-compression", + "async-fs", + "bytes", + "derive_more", + "futures", + "gpui_util", + "http", + "http-body", + "log", + "parking_lot", + "serde", + "serde_json", + "sha2 0.10.9", + "tempfile", + "url", + "zed-async-tar", + "zed-reqwest", +] + +[[package]] +name = "gpui_media" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05cb8912ae17371725132d2b7eec6797a255accc95d58ee5c1134b529810f14b" +dependencies = [ + "anyhow", + "bindgen", + "core-foundation 0.10.0", + "core-video", + "ctor", + "foreign-types", + "metal", + "objc", +] + +[[package]] +name = "gpui_perf" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f40a0961dcf598955130e867f4b731150a20546427b41b1a63767c1037a86d77" +dependencies = [ + "gpui_collections", + "serde", + "serde_json", +] + +[[package]] +name = "gpui_refineable" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "258cb099254e9468181aee5614410fba61db4ae115fc1d51b4a0b985f60d6641" +dependencies = [ + "gpui_derive_refineable", +] + +[[package]] +name = "gpui_semantic_version" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "201e45eff7b695528fb3af6560a534943fbc2db5323d755b9d198bd743948e35" +dependencies = [ + "anyhow", + "serde", +] + +[[package]] +name = "gpui_sum_tree" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e4f3bedd573fafafa13d1200b356c588cf094fb2786e3684bb3f5ea59b549fa9" +dependencies = [ + "arrayvec", + "log", + "rayon", +] + +[[package]] +name = "gpui_util" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68faea25903ae524de9af83990b9aa51bcbc8dd085929ac0aea7fd41905e05c3" +dependencies = [ + "anyhow", + "async-fs", + "async_zip", + "command-fds", + "dirs 4.0.0", + "dunce", + "futures", + "futures-lite 1.13.0", + "globset", + "gpui_collections", + "itertools 0.14.0", + "libc", + "log", + "nix 0.29.0", + "regex", + "rust-embed", + "schemars", + "serde", + "serde_json", + "serde_json_lenient", + "shlex 1.3.0", + "smol", + "take-until", + "tempfile", + "tendril", + "unicase", + "walkdir", + "which", +] + +[[package]] +name = "gpui_util_macros" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c28f65ef47fb97e21e82fd4dd75ccc2506eda010c846dc8054015ea234f1a22" +dependencies = [ + "gpui_perf", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "grid" +version = "0.18.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12101ecc8225ea6d675bc70263074eab6169079621c2186fe0c66590b2df9681" + +[[package]] +name = "h2" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef8e5e5a340588f4452631496976cf8636d4a7ecf600239fdc27615d2530bc16" +dependencies = [ + "atomic-waker", + "bytes", + "fnv", + "futures-core", + "futures-sink", + "http", + "indexmap", + "slab", + "tokio", + "tokio-util", + "tracing", +] + +[[package]] +name = "half" +version = "2.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" +dependencies = [ + "cfg-if", + "crunchy", + "num-traits", + "zerocopy", +] + +[[package]] +name = "hashbrown" +version = "0.14.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" + +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "foldhash", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" + +[[package]] +name = "heck" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8" + +[[package]] +name = "heck" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" + +[[package]] +name = "hermit-abi" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" + +[[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 = "hidden-trait" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68ed9e850438ac849bec07e7d09fbe9309cbd396a5988c30b010580ce08860df" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "hkdf" +version = "0.12.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b5f8eb2ad728638ea2c7d47a21db23b7b58a72ed6a38256b8a1849f15fbbdf7" +dependencies = [ + "hmac", +] + +[[package]] +name = "hmac" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e" +dependencies = [ + "digest 0.10.7", +] + +[[package]] +name = "home" +version = "0.5.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc627f471c528ff0c4a49e1d5e60450c8f6461dd6d10ba9dcd3a61d3dff7728d" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "http" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "918d3568bebf352712bc2ef3d46a8bcf1a75b373be6539de198e9105cbbf9ce0" +dependencies = [ + "bytes", + "itoa", +] + +[[package]] +name = "http-body" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca2a8f2913ee65f60facd6a5905613afaa448497a0230cc41ce022d93290bc2c" +dependencies = [ + "bytes", + "http", +] + +[[package]] +name = "http-body-util" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23169fe34a5fbcdd3f3862e78fb9b6fccd5f02a6dc6f732547005d45631ce71c" +dependencies = [ + "bytes", + "futures-core", + "http", + "http-body", + "pin-project-lite", +] + +[[package]] +name = "httparse" +version = "1.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" + +[[package]] +name = "hybrid-array" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27f864f10dfb56725ce5ce5472bc52252c8f93a4ab86327122cebf62c5f59a17" +dependencies = [ + "typenum", +] + +[[package]] +name = "hyper" +version = "1.11.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b501faa50e7a26c3d3560ca625132f4078a17771f4810baf70475ae48cbe43" +dependencies = [ + "atomic-waker", + "bytes", + "futures-channel", + "futures-core", + "h2", + "http", + "http-body", + "httparse", + "itoa", + "pin-project-lite", + "smallvec", + "tokio", + "want", +] + +[[package]] +name = "hyper-rustls" +version = "0.27.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dfa8e654703247911e29c23fbeaa261834bd9bb74efba2f9acddc37bfb127f53" +dependencies = [ + "http", + "hyper", + "hyper-util", + "rustls", + "rustls-native-certs", + "tokio", + "tokio-rustls", + "tower-service", +] + +[[package]] +name = "hyper-util" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ddc03d96684f9226b8a787cdb71488417b53ab5ea8fdb1dac946cb9431cc8bff" +dependencies = [ + "bytes", + "futures-channel", + "futures-util", + "http", + "http-body", + "httparse", + "hyper", + "libc", + "pin-project-lite", + "socket2", + "tokio", + "tower-service", + "tracing", +] + +[[package]] +name = "icu_collections" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa68d21081c4a05d5a901a1c62add574c77048b6a1c67be3b50ce0b60d4ca513" +dependencies = [ + "displaydoc", + "potential_utf", + "utf8_iter", + "yoke", + "zerofrom", + "zerovec", +] + +[[package]] +name = "icu_locale_core" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56e28588da92eee5c3201a6eff33fabdd49b62269c8938d4ff050ce4d900deb" +dependencies = [ + "displaydoc", + "litemap", + "tinystr", + "writeable", + "zerovec", +] + +[[package]] +name = "icu_normalizer" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12f9cf5f235641ed274641dd81c3f28d870e276763d0797aeeab72317b1c646f" +dependencies = [ + "icu_collections", + "icu_normalizer_data", + "icu_properties", + "icu_provider", + "smallvec", + "zerovec", +] + +[[package]] +name = "icu_normalizer_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1563da1ed3e0b3bf3d74c9b85917ac9c56464d2f57242270c09c9e752f8021a0" + +[[package]] +name = "icu_properties" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e7ca276ad3145661a65914e6daf131ca5120cd3dcee8f8f3214b8875184a148" +dependencies = [ + "displaydoc", + "icu_collections", + "icu_locale_core", + "icu_properties_data", + "icu_provider", + "zerotrie", + "zerovec", +] + +[[package]] +name = "icu_properties_data" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e590f038c1464a96894fd6d10127e90a8be4509f56ff7ecef851b15cee0b7caa" + +[[package]] +name = "icu_provider" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d27bbb9d3abbefac45d55f647c9de1d44aafcd1186eb91879afef17c396c3e73" +dependencies = [ + "displaydoc", + "icu_locale_core", + "writeable", + "yoke", + "zerofrom", + "zerotrie", + "zerovec", +] + +[[package]] +name = "idna" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" +dependencies = [ + "idna_adapter", + "smallvec", + "utf8_iter", +] + +[[package]] +name = "idna_adapter" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb68373c0d6620ef8105e855e7745e18b0d00d3bdb07fb532e434244cdb9a714" +dependencies = [ + "icu_normalizer", + "icu_properties", +] + +[[package]] +name = "image" +version = "0.25.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85ab80394333c02fe689eaf900ab500fbd0c2213da414687ebf995a65d5a6104" +dependencies = [ + "bytemuck", + "byteorder-lite", + "color_quant", + "exr", + "gif", + "image-webp", + "moxcms", + "num-traits", + "png 0.18.1", + "qoi", + "ravif", + "rayon", + "rgb", + "tiff", + "zune-core", + "zune-jpeg", +] + +[[package]] +name = "image-webp" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "525e9ff3e1a4be2fbea1fdf0e98686a6d98b4d8f937e1bf7402245af1909e8c3" +dependencies = [ + "byteorder-lite", + "quick-error", +] + +[[package]] +name = "imagesize" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" + +[[package]] +name = "imgref" +version = "1.12.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e44b0a4eaa4c82f441d50a963f2d5f05a787240aeee097597033e72accfd22f" + +[[package]] +name = "indexmap" +version = "2.14.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cc4e190f5d26ca7051642629da2c52fc03bde85a03197c99408dcd291734c855" +dependencies = [ + "equivalent", + "hashbrown 0.17.1", + "serde", + "serde_core", +] + +[[package]] +name = "inout" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "879f10e63c20629ecabbb64a8010319738c66a5cd0c29b02d63d272b03751d01" +dependencies = [ + "block-padding", + "generic-array", +] + +[[package]] +name = "instant" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "interpolate_name" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c34819042dc3d3971c46c2190835914dfbe0c3c13f61449b2997f4e9722dfa60" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "inventory" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f0c30c76f2f4ccee3fe55a2435f691ca00c0e4bd87abe4f4a851b1d4dac39b" +dependencies = [ + "rustversion", +] + +[[package]] +name = "io-surface" +version = "0.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "554b8c5d64ec09a3a520fe58e4d48a73e00ff32899cdcbe32a4877afd4968b8e" +dependencies = [ + "cgl", + "core-foundation 0.10.0", + "core-foundation-sys", + "leaky-cow", +] + +[[package]] +name = "ipnet" +version = "2.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "791930b43c0d5973160d90a8f3894509f2b273430f5c5c73b668636d0287c5c0" + +[[package]] +name = "is-docker" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "928bae27f42bc99b60d9ac7334e3a21d10ad8f1835a4e12ec3ec0464765ed1b3" +dependencies = [ + "once_cell", +] + +[[package]] +name = "is-wsl" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "173609498df190136aa7dea1a91db051746d339e18476eed5ca40521f02d7aa5" +dependencies = [ + "is-docker", + "once_cell", +] + +[[package]] +name = "is_terminal_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6cb138bb79a146c1bd460005623e142ef0181e3d0219cb493e02f7d08a35695" + +[[package]] +name = "itertools" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "413ee7dfc52ee1a4949ceeb7dbc8a33f2d6c088194d9f922fb8318faf1f01186" +dependencies = [ + "either", +] + +[[package]] +name = "itertools" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b192c782037fadd9cfa75548310488aabdbf3d2da73885b31bd0abd03351285" +dependencies = [ + "either", +] + +[[package]] +name = "itoa" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f42a60cbdf9a97f5d2305f08a87dc4e09308d1276d28c869c684d7777685682" + +[[package]] +name = "jiff" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ab1baf72f08796de0260609515130699b890ac25f30e610ad894bc5856cafdb" +dependencies = [ + "defmt", + "jiff-core", + "jiff-static", + "log", + "portable-atomic", + "portable-atomic-util", + "serde_core", +] + +[[package]] +name = "jiff-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e52fe76043ccecc9005d2305ebaadf7d7fc0cc89ca6baa10a94d6bc68c7128c" +dependencies = [ + "defmt", + "log", +] + +[[package]] +name = "jiff-static" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "378268a1116ad67ae6228701118ac9f491d78fda38a40a1f1a9e1348de6f7212" +dependencies = [ + "jiff-core", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "jobserver" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c00acbd29eabad4a2392fa0e921c874934dbbf4194312ad20f04a0ed67a3cb3" +dependencies = [ + "getrandom 0.4.3", + "libc", +] + +[[package]] +name = "js-sys" +version = "0.3.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce57d20d1ea864ce2ac172ab472d409214f4fd359f0b2a2775abdf522e2af99e" +dependencies = [ + "cfg-if", + "futures-util", + "wasm-bindgen", +] + +[[package]] +name = "khronos-egl" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6aae1df220ece3c0ada96b8153459b67eebe9ae9212258bb0134ae60416fdf76" +dependencies = [ + "libc", + "libloading", +] + +[[package]] +name = "kurbo" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c62026ae44756f8a599ba21140f350303d4f08dcdcc71b5ad9c9bb8128c13c62" +dependencies = [ + "arrayvec", + "euclid", + "smallvec", +] + +[[package]] +name = "kv-log-macro" +version = "1.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f" +dependencies = [ + "log", +] + +[[package]] +name = "lazy_static" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" +dependencies = [ + "spin", +] + +[[package]] +name = "leak" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd100e01f1154f2908dfa7d02219aeab25d0b9c7fa955164192e3245255a0c73" + +[[package]] +name = "leaky-cow" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a8225d44241fd324a8af2806ba635fc7c8a7e9a7de4d5cf3ef54e71f5926fc" +dependencies = [ + "leak", +] + +[[package]] +name = "lebe" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a79a3332a6609480d7d0c9eab957bca6b455b91bb84e66d19f5ff66294b85b8" + +[[package]] +name = "libc" +version = "0.2.189" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3eaf3ede3fee6db1a4c2ee091bf8a8b4dccdc6d17f656fb07896ee72867612f2" + +[[package]] +name = "libfuzzer-sys" +version = "0.4.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9fd2f41a1cba099f79a0b6b6c35656cf7c03351a7bae8ff0f28f25270f929d2" +dependencies = [ + "arbitrary", + "cc", +] + +[[package]] +name = "libloading" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7c4b02199fee7c5d21a5ae7d8cfa79a6ef5bb2fc834d6e9058e89c825efdc55" +dependencies = [ + "cfg-if", + "windows-link 0.2.1", +] + +[[package]] +name = "libm" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6d2cec3eae94f9f509c767b45932f1ada8350c4bdb85af2fcab4a3c14807981" + +[[package]] +name = "libredox" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d" +dependencies = [ + "libc", +] + +[[package]] +name = "linux-raw-sys" +version = "0.4.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d26c52dbd32dccf2d10cac7725f8eae5296885fb5703b261f7d0a0739ec807ab" + +[[package]] +name = "linux-raw-sys" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a66949e030da00e8c7d4434b251670a91556f4144941d37452769c25d58a53" + +[[package]] +name = "litemap" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47d9d19d1d6efa0109d2f65ff4c85cddd50bd572e5a00127ab10987290bcefae" + +[[package]] +name = "lock_api" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "224399e74b87b5f3557511d98dff8b14089b3dadafcab6bb93eab67d3aace965" +dependencies = [ + "scopeguard", +] + +[[package]] +name = "log" +version = "0.4.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" +dependencies = [ + "serde_core", + "value-bag", +] + +[[package]] +name = "loop9" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fae87c125b03c1d2c0150c90365d7d6bcc53fb73a9acaef207d2d065860f062" +dependencies = [ + "imgref", +] + +[[package]] +name = "lru-slab" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4050469837a6ff301cd14c1f8f24f88549e6d548f24f64e2148eb0f72cebc51f" + +[[package]] +name = "lyon" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd0578bdecb7d6d88987b8b2b1e3a4e2f81df9d0ece1078623324a567904e7b7" +dependencies = [ + "lyon_algorithms", + "lyon_tessellation", +] + +[[package]] +name = "lyon_algorithms" +version = "1.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdfa8785f95e57914ddb35e3b59994aeba6f5e79e9cfd03da1c269f010f36009" +dependencies = [ + "lyon_path", + "num-traits", +] + +[[package]] +name = "lyon_geom" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4336502e29e32af93cf2dad2214ed6003c17ceb5bd499df77b1de663b9042b92" +dependencies = [ + "arrayvec", + "euclid", + "num-traits", +] + +[[package]] +name = "lyon_path" +version = "1.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c463f9c428b7fc5ec885dcd39ce4aa61e29111d0e33483f6f98c74e89d8621e" +dependencies = [ + "lyon_geom", + "num-traits", +] + +[[package]] +name = "lyon_tessellation" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b8dcf906637ecef61b3c0740c7a4e7f27caeb31257cfac0cc579ce15be6005" +dependencies = [ + "float_next_after", + "lyon_path", + "num-traits", +] + +[[package]] +name = "mac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" + +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + +[[package]] +name = "maybe-rayon" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ea1f30cedd69f0a2954655f7188c6a834246d2bcf1e315e2ac40c4b24dc9519" +dependencies = [ + "cfg-if", + "rayon", +] + +[[package]] +name = "md-5" +version = "0.10.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d89e7ee0cfbedfc4da3340218492196241d89eefb6dab27de5df917a6d2e78cf" +dependencies = [ + "cfg-if", + "digest 0.10.7", +] + +[[package]] +name = "memchr" +version = "2.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf8baf1c55e62ffcace7a9f06f4bd9cd3f0c4beb022d3b367256b91b87513d98" + +[[package]] +name = "memmap2" +version = "0.9.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1219ed1b7f229ee7104d281dd01d6802fe28bb6e95d292942c4daacdeb798c0" +dependencies = [ + "libc", +] + +[[package]] +name = "memoffset" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "488016bfae457b036d996092f6cb448677611ce4449e970ceaf42695203f218a" +dependencies = [ + "autocfg", +] + +[[package]] +name = "metal" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ecfd3296f8c56b7c1f6fbac3c71cefa9d78ce009850c45000015f206dc7fa21" +dependencies = [ + "bitflags 2.13.2", + "block", + "core-graphics-types 0.1.3", + "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_guess" +version = "2.0.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7c44f8e672c00fe5308fa235f821cb4198414e1c77935c1ab6948d3fd78550e" +dependencies = [ + "mime", + "unicase", +] + +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + +[[package]] +name = "miniz_oxide" +version = "0.8.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fa76a2c86f704bdb222d66965fb3d63269ce38518b83cb0575fca855ebb6316" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "miniz_oxide" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63fbc4a50860e98e7b2aa7804ded1db5cbc3aff9193adaff57a6931bf7c4b4c" +dependencies = [ + "adler2", + "simd-adler32", +] + +[[package]] +name = "mint" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e53debba6bda7a793e5f99b8dacf19e626084f525f7829104ba9898f367d85ff" + +[[package]] +name = "mio" +version = "1.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b18443e9c262bfe8fa82f51666e2642c53393f7e5c27b3e1aeab922cff5b9d8" +dependencies = [ + "libc", + "wasi", + "windows-sys 0.61.2", +] + +[[package]] +name = "moxcms" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb85c154ba489f01b25c0d36ae69a87e4a1c73a72631fc6c0eb6dde34a73e44b" +dependencies = [ + "num-traits", + "pxfm", +] + +[[package]] +name = "multiversion_no_op" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "743fb55ba31b18fb1ecef6bdc9aa2743314978ac084044301a7eee33fb99a20d" + +[[package]] +name = "naga" +version = "25.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b977c445f26e49757f9aca3631c3b8b836942cb278d69a92e7b80d3b24da632" +dependencies = [ + "arrayvec", + "bit-set", + "bitflags 2.13.2", + "cfg_aliases", + "codespan-reporting", + "half", + "hashbrown 0.15.5", + "hexf-parse", + "indexmap", + "log", + "num-traits", + "once_cell", + "rustc-hash 1.1.0", + "spirv", + "strum 0.26.3", + "thiserror 2.0.21", + "unicode-ident", +] + +[[package]] +name = "nanorand" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a51313c5820b0b02bd422f4b44776fbf47961755c74ce64afc73bfad10226c3" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "new_debug_unreachable" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.13.2", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "nix" +version = "0.31.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf20d2fde8ff38632c426f1165ed7436270b44f199fc55284c38276f9db47c3d" +dependencies = [ + "bitflags 2.13.2", + "cfg-if", + "cfg_aliases", + "libc", +] + +[[package]] +name = "no_std_io2" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "418abd1b6d34fbf6cae440dc874771b0525a604428704c76e48b29a5e67b8003" +dependencies = [ + "memchr", +] + +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + +[[package]] +name = "nom" +version = "8.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df9761775871bdef83bee530e60050f7e54b1105350d6884eb0fb4f46c2f9405" +dependencies = [ + "memchr", +] + +[[package]] +name = "noop_proc_macro" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0676bb32a98c1a483ce53e500a81ad9c3d5b3f7c920c28c24e9cb0980d0b5bc8" + +[[package]] +name = "ntapi" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3b335231dfd352ffb0f8017f3b6027a4917f7df785ea2143d8af2adc66980ae" +dependencies = [ + "winapi", +] + +[[package]] +name = "num" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35bd024e8b2ff75562e5f34e7f4905839deb4b22955ef5e73d2fea1b9813cb23" +dependencies = [ + "num-bigint", + "num-complex", + "num-integer", + "num-iter", + "num-rational", + "num-traits", +] + +[[package]] +name = "num-bigint" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c89e69e7e0f03bea5ef08013795c25018e101932225a656383bd384495ecc367" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-bigint-dig" +version = "0.8.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e661dda6640fad38e827a6d4a310ff4763082116fe217f279885c97f511bb0b7" +dependencies = [ + "lazy_static", + "libm", + "num-integer", + "num-iter", + "num-traits", + "rand 0.8.8", + "serde", + "smallvec", + "zeroize", +] + +[[package]] +name = "num-complex" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73f88a1307638156682bada9d7604135552957b7818057dcef22705b4d509495" +dependencies = [ + "bytemuck", + "num-traits", +] + +[[package]] +name = "num-derive" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed3955f1a9c7c0c15e092f9c887db08b1fc683305fdf6eb6684f22555355e202" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "num-integer" +version = "0.1.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7ce2d95d4b3734dc35aa2f45e1aa22cd416814592a4f9d9205e11affd5b8e10b" +dependencies = [ + "num-traits", +] + +[[package]] +name = "num-iter" +version = "0.1.46" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92800bd69a1eac91786bcfe9da64a897eb72911b8dc3095decbd07429e8048b" +dependencies = [ + "num-integer", + "num-traits", +] + +[[package]] +name = "num-rational" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f83d14da390562dca69fc84082e73e548e1ad308d24accdedd2720017cb37824" +dependencies = [ + "num-bigint", + "num-integer", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "071dfc062690e90b734c0b2273ce72ad0ffa95f0c74596bc250dcfd960262841" +dependencies = [ + "autocfg", + "libm", +] + +[[package]] +name = "num_cpus" +version = "1.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91df4bbde75afed763b708b7eee1e8e7651e02d97f6d5dd763e89367e957b23b" +dependencies = [ + "hermit-abi", + "libc", +] + +[[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 = "objc2" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a12a8ed07aefc768292f076dc3ac8c48f3781c8f2d5851dd3d98950e8c5a89f" +dependencies = [ + "objc2-encode", +] + +[[package]] +name = "objc2-app-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d49e936b501e5c5bf01fda3a9452ff86dc3ea98ad5f283e1455153142d97518c" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc2-core-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" +dependencies = [ + "bitflags 2.13.2", + "dispatch2", + "objc2", +] + +[[package]] +name = "objc2-encode" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef25abbcd74fb2609453eb695bd2f860d389e457f67dc17cafc8b8cbc89d0c33" + +[[package]] +name = "objc2-foundation" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-core-foundation", +] + +[[package]] +name = "objc2-metal" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0125f776a10d00af4152d74616409f0d4a2053a6f57fa5b7d6aa2854ac04794" +dependencies = [ + "bitflags 2.13.2", + "block2", + "objc2", + "objc2-foundation", +] + +[[package]] +name = "objc2-quartz-core" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", + "objc2-metal", +] + +[[package]] +name = "objc2-ui-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d87d638e33c06f577498cbcc50491496a3ed4246998a7fbba7ccb98b1e7eab22" +dependencies = [ + "bitflags 2.13.2", + "objc2", + "objc2-core-foundation", + "objc2-foundation", + "objc2-quartz-core", +] + +[[package]] +name = "objc_exception" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad970fb455818ad6cba4c122ad012fae53ae8b4795f86378bce65e4f6bab2ca4" +dependencies = [ + "cc", +] + +[[package]] +name = "objc_id" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c92d4ddb4bd7b50d730c215ff871754d0da6b2178849f8a2a2ab69712d0c073b" +dependencies = [ + "objc", +] + +[[package]] +name = "object" +version = "0.39.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2e5a6c098c7a3b6547378093f5cc30bc54fd361ce711e05293a5cc589562739b" +dependencies = [ + "memchr", +] + +[[package]] +name = "once_cell" +version = "1.21.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f7c3e4beb33f85d45ae3e3a1792185706c8e16d043238c593331cc7cd313b50" + +[[package]] +name = "once_cell_polyfill" +version = "1.70.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "384b8ab6d37215f3c5301a95a4accb5d64aa607f1fcb26a11b5303878451b4fe" + +[[package]] +name = "oo7" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3299dd401feaf1d45afd8fd1c0586f10fcfb22f244bb9afa942cec73503b89d" +dependencies = [ + "aes", + "ashpd 0.12.3", + "async-fs", + "async-io", + "async-lock", + "blocking", + "cbc", + "cipher", + "digest 0.10.7", + "endi", + "futures-lite 2.6.1", + "futures-util", + "getrandom 0.3.4", + "hkdf", + "hmac", + "md-5", + "num", + "num-bigint-dig", + "pbkdf2", + "rand 0.9.5", + "serde", + "sha2 0.10.9", + "subtle", + "zbus", + "zbus_macros", + "zeroize", + "zvariant", +] + +[[package]] +name = "open" +version = "5.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aa576c76302b7b808eecc68061e67336c47833ef9d22caa74dda10fa9675eebc" +dependencies = [ + "is-wsl", + "libc", +] + +[[package]] +name = "openssl-probe" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c87def4c32ab89d880effc9e097653c8da5d6ef28e6b539d313baaacfbafcbe" + +[[package]] +name = "option-ext" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" + +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "parking" +version = "2.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f38d5652c16fde515bb1ecef450ab0f6a219d619a7274976324d5e377f7dceba" + +[[package]] +name = "parking_lot" +version = "0.12.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93857453250e3077bd71ff98b6a65ea6621a19bb0f559a85248955ac12c45a1a" +dependencies = [ + "lock_api", + "parking_lot_core", +] + +[[package]] +name = "parking_lot_core" +version = "0.9.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" +dependencies = [ + "cfg-if", + "libc", + "redox_syscall 0.5.18", + "smallvec", + "windows-link 0.2.1", +] + +[[package]] +name = "paste" +version = "1.0.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" + +[[package]] +name = "pastey" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35fb2e5f958ec131621fdd531e9fc186ed768cbe395337403ae56c17a74c68ec" + +[[package]] +name = "pathfinder_geometry" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b7e7b4ea703700ce73ebf128e1450eb69c3a8329199ffbfb9b2a0418e5ad3" +dependencies = [ + "log", + "pathfinder_simd", +] + +[[package]] +name = "pathfinder_simd" +version = "0.5.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4500030c302e4af1d423f36f3b958d1aecb6c04184356ed5a833bf6b60435777" +dependencies = [ + "rustc_version", +] + +[[package]] +name = "pbkdf2" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8ed6a7761f76e3b9f92dfb0a60a6a6477c61024b775147ff0973a02653abaf2" +dependencies = [ + "digest 0.10.7", + "hmac", +] + +[[package]] +name = "percent-encoding" +version = "2.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" + +[[package]] +name = "pico-args" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315" + +[[package]] +name = "pin-project" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2466b2336ed02bcdca6b294417127b90ec92038d1d5c4fbeac971a922e0e0924" +dependencies = [ + "pin-project-internal", +] + +[[package]] +name = "pin-project-internal" +version = "1.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c96395f0a926bc13b1c17622aaddda1ecb55d49c8f1bf9777e4d877800a43f8b" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "pin-project-lite" +version = "0.2.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a89322df9ebe1c1578d689c92318e070967d1042b512afbe49518723f4e6d5cd" + +[[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.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" +dependencies = [ + "atomic-waker", + "fastrand 2.5.0", + "futures-io", +] + +[[package]] +name = "pkg-config" +version = "0.3.34" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6b464fbc74e149a392436b17d523f769e057cb6877f6a5c4618bc6f11800548" + +[[package]] +name = "png" +version = "0.17.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "82151a2fc869e011c153adc57cf2789ccb8d9906ce52c0b39a6b5697749d7526" +dependencies = [ + "bitflags 1.3.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.9", +] + +[[package]] +name = "png" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" +dependencies = [ + "bitflags 2.13.2", + "crc32fast", + "fdeflate", + "flate2", + "miniz_oxide 0.8.9", +] + +[[package]] +name = "polling" +version = "3.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix 1.1.5", + "windows-sys 0.61.2", +] + +[[package]] +name = "pollster" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5da3b0203fd7ee5720aa0b5e790b591aa5d3f41c3ed2c34a3a393382198af2f7" + +[[package]] +name = "portable-atomic" +version = "1.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05c8b63e8d9609db387f0324918f81d68fe27748f084ef092fb35954d0539a85" + +[[package]] +name = "portable-atomic-util" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10ab3eb7f3becc3a1cbc4f2c6f20267996cfc1a6467a873763411b136a122715" +dependencies = [ + "portable-atomic", +] + +[[package]] +name = "postage" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af3fb618632874fb76937c2361a7f22afd393c982a2165595407edc75b06d3c1" +dependencies = [ + "atomic", + "crossbeam-queue", + "futures", + "log", + "parking_lot", + "pin-project", + "pollster", + "static_assertions", + "thiserror 1.0.69", +] + +[[package]] +name = "potential_utf" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d83eb9bc6d8e5cf568e7a1101d60ee05e81ed50ea106026f3d18deeb046d7661" +dependencies = [ + "zerovec", +] + +[[package]] +name = "ppv-lite86" +version = "0.2.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] + +[[package]] +name = "prettyplease" +version = "0.2.37" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" +dependencies = [ + "proc-macro2", + "syn 2.0.119", +] + +[[package]] +name = "proc-macro-crate" +version = "3.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e67ba7e9b2b56446f1d419b1d807906278ffa1a658a8a5d8a39dcb1f5a78614f" +dependencies = [ + "toml_edit 0.25.15+spec-1.1.0", +] + +[[package]] +name = "proc-macro-error-attr2" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96de42df36bb9bba5542fe9f1a054b8cc87e172759a1868aa05c1f3acc89dfc5" +dependencies = [ + "proc-macro2", + "quote", +] + +[[package]] +name = "proc-macro-error2" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11ec05c52be0a07b08061f7dd003e7d7092e0472bc731b4af7bb1ef876109802" +dependencies = [ + "proc-macro-error-attr2", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "proc-macro2" +version = "1.0.107" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "985e7ec9bb745e6ce6535b544d84d6cd6f7ad8bd711c398938ae983b91a766d9" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "profiling" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3d595e54a326bc53c1c197b32d295e14b169e3cfeaa8dc82b529f947fba6bcf5" +dependencies = [ + "profiling-procmacros", +] + +[[package]] +name = "profiling-procmacros" +version = "1.0.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4488a4a36b9a4ba6b9334a32a39971f77c1436ec82c38707bce707699cc3bbcb" +dependencies = [ + "quote", + "syn 2.0.119", +] + +[[package]] +name = "psm" +version = "0.1.32" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dcd034599e63b970727f70d79e02d62390a4a84f7c6b827c27c46d5ac3fa622" +dependencies = [ + "ar_archive_writer", + "cc", +] + +[[package]] +name = "pulp" +version = "0.22.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046aa45b989642ec2e4717c8e72d677b13edd831a4d3b6cf37d9a3e54912496a" +dependencies = [ + "bytemuck", + "cfg-if", + "libm", + "num-complex", + "paste", + "pulp-wasm-simd-flag", + "raw-cpuid", + "reborrow", + "version_check", +] + +[[package]] +name = "pulp-wasm-simd-flag" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d8f70e07b9c3962945a74e59ca1c511bba65b6419468acc217c457d93f3c740" + +[[package]] +name = "pxfm" +version = "0.1.30" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d55d956fa96f5ec02be2e13af0e20391a5aa83d6a074e3ad368959d0fab299ea" + +[[package]] +name = "qoi" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f6d64c71eb498fe9eae14ce4ec935c555749aef511cca85b5568910d6e48001" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "quick-error" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a993555f31e5a609f617c12db6250dedcac1b0a85076912c436e6fc9b2c8e6a3" + +[[package]] +name = "quick-xml" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e660451e55124f798a69a5af3f49ccfbefbd41910eefd25caf2393e1f3473ec1" +dependencies = [ + "memchr", +] + +[[package]] +name = "quinn" +version = "0.11.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4051e23e9185c255a7e33ef59cdbca87a22d359052eecd22fc6b901fb37d9d11" +dependencies = [ + "bytes", + "cfg_aliases", + "pin-project-lite", + "quinn-proto", + "quinn-udp", + "rustc-hash 2.1.3", + "rustls", + "socket2", + "thiserror 2.0.21", + "tokio", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-proto" +version = "0.11.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9746dbde176634f4f2f1faf2404e30a31b2bc1e9cafb5329c95d8177a18c9fc" +dependencies = [ + "bytes", + "getrandom 0.4.3", + "lru-slab", + "rand 0.10.3", + "rand_pcg", + "ring", + "rustc-hash 2.1.3", + "rustls", + "rustls-pki-types", + "slab", + "thiserror 2.0.21", + "tinyvec", + "tracing", + "web-time", +] + +[[package]] +name = "quinn-udp" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "35a133f956daabe89a61a685c2649f13d82d5aa4bd5d12d1277e1072a21c0694" +dependencies = [ + "cfg_aliases", + "libc", + "once_cell", + "socket2", + "tracing", + "windows-sys 0.61.2", +] + +[[package]] +name = "quote" +version = "1.0.47" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fbf4db142a473a8d80c26bbf18454ed458bf8d26c8219c331daecfdbd079001" +dependencies = [ + "proc-macro2", +] + +[[package]] +name = "r-efi" +version = "5.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "69cdb34c158ceb288df11e18b4bd39de994f6657d83847bdffdbd7f346754b0f" + +[[package]] +name = "r-efi" +version = "6.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8dcc9c7d52a811697d2151c701e0d08956f92b0e24136cf4cf27b57a6a0d9bf" + +[[package]] +name = "rand" +version = "0.8.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e058c7de0b26af77780c769414d6257830bb240f3c38477dbc2c16e5f54d6d4c" +dependencies = [ + "libc", + "rand_chacha 0.3.1", + "rand_core 0.6.4", +] + +[[package]] +name = "rand" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9ef1d0d795eb7d84685bca4f72f3649f064e6641543d3a8c415898726a57b41" +dependencies = [ + "rand_chacha 0.9.0", + "rand_core 0.9.5", +] + +[[package]] +name = "rand" +version = "0.10.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "65c9fb96cbc91e3478eaae79a69fcd3f1ae4ad052e471fe6732fff548984b4af" +dependencies = [ + "chacha20", + "getrandom 0.4.3", + "rand_core 0.10.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.4", +] + +[[package]] +name = "rand_chacha" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" +dependencies = [ + "ppv-lite86", + "rand_core 0.9.5", +] + +[[package]] +name = "rand_core" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +dependencies = [ + "getrandom 0.2.17", +] + +[[package]] +name = "rand_core" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76afc826de14238e6e8c374ddcc1fa19e374fd8dd986b0d2af0d02377261d83c" +dependencies = [ + "getrandom 0.3.4", +] + +[[package]] +name = "rand_core" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63b8176103e19a2643978565ca18b50549f6101881c443590420e4dc998a3c69" + +[[package]] +name = "rand_pcg" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "caa0f4137e1c0a72f4c651489402276c8e8e1cf081f3b0ba156d2cbeef09e86a" +dependencies = [ + "rand_core 0.10.1", +] + +[[package]] +name = "rangemap" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a611d15b50743feb4c76b7d03edcb0e64f399c26961e4efe6975bc398be6aa3d" + +[[package]] +name = "rav1e" +version = "0.8.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43b6dd56e85d9483277cde964fd1bdb0428de4fec5ebba7540995639a21cb32b" +dependencies = [ + "aligned-vec", + "arbitrary", + "arg_enum_proc_macro", + "arrayvec", + "av-scenechange", + "av1-grain", + "bitstream-io", + "built", + "cfg-if", + "interpolate_name", + "itertools 0.14.0", + "libc", + "libfuzzer-sys", + "log", + "maybe-rayon", + "new_debug_unreachable", + "noop_proc_macro", + "num-derive", + "num-traits", + "paste", + "profiling", + "rand 0.9.5", + "rand_chacha 0.9.0", + "simd_helpers", + "thiserror 2.0.21", + "v_frame", + "wasm-bindgen", +] + +[[package]] +name = "ravif" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e52310197d971b0f5be7fe6b57530dcd27beb35c1b013f29d66c1ad73fbbcc45" +dependencies = [ + "avif-serialize", + "imgref", + "loop9", + "quick-error", + "rav1e", + "rayon", + "rgb", +] + +[[package]] +name = "raw-cpuid" +version = "11.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "498cd0dc59d73224351ee52a95fee0f1a617a2eae0e7d9d720cc622c73a54186" +dependencies = [ + "bitflags 2.13.2", +] + +[[package]] +name = "raw-window-handle" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20675572f6f24e9e76ef639bc5552774ed45f1c30e2951e1e99c59888861c539" + +[[package]] +name = "raw-window-metal" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "76e8caa82e31bb98fee12fa8f051c94a6aa36b07cddb03f0d4fc558988360ff1" +dependencies = [ + "cocoa 0.25.0", + "core-graphics 0.23.2", + "objc", + "raw-window-handle", +] + +[[package]] +name = "rayon" +version = "1.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb39b166781f92d482534ef4b4b1b2568f42613b53e5b6c160e24cfbfa30926d" +dependencies = [ + "either", + "rayon-core", +] + +[[package]] +name = "rayon-core" +version = "1.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22e18b0f0062d30d4230b2e85ff77fdfe4326feb054b9783a3460d8435c8ab91" +dependencies = [ + "crossbeam-deque", + "crossbeam-utils", +] + +[[package]] +name = "read-fonts" +version = "0.41.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "046a7d674daf459825b32f5062056d6882db0d2f5a479fbd76ccfc870ac18709" +dependencies = [ + "bytemuck", + "font-types", + "once_cell", +] + +[[package]] +name = "reborrow" +version = "0.5.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "03251193000f4bd3b042892be858ee50e8b3719f2b08e5833ac4353724632430" + +[[package]] +name = "redox_syscall" +version = "0.2.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a" +dependencies = [ + "bitflags 1.3.2", +] + +[[package]] +name = "redox_syscall" +version = "0.5.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" +dependencies = [ + "bitflags 2.13.2", +] + +[[package]] +name = "redox_users" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba009ff324d1fc1b900bd1fdb31564febe58a8ccc8a6fdbb93b543d33b13ca43" +dependencies = [ + "getrandom 0.2.17", + "libredox", + "thiserror 1.0.69", +] + +[[package]] +name = "ref-cast" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7e440fb4e4b4147295338efb76001ab9e4efc0e5839df2c47fc5ac2381d365c3" +dependencies = [ + "ref-cast-impl", +] + +[[package]] +name = "ref-cast-impl" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92ecd8964f8453721699a1ed72037b0db49ce2f5a5138486ee89bed6f67cdf3a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "regex" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f020237b6c8eed93db2e2cb53c00c60a8e1bc73da7d073199a1180401450218d" +dependencies = [ + "aho-corasick", + "memchr", + "regex-automata", + "regex-syntax", +] + +[[package]] +name = "regex-automata" +version = "0.4.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ad8553b9b26413251cbf30e620595c7a41b3887f03da04579c0e6b0d6a06b4b2" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", +] + +[[package]] +name = "regex-syntax" +version = "0.8.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6f6ff9a378485b298a5286656da665ba74413d36db0979633275d2e708145d4" + +[[package]] +name = "resvg" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" +dependencies = [ + "log", + "pico-args", + "rgb", + "svgtypes", + "tiny-skia", + "usvg", +] + +[[package]] +name = "rgb" +version = "0.8.53" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "47b34b781b31e5d73e9fbc8689c70551fd1ade9a19e3e28cfec8580a79290cc4" +dependencies = [ + "bytemuck", +] + +[[package]] +name = "ring" +version = "0.17.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4689e6c2294d81e88dc6261c768b63bc4fcdb852be6d1352498b114f61383b7" +dependencies = [ + "cc", + "cfg-if", + "getrandom 0.2.17", + "libc", + "untrusted", + "windows-sys 0.52.0", +] + +[[package]] +name = "roxmltree" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" + +[[package]] +name = "rust-embed" +version = "8.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9e7760e252aaba7b09f4be00e36476cf585bdb68a53552ac954cdf504ab4bc9" +dependencies = [ + "rust-embed-impl", + "rust-embed-utils", + "walkdir", +] + +[[package]] +name = "rust-embed-impl" +version = "8.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3bcfc4d6f53af43755f7a723e4b6b8794fcce052a178dd8c6c1dadc5f5343097" +dependencies = [ + "mime_guess", + "proc-macro2", + "quote", + "rust-embed-utils", + "syn 2.0.119", + "walkdir", +] + +[[package]] +name = "rust-embed-utils" +version = "8.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42ffa149f6aa81b58a5b3011d01a857c4ed12c7a732d2c51947a4c7c692185f0" +dependencies = [ + "globset", + "sha2 0.11.0", + "walkdir", +] + +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + +[[package]] +name = "rustc-hash" +version = "2.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b1e7f9a428571be2dc5bc0505c13fb6bf936822b894ec87abf8a08a4e51742d" + +[[package]] +name = "rustc_version" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfcb3a22ef46e85b45de6ee7e79d063319ebb6594faafcf1c225ea92ab6e9b92" +dependencies = [ + "semver", +] + +[[package]] +name = "rustix" +version = "0.38.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" +dependencies = [ + "bitflags 2.13.2", + "errno", + "libc", + "linux-raw-sys 0.4.15", + "windows-sys 0.59.0", +] + +[[package]] +name = "rustix" +version = "1.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" +dependencies = [ + "bitflags 2.13.2", + "errno", + "libc", + "linux-raw-sys 0.12.1", + "windows-sys 0.61.2", +] + +[[package]] +name = "rustls" +version = "0.23.45" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d41d731c7d2f962d1ccc364cec258de3c0e93b38c2fb3ba97ac74513048d634" +dependencies = [ + "once_cell", + "ring", + "rustls-pki-types", + "rustls-webpki", + "subtle", + "zeroize", +] + +[[package]] +name = "rustls-native-certs" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dab5152771c58876a2146916e53e35057e1a4dfa2b9df0f0305b07f611fdea4d" +dependencies = [ + "openssl-probe", + "rustls-pki-types", + "schannel", + "security-framework", +] + +[[package]] +name = "rustls-pemfile" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dce314e5fee3f39953d46bb63bb8a46d40c2f8fb7cc5a3b6cab2bde9721d6e50" +dependencies = [ + "rustls-pki-types", +] + +[[package]] +name = "rustls-pki-types" +version = "1.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f4925028c7eb5d1fcdaf196971378ed9d2c1c4efc7dc5d011256f76c99c0a96" +dependencies = [ + "web-time", + "zeroize", +] + +[[package]] +name = "rustls-webpki" +version = "0.103.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f3c3cf1d8b1e7d4927e2d154c3fcb02979afb9939629c62cd9048d4f07b60ac2" +dependencies = [ + "ring", + "rustls-pki-types", + "untrusted", +] + +[[package]] +name = "rustversion" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf54715a573b99ac80df0bc206da022bcd442c974952c7b9720069370852e21f" + +[[package]] +name = "rustybuzz" +version = "0.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cfb9cf8877777222e4a3bc7eb247e398b56baba500c38c1c46842431adc8b55c" +dependencies = [ + "bitflags 2.13.2", + "bytemuck", + "libm", + "smallvec", + "ttf-parser 0.21.1", + "unicode-bidi-mirroring 0.2.0", + "unicode-ccc 0.2.0", + "unicode-properties", + "unicode-script", +] + +[[package]] +name = "rustybuzz" +version = "0.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702" +dependencies = [ + "bitflags 2.13.2", + "bytemuck", + "core_maths", + "log", + "smallvec", + "ttf-parser 0.25.1", + "unicode-bidi-mirroring 0.4.0", + "unicode-ccc 0.4.0", + "unicode-properties", + "unicode-script", +] + +[[package]] +name = "ryu" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f" + +[[package]] +name = "same-file" +version = "1.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +dependencies = [ + "winapi-util", +] + +[[package]] +name = "schannel" +version = "0.1.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91c1b7e4904c873ef0710c1f407dde2e6287de2bebc1bbbf7d430bb7cbffd939" +dependencies = [ + "windows-sys 0.61.2", +] + +[[package]] +name = "schemars" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687274d293b6cdc6e73e0fee520bf2049650090d7164f87672d212a3c530cf4a" +dependencies = [ + "dyn-clone", + "indexmap", + "ref-cast", + "schemars_derive", + "serde", + "serde_json", +] + +[[package]] +name = "schemars_derive" +version = "1.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d98c67716b46af2f0b8cf752abc930f6f9aecfbf671ecfb531db8a31dbe4e2ba" +dependencies = [ + "proc-macro2", + "quote", + "serde_derive_internals", + "syn 3.0.6", +] + +[[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 = "screencapturekit" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a5eeeb57ac94960cfe5ff4c402be6585ae4c8d29a2cf41b276048c2e849d64e" +dependencies = [ + "screencapturekit-sys", +] + +[[package]] +name = "screencapturekit-sys" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22411b57f7d49e7fe08025198813ee6fd65e1ee5eff4ebc7880c12c82bde4c60" +dependencies = [ + "block", + "dispatch", + "objc", + "objc-foundation", + "objc_id", + "once_cell", +] + +[[package]] +name = "seahash" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c107b6f4780854c8b126e228ea8869f4d7b71260f962fefb57b996b8959ba6b" + +[[package]] +name = "security-framework" +version = "3.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" +dependencies = [ + "bitflags 2.13.2", + "core-foundation 0.10.0", + "core-foundation-sys", + "libc", + "security-framework-sys", +] + +[[package]] +name = "security-framework-sys" +version = "2.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2691df843ecc5d231c0b14ece2acc3efb62c0a398c7e1d875f3983ce020e3" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "self_cell" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ab42ca02749e120097e328d91d415325bdf43b1c72c4c8badf37375fe40a813" + +[[package]] +name = "semver" +version = "1.0.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7852d02fc848982e0c167ef163aaff9cd91dc640ba85e263cb1ce46fae51cd" + +[[package]] +name = "serde" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4148590afebada386688f18773da617792bf2ef03ffc1e4cbd2b1d45b023e0ba" +dependencies = [ + "serde_core", + "serde_derive", +] + +[[package]] +name = "serde_core" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "67dca2c9c51e58a4791a4b1ed58308b39c64224d349a935ab5039aa360942a48" +dependencies = [ + "serde_derive", +] + +[[package]] +name = "serde_derive" +version = "1.0.229" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e7a5d71263a5a7d47b41f6b3f06ba276f10cc18b0931f1799f710578e2309348" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "serde_derive_internals" +version = "0.30.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f852137cce035d6a4df67ccce505ff6b3e9fd3a10e3e52b24dc71e650bb1a9bd" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "serde_fmt" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e497af288b3b95d067a23a4f749f2861121ffcb2f6d8379310dcda040c345ed" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_json" +version = "1.0.151" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c841b55ecdae098c80dcae9cf767f6f8a0c2cdb3416bbef72181df4d0fe73f14" +dependencies = [ + "indexmap", + "itoa", + "memchr", + "serde", + "serde_core", + "zmij", +] + +[[package]] +name = "serde_json_lenient" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e033097bf0d2b59a62b42c18ebbb797503839b26afdda2c4e1415cb6c813540" +dependencies = [ + "indexmap", + "itoa", + "memchr", + "ryu", + "serde", +] + +[[package]] +name = "serde_repr" +version = "0.1.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d3b1629de253c70a0508c3899572da79ca359fdab27c7920ff00406df418906" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "serde_spanned" +version = "0.6.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf41e0cfaf7226dca15e8197172c295a782857fcb97fad1808a166870dee75a3" +dependencies = [ + "serde", +] + +[[package]] +name = "serde_spanned" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6662b5879511e06e8999a8a235d848113e942c9124f211511b16466ee2995f26" +dependencies = [ + "serde_core", +] + +[[package]] +name = "serde_urlencoded" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd" +dependencies = [ + "form_urlencoded", + "itoa", + "ryu", + "serde", +] + +[[package]] +name = "sha1_smol" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bbfa15b3dddfee50a0fff136974b3e1bde555604ba463834a7eb7deb6417705d" + +[[package]] +name = "sha2" +version = "0.10.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7507d819769d01a365ab707794a4084392c824f54a7a6a7862f8c3d0892b283" +dependencies = [ + "cfg-if", + "cpufeatures 0.2.17", + "digest 0.10.7", +] + +[[package]] +name = "sha2" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "446ba717509524cb3f22f17ecc096f10f4822d76ab5c0b9822c5f9c284e825f4" +dependencies = [ + "cfg-if", + "cpufeatures 0.3.1", + "digest 0.11.3", +] + +[[package]] +name = "shlex" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" + +[[package]] +name = "shlex" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f8fadd59c855ef2080decdef8ff161eb6661b86933c9d82e5ba29dc602a55aba" + +[[package]] +name = "signal-hook-registry" +version = "1.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" +dependencies = [ + "errno", + "libc", +] + +[[package]] +name = "simd-adler32" +version = "0.3.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a219298ac11a56ea9a6d2120044824d6f01aeb034955e7af7bc16858527deea" + +[[package]] +name = "simd_helpers" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95890f873bec569a0362c235787f3aca6e1e887302ba4840839bcc6459c42da6" +dependencies = [ + "quote", +] + +[[package]] +name = "simdutf8" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3a9fe34e3e7a50316060351f37187a3f546bce95496156754b601a5fa71b76e" + +[[package]] +name = "simplecss" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a9c6883ca9c3c7c90e888de77b7a5c849c779d25d74a1269b0218b14e8b136c" +dependencies = [ + "log", +] + +[[package]] +name = "siphasher" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ee5873ec9cce0195efcb7a4e9507a04cd49aec9c83d0389df45b1ef7ba2e649" + +[[package]] +name = "skrifa" +version = "0.44.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819ab7d62b1d3e72d9d9dea5650bac30424f9111364bb94928dbf5ecad1baa68" +dependencies = [ + "bytemuck", + "read-fonts", +] + +[[package]] +name = "slab" +version = "0.4.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c790de23124f9ab44544d7ac05d60440adc586479ce501c1d6d7da3cd8c9cf5" + +[[package]] +name = "slotmap" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bdd58c3c93c3d278ca835519292445cb4b0d4dc59ccfdf7ceadaab3f8aeb4038" +dependencies = [ + "version_check", +] + +[[package]] +name = "smallvec" +version = "1.16.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ba467056f1b547ed52077911161fc86985becbc60e8e1857c8a144dab0def891" + +[[package]] +name = "smol" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a33bd3e260892199c3ccfc487c88b2da2265080acb316cd920da72fdfd7c599f" +dependencies = [ + "async-channel 2.5.0", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-net", + "async-process", + "blocking", + "futures-lite 2.6.1", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" + +[[package]] +name = "socket2" +version = "0.6.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d1e2c7f27f8d4cb10542a02c49005dbd6e93095799d6f3be745fae9f8fedd4" +dependencies = [ + "libc", + "windows-sys 0.61.2", +] + +[[package]] +name = "spin" +version = "0.9.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3763264f6b73151db08c50ff20d7d8a0b8796e021cdea7ceedad07b80155fa0e" +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.13.2", +] + +[[package]] +name = "stable_deref_trait" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ce2be8dc25455e1f91df71bfa12ad37d7af1092ae736f3a6cd0e37bc7810596" + +[[package]] +name = "stacker" +version = "0.1.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "707f49d46706bacf8a2b00d51dace3f9de527c13eec3778f570c411f89e69967" +dependencies = [ + "cc", + "cfg-if", + "libc", + "psm", + "windows-sys 0.61.2", +] + +[[package]] +name = "stacksafe" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d9c1172965d317e87ddb6d364a040d958b40a1db82b6ef97da26253a8b3d090" +dependencies = [ + "stacker", + "stacksafe-macro", +] + +[[package]] +name = "stacksafe-macro" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "172175341049678163e979d9107ca3508046d4d2a7c6682bee46ac541b17db69" +dependencies = [ + "proc-macro-error2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "static_assertions" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f" + +[[package]] +name = "strict-num" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731" +dependencies = [ + "float-cmp", +] + +[[package]] +name = "strum" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fec0f0aef304996cf250b31b5a10dee7980c85da9d759361292b8bca5a18f06" +dependencies = [ + "strum_macros 0.26.4", +] + +[[package]] +name = "strum" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af23d6f6c1a224baef9d3f61e287d2761385a5b88fdab4eb4c6f11aeb54c4bcf" +dependencies = [ + "strum_macros 0.27.2", +] + +[[package]] +name = "strum_macros" +version = "0.26.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c6bee85a5a24955dc440386795aa378cd9cf82acd5f764469152d2270e581be" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "rustversion", + "syn 2.0.119", +] + +[[package]] +name = "strum_macros" +version = "0.27.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7695ce3845ea4b33927c055a39dc438a45b059f7c1b3d91d38d10355fb8cbca7" +dependencies = [ + "heck 0.5.0", + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "subtle" +version = "2.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292" + +[[package]] +name = "sval" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b81b254da21fe1fcc4e3a74fe39b46e25e3a863078f8b71c954d47f84889dbc6" + +[[package]] +name = "sval_buffer" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50be352d2822ffafb59e3e2ddac9d5ee60f2eeadbb7b5a2a951b9f3651e87a6f" +dependencies = [ + "sval", + "sval_ref", + "zerocopy", +] + +[[package]] +name = "sval_dynamic" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b048ca293b998d9a45659159f94a64063791e74cdc670164943dbb434405573d" +dependencies = [ + "sval", +] + +[[package]] +name = "sval_fmt" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e6b5888e40f80568733217f27b7317b845f463400ced36c424b1a804730e53b2" +dependencies = [ + "itoa", + "ryu", + "sval", +] + +[[package]] +name = "sval_json" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e17664d6bb6b74947afaab9d7c991caa9bf5638d4dee16fcbef637f440796049" +dependencies = [ + "itoa", + "ryu", + "sval", +] + +[[package]] +name = "sval_nested" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "07c059969ca5ca163ea7fef6c9661758973d17691aba92abdcf5c428f4ec122c" +dependencies = [ + "sval", + "sval_buffer", + "sval_ref", +] + +[[package]] +name = "sval_ref" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42d6b29ff568c85c87561807f51d2adfff4b6016c6363133f7cd1652a12548f3" +dependencies = [ + "sval", +] + +[[package]] +name = "sval_serde" +version = "2.22.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f33ec9edc42b12764d5c90ca0a1d84189c6bde81ed27507f1e661c6e4e05853" +dependencies = [ + "serde_core", + "sval", + "sval_nested", +] + +[[package]] +name = "svg_fmt" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0193cc4331cfd2f3d2011ef287590868599a2f33c3e69bc22c1a3d3acf9e02fb" + +[[package]] +name = "svgtypes" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" +dependencies = [ + "kurbo", + "siphasher", +] + +[[package]] +name = "swash" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c2499c2d826531388872b2268718aed907a39bd785ab0dcfe57fab26283f92e" +dependencies = [ + "skrifa", + "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.119" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "872831b642d1a07999a962a351ed35b955ea2cfc8f3862091e2a240a84f17297" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "syn" +version = "3.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8593e8e72159ed2257d083c7a454a85cbf854f37a0966d8d483aff8c8a3ebcee" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + +[[package]] +name = "sync_wrapper" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263" +dependencies = [ + "futures-core", +] + +[[package]] +name = "synstructure" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "901704edd0dfe137f1987838ee4f259e4e063c31371bdb423f7ae38ec6f77f02" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "sys-locale" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8eab9a99a024a169fe8a903cf9d4a3b3601109bcc13bd9e3c6fff259138626c4" +dependencies = [ + "libc", +] + +[[package]] +name = "sysinfo" +version = "0.31.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "355dbe4f8799b304b05e1b0f05fc59b2a18d36645cf169607da45bde2f69a1be" +dependencies = [ + "core-foundation-sys", + "libc", + "memchr", + "ntapi", + "rayon", + "windows 0.57.0", +] + +[[package]] +name = "system-configuration" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" +dependencies = [ + "bitflags 2.13.2", + "core-foundation 0.9.4", + "system-configuration-sys", +] + +[[package]] +name = "system-configuration-sys" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4" +dependencies = [ + "core-foundation-sys", + "libc", +] + +[[package]] +name = "taffy" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a13e5d13f79d558b5d353a98072ca8ca0e99da429467804de959aa8c83c9a004" +dependencies = [ + "arrayvec", + "grid", + "serde", + "slotmap", +] + +[[package]] +name = "take-until" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8bdb6fa0dfa67b38c1e66b7041ba9dcf23b99d8121907cd31c807a332f7a0bbb" + +[[package]] +name = "tao-core-video-sys" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "271450eb289cb4d8d0720c6ce70c72c8c858c93dd61fc625881616752e6b98f6" +dependencies = [ + "cfg-if", + "core-foundation-sys", + "libc", + "objc", +] + +[[package]] +name = "tempfile" +version = "3.27.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32497e9a4c7b38532efcdebeef879707aa9f794296a4f0244f6f69e9bc8574bd" +dependencies = [ + "fastrand 2.5.0", + "getrandom 0.4.3", + "once_cell", + "rustix 1.1.5", + "windows-sys 0.61.2", +] + +[[package]] +name = "tendril" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d24a120c5fc464a3458240ee02c299ebcb9d67b5249c8848b09d639dca8d7bb0" +dependencies = [ + "futf", + "mac", + "utf-8", +] + +[[package]] +name = "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.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52" +dependencies = [ + "thiserror-impl 1.0.69", +] + +[[package]] +name = "thiserror" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09e52cb86a36cede5cb101bf8908837b3e4c6e5e59fe7fd85c23fb56200d189e" +dependencies = [ + "thiserror-impl 2.0.21", +] + +[[package]] +name = "thiserror-impl" +version = "1.0.69" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fe5197923287db20a58125f0bc85c062f7f2c892de97b18c356f9efb14b28524" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "tiff" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b63feaf3343d35b6ca4d50483f94843803b0f51634937cc2ec519fc32232bc52" +dependencies = [ + "fax", + "flate2", + "half", + "quick-error", + "weezl", + "zune-jpeg", +] + +[[package]] +name = "tiny-keccak" +version = "2.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c9d3793400a45f954c52e73d068316d76b6f4e36977e3fcebb13a2721e80237" +dependencies = [ + "crunchy", +] + +[[package]] +name = "tiny-skia" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab" +dependencies = [ + "arrayref", + "arrayvec", + "bytemuck", + "cfg-if", + "log", + "png 0.17.16", + "tiny-skia-path", +] + +[[package]] +name = "tiny-skia-path" +version = "0.11.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93" +dependencies = [ + "arrayref", + "bytemuck", + "strict-num", +] + +[[package]] +name = "tinystr" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1e27c91459209c2986af3dcf603a5a74a4368754ce37414f59acc971167f643" +dependencies = [ + "displaydoc", + "zerovec", +] + +[[package]] +name = "tinyvec" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd3ca314f692efd6c868f8408f53fe444634a845f96c028b97d35f6a1f79f0ee" + +[[package]] +name = "tokio" +version = "1.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "202caea871b69668250d242070849eb495be178ed697a3e98aebce5bc81a0bed" +dependencies = [ + "bytes", + "libc", + "mio", + "pin-project-lite", + "socket2", + "windows-sys 0.61.2", +] + +[[package]] +name = "tokio-rustls" +version = "0.26.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c85f2c3ef0b1cd58b36682f4b17aaa995f0e5db534d85692b4903abce21f67" +dependencies = [ + "rustls", + "tokio", +] + +[[package]] +name = "tokio-socks" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a7e2948f60dbe26b35f2c7fb74ac2854c1fddded0fe9d7548fcc674a246f7615" +dependencies = [ + "either", + "futures-util", + "thiserror 1.0.69", + "tokio", +] + +[[package]] +name = "tokio-util" +version = "0.7.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "494815d09bf52b5548659851081238f0ca39ff638363907596da739561c62c52" +dependencies = [ + "bytes", + "futures-core", + "futures-sink", + "libc", + "pin-project-lite", + "tokio", +] + +[[package]] +name = "toml" +version = "0.8.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc1beb996b9d83529a9e75c17a1686767d148d70663143c7854d8b4a09ced362" +dependencies = [ + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_edit 0.22.27", +] + +[[package]] +name = "toml" +version = "1.1.6+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "920602543f0911ab71da12c50d59701da54c196d1a2bf5cb4b75667f137a406a" +dependencies = [ + "indexmap", + "serde_core", + "serde_spanned 1.1.1", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "toml_writer", + "winnow 1.0.4", +] + +[[package]] +name = "toml_datetime" +version = "0.6.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "22cddaf88f4fbc13c51aebbf5f8eceb5c7c5a9da2ac40a13519eb5b0a0e8f11c" +dependencies = [ + "serde", +] + +[[package]] +name = "toml_datetime" +version = "1.1.1+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3165f65f62e28e0115a00b2ebdd37eb6f3b641855f9d636d3cd4103767159ad7" +dependencies = [ + "serde_core", +] + +[[package]] +name = "toml_edit" +version = "0.22.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41fe8c660ae4257887cf66394862d21dbca4a6ddd26f04a3560410406a2f819a" +dependencies = [ + "indexmap", + "serde", + "serde_spanned 0.6.9", + "toml_datetime 0.6.11", + "toml_write", + "winnow 0.7.15", +] + +[[package]] +name = "toml_edit" +version = "0.25.15+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1340ea94a5856333492c9064b02c778b191dd2c853778d9609debdcdfea3a614" +dependencies = [ + "indexmap", + "toml_datetime 1.1.1+spec-1.1.0", + "toml_parser", + "winnow 1.0.4", +] + +[[package]] +name = "toml_parser" +version = "1.1.3+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d38ac1cf9b95face32296c0a3ede1fdc270627c9d9c02a7274dd6d960dc4d56" +dependencies = [ + "winnow 1.0.4", +] + +[[package]] +name = "toml_write" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" + +[[package]] +name = "toml_writer" +version = "1.1.2+spec-1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7d56353a2a665ad0f41a421187180aab746c8c325620617ad883a99a1cbe66d2" + +[[package]] +name = "tower" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebe5ef63511595f1344e2d5cfa636d973292adc0eec1f0ad45fae9f0851ab1d4" +dependencies = [ + "futures-core", + "futures-util", + "pin-project-lite", + "sync_wrapper", + "tokio", + "tower-layer", + "tower-service", +] + +[[package]] +name = "tower-layer" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "121c2a6cda46980bb0fcd1647ffaf6cd3fc79a013de288782836f6df9c48780e" + +[[package]] +name = "tower-service" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8df9b6e13f2d32c91b9bd719c00d1958837bc7dec474d94952798cc8e69eeec3" + +[[package]] +name = "tracing" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63e71662fa4b2a2c3a26f570f037eb95bb1f85397f3cd8076caed2f026a6d100" +dependencies = [ + "pin-project-lite", + "tracing-attributes", + "tracing-core", +] + +[[package]] +name = "tracing-attributes" +version = "0.1.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "tracing-core" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db97caf9d906fbde555dd62fa95ddba9eecfd14cb388e4f491a66d74cd5fb79a" +dependencies = [ + "once_cell", +] + +[[package]] +name = "try-lock" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" + +[[package]] +name = "ttf-parser" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f77d76d837a7830fe1d4f12b7b4ba4192c1888001c7164257e4bc6d21d96b4" + +[[package]] +name = "ttf-parser" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c591d83f69777866b9126b24c6dd9a18351f177e49d625920d19f989fd31cf8" + +[[package]] +name = "ttf-parser" +version = "0.25.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2df906b07856748fa3f6e0ad0cbaa047052d4a7dd609e231c4f72cee8c36f31" +dependencies = [ + "core_maths", +] + +[[package]] +name = "typeid" +version = "1.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bc7d623258602320d5c55d1bc22793b57daff0ec7efc270ea7d55ce1d5f5471c" + +[[package]] +name = "typenum" +version = "1.20.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6f5e870be6c3b371b77fe0ee0bafb859fa4964b4404c27de1d380043c4dda20" + +[[package]] +name = "uds_windows" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" +dependencies = [ + "memoffset", + "tempfile", + "windows-sys 0.61.2", +] + +[[package]] +name = "unicase" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dbc4bc3a9f746d862c45cb89d705aa10f187bb96c76001afab07a0d35ce60142" + +[[package]] +name = "unicode-bidi" +version = "0.3.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5" + +[[package]] +name = "unicode-bidi-mirroring" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23cb788ffebc92c5948d0e997106233eeb1d8b9512f93f41651f52b6c5f5af86" + +[[package]] +name = "unicode-bidi-mirroring" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe" + +[[package]] +name = "unicode-ccc" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1df77b101bcc4ea3d78dafc5ad7e4f58ceffe0b2b16bf446aeb50b6cb4157656" + +[[package]] +name = "unicode-ccc" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" + +[[package]] +name = "unicode-ident" +version = "1.0.26" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d245f478577f809a851594d02313b640fb437e0bb33866753cff937863096954" + +[[package]] +name = "unicode-linebreak" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b09c83c3c29d37506a3e260c08c03743a6bb66a9cd432c6934ab501a190571f" + +[[package]] +name = "unicode-properties" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7df058c713841ad818f1dc5d3fd88063241cc61f49f5fbea4b951e8cf5a8d71d" + +[[package]] +name = "unicode-script" +version = "0.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "383ad40bb927465ec0ce7720e033cb4ca06912855fc35db31b5755d0de75b1ee" + +[[package]] +name = "unicode-segmentation" +version = "1.13.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6f5d3c3b1bf09027a88a6bc961fc00497d651009560b5463668dc81b0fa87a8" + +[[package]] +name = "unicode-vo" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94" + +[[package]] +name = "unicode-width" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ac048d71ede7ee76d585517add45da530660ef4390e49b098733c6e897f254" + +[[package]] +name = "untrusted" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" + +[[package]] +name = "url" +version = "2.5.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" +dependencies = [ + "form_urlencoded", + "idna", + "percent-encoding", + "serde", + "serde_derive", +] + +[[package]] +name = "usvg" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" +dependencies = [ + "base64", + "data-url", + "flate2", + "fontdb 0.23.0", + "imagesize", + "kurbo", + "log", + "pico-args", + "roxmltree", + "rustybuzz 0.20.1", + "simplecss", + "siphasher", + "strict-num", + "svgtypes", + "tiny-skia-path", + "unicode-bidi", + "unicode-script", + "unicode-vo", + "xmlwriter", +] + +[[package]] +name = "utf-8" +version = "0.7.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" + +[[package]] +name = "utf8_iter" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" + +[[package]] +name = "utf8parse" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06abde3611657adf66d383f00b093d7faecc7fa57071cce2578660c9f1010821" + +[[package]] +name = "uuid" +version = "1.26.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ef6dac1e96601b4fb3acccccff2139741fcb757cb9a36089bf5be91cfb285ce" +dependencies = [ + "getrandom 0.4.3", + "js-sys", + "serde_core", + "sha1_smol", + "wasm-bindgen", +] + +[[package]] +name = "v_frame" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "666b7727c8875d6ab5db9533418d7c764233ac9c0cff1d469aec8fa127597be2" +dependencies = [ + "aligned-vec", + "num-traits", + "wasm-bindgen", +] + +[[package]] +name = "value-bag" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2799ffb329a792ecfd902b71306c8a815a6ef1c0470fa9953a6aa4d4cecbe511" +dependencies = [ + "value-bag-serde1", + "value-bag-sval2", +] + +[[package]] +name = "value-bag-serde1" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0941feceafbe7a8f59ea1096d45b97002884a41306315ad797b3684b63a81d8c" +dependencies = [ + "erased-serde", + "serde_core", + "serde_fmt", +] + +[[package]] +name = "value-bag-sval2" +version = "1.14.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "839752af8179287d27eb2b94164641b1ede9e60ab7424163388dc21ebd0508cd" +dependencies = [ + "sval", + "sval_buffer", + "sval_dynamic", + "sval_fmt", + "sval_json", + "sval_ref", + "sval_serde", +] + +[[package]] +name = "version_check" +version = "0.9.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" + +[[package]] +name = "vswhom" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "be979b7f07507105799e854203b470ff7c78a1639e330a58f183b5fea574608b" +dependencies = [ + "libc", + "vswhom-sys", +] + +[[package]] +name = "vswhom-sys" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fb067e4cbd1ff067d1df46c9194b5de0e98efd2810bbc95c5d5e5f25a3231150" +dependencies = [ + "cc", + "libc", +] + +[[package]] +name = "waker-fn" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "317211a0dc0ceedd78fb2ca9a44aed3d7b9b26f81870d485c07122b4350673b7" + +[[package]] +name = "walkdir" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29790946404f91d9c5d06f9874efddea1dc06c5efe94541a7d6863108e3a5e4b" +dependencies = [ + "same-file", + "winapi-util", +] + +[[package]] +name = "want" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bfa7760aed19e106de2c7c0b581b509f2f25d3dacaf737cb82ac61bc6d760b0e" +dependencies = [ + "try-lock", +] + +[[package]] +name = "wasi" +version = "0.11.1+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" + +[[package]] +name = "wasip2" +version = "1.0.4+wasi-0.2.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" +dependencies = [ + "wit-bindgen", +] + +[[package]] +name = "wasm-bindgen" +version = "0.2.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "aecb87a33d3b0c5e3b7aa46336eaf486cffafbd281b195e4c8b80d50df2351bf" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-futures" +version = "0.4.78" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6ef4c5d3d2cdf5c54f4231181768f5510842e350db025faf1f7163b1030ed928" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a690d511e3c1a8b3a55e33511e3c2c00c78415cd23650f32b808627f5696b9ed" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "411e4887f0071ef2d2164a9d5fdf2d20efbef78fccd3a78b0c10a1dc5295e48a" +dependencies = [ + "bumpalo", + "proc-macro2", + "quote", + "syn 3.0.6", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.128" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81941cd78d0c92026c33e5e01312845a4cb1e9af3407f9134b100dd03144103e" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "wasm-streams" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" +dependencies = [ + "futures-util", + "js-sys", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", +] + +[[package]] +name = "wayland-backend" +version = "0.3.17" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38a91b4eaddff87b1cd1074985e3713da4af2c49742d1b356b2c01670a67a078" +dependencies = [ + "cc", + "downcast-rs", + "rustix 1.1.5", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e3c36a0f861ad76d0901f2800b46321410d9f73f2ea88aac0650d86c32688073" +dependencies = [ + "bitflags 2.13.2", + "rustix 1.1.5", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-cursor" +version = "0.31.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a52d18780be9b1314328a3de5f930b73d2200112e3849ca6cb11822793fb34d" +dependencies = [ + "rustix 1.1.5", + "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.13.2", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23d0c813de3daa2ed6520af85a3bd49b0e722a3078506899aa9686fea58dc4b6" +dependencies = [ + "bitflags 2.13.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.13.2", + "wayland-backend", + "wayland-client", + "wayland-protocols 0.31.2", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "338e30461b3a2b67d70eb30a6d89f8e0c93a833e07d2ae89085cd070c4a00ac0" +dependencies = [ + "proc-macro2", + "quick-xml", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8eab23fefc9e41f8e841df4a9c707e8a8c4ed26e944ef69297184de2785e3be" +dependencies = [ + "dlib", + "log", + "once_cell", + "pkg-config", +] + +[[package]] +name = "web-sys" +version = "0.3.105" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbddc4a036f00ec4f18c83445bd3115cb306a91da554919a099d9222fe4a7f8" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "web-time" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5a6580f308b1fad9207618087a65c04e7a10bc77e02c8e84e9b00dd4b12fa0bb" +dependencies = [ + "js-sys", + "wasm-bindgen", +] + +[[package]] +name = "weezl" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a28ac98ddc8b9274cb41bb4d9d4d5c425b6020c50c46f25559911905610b4a88" + +[[package]] +name = "which" +version = "6.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4ee928febd44d98f2f459a4a79bd4d928591333a494a10a868418ac1b39cf1f" +dependencies = [ + "either", + "home", + "rustix 0.38.44", + "winsafe", +] + +[[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.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c2a7b1c03c876122aa43f3020e6c3c3ee5c05081c9a00739faf7503aeba10d22" +dependencies = [ + "windows-sys 0.61.2", +] + +[[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.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12342cb4d8e3b046f3d80effd474a7a02447231330ef77d71daa6fbc40681143" +dependencies = [ + "windows-core 0.57.0", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows" +version = "0.61.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" +dependencies = [ + "windows-collections", + "windows-core 0.61.2", + "windows-future", + "windows-link 0.1.3", + "windows-numerics", +] + +[[package]] +name = "windows-capture" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3a4df73e95feddb9ec1a7e9c2ca6323b8c97d5eeeff78d28f1eccdf19c882b24" +dependencies = [ + "parking_lot", + "rayon", + "thiserror 2.0.21", + "windows 0.61.3", + "windows-future", +] + +[[package]] +name = "windows-collections" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8" +dependencies = [ + "windows-core 0.61.2", +] + +[[package]] +name = "windows-core" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2ed2439a290666cd67ecce2b0ffaad89c2a56b976b736e6ece670297897832d" +dependencies = [ + "windows-implement 0.57.0", + "windows-interface 0.57.0", + "windows-result 0.1.2", + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement 0.60.2", + "windows-interface 0.59.3", + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-future" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", + "windows-threading", +] + +[[package]] +name = "windows-implement" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9107ddc059d5b6fbfbffdfa7a7fe3e22a226def0b2608f72e9d552763d3e1ad7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-implement" +version = "0.60.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.57.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29bee4b38ea3cde66011baa44dba677c432a78593e202392d1e9070cf2a7fca7" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-interface" +version = "0.59.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-link" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f0805222e57f7521d6a62e36fa9163bc891acd422f971defe97d64e70d0a4fe5" + +[[package]] +name = "windows-numerics" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1" +dependencies = [ + "windows-core 0.61.2", + "windows-link 0.1.3", +] + +[[package]] +name = "windows-registry" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4286ad90ddb45071efd1a66dfa43eb02dd0dfbae1545ad6cc3c51cf34d7e8ba3" +dependencies = [ + "windows-result 0.3.4", + "windows-strings 0.3.1", + "windows-targets 0.53.5", +] + +[[package]] +name = "windows-registry" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e" +dependencies = [ + "windows-link 0.1.3", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-result" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "87fa48cc5d406560701792be122a10132491cff9d0aeb23583cc2dcafc847319" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows-sys" +version = "0.48.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "677d2418bec65e3338edb076e806bc1ec15693c5d0104683f2efe857f61056a9" +dependencies = [ + "windows-targets 0.48.5", +] + +[[package]] +name = "windows-sys" +version = "0.52.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.59.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e38bc4d79ed67fd075bcc251a1c39b32a1776bbe92e5bef1f0bf1f8c531853b" +dependencies = [ + "windows-targets 0.52.6", +] + +[[package]] +name = "windows-sys" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae137229bcbd6cdf0f7b80a31df61766145077ddf49416a728b02cb3921ff3fc" +dependencies = [ + "windows-link 0.2.1", +] + +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + +[[package]] +name = "windows-targets" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b724f72796e036ab90c1021d4780d4d3d648aca59e491e6b98e725b84e99973" +dependencies = [ + "windows_aarch64_gnullvm 0.52.6", + "windows_aarch64_msvc 0.52.6", + "windows_i686_gnu 0.52.6", + "windows_i686_gnullvm 0.52.6", + "windows_i686_msvc 0.52.6", + "windows_x86_64_gnu 0.52.6", + "windows_x86_64_gnullvm 0.52.6", + "windows_x86_64_msvc 0.52.6", +] + +[[package]] +name = "windows-targets" +version = "0.53.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4945f9f551b88e0d65f3db0bc25c33b8acea4d9e41163edf90dcd0b19f9069f3" +dependencies = [ + "windows-link 0.2.1", + "windows_aarch64_gnullvm 0.53.1", + "windows_aarch64_msvc 0.53.1", + "windows_i686_gnu 0.53.1", + "windows_i686_gnullvm 0.53.1", + "windows_i686_msvc 0.53.1", + "windows_x86_64_gnu 0.53.1", + "windows_x86_64_gnullvm 0.53.1", + "windows_x86_64_msvc 0.53.1", +] + +[[package]] +name = "windows-threading" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6" +dependencies = [ + "windows-link 0.1.3", +] + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" + +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" + +[[package]] +name = "windows_aarch64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" + +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + +[[package]] +name = "windows_i686_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" + +[[package]] +name = "windows_i686_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" + +[[package]] +name = "windows_i686_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" + +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + +[[package]] +name = "windows_i686_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" + +[[package]] +name = "windows_i686_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" + +[[package]] +name = "windows_x86_64_gnu" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" + +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.52.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec" + +[[package]] +name = "windows_x86_64_msvc" +version = "0.53.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d6bbff5f0aada427a1e5a6da5f1f98158182f26556f345ac9e04d36d0ebed650" + +[[package]] +name = "winnow" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "df79d97927682d2fd8adb29682d1140b343be4ac0f08fd68b7765d9c059d3945" +dependencies = [ + "memchr", +] + +[[package]] +name = "winnow" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "23b97319f7b8343df12cc98938e5c3eb436064524c8d2b4e30a1d3a36eecdf81" +dependencies = [ + "memchr", +] + +[[package]] +name = "winreg" +version = "0.55.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5a765337c50e9ec252c2069be9bf91c7df47afb103b642ba3a53bf8101be97" +dependencies = [ + "cfg-if", + "windows-sys 0.59.0", +] + +[[package]] +name = "winsafe" +version = "0.0.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d135d17ab770252ad95e9a872d365cf3090e3be864a34ab46f48555993efc904" + +[[package]] +name = "wio" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d129932f4644ac2396cb456385cbf9e63b5b30c6e8dc4820bdca4eb082037a5" +dependencies = [ + "winapi", +] + +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + +[[package]] +name = "writeable" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3ad82d2a33cdc9674dc7465672f271e096168fcdbe0f799d9e6db8c5892679dc" + +[[package]] +name = "x11" +version = "2.21.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "502da5464ccd04011667b11c435cb992822c2c0dbde1770c988480d312a0db2e" +dependencies = [ + "libc", + "pkg-config", +] + +[[package]] +name = "x11-clipboard" +version = "0.9.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "662d74b3d77e396b8e5beb00b9cad6a9eccf40b2ef68cc858784b14c41d535a3" +dependencies = [ + "libc", + "x11rb", +] + +[[package]] +name = "x11rb" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9993aa5be5a26815fe2c3eacfc1fde061fc1a1f094bf1ad2a18bf9c495dd7414" +dependencies = [ + "as-raw-xcb-connection", + "gethostname", + "libc", + "rustix 1.1.5", + "x11rb-protocol", + "xcursor", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" + +[[package]] +name = "xattr" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6d1526bbe5aaeb5eb06885f4d987bcdfa5e23187055de9b83fe00156a821fabc" +dependencies = [ + "libc", +] + +[[package]] +name = "xcb" +version = "1.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6c2ad15e0e922856ee89afe862b8992334bbe7953adad56cd1199358cb30566" +dependencies = [ + "bitflags 2.13.2", + "libc", + "quick-xml", + "x11", +] + +[[package]] +name = "xcursor" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "163b33ed8786455e2fa5d72f554057ce3f3182425434f756cd39c99839d88e23" + +[[package]] +name = "xim-ctext" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ac61a7062c40f3c37b6e82eeeef835d5cc7824b632a72784a89b3963c33284c" +dependencies = [ + "encoding_rs", +] + +[[package]] +name = "xim-parser" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5dcee45f89572d5a65180af3a84e7ddb24f5ea690a6d3aa9de231281544dd7b7" +dependencies = [ + "bitflags 2.13.2", +] + +[[package]] +name = "xkbcommon" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8d66ca9352cbd4eecbbc40871d8a11b4ac8107cfc528a6e14d7c19c69d0e1ac9" +dependencies = [ + "as-raw-xcb-connection", + "libc", + "memmap2", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xmlwriter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" + +[[package]] +name = "y4m" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7a5a4b21e1a62b67a2970e6831bc091d7b87e119e7f9791aef9702e3bef04448" + +[[package]] +name = "yazi" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e01738255b5a16e78bbb83e7fbba0a1e7dd506905cfc53f4622d89015a03fbb5" + +[[package]] +name = "yeslogic-fontconfig-sys" +version = "6.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d8b8abf912b9a29ff112e1671c97c33636903d13a69712037190e6805af4f76" +dependencies = [ + "dlib", + "once_cell", + "pkg-config", +] + +[[package]] +name = "yoke" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "709fe23a0424b6a435d82152b1bd3fdfb0833487d5fa90d05d42762a9891fef5" +dependencies = [ + "stable_deref_trait", + "yoke-derive", + "zerofrom", +] + +[[package]] +name = "yoke-derive" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "33811428bee40dbceb6d545e95754741d17a6aef9a4849f0fd62e2ba4f412a78" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", + "synstructure", +] + +[[package]] +name = "zbus" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5db4be7c075cb421e4b7ee645541604239bd243ba7c357511f4ff3a74b555907" +dependencies = [ + "async-broadcast", + "async-executor", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "enumflags2", + "event-listener 5.4.2", + "futures-core", + "futures-lite 2.6.1", + "hex", + "libc", + "ordered-stream", + "rustix 1.1.5", + "serde", + "serde_repr", + "tracing", + "uds_windows", + "uuid", + "windows-sys 0.61.2", + "winnow 1.0.4", + "zbus_macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zbus_macros" +version = "5.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2990635d09ade6df1868f72f8cac69a876a90981e8bd3c40b1be413f8dc88f40" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 3.0.6", + "zbus_names", + "zvariant", + "zvariant_utils", +] + +[[package]] +name = "zbus_names" +version = "4.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e" +dependencies = [ + "serde", + "winnow 1.0.4", + "zvariant", +] + +[[package]] +name = "zcheapstr" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1afec51604565183aeb5c54c20aeab286120d4e4460f7f76e3e8bb8c0d99473" +dependencies = [ + "serde", +] + +[[package]] +name = "zed-async-tar" +version = "0.5.0-zed" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6cf4b5f655e29700e473cb1acd914ab112b37b62f96f7e642d5fc6a0c02eb881" +dependencies = [ + "async-std", + "filetime", + "libc", + "pin-project", + "redox_syscall 0.2.16", + "xattr", +] + +[[package]] +name = "zed-font-kit" +version = "0.14.1-zed" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3898e450f36f852edda72e3f985c34426042c4951790b23b107f93394f9bff5" +dependencies = [ + "bitflags 2.13.2", + "byteorder", + "core-foundation 0.10.0", + "core-graphics 0.24.0", + "core-text", + "dirs 5.0.1", + "dwrote", + "float-ord", + "freetype-sys", + "lazy_static", + "libc", + "log", + "pathfinder_geometry", + "pathfinder_simd", + "walkdir", + "winapi", + "yeslogic-fontconfig-sys", +] + +[[package]] +name = "zed-reqwest" +version = "0.12.15-zed" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac2d05756ff48539950c3282ad7acf3817ad3f08797c205ad1c34a2ce03b9970" +dependencies = [ + "base64", + "bytes", + "encoding_rs", + "futures-core", + "futures-util", + "h2", + "http", + "http-body", + "http-body-util", + "hyper", + "hyper-rustls", + "hyper-util", + "ipnet", + "js-sys", + "log", + "mime", + "mime_guess", + "once_cell", + "percent-encoding", + "pin-project-lite", + "quinn", + "rustls", + "rustls-native-certs", + "rustls-pemfile", + "rustls-pki-types", + "serde", + "serde_json", + "serde_urlencoded", + "sync_wrapper", + "system-configuration", + "tokio", + "tokio-rustls", + "tokio-socks", + "tokio-util", + "tower", + "tower-service", + "url", + "wasm-bindgen", + "wasm-bindgen-futures", + "wasm-streams", + "web-sys", + "windows-registry 0.4.0", +] + +[[package]] +name = "zed-scap" +version = "0.0.8-zed" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b338d705ae33a43ca00287c11129303a7a0aa57b101b72a1c08c863f698ac8" +dependencies = [ + "anyhow", + "cocoa 0.25.0", + "core-graphics-helmer-fork", + "log", + "objc", + "rand 0.8.8", + "screencapturekit", + "screencapturekit-sys", + "sysinfo", + "tao-core-video-sys", + "windows 0.61.3", + "windows-capture", + "x11", + "xcb", +] + +[[package]] +name = "zed-xim" +version = "0.4.0-zed" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0c0b46ed118eba34d9ba53d94ddc0b665e0e06a2cf874cfa2dd5dec278148642" +dependencies = [ + "ahash", + "hashbrown 0.14.5", + "log", + "x11rb", + "xim-ctext", + "xim-parser", +] + +[[package]] +name = "zeno" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6df3dc4292935e51816d896edcd52aa30bc297907c26167fec31e2b0c6a32524" + +[[package]] +name = "zerocopy" +version = "0.8.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c17e8fafad82b542ff3717217ecdc736231b59e387768c9630123b4ce4d2db44" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.58" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "595f56e044df4f46a0c9a626f65c3d99eb8488f7e8a8baa12dd76326d9710bf2" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerofrom" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ec05a11813ea801ff6d75110ad09cd0824ddba17dfe17128ea0d5f68e6c5272" +dependencies = [ + "zerofrom-derive", +] + +[[package]] +name = "zerofrom-derive" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f75b4683f6c7f45248d4d64056a24298c6281e0993356d7d1b4a1a962ef10d4a" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", + "synstructure", +] + +[[package]] +name = "zeroize" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e13c156562582aa81c60cb29407084cdb54c4164760106ab78e6c5b0858cf64e" +dependencies = [ + "zeroize_derive", +] + +[[package]] +name = "zeroize_derive" +version = "1.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c50655cbb0fe3fc43170059e702f1ce5e19b84cec58dc87b037a09935c2f328" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.119", +] + +[[package]] +name = "zerotrie" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ea269c3bd32f0a32c321907a2ae912ba6f4649bb0fc764a15627e99a7095a3f" +dependencies = [ + "displaydoc", + "yoke", + "zerofrom", +] + +[[package]] +name = "zerovec" +version = "0.11.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb0464e17806c1d976d5cba29399c7f08e516e279e2ba493f63123b5fca67dd8" +dependencies = [ + "yoke", + "zerofrom", + "zerovec-derive", +] + +[[package]] +name = "zerovec-derive" +version = "0.11.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34df6fc39dbd26ddc9c10e6a2984476e13acce22e64e4487636ef494369225da" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.6", +] + +[[package]] +name = "zlib-rs" +version = "0.6.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b268e58e7c693d7c271f93ffc4ba3b380412554231c85bf61ca7af91042a4112" + +[[package]] +name = "zmij" +version = "1.0.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29666d0abbfad1e3dc4dcf6144730dd3a3ab225bbbdac83319345b1b44ccfc1b" + +[[package]] +name = "zune-core" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d56377fd46368984a170bc5aac5567e52ca5da874caa60bea39fcbca78fb658b" + +[[package]] +name = "zune-inflate" +version = "0.2.54" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ab332fe2f6680068f3582b16a24f90ad7096d5d39b974d1c0aff0125116f02" +dependencies = [ + "simd-adler32", +] + +[[package]] +name = "zune-jpeg" +version = "0.5.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27bc9d5b815bc103f142aa054f561d9187d191692ec7c2d1e2b4737f8dbd7296" +dependencies = [ + "zune-core", +] + +[[package]] +name = "zvariant" +version = "5.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c1d34c27cc6cdd1f458427519dd6b8612f7b7e3f7b9a0b2355d041dda9869147" +dependencies = [ + "endi", + "enumflags2", + "serde", + "url", + "winnow 1.0.4", + "zcheapstr", + "zvariant_derive", + "zvariant_utils", +] + +[[package]] +name = "zvariant_derive" +version = "5.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "864155e69b4352db0c7f374917bf45d1e0c8d17659c8b3dbf9795f3673f8c497" +dependencies = [ + "proc-macro-crate", + "proc-macro2", + "quote", + "syn 3.0.6", + "zvariant_utils", +] + +[[package]] +name = "zvariant_utils" +version = "4.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bad0294361a320b694a328460dc73add56c306150f5cb6bfafc44446120008a3" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "syn 3.0.6", + "winnow 1.0.4", +] diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 0000000..786d786 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,34 @@ +[package] +name = "ely-gpui-component" +version = "0.1.0" +edition = "2024" +rust-version = "1.95" +license = "MIT OR Apache-2.0" +description = "A restrained component library for GPUI, in light and dark." +repository = "https://github.com/ZacharyZhang-NY/Ely-GPUI-Components" +publish = false + +[features] +default = ["runtime_shaders"] +runtime_shaders = ["gpui/runtime_shaders"] + +[dependencies] +anyhow = "1" +gpui = "0.2.2" +log = "0.4" +rust-embed = "8.12" + +[dev-dependencies] +env_logger = "0.11" + +[target.'cfg(target_os = "macos")'.dev-dependencies] +core-foundation = "0.10" +core-graphics = "0.24" +image = { version = "0.25", default-features = false, features = ["png"] } + +[lints.clippy] +all = { level = "warn", priority = -1 } + +[[example]] +name = "gallery" +path = "examples/gallery/main.rs" diff --git a/LICENSE-APACHE b/LICENSE-APACHE new file mode 100644 index 0000000..1b5ec8b --- /dev/null +++ b/LICENSE-APACHE @@ -0,0 +1,176 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + +1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + +2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + +3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + +4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + +5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + +6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + +7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + +8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + +9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS diff --git a/LICENSE-MIT b/LICENSE-MIT new file mode 100644 index 0000000..f01d994 --- /dev/null +++ b/LICENSE-MIT @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2026 Ely GPUI Component contributors + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/README.md b/README.md new file mode 100644 index 0000000..ec472f9 --- /dev/null +++ b/README.md @@ -0,0 +1,45 @@ +# Ely GPUI Component + +A component library for [GPUI](https://www.gpui.rs), the Rust UI framework behind Zed. +Every component ships in light and dark. The palette is warm and quiet. Color carries meaning, not decoration. + +Status: early. `TASKS.md` tracks every component, chapter by chapter. + +## Use + +```toml +[dependencies] +ely-gpui-component = { git = "https://github.com/ZacharyZhang-NY/Ely-GPUI-Components" } +gpui = "0.2.2" +``` + +```rust +use ely_gpui_component::{Assets, theme::{Mode, Theme}}; +use gpui::{App, Application}; + +fn main() { + Application::new().with_assets(Assets).run(|cx: &mut App| { + ely_gpui_component::init(cx); + Theme::set_mode(Mode::Dark, cx); + }); +} +``` + +`init` registers the fonts and the theme. It panics if `Assets` is not wired into the application. + +## Gallery + +```sh +cargo run --example gallery +cargo run --example gallery -- --page buttons +cargo run --example gallery -- --capture shots # macOS: PNG of every page, light and dark +``` + +## Build notes + +- gpui 0.2.2 compiles its Metal shaders at runtime here (`runtime_shaders`, on by default), so a full Xcode install is not required. +- Tested on macOS only. The capture tool needs macOS. + +## License + +MIT or Apache-2.0, at your option. Lucide icons: ISC. Inter and JetBrains Mono: SIL Open Font License 1.1. diff --git a/TASKS.md b/TASKS.md new file mode 100644 index 0000000..cfb39a0 --- /dev/null +++ b/TASKS.md @@ -0,0 +1,107 @@ +# Tasks + +Progress truth. Work runs top to bottom. No item is skipped. +Each `T` item ends with a codex review (`gpt-6-astra`, effort `max`, herdr split pane). Three rounds at most. + +Per-component lines live in `tasks/`. Tags there: + +| Tag | Meaning | +|-----|---------| +| `→ path` | Alias or duplicate. One home, at `path`. | +| `native` | gpui 0.2.2 ships it. The gallery shows the native call. | +| `host` | Ely draws the UI. The host app supplies the engine data. | +| `prove` | Needs a crate or platform API not yet proven with gpui 0.2.2. | +| `blocked` | Cannot be real on gpui 0.2.2. Reason given. | +| `(Txx)` | Built early in task `Txx` as a dependency. | + +## Items + +- [x] T00 Foundation: package, theme, motion, assets, Icon, Button, gallery shell, docs +- [ ] T01 Primitives — `tasks/ch01-10.md` +- [ ] T02 Typography +- [ ] T03 Layout +- [ ] T04 Window & Shell +- [ ] T05 Buttons & Actions +- [ ] T06a Forms · Text +- [ ] T06b Forms · Selection +- [ ] T06c Forms · Date & Time +- [ ] T06d Forms · Color +- [ ] T06e Forms · Files +- [ ] T06f Forms · Other +- [ ] T06g Forms · Structure +- [ ] T07 Navigation +- [ ] T08 Menus +- [ ] T09 Overlays +- [ ] T10 Feedback +- [ ] T11a Loading — `tasks/ch11-20.md` +- [ ] T11b Motion +- [ ] T12 Data Display +- [ ] T13 Lists & Trees +- [ ] T14 Tables +- [ ] T15 Charts +- [ ] T16a Finance · Market charts +- [ ] T16b Finance · Technical analysis +- [ ] T16c Finance · Quotes & book +- [ ] T16d Finance · Trading +- [ ] T16e Finance · Markets & assets +- [ ] T17a Editor · Core +- [ ] T17b Editor · Intelligence +- [ ] T17c Editor · Search +- [ ] T17d Editor · Panels +- [ ] T17e Editor · Status items +- [ ] T18 Terminal +- [ ] T19 Git +- [ ] T20 Debug +- [ ] T21a Documents · Editing — `tasks/ch21-30.md` +- [ ] T21b Documents · Reading +- [ ] T21c Documents · Knowledge +- [ ] T22 Collaboration +- [ ] T23a AI Chat · Messages +- [ ] T23b AI Chat · Citations +- [ ] T23c AI Chat · Input +- [ ] T23d AI Chat · Conversations +- [ ] T23e AI Chat · Welcome +- [ ] T24 Agent +- [ ] T25 Generative +- [ ] T26 Media +- [ ] T27 Files +- [ ] T28 Messaging +- [ ] T29 Mail +- [ ] T30 Calendar +- [ ] T31 Project — `tasks/ch31-43.md` +- [ ] T32 Canvas & Design +- [ ] T33 DB & Dev Tools +- [ ] T34 Dashboard +- [ ] T35 Settings +- [ ] T36 Account +- [ ] T37 Onboarding & Help +- [ ] T38 Interaction +- [ ] T39 Theme +- [ ] T40 i18n & a11y +- [ ] T41 Maps +- [ ] T42 Misc +- [ ] T43 Library Tooling +- [ ] T44 Capture: every component, light and dark, plus motion clips +- [ ] T45 Website: `frontend/`, Vite 8, pnpm, light and dark, motion +- [ ] T46 E2E: Playwright against the built site +- [ ] T47 Ship: GitHub repo (public), CI, Pages deploy +- [ ] T48 Acceptance: live URL and MVP checklist + +## T00 detail + +- [x] git, `.gitignore`, `LICENSE-MIT`, `LICENSE-APACHE` +- [x] `Cargo.toml`: gpui 0.2.2 with `runtime_shaders`, lints +- [x] Theme: light and dark palettes, high contrast, tokens, `ActiveTheme`, animated switch +- [x] Motion: durations, easings, spring +- [x] Assets: Lucide icons, Inter, JetBrains Mono, `AssetSource` +- [x] Icon, Button, IconButton +- [x] Gallery shell: chapter nav, theme toggle, self-capture +- [x] `AGENTS.md`, `README.md` + +## Review log + +| Item | Round | Verdict | Notes | +|------|-------|---------|-------| +| T00 | 1 | FAIL | capture swallowed errors; root not focused; raw px sizes; gallery copy; tag conflict | +| T00 | 2 | FAIL | AGENTS.md called `border_1` a rem helper | +| T00 | 3 | PASS | | diff --git a/assets/fonts/Inter-LICENSE.txt b/assets/fonts/Inter-LICENSE.txt new file mode 100644 index 0000000..9b2ca37 --- /dev/null +++ b/assets/fonts/Inter-LICENSE.txt @@ -0,0 +1,92 @@ +Copyright (c) 2016 The Inter Project Authors (https://github.com/rsms/inter) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +http://scripts.sil.org/OFL + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION AND CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/assets/fonts/Inter-Medium.ttf b/assets/fonts/Inter-Medium.ttf new file mode 100644 index 0000000..458cd06 Binary files /dev/null and b/assets/fonts/Inter-Medium.ttf differ diff --git a/assets/fonts/Inter-Regular.ttf b/assets/fonts/Inter-Regular.ttf new file mode 100644 index 0000000..b7aaca8 Binary files /dev/null and b/assets/fonts/Inter-Regular.ttf differ diff --git a/assets/fonts/Inter-SemiBold.ttf b/assets/fonts/Inter-SemiBold.ttf new file mode 100644 index 0000000..47f8ab1 Binary files /dev/null and b/assets/fonts/Inter-SemiBold.ttf differ diff --git a/assets/fonts/JetBrainsMono-LICENSE.txt b/assets/fonts/JetBrainsMono-LICENSE.txt new file mode 100644 index 0000000..8bee414 --- /dev/null +++ b/assets/fonts/JetBrainsMono-LICENSE.txt @@ -0,0 +1,93 @@ +Copyright 2020 The JetBrains Mono Project Authors (https://github.com/JetBrains/JetBrainsMono) + +This Font Software is licensed under the SIL Open Font License, Version 1.1. +This license is copied below, and is also available with a FAQ at: +https://scripts.sil.org/OFL + + +----------------------------------------------------------- +SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +----------------------------------------------------------- + +PREAMBLE +The goals of the Open Font License (OFL) are to stimulate worldwide +development of collaborative font projects, to support the font creation +efforts of academic and linguistic communities, and to provide a free and +open framework in which fonts may be shared and improved in partnership +with others. + +The OFL allows the licensed fonts to be used, studied, modified and +redistributed freely as long as they are not sold by themselves. The +fonts, including any derivative works, can be bundled, embedded, +redistributed and/or sold with any software provided that any reserved +names are not used by derivative works. The fonts and derivatives, +however, cannot be released under any other type of license. The +requirement for fonts to remain under this license does not apply +to any document created using the fonts or their derivatives. + +DEFINITIONS +"Font Software" refers to the set of files released by the Copyright +Holder(s) under this license and clearly marked as such. This may +include source files, build scripts and documentation. + +"Reserved Font Name" refers to any names specified as such after the +copyright statement(s). + +"Original Version" refers to the collection of Font Software components as +distributed by the Copyright Holder(s). + +"Modified Version" refers to any derivative made by adding to, deleting, +or substituting -- in part or in whole -- any of the components of the +Original Version, by changing formats or by porting the Font Software to a +new environment. + +"Author" refers to any designer, engineer, programmer, technical +writer or other person who contributed to the Font Software. + +PERMISSION & CONDITIONS +Permission is hereby granted, free of charge, to any person obtaining +a copy of the Font Software, to use, study, copy, merge, embed, modify, +redistribute, and sell modified and unmodified copies of the Font +Software, subject to the following conditions: + +1) Neither the Font Software nor any of its individual components, +in Original or Modified Versions, may be sold by itself. + +2) Original or Modified Versions of the Font Software may be bundled, +redistributed and/or sold with any software, provided that each copy +contains the above copyright notice and this license. These can be +included either as stand-alone text files, human-readable headers or +in the appropriate machine-readable metadata fields within text or +binary files as long as those fields can be easily viewed by the user. + +3) No Modified Version of the Font Software may use the Reserved Font +Name(s) unless explicit written permission is granted by the corresponding +Copyright Holder. This restriction only applies to the primary font name as +presented to the users. + +4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font +Software shall not be used to promote, endorse or advertise any +Modified Version, except to acknowledge the contribution(s) of the +Copyright Holder(s) and the Author(s) or with their explicit written +permission. + +5) The Font Software, modified or unmodified, in part or in whole, +must be distributed entirely under this license, and must not be +distributed under any other license. The requirement for fonts to +remain under this license does not apply to any document created +using the Font Software. + +TERMINATION +This license becomes null and void if any of the above conditions are +not met. + +DISCLAIMER +THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT +OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE +COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL +DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM +OTHER DEALINGS IN THE FONT SOFTWARE. diff --git a/assets/fonts/JetBrainsMono-Medium.ttf b/assets/fonts/JetBrainsMono-Medium.ttf new file mode 100644 index 0000000..9767115 Binary files /dev/null and b/assets/fonts/JetBrainsMono-Medium.ttf differ diff --git a/assets/fonts/JetBrainsMono-Regular.ttf b/assets/fonts/JetBrainsMono-Regular.ttf new file mode 100644 index 0000000..dff66cc Binary files /dev/null and b/assets/fonts/JetBrainsMono-Regular.ttf differ diff --git a/assets/icons/LICENSE b/assets/icons/LICENSE new file mode 100644 index 0000000..718bb3f --- /dev/null +++ b/assets/icons/LICENSE @@ -0,0 +1,43 @@ +ISC License + +Copyright (c) 2026 Lucide Icons and Contributors + +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF +OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + +--- + +The following Lucide icons are derived from the Feather project: + +airplay, alert-circle, alert-octagon, alert-triangle, aperture, arrow-down-circle, arrow-down-left, arrow-down-right, arrow-down, arrow-left-circle, arrow-left, arrow-right-circle, arrow-right, arrow-up-circle, arrow-up-left, arrow-up-right, arrow-up, at-sign, calendar, cast, check, chevron-down, chevron-left, chevron-right, chevron-up, chevrons-down, chevrons-left, chevrons-right, chevrons-up, circle, clipboard, clock, code, columns, command, compass, corner-down-left, corner-down-right, corner-left-down, corner-left-up, corner-right-down, corner-right-up, corner-up-left, corner-up-right, crosshair, database, divide-circle, divide-square, dollar-sign, download, external-link, feather, frown, hash, headphones, help-circle, info, italic, key, layout, life-buoy, link-2, link, loader, lock, log-in, log-out, maximize, meh, minimize, minimize-2, minus-circle, minus-square, minus, monitor, moon, more-horizontal, more-vertical, move, music, navigation-2, navigation, octagon, pause-circle, percent, plus-circle, plus-square, plus, power, radio, rss, search, server, share, shopping-bag, sidebar, smartphone, smile, square, table-2, tablet, target, terminal, trash-2, trash, triangle, tv, type, upload, x-circle, x-octagon, x-square, x, zoom-in, zoom-out + +The MIT License (MIT) (for the icons listed above) + +Copyright (c) 2013-present Cole Bemis + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/assets/icons/accessibility.svg b/assets/icons/accessibility.svg new file mode 100644 index 0000000..397b14c --- /dev/null +++ b/assets/icons/accessibility.svg @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/assets/icons/activity.svg b/assets/icons/activity.svg new file mode 100644 index 0000000..40c92a8 --- /dev/null +++ b/assets/icons/activity.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/alarm-clock.svg b/assets/icons/alarm-clock.svg new file mode 100644 index 0000000..cc2e8c7 --- /dev/null +++ b/assets/icons/alarm-clock.svg @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/assets/icons/align-center.svg b/assets/icons/align-center.svg new file mode 100644 index 0000000..0e10220 --- /dev/null +++ b/assets/icons/align-center.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/align-left.svg b/assets/icons/align-left.svg new file mode 100644 index 0000000..a1eae4d --- /dev/null +++ b/assets/icons/align-left.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/align-right.svg b/assets/icons/align-right.svg new file mode 100644 index 0000000..4f3b86a --- /dev/null +++ b/assets/icons/align-right.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/archive.svg b/assets/icons/archive.svg new file mode 100644 index 0000000..3d6608e --- /dev/null +++ b/assets/icons/archive.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/arrow-down-left.svg b/assets/icons/arrow-down-left.svg new file mode 100644 index 0000000..8a321bb --- /dev/null +++ b/assets/icons/arrow-down-left.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/arrow-down-wide-narrow.svg b/assets/icons/arrow-down-wide-narrow.svg new file mode 100644 index 0000000..17eda4e --- /dev/null +++ b/assets/icons/arrow-down-wide-narrow.svg @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/assets/icons/arrow-down.svg b/assets/icons/arrow-down.svg new file mode 100644 index 0000000..5445d76 --- /dev/null +++ b/assets/icons/arrow-down.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/arrow-left.svg b/assets/icons/arrow-left.svg new file mode 100644 index 0000000..6e2984d --- /dev/null +++ b/assets/icons/arrow-left.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/arrow-right.svg b/assets/icons/arrow-right.svg new file mode 100644 index 0000000..55e5564 --- /dev/null +++ b/assets/icons/arrow-right.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/arrow-up-narrow-wide.svg b/assets/icons/arrow-up-narrow-wide.svg new file mode 100644 index 0000000..5c74158 --- /dev/null +++ b/assets/icons/arrow-up-narrow-wide.svg @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/assets/icons/arrow-up-right.svg b/assets/icons/arrow-up-right.svg new file mode 100644 index 0000000..a0b9c29 --- /dev/null +++ b/assets/icons/arrow-up-right.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/arrow-up.svg b/assets/icons/arrow-up.svg new file mode 100644 index 0000000..82e0740 --- /dev/null +++ b/assets/icons/arrow-up.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/at-sign.svg b/assets/icons/at-sign.svg new file mode 100644 index 0000000..76bda43 --- /dev/null +++ b/assets/icons/at-sign.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/battery.svg b/assets/icons/battery.svg new file mode 100644 index 0000000..c97d260 --- /dev/null +++ b/assets/icons/battery.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/bell.svg b/assets/icons/bell.svg new file mode 100644 index 0000000..a58ca12 --- /dev/null +++ b/assets/icons/bell.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/bold.svg b/assets/icons/bold.svg new file mode 100644 index 0000000..45042cf --- /dev/null +++ b/assets/icons/bold.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/book-open.svg b/assets/icons/book-open.svg new file mode 100644 index 0000000..06fcc64 --- /dev/null +++ b/assets/icons/book-open.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/bookmark.svg b/assets/icons/bookmark.svg new file mode 100644 index 0000000..3ecf52e --- /dev/null +++ b/assets/icons/bookmark.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/bot.svg b/assets/icons/bot.svg new file mode 100644 index 0000000..3982627 --- /dev/null +++ b/assets/icons/bot.svg @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/assets/icons/box.svg b/assets/icons/box.svg new file mode 100644 index 0000000..1f73989 --- /dev/null +++ b/assets/icons/box.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/brush.svg b/assets/icons/brush.svg new file mode 100644 index 0000000..ba9b72a --- /dev/null +++ b/assets/icons/brush.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/bug.svg b/assets/icons/bug.svg new file mode 100644 index 0000000..734c904 --- /dev/null +++ b/assets/icons/bug.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + diff --git a/assets/icons/calendar-days.svg b/assets/icons/calendar-days.svg new file mode 100644 index 0000000..ce7fb8e --- /dev/null +++ b/assets/icons/calendar-days.svg @@ -0,0 +1,24 @@ + + + + + + + + + + + + + diff --git a/assets/icons/calendar-range.svg b/assets/icons/calendar-range.svg new file mode 100644 index 0000000..be43256 --- /dev/null +++ b/assets/icons/calendar-range.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + diff --git a/assets/icons/calendar.svg b/assets/icons/calendar.svg new file mode 100644 index 0000000..11d94b9 --- /dev/null +++ b/assets/icons/calendar.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/chart-bar.svg b/assets/icons/chart-bar.svg new file mode 100644 index 0000000..620e3a8 --- /dev/null +++ b/assets/icons/chart-bar.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/chart-candlestick.svg b/assets/icons/chart-candlestick.svg new file mode 100644 index 0000000..60dfc88 --- /dev/null +++ b/assets/icons/chart-candlestick.svg @@ -0,0 +1,21 @@ + + + + + + + + + + diff --git a/assets/icons/chart-line.svg b/assets/icons/chart-line.svg new file mode 100644 index 0000000..ef0b602 --- /dev/null +++ b/assets/icons/chart-line.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/chart-pie.svg b/assets/icons/chart-pie.svg new file mode 100644 index 0000000..0bb5b12 --- /dev/null +++ b/assets/icons/chart-pie.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/check-check.svg b/assets/icons/check-check.svg new file mode 100644 index 0000000..68c96cc --- /dev/null +++ b/assets/icons/check-check.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/check.svg b/assets/icons/check.svg new file mode 100644 index 0000000..9c50c69 --- /dev/null +++ b/assets/icons/check.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/chevron-down.svg b/assets/icons/chevron-down.svg new file mode 100644 index 0000000..a5f3545 --- /dev/null +++ b/assets/icons/chevron-down.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/chevron-left.svg b/assets/icons/chevron-left.svg new file mode 100644 index 0000000..f7d5355 --- /dev/null +++ b/assets/icons/chevron-left.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/chevron-right.svg b/assets/icons/chevron-right.svg new file mode 100644 index 0000000..fcc78d5 --- /dev/null +++ b/assets/icons/chevron-right.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/chevron-up.svg b/assets/icons/chevron-up.svg new file mode 100644 index 0000000..3f66b33 --- /dev/null +++ b/assets/icons/chevron-up.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/chevrons-left.svg b/assets/icons/chevrons-left.svg new file mode 100644 index 0000000..369b643 --- /dev/null +++ b/assets/icons/chevrons-left.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/chevrons-right.svg b/assets/icons/chevrons-right.svg new file mode 100644 index 0000000..588a390 --- /dev/null +++ b/assets/icons/chevrons-right.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/chevrons-up-down.svg b/assets/icons/chevrons-up-down.svg new file mode 100644 index 0000000..2578426 --- /dev/null +++ b/assets/icons/chevrons-up-down.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/circle-alert.svg b/assets/icons/circle-alert.svg new file mode 100644 index 0000000..3f59b64 --- /dev/null +++ b/assets/icons/circle-alert.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/circle-check.svg b/assets/icons/circle-check.svg new file mode 100644 index 0000000..94eaf2b --- /dev/null +++ b/assets/icons/circle-check.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/circle-dot.svg b/assets/icons/circle-dot.svg new file mode 100644 index 0000000..574a826 --- /dev/null +++ b/assets/icons/circle-dot.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/circle-help.svg b/assets/icons/circle-help.svg new file mode 100644 index 0000000..23e854a --- /dev/null +++ b/assets/icons/circle-help.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/circle-pause.svg b/assets/icons/circle-pause.svg new file mode 100644 index 0000000..d28faa0 --- /dev/null +++ b/assets/icons/circle-pause.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/circle-stop.svg b/assets/icons/circle-stop.svg new file mode 100644 index 0000000..0133098 --- /dev/null +++ b/assets/icons/circle-stop.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/circle-x.svg b/assets/icons/circle-x.svg new file mode 100644 index 0000000..8544386 --- /dev/null +++ b/assets/icons/circle-x.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/circle.svg b/assets/icons/circle.svg new file mode 100644 index 0000000..c2ac889 --- /dev/null +++ b/assets/icons/circle.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/clipboard-check.svg b/assets/icons/clipboard-check.svg new file mode 100644 index 0000000..b75133c --- /dev/null +++ b/assets/icons/clipboard-check.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/clipboard.svg b/assets/icons/clipboard.svg new file mode 100644 index 0000000..c2d3e6e --- /dev/null +++ b/assets/icons/clipboard.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/clock.svg b/assets/icons/clock.svg new file mode 100644 index 0000000..8d583d9 --- /dev/null +++ b/assets/icons/clock.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/cloud-off.svg b/assets/icons/cloud-off.svg new file mode 100644 index 0000000..d003f89 --- /dev/null +++ b/assets/icons/cloud-off.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/cloud.svg b/assets/icons/cloud.svg new file mode 100644 index 0000000..356bf99 --- /dev/null +++ b/assets/icons/cloud.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/code.svg b/assets/icons/code.svg new file mode 100644 index 0000000..2b7e4ff --- /dev/null +++ b/assets/icons/code.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/command.svg b/assets/icons/command.svg new file mode 100644 index 0000000..4c999aa --- /dev/null +++ b/assets/icons/command.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/compass.svg b/assets/icons/compass.svg new file mode 100644 index 0000000..7b4a86a --- /dev/null +++ b/assets/icons/compass.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/contrast.svg b/assets/icons/contrast.svg new file mode 100644 index 0000000..f7b93d5 --- /dev/null +++ b/assets/icons/contrast.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/copy.svg b/assets/icons/copy.svg new file mode 100644 index 0000000..4aa1bd2 --- /dev/null +++ b/assets/icons/copy.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/cpu.svg b/assets/icons/cpu.svg new file mode 100644 index 0000000..ce585fa --- /dev/null +++ b/assets/icons/cpu.svg @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + diff --git a/assets/icons/credit-card.svg b/assets/icons/credit-card.svg new file mode 100644 index 0000000..a57bba5 --- /dev/null +++ b/assets/icons/credit-card.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/crop.svg b/assets/icons/crop.svg new file mode 100644 index 0000000..39e18e5 --- /dev/null +++ b/assets/icons/crop.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/crosshair.svg b/assets/icons/crosshair.svg new file mode 100644 index 0000000..c272838 --- /dev/null +++ b/assets/icons/crosshair.svg @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/assets/icons/database.svg b/assets/icons/database.svg new file mode 100644 index 0000000..61c65a2 --- /dev/null +++ b/assets/icons/database.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/dollar-sign.svg b/assets/icons/dollar-sign.svg new file mode 100644 index 0000000..fbad50f --- /dev/null +++ b/assets/icons/dollar-sign.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/dot.svg b/assets/icons/dot.svg new file mode 100644 index 0000000..963f789 --- /dev/null +++ b/assets/icons/dot.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/download.svg b/assets/icons/download.svg new file mode 100644 index 0000000..0db2389 --- /dev/null +++ b/assets/icons/download.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/ellipsis-vertical.svg b/assets/icons/ellipsis-vertical.svg new file mode 100644 index 0000000..2a7bafe --- /dev/null +++ b/assets/icons/ellipsis-vertical.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/ellipsis.svg b/assets/icons/ellipsis.svg new file mode 100644 index 0000000..6b61d7f --- /dev/null +++ b/assets/icons/ellipsis.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/eraser.svg b/assets/icons/eraser.svg new file mode 100644 index 0000000..3310a08 --- /dev/null +++ b/assets/icons/eraser.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/external-link.svg b/assets/icons/external-link.svg new file mode 100644 index 0000000..78af062 --- /dev/null +++ b/assets/icons/external-link.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/eye-off.svg b/assets/icons/eye-off.svg new file mode 100644 index 0000000..faa83a8 --- /dev/null +++ b/assets/icons/eye-off.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/eye.svg b/assets/icons/eye.svg new file mode 100644 index 0000000..4d16d9d --- /dev/null +++ b/assets/icons/eye.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/file-plus.svg b/assets/icons/file-plus.svg new file mode 100644 index 0000000..4ba7468 --- /dev/null +++ b/assets/icons/file-plus.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/file-text.svg b/assets/icons/file-text.svg new file mode 100644 index 0000000..e3efa62 --- /dev/null +++ b/assets/icons/file-text.svg @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/assets/icons/file.svg b/assets/icons/file.svg new file mode 100644 index 0000000..5d91e41 --- /dev/null +++ b/assets/icons/file.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/filter.svg b/assets/icons/filter.svg new file mode 100644 index 0000000..07ec25c --- /dev/null +++ b/assets/icons/filter.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/fingerprint.svg b/assets/icons/fingerprint.svg new file mode 100644 index 0000000..47959b5 --- /dev/null +++ b/assets/icons/fingerprint.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + diff --git a/assets/icons/flag.svg b/assets/icons/flag.svg new file mode 100644 index 0000000..09b415c --- /dev/null +++ b/assets/icons/flag.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/folder-open.svg b/assets/icons/folder-open.svg new file mode 100644 index 0000000..b454302 --- /dev/null +++ b/assets/icons/folder-open.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/folder-plus.svg b/assets/icons/folder-plus.svg new file mode 100644 index 0000000..a28ff62 --- /dev/null +++ b/assets/icons/folder-plus.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/folder.svg b/assets/icons/folder.svg new file mode 100644 index 0000000..3ac458d --- /dev/null +++ b/assets/icons/folder.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/forward.svg b/assets/icons/forward.svg new file mode 100644 index 0000000..efa038c --- /dev/null +++ b/assets/icons/forward.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/frame.svg b/assets/icons/frame.svg new file mode 100644 index 0000000..66babc7 --- /dev/null +++ b/assets/icons/frame.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/gauge.svg b/assets/icons/gauge.svg new file mode 100644 index 0000000..b373fd6 --- /dev/null +++ b/assets/icons/gauge.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/git-branch.svg b/assets/icons/git-branch.svg new file mode 100644 index 0000000..0229c0d --- /dev/null +++ b/assets/icons/git-branch.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/git-commit-horizontal.svg b/assets/icons/git-commit-horizontal.svg new file mode 100644 index 0000000..48d72b9 --- /dev/null +++ b/assets/icons/git-commit-horizontal.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/git-merge.svg b/assets/icons/git-merge.svg new file mode 100644 index 0000000..38435d0 --- /dev/null +++ b/assets/icons/git-merge.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/git-pull-request.svg b/assets/icons/git-pull-request.svg new file mode 100644 index 0000000..dec747f --- /dev/null +++ b/assets/icons/git-pull-request.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/globe.svg b/assets/icons/globe.svg new file mode 100644 index 0000000..88e764f --- /dev/null +++ b/assets/icons/globe.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/grip-horizontal.svg b/assets/icons/grip-horizontal.svg new file mode 100644 index 0000000..be78fe2 --- /dev/null +++ b/assets/icons/grip-horizontal.svg @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/assets/icons/grip-vertical.svg b/assets/icons/grip-vertical.svg new file mode 100644 index 0000000..5fcf574 --- /dev/null +++ b/assets/icons/grip-vertical.svg @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/assets/icons/hand.svg b/assets/icons/hand.svg new file mode 100644 index 0000000..46212f9 --- /dev/null +++ b/assets/icons/hand.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/hard-drive.svg b/assets/icons/hard-drive.svg new file mode 100644 index 0000000..99c24bf --- /dev/null +++ b/assets/icons/hard-drive.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/hash.svg b/assets/icons/hash.svg new file mode 100644 index 0000000..8587430 --- /dev/null +++ b/assets/icons/hash.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/heading.svg b/assets/icons/heading.svg new file mode 100644 index 0000000..050bc31 --- /dev/null +++ b/assets/icons/heading.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/heart.svg b/assets/icons/heart.svg new file mode 100644 index 0000000..60534cb --- /dev/null +++ b/assets/icons/heart.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/history.svg b/assets/icons/history.svg new file mode 100644 index 0000000..e85090b --- /dev/null +++ b/assets/icons/history.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/hourglass.svg b/assets/icons/hourglass.svg new file mode 100644 index 0000000..63695b4 --- /dev/null +++ b/assets/icons/hourglass.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/house.svg b/assets/icons/house.svg new file mode 100644 index 0000000..4ec24cb --- /dev/null +++ b/assets/icons/house.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/image.svg b/assets/icons/image.svg new file mode 100644 index 0000000..8b73389 --- /dev/null +++ b/assets/icons/image.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/inbox.svg b/assets/icons/inbox.svg new file mode 100644 index 0000000..cc49bd6 --- /dev/null +++ b/assets/icons/inbox.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/info.svg b/assets/icons/info.svg new file mode 100644 index 0000000..c158e13 --- /dev/null +++ b/assets/icons/info.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/italic.svg b/assets/icons/italic.svg new file mode 100644 index 0000000..61d76d5 --- /dev/null +++ b/assets/icons/italic.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/kanban.svg b/assets/icons/kanban.svg new file mode 100644 index 0000000..76e94d1 --- /dev/null +++ b/assets/icons/kanban.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/key.svg b/assets/icons/key.svg new file mode 100644 index 0000000..2e9c2b8 --- /dev/null +++ b/assets/icons/key.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/keyboard.svg b/assets/icons/keyboard.svg new file mode 100644 index 0000000..c38c84e --- /dev/null +++ b/assets/icons/keyboard.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + diff --git a/assets/icons/languages.svg b/assets/icons/languages.svg new file mode 100644 index 0000000..6397512 --- /dev/null +++ b/assets/icons/languages.svg @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/assets/icons/layers.svg b/assets/icons/layers.svg new file mode 100644 index 0000000..667affe --- /dev/null +++ b/assets/icons/layers.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/layout-dashboard.svg b/assets/icons/layout-dashboard.svg new file mode 100644 index 0000000..17620aa --- /dev/null +++ b/assets/icons/layout-dashboard.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/layout-grid.svg b/assets/icons/layout-grid.svg new file mode 100644 index 0000000..5ce0c7c --- /dev/null +++ b/assets/icons/layout-grid.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/library.svg b/assets/icons/library.svg new file mode 100644 index 0000000..4799566 --- /dev/null +++ b/assets/icons/library.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/lightbulb.svg b/assets/icons/lightbulb.svg new file mode 100644 index 0000000..ffe63b4 --- /dev/null +++ b/assets/icons/lightbulb.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/link.svg b/assets/icons/link.svg new file mode 100644 index 0000000..91b3573 --- /dev/null +++ b/assets/icons/link.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/list-checks.svg b/assets/icons/list-checks.svg new file mode 100644 index 0000000..92d9c58 --- /dev/null +++ b/assets/icons/list-checks.svg @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/assets/icons/list-ordered.svg b/assets/icons/list-ordered.svg new file mode 100644 index 0000000..ae3570d --- /dev/null +++ b/assets/icons/list-ordered.svg @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/assets/icons/list-todo.svg b/assets/icons/list-todo.svg new file mode 100644 index 0000000..9ef7fda --- /dev/null +++ b/assets/icons/list-todo.svg @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/assets/icons/list.svg b/assets/icons/list.svg new file mode 100644 index 0000000..559888b --- /dev/null +++ b/assets/icons/list.svg @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/assets/icons/loader-circle.svg b/assets/icons/loader-circle.svg new file mode 100644 index 0000000..e957323 --- /dev/null +++ b/assets/icons/loader-circle.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/lock-open.svg b/assets/icons/lock-open.svg new file mode 100644 index 0000000..46c368e --- /dev/null +++ b/assets/icons/lock-open.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/lock.svg b/assets/icons/lock.svg new file mode 100644 index 0000000..e3303b9 --- /dev/null +++ b/assets/icons/lock.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/log-in.svg b/assets/icons/log-in.svg new file mode 100644 index 0000000..eb003f3 --- /dev/null +++ b/assets/icons/log-in.svg @@ -0,0 +1,17 @@ + + diff --git a/assets/icons/log-out.svg b/assets/icons/log-out.svg new file mode 100644 index 0000000..7796c51 --- /dev/null +++ b/assets/icons/log-out.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/mail.svg b/assets/icons/mail.svg new file mode 100644 index 0000000..0bf0558 --- /dev/null +++ b/assets/icons/mail.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/map-pin.svg b/assets/icons/map-pin.svg new file mode 100644 index 0000000..b2f7b66 --- /dev/null +++ b/assets/icons/map-pin.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/map.svg b/assets/icons/map.svg new file mode 100644 index 0000000..f363059 --- /dev/null +++ b/assets/icons/map.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/maximize-2.svg b/assets/icons/maximize-2.svg new file mode 100644 index 0000000..f9c5a65 --- /dev/null +++ b/assets/icons/maximize-2.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/memory-stick.svg b/assets/icons/memory-stick.svg new file mode 100644 index 0000000..32c9e6a --- /dev/null +++ b/assets/icons/memory-stick.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + diff --git a/assets/icons/menu.svg b/assets/icons/menu.svg new file mode 100644 index 0000000..96b27f3 --- /dev/null +++ b/assets/icons/menu.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/message-square.svg b/assets/icons/message-square.svg new file mode 100644 index 0000000..b477873 --- /dev/null +++ b/assets/icons/message-square.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/mic-off.svg b/assets/icons/mic-off.svg new file mode 100644 index 0000000..02fd7d3 --- /dev/null +++ b/assets/icons/mic-off.svg @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/assets/icons/mic.svg b/assets/icons/mic.svg new file mode 100644 index 0000000..472ca06 --- /dev/null +++ b/assets/icons/mic.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/minimize-2.svg b/assets/icons/minimize-2.svg new file mode 100644 index 0000000..81140c9 --- /dev/null +++ b/assets/icons/minimize-2.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/minus.svg b/assets/icons/minus.svg new file mode 100644 index 0000000..c59db61 --- /dev/null +++ b/assets/icons/minus.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/monitor.svg b/assets/icons/monitor.svg new file mode 100644 index 0000000..da4c924 --- /dev/null +++ b/assets/icons/monitor.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/moon.svg b/assets/icons/moon.svg new file mode 100644 index 0000000..c0f8e8c --- /dev/null +++ b/assets/icons/moon.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/mouse-pointer-2.svg b/assets/icons/mouse-pointer-2.svg new file mode 100644 index 0000000..28e5446 --- /dev/null +++ b/assets/icons/mouse-pointer-2.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/move.svg b/assets/icons/move.svg new file mode 100644 index 0000000..5c31d17 --- /dev/null +++ b/assets/icons/move.svg @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/assets/icons/network.svg b/assets/icons/network.svg new file mode 100644 index 0000000..0f15206 --- /dev/null +++ b/assets/icons/network.svg @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/assets/icons/notebook-pen.svg b/assets/icons/notebook-pen.svg new file mode 100644 index 0000000..d687453 --- /dev/null +++ b/assets/icons/notebook-pen.svg @@ -0,0 +1,20 @@ + + + + + + + + + diff --git a/assets/icons/package.svg b/assets/icons/package.svg new file mode 100644 index 0000000..6c8abef --- /dev/null +++ b/assets/icons/package.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/palette.svg b/assets/icons/palette.svg new file mode 100644 index 0000000..4044dcb --- /dev/null +++ b/assets/icons/palette.svg @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/assets/icons/panel-bottom.svg b/assets/icons/panel-bottom.svg new file mode 100644 index 0000000..d0947ea --- /dev/null +++ b/assets/icons/panel-bottom.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/panel-left.svg b/assets/icons/panel-left.svg new file mode 100644 index 0000000..90e5073 --- /dev/null +++ b/assets/icons/panel-left.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/panel-right.svg b/assets/icons/panel-right.svg new file mode 100644 index 0000000..41cb2d6 --- /dev/null +++ b/assets/icons/panel-right.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/paperclip.svg b/assets/icons/paperclip.svg new file mode 100644 index 0000000..e867ae8 --- /dev/null +++ b/assets/icons/paperclip.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/pause.svg b/assets/icons/pause.svg new file mode 100644 index 0000000..2ad3d95 --- /dev/null +++ b/assets/icons/pause.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/pen-tool.svg b/assets/icons/pen-tool.svg new file mode 100644 index 0000000..6d056a0 --- /dev/null +++ b/assets/icons/pen-tool.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/pencil.svg b/assets/icons/pencil.svg new file mode 100644 index 0000000..ccfea63 --- /dev/null +++ b/assets/icons/pencil.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/phone-off.svg b/assets/icons/phone-off.svg new file mode 100644 index 0000000..0a94ac2 --- /dev/null +++ b/assets/icons/phone-off.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/phone.svg b/assets/icons/phone.svg new file mode 100644 index 0000000..83e22db --- /dev/null +++ b/assets/icons/phone.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/pin-off.svg b/assets/icons/pin-off.svg new file mode 100644 index 0000000..9570581 --- /dev/null +++ b/assets/icons/pin-off.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/pin.svg b/assets/icons/pin.svg new file mode 100644 index 0000000..97b7130 --- /dev/null +++ b/assets/icons/pin.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/play.svg b/assets/icons/play.svg new file mode 100644 index 0000000..c2ef3e2 --- /dev/null +++ b/assets/icons/play.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/plus.svg b/assets/icons/plus.svg new file mode 100644 index 0000000..d3cd0a3 --- /dev/null +++ b/assets/icons/plus.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/power.svg b/assets/icons/power.svg new file mode 100644 index 0000000..f12f8ee --- /dev/null +++ b/assets/icons/power.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/printer.svg b/assets/icons/printer.svg new file mode 100644 index 0000000..4ea72f5 --- /dev/null +++ b/assets/icons/printer.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/puzzle.svg b/assets/icons/puzzle.svg new file mode 100644 index 0000000..51a2b28 --- /dev/null +++ b/assets/icons/puzzle.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/quote.svg b/assets/icons/quote.svg new file mode 100644 index 0000000..d463663 --- /dev/null +++ b/assets/icons/quote.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/redo-2.svg b/assets/icons/redo-2.svg new file mode 100644 index 0000000..f8c1fe3 --- /dev/null +++ b/assets/icons/redo-2.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/refresh-cw.svg b/assets/icons/refresh-cw.svg new file mode 100644 index 0000000..c083047 --- /dev/null +++ b/assets/icons/refresh-cw.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/reply.svg b/assets/icons/reply.svg new file mode 100644 index 0000000..aa2eada --- /dev/null +++ b/assets/icons/reply.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/rocket.svg b/assets/icons/rocket.svg new file mode 100644 index 0000000..db44048 --- /dev/null +++ b/assets/icons/rocket.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/rotate-ccw.svg b/assets/icons/rotate-ccw.svg new file mode 100644 index 0000000..90a1d33 --- /dev/null +++ b/assets/icons/rotate-ccw.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/rotate-cw.svg b/assets/icons/rotate-cw.svg new file mode 100644 index 0000000..afa57c5 --- /dev/null +++ b/assets/icons/rotate-cw.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/save.svg b/assets/icons/save.svg new file mode 100644 index 0000000..d67d9de --- /dev/null +++ b/assets/icons/save.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/scissors.svg b/assets/icons/scissors.svg new file mode 100644 index 0000000..810404c --- /dev/null +++ b/assets/icons/scissors.svg @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/assets/icons/search.svg b/assets/icons/search.svg new file mode 100644 index 0000000..ba16b99 --- /dev/null +++ b/assets/icons/search.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/send.svg b/assets/icons/send.svg new file mode 100644 index 0000000..bfdb69c --- /dev/null +++ b/assets/icons/send.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/server.svg b/assets/icons/server.svg new file mode 100644 index 0000000..db7f2cc --- /dev/null +++ b/assets/icons/server.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/settings.svg b/assets/icons/settings.svg new file mode 100644 index 0000000..e23730e --- /dev/null +++ b/assets/icons/settings.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/shapes.svg b/assets/icons/shapes.svg new file mode 100644 index 0000000..c0dc337 --- /dev/null +++ b/assets/icons/shapes.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/share-2.svg b/assets/icons/share-2.svg new file mode 100644 index 0000000..2ef0696 --- /dev/null +++ b/assets/icons/share-2.svg @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/assets/icons/shield.svg b/assets/icons/shield.svg new file mode 100644 index 0000000..4d256a3 --- /dev/null +++ b/assets/icons/shield.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/skip-back.svg b/assets/icons/skip-back.svg new file mode 100644 index 0000000..118f677 --- /dev/null +++ b/assets/icons/skip-back.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/skip-forward.svg b/assets/icons/skip-forward.svg new file mode 100644 index 0000000..b8f9147 --- /dev/null +++ b/assets/icons/skip-forward.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/sliders-horizontal.svg b/assets/icons/sliders-horizontal.svg new file mode 100644 index 0000000..8241295 --- /dev/null +++ b/assets/icons/sliders-horizontal.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + diff --git a/assets/icons/smartphone.svg b/assets/icons/smartphone.svg new file mode 100644 index 0000000..3aa9411 --- /dev/null +++ b/assets/icons/smartphone.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/smile.svg b/assets/icons/smile.svg new file mode 100644 index 0000000..f61140d --- /dev/null +++ b/assets/icons/smile.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/sparkles.svg b/assets/icons/sparkles.svg new file mode 100644 index 0000000..e13154b --- /dev/null +++ b/assets/icons/sparkles.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/spline.svg b/assets/icons/spline.svg new file mode 100644 index 0000000..3e7994e --- /dev/null +++ b/assets/icons/spline.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/square-check.svg b/assets/icons/square-check.svg new file mode 100644 index 0000000..9a9e08f --- /dev/null +++ b/assets/icons/square-check.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/square.svg b/assets/icons/square.svg new file mode 100644 index 0000000..8df41cd --- /dev/null +++ b/assets/icons/square.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/star.svg b/assets/icons/star.svg new file mode 100644 index 0000000..3f05f7b --- /dev/null +++ b/assets/icons/star.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/step-forward.svg b/assets/icons/step-forward.svg new file mode 100644 index 0000000..efc3b38 --- /dev/null +++ b/assets/icons/step-forward.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/strikethrough.svg b/assets/icons/strikethrough.svg new file mode 100644 index 0000000..9bef2ef --- /dev/null +++ b/assets/icons/strikethrough.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/sun.svg b/assets/icons/sun.svg new file mode 100644 index 0000000..5644b61 --- /dev/null +++ b/assets/icons/sun.svg @@ -0,0 +1,23 @@ + + + + + + + + + + + + diff --git a/assets/icons/table.svg b/assets/icons/table.svg new file mode 100644 index 0000000..57a8bb9 --- /dev/null +++ b/assets/icons/table.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/tag.svg b/assets/icons/tag.svg new file mode 100644 index 0000000..34e20b3 --- /dev/null +++ b/assets/icons/tag.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/target.svg b/assets/icons/target.svg new file mode 100644 index 0000000..7dea02e --- /dev/null +++ b/assets/icons/target.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/terminal.svg b/assets/icons/terminal.svg new file mode 100644 index 0000000..cc21fae --- /dev/null +++ b/assets/icons/terminal.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/thumbs-down.svg b/assets/icons/thumbs-down.svg new file mode 100644 index 0000000..c8266cf --- /dev/null +++ b/assets/icons/thumbs-down.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/thumbs-up.svg b/assets/icons/thumbs-up.svg new file mode 100644 index 0000000..1a824b5 --- /dev/null +++ b/assets/icons/thumbs-up.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/timer.svg b/assets/icons/timer.svg new file mode 100644 index 0000000..4c8c252 --- /dev/null +++ b/assets/icons/timer.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/trash-2.svg b/assets/icons/trash-2.svg new file mode 100644 index 0000000..a276e0b --- /dev/null +++ b/assets/icons/trash-2.svg @@ -0,0 +1,19 @@ + + + + + + + + diff --git a/assets/icons/trending-down.svg b/assets/icons/trending-down.svg new file mode 100644 index 0000000..774e636 --- /dev/null +++ b/assets/icons/trending-down.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/trending-up.svg b/assets/icons/trending-up.svg new file mode 100644 index 0000000..c5664b1 --- /dev/null +++ b/assets/icons/trending-up.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/triangle-alert.svg b/assets/icons/triangle-alert.svg new file mode 100644 index 0000000..18af8cd --- /dev/null +++ b/assets/icons/triangle-alert.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/type.svg b/assets/icons/type.svg new file mode 100644 index 0000000..eaf86aa --- /dev/null +++ b/assets/icons/type.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/underline.svg b/assets/icons/underline.svg new file mode 100644 index 0000000..f34b498 --- /dev/null +++ b/assets/icons/underline.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/undo-2.svg b/assets/icons/undo-2.svg new file mode 100644 index 0000000..d4e9ca5 --- /dev/null +++ b/assets/icons/undo-2.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/upload.svg b/assets/icons/upload.svg new file mode 100644 index 0000000..cd69186 --- /dev/null +++ b/assets/icons/upload.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/user.svg b/assets/icons/user.svg new file mode 100644 index 0000000..b020953 --- /dev/null +++ b/assets/icons/user.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/users.svg b/assets/icons/users.svg new file mode 100644 index 0000000..9d8738d --- /dev/null +++ b/assets/icons/users.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/video-off.svg b/assets/icons/video-off.svg new file mode 100644 index 0000000..9ef415e --- /dev/null +++ b/assets/icons/video-off.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/video.svg b/assets/icons/video.svg new file mode 100644 index 0000000..2b21175 --- /dev/null +++ b/assets/icons/video.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/volume-2.svg b/assets/icons/volume-2.svg new file mode 100644 index 0000000..d5299e4 --- /dev/null +++ b/assets/icons/volume-2.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/volume-x.svg b/assets/icons/volume-x.svg new file mode 100644 index 0000000..3fe57ce --- /dev/null +++ b/assets/icons/volume-x.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/assets/icons/wallet.svg b/assets/icons/wallet.svg new file mode 100644 index 0000000..97782f9 --- /dev/null +++ b/assets/icons/wallet.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/wand-sparkles.svg b/assets/icons/wand-sparkles.svg new file mode 100644 index 0000000..053a168 --- /dev/null +++ b/assets/icons/wand-sparkles.svg @@ -0,0 +1,22 @@ + + + + + + + + + + + diff --git a/assets/icons/wifi-off.svg b/assets/icons/wifi-off.svg new file mode 100644 index 0000000..1c18dd3 --- /dev/null +++ b/assets/icons/wifi-off.svg @@ -0,0 +1,21 @@ + + + + + + + + + + diff --git a/assets/icons/wifi.svg b/assets/icons/wifi.svg new file mode 100644 index 0000000..6008548 --- /dev/null +++ b/assets/icons/wifi.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/x.svg b/assets/icons/x.svg new file mode 100644 index 0000000..7b9f74b --- /dev/null +++ b/assets/icons/x.svg @@ -0,0 +1,16 @@ + + + + + diff --git a/assets/icons/zap.svg b/assets/icons/zap.svg new file mode 100644 index 0000000..d983b50 --- /dev/null +++ b/assets/icons/zap.svg @@ -0,0 +1,15 @@ + + + + diff --git a/assets/icons/zoom-in.svg b/assets/icons/zoom-in.svg new file mode 100644 index 0000000..1d43681 --- /dev/null +++ b/assets/icons/zoom-in.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/assets/icons/zoom-out.svg b/assets/icons/zoom-out.svg new file mode 100644 index 0000000..7eb78a1 --- /dev/null +++ b/assets/icons/zoom-out.svg @@ -0,0 +1,17 @@ + + + + + + diff --git a/examples/gallery/capture.rs b/examples/gallery/capture.rs new file mode 100644 index 0000000..55e3e3d --- /dev/null +++ b/examples/gallery/capture.rs @@ -0,0 +1,132 @@ +use std::{ + path::{Path, PathBuf}, + time::Duration, +}; + +use anyhow::{Context as _, Result, bail}; +use ely_gpui_component::theme::Theme; +use gpui::{App, AsyncApp, WindowHandle, px}; + +use crate::{ + pages, + shell::{Choice, Gallery}, +}; + +const SETTLE: Duration = Duration::from_millis(700); +const SCROLL_SETTLE: Duration = Duration::from_millis(250); + +/// Shoots every page in both modes, top to bottom, then quits. Exits 1 on failure. +pub fn run(window: WindowHandle, dir: PathBuf, cx: &mut App) { + Theme::update(cx, |theme| theme.reduced_motion = true); + cx.spawn(async move |cx| { + let outcome = shoot_all(window, &dir, cx).await; + if let Err(error) = outcome.and_then(|()| cx.update(|cx| cx.quit())) { + log::error!("capture failed: {error:#}"); + std::process::exit(1); + } + }) + .detach(); +} + +async fn shoot_all(window: WindowHandle, dir: &Path, cx: &mut AsyncApp) -> Result<()> { + std::fs::create_dir_all(dir).with_context(|| format!("create {}", dir.display()))?; + for (ix, page) in pages::ALL.iter().enumerate() { + for (choice, name) in [(Choice::Light, "light"), (Choice::Dark, "dark")] { + window.update(cx, |gallery, window, cx| { + gallery.select(ix, cx); + gallery.choose(choice, window, cx); + })?; + cx.background_executor().timer(SETTLE).await; + let (viewport, max) = window.update(cx, |gallery, _, _| gallery.scroll_extent())?; + if viewport <= px(0.0) { + bail!("page {} has no viewport", page.slug); + } + let mut offset = px(0.0); + for segment in 0.. { + let suffix = if segment == 0 { + String::new() + } else { + format!("-{segment}") + }; + let path = dir.join(format!("{}-{name}{suffix}.png", page.slug)); + snapshot(&path)?; + log::info!("capture: wrote {}", path.display()); + if offset >= max { + break; + } + offset = (offset + viewport).min(max); + window.update(cx, |gallery, _, cx| gallery.scroll_to(offset, cx))?; + cx.background_executor().timer(SCROLL_SETTLE).await; + } + } + } + Ok(()) +} + +#[cfg(target_os = "macos")] +fn snapshot(path: &Path) -> Result<()> { + use core_foundation::{ + base::{CFType, TCFType}, + dictionary::CFDictionary, + number::CFNumber, + string::CFString, + }; + use core_graphics::{ + geometry::{CGPoint, CGRect, CGSize}, + window, + }; + + let number = |dict: &CFDictionary, key: &'static str| { + dict.find(CFString::from_static_string(key)) + .and_then(|value| value.downcast::()) + .and_then(|value| value.to_i64()) + }; + let pid = i64::from(std::process::id()); + let list = window::copy_window_info( + window::kCGWindowListOptionOnScreenOnly, + window::kCGNullWindowID, + ) + .context("window list unavailable")?; + let id = list + .iter() + .map(|item| unsafe { CFDictionary::::wrap_under_get_rule(*item as _) }) + .find(|dict| number(dict, "kCGWindowOwnerPID") == Some(pid)) + .and_then(|dict| number(&dict, "kCGWindowNumber")) + .context("gallery window not on screen")?; + let image = window::create_image( + CGRect::new(&CGPoint::new(0.0, 0.0), &CGSize::new(0.0, 0.0)), + window::kCGWindowListOptionIncludingWindow, + id as u32, + window::kCGWindowImageBoundsIgnoreFraming | window::kCGWindowImageBestResolution, + ) + .context("window capture returned nothing")?; + if image.bits_per_pixel() != 32 { + bail!( + "unexpected capture format: {} bits per pixel", + image.bits_per_pixel() + ); + } + let (width, height, stride) = (image.width(), image.height(), image.bytes_per_row()); + let data = image.data(); + let bytes = data.bytes(); + let mut rgba = Vec::with_capacity(width * height * 4); + for y in 0..height { + for x in 0..width { + let i = y * stride + x * 4; + rgba.extend_from_slice(&[bytes[i + 2], bytes[i + 1], bytes[i], bytes[i + 3]]); + } + } + image::save_buffer( + path, + &rgba, + width as u32, + height as u32, + image::ColorType::Rgba8, + ) + .with_context(|| format!("write {}", path.display())) +} + +#[cfg(not(target_os = "macos"))] +fn snapshot(_: &Path) -> Result<()> { + bail!("capture needs macOS window APIs") +} diff --git a/examples/gallery/main.rs b/examples/gallery/main.rs new file mode 100644 index 0000000..a4977ce --- /dev/null +++ b/examples/gallery/main.rs @@ -0,0 +1,78 @@ +mod capture; +mod pages; +mod shell; +mod ui; + +use std::path::PathBuf; + +use anyhow::{Context as _, Result, bail}; +use ely_gpui_component::Assets; +use gpui::{ + App, AppContext, Application, Bounds, KeyBinding, TitlebarOptions, WindowBounds, WindowOptions, + actions, point, px, size, +}; + +actions!(gallery, [Quit, FocusNext, FocusPrev]); + +struct Args { + page: usize, + capture: Option, +} + +fn parse_args() -> Result { + let mut args = Args { + page: 0, + capture: None, + }; + let mut iter = std::env::args().skip(1); + while let Some(flag) = iter.next() { + let value = iter + .next() + .with_context(|| format!("{flag} needs a value"))?; + match flag.as_str() { + "--page" => { + args.page = pages::find(&value).with_context(|| format!("no page {value}"))? + } + "--capture" => args.capture = Some(PathBuf::from(value)), + other => bail!("unknown flag {other}"), + } + } + Ok(args) +} + +fn main() -> Result<()> { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); + let args = parse_args()?; + Application::new() + .with_assets(Assets) + .run(move |cx: &mut App| { + ely_gpui_component::init(cx); + cx.bind_keys([ + KeyBinding::new("cmd-q", Quit, None), + KeyBinding::new("tab", FocusNext, None), + KeyBinding::new("shift-tab", FocusPrev, None), + ]); + cx.on_action(|_: &Quit, cx| cx.quit()); + let bounds = Bounds::centered(None, size(px(1280.0), px(820.0)), cx); + let options = WindowOptions { + window_bounds: Some(WindowBounds::Windowed(bounds)), + titlebar: Some(TitlebarOptions { + title: Some("Ely".into()), + appears_transparent: true, + traffic_light_position: Some(point(px(16.0), px(18.0))), + }), + window_min_size: Some(size(px(880.0), px(560.0))), + ..Default::default() + }; + let window = cx + .open_window(options, |window, cx| { + cx.new(|cx| shell::Gallery::new(args.page, window, cx)) + }) + .expect("gallery window failed to open"); + cx.activate(true); + if let Some(dir) = args.capture { + capture::run(window, dir, cx); + } + }); + Ok(()) +} diff --git a/examples/gallery/pages/buttons.rs b/examples/gallery/pages/buttons.rs new file mode 100644 index 0000000..78c5649 --- /dev/null +++ b/examples/gallery/pages/buttons.rs @@ -0,0 +1,131 @@ +use ely_gpui_component::{ + buttons::{Button, ButtonVariant, IconButton}, + primitives::IconName, + theme::ControlSize, +}; +use gpui::{AnyElement, App, ElementId, IntoElement, ParentElement, Styled, Window, div}; + +use super::Page; +use crate::ui::{row, section, specimen, specimens}; + +pub const PAGE: Page = Page { + number: 5, + slug: "buttons", + title: "Buttons & Actions", + summary: "Seven variants, three sizes, one focus ring.", + render, +}; + +const VARIANTS: [(ButtonVariant, &str); 7] = [ + (ButtonVariant::Primary, "Primary"), + (ButtonVariant::Secondary, "Secondary"), + (ButtonVariant::Outline, "Outline"), + (ButtonVariant::Ghost, "Ghost"), + (ButtonVariant::Subtle, "Subtle"), + (ButtonVariant::Danger, "Danger"), + (ButtonVariant::Link, "Link"), +]; + +fn render(_: &mut Window, cx: &mut App) -> AnyElement { + let sizes = [ + (ControlSize::Sm, "Small"), + (ControlSize::Md, "Medium"), + (ControlSize::Lg, "Large"), + ]; + + div() + .child( + section("Button", "Primary is ink. Color is saved for meaning.", cx) + .child(row().children(VARIANTS.map(|(variant, name)| { + Button::new(name, name) + .variant(variant) + .on_click(move |_, _, _| log::info!("gallery: {name} clicked")) + }))) + .child(row().children(VARIANTS.map(|(variant, name)| { + Button::new(ElementId::Name(format!("{name}-off").into()), name) + .variant(variant) + .disabled(true) + }))), + ) + .child( + section( + "Sizes", + "Heights follow density. Tab moves the focus ring.", + cx, + ) + .child(row().children(sizes.map(|(size, name)| { + Button::new(ElementId::Name(format!("size-{name}").into()), name) + .primary() + .size(size) + }))), + ) + .child( + section( + "With icons", + "Leading icon for verbs. Trailing for menus.", + cx, + ) + .child( + row() + .child( + Button::new("new", "New file") + .primary() + .icon(IconName::Plus), + ) + .child(Button::new("share", "Share").icon(IconName::Share2)) + .child( + Button::new("sort", "Sort") + .variant(ButtonVariant::Ghost) + .trailing_icon(IconName::ChevronDown), + ) + .child( + Button::new("delete", "Delete") + .variant(ButtonVariant::Danger) + .icon(IconName::Trash2), + ), + ), + ) + .child( + section("Icon button", "Square. Ghost by default.", cx).child(specimens().children( + sizes.map(|(size, name)| { + specimen( + name, + row() + .gap_1() + .child( + IconButton::new( + ElementId::Name(format!("{name}-a").into()), + IconName::Bold, + ) + .size(size), + ) + .child( + IconButton::new( + ElementId::Name(format!("{name}-b").into()), + IconName::Italic, + ) + .size(size), + ) + .child( + IconButton::new( + ElementId::Name(format!("{name}-c").into()), + IconName::Underline, + ) + .size(size) + .variant(ButtonVariant::Subtle), + ) + .child( + IconButton::new( + ElementId::Name(format!("{name}-d").into()), + IconName::Link, + ) + .size(size) + .variant(ButtonVariant::Outline), + ), + cx, + ) + }), + )), + ) + .into_any_element() +} diff --git a/examples/gallery/pages/mod.rs b/examples/gallery/pages/mod.rs new file mode 100644 index 0000000..d0e5ebe --- /dev/null +++ b/examples/gallery/pages/mod.rs @@ -0,0 +1,19 @@ +mod buttons; +mod primitives; +mod theme; + +use gpui::{AnyElement, App, Window}; + +pub struct Page { + pub number: u8, + pub slug: &'static str, + pub title: &'static str, + pub summary: &'static str, + pub render: fn(&mut Window, &mut App) -> AnyElement, +} + +pub const ALL: &[Page] = &[primitives::PAGE, buttons::PAGE, theme::PAGE]; + +pub fn find(slug: &str) -> Option { + ALL.iter().position(|page| page.slug == slug) +} diff --git a/examples/gallery/pages/primitives.rs b/examples/gallery/pages/primitives.rs new file mode 100644 index 0000000..ac02b71 --- /dev/null +++ b/examples/gallery/pages/primitives.rs @@ -0,0 +1,73 @@ +use ely_gpui_component::{ + primitives::{Icon, IconName}, + theme::{ActiveTheme, IconSize}, +}; +use gpui::{AnyElement, App, InteractiveElement, IntoElement, ParentElement, Styled, Window, div}; + +use super::Page; +use crate::ui::{section, specimen, specimens}; + +pub const PAGE: Page = Page { + number: 1, + slug: "primitives", + title: "Primitives", + summary: "The smallest parts. Icons, dividers, overlays, focus.", + render, +}; + +fn render(_: &mut Window, cx: &mut App) -> AnyElement { + let colors = &cx.theme().colors; + let sizes = [ + (IconSize::Xs, "12"), + (IconSize::Sm, "14"), + (IconSize::Md, "16"), + (IconSize::Lg, "20"), + (IconSize::Xl, "24"), + (IconSize::Xxl, "32"), + ]; + let tones = [ + (colors.fg, "fg"), + (colors.fg_muted, "muted"), + (colors.focus, "focus"), + (colors.success, "success"), + (colors.warning, "warning"), + (colors.danger, "danger"), + ]; + + div() + .child( + section( + "Icon", + "Lucide, drawn as a mask. Color comes from the theme.", + cx, + ) + .child(specimens().children( + sizes.map(|(size, name)| { + specimen(name, Icon::new(IconName::Sparkles).size(size), cx) + }), + )) + .child(specimens().children(tones.map(|(color, name)| { + specimen(name, Icon::new(IconName::CircleCheck).color(color), cx) + }))), + ) + .child( + section("Icon set", "Every bundled icon.", cx).child( + div() + .flex() + .flex_wrap() + .gap_1() + .children(IconName::ALL.iter().enumerate().map(|(ix, &name)| { + div() + .id(ix) + .size_9() + .flex() + .items_center() + .justify_center() + .rounded_md() + .hover(|style| style.bg(colors.hover)) + .child(Icon::new(name).color(colors.fg_muted)) + })), + ), + ) + .into_any_element() +} diff --git a/examples/gallery/pages/theme.rs b/examples/gallery/pages/theme.rs new file mode 100644 index 0000000..3231454 --- /dev/null +++ b/examples/gallery/pages/theme.rs @@ -0,0 +1,324 @@ +use std::time::Duration; + +use ely_gpui_component::{ + motion, + theme::{ActiveTheme, Elevation, Radius, TextSize}, +}; +use gpui::{ + Animation, AnimationExt, AnyElement, App, FontStyle, FontWeight, HighlightStyle, Hsla, + IntoElement, ParentElement, SharedString, Styled, StyledText, Window, div, px, +}; + +use super::Page; +use crate::ui::{section, specimen, specimens}; + +pub const PAGE: Page = Page { + number: 39, + slug: "theme", + title: "Theme", + summary: "Tokens every component reads. Light and dark share one grammar.", + render, +}; + +fn render(_: &mut Window, cx: &mut App) -> AnyElement { + let colors = cx.theme().colors.clone(); + let surfaces = [ + ("bg", colors.bg), + ("surface", colors.surface), + ("sunken", colors.sunken), + ("hover", colors.hover), + ("active", colors.active), + ("border", colors.border), + ("border strong", colors.border_strong), + ]; + let inks = [ + ("fg", colors.fg), + ("muted", colors.fg_muted), + ("subtle", colors.fg_subtle), + ("disabled", colors.fg_disabled), + ("focus", colors.focus), + ("link", colors.link), + ]; + let signals = [ + ("success", colors.success, colors.success_subtle), + ("warning", colors.warning, colors.warning_subtle), + ("danger", colors.danger, colors.danger_subtle), + ("info", colors.info, colors.info_subtle), + ]; + + div() + .child( + section( + "Surfaces", + "Warm neutrals. Depth comes from tone, not shadow.", + cx, + ) + .child( + specimens() + .gap_3() + .children(surfaces.map(|(name, color)| swatch(name, color, cx))), + ), + ) + .child( + section("Ink", "Four steps of text. Blue marks focus and links.", cx).child( + specimens() + .gap_3() + .children(inks.map(|(name, color)| swatch(name, color, cx))), + ), + ) + .child( + section("Signals", "Status colors, each with a quiet fill.", cx).child( + specimens() + .gap_3() + .children(signals.map(|(name, strong, quiet)| { + specimen(name, signal_pair(strong, quiet, cx), cx) + })), + ), + ) + .child( + section("Series", "Eight chart colors, even in weight.", cx).child( + specimens() + .gap_2() + .children(colors.chart.iter().enumerate().map(|(ix, &color)| { + specimen(format!("{}", ix + 1), chip(color, 40.0, cx), cx) + })), + ), + ) + .child( + section("Syntax", "Code tokens sit below text in weight.", cx).child(code_sample(cx)), + ) + .child( + section("Type", "Inter for words. JetBrains Mono for code.", cx).child(type_scale(cx)), + ) + .child( + section("Shape", "Four radii. Three elevations.", cx) + .child( + specimens().children([Radius::Sm, Radius::Md, Radius::Lg, Radius::Xl].map( + |radius| { + specimen( + format!("{radius:?}"), + div() + .size(px(64.0)) + .rounded(cx.theme().radius(radius)) + .bg(colors.sunken) + .border_1() + .border_color(colors.border_strong), + cx, + ) + }, + )), + ) + .child(specimens().gap_8().pt_4().children( + [Elevation::Raised, Elevation::Floating, Elevation::Modal].map(|level| { + specimen( + format!("{level:?}"), + div() + .w(px(120.0)) + .h(px(72.0)) + .rounded(cx.theme().radius(Radius::Lg)) + .bg(colors.overlay) + .shadow(cx.theme().elevation(level)), + cx, + ) + }), + )), + ) + .child( + section( + "Motion", + "Ease out to arrive. Springs only where a hand leads. Slowed to one second here.", + cx, + ) + .child(track( + "ease-out", + "ease out cubic", + motion::ease_out_cubic, + cx, + )) + .child(track( + "ease-in-out", + "ease in out cubic", + motion::ease_in_out_cubic, + cx, + )) + .child(track("spring", "spring · damping 0.75", motion::spring, cx)), + ) + .into_any_element() +} + +fn chip(color: Hsla, side: f32, cx: &App) -> impl IntoElement + use<> { + let theme = cx.theme(); + div() + .w(px(side)) + .h(px(side)) + .rounded(theme.radius(Radius::Md)) + .bg(color) + .border_1() + .border_color(theme.colors.border) +} + +fn swatch(name: &'static str, color: Hsla, cx: &App) -> impl IntoElement + use<> { + let theme = cx.theme(); + specimen( + name, + div() + .w(px(88.0)) + .h(px(56.0)) + .rounded(theme.radius(Radius::Lg)) + .bg(color) + .border_1() + .border_color(theme.colors.border), + cx, + ) +} + +fn signal_pair(strong: Hsla, quiet: Hsla, cx: &App) -> impl IntoElement + use<> { + let theme = cx.theme(); + div() + .flex() + .items_center() + .gap_2() + .h(px(40.0)) + .px_3() + .rounded(theme.radius(Radius::Md)) + .bg(quiet) + .child(div().size(px(8.0)).rounded_full().bg(strong)) + .child( + div() + .text_color(strong) + .font_weight(FontWeight::MEDIUM) + .child("Aa 12"), + ) +} + +fn code_sample(cx: &App) -> impl IntoElement + use<> { + let theme = cx.theme(); + let syntax = &theme.colors.syntax; + let text = "fn answer() -> u32 { let x = 42; x } // truth"; + let color = |c: Hsla| HighlightStyle { + color: Some(c), + ..Default::default() + }; + let spans = [ + (0..2, color(syntax.keyword)), + (3..9, color(syntax.function)), + (9..11, color(syntax.punctuation)), + (12..14, color(syntax.operator)), + (15..18, color(syntax.type_name)), + (19..20, color(syntax.punctuation)), + (21..24, color(syntax.keyword)), + (25..26, color(syntax.variable)), + (27..28, color(syntax.operator)), + (29..31, color(syntax.number)), + (31..32, color(syntax.punctuation)), + (35..36, color(syntax.punctuation)), + ( + 37..45, + HighlightStyle { + color: Some(syntax.comment), + font_style: Some(FontStyle::Italic), + ..Default::default() + }, + ), + ]; + div() + .px_4() + .py_3() + .rounded(theme.radius(Radius::Lg)) + .bg(theme.colors.sunken) + .font_family(theme.mono_family.clone()) + .text_size(theme.text_size(TextSize::Base)) + .text_color(theme.colors.fg) + .child(StyledText::new(text).with_highlights(spans)) +} + +fn type_scale(cx: &App) -> impl IntoElement + use<> { + let theme = cx.theme(); + let steps = [ + (TextSize::Display, "Display 32", FontWeight::SEMIBOLD), + (TextSize::Xxl, "Heading 24", FontWeight::SEMIBOLD), + (TextSize::Xl, "Title 20", FontWeight::SEMIBOLD), + (TextSize::Lg, "Subtitle 16", FontWeight::MEDIUM), + (TextSize::Md, "Body large 14", FontWeight::NORMAL), + (TextSize::Base, "Body 13", FontWeight::NORMAL), + (TextSize::Sm, "Small 12", FontWeight::NORMAL), + (TextSize::Xs, "Caption 11", FontWeight::NORMAL), + ]; + div() + .flex() + .flex_col() + .gap_3() + .children(steps.map(|(size, name, weight)| { + div() + .flex() + .items_center() + .gap_6() + .child( + div() + .w(px(120.0)) + .text_size(theme.text_size(TextSize::Xs)) + .text_color(theme.colors.fg_subtle) + .child(SharedString::from(name)), + ) + .child( + div() + .text_size(theme.text_size(size)) + .font_weight(weight) + .text_color(theme.colors.fg) + .child("Quiet interfaces age well."), + ) + })) +} + +fn track( + id: &'static str, + name: &'static str, + ease: fn(f32) -> f32, + cx: &App, +) -> impl IntoElement + use<> { + let theme = cx.theme(); + let width = 360.0; + let travel = width - 12.0; + let knob = div() + .absolute() + .top(px(6.0)) + .size(px(12.0)) + .rounded_full() + .bg(theme.colors.fg); + let knob = if theme.reduced_motion { + knob.left(px(travel)).into_any_element() + } else { + knob.with_animation( + id, + Animation::new(Duration::from_millis(2400)).repeat(), + move |knob, t| { + let offset = match t { + t if t < 0.42 => ease(t / 0.42), + t if t < 0.5 => 1.0, + t if t < 0.92 => 1.0 - ease((t - 0.5) / 0.42), + _ => 0.0, + }; + knob.left(px(offset * travel)) + }, + ) + .into_any_element() + }; + specimen( + name, + div() + .relative() + .w(px(width)) + .h(px(24.0)) + .child( + div() + .absolute() + .top(px(11.5)) + .left_0() + .w(px(width)) + .h(px(1.0)) + .bg(theme.colors.border), + ) + .child(knob), + cx, + ) +} diff --git a/examples/gallery/shell.rs b/examples/gallery/shell.rs new file mode 100644 index 0000000..7495beb --- /dev/null +++ b/examples/gallery/shell.rs @@ -0,0 +1,241 @@ +use ely_gpui_component::{ + buttons::{ButtonVariant, IconButton}, + primitives::IconName, + theme::{ActiveTheme, ControlSize, Mode, Radius, TextSize, Theme}, +}; +use gpui::{ + Context, FocusHandle, FontWeight, InteractiveElement, IntoElement, ParentElement, Pixels, + Render, ScrollHandle, SharedString, StatefulInteractiveElement, Styled, Subscription, Window, + div, point, prelude::*, px, +}; + +use crate::{FocusNext, FocusPrev, pages}; + +#[derive(Clone, Copy, PartialEq, Eq)] +pub enum Choice { + Light, + Dark, + System, +} + +pub struct Gallery { + page: usize, + choice: Choice, + focus: FocusHandle, + scroll: ScrollHandle, + _appearance: Subscription, +} + +impl Gallery { + pub fn new(page: usize, window: &mut Window, cx: &mut Context) -> Self { + let appearance = cx.observe_window_appearance(window, |gallery, window, cx| { + if gallery.choice == Choice::System { + Theme::set_mode(window.appearance().into(), cx); + } + }); + let focus = cx.focus_handle(); + window.focus(&focus); + Self { + page, + choice: Choice::Light, + focus, + scroll: ScrollHandle::new(), + _appearance: appearance, + } + } + + pub fn select(&mut self, page: usize, cx: &mut Context) { + log::info!("gallery: page -> {}", pages::ALL[page].slug); + self.page = page; + self.scroll.set_offset(point(px(0.0), px(0.0))); + cx.notify(); + } + + /// Viewport height and furthest scroll, in pixels. + pub fn scroll_extent(&self) -> (Pixels, Pixels) { + ( + self.scroll.bounds().size.height, + self.scroll.max_offset().height, + ) + } + + pub fn scroll_to(&mut self, y: Pixels, cx: &mut Context) { + self.scroll.set_offset(point(px(0.0), -y)); + cx.notify(); + } + + pub fn choose(&mut self, choice: Choice, window: &mut Window, cx: &mut Context) { + self.choice = choice; + let mode = match choice { + Choice::Light => Mode::Light, + Choice::Dark => Mode::Dark, + Choice::System => window.appearance().into(), + }; + Theme::set_mode(mode, cx); + cx.notify(); + } + + fn sidebar(&self, cx: &mut Context) -> impl IntoElement + use<> { + let theme = cx.theme(); + let colors = &theme.colors; + div() + .flex() + .flex_col() + .flex_none() + .w(px(248.0)) + .h_full() + .pt(px(56.0)) + .px_3() + .border_r_1() + .border_color(colors.border) + .child( + div() + .px_3() + .pb_6() + .child( + div() + .text_size(theme.text_size(TextSize::Lg)) + .font_weight(FontWeight::SEMIBOLD) + .text_color(colors.fg) + .child("Ely"), + ) + .child( + div() + .text_size(theme.text_size(TextSize::Sm)) + .text_color(colors.fg_subtle) + .child("GPUI Component"), + ), + ) + .child( + div() + .id("nav") + .flex() + .flex_col() + .gap_0p5() + .overflow_y_scroll() + .children(pages::ALL.iter().enumerate().map(|(ix, page)| { + let selected = ix == self.page; + div() + .id(page.slug) + .flex() + .items_center() + .gap_3() + .h(px(30.0)) + .px_3() + .rounded(theme.radius(Radius::Md)) + .cursor_pointer() + .text_size(theme.text_size(TextSize::Base)) + .text_color(if selected { colors.fg } else { colors.fg_muted }) + .when(selected, |el| el.bg(colors.hover)) + .hover(|style| style.bg(colors.hover).text_color(colors.fg)) + .child( + div() + .w(px(18.0)) + .font_family(theme.mono_family.clone()) + .text_size(theme.text_size(TextSize::Xs)) + .text_color(colors.fg_subtle) + .child(SharedString::from(format!("{:02}", page.number))), + ) + .child(page.title) + .on_click(cx.listener(move |gallery, _, _, cx| gallery.select(ix, cx))) + })), + ) + } + + fn switcher(&self, cx: &mut Context) -> impl IntoElement + use<> { + let options = [ + (Choice::Light, IconName::Sun, "theme-light"), + (Choice::Dark, IconName::Moon, "theme-dark"), + (Choice::System, IconName::Monitor, "theme-system"), + ]; + let colors = &cx.theme().colors; + div() + .flex() + .gap_0p5() + .p_0p5() + .rounded(cx.theme().radius(Radius::Lg)) + .border_1() + .border_color(colors.border) + .children(options.map(|(choice, icon, id)| { + let variant = if choice == self.choice { + ButtonVariant::Subtle + } else { + ButtonVariant::Ghost + }; + IconButton::new(id, icon) + .variant(variant) + .size(ControlSize::Sm) + .on_click( + cx.listener(move |gallery, _, window, cx| { + gallery.choose(choice, window, cx) + }), + ) + })) + } +} + +impl Render for Gallery { + fn render(&mut self, window: &mut Window, cx: &mut Context) -> impl IntoElement { + let page = &pages::ALL[self.page]; + let body = (page.render)(window, cx); + let sidebar = self.sidebar(cx); + let switcher = self.switcher(cx); + let theme = cx.theme(); + let colors = &theme.colors; + + div() + .id("gallery") + .track_focus(&self.focus) + .on_action(|_: &FocusNext, window, _| window.focus_next()) + .on_action(|_: &FocusPrev, window, _| window.focus_prev()) + .size_full() + .flex() + .bg(colors.bg) + .text_color(colors.fg) + .font_family(theme.font_family.clone()) + .text_size(theme.text_size(TextSize::Base)) + .child(sidebar) + .child( + div() + .id("page") + .flex_1() + .h_full() + .overflow_y_scroll() + .track_scroll(&self.scroll) + .child( + div() + .max_w(px(960.0)) + .px(px(56.0)) + .pt(px(56.0)) + .pb(px(96.0)) + .child( + div() + .flex() + .items_start() + .justify_between() + .gap_6() + .child( + div() + .flex() + .flex_col() + .gap_2() + .child( + div() + .text_size(theme.text_size(TextSize::Xxl)) + .font_weight(FontWeight::SEMIBOLD) + .child(page.title), + ) + .child( + div() + .text_size(theme.text_size(TextSize::Md)) + .text_color(colors.fg_muted) + .child(page.summary), + ), + ) + .child(switcher), + ) + .child(body), + ), + ) + } +} diff --git a/examples/gallery/ui.rs b/examples/gallery/ui.rs new file mode 100644 index 0000000..0ca52a6 --- /dev/null +++ b/examples/gallery/ui.rs @@ -0,0 +1,53 @@ +use ely_gpui_component::theme::{ActiveTheme, TextSize}; +use gpui::{App, Div, FontWeight, IntoElement, ParentElement, SharedString, Styled, div}; + +/// Titled block of demos. +pub fn section(title: impl Into, note: impl Into, cx: &App) -> Div { + let theme = cx.theme(); + div().flex().flex_col().gap_4().pt_10().child( + div() + .flex() + .flex_col() + .gap_1() + .child( + div() + .text_size(theme.text_size(TextSize::Md)) + .font_weight(FontWeight::SEMIBOLD) + .text_color(theme.colors.fg) + .child(title.into()), + ) + .child( + div() + .text_size(theme.text_size(TextSize::Sm)) + .text_color(theme.colors.fg_muted) + .child(note.into()), + ), + ) +} + +pub fn row() -> Div { + div().flex().flex_wrap().items_center().gap_3() +} + +/// Row whose captions share one line. +pub fn specimens() -> Div { + div().flex().flex_wrap().items_end().gap_6() +} + +pub fn label(text: impl Into, cx: &App) -> impl IntoElement { + let theme = cx.theme(); + div() + .text_size(theme.text_size(TextSize::Xs)) + .text_color(theme.colors.fg_subtle) + .child(text.into()) +} + +/// Demo with a caption beneath. +pub fn specimen(caption: impl Into, body: impl IntoElement, cx: &App) -> Div { + div() + .flex() + .flex_col() + .gap_2() + .child(body) + .child(label(caption, cx)) +} diff --git a/gpui-components.md b/gpui-components.md new file mode 100644 index 0000000..bdf14dd --- /dev/null +++ b/gpui-components.md @@ -0,0 +1,1420 @@ +# GPUI 组件库完整组件清单 + +> 覆盖场景:代码编辑器 / IDE、文档与知识库、股票与金融平台、AI 桌面、AI 对话平台、设计工具、数据库与开发工具、IM 与邮件、项目管理、媒体、系统工具等桌面应用。 + +--- + +## 1. 基础原语(Primitives) + +- Box / View — 最底层容器 +- Text — 纯文本渲染 +- Icon — 矢量图标 +- IconSet / IconRegistry — 图标集注册与按名称加载 +- Svg — 任意 SVG 渲染 +- Image — 图片(加载中、失败、占位) +- Canvas — 自定义绘制区域 +- Divider / Separator — 水平 / 垂直分割线 +- Spacer — 弹性占位 +- Portal — 渲染到顶层图层 +- Overlay / Backdrop — 遮罩层 +- Slot — 插槽 / 组件组合 +- Show / When — 条件渲染 +- For / Each — 列表渲染辅助 +- Fragment — 无包裹分组 +- VisuallyHidden — 仅屏幕阅读器可见 +- FocusRing — 焦点环 +- FocusScope / FocusTrap — 焦点作用域与限制 +- ClickOutside — 外部点击检测 +- HoverArea — 悬停检测区域 +- Pressable — 可按压区域(按下态、长按) +- KeyboardHandler — 键盘事件区域 +- Measure — 尺寸测量 +- ResizeObserver — 尺寸变化监听 +- IntersectionObserver — 可见性监听 +- Clipboard — 剪贴板读写 +- Tooltip Trigger — 通用提示触发器 + +--- + +## 2. 排版(Typography) + +- Heading(H1–H6) +- Title / Subtitle +- Paragraph +- Label +- Caption +- Overline +- Code(行内代码) +- Kbd — 快捷键显示(支持 ⌘ / Ctrl 平台差异) +- KbdCombo — 组合键显示(⌘ + Shift + P) +- Blockquote +- Highlight / Mark — 高亮文本(搜索匹配) +- Truncate — 单行截断 +- LineClamp — 多行截断 +- MiddleEllipsis — 中间省略(长文件路径) +- EllipsisTooltip — 截断后悬停显示全文 +- Link — 链接 +- ExternalLink — 外部链接(带图标) +- RelativeTime — 相对时间(3 分钟前) +- DateTimeText — 格式化时间 +- NumberText — 数字格式化(千分位、精度) +- CurrencyText — 货币显示 +- PercentText — 百分比显示 +- FileSizeText — 文件大小(KB / MB / GB) +- DurationText — 时长(01:23:45) +- PluralText — 复数处理 +- CopyableText — 可复制文本 +- SelectableText — 可选中文本 +- Emoji — 表情渲染 +- Latex / MathInline — 行内公式 +- AnimatedNumber — 数字滚动动画 +- Typewriter — 打字机效果文本 +- GradientText — 渐变文字 +- ShimmerText — 闪光文字(加载中) + +--- + +## 3. 布局(Layout) + +- Stack / HStack / VStack +- Flex +- Grid / GridItem +- SimpleGrid — 等宽响应网格 +- Masonry — 瀑布流 +- Center +- Container — 最大宽度约束容器 +- AspectRatio +- Inset / Padding 容器 +- Wrap — 自动换行布局 +- Absolute / Positioned — 绝对定位容器 +- Layer / ZStack — 层叠 +- ScrollArea — 自定义滚动区域 +- Scrollbar — 可样式化滚动条(悬停显示、覆盖式) +- ScrollShadow — 滚动边缘阴影 +- ScrollToTop — 回到顶部 +- StickyHeader — 吸顶 +- SplitPane — 可拖拽分栏(水平 / 垂直 / 嵌套) +- ResizablePanel / ResizablePanelGroup +- ResizeHandle — 拖拽手柄 +- Collapsible — 可折叠区域 +- Accordion / AccordionItem +- Card / CardHeader / CardBody / CardFooter +- Panel / PanelHeader +- Section / SectionHeader +- Group / Fieldset +- Frame — 带边框区域 +- Well — 内嵌凹陷区域 +- Sidebar — 可折叠侧边栏 +- Drawer — 抽屉 +- Sheet — 边缘滑出面板 +- Page / PageHeader / PageContent +- AppShell — 应用骨架(标题栏 + 侧栏 + 内容 + 状态栏) +- MasterDetail — 主从布局(列表 + 详情) +- ThreeColumnLayout — 三栏布局(邮件 / IM) +- Dock / DockPanel — 可停靠面板系统(上下左右停靠、浮动、合并为标签组) +- DockZone / DropIndicator — 停靠拖拽指示区域 +- FloatingPanel — 浮动面板 +- Pane / PaneGroup — 编辑器分屏 +- Workspace — 工作区布局持久化 +- Viewport — 画布视口(缩放平移) + +--- + +## 4. 窗口与桌面外壳(Window & Shell) + +- TitleBar — 自定义标题栏(可拖动区域) +- WindowControls — 最小化 / 最大化 / 关闭(macOS 红绿灯、Windows、Linux 样式) +- TrafficLights — macOS 风格窗口按钮 +- WindowDragRegion — 窗口拖拽区域 +- WindowResizeBorder — 无边框窗口缩放边缘 +- MenuBar — 应用菜单栏(文件 / 编辑 / 视图…) +- NativeMenu 适配层 +- Toolbar / ToolbarGroup / ToolbarSeparator +- StatusBar / StatusBarItem — 底部状态栏 +- ActivityBar — 侧边图标导航(VS Code 风格) +- NavigationRail +- TabBar(窗口级) +- SplashScreen — 启动页 +- AboutDialog — 关于窗口 +- TrayIcon / TrayMenu — 系统托盘 +- DockBadge — Dock / 任务栏角标 +- JumpList — 任务栏快捷菜单 +- SystemNotification — 系统级通知桥接 +- MultiWindow Manager — 多窗口管理 +- WindowSwitcher — 窗口切换器 +- QuickLauncher — 快速启动器(类 Spotlight / Raycast) +- MiniWindow / CompactMode — 迷你模式窗口 +- AlwaysOnTop 浮窗 +- PictureInPicture — 画中画窗口 +- UpdateBanner / UpdateDialog — 应用更新提示 +- CrashReporter — 崩溃报告界面 +- OfflineIndicator — 离线状态 +- ZoomControl — 界面缩放 + +--- + +## 5. 按钮与操作(Buttons & Actions) + +- Button(primary / secondary / outline / ghost / subtle / danger / link) +- IconButton +- ButtonGroup +- SplitButton — 主按钮 + 下拉 +- DropdownButton / MenuButton +- ToggleButton +- ToggleGroup +- SegmentedControl +- FloatingActionButton +- LoadingButton — 带加载态 +- ConfirmButton — 二次确认按钮(按住确认 / 点击两次) +- HoldToConfirm — 长按确认 +- CopyButton — 复制并反馈 +- ShareButton +- CloseButton +- BackButton +- MoreButton(…) +- ActionBar — 底部 / 浮动操作栏 +- BulkActionBar — 批量选择后操作栏 +- ActionSheet +- QuickActions — 快捷动作列表 +- ShortcutHint — 按钮上附带快捷键提示 + +--- + +## 6. 表单输入(Form Inputs) + +### 文本类 +- Input / TextField +- TextArea(自动增高、最大行数) +- PasswordInput(显示 / 隐藏) +- SearchInput(清除、搜索历史) +- NumberInput(步进、键盘上下、拖拽改值) +- ScrubInput — 拖拽改数值(设计工具风格) +- CurrencyInput +- PercentInput +- UnitInput — 带单位输入(px / % / em) +- EmailInput +- UrlInput +- PhoneInput(区号) +- MaskedInput — 格式掩码 +- PinInput / OTPInput +- InlineEdit / EditableText — 点击即编辑 +- InputGroup / InputAddon — 前后缀 +- ClearableInput +- AutoResizeInput +- MentionInput — @ 提及 +- HashtagInput +- TagInput / TokenInput +- KeyValueInput — 键值对编辑 +- ListInput — 可增删的字符串列表 +- PathInput — 文件路径输入 + 浏览 +- RegexInput — 正则输入(带校验高亮) +- ExpressionInput — 公式 / 表达式输入 +- HotkeyInput / ShortcutRecorder — 快捷键录制 + +### 选择类 +- Checkbox(含半选态) +- CheckboxGroup +- CheckboxCard +- Radio / RadioGroup +- RadioCard +- Switch / Toggle +- Select +- NativeSelect +- Combobox — 可搜索下拉 +- Autocomplete +- MultiSelect +- CascadeSelect / Cascader — 级联选择 +- TreeSelect — 树形选择 +- TransferList — 穿梭框 +- ListBox — 列表选择 +- ChoiceChips / FilterChips +- Rating +- Slider +- RangeSlider +- VerticalSlider +- Knob / Dial — 旋钮(音频类) +- Stepper(数值加减) + +### 日期时间 +- Calendar +- DatePicker +- DateRangePicker +- TimePicker +- DateTimePicker +- MonthPicker / YearPicker / QuarterPicker +- WeekPicker +- RelativeDatePicker(最近 7 天、本月…) +- TimezoneSelect +- DurationPicker +- CronEditor — 定时规则编辑 + +### 颜色 +- ColorPicker(HSV / RGB / HEX / Alpha) +- ColorSwatch +- ColorPalette +- EyeDropper — 取色器 +- GradientEditor + +### 文件 +- FilePicker / FileInput +- FolderPicker +- DropZone — 拖拽上传区域 +- UploadList — 上传进度列表 +- ImageUpload(带预览、裁剪) +- AvatarUpload + +### 其他 +- SignaturePad — 签名板 +- CodeInput — 单行代码输入(带高亮) +- JsonInput — JSON 输入(校验) +- FontPicker +- IconPicker +- EmojiPicker +- LanguageSelect +- CountrySelect +- CurrencySelect + +### 表单结构 +- Form +- FormField +- FormLabel(必填标记、帮助图标) +- FormDescription / HelperText +- FormError / ValidationMessage +- FormSection +- FormActions +- FieldArray — 动态字段组 +- InlineForm +- WizardForm / MultiStepForm +- DirtyIndicator — 未保存改动提示 + +--- + +## 7. 导航(Navigation) + +- Tabs(顶部 / 左侧 / 底部) +- EditorTabs — 可关闭、可拖拽排序、可固定、预览标签(斜体)、未保存圆点、溢出菜单 +- TabOverflowMenu +- Breadcrumb(可点击每级展开同级下拉) +- Pagination +- LoadMore +- Stepper / Steps / Wizard +- Sidebar Navigation / NavItem / NavGroup +- NavigationMenu +- ActivityBar Item(带角标) +- BackForwardNavigation — 前进后退 +- History Navigation +- Anchor / TableOfContents 导航 +- JumpTo / GoToLine +- CommandPalette — 命令面板(分组、最近使用、模糊匹配高亮) +- QuickOpen — 快速打开文件 +- QuickSwitcher — 快速切换(文档 / 会话 / 项目) +- SearchPalette — 全局搜索 +- SpotlightSearch +- Tour / Onboarding 导航点 + +--- + +## 8. 菜单(Menus) + +- Menu / MenuItem / MenuGroup / MenuSeparator +- SubMenu — 级联子菜单 +- CheckboxMenuItem +- RadioMenuItem +- MenuItemShortcut — 右侧快捷键 +- MenuItemIcon +- ContextMenu — 右键菜单 +- DropdownMenu +- MenuBar Menu +- OverflowMenu(…) +- MegaMenu +- SearchableMenu — 带搜索框的菜单 +- PieMenu / RadialMenu — 环形菜单 + +--- + +## 9. 浮层(Overlays) + +- Tooltip(延迟、跟随鼠标、富内容) +- Popover +- HoverCard — 悬停卡片(用户信息、链接预览) +- Dialog / Modal +- AlertDialog +- ConfirmDialog +- PromptDialog — 输入对话框 +- FullscreenDialog +- Sheet +- Drawer +- Lightbox +- Spotlight / Coachmark — 聚焦引导 +- FloatingToolbar — 选中后浮动工具栏 +- Callout / Peek — 内联浮窗(类 Peek Definition) +- DropdownPanel +- InlinePopup +- ToastViewport — 通知容器 + +--- + +## 10. 反馈(Feedback) + +- Toast(成功 / 失败 / 警告 / 信息 / 带操作 / 可撤销) +- Notification — 带标题、正文、操作 +- NotificationCenter — 通知中心列表 +- Alert(inline) +- Banner — 顶部横幅 +- Callout / Admonition(提示、注意、危险) +- InlineMessage +- StatusMessage +- Snackbar +- UndoToast — 撤销提示 +- ErrorView — 错误页 +- ErrorBoundary +- NotFound / 404 +- NoPermission / 403 +- Maintenance — 维护中 +- Offline — 离线 +- EmptyState(无数据 / 无搜索结果 / 首次使用) +- Result — 结果页(成功 / 失败) +- ConfirmationCard +- SavingIndicator — 保存中 / 已保存 +- SyncStatus — 同步状态 +- ConnectionStatus — 连接状态 +- Countdown — 倒计时 +- Timer + +--- + +## 11. 加载与动画(Loading & Motion) + +### 加载 +- Spinner(圆环、点阵、条形、脉冲等多种样式) +- DotsLoader — 三点跳动 +- BarsLoader +- PulseLoader +- RingLoader +- OrbitLoader +- WaveLoader +- Skeleton / SkeletonText / SkeletonAvatar / SkeletonCard / SkeletonTable +- Shimmer — 流光效果 +- ProgressBar(确定 / 不确定 / 分段 / 缓冲) +- ProgressCircle / ProgressRing +- StepProgress +- LoadingOverlay — 覆盖式加载 +- LoadingScreen — 全屏加载 +- InlineLoader +- LazyLoad — 延迟加载容器 +- Suspense / AsyncView — 异步加载状态封装 +- RefreshIndicator +- TypingIndicator — 正在输入 + +### 动画与过渡 +- Transition(fade / slide / scale / collapse) +- AnimatePresence — 进出场动画 +- Motion — 声明式动画 +- Spring — 弹簧动画 +- Stagger — 交错动画 +- Reorder — 列表重排动画 +- Flip — 布局变化动画 +- CountUp — 数字递增 +- Marquee — 跑马灯 +- Ripple — 点击波纹 +- Confetti — 彩带庆祝 +- Glow / Pulse — 发光 / 呼吸 +- Blink / Flash — 闪烁(价格变化) +- Shake — 抖动(校验失败) +- ParticleBackground +- AnimatedGradient +- Lottie Player + +--- + +## 12. 数据展示(Data Display) + +- Badge / CountBadge / DotBadge +- Tag / Chip(可关闭、可选择) +- Avatar(图片 / 首字母 / 图标 / 在线状态) +- AvatarGroup — 堆叠头像 +- UserChip — 头像 + 名字 +- Statistic / KPI Card +- Metric — 指标 + 趋势 +- TrendIndicator — 上涨 / 下跌箭头 +- DescriptionList +- PropertyGrid — 属性面板(IDE / 设计工具) +- KeyValueList +- InfoRow +- Timeline / TimelineItem +- ActivityFeed — 动态流 +- Changelog +- Carousel +- Gallery +- Accordion 列表 +- Card Grid +- QRCode +- Barcode +- ColorSwatch 展示 +- Meter — 容量条(磁盘、配额) +- Gauge +- UsageBar — 分段用量条 +- Rating 展示 +- Comparison — 对比视图 +- BeforeAfter — 前后对比滑块 +- Watermark + +--- + +## 13. 列表与树(Lists & Trees) + +- List / ListItem(主文本、副文本、前后缀、操作) +- VirtualList — 虚拟滚动(可变高度) +- InfiniteList — 无限滚动 +- SortableList — 拖拽排序 +- SelectableList — 单选 / 多选 / Shift 范围选 +- GroupedList — 分组列表 + 分组吸顶 +- SectionList +- ReorderableList +- SwipeableListItem +- Tree / TreeView(展开、多选、拖拽、懒加载、重命名、键盘导航) +- VirtualTree — 大数据量树 +- FileTree — 文件树(图标、Git 状态、过滤) +- CheckboxTree +- Outline — 大纲 +- NestedList +- DirectoryListing — 目录列表视图 +- Menu List +- Transfer List + +--- + +## 14. 表格(Tables) + +- Table(基础) +- DataTable — 排序、筛选、分页、选择 +- VirtualTable — 百万行虚拟滚动 +- DataGrid — 可编辑单元格(类 Excel) +- Spreadsheet — 电子表格(公式、合并单元格、冻结、填充柄) +- TreeTable — 树形表格 +- PivotTable — 透视表 +- ColumnResizer — 列宽拖拽 +- ColumnReorder — 列拖拽排序 +- ColumnVisibility — 列显示控制 +- ColumnPinning — 冻结列 +- RowSelection +- RowExpansion — 展开行详情 +- RowGrouping — 分组行 +- InlineRowEdit +- CellRenderer(文本 / 数字 / 标签 / 进度 / 迷你图 / 头像 / 链接) +- TableToolbar(搜索、过滤、导出、密度切换) +- FilterBuilder — 高级筛选构建器 +- SortBuilder +- AggregationFooter — 汇总行 +- TableDensity — 紧凑 / 标准 / 宽松 +- ConditionalFormatting — 条件格式(红绿色阶) +- HeatmapTable +- ComparisonTable + +--- + +## 15. 通用图表(Charts) + +- LineChart +- AreaChart / StackedArea +- BarChart(水平 / 垂直 / 堆叠 / 分组) +- PieChart / DonutChart +- ScatterChart +- BubbleChart +- RadarChart +- HeatmapChart +- CalendarHeatmap(贡献图) +- Treemap +- Sunburst +- SankeyChart +- FunnelChart +- WaterfallChart +- BoxPlot +- Histogram +- ViolinPlot +- GanttChart +- NetworkGraph / ForceGraph +- ChordDiagram +- ParallelCoordinates +- Sparkline / SparkBar / SparkArea +- Bullet Chart +- ProgressChart +- RealtimeChart — 实时流数据图 +- ChartLegend +- ChartTooltip +- ChartCrosshair +- ChartAxis / ChartGrid +- ChartZoom / Brush — 缩放与区间选择 +- ChartAnnotation — 标注 +- ChartExport + +--- + +## 16. 金融与股票平台(Finance & Trading) + +### 行情 +- CandlestickChart — K 线图 +- OHLCChart +- HeikinAshiChart +- LineQuoteChart — 分时图 +- VolumeChart — 成交量 +- DepthChart — 深度图 +- MarketProfile / VolumeProfile +- RenkoChart / PointAndFigure +- MultiChartLayout — 多图联动布局 +- ChartSync — 多图十字光标同步 +- TimeRangeSelector(1m / 5m / 1H / 1D / 1W / 1M / YTD / 5Y) +- IntervalSelector +- ChartTypeSwitcher + +### 技术分析 +- IndicatorOverlay(MA / EMA / BOLL / VWAP) +- IndicatorPane(MACD / RSI / KDJ / OBV) +- IndicatorSelector +- DrawingTools — 画线工具(趋势线、水平线、斐波那契、矩形、文字标注) +- DrawingToolbar +- CompareSymbol — 叠加对比 +- PriceAlertLine — 价格预警线 + +### 报价与盘口 +- Ticker / TickerTape — 滚动行情条 +- QuoteCard — 报价卡片 +- PriceText — 涨跌颜色、闪烁 +- PriceChangeBadge +- OrderBook — 买卖盘口(深度条) +- Level2 Quotes +- TimeAndSales / TradeTape — 逐笔成交 +- MarketDepthLadder / DOM — 价格阶梯 +- SpreadIndicator +- BidAskBar + +### 交易 +- OrderEntry / TradePanel — 下单面板(限价、市价、止损、条件单) +- QuickTradeButtons — 快速买卖 +- PositionTable — 持仓 +- OrderTable — 委托 +- TradeHistoryTable — 成交记录 +- PnLDisplay — 盈亏显示 +- LeverageSlider +- MarginIndicator +- RiskMeter +- OrderConfirmDialog +- OptionChain — 期权链 +- GreeksTable +- PayoffDiagram — 期权损益图 + +### 市场与资产 +- Watchlist — 自选列表(分组、拖拽、实时刷新) +- SymbolSearch — 代码搜索 +- SymbolBadge — 股票代码标签 +- MarketHeatmap — 板块热力图 +- SectorTreemap +- Screener / FilterPanel — 选股器 +- MarketOverview — 大盘概览 +- IndexCard +- MarketStatus — 开盘 / 收盘 / 盘前盘后 +- TradingSessionClock +- EconomicCalendar +- EarningsCalendar +- NewsFeed — 财经新闻流 +- SentimentGauge +- PortfolioSummary +- AssetAllocationChart +- PerformanceChart(收益曲线、回撤) +- DividendTable +- FinancialStatementTable — 财报表格 +- CurrencyConverter +- CryptoWalletCard +- TransactionList +- Candle Countdown — K 线倒计时 + +--- + +## 17. 代码编辑器与 IDE(Code Editor & IDE) + +### 编辑器核心 +- CodeEditor — 语法高亮、多光标、选区、撤销重做 +- EditorGutter — 行号、折叠箭头、断点、Git 标记、诊断图标 +- LineNumbers(绝对 / 相对) +- FoldingControl +- Minimap +- Ruler / IndentGuide — 标尺、缩进参考线 +- BracketMatcher / RainbowBrackets +- WhitespaceRenderer +- CursorRenderer(块状 / 线条 / 下划线、闪烁) +- SelectionHighlight +- MultiCursor +- VimModeIndicator +- StickyScroll — 作用域吸顶 +- Breadcrumb(符号路径) +- InlayHints — 内联提示 +- CodeLens — 代码上方操作 +- InlineDecoration — 波浪线、背景色 +- GhostText — AI 灰色补全文本 +- InlineChat — 行内 AI 对话 +- InlineDiff — 行内差异 +- ReadOnlyBanner + +### 智能提示 +- CompletionMenu — 自动补全(图标、类型、文档预览) +- SignatureHelp — 参数提示 +- HoverInfo — 悬停文档 +- QuickFix / CodeActionMenu — 灯泡菜单 +- RenameInput — 行内重命名 +- PeekView — 查看定义 / 引用 +- ReferencesPanel +- SymbolOutline +- GoToSymbol +- CallHierarchy / TypeHierarchy + +### 搜索 +- FindWidget — 查找(大小写、全词、正则) +- ReplaceWidget +- SearchPanel — 全局搜索结果(按文件分组) +- SearchResultItem(匹配高亮、预览) +- SearchFilters(包含 / 排除 glob) + +### 面板 +- ProblemsPanel / DiagnosticsList +- OutputPanel +- DebugConsole +- ExtensionsPanel / PluginList +- SettingsEditor(UI + JSON 双模式) +- KeybindingsEditor +- ThemePreview +- WelcomePage +- RecentProjects +- ProjectSwitcher +- TaskRunner / RunConfiguration + +### 状态栏项 +- CursorPosition(Ln / Col) +- LanguageMode +- Encoding +- LineEnding +- IndentSettings +- BranchIndicator +- LspStatus +- NotificationBell + +--- + +## 18. 终端(Terminal) + +- Terminal — 终端模拟器(ANSI 颜色、真彩、光标、滚动缓冲) +- TerminalTabs +- TerminalSplit +- TerminalToolbar +- TerminalSearch +- TerminalLink — 可点击路径 / URL +- ShellSelector +- CommandBlock — 命令分块(类 Warp) +- CommandHistory +- AnsiText — ANSI 文本渲染 +- LogViewer — 日志查看器(级别过滤、跟随、高亮) +- ProcessList + +--- + +## 19. 版本控制(Git / VCS) + +- DiffViewer — 并排 / 统一视图 +- InlineDiff +- ThreeWayMerge — 三方合并 +- ConflictResolver +- ChangesList — 暂存 / 未暂存 +- CommitInput — 提交信息输入 +- CommitGraph — 提交图谱 +- CommitList / CommitItem +- BranchSelector +- BranchList +- TagList +- StashList +- BlameView / GitBlameAnnotation +- FileHistory +- PullRequestCard +- ReviewComment +- DiffStat(+12 −3) +- GitStatusBadge(M / A / D / U) + +--- + +## 20. 调试与运行(Debug) + +- DebugToolbar(继续、单步、步入、步出、停止) +- BreakpointList +- BreakpointGutter +- CallStack +- VariablesPanel(树形展开) +- WatchPanel +- ThreadList +- MemoryViewer / HexViewer +- Disassembly +- PerformanceProfiler / Flamegraph +- TimelineProfiler +- NetworkInspector +- ConsoleREPL + +--- + +## 21. 文档与富文本(Documents & Rich Text) + +### 编辑 +- RichTextEditor +- MarkdownEditor(所见即所得 / 源码 / 分屏) +- BlockEditor — 块编辑器(类 Notion) +- Block 类型:段落、标题、列表、待办、引用、代码、分割线、表格、图片、视频、嵌入、公式、Callout、折叠块、列布局、同步块 +- BlockHandle — 块拖拽手柄 +- SlashMenu — 斜杠命令 +- FloatingFormatToolbar — 选中格式工具栏 +- FixedFormatToolbar — 固定工具栏 +- LinkEditor — 链接编辑浮窗 +- MentionMenu — @ 提及 +- EmojiAutocomplete +- TableEditor — 表格编辑(增删行列、合并) +- ImageEditorBlock(缩放、对齐、说明文字) +- MathEditor / LatexBlock +- MermaidBlock / DiagramBlock +- CodeBlockEditor +- TodoItem / Checklist +- PlaceholderText — 空块提示 +- WordCount / CharacterCount +- ReadingTime + +### 阅读 +- MarkdownRenderer +- DocumentViewer +- PDFViewer(缩略图、搜索、缩放、标注) +- EpubReader +- OfficePreview(docx / xlsx / pptx 预览) +- PageThumbnailList +- TableOfContents(滚动联动高亮) +- DocumentOutline +- Footnote +- Glossary / TooltipTerm +- ReadingProgress +- FocusMode / ZenMode +- PrintPreview + +### 知识库 +- PageTree — 页面层级树 +- Backlinks — 反向链接 +- GraphView — 双链关系图 +- PageCover / PageIcon +- PageProperties — 页面属性(数据库字段) +- DatabaseView(表格 / 看板 / 画廊 / 日历 / 时间线视图) +- TemplatePicker +- TrashBin / 回收站 +- VersionHistory — 版本历史 +- PageHistoryDiff +- Favorites / Pinned + +--- + +## 22. 协作(Collaboration) + +- PresenceAvatars — 在线协作者 +- RemoteCursor — 他人光标 +- RemoteSelection — 他人选区 +- CommentThread +- CommentBubble / CommentMarker +- CommentSidebar +- Reply / ReactionPicker +- Reactions(表情回应) +- Annotation / Highlight 批注 +- SuggestionMode — 修订模式 +- TrackChanges — 修订记录 +- ShareDialog — 分享 & 权限 +- PermissionSelect(可查看 / 可评论 / 可编辑) +- InviteInput +- AccessList +- ActivityLog +- FollowMode — 跟随他人视图 +- LiveIndicator + +--- + +## 23. AI 对话平台(AI Chat) + +### 消息 +- ChatContainer +- MessageList(虚拟化、自动滚动到底部、新消息提示) +- MessageBubble(用户 / 助手 / 系统 / 错误) +- MessageAvatar +- MessageHeader(模型名、时间) +- MessageFooter +- StreamingText — 流式渲染(平滑、光标) +- StreamingMarkdown — 增量 Markdown 解析渲染 +- StreamingCursor — 流式输出光标 +- CodeBlock(语言标签、复制、下载、运行、折叠、应用到文件) +- MathBlock +- TableBlock +- MermaidRenderer +- ImageMessage / ImageGrid +- FileMessage +- AudioMessage +- VideoMessage +- LinkPreviewCard +- QuoteReply — 引用回复 +- MessageActions(复制、重新生成、编辑、点赞、点踩、朗读、分享) +- MessageEditor — 编辑已发送消息 +- BranchNavigator(< 2/3 >)— 分支切换 +- RegenerateButton +- StopGeneratingButton +- ContinueButton +- ErrorMessage / RetryMessage +- RateLimitNotice +- FeedbackForm — 反馈表单 +- ScrollToBottomButton +- DateSeparator +- ThinkingBlock / ReasoningPanel — 可折叠思考过程 +- ThinkingIndicator — 思考中动画 +- ThinkingDuration(已思考 12 秒) + +### 引用与检索 +- CitationBadge / InlineCitation([1]) +- SourceCard +- SourceList / SourcesPanel +- SearchProgress — 搜索中(显示正在搜索的关键词) +- WebResultCard +- DocumentChunkPreview + +### 输入 +- PromptInput / Composer(多行、快捷键发送、Shift 换行) +- AttachmentButton +- AttachmentChip / AttachmentPreview +- PasteImagePreview +- DragDropOverlay — 拖入文件遮罩 +- VoiceInputButton +- VoiceWaveform / RecordingIndicator +- SlashCommandMenu +- PromptTemplateMenu +- ContextMentionMenu(@文件 / @文档 / @网页) +- ContextChips — 已附加上下文 +- ModelSelector(能力标签、上下文长度) +- ModeSelector(对话 / 搜索 / 深度研究 / Agent) +- ToolToggleMenu(启用联网、代码执行等) +- TemperatureSlider / ParameterPanel +- SystemPromptEditor +- TokenCounter +- ContextWindowMeter — 上下文使用率 +- CostEstimator +- SendButton(发送 / 停止 两态) +- InputHint(按 Enter 发送) + +### 会话管理 +- ConversationList(按时间分组:今天、昨天、7 天内) +- ConversationItem(重命名、删除、置顶、导出) +- ConversationSearch +- NewChatButton +- FolderList / ProjectList +- ProjectKnowledgePanel — 项目知识库 +- SharedConversationView +- ConversationExport + +### 引导 +- WelcomeScreen / Greeting +- SuggestionChips / StarterPrompts +- PromptLibrary +- FollowUpSuggestions — 追问建议 +- CapabilityCards + +--- + +## 24. AI Agent 与工具调用(Agent) + +- ToolCallCard — 工具调用(名称、参数、结果、耗时、状态) +- ToolCallGroup — 多个调用折叠 +- ToolApprovalDialog — 执行前审批 +- PermissionPrompt(允许一次 / 始终允许 / 拒绝) +- AgentStepList / TaskTimeline — 执行步骤 +- AgentPlan / TodoList — 计划清单(实时勾选) +- AgentStatus(规划中 / 执行中 / 等待 / 完成 / 失败) +- AgentProgress +- SubAgentTree — 子 Agent 层级 +- FileChangeCard — 文件变更预览(接受 / 拒绝) +- MultiFileDiff Review +- CommandExecutionCard — 命令执行 + 输出 +- BrowserPreview / ScreenshotStream — Agent 浏览器画面 +- ComputerUseViewer +- ArtifactPanel — 产物面板(代码、文档、网页预览) +- ArtifactVersionSwitcher +- LivePreview — 实时预览 +- SandboxStatus +- MCPServerList / ConnectorList +- ToolRegistry Panel +- MemoryPanel — Agent 记忆管理 +- CheckpointList / Rewind — 检查点回滚 +- InterruptButton +- HumanInputRequest — Agent 请求用户输入 +- TokenUsageChart +- CostBreakdown +- TraceViewer — 调用链追踪 +- EvalResultTable + +--- + +## 25. AI 创作与生成(Generative) + +- ImageGenerationPanel +- GenerationQueue — 生成队列 +- GenerationGrid — 结果网格 +- VariationPicker +- PromptEnhancer +- NegativePromptInput +- StylePresetPicker +- SeedInput +- AspectRatioPicker +- InpaintCanvas — 局部重绘画布 +- MaskBrush +- ImageCompare +- AudioGenerationPlayer +- VideoGenerationTimeline +- TTSVoicePicker +- ModelCard — 模型信息卡 +- ModelDownloadManager — 本地模型下载 +- ModelStatus(已加载 / 加载中 / GPU 占用) +- HardwareMonitor(GPU / VRAM / CPU) +- FineTuneJobCard +- DatasetViewer +- EmbeddingVisualizer(2D / 3D 散点) +- PromptPlayground — 提示词调试台 +- PromptDiff / PromptVersionHistory +- ABCompareView — 多模型对比 + +--- + +## 26. 媒体(Media) + +- ImageViewer(缩放、平移、旋转、适配) +- ImageCropper +- ImageAnnotator +- ImageThumbnail +- Lightbox / Gallery Viewer +- VideoPlayer(播放、进度、倍速、字幕、全屏、画中画) +- VideoTimeline / Scrubber +- VideoThumbnailStrip +- AudioPlayer +- AudioWaveform +- AudioSpectrum / Visualizer +- VolumeControl +- PlaybackSpeedControl +- MediaControls +- Playlist +- SubtitleEditor +- ScreenRecorderControls +- CameraPreview +- MicLevelMeter +- DeviceSelector(麦克风 / 摄像头 / 扬声器) +- 3DModelViewer + +--- + +## 27. 文件管理(Files) + +- FileExplorer — 文件浏览器(列表 / 图标 / 分栏视图) +- FileGrid +- FileList +- FileItem(图标、名称、大小、修改时间) +- FileIcon — 按扩展名自动图标 +- FilePreview / QuickLook +- FileBreadcrumb / PathBar +- FolderTree +- FileContextMenu +- RenameInline +- DragDropFiles +- FileOperationProgress — 复制 / 移动进度 +- TransferQueue — 上传下载队列 +- DownloadManager +- StorageUsage +- RecentFiles +- Favorites / Bookmarks +- FileSearch +- DuplicateFinder 视图 +- ArchiveViewer(zip 内容) +- HexViewer + +--- + +## 28. 即时通讯(IM / Messaging) + +- ChannelList / ChatList +- ChannelItem(未读数、静音、置顶) +- DirectMessageItem +- MessageThread +- ThreadPanel — 话题侧栏 +- ChatMessage(连续消息合并、时间戳) +- UnreadDivider — 新消息分割线 +- MessageReactions +- ReadReceipt — 已读回执 +- TypingIndicator +- MemberList +- UserProfileCard +- OnlineStatus(在线 / 离开 / 忙碌 / 离线) +- StatusSetter — 自定义状态 +- VoiceCallBar +- VideoCallGrid +- ScreenShareView +- CallControls(静音、摄像头、挂断、共享) +- ParticipantTile +- IncomingCallDialog +- StickerPicker +- GifPicker +- PinnedMessages +- ChannelHeader +- HuddleIndicator + +--- + +## 29. 邮件(Mail) + +- MailboxList / FolderList +- MailList(未读粗体、星标、附件图标) +- MailItem +- MailReader +- MailComposer(收件人、抄送、密送、附件) +- RecipientInput +- MailThreadView — 会话视图 +- QuotedText — 折叠引用 +- SignatureEditor +- LabelPicker +- SnoozePicker +- ScheduleSend +- InboxZeroState + +--- + +## 30. 日历与日程(Calendar) + +- CalendarMonthView +- CalendarWeekView +- CalendarDayView +- AgendaView +- YearView +- MiniCalendar +- EventCard / EventChip +- EventEditor +- EventPopover +- TimeGrid — 时间网格(拖拽创建、调整时长) +- AllDayRow +- CurrentTimeIndicator +- RecurrenceEditor — 重复规则 +- AvailabilityPicker +- TimezoneOverlay +- ReminderPicker +- AttendeeList + +--- + +## 31. 项目与任务管理(Project Management) + +- KanbanBoard / KanbanColumn / KanbanCard +- TaskList +- TaskItem(复选、优先级、截止日期、负责人) +- TaskDetailPanel +- SubtaskList +- GanttChart / TimelineView +- Roadmap +- Sprint Board +- Burndown Chart +- PriorityIndicator +- StatusSelect +- AssigneePicker +- DueDatePicker +- LabelManager +- IssueCard +- IssueIdBadge(ENG-123) +- MilestoneProgress +- WorkloadView +- TimeTracker +- Pomodoro Timer + +--- + +## 32. 设计与画布工具(Canvas & Design) + +- InfiniteCanvas — 无限画布(缩放、平移) +- CanvasGrid / Guides — 网格与参考线 +- Ruler — 标尺 +- SelectionBox — 选框 +- TransformHandles — 缩放旋转手柄 +- SnapIndicator — 吸附提示 +- LayerPanel — 图层面板 +- AssetPanel +- InspectorPanel — 属性检查器 +- AlignmentToolbar +- ToolPalette — 工具箱 +- ZoomControls / ZoomIndicator +- MiniMap(画布) +- ArtboardFrame +- ShapeTools(矩形、椭圆、多边形、线条、箭头) +- PenTool / PathEditor +- TextTool +- BrushTool / BrushSettings +- ColorPanel +- GradientPanel +- ShadowEditor +- BorderEditor +- TypographyPanel +- ConstraintsEditor +- AutoLayoutControls +- ExportPanel +- NodeEditor / NodeGraph — 节点编辑器(ComfyUI / 蓝图风格) +- Node / Port / Edge / Connection +- FlowChart / DiagramEditor +- MindMap +- Whiteboard +- StickyNote +- Connector Line +- HistoryPanel — 操作历史 + +--- + +## 33. 数据库与开发工具(DB & Dev Tools) + +- ConnectionManager — 数据库连接管理 +- ConnectionForm +- SchemaTree — 库 / 表 / 字段树 +- QueryEditor — SQL 编辑器 +- QueryResultGrid +- QueryHistory +- QueryPlanViewer — 执行计划 +- TableStructureEditor +- ERDiagram — 实体关系图 +- IndexManager +- RedisKeyBrowser +- DocumentViewer(MongoDB / JSON) +- JsonViewer / JsonTree(折叠、路径复制、搜索) +- JsonEditor +- YamlViewer +- XmlViewer +- ApiRequestBuilder(方法、URL、Headers、Body、Auth) +- ResponseViewer(状态码、耗时、大小、美化) +- HeadersTable +- QueryParamsEditor +- EnvironmentSelector — 环境变量切换 +- CollectionTree — 请求集合 +- WebSocketConsole +- GraphQLExplorer +- RegexTester +- Base64 / Encoder 工具面板 +- ColorContrastChecker +- ContainerList(Docker) +- PodList(K8s) +- ResourceMonitor + +--- + +## 34. 监控与仪表盘(Dashboard & Monitoring) + +- Dashboard Grid — 可拖拽调整的仪表盘网格 +- Widget / DashboardCard +- StatCard +- MetricsChart +- AlertList +- IncidentCard +- UptimeBar — 可用性条 +- ServiceStatus +- HealthCheck Indicator +- LogStream +- TraceWaterfall +- EventStream +- ResourceGauge(CPU / 内存 / 磁盘 / 网络) +- SystemMonitor +- ProcessTable +- NetworkGraph(实时速率) +- MapView / GeoHeatmap +- WorldMap +- RefreshIntervalSelector +- DashboardFilterBar + +--- + +## 35. 设置与偏好(Settings) + +- SettingsLayout — 左侧分类 + 右侧内容 +- SettingsSection +- SettingsRow(标题、描述、控件) +- SettingsSearch +- ThemeSelector(亮 / 暗 / 跟随系统) +- AccentColorPicker +- FontSizeControl +- FontFamilySelect +- DensitySelector +- LanguageSelector +- KeyboardShortcutsList +- ShortcutEditor +- ProxySettings +- StorageSettings / CacheClear +- PrivacySettings +- NotificationSettings +- StartupSettings +- ImportExportSettings +- ResetToDefault +- AdvancedSettings / FeatureFlags +- DeveloperMode Toggle + +--- + +## 36. 账户与用户(Account) + +- LoginForm +- SignupForm +- OAuthButtons +- MagicLinkForm +- TwoFactorInput +- ForgotPassword +- ProfileCard +- ProfileEditor +- AccountSwitcher — 多账户切换 +- WorkspaceSwitcher / OrgSwitcher +- UserMenu — 头像下拉菜单 +- SessionList — 登录设备 +- ApiKeyManager +- SubscriptionCard / PlanBadge +- UsageQuota +- BillingHistory +- PaymentMethodForm +- UpgradePrompt / Paywall +- TeamMemberTable +- RoleSelector +- InvitationList + +--- + +## 37. 引导与帮助(Onboarding & Help) + +- OnboardingWizard +- WelcomeTour +- Coachmark / Hotspot +- FeatureHighlight / NewBadge +- Checklist(新手任务) +- HelpTooltip(? 图标) +- HelpPanel / DocsSidebar +- KeyboardShortcutCheatsheet +- WhatsNewDialog +- FeedbackWidget +- ContactSupport +- InlineHelp +- EmptyStateWithAction + +--- + +## 38. 交互原语(Interaction) + +- Draggable +- Droppable / DropTarget +- DragOverlay / DragPreview +- DragGhost +- Sortable / SortableContext +- Resizable +- Rotatable +- Selectable / SelectionArea — 框选 +- RubberBandSelection +- LongPress +- DoubleClick +- Gesture(滚轮缩放、触控板捏合、双指滑动) +- PanZoom +- Hotkeys / KeyBinding — 快捷键绑定与作用域 +- KeyChord — 组合键序列(Ctrl+K Ctrl+S) +- Undo / Redo Manager +- InfiniteScroll Trigger +- VirtualScroller(底层) +- ScrollSync — 多区域滚动同步 +- Autofocus +- RovingTabIndex — 方向键焦点管理 +- TypeAhead — 按键快速定位 +- FocusVisible + +--- + +## 39. 主题与样式系统(Theme) + +- ThemeProvider +- ThemeSwitcher +- ColorTokens / DesignTokens +- ThemeEditor — 主题编辑器 +- ThemeImporter(VS Code 主题兼容) +- SyntaxThemes — 代码高亮主题 +- IconThemeProvider +- DensityProvider +- RadiusProvider +- FontProvider +- HighContrastMode +- ReducedMotionProvider +- Platform Style(macOS / Windows / Linux 自适应) +- VibrancyBackground / Mica / Acrylic — 系统毛玻璃 +- Elevation / Shadow 系统 + +--- + +## 40. 国际化与无障碍(i18n & a11y) + +- I18nProvider +- Trans / LocalizedText +- LocaleNumber / LocaleDate +- RTL 布局支持 +- LiveRegion / Announcer — 屏幕阅读器播报 +- SkipLink +- AccessibleIcon +- AriaLabel 辅助 +- KeyboardNavigationHelper +- ScreenReaderOnly +- ColorBlindSafe Palette + +--- + +## 41. 地图与地理(Maps) + +- MapView(瓦片) +- MapMarker +- MapPopup +- MapCluster +- RouteLine +- GeoJSON Layer +- ChoroplethMap +- LocationPicker +- CoordinateDisplay + +--- + +## 42. 杂项与工具组件(Misc) + +- Clock / WorldClock +- Stopwatch +- Calculator +- UnitConverter +- QRCodeScanner +- BarcodeDisplay +- Captcha +- Signature +- Rating Widget +- Poll / Survey +- Quiz / Flashcard +- ChangeLog Viewer +- LicenseViewer +- Terms / Consent Dialog +- CookieBanner(嵌入 Web 内容时) +- WebView 容器 +- IframeEmbed / EmbedCard +- HTMLPreview +- PrintButton +- ExportDialog(PDF / PNG / CSV / JSON) +- ImportDialog(字段映射) +- CSVImporter +- ShareSheet + +--- + +## 43. 开发与质量(Library Tooling) + +- ComponentGallery / Storybook — 组件展示应用 +- PlaygroundPanel — 属性实时调试 +- InspectorOverlay — 布局检查(边框、尺寸) +- FPSMeter / PerfOverlay +- RenderCounter +- EventLogger +- DesignTokenViewer +- IconBrowser +- A11yChecker +- ScreenshotTest Harness diff --git a/scripts/icons.sh b/scripts/icons.sh new file mode 100755 index 0000000..7c73c21 --- /dev/null +++ b/scripts/icons.sh @@ -0,0 +1,11 @@ +#!/bin/sh +# Copy Lucide icons: scripts/icons.sh name... +set -eu +VERSION=1.48.0 +DIR=$(mktemp -d) +trap 'rm -rf "$DIR"' EXIT +(cd "$DIR" && npm pack "lucide-static@$VERSION" --silent >/dev/null && tar xzf "lucide-static-$VERSION.tgz") +cp "$DIR/package/LICENSE" assets/icons/LICENSE +for name in "$@"; do + cp "$DIR/package/icons/$name.svg" "assets/icons/$name.svg" +done diff --git a/src/assets.rs b/src/assets.rs new file mode 100644 index 0000000..5c075ef --- /dev/null +++ b/src/assets.rs @@ -0,0 +1,36 @@ +use std::borrow::Cow; + +use anyhow::Context as _; +use gpui::{App, AssetSource, Result, SharedString}; +use rust_embed::RustEmbed; + +/// Icons and fonts. Pass to `Application::with_assets`. +#[derive(RustEmbed)] +#[folder = "assets"] +pub struct Assets; + +impl AssetSource for Assets { + fn load(&self, path: &str) -> Result>> { + Ok(Self::get(path).map(|file| file.data)) + } + + fn list(&self, path: &str) -> Result> { + Ok(Self::iter() + .filter(|name| name.starts_with(path)) + .map(SharedString::from) + .collect()) + } +} + +pub(crate) fn load_fonts(cx: &App) -> Result<()> { + let fonts = Assets::iter() + .filter(|name| name.ends_with(".ttf")) + .map(|name| { + Assets::get(&name) + .map(|file| file.data) + .with_context(|| format!("font {name} vanished from the bundle")) + }) + .collect::>>()?; + log::info!("assets: registering {} fonts", fonts.len()); + cx.text_system().add_fonts(fonts) +} diff --git a/src/buttons/button.rs b/src/buttons/button.rs new file mode 100644 index 0000000..995ce86 --- /dev/null +++ b/src/buttons/button.rs @@ -0,0 +1,210 @@ +use gpui::{ + App, ClickEvent, ElementId, FontWeight, Hsla, IntoElement, MouseButton, RenderOnce, + SharedString, Window, div, prelude::*, transparent_black, +}; + +use crate::{ + primitives::{Icon, IconName}, + theme::{ActiveTheme, ControlSize, IconSize, Mix, Palette, Radius, TextSize}, +}; + +pub(crate) type ClickHandler = Box; + +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +pub enum ButtonVariant { + Primary, + #[default] + Secondary, + Outline, + Ghost, + Subtle, + Danger, + Link, +} + +pub(crate) struct Tone { + pub bg: Hsla, + pub hover: Hsla, + pub pressed: Hsla, + pub fg: Hsla, + pub border: Option, +} + +pub(crate) fn tone(variant: ButtonVariant, colors: &Palette) -> Tone { + let clear = transparent_black(); + match variant { + ButtonVariant::Primary => Tone { + bg: colors.accent, + hover: colors.accent_hover, + pressed: colors.accent_hover.mix(&colors.on_accent, 0.12), + fg: colors.on_accent, + border: None, + }, + ButtonVariant::Secondary => Tone { + bg: colors.surface, + hover: colors.hover, + pressed: colors.active, + fg: colors.fg, + border: Some(colors.border), + }, + ButtonVariant::Outline => Tone { + bg: clear, + hover: colors.hover, + pressed: colors.active, + fg: colors.fg, + border: Some(colors.border_strong), + }, + ButtonVariant::Ghost => Tone { + bg: clear, + hover: colors.hover, + pressed: colors.active, + fg: colors.fg, + border: None, + }, + ButtonVariant::Subtle => Tone { + bg: colors.hover, + hover: colors.active, + pressed: colors.active.mix(&colors.border_strong, 0.5), + fg: colors.fg, + border: None, + }, + ButtonVariant::Danger => Tone { + bg: colors.danger, + hover: colors.danger.mix(&colors.fg, 0.14), + pressed: colors.danger.mix(&colors.fg, 0.24), + fg: colors.on_accent, + border: None, + }, + ButtonVariant::Link => Tone { + bg: clear, + hover: clear, + pressed: clear, + fg: colors.link, + border: None, + }, + } +} + +pub(crate) fn label_size(size: ControlSize) -> (TextSize, IconSize) { + match size { + ControlSize::Sm => (TextSize::Sm, IconSize::Xs), + ControlSize::Md => (TextSize::Base, IconSize::Sm), + ControlSize::Lg => (TextSize::Md, IconSize::Md), + } +} + +#[derive(IntoElement)] +pub struct Button { + id: ElementId, + label: SharedString, + icon: Option, + trailing_icon: Option, + variant: ButtonVariant, + size: ControlSize, + disabled: bool, + full_width: bool, + on_click: Option, +} + +impl Button { + pub fn new(id: impl Into, label: impl Into) -> Self { + Self { + id: id.into(), + label: label.into(), + icon: None, + trailing_icon: None, + variant: ButtonVariant::default(), + size: ControlSize::default(), + disabled: false, + full_width: false, + on_click: None, + } + } + + pub fn variant(mut self, variant: ButtonVariant) -> Self { + self.variant = variant; + self + } + + pub fn primary(self) -> Self { + self.variant(ButtonVariant::Primary) + } + + pub fn size(mut self, size: ControlSize) -> Self { + self.size = size; + self + } + + pub fn icon(mut self, icon: IconName) -> Self { + self.icon = Some(icon); + self + } + + pub fn trailing_icon(mut self, icon: IconName) -> Self { + self.trailing_icon = Some(icon); + self + } + + pub fn disabled(mut self, disabled: bool) -> Self { + self.disabled = disabled; + self + } + + pub fn full_width(mut self) -> Self { + self.full_width = true; + self + } + + pub fn on_click( + mut self, + handler: impl Fn(&ClickEvent, &mut Window, &mut App) + 'static, + ) -> Self { + self.on_click = Some(Box::new(handler)); + self + } +} + +impl RenderOnce for Button { + fn render(self, _: &mut Window, cx: &mut App) -> impl IntoElement { + let theme = cx.theme(); + let tone = tone(self.variant, &theme.colors); + let (text, icon_size) = label_size(self.size); + let link = self.variant == ButtonVariant::Link; + let icon = |name| Icon::new(name).size(icon_size).color(tone.fg); + + div() + .id(self.id) + .flex() + .flex_none() + .items_center() + .justify_center() + .gap_1p5() + .h(theme.control_height(self.size)) + .when(!link, |el| el.px(theme.control_padding(self.size))) + .rounded(theme.radius(Radius::Md)) + .text_size(theme.text_size(text)) + .font_weight(FontWeight::MEDIUM) + .text_color(tone.fg) + .bg(tone.bg) + .when_some(tone.border, |el, border| el.border_1().border_color(border)) + .when(self.full_width, |el| el.w_full()) + .when_some(self.icon, |el, name| el.child(icon(name))) + .child(self.label) + .when_some(self.trailing_icon, |el, name| el.child(icon(name))) + .map(|el| { + if self.disabled { + return el.opacity(0.45).cursor_not_allowed(); + } + el.cursor_pointer() + .tab_index(0) + .hover(|style| { + let style = style.bg(tone.hover); + if link { style.underline() } else { style } + }) + .active(|style| style.bg(tone.pressed)) + .focus(|style| style.shadow(theme.focus_ring())) + .on_mouse_down(MouseButton::Left, |_, window, _| window.prevent_default()) + .when_some(self.on_click, |el, handler| el.on_click(handler)) + }) + } +} diff --git a/src/buttons/icon_button.rs b/src/buttons/icon_button.rs new file mode 100644 index 0000000..f96fc9c --- /dev/null +++ b/src/buttons/icon_button.rs @@ -0,0 +1,89 @@ +use gpui::{ + App, ClickEvent, ElementId, IntoElement, MouseButton, RenderOnce, Window, div, prelude::*, +}; + +use super::button::{ButtonVariant, ClickHandler, label_size, tone}; +use crate::{ + primitives::{Icon, IconName}, + theme::{ActiveTheme, ControlSize, Radius}, +}; + +/// Square button holding one icon. +#[derive(IntoElement)] +pub struct IconButton { + id: ElementId, + icon: IconName, + variant: ButtonVariant, + size: ControlSize, + disabled: bool, + on_click: Option, +} + +impl IconButton { + pub fn new(id: impl Into, icon: IconName) -> Self { + Self { + id: id.into(), + icon, + variant: ButtonVariant::Ghost, + size: ControlSize::default(), + disabled: false, + on_click: None, + } + } + + pub fn variant(mut self, variant: ButtonVariant) -> Self { + self.variant = variant; + self + } + + pub fn size(mut self, size: ControlSize) -> Self { + self.size = size; + self + } + + pub fn disabled(mut self, disabled: bool) -> Self { + self.disabled = disabled; + self + } + + pub fn on_click( + mut self, + handler: impl Fn(&ClickEvent, &mut Window, &mut App) + 'static, + ) -> Self { + self.on_click = Some(Box::new(handler)); + self + } +} + +impl RenderOnce for IconButton { + fn render(self, _: &mut Window, cx: &mut App) -> impl IntoElement { + let theme = cx.theme(); + let tone = tone(self.variant, &theme.colors); + let (_, icon_size) = label_size(self.size); + let side = theme.control_height(self.size); + + div() + .id(self.id) + .flex() + .flex_none() + .items_center() + .justify_center() + .size(side) + .rounded(theme.radius(Radius::Md)) + .bg(tone.bg) + .when_some(tone.border, |el, border| el.border_1().border_color(border)) + .child(Icon::new(self.icon).size(icon_size).color(tone.fg)) + .map(|el| { + if self.disabled { + return el.opacity(0.45).cursor_not_allowed(); + } + el.cursor_pointer() + .tab_index(0) + .hover(|style| style.bg(tone.hover)) + .active(|style| style.bg(tone.pressed)) + .focus(|style| style.shadow(theme.focus_ring())) + .on_mouse_down(MouseButton::Left, |_, window, _| window.prevent_default()) + .when_some(self.on_click, |el, handler| el.on_click(handler)) + }) + } +} diff --git a/src/buttons/mod.rs b/src/buttons/mod.rs new file mode 100644 index 0000000..8bc2ba0 --- /dev/null +++ b/src/buttons/mod.rs @@ -0,0 +1,5 @@ +mod button; +mod icon_button; + +pub use button::{Button, ButtonVariant}; +pub use icon_button::IconButton; diff --git a/src/lib.rs b/src/lib.rs new file mode 100644 index 0000000..3810e5e --- /dev/null +++ b/src/lib.rs @@ -0,0 +1,24 @@ +mod assets; + +pub mod buttons; +pub mod motion; +pub mod primitives; +pub mod theme; + +pub use assets::Assets; + +use gpui::App; + +use crate::primitives::IconName; + +/// Loads fonts and the theme. Call once, first. +pub fn init(cx: &mut App) { + let probe = IconName::Check.path(); + let wired = cx.asset_source().load(probe).ok().flatten().is_some(); + assert!( + wired, + "ely: pass `ely_gpui_component::Assets` to `Application::with_assets`" + ); + assets::load_fonts(cx).expect("ely: embedded fonts failed to register"); + theme::Theme::init(cx); +} diff --git a/src/motion/curve.rs b/src/motion/curve.rs new file mode 100644 index 0000000..be0bb6e --- /dev/null +++ b/src/motion/curve.rs @@ -0,0 +1,78 @@ +use std::time::Duration; + +use gpui::App; + +use crate::theme::ActiveTheme; + +pub const FAST: Duration = Duration::from_millis(120); +pub const BASE: Duration = Duration::from_millis(200); +pub const SLOW: Duration = Duration::from_millis(320); +pub const THEME: Duration = Duration::from_millis(280); + +const DAMPING: f32 = 0.75; +const OMEGA: f32 = 6.91 / DAMPING; + +/// `base`, or one millisecond under reduced motion. +pub fn duration(base: Duration, cx: &App) -> Duration { + if cx.theme().reduced_motion { + Duration::from_millis(1) + } else { + base + } +} + +pub fn lerp(from: f32, to: f32, t: f32) -> f32 { + from + (to - from) * t +} + +pub fn ease_out_cubic(t: f32) -> f32 { + 1.0 - (1.0 - t).powi(3) +} + +pub fn ease_in_out_cubic(t: f32) -> f32 { + if t < 0.5 { + 4.0 * t * t * t + } else { + 1.0 - (-2.0 * t + 2.0).powi(3) / 2.0 + } +} + +/// Damped spring. Overshoots; not a gpui easing. +pub fn spring(t: f32) -> f32 { + if t >= 1.0 { + return 1.0; + } + let damped = OMEGA * (1.0 - DAMPING * DAMPING).sqrt(); + let decay = (-DAMPING * OMEGA * t).exp(); + 1.0 - decay * ((damped * t).cos() + DAMPING * OMEGA / damped * (damped * t).sin()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn easings_pin_their_ends() { + for ease in [ease_out_cubic, ease_in_out_cubic, spring] { + assert!(ease(0.0).abs() < 1e-6); + assert_eq!(ease(1.0), 1.0); + } + } + + #[test] + fn spring_overshoots_a_little_then_settles() { + let peak = (0..=100) + .map(|i| spring(i as f32 / 100.0)) + .fold(0.0, f32::max); + assert!(peak > 1.01 && peak < 1.05, "peak {peak}"); + assert!((spring(0.95) - 1.0).abs() < 0.01); + } + + #[test] + fn ease_in_out_is_symmetric() { + for i in 0..=10 { + let t = i as f32 / 10.0; + assert!((ease_in_out_cubic(t) + ease_in_out_cubic(1.0 - t) - 1.0).abs() < 1e-5); + } + } +} diff --git a/src/motion/mod.rs b/src/motion/mod.rs new file mode 100644 index 0000000..cbbeefb --- /dev/null +++ b/src/motion/mod.rs @@ -0,0 +1,3 @@ +mod curve; + +pub use curve::*; diff --git a/src/primitives/icon.rs b/src/primitives/icon.rs new file mode 100644 index 0000000..f7a8b4f --- /dev/null +++ b/src/primitives/icon.rs @@ -0,0 +1,314 @@ +use gpui::{App, Hsla, IntoElement, Radians, RenderOnce, Transformation, Window, prelude::*, svg}; + +use crate::theme::{ActiveTheme, IconSize}; + +macro_rules! icons { + ($($variant:ident => $file:literal,)*) => { + /// Lucide icons bundled with Ely. + #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] + pub enum IconName { + $($variant,)* + } + + impl IconName { + pub const ALL: &[IconName] = &[$(IconName::$variant,)*]; + + pub fn path(self) -> &'static str { + match self { + $(IconName::$variant => concat!("icons/", $file, ".svg"),)* + } + } + } + }; +} + +icons! { + Accessibility => "accessibility", + Activity => "activity", + AlarmClock => "alarm-clock", + AlignCenter => "align-center", + AlignLeft => "align-left", + AlignRight => "align-right", + Archive => "archive", + ArrowDownLeft => "arrow-down-left", + ArrowDownWideNarrow => "arrow-down-wide-narrow", + ArrowDown => "arrow-down", + ArrowLeft => "arrow-left", + ArrowRight => "arrow-right", + ArrowUpNarrowWide => "arrow-up-narrow-wide", + ArrowUpRight => "arrow-up-right", + ArrowUp => "arrow-up", + AtSign => "at-sign", + Battery => "battery", + Bell => "bell", + Bold => "bold", + BookOpen => "book-open", + Bookmark => "bookmark", + Bot => "bot", + Box => "box", + Brush => "brush", + Bug => "bug", + CalendarDays => "calendar-days", + CalendarRange => "calendar-range", + Calendar => "calendar", + ChartBar => "chart-bar", + ChartCandlestick => "chart-candlestick", + ChartLine => "chart-line", + ChartPie => "chart-pie", + CheckCheck => "check-check", + Check => "check", + ChevronDown => "chevron-down", + ChevronLeft => "chevron-left", + ChevronRight => "chevron-right", + ChevronUp => "chevron-up", + ChevronsLeft => "chevrons-left", + ChevronsRight => "chevrons-right", + ChevronsUpDown => "chevrons-up-down", + CircleAlert => "circle-alert", + CircleCheck => "circle-check", + CircleDot => "circle-dot", + CircleHelp => "circle-help", + CirclePause => "circle-pause", + CircleStop => "circle-stop", + CircleX => "circle-x", + Circle => "circle", + ClipboardCheck => "clipboard-check", + Clipboard => "clipboard", + Clock => "clock", + CloudOff => "cloud-off", + Cloud => "cloud", + Code => "code", + Command => "command", + Compass => "compass", + Contrast => "contrast", + Copy => "copy", + Cpu => "cpu", + CreditCard => "credit-card", + Crop => "crop", + Crosshair => "crosshair", + Database => "database", + DollarSign => "dollar-sign", + Dot => "dot", + Download => "download", + EllipsisVertical => "ellipsis-vertical", + Ellipsis => "ellipsis", + Eraser => "eraser", + ExternalLink => "external-link", + EyeOff => "eye-off", + Eye => "eye", + FilePlus => "file-plus", + FileText => "file-text", + File => "file", + Filter => "filter", + Fingerprint => "fingerprint", + Flag => "flag", + FolderOpen => "folder-open", + FolderPlus => "folder-plus", + Folder => "folder", + Forward => "forward", + Frame => "frame", + Gauge => "gauge", + GitBranch => "git-branch", + GitCommitHorizontal => "git-commit-horizontal", + GitMerge => "git-merge", + GitPullRequest => "git-pull-request", + Globe => "globe", + GripHorizontal => "grip-horizontal", + GripVertical => "grip-vertical", + Hand => "hand", + HardDrive => "hard-drive", + Hash => "hash", + Heading => "heading", + Heart => "heart", + History => "history", + Hourglass => "hourglass", + House => "house", + Image => "image", + Inbox => "inbox", + Info => "info", + Italic => "italic", + Kanban => "kanban", + Key => "key", + Keyboard => "keyboard", + Languages => "languages", + Layers => "layers", + LayoutDashboard => "layout-dashboard", + LayoutGrid => "layout-grid", + Library => "library", + Lightbulb => "lightbulb", + Link => "link", + ListChecks => "list-checks", + ListOrdered => "list-ordered", + ListTodo => "list-todo", + List => "list", + LoaderCircle => "loader-circle", + LockOpen => "lock-open", + Lock => "lock", + LogIn => "log-in", + LogOut => "log-out", + Mail => "mail", + MapPin => "map-pin", + Map => "map", + Maximize2 => "maximize-2", + MemoryStick => "memory-stick", + Menu => "menu", + MessageSquare => "message-square", + MicOff => "mic-off", + Mic => "mic", + Minimize2 => "minimize-2", + Minus => "minus", + Monitor => "monitor", + Moon => "moon", + MousePointer2 => "mouse-pointer-2", + Move => "move", + Network => "network", + NotebookPen => "notebook-pen", + Package => "package", + Palette => "palette", + PanelBottom => "panel-bottom", + PanelLeft => "panel-left", + PanelRight => "panel-right", + Paperclip => "paperclip", + Pause => "pause", + PenTool => "pen-tool", + Pencil => "pencil", + PhoneOff => "phone-off", + Phone => "phone", + PinOff => "pin-off", + Pin => "pin", + Play => "play", + Plus => "plus", + Power => "power", + Printer => "printer", + Puzzle => "puzzle", + Quote => "quote", + Redo2 => "redo-2", + RefreshCw => "refresh-cw", + Reply => "reply", + Rocket => "rocket", + RotateCcw => "rotate-ccw", + RotateCw => "rotate-cw", + Save => "save", + Scissors => "scissors", + Search => "search", + Send => "send", + Server => "server", + Settings => "settings", + Shapes => "shapes", + Share2 => "share-2", + Shield => "shield", + SkipBack => "skip-back", + SkipForward => "skip-forward", + SlidersHorizontal => "sliders-horizontal", + Smartphone => "smartphone", + Smile => "smile", + Sparkles => "sparkles", + Spline => "spline", + SquareCheck => "square-check", + Square => "square", + Star => "star", + StepForward => "step-forward", + Strikethrough => "strikethrough", + Sun => "sun", + Table => "table", + Tag => "tag", + Target => "target", + Terminal => "terminal", + ThumbsDown => "thumbs-down", + ThumbsUp => "thumbs-up", + Timer => "timer", + Trash2 => "trash-2", + TrendingDown => "trending-down", + TrendingUp => "trending-up", + TriangleAlert => "triangle-alert", + Type => "type", + Underline => "underline", + Undo2 => "undo-2", + Upload => "upload", + User => "user", + Users => "users", + VideoOff => "video-off", + Video => "video", + Volume2 => "volume-2", + VolumeX => "volume-x", + Wallet => "wallet", + WandSparkles => "wand-sparkles", + WifiOff => "wifi-off", + Wifi => "wifi", + X => "x", + Zap => "zap", + ZoomIn => "zoom-in", + ZoomOut => "zoom-out", +} + +#[derive(IntoElement)] +pub struct Icon { + name: IconName, + size: IconSize, + color: Option, + rotation: Option, +} + +impl Icon { + pub fn new(name: IconName) -> Self { + Self { + name, + size: IconSize::Md, + color: None, + rotation: None, + } + } + + pub fn size(mut self, size: IconSize) -> Self { + self.size = size; + self + } + + /// Defaults to `colors.fg`. + pub fn color(mut self, color: impl Into) -> Self { + self.color = Some(color.into()); + self + } + + pub fn rotate(mut self, angle: impl Into) -> Self { + self.rotation = Some(angle.into()); + self + } +} + +impl From for Icon { + fn from(name: IconName) -> Self { + Icon::new(name) + } +} + +impl RenderOnce for Icon { + fn render(self, _: &mut Window, cx: &mut App) -> impl IntoElement { + let theme = cx.theme(); + let color = self.color.unwrap_or(theme.colors.fg); + svg() + .path(self.name.path()) + .size(theme.icon_size(self.size)) + .flex_none() + .text_color(color) + .when_some(self.rotation, |svg, angle| { + svg.with_transformation(Transformation::rotate(angle)) + }) + } +} + +#[cfg(test)] +mod tests { + use super::IconName; + + #[test] + fn every_icon_ships_in_the_bundle() { + for icon in IconName::ALL { + assert!( + crate::Assets::get(icon.path()).is_some(), + "{icon:?} missing at {}", + icon.path() + ); + } + } +} diff --git a/src/primitives/mod.rs b/src/primitives/mod.rs new file mode 100644 index 0000000..66e070c --- /dev/null +++ b/src/primitives/mod.rs @@ -0,0 +1,3 @@ +mod icon; + +pub use icon::{Icon, IconName}; diff --git a/src/theme/mod.rs b/src/theme/mod.rs new file mode 100644 index 0000000..9394ba2 --- /dev/null +++ b/src/theme/mod.rs @@ -0,0 +1,136 @@ +mod palette; +mod tokens; + +use std::time::{Duration, Instant}; + +use gpui::{App, Global, SharedString, WindowAppearance}; + +use crate::motion; +pub use palette::{Mix, Palette, Syntax}; +pub use tokens::{ControlSize, Density, Elevation, IconSize, Radius, TextSize}; + +const FRAME: Duration = Duration::from_millis(8); + +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +pub enum Mode { + #[default] + Light, + Dark, +} + +impl From for Mode { + fn from(appearance: WindowAppearance) -> Self { + match appearance { + WindowAppearance::Dark | WindowAppearance::VibrantDark => Mode::Dark, + WindowAppearance::Light | WindowAppearance::VibrantLight => Mode::Light, + } + } +} + +/// Design tokens. One global per app. +pub struct Theme { + mode: Mode, + high_contrast: bool, + transition: u64, + pub colors: Palette, + pub density: Density, + pub radius_scale: f32, + pub font_scale: f32, + pub font_family: SharedString, + pub mono_family: SharedString, + pub reduced_motion: bool, +} + +impl Global for Theme {} + +pub trait ActiveTheme { + fn theme(&self) -> &Theme; +} + +impl ActiveTheme for App { + fn theme(&self) -> &Theme { + self.global::() + } +} + +impl Theme { + pub(crate) fn init(cx: &mut App) { + cx.set_global(Theme { + mode: Mode::Light, + high_contrast: false, + transition: 0, + colors: Palette::light(false), + density: Density::Standard, + radius_scale: 1.0, + font_scale: 1.0, + font_family: "Inter".into(), + mono_family: "JetBrains Mono".into(), + reduced_motion: false, + }); + } + + pub fn mode(&self) -> Mode { + self.mode + } + + pub fn high_contrast(&self) -> bool { + self.high_contrast + } + + pub fn is_dark(&self) -> bool { + self.mode == Mode::Dark + } + + /// Cross-fades the palette to `mode`. + pub fn set_mode(mode: Mode, cx: &mut App) { + log::info!("theme: mode -> {mode:?}"); + cx.global_mut::().mode = mode; + Self::fade_to_target(cx); + } + + pub fn set_high_contrast(on: bool, cx: &mut App) { + log::info!("theme: high contrast -> {on}"); + cx.global_mut::().high_contrast = on; + Self::fade_to_target(cx); + } + + /// Edits non-color tokens, then repaints. + pub fn update(cx: &mut App, edit: impl FnOnce(&mut Theme)) { + edit(cx.global_mut::()); + cx.refresh_windows(); + } + + fn target(&self) -> Palette { + match self.mode { + Mode::Light => Palette::light(self.high_contrast), + Mode::Dark => Palette::dark(self.high_contrast), + } + } + + fn fade_to_target(cx: &mut App) { + let duration = motion::duration(motion::THEME, cx); + let theme = cx.global_mut::(); + theme.transition += 1; + let (id, from, to) = (theme.transition, theme.colors.clone(), theme.target()); + let start = Instant::now(); + cx.spawn(async move |cx| { + loop { + cx.background_executor().timer(FRAME).await; + let t = (start.elapsed().as_secs_f32() / duration.as_secs_f32()).min(1.0); + let running = cx.update(|cx| { + let theme = cx.global_mut::(); + if theme.transition != id { + return false; + } + theme.colors = from.mix(&to, motion::ease_in_out_cubic(t)); + cx.refresh_windows(); + t < 1.0 + })?; + if !running { + return anyhow::Ok(()); + } + } + }) + .detach_and_log_err(cx); + } +} diff --git a/src/theme/palette.rs b/src/theme/palette.rs new file mode 100644 index 0000000..425b45b --- /dev/null +++ b/src/theme/palette.rs @@ -0,0 +1,265 @@ +use gpui::{Hsla, Rgba, rgb, rgba}; + +pub trait Mix { + fn mix(&self, to: &Self, t: f32) -> Self; +} + +impl Mix for Hsla { + fn mix(&self, to: &Self, t: f32) -> Self { + if t <= 0.0 { + return *self; + } + if t >= 1.0 { + return *to; + } + let (a, b) = (self.to_rgb(), to.to_rgb()); + let lerp = |x: f32, y: f32| x + (y - x) * t; + Rgba { + r: lerp(a.r, b.r), + g: lerp(a.g, b.g), + b: lerp(a.b, b.b), + a: lerp(a.a, b.a), + } + .into() + } +} + +impl Mix for [Hsla; N] { + fn mix(&self, to: &Self, t: f32) -> Self { + std::array::from_fn(|i| self[i].mix(&to[i], t)) + } +} + +macro_rules! mixable { + ($(#[$meta:meta])* $name:ident { $($field:ident: $ty:ty),* $(,)? }) => { + $(#[$meta])* + #[derive(Clone, Debug, PartialEq)] + pub struct $name { + $(pub $field: $ty,)* + } + + impl Mix for $name { + fn mix(&self, to: &Self, t: f32) -> Self { + Self { $($field: self.$field.mix(&to.$field, t),)* } + } + } + }; +} + +mixable!( + /// Code token colors. + Syntax { + keyword: Hsla, + string: Hsla, + number: Hsla, + comment: Hsla, + function: Hsla, + type_name: Hsla, + constant: Hsla, + property: Hsla, + tag: Hsla, + attribute: Hsla, + operator: Hsla, + punctuation: Hsla, + variable: Hsla, + } +); + +mixable!( + /// Semantic colors. Components read these, never literals. + Palette { + bg: Hsla, + surface: Hsla, + sunken: Hsla, + overlay: Hsla, + hover: Hsla, + active: Hsla, + border: Hsla, + border_strong: Hsla, + fg: Hsla, + fg_muted: Hsla, + fg_subtle: Hsla, + fg_disabled: Hsla, + accent: Hsla, + accent_hover: Hsla, + on_accent: Hsla, + focus: Hsla, + link: Hsla, + selection: Hsla, + success: Hsla, + warning: Hsla, + danger: Hsla, + info: Hsla, + success_subtle: Hsla, + warning_subtle: Hsla, + danger_subtle: Hsla, + info_subtle: Hsla, + backdrop: Hsla, + shadow: Hsla, + chart: [Hsla; 8], + ansi: [Hsla; 16], + syntax: Syntax, + } +); + +fn c(hex: u32) -> Hsla { + rgb(hex).into() +} + +fn c8(hex: [u32; N]) -> [Hsla; N] { + hex.map(c) +} + +impl Palette { + pub fn light(high_contrast: bool) -> Self { + let mut palette = Self { + bg: c(0xfcfaf7), + surface: c(0xffffff), + sunken: c(0xf6f4f1), + overlay: c(0xffffff), + hover: c(0xf2f0ed), + active: c(0xe9e7e5), + border: c(0xe1dfdd), + border_strong: c(0xcccac8), + fg: c(0x181613), + fg_muted: c(0x605d5a), + fg_subtle: c(0x82807d), + fg_disabled: c(0xacaaa8), + accent: c(0x181613), + accent_hover: c(0x302d2b), + on_accent: c(0xfcfaf7), + focus: c(0x3772bb), + link: c(0x2863ab), + selection: rgba(0x3772bb33).into(), + success: c(0x267b4c), + warning: c(0xa25f12), + danger: c(0xba3e38), + info: c(0x2e69b2), + success_subtle: c(0xe7f9ec), + warning_subtle: c(0xfef2dd), + danger_subtle: c(0xffefec), + info_subtle: c(0xebf4ff), + backdrop: rgba(0x18161352).into(), + shadow: c(0x181613), + chart: c8([ + 0x5182c1, 0x009589, 0xaa732b, 0xb8636b, 0x8572bb, 0x539156, 0xb66946, 0x138db1, + ]), + ansi: c8([ + 0x181613, 0xa34942, 0x287c42, 0x8c5f00, 0x346aac, 0x875093, 0x007c84, 0xacaaa8, + 0x605d5a, 0xbd6158, 0x439458, 0xa57710, 0x4c82c6, 0xa067ac, 0x00959c, 0xcccac8, + ]), + syntax: Syntax { + keyword: c(0x714ca6), + string: c(0x317a45), + number: c(0xb3621e), + comment: c(0x82807d), + function: c(0x2863ab), + type_name: c(0x1e7777), + constant: c(0xb1582b), + property: c(0xa14759), + tag: c(0xa14759), + attribute: c(0xa25f12), + operator: c(0x605d5a), + punctuation: c(0x605d5a), + variable: c(0x181613), + }, + }; + if high_contrast { + palette.fg_muted = c(0x44423f); + palette.fg_subtle = c(0x575552); + palette.border = c(0xa6a4a2); + palette.border_strong = c(0x82807d); + } + palette + } + + pub fn dark(high_contrast: bool) -> Self { + let mut palette = Self { + bg: c(0x131110), + surface: c(0x1b1917), + sunken: c(0x0e0d0b), + overlay: c(0x201f1d), + hover: c(0x252422), + active: c(0x2c2b29), + border: c(0x2c2b29), + border_strong: c(0x413f3d), + fg: c(0xf3f1f0), + fg_muted: c(0xafadab), + fg_subtle: c(0x858380), + fg_disabled: c(0x5c5a58), + accent: c(0xf3f1f0), + accent_hover: c(0xd9d7d5), + on_accent: c(0x131110), + focus: c(0x69a1e8), + link: c(0x7eb1f3), + selection: rgba(0x69a1e84d).into(), + success: c(0x6bbc89), + warning: c(0xe8b45e), + danger: c(0xe5756e), + info: c(0x77abec), + success_subtle: c(0x182c1f), + warning_subtle: c(0x342611), + danger_subtle: c(0x3a1d1b), + info_subtle: c(0x19273a), + backdrop: rgba(0x00000080).into(), + shadow: c(0x000000), + chart: c8([ + 0x79a7e2, 0x4eb9ad, 0xcd995c, 0xdc8a90, 0xa998dd, 0x7cb57d, 0xd9906f, 0x56b2d4, + ]), + ansi: c8([ + 0x2c2b29, 0xe1897f, 0x6fb880, 0xc99d4e, 0x74a7e8, 0xc38ecf, 0x35b9c0, 0xafadab, + 0x5c5a58, 0xfda297, 0x89d298, 0xe3b667, 0x8dc1ff, 0xdda7ea, 0x56d3da, 0xf3f1f0, + ]), + syntax: Syntax { + keyword: c(0xbba3e8), + string: c(0x8ac596), + number: c(0xeaab78), + comment: c(0x858380), + function: c(0x85b6e9), + type_name: c(0x84c9c8), + constant: c(0xeda382), + property: c(0xe29fa9), + tag: c(0xe29fa9), + attribute: c(0xe1b671), + operator: c(0xafadab), + punctuation: c(0xafadab), + variable: c(0xf3f1f0), + }, + }; + if high_contrast { + palette.fg_muted = c(0xcfcdcb); + palette.fg_subtle = c(0xafadab); + palette.border = c(0x6a6966); + palette.border_strong = c(0x858380); + } + palette + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn mix_hits_both_ends_and_the_middle() { + let (black, white) = (c(0x000000), c(0xffffff)); + assert_eq!(black.mix(&white, 0.0).to_rgb().r, 0.0); + assert_eq!(black.mix(&white, 1.0).to_rgb().r, 1.0); + assert!((black.mix(&white, 0.5).to_rgb().g - 0.5).abs() < 1e-4); + } + + #[test] + fn palette_mix_moves_every_field() { + let (light, dark) = (Palette::light(false), Palette::dark(false)); + assert_eq!(light.mix(&dark, 1.0), dark); + assert_eq!(light.mix(&dark, 0.0), light); + } + + #[test] + fn high_contrast_strengthens_borders() { + let (base, hc) = (Palette::light(false), Palette::light(true)); + assert!(hc.border.l < base.border.l); + let (base, hc) = (Palette::dark(false), Palette::dark(true)); + assert!(hc.border.l > base.border.l); + } +} diff --git a/src/theme/tokens.rs b/src/theme/tokens.rs new file mode 100644 index 0000000..58363ce --- /dev/null +++ b/src/theme/tokens.rs @@ -0,0 +1,161 @@ +use gpui::{BoxShadow, Hsla, Rems, point, px, rems}; + +use super::{Mode, Theme}; + +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +pub enum Density { + Compact, + #[default] + Standard, + Comfortable, +} + +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +pub enum ControlSize { + Sm, + #[default] + Md, + Lg, +} + +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)] +pub enum IconSize { + Xs, + Sm, + #[default] + Md, + Lg, + Xl, + Xxl, +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum TextSize { + Xs, + Sm, + Base, + Md, + Lg, + Xl, + Xxl, + Display, +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum Radius { + Sm, + Md, + Lg, + Xl, +} + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum Elevation { + Raised, + Floating, + Modal, +} + +fn px_to_rems(value: f32) -> Rems { + rems(value / 16.0) +} + +impl Theme { + pub fn control_height(&self, size: ControlSize) -> Rems { + let base = match size { + ControlSize::Sm => 24.0, + ControlSize::Md => 28.0, + ControlSize::Lg => 32.0, + }; + let delta = match self.density { + Density::Compact => -4.0, + Density::Standard => 0.0, + Density::Comfortable => 4.0, + }; + px_to_rems(base + delta) + } + + pub fn control_padding(&self, size: ControlSize) -> Rems { + let base = match size { + ControlSize::Sm => 8.0, + ControlSize::Md => 12.0, + ControlSize::Lg => 16.0, + }; + let delta = match self.density { + Density::Compact => -2.0, + Density::Standard => 0.0, + Density::Comfortable => 2.0, + }; + px_to_rems(base + delta) + } + + pub fn icon_size(&self, size: IconSize) -> Rems { + let base = match size { + IconSize::Xs => 12.0, + IconSize::Sm => 14.0, + IconSize::Md => 16.0, + IconSize::Lg => 20.0, + IconSize::Xl => 24.0, + IconSize::Xxl => 32.0, + }; + px_to_rems(base * self.font_scale) + } + + pub fn text_size(&self, size: TextSize) -> Rems { + let base = match size { + TextSize::Xs => 11.0, + TextSize::Sm => 12.0, + TextSize::Base => 13.0, + TextSize::Md => 14.0, + TextSize::Lg => 16.0, + TextSize::Xl => 20.0, + TextSize::Xxl => 24.0, + TextSize::Display => 32.0, + }; + px_to_rems(base * self.font_scale) + } + + pub fn radius(&self, size: Radius) -> Rems { + let base = match size { + Radius::Sm => 4.0, + Radius::Md => 6.0, + Radius::Lg => 8.0, + Radius::Xl => 12.0, + }; + px_to_rems(base * self.radius_scale) + } + + pub fn elevation(&self, level: Elevation) -> Vec { + let dark = self.mode == Mode::Dark; + let layers: &[(f32, f32, f32)] = match (level, dark) { + (Elevation::Raised, false) => &[(1.0, 2.0, 0.06)], + (Elevation::Floating, false) => &[(1.0, 2.0, 0.04), (6.0, 16.0, 0.08)], + (Elevation::Modal, false) => &[(2.0, 4.0, 0.04), (16.0, 40.0, 0.14)], + (Elevation::Raised, true) => &[(1.0, 2.0, 0.4)], + (Elevation::Floating, true) => &[(2.0, 4.0, 0.3), (8.0, 24.0, 0.45)], + (Elevation::Modal, true) => &[(4.0, 8.0, 0.3), (20.0, 48.0, 0.55)], + }; + layers + .iter() + .map(|&(y, blur, alpha)| shadow(self.colors.shadow.alpha(alpha), y, blur)) + .collect() + } + + pub fn focus_ring(&self) -> Vec { + vec![BoxShadow { + color: self.colors.focus.alpha(0.45), + offset: point(px(0.0), px(0.0)), + blur_radius: px(0.0), + spread_radius: px(2.0), + }] + } +} + +fn shadow(color: Hsla, y: f32, blur: f32) -> BoxShadow { + BoxShadow { + color, + offset: point(px(0.0), px(y)), + blur_radius: px(blur), + spread_radius: px(0.0), + } +} diff --git a/tasks/ch01-10.md b/tasks/ch01-10.md new file mode 100644 index 0000000..e21d042 --- /dev/null +++ b/tasks/ch01-10.md @@ -0,0 +1,365 @@ +# Chapters 1–10 + +## T01 Primitives — `src/primitives` + +- [ ] Box / View — native `div()` +- [ ] Text — native: strings and `StyledText` are elements +- [x] Icon (T00) +- [x] IconSet / IconRegistry (T00) +- [ ] Svg — native `svg()` +- [ ] Image — loading, failed, placeholder over `img()` +- [ ] Canvas — native `canvas()` +- [ ] Divider / Separator +- [ ] Spacer — native `div().flex_1()` +- [ ] Portal — native `deferred(anchored())` +- [ ] Overlay / Backdrop +- [ ] Slot — native `impl IntoElement` params and `ParentElement` +- [ ] Show / When — native `.when()` / `.when_some()` +- [ ] For / Each — native `.children(iter)` +- [ ] Fragment — native: children take iterators +- [ ] VisuallyHidden — blocked: gpui 0.2.2 has no accessibility tree +- [ ] FocusRing +- [ ] FocusScope / FocusTrap +- [ ] ClickOutside — native `on_mouse_down_out` +- [ ] HoverArea — native `on_hover` / `.hover()` +- [ ] Pressable — press state, long press +- [ ] KeyboardHandler — native `on_key_down` / `on_action` +- [ ] Measure +- [ ] ResizeObserver → `primitives::Measure` +- [ ] IntersectionObserver +- [ ] Clipboard — native `write_to_clipboard` / `read_from_clipboard` +- [ ] Tooltip Trigger — owns `Tooltip`: delay, follow mouse, rich content + +## T02 Typography — `src/typography` + +- [ ] Heading (H1–H6) +- [ ] Title / Subtitle +- [ ] Paragraph +- [ ] Label +- [ ] Caption +- [ ] Overline +- [ ] Code +- [ ] Kbd — ⌘ / Ctrl by platform +- [ ] KbdCombo +- [ ] Blockquote +- [ ] Highlight / Mark +- [ ] Truncate — native `.truncate()` +- [ ] LineClamp — native `.line_clamp(n)` +- [ ] MiddleEllipsis +- [ ] EllipsisTooltip +- [ ] Link +- [ ] ExternalLink +- [ ] RelativeTime +- [ ] DateTimeText +- [ ] NumberText +- [ ] CurrencyText +- [ ] PercentText +- [ ] FileSizeText +- [ ] DurationText +- [ ] PluralText +- [ ] CopyableText +- [ ] SelectableText — prove: selection over `StyledText` layout +- [ ] Emoji — shortcodes +- [ ] Latex / MathInline — prove: TeX subset +- [ ] AnimatedNumber +- [ ] Typewriter +- [ ] GradientText — per-glyph tonal ramp +- [ ] ShimmerText + +## T03 Layout — `src/layout` + +- [ ] Stack / HStack / VStack +- [ ] Flex — native `.flex()` +- [ ] Grid / GridItem — native `.grid()`, `.col_span()` +- [ ] SimpleGrid +- [ ] Masonry +- [ ] Center — native `.flex().items_center().justify_center()` +- [ ] Container +- [ ] AspectRatio +- [ ] Inset / Padding — native `.p_*()` +- [ ] Wrap — native `.flex_wrap()` +- [ ] Absolute / Positioned — native `.absolute()` +- [ ] Layer / ZStack +- [ ] ScrollArea +- [ ] Scrollbar +- [ ] ScrollShadow +- [ ] ScrollToTop +- [ ] StickyHeader +- [ ] SplitPane — horizontal, vertical, nested +- [ ] ResizablePanel / ResizablePanelGroup → `layout::SplitPane` +- [ ] ResizeHandle +- [ ] Collapsible +- [ ] Accordion / AccordionItem +- [ ] Card / CardHeader / CardBody / CardFooter +- [ ] Panel / PanelHeader +- [ ] Section / SectionHeader +- [ ] Group / Fieldset +- [ ] Frame +- [ ] Well +- [ ] Sidebar +- [ ] Drawer +- [ ] Sheet +- [ ] Page / PageHeader / PageContent +- [ ] AppShell +- [ ] MasterDetail +- [ ] ThreeColumnLayout → `layout::SplitPane` +- [ ] Dock / DockPanel +- [ ] DockZone / DropIndicator +- [ ] FloatingPanel +- [ ] Pane / PaneGroup +- [ ] Workspace — versioned layout snapshot +- [ ] Viewport + +## T04 Window & Shell — `src/shell` + +- [ ] TitleBar +- [ ] WindowControls — macOS, Windows, Linux +- [ ] TrafficLights → `shell::WindowControls` +- [ ] WindowDragRegion — native `window_control_area` +- [ ] WindowResizeBorder — prove: client-side decorations +- [ ] MenuBar +- [ ] NativeMenu — native `cx.set_menus()` +- [ ] Toolbar / ToolbarGroup / ToolbarSeparator +- [ ] StatusBar / StatusBarItem +- [ ] ActivityBar +- [ ] NavigationRail → `shell::ActivityBar` +- [ ] TabBar +- [ ] SplashScreen +- [ ] AboutDialog +- [ ] TrayIcon / TrayMenu — prove +- [ ] DockBadge — prove +- [ ] JumpList — native `cx.set_dock_menu()` +- [ ] SystemNotification — prove +- [ ] MultiWindow Manager +- [ ] WindowSwitcher +- [ ] QuickLauncher +- [ ] MiniWindow / CompactMode +- [ ] AlwaysOnTop — native `WindowKind::PopUp` +- [ ] PictureInPicture — host content +- [ ] UpdateBanner / UpdateDialog +- [ ] CrashReporter +- [ ] OfflineIndicator +- [ ] ZoomControl + +## T05 Buttons & Actions — `src/buttons` + +- [x] Button (T00) +- [x] IconButton (T00) +- [ ] ButtonGroup +- [ ] SplitButton +- [ ] DropdownButton / MenuButton +- [ ] ToggleButton +- [ ] ToggleGroup +- [ ] SegmentedControl +- [ ] FloatingActionButton +- [ ] LoadingButton → `buttons::Button` loading state +- [ ] ConfirmButton — hold or click twice +- [ ] HoldToConfirm → `buttons::ConfirmButton` +- [ ] CopyButton +- [ ] ShareButton +- [ ] CloseButton +- [ ] BackButton +- [ ] MoreButton +- [ ] ActionBar +- [ ] BulkActionBar +- [ ] ActionSheet +- [ ] QuickActions +- [ ] ShortcutHint + +## T06a Forms · Text — `src/forms` + +- [ ] Input / TextField +- [ ] TextArea +- [ ] PasswordInput +- [ ] SearchInput +- [ ] NumberInput +- [ ] ScrubInput +- [ ] CurrencyInput +- [ ] PercentInput +- [ ] UnitInput +- [ ] EmailInput +- [ ] UrlInput +- [ ] PhoneInput +- [ ] MaskedInput +- [ ] PinInput / OTPInput +- [ ] InlineEdit / EditableText +- [ ] InputGroup / InputAddon +- [ ] ClearableInput → `forms::Input` +- [ ] AutoResizeInput → `forms::Input` +- [ ] MentionInput +- [ ] HashtagInput +- [ ] TagInput / TokenInput +- [ ] KeyValueInput +- [ ] ListInput +- [ ] PathInput — native dialog via `prompt_for_paths` +- [ ] RegexInput +- [ ] ExpressionInput +- [ ] HotkeyInput / ShortcutRecorder + +## T06b Forms · Selection + +- [ ] Checkbox +- [ ] CheckboxGroup +- [ ] CheckboxCard +- [ ] Radio / RadioGroup +- [ ] RadioCard +- [ ] Switch / Toggle +- [ ] Select +- [ ] NativeSelect — blocked: gpui 0.2.2 has no native popup menu +- [ ] Combobox +- [ ] Autocomplete +- [ ] MultiSelect +- [ ] CascadeSelect / Cascader +- [ ] TreeSelect +- [ ] TransferList +- [ ] ListBox +- [ ] ChoiceChips / FilterChips +- [ ] Rating +- [ ] Slider +- [ ] RangeSlider +- [ ] VerticalSlider → `forms::Slider` +- [ ] Knob / Dial +- [ ] Stepper + +## T06c Forms · Date & Time + +- [ ] Calendar +- [ ] DatePicker +- [ ] DateRangePicker +- [ ] TimePicker +- [ ] DateTimePicker +- [ ] MonthPicker / YearPicker / QuarterPicker +- [ ] WeekPicker +- [ ] RelativeDatePicker +- [ ] TimezoneSelect +- [ ] DurationPicker +- [ ] CronEditor + +## T06d Forms · Color + +- [ ] ColorPicker — HSV, RGB, HEX, alpha +- [ ] ColorSwatch +- [ ] ColorPalette +- [ ] EyeDropper — prove: `NSColorSampler` +- [ ] GradientEditor + +## T06e Forms · Files + +- [ ] FilePicker / FileInput +- [ ] FolderPicker +- [ ] DropZone +- [ ] UploadList +- [ ] ImageUpload — preview, crop +- [ ] AvatarUpload + +## T06f Forms · Other + +- [ ] SignaturePad +- [ ] CodeInput +- [ ] JsonInput +- [ ] FontPicker +- [ ] IconPicker +- [ ] EmojiPicker +- [ ] LanguageSelect +- [ ] CountrySelect +- [ ] CurrencySelect + +## T06g Forms · Structure + +- [ ] Form +- [ ] FormField +- [ ] FormLabel +- [ ] FormDescription / HelperText +- [ ] FormError / ValidationMessage +- [ ] FormSection +- [ ] FormActions +- [ ] FieldArray +- [ ] InlineForm +- [ ] WizardForm / MultiStepForm +- [ ] DirtyIndicator + +## T07 Navigation — `src/navigation` + +- [ ] Tabs — top, left, bottom +- [ ] EditorTabs +- [ ] TabOverflowMenu +- [ ] Breadcrumb +- [ ] Pagination +- [ ] LoadMore +- [ ] Stepper / Steps / Wizard — as `Steps` +- [ ] Sidebar Navigation / NavItem / NavGroup +- [ ] NavigationMenu +- [ ] ActivityBar Item → `shell::ActivityBar` +- [ ] BackForwardNavigation +- [ ] History Navigation → `navigation::BackForwardNavigation` +- [ ] Anchor / TableOfContents +- [ ] JumpTo / GoToLine +- [ ] CommandPalette +- [ ] QuickOpen +- [ ] QuickSwitcher +- [ ] SearchPalette +- [ ] SpotlightSearch → `navigation::SearchPalette` +- [ ] Tour / Onboarding + +## T08 Menus — `src/menus` + +- [ ] Menu / MenuItem / MenuGroup / MenuSeparator +- [ ] SubMenu +- [ ] CheckboxMenuItem +- [ ] RadioMenuItem +- [ ] MenuItemShortcut +- [ ] MenuItemIcon +- [ ] ContextMenu +- [ ] DropdownMenu +- [ ] MenuBar Menu → `shell::MenuBar` +- [ ] OverflowMenu +- [ ] MegaMenu +- [ ] SearchableMenu +- [ ] PieMenu / RadialMenu + +## T09 Overlays — `src/overlays` + +- [ ] Tooltip → `primitives::Tooltip` +- [ ] Popover +- [ ] HoverCard +- [ ] Dialog / Modal +- [ ] AlertDialog +- [ ] ConfirmDialog +- [ ] PromptDialog +- [ ] FullscreenDialog +- [ ] Sheet → `layout::Sheet` +- [ ] Drawer → `layout::Drawer` +- [ ] Lightbox +- [ ] Spotlight / Coachmark +- [ ] FloatingToolbar +- [ ] Callout / Peek +- [ ] DropdownPanel → `overlays::Popover` +- [ ] InlinePopup → `overlays::Popover` +- [ ] ToastViewport + +## T10 Feedback — `src/feedback` + +- [ ] Toast — success, error, warning, info, action, undo +- [ ] Notification +- [ ] NotificationCenter +- [ ] Alert +- [ ] Banner +- [ ] Callout / Admonition +- [ ] InlineMessage +- [ ] StatusMessage +- [ ] Snackbar → `feedback::Toast` +- [ ] UndoToast → `feedback::Toast` +- [ ] ErrorView +- [ ] ErrorBoundary — renders and logs a `Result` error; never catches panics +- [ ] NotFound / 404 → `feedback::ErrorView` +- [ ] NoPermission / 403 → `feedback::ErrorView` +- [ ] Maintenance → `feedback::ErrorView` +- [ ] Offline → `feedback::ErrorView` +- [ ] EmptyState +- [ ] Result +- [ ] ConfirmationCard +- [ ] SavingIndicator +- [ ] SyncStatus +- [ ] ConnectionStatus +- [ ] Countdown +- [ ] Timer diff --git a/tasks/ch11-20.md b/tasks/ch11-20.md new file mode 100644 index 0000000..29d2852 --- /dev/null +++ b/tasks/ch11-20.md @@ -0,0 +1,361 @@ +# Chapters 11–20 + +## T11a Loading — `src/motion` + +- [ ] Spinner — ring, dots, bars, pulse, orbit, wave +- [ ] DotsLoader → `motion::Spinner` +- [ ] BarsLoader → `motion::Spinner` +- [ ] PulseLoader → `motion::Spinner` +- [ ] RingLoader → `motion::Spinner` +- [ ] OrbitLoader → `motion::Spinner` +- [ ] WaveLoader → `motion::Spinner` +- [ ] Skeleton / SkeletonText / SkeletonAvatar / SkeletonCard / SkeletonTable +- [ ] Shimmer +- [ ] ProgressBar — determinate, indeterminate, segmented, buffered +- [ ] ProgressCircle / ProgressRing +- [ ] StepProgress +- [ ] LoadingOverlay +- [ ] LoadingScreen +- [ ] InlineLoader → `motion::Spinner` +- [ ] LazyLoad +- [ ] Suspense / AsyncView +- [ ] RefreshIndicator +- [ ] TypingIndicator + +## T11b Motion + +- [ ] Transition — fade, slide, scale, collapse +- [ ] AnimatePresence +- [ ] Motion +- [ ] Spring +- [ ] Stagger +- [ ] Reorder +- [ ] Flip +- [ ] CountUp → `typography::AnimatedNumber` +- [ ] Marquee +- [ ] Ripple +- [ ] Confetti +- [ ] Glow / Pulse +- [ ] Blink / Flash +- [ ] Shake +- [ ] ParticleBackground +- [ ] AnimatedGradient — slow tonal drift +- [ ] Lottie Player — prove: `rlottie` frames + +## T12 Data Display — `src/data_display` + +- [ ] Badge / CountBadge / DotBadge +- [ ] Tag / Chip +- [ ] Avatar — image, initials, icon, presence +- [ ] AvatarGroup +- [ ] UserChip +- [ ] Statistic / KPI Card +- [ ] Metric +- [ ] TrendIndicator +- [ ] DescriptionList +- [ ] PropertyGrid +- [ ] KeyValueList → `data_display::DescriptionList` +- [ ] InfoRow → `data_display::DescriptionList` +- [ ] Timeline / TimelineItem +- [ ] ActivityFeed +- [ ] Changelog +- [ ] Carousel +- [ ] Gallery +- [ ] Accordion list → `layout::Accordion` +- [ ] Card Grid → `layout::SimpleGrid` +- [ ] QRCode +- [ ] Barcode +- [ ] ColorSwatch display → `forms::ColorSwatch` +- [ ] Meter +- [ ] Gauge +- [ ] UsageBar +- [ ] Rating display → `forms::Rating` +- [ ] Comparison +- [ ] BeforeAfter +- [ ] Watermark + +## T13 Lists & Trees — `src/lists` + +- [ ] List / ListItem +- [ ] VirtualList — native `list()` / `uniform_list()`, themed rows +- [ ] InfiniteList +- [ ] SortableList +- [ ] SelectableList — single, multi, shift range +- [ ] GroupedList — sticky group headers +- [ ] SectionList → `lists::GroupedList` +- [ ] ReorderableList → `lists::SortableList` +- [ ] SwipeableListItem — prove: horizontal trackpad scroll +- [ ] Tree / TreeView +- [ ] VirtualTree → `lists::Tree` +- [ ] FileTree +- [ ] CheckboxTree +- [ ] Outline +- [ ] NestedList → `lists::Outline` +- [ ] DirectoryListing +- [ ] Menu List → `menus::Menu` +- [ ] Transfer List → `forms::TransferList` + +## T14 Tables — `src/tables` + +- [ ] Table +- [ ] DataTable — sort, filter, page, select +- [ ] VirtualTable → `tables::DataTable` +- [ ] DataGrid +- [ ] Spreadsheet — formula subset, merge, freeze, fill handle +- [ ] TreeTable +- [ ] PivotTable +- [ ] ColumnResizer +- [ ] ColumnReorder +- [ ] ColumnVisibility +- [ ] ColumnPinning +- [ ] RowSelection +- [ ] RowExpansion +- [ ] RowGrouping +- [ ] InlineRowEdit +- [ ] CellRenderer +- [ ] TableToolbar +- [ ] FilterBuilder +- [ ] SortBuilder +- [ ] AggregationFooter +- [ ] TableDensity +- [ ] ConditionalFormatting +- [ ] HeatmapTable +- [ ] ComparisonTable + +## T15 Charts — `src/charts` + +- [ ] LineChart +- [ ] AreaChart / StackedArea +- [ ] BarChart +- [ ] PieChart / DonutChart +- [ ] ScatterChart +- [ ] BubbleChart +- [ ] RadarChart +- [ ] HeatmapChart +- [ ] CalendarHeatmap +- [ ] Treemap +- [ ] Sunburst +- [ ] SankeyChart +- [ ] FunnelChart +- [ ] WaterfallChart +- [ ] BoxPlot +- [ ] Histogram +- [ ] ViolinPlot +- [ ] GanttChart +- [ ] NetworkGraph / ForceGraph +- [ ] ChordDiagram +- [ ] ParallelCoordinates +- [ ] Sparkline / SparkBar / SparkArea +- [ ] Bullet Chart +- [ ] ProgressChart +- [ ] RealtimeChart +- [ ] ChartLegend +- [ ] ChartTooltip +- [ ] ChartCrosshair +- [ ] ChartAxis / ChartGrid +- [ ] ChartZoom / Brush +- [ ] ChartAnnotation +- [ ] ChartExport — SVG and CSV + +## T16a Finance · Market charts — `src/finance` + +- [ ] CandlestickChart +- [ ] OHLCChart → `finance::CandlestickChart` +- [ ] HeikinAshiChart → `finance::CandlestickChart` +- [ ] LineQuoteChart +- [ ] VolumeChart +- [ ] DepthChart +- [ ] MarketProfile / VolumeProfile +- [ ] RenkoChart / PointAndFigure +- [ ] MultiChartLayout +- [ ] ChartSync +- [ ] TimeRangeSelector +- [ ] IntervalSelector +- [ ] ChartTypeSwitcher + +## T16b Finance · Technical analysis + +- [ ] IndicatorOverlay — MA, EMA, BOLL, VWAP +- [ ] IndicatorPane — MACD, RSI, KDJ, OBV +- [ ] IndicatorSelector +- [ ] DrawingTools +- [ ] DrawingToolbar +- [ ] CompareSymbol +- [ ] PriceAlertLine + +## T16c Finance · Quotes & book + +- [ ] Ticker / TickerTape +- [ ] QuoteCard +- [ ] PriceText +- [ ] PriceChangeBadge +- [ ] OrderBook +- [ ] Level2 Quotes +- [ ] TimeAndSales / TradeTape +- [ ] MarketDepthLadder / DOM +- [ ] SpreadIndicator +- [ ] BidAskBar + +## T16d Finance · Trading + +- [ ] OrderEntry / TradePanel +- [ ] QuickTradeButtons +- [ ] PositionTable +- [ ] OrderTable +- [ ] TradeHistoryTable +- [ ] PnLDisplay +- [ ] LeverageSlider +- [ ] MarginIndicator +- [ ] RiskMeter +- [ ] OrderConfirmDialog +- [ ] OptionChain +- [ ] GreeksTable +- [ ] PayoffDiagram + +## T16e Finance · Markets & assets + +- [ ] Watchlist +- [ ] SymbolSearch +- [ ] SymbolBadge +- [ ] MarketHeatmap +- [ ] SectorTreemap → `charts::Treemap` +- [ ] Screener / FilterPanel +- [ ] MarketOverview +- [ ] IndexCard +- [ ] MarketStatus +- [ ] TradingSessionClock +- [ ] EconomicCalendar +- [ ] EarningsCalendar +- [ ] NewsFeed +- [ ] SentimentGauge → `data_display::Gauge` +- [ ] PortfolioSummary +- [ ] AssetAllocationChart → `charts::PieChart` +- [ ] PerformanceChart — equity curve, drawdown +- [ ] DividendTable +- [ ] FinancialStatementTable +- [ ] CurrencyConverter +- [ ] CryptoWalletCard +- [ ] TransactionList +- [ ] Candle Countdown + +## T17a Editor · Core — `src/editor` + +- [ ] CodeEditor — highlight, multi-cursor, selection, undo, redo +- [ ] EditorGutter +- [ ] LineNumbers — absolute, relative +- [ ] FoldingControl +- [ ] Minimap +- [ ] Ruler / IndentGuide +- [ ] BracketMatcher / RainbowBrackets +- [ ] WhitespaceRenderer +- [ ] CursorRenderer — block, line, underline, blink +- [ ] SelectionHighlight +- [ ] MultiCursor +- [ ] VimModeIndicator +- [ ] StickyScroll +- [ ] Breadcrumb → `navigation::Breadcrumb` +- [ ] InlayHints +- [ ] CodeLens +- [ ] InlineDecoration +- [ ] GhostText +- [ ] InlineChat +- [ ] InlineDiff +- [ ] ReadOnlyBanner + +## T17b Editor · Intelligence + +- [ ] CompletionMenu +- [ ] SignatureHelp +- [ ] HoverInfo +- [ ] QuickFix / CodeActionMenu +- [ ] RenameInput +- [ ] PeekView → `overlays::Peek` +- [ ] ReferencesPanel +- [ ] SymbolOutline +- [ ] GoToSymbol +- [ ] CallHierarchy / TypeHierarchy + +## T17c Editor · Search + +- [ ] FindWidget +- [ ] ReplaceWidget → `editor::FindWidget` +- [ ] SearchPanel +- [ ] SearchResultItem +- [ ] SearchFilters + +## T17d Editor · Panels + +- [ ] ProblemsPanel / DiagnosticsList +- [ ] OutputPanel +- [ ] DebugConsole +- [ ] ExtensionsPanel / PluginList +- [ ] SettingsEditor — UI and JSON +- [ ] KeybindingsEditor +- [ ] ThemePreview +- [ ] WelcomePage +- [ ] RecentProjects +- [ ] ProjectSwitcher +- [ ] TaskRunner / RunConfiguration + +## T17e Editor · Status items + +- [ ] CursorPosition +- [ ] LanguageMode +- [ ] Encoding +- [ ] LineEnding +- [ ] IndentSettings +- [ ] BranchIndicator +- [ ] LspStatus +- [ ] NotificationBell + +## T18 Terminal — `src/terminal` + +- [ ] Terminal — prove: `alacritty_terminal` grid and PTY +- [ ] TerminalTabs → `navigation::EditorTabs` +- [ ] TerminalSplit → `layout::PaneGroup` +- [ ] TerminalToolbar +- [ ] TerminalSearch → `editor::FindWidget` +- [ ] TerminalLink +- [ ] ShellSelector +- [ ] CommandBlock +- [ ] CommandHistory +- [ ] AnsiText +- [ ] LogViewer +- [ ] ProcessList + +## T19 Git — `src/git` + +- [ ] DiffViewer — split, unified +- [ ] InlineDiff → `editor::InlineDiff` +- [ ] ThreeWayMerge +- [ ] ConflictResolver +- [ ] ChangesList +- [ ] CommitInput +- [ ] CommitGraph +- [ ] CommitList / CommitItem +- [ ] BranchSelector +- [ ] BranchList +- [ ] TagList +- [ ] StashList +- [ ] BlameView / GitBlameAnnotation +- [ ] FileHistory +- [ ] PullRequestCard +- [ ] ReviewComment +- [ ] DiffStat +- [ ] GitStatusBadge + +## T20 Debug — `src/debug` + +- [ ] DebugToolbar +- [ ] BreakpointList +- [ ] BreakpointGutter → `editor::EditorGutter` +- [ ] CallStack +- [ ] VariablesPanel +- [ ] WatchPanel +- [ ] ThreadList +- [ ] MemoryViewer / HexViewer +- [ ] Disassembly +- [ ] PerformanceProfiler / Flamegraph +- [ ] TimelineProfiler +- [ ] NetworkInspector +- [ ] ConsoleREPL → `editor::DebugConsole` diff --git a/tasks/ch21-30.md b/tasks/ch21-30.md new file mode 100644 index 0000000..c66a017 --- /dev/null +++ b/tasks/ch21-30.md @@ -0,0 +1,334 @@ +# Chapters 21–30 + +## T21a Documents · Editing — `src/documents` + +- [ ] RichTextEditor +- [ ] MarkdownEditor — WYSIWYG, source, split +- [ ] BlockEditor +- [ ] Block types — paragraph, heading, list, todo, quote, code, divider, table, image, video, embed, math, callout, toggle, columns, synced +- [ ] BlockHandle +- [ ] SlashMenu +- [ ] FloatingFormatToolbar → `overlays::FloatingToolbar` +- [ ] FixedFormatToolbar +- [ ] LinkEditor +- [ ] MentionMenu +- [ ] EmojiAutocomplete +- [ ] TableEditor +- [ ] ImageEditorBlock +- [ ] MathEditor / LatexBlock +- [ ] MermaidBlock / DiagramBlock — host renders the SVG +- [ ] CodeBlockEditor +- [ ] TodoItem / Checklist +- [ ] PlaceholderText +- [ ] WordCount / CharacterCount +- [ ] ReadingTime + +## T21b Documents · Reading + +- [ ] MarkdownRenderer +- [ ] DocumentViewer — host pages +- [ ] PDFViewer — host pages; thumbnails, search, zoom, notes +- [ ] EpubReader — host chapters +- [ ] OfficePreview — host pages +- [ ] PageThumbnailList +- [ ] TableOfContents → `navigation::TableOfContents` +- [ ] DocumentOutline → `navigation::TableOfContents` +- [ ] Footnote +- [ ] Glossary / TooltipTerm +- [ ] ReadingProgress +- [ ] FocusMode / ZenMode +- [ ] PrintPreview — host pages + +## T21c Documents · Knowledge + +- [ ] PageTree +- [ ] Backlinks +- [ ] GraphView → `charts::NetworkGraph` +- [ ] PageCover / PageIcon +- [ ] PageProperties +- [ ] DatabaseView — table, board, gallery, calendar, timeline +- [ ] TemplatePicker +- [ ] TrashBin +- [ ] VersionHistory +- [ ] PageHistoryDiff +- [ ] Favorites / Pinned + +## T22 Collaboration — `src/collab` + +- [ ] PresenceAvatars +- [ ] RemoteCursor +- [ ] RemoteSelection +- [ ] CommentThread +- [ ] CommentBubble / CommentMarker +- [ ] CommentSidebar +- [ ] Reply / ReactionPicker +- [ ] Reactions +- [ ] Annotation / Highlight +- [ ] SuggestionMode +- [ ] TrackChanges +- [ ] ShareDialog +- [ ] PermissionSelect +- [ ] InviteInput +- [ ] AccessList +- [ ] ActivityLog → `data_display::ActivityFeed` +- [ ] FollowMode +- [ ] LiveIndicator + +## T23a AI Chat · Messages — `src/chat` + +- [ ] ChatContainer +- [ ] MessageList — virtualized, stick to bottom, new-message hint +- [ ] MessageBubble — user, assistant, system, error +- [ ] MessageAvatar +- [ ] MessageHeader +- [ ] MessageFooter +- [ ] StreamingText +- [ ] StreamingMarkdown +- [ ] StreamingCursor +- [ ] CodeBlock — language, copy, download, run, fold, apply +- [ ] MathBlock → `typography::Latex` +- [ ] TableBlock → `documents::MarkdownRenderer` +- [ ] MermaidRenderer → `documents::MermaidBlock` +- [ ] ImageMessage / ImageGrid +- [ ] FileMessage +- [ ] AudioMessage +- [ ] VideoMessage — host frames +- [ ] LinkPreviewCard +- [ ] QuoteReply +- [ ] MessageActions +- [ ] MessageEditor +- [ ] BranchNavigator +- [ ] RegenerateButton +- [ ] StopGeneratingButton +- [ ] ContinueButton +- [ ] ErrorMessage / RetryMessage +- [ ] RateLimitNotice +- [ ] FeedbackForm +- [ ] ScrollToBottomButton +- [ ] DateSeparator +- [ ] ThinkingBlock / ReasoningPanel +- [ ] ThinkingIndicator +- [ ] ThinkingDuration + +## T23b AI Chat · Citations + +- [ ] CitationBadge / InlineCitation +- [ ] SourceCard +- [ ] SourceList / SourcesPanel +- [ ] SearchProgress +- [ ] WebResultCard +- [ ] DocumentChunkPreview + +## T23c AI Chat · Input + +- [ ] PromptInput / Composer +- [ ] AttachmentButton +- [ ] AttachmentChip / AttachmentPreview +- [ ] PasteImagePreview +- [ ] DragDropOverlay +- [ ] VoiceInputButton +- [ ] VoiceWaveform / RecordingIndicator +- [ ] SlashCommandMenu → `documents::SlashMenu` +- [ ] PromptTemplateMenu +- [ ] ContextMentionMenu +- [ ] ContextChips +- [ ] ModelSelector +- [ ] ModeSelector +- [ ] ToolToggleMenu +- [ ] TemperatureSlider / ParameterPanel +- [ ] SystemPromptEditor +- [ ] TokenCounter +- [ ] ContextWindowMeter +- [ ] CostEstimator +- [ ] SendButton +- [ ] InputHint + +## T23d AI Chat · Conversations + +- [ ] ConversationList +- [ ] ConversationItem +- [ ] ConversationSearch +- [ ] NewChatButton +- [ ] FolderList / ProjectList +- [ ] ProjectKnowledgePanel +- [ ] SharedConversationView +- [ ] ConversationExport + +## T23e AI Chat · Welcome + +- [ ] WelcomeScreen / Greeting +- [ ] SuggestionChips / StarterPrompts +- [ ] PromptLibrary +- [ ] FollowUpSuggestions +- [ ] CapabilityCards + +## T24 Agent — `src/agent` + +- [ ] ToolCallCard +- [ ] ToolCallGroup +- [ ] ToolApprovalDialog +- [ ] PermissionPrompt +- [ ] AgentStepList / TaskTimeline +- [ ] AgentPlan / TodoList +- [ ] AgentStatus +- [ ] AgentProgress +- [ ] SubAgentTree +- [ ] FileChangeCard +- [ ] MultiFileDiff Review +- [ ] CommandExecutionCard +- [ ] BrowserPreview / ScreenshotStream — host frames +- [ ] ComputerUseViewer — host frames +- [ ] ArtifactPanel +- [ ] ArtifactVersionSwitcher +- [ ] LivePreview — host content +- [ ] SandboxStatus +- [ ] MCPServerList / ConnectorList +- [ ] ToolRegistry Panel +- [ ] MemoryPanel +- [ ] CheckpointList / Rewind +- [ ] InterruptButton +- [ ] HumanInputRequest +- [ ] TokenUsageChart +- [ ] CostBreakdown +- [ ] TraceViewer +- [ ] EvalResultTable + +## T25 Generative — `src/generative` + +- [ ] ImageGenerationPanel +- [ ] GenerationQueue +- [ ] GenerationGrid +- [ ] VariationPicker +- [ ] PromptEnhancer +- [ ] NegativePromptInput +- [ ] StylePresetPicker +- [ ] SeedInput +- [ ] AspectRatioPicker +- [ ] InpaintCanvas +- [ ] MaskBrush +- [ ] ImageCompare → `data_display::BeforeAfter` +- [ ] AudioGenerationPlayer +- [ ] VideoGenerationTimeline +- [ ] TTSVoicePicker +- [ ] ModelCard +- [ ] ModelDownloadManager +- [ ] ModelStatus +- [ ] HardwareMonitor +- [ ] FineTuneJobCard +- [ ] DatasetViewer +- [ ] EmbeddingVisualizer — 2D, 3D projection +- [ ] PromptPlayground +- [ ] PromptDiff / PromptVersionHistory +- [ ] ABCompareView + +## T26 Media — `src/media` + +- [ ] ImageViewer — zoom, pan, rotate, fit +- [ ] ImageCropper +- [ ] ImageAnnotator +- [ ] ImageThumbnail +- [ ] Lightbox / Gallery Viewer → `overlays::Lightbox` +- [ ] VideoPlayer — host frames +- [ ] VideoTimeline / Scrubber +- [ ] VideoThumbnailStrip +- [ ] AudioPlayer — host playback +- [ ] AudioWaveform +- [ ] AudioSpectrum / Visualizer +- [ ] VolumeControl +- [ ] PlaybackSpeedControl +- [ ] MediaControls +- [ ] Playlist +- [ ] SubtitleEditor +- [ ] ScreenRecorderControls +- [ ] CameraPreview — host frames +- [ ] MicLevelMeter +- [ ] DeviceSelector +- [ ] 3DModelViewer — host frames, orbit input + +## T27 Files — `src/files` + +- [ ] FileExplorer — list, icons, columns +- [ ] FileGrid +- [ ] FileList +- [ ] FileItem +- [ ] FileIcon +- [ ] FilePreview / QuickLook +- [ ] FileBreadcrumb / PathBar → `navigation::Breadcrumb` +- [ ] FolderTree → `lists::FileTree` +- [ ] FileContextMenu → `menus::ContextMenu` +- [ ] RenameInline → `forms::InlineEdit` +- [ ] DragDropFiles → `forms::DropZone` +- [ ] FileOperationProgress +- [ ] TransferQueue +- [ ] DownloadManager +- [ ] StorageUsage → `data_display::UsageBar` +- [ ] RecentFiles +- [ ] Favorites / Bookmarks → `documents::Favorites` +- [ ] FileSearch +- [ ] DuplicateFinder +- [ ] ArchiveViewer — host entries +- [ ] HexViewer → `debug::HexViewer` + +## T28 Messaging — `src/messaging` + +- [ ] ChannelList / ChatList +- [ ] ChannelItem +- [ ] DirectMessageItem +- [ ] MessageThread +- [ ] ThreadPanel +- [ ] ChatMessage +- [ ] UnreadDivider +- [ ] MessageReactions → `collab::Reactions` +- [ ] ReadReceipt +- [ ] TypingIndicator → `motion::TypingIndicator` +- [ ] MemberList +- [ ] UserProfileCard +- [ ] OnlineStatus +- [ ] StatusSetter +- [ ] VoiceCallBar +- [ ] VideoCallGrid — host frames +- [ ] ScreenShareView — host frames +- [ ] CallControls +- [ ] ParticipantTile +- [ ] IncomingCallDialog +- [ ] StickerPicker +- [ ] GifPicker — host images +- [ ] PinnedMessages +- [ ] ChannelHeader +- [ ] HuddleIndicator + +## T29 Mail — `src/mail` + +- [ ] MailboxList / FolderList +- [ ] MailList +- [ ] MailItem +- [ ] MailReader +- [ ] MailComposer +- [ ] RecipientInput +- [ ] MailThreadView +- [ ] QuotedText +- [ ] SignatureEditor +- [ ] LabelPicker +- [ ] SnoozePicker +- [ ] ScheduleSend +- [ ] InboxZeroState + +## T30 Calendar — `src/calendar` + +- [ ] CalendarMonthView +- [ ] CalendarWeekView +- [ ] CalendarDayView +- [ ] AgendaView +- [ ] YearView +- [ ] MiniCalendar → `forms::Calendar` +- [ ] EventCard / EventChip +- [ ] EventEditor +- [ ] EventPopover +- [ ] TimeGrid — drag to create, resize +- [ ] AllDayRow +- [ ] CurrentTimeIndicator +- [ ] RecurrenceEditor +- [ ] AvailabilityPicker +- [ ] TimezoneOverlay +- [ ] ReminderPicker +- [ ] AttendeeList diff --git a/tasks/ch31-43.md b/tasks/ch31-43.md new file mode 100644 index 0000000..b983eed --- /dev/null +++ b/tasks/ch31-43.md @@ -0,0 +1,292 @@ +# Chapters 31–43 + +## T31 Project — `src/project` + +- [ ] KanbanBoard / KanbanColumn / KanbanCard +- [ ] TaskList +- [ ] TaskItem — check, priority, due date, assignee +- [ ] TaskDetailPanel +- [ ] SubtaskList +- [ ] GanttChart / TimelineView → `charts::GanttChart` +- [ ] Roadmap +- [ ] Sprint Board → `project::KanbanBoard` +- [ ] Burndown Chart +- [ ] PriorityIndicator +- [ ] StatusSelect +- [ ] AssigneePicker +- [ ] DueDatePicker → `forms::DatePicker` +- [ ] LabelManager +- [ ] IssueCard +- [ ] IssueIdBadge +- [ ] MilestoneProgress +- [ ] WorkloadView +- [ ] TimeTracker +- [ ] Pomodoro Timer + +## T32 Canvas & Design — `src/canvas` + +- [ ] InfiniteCanvas +- [ ] CanvasGrid / Guides +- [ ] Ruler +- [ ] SelectionBox +- [ ] TransformHandles +- [ ] SnapIndicator +- [ ] LayerPanel +- [ ] AssetPanel +- [ ] InspectorPanel +- [ ] AlignmentToolbar +- [ ] ToolPalette +- [ ] ZoomControls / ZoomIndicator +- [ ] MiniMap +- [ ] ArtboardFrame +- [ ] ShapeTools — rect, ellipse, polygon, line, arrow +- [ ] PenTool / PathEditor +- [ ] TextTool +- [ ] BrushTool / BrushSettings +- [ ] ColorPanel +- [ ] GradientPanel → `forms::GradientEditor` +- [ ] ShadowEditor +- [ ] BorderEditor +- [ ] TypographyPanel +- [ ] ConstraintsEditor +- [ ] AutoLayoutControls +- [ ] ExportPanel +- [ ] NodeEditor / NodeGraph +- [ ] Node / Port / Edge / Connection +- [ ] FlowChart / DiagramEditor +- [ ] MindMap +- [ ] Whiteboard +- [ ] StickyNote +- [ ] Connector Line +- [ ] HistoryPanel + +## T33 DB & Dev Tools — `src/devtools` + +- [ ] ConnectionManager +- [ ] ConnectionForm +- [ ] SchemaTree +- [ ] QueryEditor → `editor::CodeEditor` +- [ ] QueryResultGrid → `tables::DataGrid` +- [ ] QueryHistory +- [ ] QueryPlanViewer +- [ ] TableStructureEditor +- [ ] ERDiagram +- [ ] IndexManager +- [ ] RedisKeyBrowser +- [ ] DocumentViewer (MongoDB / JSON) → `devtools::JsonViewer` +- [ ] JsonViewer / JsonTree +- [ ] JsonEditor +- [ ] YamlViewer +- [ ] XmlViewer +- [ ] ApiRequestBuilder +- [ ] ResponseViewer +- [ ] HeadersTable +- [ ] QueryParamsEditor → `forms::KeyValueInput` +- [ ] EnvironmentSelector +- [ ] CollectionTree +- [ ] WebSocketConsole +- [ ] GraphQLExplorer +- [ ] RegexTester +- [ ] Base64 / Encoder +- [ ] ColorContrastChecker +- [ ] ContainerList +- [ ] PodList +- [ ] ResourceMonitor + +## T34 Dashboard — `src/dashboard` + +- [ ] Dashboard Grid +- [ ] Widget / DashboardCard +- [ ] StatCard → `data_display::Statistic` +- [ ] MetricsChart → `charts::LineChart` +- [ ] AlertList +- [ ] IncidentCard +- [ ] UptimeBar +- [ ] ServiceStatus +- [ ] HealthCheck Indicator +- [ ] LogStream → `terminal::LogViewer` +- [ ] TraceWaterfall → `agent::TraceViewer` +- [ ] EventStream +- [ ] ResourceGauge → `data_display::Gauge` +- [ ] SystemMonitor +- [ ] ProcessTable → `terminal::ProcessList` +- [ ] NetworkGraph (throughput) → `charts::RealtimeChart` +- [ ] MapView / GeoHeatmap → `maps::MapView`, `maps::GeoHeatmap` (T41) +- [ ] WorldMap → `maps::WorldMap` (T41) +- [ ] RefreshIntervalSelector +- [ ] DashboardFilterBar + +## T35 Settings — `src/settings` + +- [ ] SettingsLayout +- [ ] SettingsSection +- [ ] SettingsRow +- [ ] SettingsSearch +- [ ] ThemeSelector → `theme::ThemeSwitcher` +- [ ] AccentColorPicker +- [ ] FontSizeControl +- [ ] FontFamilySelect → `forms::FontPicker` +- [ ] DensitySelector +- [ ] LanguageSelector → `forms::LanguageSelect` +- [ ] KeyboardShortcutsList +- [ ] ShortcutEditor → `editor::KeybindingsEditor` +- [ ] ProxySettings +- [ ] StorageSettings / CacheClear +- [ ] PrivacySettings +- [ ] NotificationSettings +- [ ] StartupSettings +- [ ] ImportExportSettings +- [ ] ResetToDefault +- [ ] AdvancedSettings / FeatureFlags +- [ ] DeveloperMode Toggle + +## T36 Account — `src/account` + +- [ ] LoginForm +- [ ] SignupForm +- [ ] OAuthButtons +- [ ] MagicLinkForm +- [ ] TwoFactorInput +- [ ] ForgotPassword +- [ ] ProfileCard +- [ ] ProfileEditor +- [ ] AccountSwitcher +- [ ] WorkspaceSwitcher / OrgSwitcher +- [ ] UserMenu +- [ ] SessionList +- [ ] ApiKeyManager +- [ ] SubscriptionCard / PlanBadge +- [ ] UsageQuota +- [ ] BillingHistory +- [ ] PaymentMethodForm +- [ ] UpgradePrompt / Paywall +- [ ] TeamMemberTable +- [ ] RoleSelector +- [ ] InvitationList + +## T37 Onboarding & Help — `src/onboarding` + +- [ ] OnboardingWizard +- [ ] WelcomeTour → `navigation::Tour` +- [ ] Coachmark / Hotspot — Coachmark → `overlays::Spotlight`; Hotspot here +- [ ] FeatureHighlight / NewBadge +- [ ] Checklist (first-run tasks) +- [ ] HelpTooltip +- [ ] HelpPanel / DocsSidebar +- [ ] KeyboardShortcutCheatsheet +- [ ] WhatsNewDialog +- [ ] FeedbackWidget +- [ ] ContactSupport +- [ ] InlineHelp +- [ ] EmptyStateWithAction → `feedback::EmptyState` + +## T38 Interaction — `src/interaction` + +- [ ] Draggable — native `on_drag` +- [ ] Droppable / DropTarget — native `on_drop`, `drag_over` +- [ ] DragOverlay / DragPreview — native drag view +- [ ] DragGhost → DragPreview (native) +- [ ] Sortable / SortableContext +- [ ] Resizable +- [ ] Rotatable +- [ ] Selectable / SelectionArea +- [ ] RubberBandSelection → `interaction::SelectionArea` +- [ ] LongPress → `primitives::Pressable` +- [ ] DoubleClick — native `ClickEvent::click_count` +- [ ] Gesture — prove: wheel zoom, pinch, two-finger swipe +- [ ] PanZoom → `layout::Viewport` +- [ ] Hotkeys / KeyBinding — native `actions!`, `bind_keys`, `key_context` +- [ ] KeyChord — native multi-keystroke bindings +- [ ] Undo / Redo Manager +- [ ] InfiniteScroll Trigger → `lists::InfiniteList` +- [ ] VirtualScroller — native `list()` / `uniform_list()` +- [ ] ScrollSync +- [ ] Autofocus — native `window.focus()` +- [ ] RovingTabIndex +- [ ] TypeAhead +- [ ] FocusVisible → `primitives::FocusRing` + +## T39 Theme — `src/theme` + +- [x] ThemeProvider (T00) +- [ ] ThemeSwitcher +- [x] ColorTokens / DesignTokens (T00) +- [ ] ThemeEditor +- [ ] ThemeImporter — VS Code theme JSON +- [ ] SyntaxThemes +- [ ] IconThemeProvider +- [ ] DensityProvider (T00) +- [ ] RadiusProvider (T00) +- [ ] FontProvider (T00) +- [ ] HighContrastMode (T00) +- [ ] ReducedMotionProvider (T00) +- [ ] Platform Style +- [ ] VibrancyBackground / Mica / Acrylic — native `WindowBackgroundAppearance::Blurred` +- [x] Elevation / Shadow (T00) + +## T40 i18n & a11y — `src/i18n` + +- [ ] I18nProvider +- [ ] Trans / LocalizedText +- [ ] LocaleNumber / LocaleDate +- [ ] RTL layout — prove: mirrored stacks +- [ ] LiveRegion / Announcer — blocked: gpui 0.2.2 has no accessibility tree +- [ ] SkipLink +- [ ] AccessibleIcon — blocked: no accessibility tree +- [ ] AriaLabel helper — blocked: no accessibility tree +- [ ] KeyboardNavigationHelper +- [ ] ScreenReaderOnly — blocked: no accessibility tree +- [ ] ColorBlindSafe Palette + +## T41 Maps — `src/maps` + +- [ ] MapView — host tiles +- [ ] MapMarker +- [ ] MapPopup +- [ ] MapCluster +- [ ] RouteLine +- [ ] GeoJSON Layer +- [ ] ChoroplethMap +- [ ] LocationPicker +- [ ] CoordinateDisplay +- [ ] WorldMap (from T34) +- [ ] GeoHeatmap (from T34) + +## T42 Misc — `src/misc` + +- [ ] Clock / WorldClock +- [ ] Stopwatch +- [ ] Calculator +- [ ] UnitConverter +- [ ] QRCodeScanner — prove: host frames, `rqrr` decode +- [ ] BarcodeDisplay → `data_display::Barcode` +- [ ] Captcha +- [ ] Signature → `forms::SignaturePad` +- [ ] Rating Widget → `forms::Rating` +- [ ] Poll / Survey +- [ ] Quiz / Flashcard +- [ ] ChangeLog Viewer → `data_display::Changelog` +- [ ] LicenseViewer +- [ ] Terms / Consent Dialog +- [ ] CookieBanner +- [ ] WebView — prove: `wry` +- [ ] IframeEmbed / EmbedCard +- [ ] HTMLPreview → `misc::WebView` +- [ ] PrintButton — blocked: gpui 0.2.2 has no print API +- [ ] ExportDialog — PDF, PNG, CSV, JSON +- [ ] ImportDialog — field mapping +- [ ] CSVImporter +- [ ] ShareSheet + +## T43 Library Tooling — `src/tooling` + +- [ ] ComponentGallery / Storybook +- [ ] PlaygroundPanel +- [ ] InspectorOverlay +- [ ] FPSMeter / PerfOverlay +- [ ] RenderCounter +- [ ] EventLogger +- [ ] DesignTokenViewer +- [ ] IconBrowser +- [ ] A11yChecker — contrast audit +- [ ] ScreenshotTest Harness — self-capture