From be102d7603fbf6d73b2a353c1ca2e6f29f7626fb Mon Sep 17 00:00:00 2001 From: bflatastic Date: Sun, 11 Oct 2026 00:35:26 +0700 Subject: [PATCH] Add artcraft-native: a pure Rust (egui) desktop app A rewrite of the desktop app without Tauri or a webview, starting with Create Image and Create Video. It reuses the Tauri-free API crates (artcraft_client, artcraft_api_defs, tokens, enums) and is styled after the brutalist artcraft-webapp. - Generation goes through OmniGen (models, cost, generate), so model options come from the server, as in the webapp. - Recreates the prompt box: auto-grow, focus mode, length limit, enter-to-generate, @-mentions, reference deck and keyframes, drag & drop, image paste, library picker, model families, every picker, and the live credit cost. - Generation feed (pending, failed, finished, library paging), lightbox, sign-in (existing Tauri login, browser code, password) and settings. - Uses the glow renderer: wgpu-hal conflicts with the windows crates this workspace pins for Tauri. - Lists the bundled OFL fonts in NOTICE. Co-Authored-By: Claude Opus 5.5 --- Cargo.lock | 2904 +++++++++++++++-- Cargo.toml | 1 + NOTICE | 3 + artcraft-native/Cargo.toml | 43 + artcraft-native/README.md | 106 + .../assets/fonts/Archivo-Variable.ttf | Bin 0 -> 658596 bytes .../assets/fonts/GeistMono-Variable.ttf | Bin 0 -> 171948 bytes .../assets/fonts/Inter-Variable.ttf | Bin 0 -> 876576 bytes artcraft-native/assets/fonts/OFL-Archivo.txt | 93 + .../assets/fonts/OFL-GeistMono.txt | 93 + artcraft-native/assets/fonts/OFL-Inter.txt | 92 + artcraft-native/src/app.rs | 729 +++++ artcraft-native/src/backend/media_cache.rs | 153 + artcraft-native/src/backend/mod.rs | 734 +++++ artcraft-native/src/backend/session.rs | 118 + artcraft-native/src/backend/wire.rs | 249 ++ artcraft-native/src/feed/grid.rs | 531 +++ artcraft-native/src/feed/mod.rs | 3 + artcraft-native/src/feed/store.rs | 326 ++ artcraft-native/src/feed/types.rs | 107 + artcraft-native/src/main.rs | 33 + artcraft-native/src/models.rs | 629 ++++ artcraft-native/src/overlays/account.rs | 204 ++ .../src/overlays/library_picker.rs | 197 ++ artcraft-native/src/overlays/lightbox.rs | 277 ++ artcraft-native/src/overlays/mod.rs | 3 + artcraft-native/src/pages/common.rs | 345 ++ artcraft-native/src/pages/create_image.rs | 283 ++ artcraft-native/src/pages/create_video.rs | 541 +++ artcraft-native/src/pages/mod.rs | 5 + artcraft-native/src/pages/other.rs | 129 + artcraft-native/src/pages/toolbar.rs | 57 + artcraft-native/src/prompt_box/deck.rs | 529 +++ artcraft-native/src/prompt_box/editor.rs | 414 +++ artcraft-native/src/prompt_box/mod.rs | 346 ++ .../src/prompt_box/model_selector.rs | 130 + artcraft-native/src/prompt_box/pickers.rs | 128 + artcraft-native/src/prompt_box/refs.rs | 169 + artcraft-native/src/prompt_box/ui_tests.rs | 143 + artcraft-native/src/shell.rs | 395 +++ artcraft-native/src/theme.rs | 191 ++ artcraft-native/src/ui/creator_icons.rs | 73 + artcraft-native/src/ui/icons.rs | 370 +++ artcraft-native/src/ui/mod.rs | 4 + artcraft-native/src/ui/toast.rs | 97 + artcraft-native/src/ui/widgets.rs | 354 ++ 46 files changed, 11978 insertions(+), 353 deletions(-) create mode 100644 artcraft-native/Cargo.toml create mode 100644 artcraft-native/README.md create mode 100644 artcraft-native/assets/fonts/Archivo-Variable.ttf create mode 100644 artcraft-native/assets/fonts/GeistMono-Variable.ttf create mode 100644 artcraft-native/assets/fonts/Inter-Variable.ttf create mode 100644 artcraft-native/assets/fonts/OFL-Archivo.txt create mode 100644 artcraft-native/assets/fonts/OFL-GeistMono.txt create mode 100644 artcraft-native/assets/fonts/OFL-Inter.txt create mode 100644 artcraft-native/src/app.rs create mode 100644 artcraft-native/src/backend/media_cache.rs create mode 100644 artcraft-native/src/backend/mod.rs create mode 100644 artcraft-native/src/backend/session.rs create mode 100644 artcraft-native/src/backend/wire.rs create mode 100644 artcraft-native/src/feed/grid.rs create mode 100644 artcraft-native/src/feed/mod.rs create mode 100644 artcraft-native/src/feed/store.rs create mode 100644 artcraft-native/src/feed/types.rs create mode 100644 artcraft-native/src/main.rs create mode 100644 artcraft-native/src/models.rs create mode 100644 artcraft-native/src/overlays/account.rs create mode 100644 artcraft-native/src/overlays/library_picker.rs create mode 100644 artcraft-native/src/overlays/lightbox.rs create mode 100644 artcraft-native/src/overlays/mod.rs create mode 100644 artcraft-native/src/pages/common.rs create mode 100644 artcraft-native/src/pages/create_image.rs create mode 100644 artcraft-native/src/pages/create_video.rs create mode 100644 artcraft-native/src/pages/mod.rs create mode 100644 artcraft-native/src/pages/other.rs create mode 100644 artcraft-native/src/pages/toolbar.rs create mode 100644 artcraft-native/src/prompt_box/deck.rs create mode 100644 artcraft-native/src/prompt_box/editor.rs create mode 100644 artcraft-native/src/prompt_box/mod.rs create mode 100644 artcraft-native/src/prompt_box/model_selector.rs create mode 100644 artcraft-native/src/prompt_box/pickers.rs create mode 100644 artcraft-native/src/prompt_box/refs.rs create mode 100644 artcraft-native/src/prompt_box/ui_tests.rs create mode 100644 artcraft-native/src/shell.rs create mode 100644 artcraft-native/src/theme.rs create mode 100644 artcraft-native/src/ui/creator_icons.rs create mode 100644 artcraft-native/src/ui/icons.rs create mode 100644 artcraft-native/src/ui/mod.rs create mode 100644 artcraft-native/src/ui/toast.rs create mode 100644 artcraft-native/src/ui/widgets.rs diff --git a/Cargo.lock b/Cargo.lock index 6c41395309..3e06681256 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,6 +2,121 @@ # It is not intended for manual editing. version = 4 +[[package]] +name = "accesskit" +version = "0.24.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d3b7f7f85a7e5f68090000ed7622545829afd484d210358702ae4cb97dd0c320" +dependencies = [ + "enumn", + "serde", + "uuid 1.22.0", +] + +[[package]] +name = "accesskit_atspi_common" +version = "0.18.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e8c61bee90b42a772d39d06a740207dc71a4e780004ace1db8d99fb1baaa954" +dependencies = [ + "accesskit", + "accesskit_consumer 0.36.0", + "atspi-common", + "phf 0.13.1", + "serde", + "zvariant", +] + +[[package]] +name = "accesskit_consumer" +version = "0.35.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53cf47daed85312e763fbf85ceca136e0d7abc68e0a7e12abe11f48172bc3b10" +dependencies = [ + "accesskit", + "hashbrown 0.16.1", +] + +[[package]] +name = "accesskit_consumer" +version = "0.36.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "25e0d7e25d06f4dc21d1774d67146e9e80d6789216cbd4d1e88185b0095dba60" +dependencies = [ + "accesskit", + "hashbrown 0.16.1", +] + +[[package]] +name = "accesskit_consumer" +version = "0.38.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5d10a236f96f87d70732e44520046785431ef01d5bcd6b041317bfadd2f88245" +dependencies = [ + "accesskit", + "hashbrown 0.16.1", +] + +[[package]] +name = "accesskit_macos" +version = "0.26.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce02dc63b43f0c9296af9ac946312a2dc8814427d7a64d2d600971dac55b6076" +dependencies = [ + "accesskit", + "accesskit_consumer 0.38.0", + "hashbrown 0.16.1", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "accesskit_unix" +version = "0.21.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b016ca8db0ea0ea2ceff29a9d6240391492d960716aa471967c00e8cc8cb197c" +dependencies = [ + "accesskit", + "accesskit_atspi_common", + "async-channel", + "async-executor", + "async-task", + "atspi", + "futures-lite", + "futures-util", + "serde", + "zbus", +] + +[[package]] +name = "accesskit_windows" +version = "0.32.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eff7009f1a532e917d66970a1e80c965140c6cfbbabbdde3d64e5431e6c78e21" +dependencies = [ + "accesskit", + "accesskit_consumer 0.35.0", + "hashbrown 0.16.1", + "static_assertions", + "windows 0.62.2", + "windows-core 0.62.2", +] + +[[package]] +name = "accesskit_winit" +version = "0.32.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1fe9a94394896352cc4660ca2288bd4ef883d83238853c038b44070c8f134313" +dependencies = [ + "accesskit", + "accesskit_macos", + "accesskit_unix", + "accesskit_windows", + "raw-window-handle", + "winit", +] + [[package]] name = "adler2" version = "2.0.0" @@ -28,6 +143,7 @@ dependencies = [ "cfg-if", "getrandom 0.3.1", "once_cell", + "serde", "version_check", "zerocopy", ] @@ -68,6 +184,31 @@ version = "0.2.18" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" +[[package]] +name = "android-activity" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f2a1bb052857d5dd49572219344a7332b31b76405648eabac5bc68978251bcd" +dependencies = [ + "android-properties", + "bitflags 2.13.2", + "cc", + "jni 0.22.4", + "libc", + "log", + "ndk", + "ndk-context", + "ndk-sys", + "num_enum", + "thiserror 2.0.18", +] + +[[package]] +name = "android-properties" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc7eb209b1518d6bb87b283c20095f5228ecda460da70b44f0802523dea6da04" + [[package]] name = "android_log-sys" version = "0.3.2" @@ -87,9 +228,9 @@ dependencies = [ [[package]] name = "android_system_properties" -version = "0.1.5" +version = "0.1.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +checksum = "ae221649c9976a6f6c56ae1facf410f3ddb33cc661c4b7b61020a912d4237fbc" dependencies = [ "libc", ] @@ -156,6 +297,26 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3d036a3c4ab069c7b410a2ce876bd74808d2d0888a82667669f8e783a898bf1" +[[package]] +name = "arboard" +version = "3.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0348a1c054491f4bfe6ab86a7b6ab1e44e45d899005de92f58b3df180b36ddaf" +dependencies = [ + "clipboard-win", + "image", + "log", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-core-graphics", + "objc2-foundation 0.3.2", + "parking_lot", + "percent-encoding", + "windows-sys 0.60.2", + "x11rb", +] + [[package]] name = "arc-swap" version = "1.7.1" @@ -173,6 +334,12 @@ dependencies = [ "syn 2.0.117", ] +[[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.6" @@ -233,7 +400,7 @@ dependencies = [ "tokens", "tokio", "tokio-util", - "toml 1.0.7+spec-1.1.0", + "toml 1.1.8+spec-1.1.0", "url", "url_utils", "uuid_utils", @@ -290,6 +457,36 @@ dependencies = [ "url", ] +[[package]] +name = "artcraft_native" +version = "0.1.0" +dependencies = [ + "anyhow", + "arboard", + "artcraft_api_defs", + "artcraft_client", + "chrono", + "cookie", + "directories", + "eframe", + "egui", + "egui_extras", + "egui_kittest", + "enums", + "env_logger", + "image", + "log", + "open", + "reqwest 0.12.23", + "resvg", + "rfd", + "serde", + "serde_json", + "tokens", + "tokio", + "uuid 1.22.0", +] + [[package]] name = "artcraft_router" version = "0.0.1" @@ -320,6 +517,34 @@ dependencies = [ "wreq", ] +[[package]] +name = "as-raw-xcb-connection" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "175571dd1d178ced59193a6fc02dde1b972eb0bc56c892cde9beeceac5bf0f6b" + +[[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.2", + "raw-window-handle", + "serde", + "serde_repr", + "url", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "zbus", +] + [[package]] name = "assertor" version = "0.0.3" @@ -335,7 +560,7 @@ version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "435a87a52755b8f27fcf321ac4f04b2802e337c8c4872923137471ec39c37532" dependencies = [ - "event-listener 5.4.1", + "event-listener 5.4.2", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -343,12 +568,11 @@ dependencies = [ [[package]] name = "async-channel" -version = "2.3.0" +version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9f2776ead772134d55b62dd45e59a79e21612d85d0af729b8b7d3967d601a62a" +checksum = "924ed96dd52d1b75e9c1a3e6275715fd320f5f9439fb5a4a11fa51f4221158d2" dependencies = [ "concurrent-queue", - "event-listener 5.4.1", "event-listener-strategy", "futures-core", "pin-project-lite", @@ -372,52 +596,74 @@ dependencies = [ [[package]] name = "async-executor" -version = "1.11.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b10202063978b3351199d68f8b22c4e47e4b1b822f8d43fd862d5ea8c006b29a" +checksum = "c96bf972d85afc50bf5ab8fe2d54d1586b4e0b46c97c50a0c9e71e2f7bcd812a" dependencies = [ "async-task", "concurrent-queue", "fastrand", "futures-lite", + "pin-project-lite", "slab", ] [[package]] -name = "async-io" -version = "2.4.0" +name = "async-fs" +version = "2.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" dependencies = [ "async-lock", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-io" +version = "2.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "456b8a8feb6f42d237746d4b3e9a178494627745c3c56c6ea55d92ba50d026fc" +dependencies = [ + "autocfg", "cfg-if", "concurrent-queue", "futures-io", "futures-lite", "parking", "polling", - "rustix 0.38.44", + "rustix 1.1.5", "slab", - "tracing", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] name = "async-lock" -version = "3.4.0" +version = "3.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +checksum = "290f7f2596bd5b78a9fec8088ccd89180d7f9f55b94b0576823bbbdc72ee8311" dependencies = [ - "event-listener 5.4.1", + "event-listener 5.4.2", "event-listener-strategy", "pin-project-lite", ] [[package]] -name = "async-process" -version = "2.3.0" +name = "async-net" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" +dependencies = [ + "async-io", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-process" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc50921ec0055cdd8a16de48773bfeec5c972598674347252c0399676be7da75" dependencies = [ "async-channel", "async-io", @@ -426,10 +672,9 @@ dependencies = [ "async-task", "blocking", "cfg-if", - "event-listener 5.4.1", + "event-listener 5.4.2", "futures-lite", - "rustix 0.38.44", - "tracing", + "rustix 1.1.5", ] [[package]] @@ -445,9 +690,9 @@ dependencies = [ [[package]] name = "async-signal" -version = "0.2.10" +version = "0.2.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +checksum = "52b5aaafa020cf5053a01f2a60e8ff5dccf550f0f77ec54a4e47285ac2bab485" dependencies = [ "async-io", "async-lock", @@ -455,10 +700,10 @@ dependencies = [ "cfg-if", "futures-core", "futures-io", - "rustix 0.38.44", + "rustix 1.1.5", "signal-hook-registry", "slab", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] [[package]] @@ -516,6 +761,43 @@ version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" +[[package]] +name = "atspi" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c77886257be21c9cd89a4ae7e64860c6f0eefca799bb79127913052bd0eefb3d" +dependencies = [ + "atspi-common", + "atspi-proxies", +] + +[[package]] +name = "atspi-common" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20c5617155740c98003016429ad13fe43ce7a77b007479350a9f8bf95a29f63d" +dependencies = [ + "enumflags2", + "serde", + "static_assertions", + "zbus", + "zbus-lockstep", + "zbus-lockstep-macros", + "zbus_names", + "zvariant", +] + +[[package]] +name = "atspi-proxies" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2230e48787ed3eb4088996eab66a32ca20c0b67bbd4fd6cdfe79f04f1f04c9fc" +dependencies = [ + "atspi-common", + "serde", + "zbus", +] + [[package]] name = "autocfg" version = "1.3.0" @@ -591,14 +873,14 @@ version = "0.72.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "993776b509cfb49c750f11b8f07a46fa23e0a1386ffc01fb1e7d343efc387895" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "cexpr", "clang-sys", "itertools 0.13.0", "proc-macro2", "quote", "regex", - "rustc-hash", + "rustc-hash 2.1.1", "shlex", "syn 2.0.117", ] @@ -609,7 +891,16 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08807e080ed7f9d5433fa9b275196cfc35414f66a0c79d864dc51a0d825231a3" dependencies = [ - "bit-vec", + "bit-vec 0.8.0", +] + +[[package]] +name = "bit-set" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09ec2f926cc3060f09db9ebc5b52823d85268d24bb917e472c0c4bea35780a7d" +dependencies = [ + "bit-vec 0.9.1", ] [[package]] @@ -618,6 +909,12 @@ version = "0.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5e764a1d40d510daf35e07be9eb06e75770908c27d411ee6c92109c9840eaaf7" +[[package]] +name = "bit-vec" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b71798fca2c1fe1086445a7258a4bc81e6e49dcd24c8d0dd9a1e57395b603f51" + [[package]] name = "bit_field" version = "0.10.2" @@ -632,9 +929,9 @@ checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" [[package]] name = "bitflags" -version = "2.11.0" +version = "2.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "843867be96c8daad0d758b57df9392b6d8d271134fce549de6ce169ff98a92af" +checksum = "3ded4057c258ba199e2d26386d3af3780957ecaee6c4ef4041c6b4b8b97c0b06" dependencies = [ "serde_core", ] @@ -686,18 +983,18 @@ dependencies = [ [[package]] name = "block2" -version = "0.6.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "340d2f0bdb2a43c1d3cd40513185b2bd7def0aa1052f956455114bc98f82dcf2" +checksum = "cdeb9d870516001442e364c5220d3574d2da8dc765554b4a617230d33fa58ef5" dependencies = [ "objc2 0.6.4", ] [[package]] name = "blocking" -version = "1.6.1" +version = "1.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +checksum = "a70e4329df6cb94385eed412ec92375c3cdd8a6e502493d1229b6414e4036dfa" dependencies = [ "async-channel", "async-task", @@ -724,7 +1021,7 @@ version = "5.0.0-alpha.13" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "183ccc3854411c035410dcdbffafca62084f3a6c33f013c77e83c025d2a08a28" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "boring-sys2", "foreign-types 0.5.0", "libc", @@ -913,9 +1210,23 @@ dependencies = [ [[package]] name = "bytemuck" -version = "1.16.0" +version = "1.25.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78834c15cb5d5efe3452d58b1e8ba890dd62d21907f867f383358198e56ebca5" +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.7", +] [[package]] name = "byteorder" @@ -944,7 +1255,7 @@ version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ca26ef0159422fb77631dc9d17b102f253b876fe1586b03b803e63a309b4ee2" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "cairo-sys-rs", "glib", "libc", @@ -963,6 +1274,57 @@ dependencies = [ "system-deps", ] +[[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.63", +] + +[[package]] +name = "calloop" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4dbf9978365bac10f54d1d4b04f7ce4427e51f71d61f2fe15e3fed5166474df7" +dependencies = [ + "bitflags 2.13.2", + "polling", + "rustix 1.1.5", + "slab", + "tracing", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "95a66a987056935f7efce4ab5668920b5d0dac4a7c99991a67395f13702ddd20" +dependencies = [ + "calloop 0.13.0", + "rustix 0.38.44", + "wayland-backend", + "wayland-client", +] + +[[package]] +name = "calloop-wayland-source" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "138efcf0940a02ebf0cc8d1eff41a1682a46b431630f4c52450d6265876021fa" +dependencies = [ + "calloop 0.14.4", + "rustix 1.1.5", + "wayland-backend", + "wayland-client", +] + [[package]] name = "camino" version = "1.1.9" @@ -1061,9 +1423,18 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cfg_aliases" -version = "0.2.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" +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 = "chrono" @@ -1117,6 +1488,15 @@ dependencies = [ "libloading 0.8.6", ] +[[package]] +name = "clipboard-win" +version = "5.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bde03770d3df201d4fb868f2c9c59e66a3e4e2bd06692a0fe701e7103c7e84d4" +dependencies = [ + "error-code", +] + [[package]] name = "cloudflare_errors" version = "0.0.1" @@ -1138,6 +1518,24 @@ dependencies = [ "cc", ] +[[package]] +name = "codespan-reporting" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af491d569909a7e4dee0ad7db7f5341fef5c614d5b8ec8cf765732aba3cff681" +dependencies = [ + "unicode-width", +] + +[[package]] +name = "color" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2ec7c5eb7a16992b1904d76c517d170ab353b0e0b3d5a0c81a8a0cd1037893cf" +dependencies = [ + "bytemuck", +] + [[package]] name = "color_quant" version = "1.1.0" @@ -1231,7 +1629,7 @@ dependencies = [ "serde_derive", "serde_json", "time", - "toml 1.0.7+spec-1.1.0", + "toml 1.1.8+spec-1.1.0", "url", "wreq", ] @@ -1248,9 +1646,9 @@ dependencies = [ [[package]] name = "core-foundation" -version = "0.10.0" +version = "0.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b55271e5c8c478ad3f38ad24ef34923091e0548492a266d19b3c0b4d82574c63" +checksum = "b2a6cd9ae233e7f62ba4e9353e81a88df7fc8a5987b8d445b4d90c879bd156f6" dependencies = [ "core-foundation-sys", "libc", @@ -1262,15 +1660,28 @@ 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 0.5.0", + "libc", +] + [[package]] name = "core-graphics" version = "0.24.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ - "bitflags 2.11.0", - "core-foundation 0.10.0", - "core-graphics-types", + "bitflags 2.13.2", + "core-foundation 0.10.1", + "core-graphics-types 0.2.0", "foreign-types 0.5.0", "libc", ] @@ -1281,24 +1692,44 @@ version = "0.25.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "064badf302c3194842cf2c5d61f56cc88e54a759313879cdf03abdd27d0c3b97" dependencies = [ - "bitflags 2.11.0", - "core-foundation 0.10.0", - "core-graphics-types", + "bitflags 2.13.2", + "core-foundation 0.10.1", + "core-graphics-types 0.2.0", "foreign-types 0.5.0", "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.11.0", - "core-foundation 0.10.0", + "bitflags 2.13.2", + "core-foundation 0.10.1", "libc", ] +[[package]] +name = "core_maths" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77745e017f5edba1a9c1d854f6f3a52dac8a12dd5af5d2f54aecf61e43d80d30" +dependencies = [ + "libm", +] + [[package]] name = "cpufeatures" version = "0.2.12" @@ -1458,6 +1889,12 @@ version = "0.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "52560adf09603e58c9a7ee1fe1dcb95a16927b17c127f0ac02d6e768a0e25bc1" +[[package]] +name = "cursor-icon" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f27ae1dd37df86211c42e150270f82743308803d90a6f6e6651cd730d5e1732f" + [[package]] name = "darling" version = "0.20.10" @@ -1639,13 +2076,19 @@ dependencies = [ ] [[package]] -name = "dispatch2" -version = "0.3.0" +name = "dispatch" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89a09f22a6c6069a18470eb92d2298acf25463f14256d24778e1230d789a2aec" +checksum = "bd0c93bb4b0c6d9b77f4435b0ae98c24d17f1c45b2ff844c6151a07256ca923b" + +[[package]] +name = "dispatch2" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0e367e4e7da84520dedcac1901e4da967309406d1e51017ae1abfb97adbd38" dependencies = [ - "bitflags 2.11.0", - "block2 0.6.1", + "bitflags 2.13.2", + "block2 0.6.2", "libc", "objc2 0.6.4", ] @@ -1661,6 +2104,15 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "dlib" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ab8ecd87370524b461f8557c119c405552c396ed91fc0a8eec68679eab26f94a" +dependencies = [ + "libloading 0.8.6", +] + [[package]] name = "dlopen2" version = "0.8.0" @@ -1686,9 +2138,9 @@ dependencies = [ [[package]] name = "document-features" -version = "0.2.11" +version = "0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "95249b50c6c185bee49034bcb378a49dc2b5dff0be90ff6616d31d64febab05d" +checksum = "d4b8a88685455ed29a21542a33abd9cb6510b6b129abadabdcef0f4c55bc8f61" dependencies = [ "litrs", ] @@ -1699,7 +2151,7 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f2646c2bb4993c86006961293208b69d86a2b254356889ddad826e9df3f684f9" dependencies = [ - "bit-set", + "bit-set 0.8.0", "cssparser 0.35.0", "foldhash 0.1.5", "html5ever 0.35.0", @@ -1714,7 +2166,7 @@ version = "0.27.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "521e380c0c8afb8d9a1e83a1822ee03556fc3e3e7dbc1fd30be14e37f9cb3f89" dependencies = [ - "bit-set", + "bit-set 0.8.0", "cssparser 0.36.0", "foldhash 0.2.0", "html5ever 0.38.0", @@ -1729,6 +2181,12 @@ version = "0.15.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aaf95b3e5c8f23aa320147307562d361db0ae0d51242340f558153b4eb2439b" +[[package]] +name = "downcast-rs" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" + [[package]] name = "dpi" version = "0.1.1" @@ -1780,12 +2238,167 @@ version = "1.0.16" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "545b22097d44f8a9581187cdf93de7a71e4722bf51200cfaba810865b49a495d" +[[package]] +name = "ecolor" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0656a7530b9e2841ee7a5f983965bdd9840c32f4012f759cfd44b912cced6b34" +dependencies = [ + "bytemuck", + "emath", + "serde", +] + +[[package]] +name = "eframe" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55ad41fac6e3149abb4866e93df37dbd33baa95db525c3368c944584e95a5dc2" +dependencies = [ + "ahash 0.8.12", + "bytemuck", + "document-features", + "egui", + "egui-wgpu", + "egui-winit", + "egui_glow", + "glow", + "glutin", + "glutin-winit", + "image", + "js-sys", + "log", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "parking_lot", + "percent-encoding", + "profiling", + "raw-window-handle", + "ron", + "serde", + "static_assertions", + "wasm-bindgen", + "web-sys", + "web-time", + "windows-sys 0.61.2", + "winit", +] + [[package]] name = "ego-tree" version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b2972feb8dffe7bc8c5463b1dacda1b0dfbed3710e50f977d965429692d74cd8" +[[package]] +name = "egui" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc938cc27cd911415e1e4d151bc56ff9df063d8db081374e87aeb805ea74b2ba" +dependencies = [ + "accesskit", + "ahash 0.8.12", + "bitflags 2.13.2", + "emath", + "epaint", + "itertools 0.15.0", + "log", + "nohash-hasher", + "profiling", + "ron", + "serde", + "smallvec", + "unicode-segmentation", + "web-sys", +] + +[[package]] +name = "egui-wgpu" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5cef1f6d1bba40b09a4d0d62cb822b81030922cfbf65c5373398c3a3caafc5bd" +dependencies = [ + "ahash 0.8.12", + "bytemuck", + "document-features", + "egui", + "epaint", + "log", + "profiling", + "thiserror 2.0.18", + "type-map", + "web-time", + "wgpu", + "winit", +] + +[[package]] +name = "egui-winit" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98466000559d66ba4db786a30448b01483946add4188e7f10f522a27b4fb89cc" +dependencies = [ + "accesskit_winit", + "arboard", + "bytemuck", + "egui", + "log", + "objc2 0.6.4", + "objc2-foundation 0.3.2", + "objc2-ui-kit 0.3.2", + "profiling", + "raw-window-handle", + "serde", + "smithay-clipboard", + "web-time", + "webbrowser", + "winit", +] + +[[package]] +name = "egui_extras" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05cbdc785020861553f230f23d330ba1fb72613b9d8e0e457f3bdc8ba6db6dcf" +dependencies = [ + "ahash 0.8.12", + "egui", + "enum-map", + "image", + "itertools 0.15.0", + "log", + "profiling", + "resvg", +] + +[[package]] +name = "egui_glow" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "606ed4167daf341e5753d703285c4c1d562324b2c07aa8f405cd7d066fe58f3b" +dependencies = [ + "bytemuck", + "egui", + "glow", + "log", + "profiling", + "winit", +] + +[[package]] +name = "egui_kittest" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5eb3f3effb2726fee23449293e67acbf6cc6ce35525b1722bd5743bb348114d5" +dependencies = [ + "egui", + "kittest", + "log", + "serde", + "toml 1.1.8+spec-1.1.0", +] + [[package]] name = "either" version = "1.12.0" @@ -1795,6 +2408,16 @@ dependencies = [ "serde", ] +[[package]] +name = "emath" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "52c8d4141cf0f60fb2f7aefaf352d3ffa5171ef0ab09731c64391801e95e48f1" +dependencies = [ + "bytemuck", + "serde", +] + [[package]] name = "embed-resource" version = "3.0.2" @@ -1826,15 +2449,35 @@ dependencies = [ [[package]] name = "endi" -version = "1.1.0" +version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" +checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" + +[[package]] +name = "enum-map" +version = "2.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6866f3bfdf8207509a033af1a75a7b08abda06bbaaeae6669323fd5a097df2e9" +dependencies = [ + "enum-map-derive", +] + +[[package]] +name = "enum-map-derive" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f282cfdfe92516eb26c2af8589c274c7c17681f5ecc03c18255fe741c6aa64eb" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] [[package]] name = "enumflags2" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ba2f4b465f5318854c6f8dd686ede6c0a9dc67d4b1ac241cf0eb51521a309147" +checksum = "1027f7680c853e056ebcec683615fb6fbbc07dbaa13b4d5d9442b146ded4ecef" dependencies = [ "enumflags2_derive", "serde", @@ -1842,9 +2485,20 @@ dependencies = [ [[package]] name = "enumflags2_derive" -version = "0.7.11" +version = "0.7.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc4caf64a58d7a6d65ab00639b046ff54399a39f5f2554728895ace4b297cd79" +checksum = "67c78a4d8fdf9953a5c9d458f9efe940fd97a0cab0941c075a813ac594733827" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", +] + +[[package]] +name = "enumn" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f9ed6b3789237c8a0c1c505af1c7eb2c560df6186f01b098c3a1064ea532f38" dependencies = [ "proc-macro2", "quote", @@ -1864,7 +2518,7 @@ dependencies = [ "sqlx-core", "sqlx-mysql", "strum", - "toml 1.0.7+spec-1.1.0", + "toml 1.1.8+spec-1.1.0", "utoipa", ] @@ -1910,6 +2564,38 @@ dependencies = [ "log", ] +[[package]] +name = "epaint" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0ec0308dc23130fc1a7d4623a8534c2ed069c6dc84e258ee4f3de99615aa1a3" +dependencies = [ + "ahash 0.8.12", + "bytemuck", + "ecolor", + "emath", + "epaint_default_fonts", + "font-types", + "harfrust", + "log", + "nohash-hasher", + "parking_lot", + "profiling", + "self_cell", + "serde", + "skrifa", + "smallvec", + "unicode-general-category", + "unicode-segmentation", + "vello_cpu", +] + +[[package]] +name = "epaint_default_fonts" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773fa9c96dd0dbef887e39d0ed6177f141cce4d68e6041df77570aa3702dfa13" + [[package]] name = "equivalent" version = "1.0.1" @@ -1928,14 +2614,20 @@ dependencies = [ [[package]] name = "errno" -version = "0.3.10" +version = "0.3.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d852cb9b869c2a9b3df2f71a3074817f01e1844f839a144f5fcef059a4eb5d" +checksum = "39cab71617ae0d63f51a36d69f866391735b51691dbda63cf6f96d042b63efeb" dependencies = [ "libc", - "windows-sys 0.59.0", + "windows-sys 0.61.2", ] +[[package]] +name = "error-code" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b5343afd4a8365a643ac588dab4cf234a190c7f6c88c9f6dd6ffe00837661b7" + [[package]] name = "errors" version = "0.0.1" @@ -1954,6 +2646,15 @@ dependencies = [ "windows-sys 0.48.0", ] +[[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" @@ -1962,11 +2663,10 @@ checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0" [[package]] name = "event-listener" -version = "5.4.1" +version = "5.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e13b66accf52311f30a0db42147dadea9850cb48cd070028831ae5f5d4b856ab" +checksum = "5a23add41df1562121a9393cb065eab5146a1242410f23a644851e90cfd669d2" dependencies = [ - "concurrent-queue", "parking", "pin-project-lite", ] @@ -1977,7 +2677,7 @@ version = "0.5.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8be9f3dfaaffdae2972880079a491a1a8bb7cbed0b8dd7a347f668b4150a3b93" dependencies = [ - "event-listener 5.4.1", + "event-listener 5.4.2", "pin-project-lite", ] @@ -2031,6 +2731,12 @@ dependencies = [ "simd-adler32", ] +[[package]] +name = "fearless_simd" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b97b65636e5b9ef369943878ac74335ba1c55c1cb6adbf1e2c293c624248d693" + [[package]] name = "fern" version = "0.7.1" @@ -2093,6 +2799,12 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "float-cmp" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4" + [[package]] name = "flume" version = "0.11.0" @@ -2122,6 +2834,39 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77ce24cb58228fbb8aa041425bb1050850ac19177686ea6e0f41a70416f56fdb" +[[package]] +name = "font-types" +version = "0.12.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c92d9081c7ab3bd83ef1eecdfad090f3d966e3ce74106779664114cfe1a6274" +dependencies = [ + "bytemuck", + "serde", +] + +[[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.23.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905" +dependencies = [ + "fontconfig-parser", + "log", + "memmap2", + "slotmap", + "tinyvec", + "ttf-parser", +] + [[package]] name = "foreign-types" version = "0.3.2" @@ -2272,9 +3017,9 @@ checksum = "cecba35d7ad927e23624b22ad55235f2239cfa44fd10428eecbeba6d6a717718" [[package]] name = "futures-lite" -version = "2.6.0" +version = "2.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f5edaec856126859abb19ed65f39e90fea3a9574b9707f13539acf4abf7eb532" +checksum = "f78e10609fe0e0b3f4157ffab1876319b5b0db102a2c60dc4626306dc46b44ad" dependencies = [ "fastrand", "futures-core", @@ -2441,6 +3186,16 @@ dependencies = [ "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 = "getopts" version = "0.2.24" @@ -2459,7 +3214,7 @@ dependencies = [ "cfg-if", "js-sys", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "wasm-bindgen", ] @@ -2538,20 +3293,31 @@ version = "0.20.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2deb07a133b1520dc1a5690e9bd08950108873d7ed5de38dcc74d3b5ebffa110" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "libc", "libgit2-sys", "log", "url", ] +[[package]] +name = "gl_generator" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a95dfc23a2b4a9a2f5ab41d194f8bfda3cabec42af4e39f08c339eb2a0c124d" +dependencies = [ + "khronos_api", + "log", + "xml-rs", +] + [[package]] name = "glib" version = "0.18.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "233daaf6e83ae6a12a52055f568f9d7cf4671dabb78ff9560ab6da230ce00ee5" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "futures-channel", "futures-core", "futures-executor", @@ -2592,12 +3358,106 @@ dependencies = [ "system-deps", ] +[[package]] +name = "glifo" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed4a1bb24121291d27230c1b1b44e07d6a9b28cefdb32fe1581dfb84e14f940a" +dependencies = [ + "bytemuck", + "foldhash 0.2.0", + "hashbrown 0.17.1", + "log", + "peniko", + "skrifa", + "smallvec", + "vello_common", +] + [[package]] name = "glob" version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d2fabcfbdc87f4758337ca535fb41a6d701b65693ce38287d856d1674551ec9b" +[[package]] +name = "glow" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "29038e1c483364cc6bb3cf78feee1816002e127c331a1eec55a4d202b9e1adb5" +dependencies = [ + "js-sys", + "slotmap", + "wasm-bindgen", + "web-sys", +] + +[[package]] +name = "glutin" +version = "0.32.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "12124de845cacfebedff80e877bb37b5b75c34c5a4c89e47e1cdd67fb6041325" +dependencies = [ + "bitflags 2.13.2", + "cfg_aliases", + "cgl", + "dispatch2", + "glutin_egl_sys", + "glutin_glx_sys", + "glutin_wgl_sys", + "libloading 0.8.6", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-core-foundation", + "objc2-foundation 0.3.2", + "once_cell", + "raw-window-handle", + "wayland-sys", + "windows-sys 0.52.0", + "x11-dl", +] + +[[package]] +name = "glutin-winit" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "85edca7075f8fc728f28cb8fbb111a96c3b89e930574369e3e9c27eb75d3788f" +dependencies = [ + "cfg_aliases", + "glutin", + "raw-window-handle", + "winit", +] + +[[package]] +name = "glutin_egl_sys" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4c4680ba6195f424febdc3ba46e7a42a0e58743f2edb115297b86d7f8ecc02d2" +dependencies = [ + "gl_generator", + "windows-sys 0.52.0", +] + +[[package]] +name = "glutin_glx_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8a7bb2938045a88b612499fbcba375a77198e01306f52272e692f8c1f3751185" +dependencies = [ + "gl_generator", + "x11-dl", +] + +[[package]] +name = "glutin_wgl_sys" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2c4ee00b289aba7a9e5306d57c2d05499b2e5dc427f84ac708bd2c090212cf3e" +dependencies = [ + "gl_generator", +] + [[package]] name = "gmicloud_client" version = "0.0.1" @@ -2726,6 +3586,15 @@ dependencies = [ "syn 2.0.117", ] +[[package]] +name = "guillotiere" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6b17e70c989c36bad147b27a58d148c0741c51448aa5653436547323e524d0ab" +dependencies = [ + "euclid", +] + [[package]] name = "h2" version = "0.4.5" @@ -2747,12 +3616,26 @@ dependencies = [ [[package]] name = "half" -version = "2.4.1" +version = "2.7.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6dd08c532ae367adf81c312a4580bc67f1d0fe8bc9c460520283f4c0ff277888" +checksum = "6ea2d84b969582b4b1864a92dc5d27cd2b77b622a8d79306834f1be5ba20d84b" dependencies = [ "cfg-if", "crunchy", + "num-traits", + "zerocopy", +] + +[[package]] +name = "harfrust" +version = "0.12.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c03d949a14aa089bbb282f7dd76a498a7f684428e4257202efc119ec010376f9" +dependencies = [ + "bitflags 2.13.2", + "bytemuck", + "read-fonts", + "smallvec", ] [[package]] @@ -2794,6 +3677,18 @@ name = "hashbrown" version = "0.16.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "841d1cc9bed7f9236f321df977030373f4a4163ae1a7dbfe1a51a2c1a51d9100" +dependencies = [ + "foldhash 0.2.0", +] + +[[package]] +name = "hashbrown" +version = "0.17.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed5909b6e89a2db4456e54cd5f673791d7eca6732202bbf2a9cc504fe2f9b84a" +dependencies = [ + "foldhash 0.2.0", +] [[package]] name = "hashlink" @@ -2827,9 +3722,9 @@ checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024" [[package]] name = "hermit-abi" -version = "0.4.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" +checksum = "e17592d60ebacc7d5e169f4663c5f84f9161cc90328abcfe8456f41e4dfcb284" [[package]] name = "hex" @@ -3056,16 +3951,17 @@ dependencies = [ [[package]] name = "iana-time-zone" -version = "0.1.58" +version = "0.1.65" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8326b86b6cff230b97d0d312a6c40a60726df3332e721f72a1b035f451663b20" +checksum = "e31bc9ad994ba00e440a8aa5c9ef0ec67d5cb5e5cb0cc7f8b744a35b389cc470" dependencies = [ "android_system_properties", "core-foundation-sys", "iana-time-zone-haiku", "js-sys", + "log", "wasm-bindgen", - "windows-core 0.51.1", + "windows-core 0.62.2", ] [[package]] @@ -3282,6 +4178,12 @@ dependencies = [ "test_utils", ] +[[package]] +name = "imagesize" +version = "0.13.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285" + [[package]] name = "imgref" version = "1.10.1" @@ -3408,6 +4310,15 @@ dependencies = [ "either", ] +[[package]] +name = "itertools" +version = "0.15.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b4baf93f58d4425749ca49a51c50ebab072c5df6994d08fed93541c331481dc" +dependencies = [ + "either", +] + [[package]] name = "itoa" version = "1.0.11" @@ -3470,7 +4381,7 @@ dependencies = [ "cesu8", "cfg-if", "combine", - "jni-sys", + "jni-sys 0.3.1", "log", "thiserror 1.0.63", "walkdir", @@ -3478,10 +4389,62 @@ dependencies = [ ] [[package]] -name = "jni-sys" -version = "0.3.0" +name = "jni" +version = "0.22.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8eaf4bc02d17cbdd7ff4c7438cafcdf7fb9a4613313ad11b4f8fefe7d3fa0130" +checksum = "5efd9a482cf3a427f00d6b35f14332adc7902ce91efb778580e180ff90fa3498" +dependencies = [ + "cfg-if", + "combine", + "jni-macros", + "jni-sys 0.4.1", + "log", + "simd_cesu8", + "thiserror 2.0.18", + "walkdir", + "windows-link 0.2.1", +] + +[[package]] +name = "jni-macros" +version = "0.22.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a00109accc170f0bdb141fed3e393c565b6f5e072365c3bd58f5b062591560a3" +dependencies = [ + "proc-macro2", + "quote", + "rustc_version", + "simd_cesu8", + "syn 2.0.117", +] + +[[package]] +name = "jni-sys" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "41a652e1f9b6e0275df1f15b32661cf0d4b78d4d87ddec5e0c3c20f097433258" +dependencies = [ + "jni-sys 0.4.1", +] + +[[package]] +name = "jni-sys" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c6377a88cb3910bee9b0fa88d4f42e1d2da8e79915598f65fb0c7ee14c878af2" +dependencies = [ + "jni-sys-macros", +] + +[[package]] +name = "jni-sys-macros" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" +dependencies = [ + "quote", + "syn 2.0.117", +] [[package]] name = "jobserver" @@ -3500,9 +4463,9 @@ checksum = "bc0000e42512c92e31c2252315bda326620a4e034105e900c98ec492fa077b3e" [[package]] name = "js-sys" -version = "0.3.102" +version = "0.3.106" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d04c30968dffe80775bd4d7fb676131cd04a1fb46d2686dbffbaec2d9dfd31" +checksum = "7883d941dae510fb2d978fc3fe018c71c9e2892fd38854de3e8b92c2e5ad9cc5" dependencies = [ "cfg-if", "futures-util", @@ -3555,11 +4518,17 @@ version = "0.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b750dcadc39a09dbadd74e118f6dd6598df77fa01df0cfcdc52c28dece74528a" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "serde", "unicode-segmentation", ] +[[package]] +name = "khronos_api" +version = "3.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2db585e1d738fc771bf08a151420d3ed193d9d895a36df7f6f8a9456b911ddc" + [[package]] name = "kinovi_web_client" version = "0.0.1" @@ -3582,6 +4551,39 @@ dependencies = [ "wreq-util", ] +[[package]] +name = "kittest" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90ceaa75eb0036a32b6b9833962eb18137449e9817e2e586006471925b727fd5" +dependencies = [ + "accesskit", + "accesskit_consumer 0.35.0", +] + +[[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 = "kurbo" +version = "0.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b60dfc32f652b926df6192e55525b16d186c69d47876c3ead4da5cc9f8450e2" +dependencies = [ + "arrayvec", + "euclid", + "polycool", + "smallvec", +] + [[package]] name = "lazy_static" version = "1.4.0" @@ -3644,9 +4646,9 @@ dependencies = [ [[package]] name = "libfuzzer-sys" -version = "0.4.9" +version = "0.4.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cf78f52d400cf2d84a3a973a78a592b4adc535739e0a5597a0da6f0c357adc75" +checksum = "a9fd2f41a1cba099f79a0b6b6c35656cf7c03351a7bae8ff0f28f25270f929d2" dependencies = [ "arbitrary", "cc", @@ -3692,12 +4694,14 @@ checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa" [[package]] name = "libredox" -version = "0.1.3" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0ff37bd590ca25063e35af745c343cb7a0271906fb7b37e4813e8f79f00268d" +checksum = "61ff90caf6077a803a240f62fdbe88645a890bbca49ef8174c3cb0404362171d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "libc", + "plain", + "redox_syscall 0.9.4", ] [[package]] @@ -3724,10 +4728,16 @@ dependencies = [ ] [[package]] -name = "linux-raw-sys" -version = "0.4.14" +name = "linebender_resource_handle" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89" +checksum = "d4a5ff6bcca6c4867b1c4fd4ef63e4db7436ef363e0ad7531d1558856bae64f4" + +[[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" @@ -3743,9 +4753,9 @@ checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104" [[package]] name = "litrs" -version = "0.4.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b4ce301924b7887e9d637144fdade93f9dfff9b60981d4ac161db09720d39aa5" +checksum = "11d3d7f243d5c5a8b9bb5d6dd2b1602c0cb0b9db1621bafc7ed66e35ff9fe092" [[package]] name = "lock_api" @@ -3758,9 +4768,9 @@ dependencies = [ [[package]] name = "log" -version = "0.4.29" +version = "0.4.34" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897" +checksum = "f9f8bd3e56ce4dfc153cf470fffbfa98c7620958b312ca5c3a4b8d5181fd13c6" dependencies = [ "serde_core", "value-bag", @@ -3881,6 +4891,15 @@ version = "2.7.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +[[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.0" @@ -3971,7 +4990,7 @@ checksum = "80e04d1dcff3aae0704555fe5fee3bcfaf3d1fdf8a7e521d5b9d2b42acb52cec" dependencies = [ "hermit-abi 0.3.9", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.52.0", ] @@ -3992,9 +5011,9 @@ dependencies = [ "gtk", "keyboard-types", "objc2 0.6.4", - "objc2-app-kit", + "objc2-app-kit 0.3.2", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "once_cell", "png 0.18.1", "serde", @@ -4002,6 +5021,43 @@ dependencies = [ "windows-sys 0.61.2", ] +[[package]] +name = "naga" +version = "30.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a616d2fb8c89516ac2723a581f69d6c18576046bed761bd6b305e5618e6ae130" +dependencies = [ + "arrayvec", + "bit-set 0.10.0", + "bitflags 2.13.2", + "cfg-if", + "cfg_aliases", + "codespan-reporting", + "half", + "hashbrown 0.17.1", + "indexmap 2.13.0", + "libm", + "log", + "naga-types", + "num-traits", + "once_cell", + "rustc-hash 1.1.0", + "thiserror 2.0.18", + "unicode-ident", +] + +[[package]] +name = "naga-types" +version = "30.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "590afbf58a6f4f62873cd5cff4468061844bafa1cdf399cc954537c22d768d49" +dependencies = [ + "hashbrown 0.17.1", + "indexmap 2.13.0", + "rustc-hash 1.1.0", + "thiserror 2.0.18", +] + [[package]] name = "native-tls" version = "0.2.18" @@ -4025,8 +5081,8 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c3f42e7bbe13d351b6bead8286a43aac9534b82bd3cc43e47037f012ebfd62d4" dependencies = [ - "bitflags 2.11.0", - "jni-sys", + "bitflags 2.13.2", + "jni-sys 0.3.1", "log", "ndk-sys", "num_enum", @@ -4034,13 +5090,19 @@ dependencies = [ "thiserror 1.0.63", ] +[[package]] +name = "ndk-context" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "27b02d87554356db9e9a873add8782d4ea6e3e58ea071a9adb9a2e8ddb884a8b" + [[package]] name = "ndk-sys" version = "0.6.0+11769913" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ee6cda3051665f1fb8d9e08fc35c96d5a244fb1be711a03b71118828afc9a873" dependencies = [ - "jni-sys", + "jni-sys 0.3.1", ] [[package]] @@ -4049,6 +5111,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e4a24736216ec316047a1fc4252e27dabb04218aa4a3f37c6e7ddbf1f9782b54" +[[package]] +name = "nohash-hasher" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2bf50223579dc7cdcfb3bfcacf7069ff68243f8c363f62ffa99cf000a6b9c451" + [[package]] name = "nom" version = "7.1.3" @@ -4208,56 +5276,109 @@ dependencies = [ [[package]] name = "objc2-app-kit" -version = "0.3.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6f29f568bec459b0ddff777cec4fe3fd8666d82d5a40ebd0ff7e66134f89bcc" +checksum = "e4e89ad9e3d7d297152b17d39ed92cd50ca8063a89a9fa569046d41568891eff" dependencies = [ - "bitflags 2.11.0", - "block2 0.6.1", + "bitflags 2.13.2", + "block2 0.5.1", + "libc", + "objc2 0.5.2", + "objc2-core-data 0.2.2", + "objc2-core-image 0.2.2", + "objc2-foundation 0.2.2", + "objc2-quartz-core 0.2.2", +] + +[[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", + "block2 0.6.2", "objc2 0.6.4", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-core-graphics", + "objc2-foundation 0.3.2", ] [[package]] name = "objc2-cloud-kit" -version = "0.3.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "17614fdcd9b411e6ff1117dfb1d0150f908ba83a7df81b1f118005fe0a8ea15d" +checksum = "74dd3b56391c7a0596a295029734d3c1c5e7e510a4cb30245f8221ccea96b009" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-core-location 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-cloud-kit" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "73ad74d880bb43877038da939b7427bba67e9dd42004a18b809ba7d87cee241c" +dependencies = [ + "bitflags 2.13.2", "objc2 0.6.4", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-contacts" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a5ff520e9c33812fd374d8deecef01d4a840e7b41862d849513de77e44aa4889" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] name = "objc2-core-data" -version = "0.3.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291fbbf7d29287518e8686417cf7239c74700fd4b607623140a7d4a3c834329d" +checksum = "617fbf49e071c178c0b24c080767db52958f716d9eabdf0890523aeae54773ef" +dependencies = [ + "bitflags 2.13.2", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-data" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b402a653efbb5e82ce4df10683b6b28027616a2715e90009947d50b8dd298fa" dependencies = [ "objc2 0.6.4", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", ] [[package]] name = "objc2-core-foundation" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1c10c2894a6fed806ade6027bcd50662746363a9589d3ec9d9bef30a4e4bc166" +checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "dispatch2", "objc2 0.6.4", ] [[package]] name = "objc2-core-graphics" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "989c6c68c13021b5c2d6b71456ebb0f9dc78d752e86a98da7c716f4f9470f5a4" +checksum = "e022c9d066895efa1345f8e33e584b9f958da2fd4cd116792e15e07e4720a807" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "dispatch2", "objc2 0.6.4", "objc2-core-foundation", @@ -4266,22 +5387,58 @@ dependencies = [ [[package]] name = "objc2-core-image" -version = "0.3.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "79b3dc0cc4386b6ccf21c157591b34a7f44c8e75b064f85502901ab2188c007e" +checksum = "55260963a527c99f1819c4f8e3b47fe04f9650694ef348ffd2227e8196d34c80" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", + "objc2-metal", +] + +[[package]] +name = "objc2-core-image" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e5d563b38d2b97209f8e861173de434bd0214cf020e3423a52624cd1d989f006" dependencies = [ "objc2 0.6.4", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", ] [[package]] name = "objc2-core-location" -version = "0.3.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ac0f75792558aa9d618443bbb5db7426a7a0b6fddf96903f86ef9ad02e135740" +checksum = "000cfee34e683244f284252ee206a27953279d370e309649dc3ee317b37e5781" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-contacts", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-core-location" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca347214e24bc973fc025fd0d36ebb179ff30536ed1f80252706db19ee452009" dependencies = [ "objc2 0.6.4", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-core-text" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0cde0dfb48d25d2b4862161a4d5fcc0e3c24367869ad306b0c9ec0073bfed92d" +dependencies = [ + "bitflags 2.13.2", + "objc2 0.6.4", + "objc2-core-foundation", + "objc2-core-graphics", ] [[package]] @@ -4305,20 +5462,21 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "block2 0.5.1", + "dispatch", "libc", "objc2 0.5.2", ] [[package]] name = "objc2-foundation" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "900831247d2fe1a09a683278e5384cfb8c80c79fe6b166f9d14bfdde0ea1b03c" +checksum = "e3e0adef53c21f888deb4fa59fc59f7eb17404926ee8a6f59f5df0fd7f9f3272" dependencies = [ - "bitflags 2.11.0", - "block2 0.6.1", + "bitflags 2.13.2", + "block2 0.6.2", "libc", "objc2 0.6.4", "objc2-core-foundation", @@ -4326,22 +5484,34 @@ dependencies = [ [[package]] name = "objc2-io-surface" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7282e9ac92529fa3457ce90ebb15f4ecbc383e8338060960760fa2cf75420c3c" +checksum = "180788110936d59bab6bd83b6060ffdfffb3b922ba1396b312ae795e1de9d81d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "objc2 0.6.4", "objc2-core-foundation", ] +[[package]] +name = "objc2-link-presentation" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1ae721c5e35be65f01a03b6d2ac13a54cb4fa70d8a5da293d7b0020261398" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", +] + [[package]] name = "objc2-metal" version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "dd0cba1276f6023976a406a14ffa85e1fdd19df6b0f737b063b95f6c8c7aadd6" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4353,7 +5523,7 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e42bee7bff906b14b167da2bac5efe6b6a07e6f7c0a21a7308d40c960242dc7a" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "block2 0.5.1", "objc2 0.5.2", "objc2-foundation 0.2.2", @@ -4362,44 +5532,100 @@ dependencies = [ [[package]] name = "objc2-quartz-core" -version = "0.3.1" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90ffb6a0cd5f182dc964334388560b12a57f7b74b3e2dec5e2722aa2dfb2ccd5" +checksum = "96c1358452b371bf9f104e21ec536d37a650eb10f7ee379fff67d2e08d537f1f" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "objc2 0.6.4", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", +] + +[[package]] +name = "objc2-symbols" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0a684efe3dec1b305badae1a28f6555f6ddd3bb2c2267896782858d5a78404dc" +dependencies = [ + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] name = "objc2-ui-kit" -version = "0.3.0" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "777a571be14a42a3990d4ebedaeb8b54cd17377ec21b92e8200ac03797b3bee1" +checksum = "b8bb46798b20cd6b91cbd113524c490f1686f4c4e8f49502431415f3512e2b6f" dependencies = [ - "bitflags 2.11.0", - "block2 0.6.1", + "bitflags 2.13.2", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-cloud-kit 0.2.2", + "objc2-core-data 0.2.2", + "objc2-core-image 0.2.2", + "objc2-core-location 0.2.2", + "objc2-foundation 0.2.2", + "objc2-link-presentation", + "objc2-quartz-core 0.2.2", + "objc2-symbols", + "objc2-uniform-type-identifiers", + "objc2-user-notifications 0.2.2", +] + +[[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", + "block2 0.6.2", "objc2 0.6.4", - "objc2-cloud-kit", - "objc2-core-data", + "objc2-cloud-kit 0.3.2", + "objc2-core-data 0.3.2", "objc2-core-foundation", "objc2-core-graphics", - "objc2-core-image", - "objc2-core-location", - "objc2-foundation 0.3.1", - "objc2-quartz-core 0.3.1", - "objc2-user-notifications", + "objc2-core-image 0.3.2", + "objc2-core-location 0.3.2", + "objc2-core-text", + "objc2-foundation 0.3.2", + "objc2-quartz-core 0.3.2", + "objc2-user-notifications 0.3.2", +] + +[[package]] +name = "objc2-uniform-type-identifiers" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "44fa5f9748dbfe1ca6c0b79ad20725a11eca7c2218bceb4b005cb1be26273bfe" +dependencies = [ + "block2 0.5.1", + "objc2 0.5.2", + "objc2-foundation 0.2.2", ] [[package]] name = "objc2-user-notifications" -version = "0.3.1" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a3f5ec77a81d9e0c5a0b32159b0cb143d7086165e79708351e02bf37dfc65cd" +checksum = "76cfcbf642358e8689af64cee815d139339f3ed8ad05103ed5eaf73db8d84cb3" +dependencies = [ + "bitflags 2.13.2", + "block2 0.5.1", + "objc2 0.5.2", + "objc2-core-location 0.2.2", + "objc2-foundation 0.2.2", +] + +[[package]] +name = "objc2-user-notifications" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9df9128cbbfef73cda168416ccf7f837b62737d748333bfe9ab71c245d76613e" dependencies = [ "objc2 0.6.4", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", ] [[package]] @@ -4408,12 +5634,12 @@ version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "91672909de8b1ce1c2252e95bbee8c1649c9ad9d14b9248b3d7b4c47903c47ad" dependencies = [ - "bitflags 2.11.0", - "block2 0.6.1", + "bitflags 2.13.2", + "block2 0.6.2", "objc2 0.6.4", - "objc2-app-kit", + "objc2-app-kit 0.3.2", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", ] [[package]] @@ -4460,7 +5686,7 @@ dependencies = [ "test_utils", "thiserror 2.0.18", "tokio", - "toml 1.0.7+spec-1.1.0", + "toml 1.1.8+spec-1.1.0", "url", "uuid_utils", "wreq", @@ -4473,7 +5699,7 @@ version = "0.10.75" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08838db121398ad17ab8531ce9de97b244589089e290a384c900cb9ff7434328" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "cfg-if", "foreign-types 0.3.2", "libc", @@ -4533,6 +5759,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "orbclient" +version = "0.3.55" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5df339f526ea9a60e371768d50efc2f2508c7203290731565d1f7a6f71d21747" +dependencies = [ + "libc", + "libredox", +] + [[package]] name = "ordered-float" version = "2.10.1" @@ -4612,7 +5848,7 @@ checksum = "2621685985a2ebf1c516881c026032ac7deafcda1a2c9b7850dc81e3dfcb64c1" dependencies = [ "cfg-if", "libc", - "redox_syscall 0.5.2", + "redox_syscall 0.5.18", "smallvec", "windows-link 0.2.1", ] @@ -4638,6 +5874,19 @@ dependencies = [ "base64ct", ] +[[package]] +name = "peniko" +version = "0.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "839c8299360d2e998bdb106dc0a6cd71dcc5f4df51df1b620361bf50e283cca6" +dependencies = [ + "bytemuck", + "color", + "kurbo 0.13.1", + "linebender_resource_handle", + "smallvec", +] + [[package]] name = "percent-encoding" version = "2.3.2" @@ -4749,6 +5998,32 @@ dependencies = [ "siphasher", ] +[[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.117", +] + [[package]] name = "pin-project-lite" version = "0.2.16" @@ -4757,9 +6032,9 @@ checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b" [[package]] name = "piper" -version = "0.2.4" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +checksum = "c835479a4443ded371d6c535cbfd8d31ad92c5d23ae9770a61bc155e4992a3c1" dependencies = [ "atomic-waker", "fastrand", @@ -4793,6 +6068,12 @@ version = "0.3.30" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d231b230927b5e4ad203db57bbcbee2802f6bce620b1e4a9024a07d94e2907ec" +[[package]] +name = "plain" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b4596b6d070b27117e987119b4dac604f3c58cfb0b191112e24771b2faeac1a6" + [[package]] name = "plist" version = "1.7.0" @@ -4801,7 +6082,7 @@ checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" dependencies = [ "base64 0.22.1", "indexmap 2.13.0", - "quick-xml", + "quick-xml 0.32.0", "serde", "time", ] @@ -4825,7 +6106,7 @@ version = "0.18.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "60769b8b31b2a9f263dae2776c37b1b28ae246943cf719eb6946a1db05128a61" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "crc32fast", "fdeflate", "flate2", @@ -4834,17 +6115,31 @@ dependencies = [ [[package]] name = "polling" -version = "3.7.4" +version = "3.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +checksum = "5d0e4f59085d47d8241c88ead0f274e8a0cb551f3625263c05eb8dd897c34218" dependencies = [ "cfg-if", "concurrent-queue", - "hermit-abi 0.4.0", + "hermit-abi 0.5.3", "pin-project-lite", - "rustix 0.38.44", - "tracing", - "windows-sys 0.59.0", + "rustix 1.1.5", + "windows-sys 0.61.2", +] + +[[package]] +name = "pollster" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f3a9f18d041e6d0e102a0a46750538147e5e8992d3b4873aaafee2520b00ce3" + +[[package]] +name = "polycool" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50596ddc09eb5ad5f75cacd40209568e66df71baf86e1499a0e99c4cff12a5a6" +dependencies = [ + "arrayvec", ] [[package]] @@ -4855,9 +6150,9 @@ checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483" [[package]] name = "portable-atomic-util" -version = "0.2.4" +version = "0.2.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8a2f0d8d040d7848a709caf78912debcc3f33ee4b3cac47d73d1e1069e83507" +checksum = "10ab3eb7f3becc3a1cbc4f2c6f20267996cfc1a6467a873763411b136a122715" dependencies = [ "portable-atomic", ] @@ -5070,6 +6365,15 @@ dependencies = [ "memchr", ] +[[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.9" @@ -5081,7 +6385,7 @@ dependencies = [ "pin-project-lite", "quinn-proto", "quinn-udp", - "rustc-hash", + "rustc-hash 2.1.1", "rustls 0.23.36", "socket2 0.6.2", "thiserror 2.0.18", @@ -5101,7 +6405,7 @@ dependencies = [ "lru-slab", "rand 0.9.2", "ring", - "rustc-hash", + "rustc-hash 2.1.1", "rustls 0.23.36", "rustls-pki-types", "slab", @@ -5317,6 +6621,17 @@ dependencies = [ "rand_core 0.3.1", ] +[[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 = "read-progress-stream" version = "1.0.0" @@ -5339,20 +6654,28 @@ dependencies = [ [[package]] name = "redox_syscall" -version = "0.5.2" +version = "0.5.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c82cf8cff14456045f55ec4241383baeff27af886adb72ffb2162f99911de0fd" +checksum = "ed2bf2547551a7053d6fdfafda3f938979645c44812fbfcda098faae3f1a362d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", +] + +[[package]] +name = "redox_syscall" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "737970939a87c6fa31e7acad13307bccbb017a073b695b6089a2c484f929e20e" +dependencies = [ + "bitflags 2.13.2", ] [[package]] name = "redox_users" -version = "0.5.0" +version = "0.5.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd6f9d3d47bdd2ad6945c5015a226ec6155d0bcdfd8f7cd29f86b71f8de99d2b" +checksum = "60dc65c0ff1a7ae1294b0c67b9f14baf70b644404010370171787bfac1038fc0" dependencies = [ - "getrandom 0.2.14", "libredox", "thiserror 2.0.18", ] @@ -5404,6 +6727,12 @@ dependencies = [ "bytecheck", ] +[[package]] +name = "renderdoc-sys" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "19b30a45b0cd0bcca8037f3d0dc3421eaf95327a17cad11964fb8179b4fc4832" + [[package]] name = "reqwest" version = "0.12.23" @@ -5452,7 +6781,7 @@ dependencies = [ "url", "wasm-bindgen", "wasm-bindgen-futures", - "wasm-streams 0.4.0", + "wasm-streams 0.4.2", "web-sys", "webpki-roots 1.0.2", ] @@ -5491,13 +6820,31 @@ dependencies = [ "web-sys", ] +[[package]] +name = "resvg" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a8928798c0a55e03c9ca6c4c6846f76377427d2c1e1f7e6de3c06ae57942df43" +dependencies = [ + "gif", + "image-webp", + "log", + "pico-args", + "rgb", + "svgtypes", + "tiny-skia", + "usvg", + "zune-jpeg", +] + [[package]] name = "rfd" version = "0.16.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a15ad77d9e70a92437d8f74c35d99b4e4691128df018833e99f90bcd36152672" dependencies = [ - "block2 0.6.1", + "ashpd", + "block2 0.6.2", "dispatch2", "glib-sys", "gobject-sys", @@ -5505,10 +6852,12 @@ dependencies = [ "js-sys", "log", "objc2 0.6.4", - "objc2-app-kit", + "objc2-app-kit 0.3.2", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", + "pollster", "raw-window-handle", + "urlencoding", "wasm-bindgen", "wasm-bindgen-futures", "web-sys", @@ -5520,6 +6869,9 @@ name = "rgb" version = "0.8.50" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a" +dependencies = [ + "bytemuck", +] [[package]] name = "ring" @@ -5565,6 +6917,26 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ron" +version = "0.12.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "81116b9531d61eabc41aeb228e4b6b2435bcca3233b98cf3b3077d4e6e9debb3" +dependencies = [ + "bitflags 2.13.2", + "once_cell", + "serde", + "serde_derive", + "typeid", + "unicode-ident", +] + +[[package]] +name = "roxmltree" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97" + [[package]] name = "rsa" version = "0.9.6" @@ -5601,6 +6973,12 @@ dependencies = [ "serde_json", ] +[[package]] +name = "rustc-hash" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2" + [[package]] name = "rustc-hash" version = "2.1.1" @@ -5622,20 +7000,20 @@ version = "0.38.44" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdb5bc1ae2baa591800df16c9ca78619bf65c0488b41b96ccec5d11220d8c154" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "errno", "libc", - "linux-raw-sys 0.4.14", + "linux-raw-sys 0.4.15", "windows-sys 0.59.0", ] [[package]] name = "rustix" -version = "1.1.4" +version = "1.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fe4565b9518b83ef4f91bb47ce29620ca828bd32cb7e408f0062e9930ba190" +checksum = "891efababe418670775f199f0d233d84843c227a0949a883ce15b37c78d6629d" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "errno", "libc", "linux-raw-sys 0.12.1", @@ -5736,6 +7114,24 @@ version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7ffc183a10b4478d04cbbbfc96d0873219d962dd5accaff2ffbd4ceb7df837f4" +[[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", + "unicode-bidi-mirroring", + "unicode-ccc", + "unicode-properties", + "unicode-script", +] + [[package]] name = "ryu" version = "1.0.18" @@ -5807,6 +7203,12 @@ dependencies = [ "hashbrown 0.13.2", ] +[[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" @@ -5869,8 +7271,8 @@ version = "3.7.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b7f4bc775c73d9a02cde8bf7b2ec4c9d12743edf609006c7facc23998404cd1d" dependencies = [ - "bitflags 2.11.0", - "core-foundation 0.10.0", + "bitflags 2.13.2", + "core-foundation 0.10.1", "core-foundation-sys", "libc", "security-framework-sys", @@ -5892,7 +7294,7 @@ version = "0.30.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3df44ba8a7ca7a4d28c589e04f526266ed76b6cc556e33fe69fa25de31939a65" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "cssparser 0.35.0", "derive_more", "fxhash", @@ -5911,7 +7313,7 @@ version = "0.31.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5685b6ae43bfcf7d2e7dfcfb5d8e8f61b46442c902531e41a32a9a8bf0ee0fb6" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "cssparser 0.35.0", "derive_more", "fxhash", @@ -5930,7 +7332,7 @@ version = "0.36.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c5d9c0c92a92d33f08817311cf3f2c29a3538a8240e94a6a3c622ce652d7e00c" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "cssparser 0.36.0", "derive_more", "log", @@ -5938,11 +7340,17 @@ dependencies = [ "phf 0.13.1", "phf_codegen 0.13.1", "precomputed-hash", - "rustc-hash", + "rustc-hash 2.1.1", "servo_arc", "smallvec", ] +[[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.23" @@ -6049,9 +7457,9 @@ dependencies = [ [[package]] name = "serde_spanned" -version = "1.0.4" +version = "1.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f8bbf91e5a4d6315eee45e704372590b30e260ee83af6639d64557f51b067776" +checksum = "4e7523beb55eece201a2356bee0bbca0d1ab466c14c07703b2e0ee6d42cb0c2c" dependencies = [ "serde_core", ] @@ -6218,10 +7626,11 @@ checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" [[package]] name = "signal-hook-registry" -version = "1.4.1" +version = "1.4.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1" +checksum = "c4db69cba1110affc0e9f7bcd48bbf87b3f4fc7c61fc9155afd4c469eb3d6c1b" dependencies = [ + "errno", "libc", ] @@ -6241,6 +7650,16 @@ version = "0.3.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d66dc143e6b11c1eddc06d5c423cfc97062865baf299914ab64caa38182078fe" +[[package]] +name = "simd_cesu8" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "11031e251abf8611c80f460e19dbdeb54a66db918e49c65a7065b46ac7aec520" +dependencies = [ + "rustc_version", + "simdutf8", +] + [[package]] name = "simd_helpers" version = "0.1.0" @@ -6256,12 +7675,31 @@ 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.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56199f7ddabf13fe5074ce809e7d3f42b42ae711800501b5b16ea82ad029c39d" +[[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.9" @@ -6271,11 +7709,95 @@ dependencies = [ "autocfg", ] +[[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.15.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "67b1b7a3b5fe4f1376887184045fcf45c69e92af734b7aaddc05fb777b6fbd03" +dependencies = [ + "serde", +] + +[[package]] +name = "smithay-client-toolkit" +version = "0.19.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3457dea1f0eb631b4034d61d4d8c32074caa6cd1ab2d59f2327bd8461e2c0016" +dependencies = [ + "bitflags 2.13.2", + "calloop 0.13.0", + "calloop-wayland-source 0.3.0", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix 0.38.44", + "thiserror 1.0.63", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-client-toolkit" +version = "0.20.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0512da38f5e2b31201a93524adb8d3136276fa4fe4aafab4e1f727a82b534cc0" +dependencies = [ + "bitflags 2.13.2", + "calloop 0.14.4", + "calloop-wayland-source 0.4.1", + "cursor-icon", + "libc", + "log", + "memmap2", + "rustix 1.1.5", + "thiserror 2.0.18", + "wayland-backend", + "wayland-client", + "wayland-csd-frame", + "wayland-cursor", + "wayland-protocols", + "wayland-protocols-experimental", + "wayland-protocols-misc", + "wayland-protocols-wlr", + "wayland-scanner", + "xkeysym", +] + +[[package]] +name = "smithay-clipboard" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71704c03f739f7745053bde45fa203a46c58d25bc5c4efba1d9a60e9dba81226" +dependencies = [ + "libc", + "smithay-client-toolkit 0.20.0", + "wayland-backend", +] + +[[package]] +name = "smol_str" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dd538fb6910ac1099850255cf94a94df6551fbdd602454387d0adb2d1ca6dead" +dependencies = [ + "serde", +] [[package]] name = "socket2" @@ -6313,7 +7835,7 @@ dependencies = [ "objc2-foundation 0.2.2", "objc2-quartz-core 0.2.2", "raw-window-handle", - "redox_syscall 0.5.2", + "redox_syscall 0.5.18", "wasm-bindgen", "web-sys", "windows-sys 0.59.0", @@ -6503,7 +8025,7 @@ checksum = "1ed31390216d20e538e447a7a9b959e06ed9fc51c37b514b46eb758016ecd418" dependencies = [ "atoi", "base64 0.21.7", - "bitflags 2.11.0", + "bitflags 2.13.2", "byteorder", "bytes", "chrono", @@ -6546,7 +8068,7 @@ checksum = "7c824eb80b894f926f89a0b9da0c7f435d27cdd35b8c655b114e58223918577e" dependencies = [ "atoi", "base64 0.21.7", - "bitflags 2.11.0", + "bitflags 2.13.2", "byteorder", "chrono", "crc", @@ -6607,6 +8129,21 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[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 = "string_cache" version = "0.8.9" @@ -6700,6 +8237,16 @@ version = "2.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81cdd64d312baedb58e21336b31bc043b77e01cc99033ce76ef539f78e965ebc" +[[package]] +name = "svgtypes" +version = "0.15.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68c7541fff44b35860c1a7a47a7cadf3e4a304c457b58f9870d9706ece028afc" +dependencies = [ + "kurbo 0.11.3", + "siphasher", +] + [[package]] name = "swift-rs" version = "1.0.7" @@ -6733,6 +8280,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "3.0.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d62a2e0561533f2ca2561d0cf27fd9fedb640a1bf2616ff5d5c80d99017faadc" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "sync_wrapper" version = "1.0.2" @@ -6759,7 +8317,7 @@ version = "0.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c879d448e9d986b661742763247d3693ed13609438cf3d006f51f5368a5ba6b" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "core-foundation 0.9.4", "system-configuration-sys", ] @@ -6793,9 +8351,9 @@ version = "0.35.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d1c93047acf68669466a34690ac58cca7010bd1b201e1ec86f1fd0a75d3dd4a9" dependencies = [ - "bitflags 2.11.0", - "block2 0.6.1", - "core-foundation 0.10.0", + "bitflags 2.13.2", + "block2 0.6.2", + "core-foundation 0.10.1", "core-graphics 0.25.0", "crossbeam-channel", "dbus", @@ -6805,15 +8363,15 @@ dependencies = [ "gdkwayland-sys", "gdkx11-sys", "gtk", - "jni", + "jni 0.21.1", "libc", "log", "ndk", "ndk-sys", "objc2 0.6.4", - "objc2-app-kit", - "objc2-foundation 0.3.1", - "objc2-ui-kit", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "objc2-ui-kit 0.3.2", "once_cell", "parking_lot", "percent-encoding", @@ -6821,7 +8379,7 @@ dependencies = [ "tao-macros", "unicode-segmentation", "url", - "windows", + "windows 0.61.3", "windows-core 0.61.2", "windows-version", "x11-dl", @@ -6868,15 +8426,15 @@ dependencies = [ "heck 0.5.0", "http", "http-range", - "jni", + "jni 0.21.1", "libc", "log", "mime", "muda", "objc2 0.6.4", - "objc2-app-kit", - "objc2-foundation 0.3.1", - "objc2-ui-kit", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "objc2-ui-kit 0.3.2", "objc2-web-kit", "percent-encoding", "plist", @@ -6899,7 +8457,7 @@ dependencies = [ "webkit2gtk", "webview2-com", "window-vibrancy", - "windows", + "windows 0.61.3", ] [[package]] @@ -7008,7 +8566,7 @@ dependencies = [ "dunce", "glob", "log", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "percent-encoding", "schemars", "serde", @@ -7018,7 +8576,7 @@ dependencies = [ "tauri-plugin", "tauri-utils", "thiserror 2.0.18", - "toml 1.0.7+spec-1.1.0", + "toml 1.1.8+spec-1.1.0", "url", ] @@ -7057,7 +8615,7 @@ dependencies = [ "fern", "log", "objc2 0.6.4", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "serde", "serde_json", "serde_repr", @@ -7076,8 +8634,8 @@ checksum = "17e1bea14edce6b793a04e2417e3fd924b9bc4faae83cdee7d714156cceeed29" dependencies = [ "dunce", "glob", - "objc2-app-kit", - "objc2-foundation 0.3.1", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", "open", "schemars", "serde", @@ -7086,7 +8644,7 @@ dependencies = [ "tauri-plugin", "thiserror 2.0.18", "url", - "windows", + "windows 0.61.3", "zbus", ] @@ -7119,9 +8677,9 @@ dependencies = [ "dpi", "gtk", "http", - "jni", + "jni 0.21.1", "objc2 0.6.4", - "objc2-ui-kit", + "objc2-ui-kit 0.3.2", "objc2-web-kit", "raw-window-handle", "serde", @@ -7131,7 +8689,7 @@ dependencies = [ "url", "webkit2gtk", "webview2-com", - "windows", + "windows 0.61.3", ] [[package]] @@ -7142,10 +8700,10 @@ checksum = "b83849ee63ecb27a8e8d0fe51915ca215076914aca43f96db1179f0f415f6cd9" dependencies = [ "gtk", "http", - "jni", + "jni 0.21.1", "log", "objc2 0.6.4", - "objc2-app-kit", + "objc2-app-kit 0.3.2", "once_cell", "percent-encoding", "raw-window-handle", @@ -7156,7 +8714,7 @@ dependencies = [ "url", "webkit2gtk", "webview2-com", - "windows", + "windows 0.61.3", "wry", ] @@ -7191,7 +8749,7 @@ dependencies = [ "serde_with", "swift-rs", "thiserror 2.0.18", - "toml 1.0.7+spec-1.1.0", + "toml 1.1.8+spec-1.1.0", "url", "urlpattern", "uuid 1.22.0", @@ -7227,7 +8785,7 @@ dependencies = [ "fastrand", "getrandom 0.4.1", "once_cell", - "rustix 1.1.4", + "rustix 1.1.5", "windows-sys 0.61.2", ] @@ -7361,6 +8919,32 @@ dependencies = [ "time-core", ] +[[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.7.6" @@ -7511,14 +9095,14 @@ dependencies = [ [[package]] name = "toml" -version = "1.0.7+spec-1.1.0" +version = "1.1.8+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "dd28d57d8a6f6e458bc0b8784f8fdcc4b99a437936056fa122cb234f18656a96" +checksum = "20489e00e4d8741d6be680764cc12e270655e375a20d1011e844a9c3379e678d" dependencies = [ "indexmap 2.13.0", "serde_core", - "serde_spanned 1.0.4", - "toml_datetime 1.0.1+spec-1.1.0", + "serde_spanned 1.1.2", + "toml_datetime 1.1.2+spec-1.1.0", "toml_parser", "toml_writer", "winnow 1.0.0", @@ -7535,9 +9119,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "1.0.1+spec-1.1.0" +version = "1.1.2+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b320e741db58cac564e26c607d3cc1fdc4a88fd36c879568c07856ed83ff3e9" +checksum = "2b86d767906c6c42421dcba507eb9d203e779497710a47782a224bb871653053" dependencies = [ "serde_core", ] @@ -7585,16 +9169,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ca1a40644a28bce036923f6a431df0b34236949d111cc07cb6dca830c9ef2e1" dependencies = [ "indexmap 2.13.0", - "toml_datetime 1.0.1+spec-1.1.0", + "toml_datetime 1.1.2+spec-1.1.0", "toml_parser", "winnow 1.0.0", ] [[package]] name = "toml_parser" -version = "1.0.10+spec-1.1.0" +version = "1.1.5+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7df25b4befd31c4816df190124375d5a20c6b6921e2cad937316de3fccd63420" +checksum = "baa693a8032d7e1cada7d0041e96126df243179ff061456783ac7f12bda4744c" dependencies = [ "winnow 1.0.0", ] @@ -7607,9 +9191,9 @@ checksum = "5d99f8c9a7727884afe522e9bd5edbfc91a3312b36a77b5fb8926e4c31a41801" [[package]] name = "toml_writer" -version = "1.0.7+spec-1.1.0" +version = "1.1.3+spec-1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f17aaa1c6e3dc22b1da4b6bba97d066e354c7945cac2f7852d4e4e7ca7a6b56d" +checksum = "06bdbd8cfc056b8d2e2e85f29b56a3bdbecb527cef81eb39e3e7b98af4652770" [[package]] name = "tower" @@ -7633,7 +9217,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4e6559d53cc268e5031cd8429d05415bc4cb4aefc4aa5d6cc35fbf5b924a1f8" dependencies = [ "async-compression", - "bitflags 2.11.0", + "bitflags 2.13.2", "bytes", "futures-core", "futures-util", @@ -7704,10 +9288,10 @@ dependencies = [ "libappindicator", "muda", "objc2 0.6.4", - "objc2-app-kit", + "objc2-app-kit 0.3.2", "objc2-core-foundation", "objc2-core-graphics", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "once_cell", "png 0.18.1", "serde", @@ -7721,6 +9305,15 @@ version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b" +[[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 = "tungstenite" version = "0.28.0" @@ -7738,6 +9331,15 @@ dependencies = [ "utf-8", ] +[[package]] +name = "type-map" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb30dbbd9036155e74adad6812e9898d03ec374946234fbcebd5dfc7b9187b90" +dependencies = [ + "rustc-hash 2.1.1", +] + [[package]] name = "typed-builder" version = "0.23.2" @@ -7781,13 +9383,13 @@ checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" [[package]] name = "uds_windows" -version = "1.1.0" +version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +checksum = "f2f6fb2847f6742cd76af783a2a2c49e9375d0a111c7bef6f71cd9e738c72d6e" dependencies = [ "memoffset", "tempfile", - "winapi", + "windows-sys 0.61.2", ] [[package]] @@ -7843,6 +9445,24 @@ version = "0.3.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "08f95100a766bf4f8f28f90d77e0a5461bbdb219042e7679bebe79004fed8d75" +[[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.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e" + +[[package]] +name = "unicode-general-category" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b993bddc193ae5bd0d623b49ec06ac3e9312875fdae725a975c51db1cc1677f" + [[package]] name = "unicode-ident" version = "1.0.12" @@ -7859,10 +9479,28 @@ dependencies = [ ] [[package]] -name = "unicode-segmentation" -version = "1.12.0" +name = "unicode-properties" +version = "0.1.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f6ccf251212114b54433ec949fd6a7841275f9ada20dddd2f29e9ceea4501493" +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" @@ -7947,6 +9585,33 @@ dependencies = [ "url", ] +[[package]] +name = "usvg" +version = "0.45.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "80be9b06fbae3b8b303400ab20778c80bbaf338f563afe567cf3c9eea17b47ef" +dependencies = [ + "base64 0.22.1", + "data-url", + "flate2", + "fontdb", + "imagesize", + "kurbo 0.11.3", + "log", + "pico-args", + "roxmltree", + "rustybuzz", + "simplecss", + "siphasher", + "strict-num", + "svgtypes", + "tiny-skia-path", + "unicode-bidi", + "unicode-script", + "unicode-vo", + "xmlwriter", +] + [[package]] name = "utf-8" version = "0.7.6" @@ -8053,6 +9718,33 @@ version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" +[[package]] +name = "vello_common" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b2e9aed918117e8152c9eddfd8362d73c465c23f26c44786aa331707b8a64fa2" +dependencies = [ + "bytemuck", + "fearless_simd", + "guillotiere", + "log", + "peniko", + "smallvec", + "thiserror 2.0.18", +] + +[[package]] +name = "vello_cpu" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac7349e1f55f6b801c7c277958df4ea53e7f20f21e8014910ad888b2ecda93ea" +dependencies = [ + "bytemuck", + "glifo", + "hashbrown 0.17.1", + "vello_common", +] + [[package]] name = "version-compare" version = "0.2.0" @@ -8106,9 +9798,9 @@ dependencies = [ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" @@ -8121,11 +9813,11 @@ dependencies = [ [[package]] name = "wasip2" -version = "1.0.2+wasi-0.2.9" +version = "1.0.4+wasi-0.2.12" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9517f9239f02c069db75e65f174b3da828fe5f5b945c4dd26bd25d89c03ebcf5" +checksum = "b67efb37e106e55ce722a510d6b5f9c17f083e5fc79afc2badeb12cc313d9487" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.57.1", ] [[package]] @@ -8134,7 +9826,7 @@ version = "0.4.0+wasi-0.3.0-rc-2026-01-06" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5428f8bf88ea5ddc08faddef2ac4a67e390b88186c703ce6dbd955e1c145aca5" dependencies = [ - "wit-bindgen", + "wit-bindgen 0.51.0", ] [[package]] @@ -8145,9 +9837,9 @@ checksum = "b8dad83b4f25e74f184f64c43b150b91efe7647395b42289f38e50566d82855b" [[package]] name = "wasm-bindgen" -version = "0.2.125" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ddb3f79143bced6de84270411622a2699cee572fc0875aeaf1e7867cf9fca1a" +checksum = "9bb54f33acc68fd454578d9820b0bde1a1a3d17aa17bb7b6595806d02886d409" dependencies = [ "cfg-if", "once_cell", @@ -8158,19 +9850,20 @@ dependencies = [ [[package]] name = "wasm-bindgen-futures" -version = "0.4.75" +version = "0.4.79" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "503b14d284f2c8dac03b819967e155ea753f573586193b2b2c95990cb5d69280" +checksum = "3cbab34de2d982e9b48e18d216d04c4a6f641066ff19ffb699980f591ee3610e" dependencies = [ "js-sys", + "tokio", "wasm-bindgen", ] [[package]] name = "wasm-bindgen-macro" -version = "0.2.125" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4e21a184b13fb19e157296e2c46056aec9092264fab83e4ba59e68c61b323c3d" +checksum = "2e29d0c35b16e224a7eeb5cd2d25e3e1968fbd65604117b44d3b789d00ee8535" dependencies = [ "quote", "wasm-bindgen-macro-support", @@ -8178,22 +9871,22 @@ dependencies = [ [[package]] name = "wasm-bindgen-macro-support" -version = "0.2.125" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fecefd9c35bd935a20fc3fc344b5f29138961e4f47fb03297d88f2587afb5ebd" +checksum = "6f501a8bc3719dba86ef8ae4728879c08001bea749eb1333ac5b91e040e2a6b7" dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.7", "wasm-bindgen-shared", ] [[package]] name = "wasm-bindgen-shared" -version = "0.2.125" +version = "0.2.129" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "23939e44bb9a5d7576fa2b563dc2e136628f1224e88a8deed09e04858b77871f" +checksum = "23f0c9c52aa7cd7d77769a4cfe2a9adb1b331f489a41d912ce14513d5ab995c6" dependencies = [ "unicode-ident", ] @@ -8222,9 +9915,9 @@ dependencies = [ [[package]] name = "wasm-streams" -version = "0.4.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129" +checksum = "15053d8d85c7eccdbefef60f06769760a563c7f0a9d6902a13d35c7800b0ad65" dependencies = [ "futures-util", "js-sys", @@ -8252,17 +9945,152 @@ version = "0.244.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "47b807c72e1bac69382b3a6fb3dbe8ea4c0ed87ff5629b8685ae6b9a611028fe" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", "hashbrown 0.15.2", "indexmap 2.13.0", "semver", ] [[package]] -name = "web-sys" -version = "0.3.102" +name = "wayland-backend" +version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a6430a72df5eb332242960fe84b3002a241163998241eb596d4f739b9757061d" +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-csd-frame" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "625c5029dbd43d25e6aa9615e88b829a5cad13b2819c4ae129fdbb7c31ab4c7e" +dependencies = [ + "bitflags 2.13.2", + "cursor-icon", + "wayland-backend", +] + +[[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.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-experimental" +version = "20250721.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "40a1f863128dcaaec790d7b4b396cc9b9a7a079e878e18c47e6c2d2c5a8dcbb1" +dependencies = [ + "bitflags 2.13.2", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-misc" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e9567599ef23e09b8dad6e429e5738d4509dfc46b3b21f32841a304d16b29c8" +dependencies = [ + "bitflags 2.13.2", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-plasma" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b6d8cf1eb2c1c31ed1f5643c88a6e53538129d4af80030c8cabd1f9fa884d91" +dependencies = [ + "bitflags 2.13.2", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols-wlr" +version = "0.3.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "eb04e52f7836d7c7976c78ca0250d61e33873c34156a2a1fc9474828ec268234" +dependencies = [ + "bitflags 2.13.2", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "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 0.41.0", + "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.106" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "88261b9deccee56594c11a3460c462c41f58d148598fe70ad77070126a68aba4" dependencies = [ "js-sys", "wasm-bindgen", @@ -8309,6 +10137,22 @@ dependencies = [ "base64 0.22.1", ] +[[package]] +name = "webbrowser" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62c35be770821a214dbc362fc26908c853e776c0004294d0b10b8a6bad582f94" +dependencies = [ + "jni 0.22.4", + "log", + "ndk-context", + "objc2 0.6.4", + "objc2-app-kit 0.3.2", + "objc2-foundation 0.3.2", + "url", + "web-sys", +] + [[package]] name = "webkit2gtk" version = "2.0.2" @@ -8394,7 +10238,7 @@ checksum = "d4ba622a989277ef3886dd5afb3e280e3dd6d974b766118950a08f8f678ad6a4" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows", + "windows 0.61.3", "windows-core 0.61.2", "windows-implement", "windows-interface", @@ -8418,7 +10262,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "36695906a1b53a3bf5c4289621efedac12b73eeb0b89e7e1a89b517302d5d75c" dependencies = [ "thiserror 2.0.18", - "windows", + "windows 0.61.3", "windows-core 0.61.2", ] @@ -8428,6 +10272,125 @@ version = "0.1.8" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "53a85b86a771b1c87058196170769dd264f66c0782acf1ae6cc51bfd64b39082" +[[package]] +name = "wgpu" +version = "30.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527ccdf43dd5b2e8676eed9984ce00e2bbb0a1b85b70c1969dcb6cd2eb55ab9e" +dependencies = [ + "arrayvec", + "bitflags 2.13.2", + "bytemuck", + "cfg-if", + "cfg_aliases", + "document-features", + "hashbrown 0.17.1", + "js-sys", + "log", + "portable-atomic", + "profiling", + "raw-window-handle", + "smallvec", + "static_assertions", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "wgpu-core", + "wgpu-hal", + "wgpu-types", +] + +[[package]] +name = "wgpu-core" +version = "30.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "14c018fce9b6270aa203c2fdd56f3cce996713534bd757e4ea58c8560b121f14" +dependencies = [ + "arrayvec", + "bit-set 0.10.0", + "bit-vec 0.9.1", + "bitflags 2.13.2", + "bytemuck", + "cfg_aliases", + "document-features", + "hashbrown 0.17.1", + "indexmap 2.13.0", + "log", + "naga", + "naga-types", + "once_cell", + "parking_lot", + "portable-atomic", + "profiling", + "raw-window-handle", + "rustc-hash 1.1.0", + "smallvec", + "thiserror 2.0.18", + "wgpu-core-deps-windows-linux-android", + "wgpu-hal", + "wgpu-naga-bridge", + "wgpu-types", +] + +[[package]] +name = "wgpu-core-deps-windows-linux-android" +version = "30.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7586165fd5f6d881cb9ce4bb71f40d6caab2c0f1837e3fc1d9788a197fb6004f" +dependencies = [ + "wgpu-hal", +] + +[[package]] +name = "wgpu-hal" +version = "30.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b6b7fb58561a792bc237628ba0792e332de418fefe145f13b5ed8201e6d52f58" +dependencies = [ + "bitflags 2.13.2", + "cfg-if", + "cfg_aliases", + "hashbrown 0.17.1", + "libloading 0.8.6", + "log", + "naga", + "naga-types", + "portable-atomic", + "portable-atomic-util", + "raw-window-handle", + "renderdoc-sys", + "static_assertions", + "thiserror 2.0.18", + "wgpu-naga-bridge", + "wgpu-types", +] + +[[package]] +name = "wgpu-naga-bridge" +version = "30.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2f62e73117bb7a62bfd9c5a5841438a823f6566c6442a808ee269d2d055c081" +dependencies = [ + "naga", + "wgpu-types", +] + +[[package]] +name = "wgpu-types" +version = "30.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "99dad6f1fbdbbdb4c278a6508b059d44688f5cebddf78d005a46a31340269286" +dependencies = [ + "bitflags 2.13.2", + "bytemuck", + "js-sys", + "log", + "naga-types", + "raw-window-handle", + "static_assertions", + "web-sys", +] + [[package]] name = "whoami" version = "1.5.1" @@ -8476,9 +10439,9 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d9bec5a31f3f9362f2258fd0e9c9dd61a9ca432e7306cc78c444258f0dce9a9c" dependencies = [ "objc2 0.6.4", - "objc2-app-kit", + "objc2-app-kit 0.3.2", "objc2-core-foundation", - "objc2-foundation 0.3.1", + "objc2-foundation 0.3.2", "raw-window-handle", "windows-sys 0.59.0", "windows-version", @@ -8490,11 +10453,23 @@ version = "0.61.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893" dependencies = [ - "windows-collections", + "windows-collections 0.2.0", "windows-core 0.61.2", - "windows-future", + "windows-future 0.2.1", "windows-link 0.1.3", - "windows-numerics", + "windows-numerics 0.2.0", +] + +[[package]] +name = "windows" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "527fadee13e0c05939a6a05d5bd6eec6cd2e3dbd648b9f8e447c6518133d8580" +dependencies = [ + "windows-collections 0.3.2", + "windows-core 0.62.2", + "windows-future 0.3.2", + "windows-numerics 0.3.1", ] [[package]] @@ -8507,12 +10482,12 @@ dependencies = [ ] [[package]] -name = "windows-core" -version = "0.51.1" +name = "windows-collections" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +checksum = "23b2d95af1a8a14a3c7367e1ed4fc9c20e0a26e79551b1454d72583c97cc6610" dependencies = [ - "windows-targets 0.48.5", + "windows-core 0.62.2", ] [[package]] @@ -8524,8 +10499,21 @@ dependencies = [ "windows-implement", "windows-interface", "windows-link 0.1.3", - "windows-result", - "windows-strings", + "windows-result 0.3.4", + "windows-strings 0.4.2", +] + +[[package]] +name = "windows-core" +version = "0.62.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b8e83a14d34d0623b51dce9581199302a221863196a1dde71a7663a4c2be9deb" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link 0.2.1", + "windows-result 0.4.1", + "windows-strings 0.5.1", ] [[package]] @@ -8536,14 +10524,25 @@ checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e" dependencies = [ "windows-core 0.61.2", "windows-link 0.1.3", - "windows-threading", + "windows-threading 0.1.0", +] + +[[package]] +name = "windows-future" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e1d6f90251fe18a279739e78025bd6ddc52a7e22f921070ccdc67dde84c605cb" +dependencies = [ + "windows-core 0.62.2", + "windows-link 0.2.1", + "windows-threading 0.2.1", ] [[package]] name = "windows-implement" -version = "0.60.0" +version = "0.60.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +checksum = "053e2e040ab57b9dc951b72c264860db7eb3b0200ba345b4e4c3b14f67855ddf" dependencies = [ "proc-macro2", "quote", @@ -8552,9 +10551,9 @@ dependencies = [ [[package]] name = "windows-interface" -version = "0.59.1" +version = "0.59.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +checksum = "3f316c4a2570ba26bbec722032c4099d8c8bc095efccdc15688708623367e358" dependencies = [ "proc-macro2", "quote", @@ -8583,6 +10582,16 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-numerics" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6e2e40844ac143cdb44aead537bbf727de9b044e107a0f1220392177d15b0f26" +dependencies = [ + "windows-core 0.62.2", + "windows-link 0.2.1", +] + [[package]] name = "windows-registry" version = "0.5.2" @@ -8590,8 +10599,8 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3bab093bdd303a1240bb99b8aba8ea8a69ee19d34c9e2ef9594e708a4878820" dependencies = [ "windows-link 0.1.3", - "windows-result", - "windows-strings", + "windows-result 0.3.4", + "windows-strings 0.4.2", ] [[package]] @@ -8603,6 +10612,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-result" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7781fa89eaf60850ac3d2da7af8e5242a5ea78d1a11c49bf2910bb5a73853eb5" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-strings" version = "0.4.2" @@ -8612,6 +10630,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-strings" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7837d08f69c77cf6b07689544538e017c1bfcf57e34b4c0ff58e6c2cd3b37091" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-sys" version = "0.45.0" @@ -8719,13 +10746,13 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d5fe6031c4041849d7c496a8ded650796e7b6ecc19df1a431c1a363342e5dc91" dependencies = [ "windows-link 0.1.3", - "windows_aarch64_gnullvm 0.53.0", - "windows_aarch64_msvc 0.53.0", - "windows_i686_gnu 0.53.0", - "windows_i686_gnullvm 0.53.0", - "windows_i686_msvc 0.53.0", - "windows_x86_64_gnu 0.53.0", - "windows_x86_64_gnullvm 0.53.0", + "windows_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.0", ] @@ -8738,6 +10765,15 @@ dependencies = [ "windows-link 0.1.3", ] +[[package]] +name = "windows-threading" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3949bd5b99cafdf1c7ca86b43ca564028dfe27d66958f2470940f73d86d75b37" +dependencies = [ + "windows-link 0.2.1", +] + [[package]] name = "windows-version" version = "0.1.2" @@ -8767,9 +10803,9 @@ checksum = "32a4622180e7a0ec044bb555404c800bc9fd9ec262ec147edd5989ccd0c02cd3" [[package]] name = "windows_aarch64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "86b8d5f90ddd19cb4a147a5fa63ca848db3df085e25fee3cc10b39b6eebae764" +checksum = "a9d8416fa8b42f5c947f8482c43e7d89e73a173cead56d044f6a56104a6d1b53" [[package]] name = "windows_aarch64_msvc" @@ -8791,9 +10827,9 @@ checksum = "09ec2a7bb152e2252b53fa7803150007879548bc709c039df7627cabbd05d469" [[package]] name = "windows_aarch64_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c7651a1f62a11b8cbd5e0d42526e55f2c99886c77e007179efff86c2b137e66c" +checksum = "b9d782e804c2f632e395708e99a94275910eb9100b2114651e04744e9b125006" [[package]] name = "windows_i686_gnu" @@ -8815,9 +10851,9 @@ checksum = "8e9b5ad5ab802e97eb8e295ac6720e509ee4c243f69d781394014ebfe8bbfa0b" [[package]] name = "windows_i686_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c1dc67659d35f387f5f6c479dc4e28f1d4bb90ddd1a5d3da2e5d97b42d6272c3" +checksum = "960e6da069d81e09becb0ca57a65220ddff016ff2d6af6a223cf372a506593a3" [[package]] name = "windows_i686_gnullvm" @@ -8827,9 +10863,9 @@ checksum = "0eee52d38c090b3caa76c563b86c3a4bd71ef1a819287c19d586d7334ae8ed66" [[package]] name = "windows_i686_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9ce6ccbdedbf6d6354471319e781c0dfef054c81fbc7cf83f338a4296c0cae11" +checksum = "fa7359d10048f68ab8b09fa71c3daccfb0e9b559aed648a8f95469c27057180c" [[package]] name = "windows_i686_msvc" @@ -8851,9 +10887,9 @@ checksum = "240948bc05c5e7c6dabba28bf89d89ffce3e303022809e73deaefe4f6ec56c66" [[package]] name = "windows_i686_msvc" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "581fee95406bb13382d2f65cd4a908ca7b1e4c2f1917f143ba16efe98a589b5d" +checksum = "1e7ac75179f18232fe9c285163565a57ef8d3c89254a30685b57d83a38d326c2" [[package]] name = "windows_x86_64_gnu" @@ -8875,9 +10911,9 @@ checksum = "147a5c80aabfbf0c7d901cb5895d1de30ef2907eb21fbbab29ca94c5b08b1a78" [[package]] name = "windows_x86_64_gnu" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2e55b5ac9ea33f2fc1716d1742db15574fd6fc8dadc51caab1c16a3d3b4190ba" +checksum = "9c3842cdd74a865a8066ab39c8a7a473c0778a3f29370b5fd6b4b9aa7df4a499" [[package]] name = "windows_x86_64_gnullvm" @@ -8899,9 +10935,9 @@ checksum = "24d5b23dc417412679681396f2b49f3de8c1473deb516bd34410872eff51ed0d" [[package]] name = "windows_x86_64_gnullvm" -version = "0.53.0" +version = "0.53.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0a6e035dd0599267ce1ee132e51c27dd29437f63325753051e71dd9e42406c57" +checksum = "0ffa179e2d07eee8ad8f57493436566c7cc30ac536a3379fdf008f47f6bb7ae1" [[package]] name = "windows_x86_64_msvc" @@ -8927,6 +10963,57 @@ version = "0.53.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486" +[[package]] +name = "winit" +version = "0.30.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a6755fa58a9f8350bd1e472d4c3fcc25f824ec358933bba33306d0b63df5978d" +dependencies = [ + "ahash 0.8.12", + "android-activity", + "atomic-waker", + "bitflags 2.13.2", + "block2 0.5.1", + "bytemuck", + "calloop 0.13.0", + "cfg_aliases", + "concurrent-queue", + "core-foundation 0.9.4", + "core-graphics 0.23.2", + "cursor-icon", + "dpi", + "js-sys", + "libc", + "memmap2", + "ndk", + "objc2 0.5.2", + "objc2-app-kit 0.2.2", + "objc2-foundation 0.2.2", + "objc2-ui-kit 0.2.2", + "orbclient", + "percent-encoding", + "pin-project", + "raw-window-handle", + "redox_syscall 0.4.1", + "rustix 0.38.44", + "smithay-client-toolkit 0.19.2", + "smol_str", + "tracing", + "unicode-segmentation", + "wasm-bindgen", + "wasm-bindgen-futures", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "wayland-protocols-plasma", + "web-sys", + "web-time", + "windows-sys 0.52.0", + "x11-dl", + "x11rb", + "xkbcommon-dl", +] + [[package]] name = "winnow" version = "0.5.40" @@ -8973,6 +11060,12 @@ dependencies = [ "wit-bindgen-rust-macro", ] +[[package]] +name = "wit-bindgen" +version = "0.57.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1ebf944e87a7c253233ad6766e082e3cd714b5d03812acc24c318f549614536e" + [[package]] name = "wit-bindgen-core" version = "0.51.0" @@ -8990,7 +11083,7 @@ version = "0.33.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3268f3d866458b787f390cf61f4bbb563b922d091359f9608842999eaee3943c" dependencies = [ - "bitflags 2.11.0", + "bitflags 2.13.2", ] [[package]] @@ -9031,7 +11124,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9d66ea20e9553b30172b5e831994e35fbde2d165325bec84fc43dbf6f4eb9cb2" dependencies = [ "anyhow", - "bitflags 2.11.0", + "bitflags 2.13.2", "indexmap 2.13.0", "log", "serde", @@ -9190,7 +11283,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "186f9871daa55fd9c016578b810d149de58367113db7fb72b462d2323ce19514" dependencies = [ "base64 0.22.1", - "block2 0.6.1", + "block2 0.6.2", "cookie", "crossbeam-channel", "dirs", @@ -9201,14 +11294,14 @@ dependencies = [ "gtk", "http", "javascriptcore-rs", - "jni", + "jni 0.21.1", "libc", "ndk", "objc2 0.6.4", - "objc2-app-kit", + "objc2-app-kit 0.3.2", "objc2-core-foundation", - "objc2-foundation 0.3.1", - "objc2-ui-kit", + "objc2-foundation 0.3.2", + "objc2-ui-kit 0.3.2", "objc2-web-kit", "once_cell", "percent-encoding", @@ -9221,7 +11314,7 @@ dependencies = [ "webkit2gtk", "webkit2gtk-sys", "webview2-com", - "windows", + "windows 0.61.3", "windows-core 0.61.2", "windows-version", "x11-dl", @@ -9257,6 +11350,64 @@ dependencies = [ "pkg-config", ] +[[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", + "libloading 0.8.6", + "once_cell", + "rustix 1.1.5", + "x11rb-protocol", +] + +[[package]] +name = "x11rb-protocol" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6fc2961e4ef194dcbfe56bb845534d0dc8098940c7e5c012a258bfec6701bd" + +[[package]] +name = "xcursor" +version = "0.3.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "163b33ed8786455e2fa5d72f554057ce3f3182425434f756cd39c99839d88e23" + +[[package]] +name = "xkbcommon-dl" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d039de8032a9a8856a6be89cea3e5d12fdd82306ab7c94d74e6deab2460651c5" +dependencies = [ + "bitflags 2.13.2", + "dlib", + "log", + "once_cell", + "xkeysym", +] + +[[package]] +name = "xkeysym" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b9cc00251562a284751c9973bace760d86c0276c471b4be569fe6b068ee97a56" + +[[package]] +name = "xml-rs" +version = "0.8.29" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e450f9b2ed1dff33c94c12589a87338689467b9c4f5d8a5710bd09a847d2c8a7" + +[[package]] +name = "xmlwriter" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9" + [[package]] name = "yansi" version = "1.0.1" @@ -9289,9 +11440,9 @@ dependencies = [ [[package]] name = "zbus" -version = "5.16.0" +version = "5.19.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eee682d202a77e4a9f3b2c2bdf48a7b28af5c08c34ddf66f98c93e5e39464285" +checksum = "5db4be7c075cb421e4b7ee645541604239bd243ba7c357511f4ff3a74b555907" dependencies = [ "async-broadcast", "async-executor", @@ -9303,13 +11454,13 @@ dependencies = [ "async-trait", "blocking", "enumflags2", - "event-listener 5.4.1", + "event-listener 5.4.2", "futures-core", "futures-lite", "hex", "libc", "ordered-stream", - "rustix 1.1.4", + "rustix 1.1.5", "serde", "serde_repr", "tracing", @@ -9323,15 +11474,39 @@ dependencies = [ ] [[package]] -name = "zbus_macros" -version = "5.16.0" +name = "zbus-lockstep" +version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "adf1bd45a81a103745b1757754762a26e8cd01e4532e4d6c8ec431624b80d1d6" +checksum = "6998de05217a084b7578728a9443d04ea4cd80f2a0839b8d78770b76ccd45863" +dependencies = [ + "zbus_xml", + "zvariant", +] + +[[package]] +name = "zbus-lockstep-macros" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "10da05367f3a7b7553c8cdf8fa91aee6b64afebe32b51c95177957efc47ca3a0" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.117", + "zbus-lockstep", + "zbus_xml", + "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 3.5.0", "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.7", "zbus_names", "zvariant", "zvariant_utils", @@ -9339,15 +11514,36 @@ dependencies = [ [[package]] name = "zbus_names" -version = "4.3.2" +version = "4.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7074f3e50b894eac91750142016d30d0a89be8e67dbfd9704fb875825760e52d" +checksum = "d8bf88b4a3ff53e883001e0e0115b297a9d53c31b9c1edd2bfdd853e3428624e" dependencies = [ "serde", "winnow 1.0.0", "zvariant", ] +[[package]] +name = "zbus_xml" +version = "5.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1586c021a01ca0a9216dcd874e546382e156a5cbab5fab6cb5f10087e22682a" +dependencies = [ + "serde", + "winnow 1.0.0", + "zbus_names", + "zvariant", +] + +[[package]] +name = "zcheapstr" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d1afec51604565183aeb5c54c20aeab286120d4e4460f7f76e3e8bb8c0d99473" +dependencies = [ + "serde", +] + [[package]] name = "zerocopy" version = "0.8.27" @@ -9477,40 +11673,42 @@ dependencies = [ [[package]] name = "zvariant" -version = "5.12.0" +version = "5.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a192a0bde63360d77a7523c833d4b4ce6070a927e2c53246e4c540b1a3e27be0" +checksum = "c1d34c27cc6cdd1f458427519dd6b8612f7b7e3f7b9a0b2355d041dda9869147" dependencies = [ "endi", "enumflags2", "serde", + "url", "winnow 1.0.0", + "zcheapstr", "zvariant_derive", "zvariant_utils", ] [[package]] name = "zvariant_derive" -version = "5.12.0" +version = "5.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bc6cde9c01c511074be97f7ccb6c19d0da89e3f8662e812e999dcfd4638737" +checksum = "864155e69b4352db0c7f374917bf45d1e0c8d17659c8b3dbf9795f3673f8c497" dependencies = [ "proc-macro-crate 3.5.0", "proc-macro2", "quote", - "syn 2.0.117", + "syn 3.0.7", "zvariant_utils", ] [[package]] name = "zvariant_utils" -version = "3.4.0" +version = "4.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e8535915cfa75547e559d8c68e8139909a4aeee076831e4ef7fc59d8172c4d6" +checksum = "bad0294361a320b694a328460dc73add56c306150f5cb6bfafc44446120008a3" dependencies = [ "proc-macro2", "quote", "serde", - "syn 2.0.117", + "syn 3.0.7", "winnow 1.0.0", ] diff --git a/Cargo.toml b/Cargo.toml index 8a6f7b1cb8..0d33a2f3b0 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -3,6 +3,7 @@ resolver = "2" # Desktop application and its local build/test dependencies. members = [ + "artcraft-native", # Pure Rust (egui) desktop app; no Tauri or webview "crates/api_clients/artcraft/artcraft_api_defs", "crates/api_clients/artcraft/artcraft_client", "crates/api_clients/artcraft/artcraft_router", diff --git a/NOTICE b/NOTICE index 1b4688ade3..c061efac17 100644 --- a/NOTICE +++ b/NOTICE @@ -24,6 +24,9 @@ Font Awesome Free icons (frontend/libs/icons/src/lib/brand-icons.tsx, Copyright Fonticons, Inc. https://fontawesome.com/license/free Carter One font (frontend/apps/artcraft/app/public/resources/fonts/CarterOneRegular.json) — SIL Open Font License 1.1. https://fonts.google.com/specimen/Carter+One +Inter, Archivo and Geist Mono fonts (artcraft-native/assets/fonts/) — SIL Open Font License 1.1; + each font's license is next to it. https://rsms.me/inter/ · + https://fonts.google.com/specimen/Archivo · https://vercel.com/font Third-party trademarks diff --git a/artcraft-native/Cargo.toml b/artcraft-native/Cargo.toml new file mode 100644 index 0000000000..d2def584f7 --- /dev/null +++ b/artcraft-native/Cargo.toml @@ -0,0 +1,43 @@ +[package] +name = "artcraft_native" +description = "ArtCraft desktop app in pure Rust: an egui UI over the ArtCraft API client (no Tauri, no webview)" +version = "0.1.0" +edition = "2021" +publish = false + +[[bin]] +name = "artcraft-native" +path = "src/main.rs" + +[dependencies] +# Internal (Tauri-free) API crates shared with the Tauri app. +artcraft_api_defs.workspace = true +artcraft_client.workspace = true +tokens.workspace = true + +# External +anyhow.workspace = true +cookie.workspace = true +chrono.workspace = true +directories = "6.0.0" +eframe = { version = "0.36", default-features = false, features = ["default_fonts", "glow", "accesskit", "wayland", "x11", "persistence", "links"] } +egui = "0.36" +enums.workspace = true +egui_extras = { version = "0.36", default-features = false, features = ["image", "svg"] } +env_logger.workspace = true +image = { version = "0.25", default-features = false, features = ["png", "jpeg", "webp", "gif"] } +log.workspace = true +open = "5" +reqwest = { workspace = true, features = ["multipart"] } +resvg = "0.45" +rfd = "0.16" +serde.workspace = true +serde_json.workspace = true +tokio = { workspace = true, features = ["rt-multi-thread", "sync", "time", "fs"] } +uuid = { workspace = true, features = ["v4"] } + +# Pasting images from the clipboard (egui's own clipboard support is text only). +arboard = { version = "3", default-features = false, features = ["image-data"] } + +[dev-dependencies] +egui_kittest = "0.36" diff --git a/artcraft-native/README.md b/artcraft-native/README.md new file mode 100644 index 0000000000..5a771a2650 --- /dev/null +++ b/artcraft-native/README.md @@ -0,0 +1,106 @@ +# ArtCraft Native + +ArtCraft's desktop app in pure Rust: an [egui](https://github.com/emilk/egui) UI over the same +ArtCraft API client crates the Tauri app uses. There is no Tauri, no webview and no JavaScript. + +The look follows the brutalist webapp (`artcraft-services/frontend/apps/artcraft-webapp`). That +means near-black surfaces with white/15 hairlines and 3 px corners on controls. Type is Archivo for +display, Inter for body text and Geist Mono for labels. The brand blue marks the primary actions. + +Create Image and Create Video are fully built. The other tools show a "coming soon" page that +links to the same tool in the web app. + +## Running + +```bash +cargo run -p artcraft_native --release +``` + +The workspace's default member is the Tauri app, so pass `-p artcraft_native`. + +- **Sign-in.** On first launch the app reuses an existing ArtCraft login. It reads the session + cookie from the Tauri app's jar (`/ai.artcraft.app/.cookies`) and keeps its own copy in + `~/Artcraft/credentials/native_session.json`. Otherwise use "Sign in with browser" (device code) + or a username and password. +- **API host.** `~/Artcraft/settings/env_configs.json` selects it, exactly as for the Tauri app. + +## Architecture + +| Module | What it does | +|--------------------|--------------------------------------------------------------------------------| +| `backend` | Tokio runtime and every API call; results come back to the UI as `Event`s | +| `backend::wire` | Lenient response shapes; new server enum values can't break decoding | +| `backend::session` | Credentials: own file, Tauri cookie import, env config | +| `backend::media_cache` | Thumbnails and previews: downloaded and decoded off-thread, evicted when unused | +| `models` | Model catalog from OmniGen listings, plus names, families and limits | +| `prompt_box` | The shared prompt box: editor, reference deck, keyframes, pickers, model selector | +| `pages` | Create Image, Create Video, Home, Library, and the shared page shell | +| `feed` | Generation feed: running, failed and finished jobs, library paging, grid and list | +| `overlays` | Lightbox, library picker, sign-in and settings dialogs | +| `shell` | Sidebar and top bar | +| `theme`, `ui` | Colour and type tokens, Lucide-style vector icons, widgets, toasts | + +How the backend works: + +- **Generation.** It goes through OmniGen: `/v1/omni_gen/{models,cost,generate}/{image,video}`. + Model capabilities come from the server, so new models and options appear without an app update. +- **Typed client functions.** Model lists, uploads, credits, login and deletes use + `artcraft_client`. +- **Lenient decoding.** Generate and cost requests are JSON maps, as in the Tauri app. Job polling + (`/v1/jobs/session`), the library list, batches and prompts are decoded with lenient structs. +- **Identity headers.** Every request sends the desktop identity headers: `Origin` and + `User-Agent`. + +## Prompt box parity + +| Feature | Status | +|-----------------------------------------------------------------|-----------------------------------------| +| Auto-growing prompt (~4 lines), expand/collapse, resize grip | Done | +| Focus mode (fullscreen editor with deck and toolbar) | Done | +| Length counter, red over the model's limit | Done | +| Enter to generate (setting; Shift+Enter for a new line) | Done | +| `@Image1` / `@Video1` / `@Audio1` highlight and autocomplete | Done | +| Reference deck: fan, +N badge, hover-expand, reorder, clear all | Done | +| Keyframe slots: first/last frame, tilt, swap | Done | +| Upload, pick from library, drag & drop, paste image | Done (video uploads must be MP4) | +| Model selector with families, logos, capability badges | Done | +| Aspect ratio, resolution, quality, count | Done | +| Bitrate, output format, duration slider, sound, input mode | Done | +| Live credit cost on the generate button | Done | +| Validation: starting frame, text-only banner, limits, uploads | Done | +| Clear all (confirms when references are attached) | Done | +| `@Character` mentions and the Characters modal (Seedance 2.0) | Not yet | +| Provider choice (Midjourney direct, fal) | Not yet; everything runs via ArtCraft | +| In-app video and audio playback | Opens in the system player instead | +| Animated video previews in the feed | Still frames only | + +Feed and lightbox: + +- **Feed.** Pending cards show progress, time left and a batch banner. Failed cards show the reason + and can be dismissed. The grid is masonry, with a list view alongside. Hover actions are Recreate, + Make Video, Share and Download. Select mode does batch downloads. The last viewed item is marked. +- **Lightbox.** Prev/next with the arrow keys, prompt copy and details. Actions are Recreate, Make + Video, Download, Share and Delete. + +## Diagnostics + +Set `ARTCRAFT_SCREENSHOT=` to save a screenshot once the window has settled. +`ARTCRAFT_PAGE` (`home`, `create-image`, `create-video` or `library`) picks the page, and +`ARTCRAFT_SCREENSHOT_EXIT=1` closes the app afterwards. + +## Tests + +```bash +cargo test -p artcraft_native +``` + +There are unit tests for the catalog, feed store, wire decoding and backend helpers. Headless UI +tests (`egui_kittest`) drive the prompt box: generate gating, Enter to generate, the pickers, +`@` mentions and clear-all. + +## Fonts and brand assets + +`assets/fonts` holds Inter, Archivo and Geist Mono, all under the SIL Open Font License; the +licences sit next to the files. The wordmark, app icon and creator logos are the Tauri app's own +(`frontend/apps/artcraft/app/public/resources`, `crates/desktop/artcraft/icons`); see `NOTICE` +for their terms. diff --git a/artcraft-native/assets/fonts/Archivo-Variable.ttf b/artcraft-native/assets/fonts/Archivo-Variable.ttf new file mode 100644 index 0000000000000000000000000000000000000000..cc64253d36665a5ca0d6719cdf1e32b3de453b51 GIT binary patch literal 658596 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

nm;2NUFRC${vR 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

l3Be9C4i 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�AX6$CMwN}s4U)$r6)w3? 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 z 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

X*mbjKmR9xHcw+Zr90PjHUtsY;yAShzGWRyVbMr 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 literal 0 HcmV?d00001 diff --git a/artcraft-native/assets/fonts/Inter-Variable.ttf b/artcraft-native/assets/fonts/Inter-Variable.ttf new file mode 100644 index 0000000000000000000000000000000000000000..047c92f6e2212473dc436020afed689527076d44 GIT binary patch literal 876576 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

Ek&TdifBe7Pd^mmY)(962bN_SP%pQaf-0_4xU_4 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

us)Vd6A*)Kr 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ⅅz?iuH&b8I;Pc4b>A5fi= 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 { + Env { ctx: $ctx.clone(), backend: &$app.backend, cache: &mut $app.cache, toasts: &mut $app.toasts, catalog: &$app.catalog, signed_in: $app.user.is_some(), enter_to_generate: $app.enter_to_generate, view_mode: $app.view_mode, ratios: &mut $app.ratios, prompts: &$app.prompts, requests: &mut $app.requests } + }; +} + +const STORAGE_KEY: &str = "artcraft-native"; +const JOB_POLL_INTERVAL: f64 = 5.0; +const CREDITS_INTERVAL: f64 = 60.0; +const MODEL_RETRY_INTERVAL: f64 = 15.0; +/// List view: prompt records fetched per frame at most. +const PROMPT_FETCHES_PER_FRAME: usize = 8; + +/// Preferences that survive restarts. +#[derive(Clone, Debug, Serialize, Deserialize)] +#[serde(default)] +struct Saved { + page: Page, + enter_to_generate: bool, + view_mode: ViewMode, + sidebar_open: bool, + image: ImageSettings, + video: VideoSettings, +} + +impl Default for Saved { + fn default() -> Self { + Self { page: Page::CreateImage, enter_to_generate: false, view_mode: ViewMode::Grid, sidebar_open: true, image: ImageSettings { count: 1, ..Default::default() }, video: VideoSettings::default() } + } +} + +pub struct ArtcraftApp { + backend: Backend, + cache: MediaCache, + toasts: Toasts, + catalog: Catalog, + user: Option, + credits: Option, + page: Page, + enter_to_generate: bool, + view_mode: ViewMode, + sidebar_open: bool, + image: CreateImagePage, + video: CreateVideoPage, + library: FeedStore, + ratios: RatioCache, + /// Prompt texts by prompt token (list view, lightbox). + prompts: HashMap, + prompt_records: HashMap, + requested_prompts: HashSet, + /// A Recreate waiting for its prompt record. + pending_recreate: Option<(MediaKind, String)>, + /// Which feed a batch expansion belongs to. + batch_kinds: HashMap, + lightbox: Option, + picker: Option, + login: Option, + settings_open: bool, + preview: Option, + logo: egui::TextureHandle, + requests: Vec, + screenshot: Option, + next_poll: f64, + next_credits: f64, + models_retry_at: Option, +} + +impl ArtcraftApp { + pub fn new(cc: &eframe::CreationContext<'_>) -> Self { + theme::apply(&cc.egui_ctx); + egui_extras::install_image_loaders(&cc.egui_ctx); + let mut saved: Saved = cc.storage.and_then(|s| eframe::get_value(s, STORAGE_KEY)).unwrap_or_default(); + if let Some(page) = std::env::var("ARTCRAFT_PAGE").ok().and_then(|p| Page::from_slug(&p)) { + saved.page = page; + } + let backend = Backend::new(cc.egui_ctx.clone()); + let cache = MediaCache::new(backend.runtime(), backend.http()); + backend.load_models(Modality::Image); + backend.load_models(Modality::Video); + backend.refresh_session(); + Self { cache, toasts: Toasts::default(), catalog: Catalog::default(), user: None, credits: None, page: saved.page, enter_to_generate: saved.enter_to_generate, view_mode: saved.view_mode, sidebar_open: saved.sidebar_open, image: CreateImagePage::new(saved.image), video: CreateVideoPage::new(saved.video), library: FeedStore::default(), ratios: RatioCache::default(), prompts: HashMap::new(), prompt_records: HashMap::new(), requested_prompts: HashSet::new(), pending_recreate: None, batch_kinds: HashMap::new(), lightbox: None, picker: None, login: None, settings_open: false, preview: None, logo: load_logo(&cc.egui_ctx), requests: Vec::new(), screenshot: ScreenshotRequest::from_env(), next_poll: 0.0, next_credits: CREDITS_INTERVAL, models_retry_at: None, backend } + } + + // --- Events from the backend ------------------------------------------------------------- + + fn handle_event(&mut self, ctx: &egui::Context, event: Event) { + match event { + Event::Session(user) => { + let changed = self.user.as_ref().map(|u| &u.username) != user.as_ref().map(|u| &u.username); + self.user = user; + if changed { + self.image.feed.reset(); + self.video.feed.reset(); + self.library.reset(); + self.next_poll = 0.0; + } + if self.user.is_some() { + self.login = None; + } else { + self.credits = None; + if let Some(login) = &mut self.login { + login.busy = false; + } + } + }, + Event::LoginFailed(message) => { + if let Some(login) = &mut self.login { + login.busy = false; + login.device = None; + login.error = Some(message); + } + }, + Event::DeviceLogin { url, code } => { + if let Some(login) = &mut self.login { + login.device = Some((url, code)); + } + }, + Event::Credits(credits) => self.credits = Some(credits), + Event::Models(modality, Ok(models)) => match modality { + Modality::Image => self.catalog.set_image(models), + Modality::Video => self.catalog.set_video(models), + }, + Event::Models(_, Err(message)) => { + if self.models_retry_at.is_none() { + self.toasts.error(format!("Couldn't load models: {message}")); + } + self.models_retry_at = Some(ctx.input(|i| i.time) + MODEL_RETRY_INTERVAL); + }, + Event::Cost { key, credits } => { + self.image.cost.apply(&key, credits); + self.video.cost.apply(&key, credits); + }, + Event::Enqueued { modality, job_tokens, meta } => { + let mut env = env!(self, ctx); + match modality { + Modality::Image => self.image.on_enqueued(&mut env, &job_tokens, &meta), + Modality::Video => self.video.on_enqueued(&mut env, &job_tokens, &meta), + } + self.next_poll = ctx.input(|i| i.time) + 2.0; + }, + Event::EnqueueFailed { modality, message } => { + let mut env = env!(self, ctx); + match modality { + Modality::Image => self.image.on_enqueue_failed(&mut env, &message), + Modality::Video => self.video.on_enqueue_failed(&mut env, &message), + } + }, + Event::Uploaded { ref_id, result } => { + if self.image.refs.find_mut(ref_id).is_some() { + common::apply_upload(&mut self.toasts, &mut self.image.refs, ref_id, result); + } else if common::apply_upload(&mut self.toasts, &mut self.video.refs, ref_id, result) { + let mut env = env!(self, ctx); + self.video.check_durations(&mut env, ref_id); + } + }, + Event::Jobs(jobs) => { + for (kind, notices) in [(MediaKind::Image, self.image.feed.apply_jobs(MediaKind::Image, &jobs, &self.catalog)), (MediaKind::Video, self.video.feed.apply_jobs(MediaKind::Video, &jobs, &self.catalog))] { + for notice in notices { + match notice { + FeedNotice::Completed => { + self.toasts.success(format!("{} generation complete!", kind.label())); + self.backend.refresh_credits(); + }, + FeedNotice::Failed(reason) => self.toasts.error(reason), + FeedNotice::LoadBatch { job_token, batch_token } => { + self.batch_kinds.insert(job_token.clone(), kind); + self.backend.load_batch(job_token, batch_token); + }, + } + } + } + }, + Event::LibraryPage { key, page, items, total_pages } => match key.as_str() { + "picker" => { + if let Some(p) = &mut self.picker { + p.apply_page(page, items, total_pages); + } + }, + "image" => self.image.feed.apply_library_page(MediaKind::Image, page, &items, total_pages), + "video" => self.video.feed.apply_library_page(MediaKind::Video, page, &items, total_pages), + _ => self.library.apply_library_page(MediaKind::Image, page, &items, total_pages), + }, + Event::LibraryFailed { key, message } => { + match key.as_str() { + "picker" => { + if let Some(p) = &mut self.picker { + p.loading = false; + p.has_more = false; + } + }, + "image" => self.image.feed.library_failed(), + "video" => self.video.feed.library_failed(), + _ => self.library.library_failed(), + } + self.toasts.error(format!("Couldn't load your library: {message}")); + }, + Event::Batch { job_token, items } => match self.batch_kinds.remove(&job_token) { + Some(MediaKind::Video) => self.video.feed.apply_batch(MediaKind::Video, &items), + _ => self.image.feed.apply_batch(MediaKind::Image, &items), + }, + Event::Prompt(prompt) => { + if let Some(text) = &prompt.maybe_positive_prompt { + self.prompts.insert(prompt.token.clone(), text.clone()); + } + if self.pending_recreate.as_ref().is_some_and(|(_, t)| *t == prompt.token) { + if let Some((kind, _)) = self.pending_recreate.take() { + self.apply_recreate(kind, &prompt); + } + } + self.prompt_records.insert(prompt.token.clone(), prompt); + }, + Event::Deleted(token) => { + for feed in [&mut self.image.feed, &mut self.video.feed, &mut self.library] { + feed.remove_item(&token); + } + if self.lightbox.as_ref().is_some_and(|l| l.token == token) { + self.lightbox = None; + } + }, + Event::Saved(path) => self.toasts.success(format!("Downloaded {}", common::file_name(&path))), + Event::Toast { error, message } => { + if error { + self.toasts.error(message); + } else { + self.toasts.success(message); + } + }, + } + } + + // --- Requests from the pages ------------------------------------------------------------- + + fn handle_request(&mut self, ctx: &egui::Context, request: AppRequest) { + match request { + AppRequest::SignIn => self.open_login(), + AppRequest::Open { kind, token } => { + if let Some(item) = self.find_item(&token) { + self.request_prompt(item.prompt_token.clone()); + } + self.lightbox = Some(Lightbox::new(kind, token)); + }, + AppRequest::PickFromLibrary { kind, slot, max, page } => { + let Some(user) = &self.user else { + self.open_login(); + return; + }; + let refs = if page == MediaKind::Image { &self.image.refs } else { &self.video.refs }; + let attached: HashSet = refs.list(kind).iter().chain(refs.first_frame.iter()).chain(refs.last_frame.iter()).filter_map(|r| r.token.clone()).collect(); + let mut picker = LibraryPicker::new(kind, slot, page, max, attached); + picker.loading = true; + self.backend.load_library("picker".to_owned(), user.username.clone(), picker.media_class(), 0); + self.picker = Some(picker); + }, + AppRequest::MakeVideo { token } => { + let Some(item) = self.find_item(&token) else { + return; + }; + let image = RefMedia::from_library(RefKind::Image, item.token.clone(), item.thumbnail.clone(), Some(item.full_url.clone()), 0.0); + self.video.set_start_image(image); + self.lightbox = None; + self.page = Page::CreateVideo; + }, + AppRequest::Recreate { kind, token } => { + let Some(prompt_token) = self.find_item(&token).and_then(|i| i.prompt_token.clone()) else { + self.toasts.error("Could not load the original prompt."); + return; + }; + match self.prompt_records.get(&prompt_token).cloned() { + Some(prompt) => self.apply_recreate(kind, &prompt), + None => { + self.pending_recreate = Some((kind, prompt_token.clone())); + self.requested_prompts.insert(prompt_token.clone()); + self.backend.load_prompt(prompt_token); + }, + } + }, + AppRequest::Share(token) => { + ctx.copy_text(format!("{SHARE_URL_BASE}{token}")); + self.toasts.success("Share link copied"); + }, + AppRequest::CopyText(text) => { + ctx.copy_text(text); + self.toasts.success("Prompt copied"); + }, + AppRequest::Download(tokens) => self.download(&tokens), + AppRequest::Preview(url) => self.preview = Some(url), + AppRequest::LoadMoreLibrary(key) => { + let Some(user) = &self.user else { + return; + }; + let (feed, name) = match key { + FeedKey::Image => (&mut self.image.feed, "image"), + FeedKey::Video => (&mut self.video.feed, "video"), + FeedKey::Library => (&mut self.library, "library"), + }; + if let Some(page) = feed.next_library_page() { + self.backend.load_library(name.to_owned(), user.username.clone(), key.media_classes(), page); + } + }, + } + } + + fn apply_recreate(&mut self, kind: MediaKind, prompt: &Prompt) { + match kind { + MediaKind::Image => { + self.image.apply_prompt(prompt); + self.page = Page::CreateImage; + }, + MediaKind::Video => { + self.video.apply_prompt(prompt); + self.page = Page::CreateVideo; + }, + } + self.lightbox = None; + } + + fn download(&mut self, tokens: &[String]) { + let items: Vec = tokens.iter().filter_map(|t| self.find_item(t).cloned()).collect(); + match items.as_slice() { + [] => {}, + [item] => { + let name = file_name_for(item); + if let Some(path) = rfd::FileDialog::new().set_file_name(&name).save_file() { + self.backend.save_url(item.full_url.clone(), path); + } + }, + many => { + if let Some(dir) = rfd::FileDialog::new().pick_folder() { + for item in many { + self.backend.save_url(item.full_url.clone(), dir.join(file_name_for(item))); + } + for feed in [&mut self.image.feed, &mut self.video.feed, &mut self.library] { + feed.selecting = false; + feed.selected.clear(); + } + } + }, + } + } + + fn find_item(&self, token: &str) -> Option<&FeedItem> { + self.image.feed.find(token).or_else(|| self.video.feed.find(token)).or_else(|| self.library.find(token)) + } + + fn request_prompt(&mut self, prompt_token: Option) { + if let Some(t) = prompt_token { + if self.requested_prompts.insert(t.clone()) { + self.backend.load_prompt(t); + } + } + } + + fn open_login(&mut self) { + if self.login.is_none() { + self.login = Some(LoginDialog::default()); + } + } + + /// The feed the top bar's toggles act on. + fn current_feed(&mut self) -> Option<&mut FeedStore> { + match self.page { + Page::CreateImage => Some(&mut self.image.feed), + Page::CreateVideo => Some(&mut self.video.feed), + Page::Library => Some(&mut self.library), + _ => None, + } + } + + // --- Frame ------------------------------------------------------------------------------- + + fn timers(&mut self, ctx: &egui::Context) { + let now = ctx.input(|i| i.time); + if self.user.is_some() && now >= self.next_poll { + self.next_poll = now + JOB_POLL_INTERVAL; + self.backend.poll_jobs(); + } + if self.user.is_some() && now >= self.next_credits { + self.next_credits = now + CREDITS_INTERVAL; + self.backend.refresh_credits(); + } + if self.models_retry_at.is_some_and(|t| now >= t) { + self.models_retry_at = None; + if self.catalog.image.is_empty() { + self.backend.load_models(Modality::Image); + } + if self.catalog.video.is_empty() { + self.backend.load_models(Modality::Video); + } + } + ctx.request_repaint_after(Duration::from_secs(1)); + } + + fn shell(&mut self, ui: &mut Ui) { + let account = Account { username: self.user.as_ref().map(|u| u.username.as_str()), display_name: self.user.as_ref().map(|u| u.display_name.as_str()).filter(|n| !n.is_empty()), credits: self.credits }; + let mut actions = Vec::new(); + if self.sidebar_open { + egui::Panel::left("sidebar").exact_size(shell::sidebar_width()).resizable(false).frame(egui::Frame::NONE.fill(theme::BG)).show(ui, |ui| { + actions.extend(shell::sidebar(ui, self.page, &account, &self.logo)); + }); + } + let toggles = match self.page { + Page::CreateImage => Some((self.view_mode, self.image.feed.selecting)), + Page::CreateVideo => Some((self.view_mode, self.video.feed.selecting)), + Page::Library => Some((self.view_mode, self.library.selecting)), + _ => None, + }; + egui::Panel::top("topbar").exact_size(shell::topbar_height()).resizable(false).frame(egui::Frame::NONE).show(ui, |ui| { + actions.extend(shell::topbar(ui, self.page, &account, toggles, self.sidebar_open)); + }); + for action in actions { + match action { + ShellAction::Navigate(page) => { + self.page = page; + self.lightbox = None; + }, + ShellAction::ToggleSidebar => self.sidebar_open = !self.sidebar_open, + ShellAction::SignIn => self.open_login(), + ShellAction::SignOut => { + self.backend.logout(); + self.settings_open = false; + }, + ShellAction::OpenSettings => self.settings_open = true, + ShellAction::SetViewMode(mode) => self.view_mode = mode, + ShellAction::ToggleSelect => { + if let Some(feed) = self.current_feed() { + feed.selecting = !feed.selecting; + feed.selected.clear(); + } + }, + } + } + } + + fn page_ui(&mut self, ui: &mut Ui) { + let ctx = ui.ctx().clone(); + egui::CentralPanel::default().frame(egui::Frame::NONE.fill(theme::BG)).show(ui, |ui| { + let mut env = env!(self, ctx); + match self.page { + Page::Home => { + if let Some(page) = other::home(ui, env.signed_in, env.requests) { + self.page = page; + } + }, + Page::CreateImage => self.image.ui(ui, &mut env), + Page::CreateVideo => self.video.ui(ui, &mut env), + Page::Library => other::library(ui, &mut env, &mut self.library), + page => other::coming_soon(ui, page), + } + }); + self.prefetch_list_prompts(); + } + + /// The list view shows prompt texts: fetch the records for the visible feed, a few at a time. + fn prefetch_list_prompts(&mut self) { + if self.view_mode != ViewMode::List { + return; + } + let feed = match self.page { + Page::CreateImage => &self.image.feed, + Page::CreateVideo => &self.video.feed, + Page::Library => &self.library, + _ => return, + }; + let wanted: Vec = feed.items.iter().filter_map(|i| i.prompt_token.clone()).filter(|t| !self.requested_prompts.contains(t)).take(PROMPT_FETCHES_PER_FRAME).collect(); + for token in wanted { + self.request_prompt(Some(token)); + } + } + + fn overlays(&mut self, ctx: &egui::Context) { + if let Some(lb) = &mut self.lightbox { + let feed = match lb.kind { + _ if self.page == Page::Library => &self.library, + MediaKind::Image => &self.image.feed, + MediaKind::Video => &self.video.feed, + }; + let order = feed.ordered_tokens(); + let item = self.image.feed.find(&lb.token).or_else(|| self.video.feed.find(&lb.token)).or_else(|| self.library.find(&lb.token)).cloned(); + match item { + Some(item) => { + let prompt = item.prompt_token.as_ref().and_then(|t| self.prompt_records.get(t)); + let actions = lb.show(ctx, &item, &order, prompt, &self.catalog, &mut self.cache); + for action in actions { + self.lightbox_action(ctx, action, &item); + } + }, + None => self.lightbox = None, + } + } + if let Some(picker) = &mut self.picker { + for action in picker.show(ctx, &mut self.cache) { + match action { + PickerAction::Close => self.picker = None, + PickerAction::LoadMore => { + if let (Some(p), Some(user)) = (self.picker.as_mut(), self.user.as_ref()) { + if !p.loading { + p.loading = true; + self.backend.load_library("picker".to_owned(), user.username.clone(), p.media_class(), p.next_page); + } + } + }, + PickerAction::Confirm(picks) => { + if let Some(p) = self.picker.take() { + let refs = if p.page == MediaKind::Image { &mut self.image.refs } else { &mut self.video.refs }; + common::attach_from_library(refs, p.kind, p.slot, picks); + } + }, + } + if self.picker.is_none() { + break; + } + } + } + if let Some(login) = &mut self.login { + match login.show(ctx) { + Some(LoginAction::Close) => self.login = None, + Some(LoginAction::Password) => { + login.busy = true; + login.error = None; + self.backend.login_with_password(login.username.trim().to_owned(), std::mem::take(&mut login.password)); + }, + Some(LoginAction::Browser) => { + login.error = None; + self.backend.login_with_browser(); + }, + Some(LoginAction::CancelBrowser) => { + self.backend.cancel_browser_login(); + login.device = None; + }, + None => {}, + } + } + if self.settings_open { + let username = self.user.as_ref().map(|u| u.username.clone()); + match settings_dialog(ctx, &mut self.enter_to_generate, username.as_deref(), self.credits, self.backend.data_root()) { + Some(SettingsAction::Close) => self.settings_open = false, + Some(SettingsAction::SignOut) => { + self.settings_open = false; + self.backend.logout(); + }, + Some(SettingsAction::SignIn) => { + self.settings_open = false; + self.open_login(); + }, + None => {}, + } + } + if let Some(url) = self.preview.clone() { + let close = widgets::modal(ctx, Id::new("preview"), (ctx.content_rect().width() * 0.9).min(1100.0), |ui| { + let bounds = egui::vec2(ui.available_width(), ctx.content_rect().height() * 0.8); + match self.cache.get(ctx, &url) { + crate::backend::media_cache::Lookup::Ready(t) => { + let size = fit_inside(t.size_vec2(), bounds); + ui.vertical_centered(|ui| ui.add(egui::Image::new(&t).fit_to_exact_size(size))); + }, + _ => { + ui.add_sized(bounds, egui::Spinner::new()); + }, + } + }); + if close { + self.preview = None; + } + } + } + + fn lightbox_action(&mut self, ctx: &egui::Context, action: LightboxAction, item: &FeedItem) { + match action { + LightboxAction::Close => self.lightbox = None, + LightboxAction::Navigate(token) => { + if let Some(next) = self.find_item(&token).cloned() { + self.request_prompt(next.prompt_token); + } + for feed in [&mut self.image.feed, &mut self.video.feed, &mut self.library] { + if feed.find(&token).is_some() { + feed.last_viewed = Some(token.clone()); + } + } + if let Some(lb) = &mut self.lightbox { + lb.token = token; + } + }, + LightboxAction::Recreate => self.handle_request(ctx, AppRequest::Recreate { kind: item.kind, token: item.token.clone() }), + LightboxAction::MakeVideo => self.handle_request(ctx, AppRequest::MakeVideo { token: item.token.clone() }), + LightboxAction::Download => self.download(std::slice::from_ref(&item.token)), + LightboxAction::Share => self.handle_request(ctx, AppRequest::Share(item.token.clone())), + LightboxAction::Delete => { + self.backend.delete_media(item.token.clone()); + self.lightbox = None; + }, + LightboxAction::CopyPrompt(text) => self.handle_request(ctx, AppRequest::CopyText(text)), + LightboxAction::Play(url) => { + if let Err(err) = open::that(&url) { + self.toasts.error(format!("Couldn't open the video: {err}")); + } + }, + } + } +} + +impl eframe::App for ArtcraftApp { + fn logic(&mut self, ctx: &egui::Context, _frame: &mut eframe::Frame) { + for event in self.backend.drain() { + self.handle_event(ctx, event); + } + self.timers(ctx); + } + + fn ui(&mut self, ui: &mut Ui, _frame: &mut eframe::Frame) { + let ctx = ui.ctx().clone(); + self.cache.poll(&ctx); + self.shell(ui); + self.page_ui(ui); + for request in std::mem::take(&mut self.requests) { + self.handle_request(&ctx, request); + } + self.overlays(&ctx); + self.toasts.show(&ctx); + if let Some(shot) = &mut self.screenshot { + shot.tick(&ctx); + } + } + + fn save(&mut self, storage: &mut dyn eframe::Storage) { + let saved = Saved { page: self.page, enter_to_generate: self.enter_to_generate, view_mode: self.view_mode, sidebar_open: self.sidebar_open, image: self.image.settings.clone(), video: self.video.settings.clone() }; + eframe::set_value(storage, STORAGE_KEY, &saved); + } + + fn clear_color(&self, _visuals: &egui::Visuals) -> [f32; 4] { + theme::BG.to_normalized_gamma_f32() + } +} + +/// Diagnostics: `ARTCRAFT_SCREENSHOT=` saves a screenshot once the window has settled +/// (and `ARTCRAFT_SCREENSHOT_EXIT=1` then closes the app), for checking the UI headlessly. +struct ScreenshotRequest { + path: std::path::PathBuf, + exit: bool, + frames: u32, + requested: bool, +} + +impl ScreenshotRequest { + /// Frames to wait before capturing (models, session and thumbnails get a moment to load). + const SETTLE_SECS: f64 = 8.0; + + fn from_env() -> Option { + let path = std::env::var_os("ARTCRAFT_SCREENSHOT")?.into(); + Some(Self { path, exit: std::env::var_os("ARTCRAFT_SCREENSHOT_EXIT").is_some(), frames: 0, requested: false }) + } + + fn tick(&mut self, ctx: &egui::Context) { + self.frames += 1; + ctx.request_repaint(); + if !self.requested && ctx.input(|i| i.time) >= Self::SETTLE_SECS { + self.requested = true; + ctx.send_viewport_cmd(egui::ViewportCommand::Screenshot(egui::UserData::default())); + } + let image = ctx.input(|i| { + i.raw.events.iter().find_map(|e| match e { + egui::Event::Screenshot { image, .. } => Some(image.clone()), + _ => None, + }) + }); + if let Some(image) = image { + let [w, h] = image.size; + let pixels: Vec = image.pixels.iter().flat_map(|c| c.to_array()).collect(); + match image::RgbaImage::from_raw(w as u32, h as u32, pixels).map(|img| img.save(&self.path)) { + Some(Ok(())) => log::info!("Saved a screenshot to {}", self.path.display()), + other => log::error!("Couldn't save the screenshot: {other:?}"), + } + if self.exit { + ctx.send_viewport_cmd(egui::ViewportCommand::Close); + } + } + } +} + +/// `artcraft_.`, the extension taken from the URL. +fn file_name_for(item: &FeedItem) -> String { + let ext = item.full_url.rsplit('.').next().filter(|e| e.len() <= 4 && e.chars().all(|c| c.is_ascii_alphanumeric())).unwrap_or(if item.kind == MediaKind::Video { "mp4" } else { "png" }); + format!("artcraft_{}.{ext}", item.token) +} + +/// The ArtCraft wordmark (the Tauri app's white-on-dark SVG), rasterized for the sidebar. +fn load_logo(ctx: &egui::Context) -> egui::TextureHandle { + const LOGO: &[u8] = include_bytes!("../../frontend/apps/artcraft/app/public/resources/logo/artcraft-logo-color-white.svg"); + /// Twice the 20 pt the sidebar draws it at, for high-DPI screens. + const HEIGHT_PX: f32 = 48.0; + let image = resvg::usvg::Tree::from_data(LOGO, &resvg::usvg::Options::default()).ok().and_then(|tree| { + let scale = HEIGHT_PX / tree.size().height(); + let (w, h) = ((tree.size().width() * scale).ceil() as u32, HEIGHT_PX as u32); + let mut pixmap = resvg::tiny_skia::Pixmap::new(w, h)?; + resvg::render(&tree, resvg::tiny_skia::Transform::from_scale(scale, scale), &mut pixmap.as_mut()); + Some(egui::ColorImage::from_rgba_premultiplied([w as usize, h as usize], pixmap.data())) + }); + ctx.load_texture("artcraft-logo", image.unwrap_or_else(|| egui::ColorImage::filled([1, 1], egui::Color32::TRANSPARENT)), egui::TextureOptions::LINEAR) +} diff --git a/artcraft-native/src/backend/media_cache.rs b/artcraft-native/src/backend/media_cache.rs new file mode 100644 index 0000000000..34bded086a --- /dev/null +++ b/artcraft-native/src/backend/media_cache.rs @@ -0,0 +1,153 @@ +//! Images shown in the UI: CDN thumbnails and local previews, as GPU textures. +//! +//! Downloads run on the tokio runtime (a few at a time) and decode off the UI thread; the UI +//! uploads finished images in [`MediaCache::poll`]. Textures nobody has drawn for a while are +//! dropped once the cache grows past its budget, so long feeds don't hold every image forever. + +use std::collections::HashMap; +use std::sync::Arc; +use std::sync::mpsc::{Receiver, Sender, channel}; + +use egui::{ColorImage, TextureHandle, TextureOptions}; +use log::warn; +use tokio::runtime::Handle; +use tokio::sync::Semaphore; + +/// How many images may download at once. +const MAX_CONCURRENT_DOWNLOADS: usize = 6; +/// Longest side of a decoded image; larger ones are downscaled before upload. +const MAX_DECODED_SIDE: u32 = 2048; +/// Textures kept even when unused (roughly two screens of thumbnails). +const SOFT_CAPACITY: usize = 160; +/// Frames an image may go undrawn before it can be evicted. +const EVICT_AFTER_FRAMES: u64 = 600; + +pub struct MediaCache { + rt: Handle, + http: reqwest::Client, + limiter: Arc, + tx: Sender, + rx: Receiver, + entries: HashMap, + frame: u64, +} + +/// What [`MediaCache::get`] knows about an image. +pub enum Lookup { + Loading, + Ready(TextureHandle), + Failed, +} + +enum Entry { + Loading { last_used: u64 }, + Ready { texture: TextureHandle, last_used: u64 }, + Failed, +} + +struct Loaded { + key: String, + image: Option, +} + +impl MediaCache { + pub fn new(rt: Handle, http: reqwest::Client) -> Self { + let (tx, rx) = channel(); + Self { rt, http, limiter: Arc::new(Semaphore::new(MAX_CONCURRENT_DOWNLOADS)), tx, rx, entries: HashMap::new(), frame: 0 } + } + + /// The texture for `url`, starting its download the first time it's asked for. + pub fn get(&mut self, ctx: &egui::Context, url: &str) -> Lookup { + let frame = self.frame; + match self.entries.get_mut(url) { + Some(Entry::Ready { texture, last_used }) => { + *last_used = frame; + Lookup::Ready(texture.clone()) + }, + Some(Entry::Loading { last_used }) => { + *last_used = frame; + Lookup::Loading + }, + Some(Entry::Failed) => Lookup::Failed, + None => { + self.entries.insert(url.to_owned(), Entry::Loading { last_used: frame }); + self.spawn_download(ctx, url.to_owned()); + Lookup::Loading + }, + } + } + + /// Decodes `bytes` off the UI thread and registers the result under `key`. + pub fn insert_bytes(&mut self, ctx: &egui::Context, key: &str, bytes: Arc<[u8]>) { + if self.entries.contains_key(key) { + return; + } + self.entries.insert(key.to_owned(), Entry::Loading { last_used: self.frame }); + let (tx, ctx, key) = (self.tx.clone(), ctx.clone(), key.to_owned()); + self.rt.spawn_blocking(move || { + let image = decode(&bytes); + let _ = tx.send(Loaded { key, image }); + ctx.request_repaint(); + }); + } + + /// Uploads finished downloads and evicts stale textures. Call once per frame. + pub fn poll(&mut self, ctx: &egui::Context) { + self.frame += 1; + while let Ok(Loaded { key, image }) = self.rx.try_recv() { + // Dropped while loading (evicted): don't resurrect it. + let Some(entry) = self.entries.get_mut(&key) else { + continue; + }; + *entry = match image { + Some(image) => Entry::Ready { texture: ctx.load_texture(&key, image, TextureOptions::LINEAR), last_used: self.frame }, + None => Entry::Failed, + }; + } + if self.entries.len() > SOFT_CAPACITY { + let frame = self.frame; + self.entries.retain(|_, e| match e { + Entry::Ready { last_used, .. } | Entry::Loading { last_used } => frame.saturating_sub(*last_used) < EVICT_AFTER_FRAMES, + Entry::Failed => true, + }); + } + } + + fn spawn_download(&self, ctx: &egui::Context, url: String) { + let (http, limiter, tx, ctx) = (self.http.clone(), self.limiter.clone(), self.tx.clone(), ctx.clone()); + self.rt.spawn(async move { + let image = match limiter.acquire_owned().await { + Ok(_permit) => download(&http, &url).await, + Err(_) => None, + }; + let _ = tx.send(Loaded { key: url, image }); + ctx.request_repaint(); + }); + } +} + +async fn download(http: &reqwest::Client, url: &str) -> Option { + let response = match http.get(url).send().await.and_then(|r| r.error_for_status()) { + Ok(response) => response, + Err(err) => { + warn!("Image download failed for {url}: {err}"); + return None; + }, + }; + let bytes = response.bytes().await.ok()?; + tokio::task::spawn_blocking(move || decode(&bytes)).await.ok().flatten() +} + +fn decode(bytes: &[u8]) -> Option { + let image = match image::load_from_memory(bytes) { + Ok(image) => image, + Err(err) => { + warn!("Image decode failed: {err}"); + return None; + }, + }; + let image = if image.width().max(image.height()) > MAX_DECODED_SIDE { image.thumbnail(MAX_DECODED_SIDE, MAX_DECODED_SIDE) } else { image }; + let rgba = image.to_rgba8(); + let size = [rgba.width() as usize, rgba.height() as usize]; + Some(ColorImage::from_rgba_unmultiplied(size, rgba.as_raw())) +} diff --git a/artcraft-native/src/backend/mod.rs b/artcraft-native/src/backend/mod.rs new file mode 100644 index 0000000000..669b7a2269 --- /dev/null +++ b/artcraft-native/src/backend/mod.rs @@ -0,0 +1,734 @@ +//! Everything that talks to the ArtCraft API. Calls run on a tokio runtime and report back as +//! [`Event`]s, which the UI drains once per frame; nothing here blocks the UI thread. + +pub mod media_cache; +pub mod session; +pub mod wire; + +use std::future::Future; +use std::path::{Path, PathBuf}; +use std::sync::atomic::{AtomicBool, Ordering}; +use std::sync::mpsc::{Receiver, Sender, channel}; +use std::sync::{Arc, RwLock}; +use std::time::Duration; + +use artcraft_api_defs::users::login_challenges::LoginChallengeState; +use artcraft_client::credentials::storyteller_credential_set::StorytellerCredentialSet; +use artcraft_client::endpoints::credits::get_session_credits::get_session_credits; +use artcraft_client::endpoints::media_files::delete_media_file::delete_media_file; +use artcraft_client::endpoints::media_files::upload_image_media_file_from_bytes::{ImageType, UploadImageBytesArgs, upload_image_media_file_from_bytes}; +use artcraft_client::endpoints::media_files::upload_image_media_file_from_file::{UploadImageFromFileArgs, upload_image_media_file_from_file}; +use artcraft_client::endpoints::media_files::upload_video_media_file_from_file::{UploadVideoFromFileArgs, upload_video_media_file_from_file}; +use artcraft_client::endpoints::omni_gen::models::image::omni_gen_list_image_models::{OmniGenListImageModelsArgs, omni_gen_list_image_models}; +use artcraft_client::endpoints::omni_gen::models::video::omni_gen_list_video_models::{OmniGenListVideoModelsArgs, omni_gen_list_video_models}; +use artcraft_client::endpoints::users::password_login::PasswordLoginRequest; +use artcraft_client::error::api_error::ApiError; +use artcraft_client::error::storyteller_error::StorytellerError; +use artcraft_client::utils::api_host::ApiHost; +use artcraft_client::utils::basic_json_post_request::basic_json_post_request; +use artcraft_client::utils::login_challenge_client::{LoginChallengeClient, LoginChallengeClientError}; +use enums::common::payments_namespace::PaymentsNamespace; +use log::{error, warn}; +use serde::de::DeserializeOwned; +use serde_json::{Map, Value}; +use tokens::tokens::media_files::MediaFileToken; + +use crate::feed::types::MediaKind; +use crate::models::{self, ModelInfo}; +use session::Credentials; +use wire::{BatchMedia, MediaFile, PromptResponse, SessionInfo, SessionJobs, SessionUser, UploadResponse, UserMediaList}; + +/// Items per library page (`useGalleryData`'s `PAGE_SIZE`). +pub const LIBRARY_PAGE_SIZE: u32 = 40; +/// Model listings are retried a few times before giving up (`list_*_models_command`). +const MODEL_LIST_ATTEMPTS: u32 = 3; +const MODEL_LIST_BACKOFF: Duration = Duration::from_millis(250); +/// The share link base (`SHARE_URL_BASE`). +pub const SHARE_URL_BASE: &str = "https://getartcraft.com/media/"; +/// Sent on every request (`artcraft_client_identity::ARTCRAFT_DESKTOP_USER_AGENT`). +const USER_AGENT: &str = "storyteller-client/1.0"; + +/// Which media an operation is for (OmniGen's modality in the URL). +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum Modality { + Image, + Video, +} + +impl Modality { + fn path(self) -> &'static str { + match self { + Modality::Image => "image", + Modality::Video => "video", + } + } +} + +impl From for Modality { + fn from(kind: MediaKind) -> Self { + match kind { + MediaKind::Image => Modality::Image, + MediaKind::Video => Modality::Video, + } + } +} + +/// A result coming back from the backend. +pub enum Event { + /// The session check finished: `Some` when signed in. + Session(Option), + LoginFailed(String), + /// A browser sign-in started: show the code while we wait. + DeviceLogin { + url: String, + code: String, + }, + Credits(u64), + Models(Modality, Result, String>), + /// A cost estimate for the request identified by `key`. + Cost { + key: String, + credits: Option, + }, + Enqueued { + modality: Modality, + job_tokens: Vec, + meta: EnqueueMeta, + }, + EnqueueFailed { + modality: Modality, + message: String, + }, + Uploaded { + ref_id: u64, + result: Result, + }, + Jobs(Vec), + LibraryPage { + key: String, + page: u32, + items: Vec, + total_pages: u32, + }, + LibraryFailed { + key: String, + message: String, + }, + Batch { + job_token: String, + items: Vec, + }, + Prompt(wire::Prompt), + Deleted(String), + Saved(PathBuf), + Toast { + error: bool, + message: String, + }, +} + +/// What the UI remembers about a request it just sent, to label the pending card. +#[derive(Clone, Debug)] +pub struct EnqueueMeta { + pub prompt: String, + pub model_id: String, + pub batch_count: u32, + pub ref_image: Option, +} + +/// A finished upload: the media token, plus what the server knows about the file. +#[derive(Clone, Debug)] +pub struct UploadedMedia { + pub token: String, + pub duration_secs: f32, + pub thumbnail: Option, + pub full_url: Option, +} + +pub struct Backend { + rt: tokio::runtime::Runtime, + ctx: egui::Context, + tx: Sender, + rx: Receiver, + host: ApiHost, + root: PathBuf, + creds: Arc>>, + http: reqwest::Client, + device_login_cancel: Arc, +} + +impl Backend { + pub fn new(ctx: egui::Context) -> Self { + let rt = tokio::runtime::Builder::new_multi_thread().worker_threads(4).thread_name("artcraft-io").enable_all().build().expect("tokio runtime"); + let (tx, rx) = channel(); + let root = session::data_root(); + let host = session::api_host(&root); + let creds = session::load(&root); + let http = reqwest::Client::builder().user_agent(USER_AGENT).gzip(true).timeout(Duration::from_secs(60)).build().unwrap_or_default(); + Self { rt, ctx, tx, rx, host, root, creds: Arc::new(RwLock::new(creds)), http, device_login_cancel: Arc::new(AtomicBool::new(false)) } + } + + pub fn runtime(&self) -> tokio::runtime::Handle { + self.rt.handle().clone() + } + + /// A plain HTTP client for CDN downloads (thumbnails, files). + pub fn http(&self) -> reqwest::Client { + self.http.clone() + } + + pub fn data_root(&self) -> &Path { + &self.root + } + + /// Events that arrived since the last call. + pub fn drain(&self) -> Vec { + self.rx.try_iter().collect() + } + + // --- Session ----------------------------------------------------------------------------- + + /// Checks who's signed in (`GET /v1/session`), then fetches their credits. + pub fn refresh_session(&self) { + let api = self.api(); + self.spawn(move |tx| async move { + if api.creds.is_none() { + let _ = tx.send(Event::Session(None)); + return; + } + match api.get_json::("/v1/session").await { + Ok(info) if info.logged_in => { + let _ = tx.send(Event::Session(info.user)); + api.send_credits(&tx).await; + }, + Ok(_) => { + let _ = tx.send(Event::Session(None)); + }, + Err(err) => { + warn!("Session check failed: {err}"); + let _ = tx.send(Event::Session(None)); + let _ = tx.send(Event::Toast { error: true, message: format!("Couldn't reach ArtCraft: {err}") }); + }, + } + }); + } + + pub fn refresh_credits(&self) { + let api = self.api(); + self.spawn(move |tx| async move { api.send_credits(&tx).await }); + } + + /// Signs in with a username (or email) and password (`POST /v1/login`). + pub fn login_with_password(&self, username_or_email: String, password: String) { + let (host, root, creds, ctx) = (self.host.clone(), self.root.clone(), self.creds.clone(), self.ctx.clone()); + let this = self.handle(); + self.spawn(move |tx| async move { + let result = async { + let client = LoginChallengeClient::new(&host).map_err(login_error)?; + let (response, set_cookie) = client.password_login(&PasswordLoginRequest { username_or_email, password }).await.map_err(login_error)?; + response.signed_session.filter(|s| !s.is_empty()).or_else(|| set_cookie.as_deref().and_then(session_from_set_cookie)).ok_or_else(|| "The server didn't return a session.".to_owned()) + } + .await; + match result { + Ok(session) => { + store_session(&root, &creds, session); + this.refresh_session(); + }, + Err(message) => { + let _ = tx.send(Event::LoginFailed(message)); + }, + } + ctx.request_repaint(); + }); + } + + /// Signs in through the browser: shows a code, opens the approval page, and waits. + pub fn login_with_browser(&self) { + self.device_login_cancel.store(false, Ordering::Relaxed); + let (host, root, creds, cancel) = (self.host.clone(), self.root.clone(), self.creds.clone(), self.device_login_cancel.clone()); + let this = self.handle(); + self.spawn(move |tx| async move { + let client = match LoginChallengeClient::new(&host) { + Ok(c) => c, + Err(err) => { + let _ = tx.send(Event::LoginFailed(login_error(err))); + return; + }, + }; + let challenge = match client.create().await { + Ok(c) => c, + Err(err) => { + let _ = tx.send(Event::LoginFailed(login_error(err))); + return; + }, + }; + let _ = tx.send(Event::DeviceLogin { url: challenge.verification_url.clone(), code: challenge.confirmation_code.clone() }); + if let Err(err) = open::that(&challenge.verification_url) { + warn!("Couldn't open the browser: {err}"); + } + let interval = Duration::from_secs(u64::from(challenge.poll_interval_seconds.max(1))); + loop { + tokio::time::sleep(interval).await; + if cancel.load(Ordering::Relaxed) { + return; + } + if chrono::Utc::now() > challenge.expires_at { + let _ = tx.send(Event::LoginFailed("The sign-in code expired. Please try again.".to_owned())); + return; + } + match client.poll(&challenge.device_token).await { + Ok(result) => { + let signed = result.response.maybe_signed_session.or_else(|| result.session_set_cookie.as_deref().and_then(session_from_set_cookie)); + if let Some(session) = signed { + store_session(&root, &creds, session); + this.refresh_session(); + return; + } + if result.response.status == LoginChallengeState::Failed { + let _ = tx.send(Event::LoginFailed("Sign-in was declined or failed.".to_owned())); + return; + } + }, + Err(err) => warn!("Login poll failed: {}", login_error(err)), + } + } + }); + } + + pub fn cancel_browser_login(&self) { + self.device_login_cancel.store(true, Ordering::Relaxed); + } + + /// Signs out on the server (best effort) and forgets the session here. + pub fn logout(&self) { + let api = self.api(); + let (root, creds) = (self.root.clone(), self.creds.clone()); + if let Ok(mut c) = creds.write() { + *c = None; + } + session::delete(&root); + self.spawn(move |tx| async move { + if let Some(set) = api.creds.as_ref() { + let result: Result = basic_json_post_request(&api.host, "/v1/logout", Some(set), serde_json::json!({})).await; + if let Err(err) = result { + warn!("Logout request failed: {err}"); + } + } + let _ = tx.send(Event::Session(None)); + }); + } + + // --- Models and costs -------------------------------------------------------------------- + + /// Fetches the OmniGen model listing for `modality`. + pub fn load_models(&self, modality: Modality) { + let host = self.host.clone(); + self.spawn(move |tx| async move { + let mut last_err = String::new(); + for attempt in 0..MODEL_LIST_ATTEMPTS { + if attempt > 0 { + tokio::time::sleep(MODEL_LIST_BACKOFF).await; + } + let result = match modality { + Modality::Image => omni_gen_list_image_models(OmniGenListImageModelsArgs { api_host: &host, maybe_creds: None, provider: None }).await.map(|r| r.models.iter().map(models::image_model).collect::>()), + Modality::Video => omni_gen_list_video_models(OmniGenListVideoModelsArgs { api_host: &host, maybe_creds: None, provider: None }).await.map(|r| r.models.iter().map(models::video_model).collect::>()), + }; + match result { + Ok(models) => { + let _ = tx.send(Event::Models(modality, Ok(models))); + return; + }, + Err(err) => last_err = api_message(&err), + } + } + error!("Listing {modality:?} models failed: {last_err}"); + let _ = tx.send(Event::Models(modality, Err(last_err))); + }); + } + + /// Asks what a request would cost (`POST /v1/omni_gen/cost/{modality}`). + pub fn estimate_cost(&self, modality: Modality, key: String, fields: Map) { + let api = self.api(); + self.spawn(move |tx| async move { + let path = format!("/v1/omni_gen/cost/{}", modality.path()); + let credits = match basic_json_post_request::<_, Value>(&api.host, &path, api.creds.as_ref(), fields).await { + Ok(response) => response.get("cost_in_credits").and_then(Value::as_u64), + Err(err) => { + warn!("Cost estimate failed: {}", api_message(&err)); + None + }, + }; + let _ = tx.send(Event::Cost { key, credits }); + }); + } + + /// Starts a generation (`POST /v1/omni_gen/generate/{modality}`). + pub fn generate(&self, modality: Modality, mut fields: Map, meta: EnqueueMeta) { + let api = self.api(); + self.spawn(move |tx| async move { + let Some(creds) = api.creds.as_ref() else { + let _ = tx.send(Event::EnqueueFailed { modality, message: "Please sign in to generate.".to_owned() }); + return; + }; + fields.entry("idempotency_token").or_insert_with(|| Value::String(uuid::Uuid::new_v4().to_string())); + let path = format!("/v1/omni_gen/generate/{}", modality.path()); + match basic_json_post_request::<_, Value>(&api.host, &path, Some(creds), fields).await { + Ok(response) => { + let tokens = job_tokens(&response); + if tokens.is_empty() { + let _ = tx.send(Event::EnqueueFailed { modality, message: "The server didn't start a job.".to_owned() }); + } else { + let _ = tx.send(Event::Enqueued { modality, job_tokens: tokens, meta }); + } + api.send_credits(&tx).await; + }, + Err(err) => { + let _ = tx.send(Event::EnqueueFailed { modality, message: api_message(&err) }); + }, + } + }); + } + + // --- Uploads ----------------------------------------------------------------------------- + + /// Uploads a reference file from disk; images, MP4 videos and audio. + pub fn upload_file(&self, ref_id: u64, kind: crate::prompt_box::refs::RefKind, path: PathBuf) { + use crate::prompt_box::refs::RefKind; + let api = self.api(); + self.spawn(move |tx| async move { + let token = match kind { + RefKind::Image => upload_image_media_file_from_file(UploadImageFromFileArgs { api_host: &api.host, maybe_creds: api.creds.as_ref(), path: &path, is_intermediate_system_file: true, maybe_prompt_token: None, maybe_generation_provider: None, maybe_batch_token: None }).await.map(|r| r.media_file_token.to_string()).map_err(|e| api_message(&e)), + RefKind::Video => upload_video_media_file_from_file(UploadVideoFromFileArgs { api_host: &api.host, maybe_creds: api.creds.as_ref(), path: &path, maybe_prompt_token: None, maybe_generation_provider: None }).await.map(|r| r.media_file_token.to_string()).map_err(|e| api_error_message(&e)), + RefKind::Audio => api.upload_audio(&path).await, + }; + let result = match token { + Ok(token) => Ok(api.describe_upload(token).await), + Err(message) => Err(message), + }; + let _ = tx.send(Event::Uploaded { ref_id, result }); + }); + } + + /// Uploads a pasted image (PNG bytes). + pub fn upload_png(&self, ref_id: u64, png: Vec) { + let api = self.api(); + self.spawn(move |tx| async move { + let result = upload_image_media_file_from_bytes(UploadImageBytesArgs { api_host: &api.host, maybe_creds: api.creds.as_ref(), image_bytes: png, image_type: ImageType::Png, is_intermediate_system_file: true, maybe_generation_provider: None }).await; + let result = match result { + Ok(r) => Ok(api.describe_upload(r.media_file_token.to_string()).await), + Err(err) => Err(api_message(&err)), + }; + let _ = tx.send(Event::Uploaded { ref_id, result }); + }); + } + + // --- Feed -------------------------------------------------------------------------------- + + /// Polls the session's recent jobs (`GET /v1/jobs/session`). + pub fn poll_jobs(&self) { + let api = self.api(); + if api.creds.is_none() { + return; + } + self.spawn(move |tx| async move { + match api.get_json::("/v1/jobs/session").await { + Ok(jobs) => { + let _ = tx.send(Event::Jobs(jobs.jobs)); + }, + Err(err) => warn!("Polling jobs failed: {err}"), + } + }); + } + + /// Loads one page of the user's library, filtered to `classes` (e.g. `image`, `video`). + pub fn load_library(&self, key: String, username: String, classes: &'static str, page: u32) { + let api = self.api(); + self.spawn(move |tx| async move { + let path = format!("/v1/media_files/list/user/{username}?filter_media_classes={classes}&page_size={LIBRARY_PAGE_SIZE}&page_index={page}"); + match api.get_json::(&path).await { + Ok(list) => { + let total_pages = list.pagination.map_or(0, |p| p.total_page_count); + let items = list.results.into_iter().filter(|m| m.media_type != "scene_json" && m.origin_category != "upload").collect(); + let _ = tx.send(Event::LibraryPage { key, page, items, total_pages }); + }, + Err(message) => { + let _ = tx.send(Event::LibraryFailed { key, message }); + }, + } + }); + } + + /// Lists every file a batch job produced. + pub fn load_batch(&self, job_token: String, batch_token: String) { + let api = self.api(); + self.spawn(move |tx| async move { + match api.get_json::(&format!("/v1/media_files/batch_gen_redux/{batch_token}")).await { + Ok(batch) => { + let _ = tx.send(Event::Batch { job_token, items: batch.media_files }); + }, + Err(err) => warn!("Loading batch {batch_token} failed: {err}"), + } + }); + } + + /// Fetches the prompt record behind a generation (for Recreate and the list view). + pub fn load_prompt(&self, prompt_token: String) { + let api = self.api(); + self.spawn(move |tx| async move { + match api.get_json::(&format!("/v1/prompts/{prompt_token}")).await { + Ok(r) if r.success => { + let _ = tx.send(Event::Prompt(r.prompt)); + }, + Ok(_) => warn!("Prompt {prompt_token} not found"), + Err(err) => warn!("Loading prompt {prompt_token} failed: {err}"), + } + }); + } + + pub fn delete_media(&self, token: String) { + let api = self.api(); + self.spawn(move |tx| async move { + match delete_media_file(&api.host, api.creds.as_ref(), &MediaFileToken::new(token.clone())).await { + Ok(_) => { + let _ = tx.send(Event::Deleted(token)); + let _ = tx.send(Event::Toast { error: false, message: "File deleted.".to_owned() }); + }, + Err(err) => { + let _ = tx.send(Event::Toast { error: true, message: format!("Couldn't delete: {}", api_message(&err)) }); + }, + } + }); + } + + /// Downloads `url` to `path`. + pub fn save_url(&self, url: String, path: PathBuf) { + let http = self.http.clone(); + self.spawn(move |tx| async move { + let result = async { + let bytes = http.get(&url).send().await.and_then(|r| r.error_for_status()).map_err(|e| e.to_string())?.bytes().await.map_err(|e| e.to_string())?; + tokio::fs::write(&path, &bytes).await.map_err(|e| e.to_string()) + } + .await; + match result { + Ok(()) => { + let _ = tx.send(Event::Saved(path)); + }, + Err(err) => { + let _ = tx.send(Event::Toast { error: true, message: format!("File download failed: {err}") }); + }, + } + }); + } + + // --- Plumbing ---------------------------------------------------------------------------- + + fn api(&self) -> Api { + let creds = self.creds.read().ok().and_then(|c| c.as_ref().map(Credentials::to_set)); + Api { host: self.host.clone(), creds, http: self.http.clone() } + } + + /// A cheap handle for tasks that need to call back into the backend. + fn handle(&self) -> BackendHandle { + BackendHandle { host: self.host.clone(), creds: self.creds.clone(), http: self.http.clone(), tx: self.tx.clone(), ctx: self.ctx.clone(), rt: self.rt.handle().clone() } + } + + fn spawn(&self, task: F) + where + F: FnOnce(Sender) -> Fut + Send + 'static, + Fut: Future + Send + 'static, + { + let (tx, ctx) = (self.tx.clone(), self.ctx.clone()); + self.rt.spawn(async move { + task(tx).await; + ctx.request_repaint(); + }); + } +} + +/// Enough of the backend to refresh the session from inside a task. +#[derive(Clone)] +struct BackendHandle { + host: ApiHost, + creds: Arc>>, + http: reqwest::Client, + tx: Sender, + ctx: egui::Context, + rt: tokio::runtime::Handle, +} + +impl BackendHandle { + fn refresh_session(&self) { + let creds = self.creds.read().ok().and_then(|c| c.as_ref().map(Credentials::to_set)); + let api = Api { host: self.host.clone(), creds, http: self.http.clone() }; + let (tx, ctx) = (self.tx.clone(), self.ctx.clone()); + self.rt.spawn(async move { + match api.get_json::("/v1/session").await { + Ok(info) if info.logged_in => { + let _ = tx.send(Event::Session(info.user)); + api.send_credits(&tx).await; + }, + Ok(_) => { + let _ = tx.send(Event::LoginFailed("The session wasn't accepted. Please try again.".to_owned())); + }, + Err(err) => { + let _ = tx.send(Event::LoginFailed(err)); + }, + } + ctx.request_repaint(); + }); + } +} + +/// One request's worth of host, credentials and HTTP client. +struct Api { + host: ApiHost, + creds: Option, + http: reqwest::Client, +} + +impl Api { + /// A GET with the desktop app's identity headers and cookies, decoded leniently. + async fn get_json(&self, path: &str) -> Result { + let url = format!("{}{path}", self.host.to_api_hostname_and_scheme()); + let mut request = self.http.get(&url).header("Accept", "application/json").header("Origin", self.host.request_origin()); + if let Some(cookie) = self.creds.as_ref().and_then(StorytellerCredentialSet::maybe_as_cookie_header) { + request = request.header("Cookie", cookie); + } + let response = request.send().await.map_err(|e| e.to_string())?; + let status = response.status(); + let body = response.text().await.map_err(|e| e.to_string())?; + if !status.is_success() { + return Err(body_message(&body).unwrap_or_else(|| format!("HTTP {status}"))); + } + serde_json::from_str(&body).map_err(|e| format!("Unexpected response from {path}: {e}")) + } + + async fn send_credits(&self, tx: &Sender) { + match get_session_credits(&self.host, self.creds.as_ref(), PaymentsNamespace::Artcraft).await { + Ok(c) => { + let _ = tx.send(Event::Credits(c.sum_total_credits)); + }, + Err(err) => warn!("Credits check failed: {}", api_message(&err)), + } + } + + /// `POST /v1/media_files/upload/audio` (no client function for audio yet). + async fn upload_audio(&self, path: &Path) -> Result { + let bytes = tokio::fs::read(path).await.map_err(|e| e.to_string())?; + let name = path.file_name().and_then(|n| n.to_str()).unwrap_or("audio").to_owned(); + let form = reqwest::multipart::Form::new().text("uuid_idempotency_token", uuid::Uuid::new_v4().to_string()).text("maybe_visibility", "public").part("file", reqwest::multipart::Part::bytes(bytes).file_name(name)); + let url = format!("{}/v1/media_files/upload/audio", self.host.to_api_hostname_and_scheme()); + let mut request = self.http.post(url).header("Accept", "application/json").header("Origin", self.host.request_origin()).multipart(form); + if let Some(cookie) = self.creds.as_ref().and_then(StorytellerCredentialSet::maybe_as_cookie_header) { + request = request.header("Cookie", cookie); + } + let response = request.send().await.map_err(|e| e.to_string())?; + let status = response.status(); + let body = response.text().await.map_err(|e| e.to_string())?; + if !status.is_success() { + return Err(body_message(&body).unwrap_or_else(|| format!("HTTP {status}"))); + } + let upload: UploadResponse = serde_json::from_str(&body).map_err(|e| e.to_string())?; + if upload.media_file_token.is_empty() { + return Err("The server didn't return a media token.".to_owned()); + } + Ok(upload.media_file_token) + } + + /// Looks up an uploaded file's duration and links (best effort). + async fn describe_upload(&self, token: String) -> UploadedMedia { + #[derive(serde::Deserialize, Default)] + #[serde(default)] + struct FileResponse { + media_file: MediaFile, + } + let info = self.get_json::(&format!("/v1/media_files/file/{token}")).await.ok(); + let file = info.map(|r| r.media_file); + UploadedMedia { duration_secs: file.as_ref().and_then(|f| f.maybe_duration_millis).map_or(0.0, |ms| ms as f32 / 1000.0), thumbnail: file.as_ref().and_then(|f| f.media_links.thumbnail(256)), full_url: file.as_ref().map(|f| f.media_links.cdn_url.clone()).filter(|u| !u.is_empty()), token } + } +} + +fn store_session(root: &Path, creds: &Arc>>, session: String) { + let visitor = creds.read().ok().and_then(|c| c.as_ref().and_then(|c| c.visitor.clone())); + let new = Credentials { session, visitor }; + session::save(root, &new); + if let Ok(mut c) = creds.write() { + *c = Some(new); + } +} + +/// The `session` value out of a raw `Set-Cookie` header. +fn session_from_set_cookie(header: &str) -> Option { + cookie::Cookie::parse(header).ok().filter(|c| c.name() == "session").map(|c| c.value().to_owned()) +} + +/// All job tokens a generate call created (`inference_job_token` plus `all_job_tokens`). +fn job_tokens(response: &Value) -> Vec { + let mut tokens: Vec = response.get("inference_job_token").and_then(Value::as_str).map(str::to_owned).into_iter().collect(); + for t in response.get("all_job_tokens").and_then(Value::as_array).into_iter().flatten().filter_map(Value::as_str) { + if !tokens.iter().any(|x| x == t) { + tokens.push(t.to_owned()); + } + } + tokens +} + +/// The server's `error_message` (or `message`) from an error body. +fn body_message(body: &str) -> Option { + let v: Value = serde_json::from_str(body).ok()?; + v.get("error_message").or_else(|| v.get("message")).and_then(Value::as_str).map(str::to_owned) +} + +/// A user-facing message for a client error. +pub fn api_message(err: &StorytellerError) -> String { + match err { + StorytellerError::Api(api) => api_error_message(api), + StorytellerError::Client(client) => format!("{client:?}"), + } +} + +fn api_error_message(err: &ApiError) -> String { + let body = match err { + ApiError::InvalidRequest(b) | ApiError::Unauthorized(b) | ApiError::PaymentRequired(b) | ApiError::Forbidden(b) | ApiError::NotFound(b) | ApiError::TooManyRequests(b) => Some(b.as_str()), + ApiError::InternalServerError { body, .. } | ApiError::UncategorizedBadResponseWithStatusAndBody { body, .. } => Some(body.as_str()), + _ => None, + }; + let fallback = match err { + ApiError::Unauthorized(_) | ApiError::Forbidden(_) => "Please sign in to ArtCraft.".to_owned(), + ApiError::PaymentRequired(_) => "You don't have enough credits for this.".to_owned(), + ApiError::TooManyRequests(_) => "Too many requests. Please wait a moment.".to_owned(), + ApiError::NetworkError(_) | ApiError::Timeout(_) => "Couldn't reach ArtCraft. Check your connection.".to_owned(), + other => format!("{other:?}"), + }; + body.and_then(body_message).unwrap_or(fallback) +} + +fn login_error(err: LoginChallengeClientError) -> String { + err.maybe_rejection.and_then(|r| r.error_message).unwrap_or_else(|| err.message.to_owned()) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn collects_every_job_token_once() { + let response = serde_json::json!({ "success": true, "inference_job_token": "j1", "all_job_tokens": ["j1", "j2", "j3"] }); + assert_eq!(job_tokens(&response), ["j1", "j2", "j3"]); + assert_eq!(job_tokens(&serde_json::json!({ "inference_job_token": "only" })), ["only"]); + } + + #[test] + fn reads_the_servers_error_message() { + assert_eq!(body_message(r#"{"success":false,"error_message":"Not enough credits"}"#).as_deref(), Some("Not enough credits")); + assert_eq!(body_message(r#"{"message":"Origin is not allowed"}"#).as_deref(), Some("Origin is not allowed")); + assert_eq!(body_message("502"), None); + assert_eq!(api_error_message(&ApiError::PaymentRequired("{}".into())), "You don't have enough credits for this."); + } + + #[test] + fn takes_the_session_from_set_cookie() { + assert_eq!(session_from_set_cookie("session=abc.def; Path=/; Secure").as_deref(), Some("abc.def")); + assert_eq!(session_from_set_cookie("visitor=x; Path=/"), None); + } +} diff --git a/artcraft-native/src/backend/session.rs b/artcraft-native/src/backend/session.rs new file mode 100644 index 0000000000..ff5d9a182a --- /dev/null +++ b/artcraft-native/src/backend/session.rs @@ -0,0 +1,118 @@ +//! Where the signed-in session lives: our own file under `~/Artcraft/credentials`, seeded on +//! first run from the Tauri app's cookie jar so an existing ArtCraft login carries over. + +use std::fs; +use std::path::{Path, PathBuf}; + +use artcraft_client::credentials::storyteller_avt_cookie::StorytellerAvtCookie; +use artcraft_client::credentials::storyteller_credential_set::StorytellerCredentialSet; +use artcraft_client::credentials::storyteller_session_cookie::StorytellerSessionCookie; +use artcraft_client::utils::api_host::ApiHost; +use log::{info, warn}; +use serde::{Deserialize, Serialize}; + +/// The Tauri app's identifier: its cookie jar lives in `//.cookies`. +const TAURI_APP_IDENTIFIER: &str = "ai.artcraft.app"; +const TAURI_COOKIES_FILENAME: &str = ".cookies"; +const CREDENTIALS_FILENAME: &str = "native_session.json"; + +/// The two ArtCraft cookies, as sent on every request (`Cookie: visitor=…; session=…`). +#[derive(Clone, Default, Serialize, Deserialize)] +pub struct Credentials { + pub session: String, + #[serde(default)] + pub visitor: Option, +} + +impl Credentials { + pub fn to_set(&self) -> StorytellerCredentialSet { + StorytellerCredentialSet::initialize(self.visitor.clone().map(StorytellerAvtCookie::new), Some(StorytellerSessionCookie::new(self.session.clone()))) + } +} + +/// `~/Artcraft`, shared with the Tauri app (`AppDataRoot`). +pub fn data_root() -> PathBuf { + directories::UserDirs::new().map(|d| d.home_dir().to_path_buf()).unwrap_or_else(|| PathBuf::from(".")).join("Artcraft") +} + +/// The API host from `~/Artcraft/settings/env_configs.json` (production unless it says +/// `"storyteller_host": "localhost"`). +pub fn api_host(root: &Path) -> ApiHost { + #[derive(Deserialize)] + struct EnvConfigs { + storyteller_host: Option, + storyteller_port: Option, + } + let path = root.join("settings").join("env_configs.json"); + let configs = fs::read_to_string(&path).ok().and_then(|s| serde_json::from_str::(&s).ok()); + match configs { + Some(EnvConfigs { storyteller_host: Some(host), storyteller_port }) if host == "localhost" => ApiHost::Localhost { port: storyteller_port.unwrap_or(12345) }, + _ => ApiHost::Storyteller, + } +} + +/// The saved session, or the Tauri app's (imported and saved for next time). +pub fn load(root: &Path) -> Option { + let path = credentials_path(root); + if let Ok(text) = fs::read_to_string(&path) { + match serde_json::from_str::(&text) { + Ok(creds) if !creds.session.is_empty() => return Some(creds), + Ok(_) => {}, + Err(err) => warn!("Ignoring unreadable {}: {err}", path.display()), + } + } + let imported = import_tauri_cookies()?; + info!("Imported the ArtCraft login from the desktop app's cookie jar"); + save(root, &imported); + Some(imported) +} + +pub fn save(root: &Path, creds: &Credentials) { + let path = credentials_path(root); + let result = path.parent().map_or(Ok(()), fs::create_dir_all).and_then(|_| fs::write(&path, serde_json::to_vec_pretty(creds).unwrap_or_default())); + if let Err(err) = result { + warn!("Couldn't save the session to {}: {err}", path.display()); + } +} + +pub fn delete(root: &Path) { + let path = credentials_path(root); + if let Err(err) = fs::remove_file(&path) { + if err.kind() != std::io::ErrorKind::NotFound { + warn!("Couldn't delete {}: {err}", path.display()); + } + } +} + +fn credentials_path(root: &Path) -> PathBuf { + root.join("credentials").join(CREDENTIALS_FILENAME) +} + +/// Reads `session` and `visitor` for the ArtCraft API from the Tauri HTTP plugin's jar: a JSON +/// array of `cookie_store` cookies (`{"raw_cookie": "...", "domain": {...}, "expires": {...}}`). +fn import_tauri_cookies() -> Option { + let path = directories::BaseDirs::new()?.cache_dir().join(TAURI_APP_IDENTIFIER).join(TAURI_COOKIES_FILENAME); + let text = fs::read_to_string(&path).ok()?; + let cookies: Vec = serde_json::from_str(&text).ok()?; + let now = chrono::Utc::now(); + let mut creds = Credentials::default(); + for entry in &cookies { + let for_api = entry.get("domain").map(|d| d.to_string()).is_some_and(|d| d.contains("storyteller.ai")); + let expired = entry.pointer("/expires/AtUtc").and_then(|v| v.as_str()).and_then(|s| chrono::DateTime::parse_from_rfc3339(s).ok()).is_some_and(|t| t < now); + let Some(raw) = entry.get("raw_cookie").and_then(|v| v.as_str()) else { + continue; + }; + if !for_api || expired { + continue; + } + let Ok(cookie) = cookie::Cookie::parse(raw) else { + continue; + }; + match cookie.name() { + "session" => creds.session = cookie.value().to_owned(), + "visitor" => creds.visitor = Some(cookie.value().to_owned()), + _ => {}, + } + } + (!creds.session.is_empty()).then_some(creds) +} diff --git a/artcraft-native/src/backend/wire.rs b/artcraft-native/src/backend/wire.rs new file mode 100644 index 0000000000..d02490cf52 --- /dev/null +++ b/artcraft-native/src/backend/wire.rs @@ -0,0 +1,249 @@ +//! Lenient shapes for the API responses the app reads itself. Enums stay strings and every field +//! has a default, so a new server-side value can't break decoding (the typed client structs use +//! closed enums). + +use serde::Deserialize; + +#[derive(Clone, Debug, Default, Deserialize)] +#[serde(default)] +pub struct MediaLinks { + pub cdn_url: String, + pub maybe_thumbnail_template: Option, + pub maybe_video_previews: Option, +} + +#[derive(Clone, Debug, Default, Deserialize)] +#[serde(default)] +pub struct VideoPreviews { + pub still: String, + pub animated: String, + pub still_thumbnail_template: String, + pub animated_thumbnail_template: String, +} + +impl MediaLinks { + /// A still thumbnail `width` pixels wide: the video still frame, the resized image, or the + /// original (`thumbnail-utils.ts`). + pub fn thumbnail(&self, width: u32) -> Option { + let w = width.to_string(); + if let Some(previews) = &self.maybe_video_previews { + if !previews.still_thumbnail_template.is_empty() { + return Some(previews.still_thumbnail_template.replace("{WIDTH}", &w)); + } + if !previews.still.is_empty() { + return Some(previews.still.clone()); + } + } + match &self.maybe_thumbnail_template { + Some(template) if !template.is_empty() => Some(template.replace("{WIDTH}", &w)), + _ if !self.cdn_url.is_empty() && self.maybe_video_previews.is_none() => Some(self.cdn_url.clone()), + _ => None, + } + } +} + +/// `GET /v1/media_files/list/user/{username}`. +#[derive(Debug, Default, Deserialize)] +#[serde(default)] +pub struct UserMediaList { + pub success: bool, + pub results: Vec, + pub pagination: Option, +} + +#[derive(Debug, Default, Deserialize)] +#[serde(default)] +pub struct Pagination { + pub current: u32, + pub total_page_count: u32, +} + +#[derive(Clone, Debug, Default, Deserialize)] +#[serde(default)] +pub struct MediaFile { + pub token: String, + pub media_class: Option, + pub media_type: String, + pub origin_category: String, + pub maybe_batch_token: Option, + pub maybe_prompt_token: Option, + pub maybe_model_type: Option, + pub maybe_origin_model_type: Option, + pub maybe_duration_millis: Option, + pub media_links: MediaLinks, + pub created_at: String, +} + +/// `GET /v1/media_files/batch_gen_redux/{token}`. +#[derive(Debug, Default, Deserialize)] +#[serde(default)] +pub struct BatchMedia { + pub success: bool, + pub media_files: Vec, +} + +/// `GET /v1/jobs/session`. +#[derive(Debug, Default, Deserialize)] +#[serde(default)] +pub struct SessionJobs { + pub success: bool, + pub jobs: Vec, +} + +#[derive(Clone, Debug, Default, Deserialize)] +#[serde(default)] +pub struct Job { + pub job_token: String, + pub request: JobRequest, + pub status: JobStatus, + pub maybe_result: Option, + pub created_at: String, + pub updated_at: String, +} + +#[derive(Clone, Debug, Default, Deserialize)] +#[serde(default)] +pub struct JobRequest { + pub inference_category: String, + pub maybe_prompt_token: Option, + pub maybe_model_type: Option, + pub maybe_raw_inference_text: Option, +} + +#[derive(Clone, Debug, Default, Deserialize)] +#[serde(default)] +pub struct JobStatus { + pub status: String, + pub maybe_extra_status_description: Option, + pub maybe_failure_category_updated: Option, + pub maybe_failure_message: Option, + pub progress_percentage: u8, +} + +#[derive(Clone, Debug, Default, Deserialize)] +#[serde(default)] +pub struct JobResult { + pub entity_token: String, + pub maybe_batch_token: Option, + pub media_links: MediaLinks, +} + +/// Where a job is in its life. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum JobPhase { + Running, + Succeeded, + Failed, +} + +impl JobStatus { + pub fn phase(&self) -> JobPhase { + match self.status.as_str() { + "pending" | "started" => JobPhase::Running, + "complete_success" => JobPhase::Succeeded, + _ => JobPhase::Failed, + } + } + + /// The user-facing failure reason (`FAILURE_REASON_LABEL`). + pub fn failure_reason(&self) -> String { + let label = match self.maybe_failure_category_updated.as_deref().unwrap_or("") { + "rule_bans_user_image" => "Image violates content policy", + "rule_bans_user_image_with_faces" => "Images with faces are not allowed", + "rule_bans_user_text_prompt" => "Text prompt violates content policy", + "rule_bans_user_content" => "Content violates content policy", + "rule_bans_generated_video" => "Generated video flagged by content policy", + "rule_bans_generated_audio" => "Generated audio flagged by content policy", + "rule_bans_generated_content" => "Generated content flagged by content policy", + "unknown" => "An unknown error occurred", + _ if self.status.starts_with("cancelled") => "Cancelled", + _ => "Generation failed", + }; + label.to_owned() + } +} + +/// `GET /v1/prompts/{token}`. +#[derive(Debug, Default, Deserialize)] +#[serde(default)] +pub struct PromptResponse { + pub success: bool, + pub prompt: Prompt, +} + +#[derive(Clone, Debug, Default, Deserialize)] +#[serde(default)] +pub struct Prompt { + pub token: String, + pub maybe_positive_prompt: Option, + pub maybe_negative_prompt: Option, + pub maybe_model_type: Option, + pub maybe_aspect_ratio: Option, + pub maybe_resolution: Option, + pub maybe_duration_seconds: Option, + pub maybe_generate_audio: Option, + pub maybe_batch_count: Option, + pub maybe_context_images: Option>, +} + +#[derive(Clone, Debug, Default, Deserialize)] +#[serde(default)] +pub struct ContextImage { + pub media_token: String, + pub semantic: String, + pub media_links: MediaLinks, +} + +/// `GET /v1/session` (only the parts the app shows). +#[derive(Debug, Default, Deserialize)] +#[serde(default)] +pub struct SessionInfo { + pub success: bool, + pub logged_in: bool, + pub user: Option, +} + +#[derive(Clone, Debug, Default, Deserialize)] +#[serde(default)] +pub struct SessionUser { + pub username: String, + pub display_name: String, + pub email_gravatar_hash: String, +} + +/// The generic `{success, media_file_token}` upload reply. +#[derive(Debug, Default, Deserialize)] +#[serde(default)] +pub struct UploadResponse { + pub success: bool, + pub media_file_token: String, +} + +/// Parses an RFC 3339 timestamp into unix seconds (0 when absent or malformed). +pub fn unix_secs(timestamp: &str) -> i64 { + chrono::DateTime::parse_from_rfc3339(timestamp).map(|t| t.timestamp()).unwrap_or(0) +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn thumbnails_prefer_the_video_still_then_the_resized_image() { + let video: MediaLinks = serde_json::from_value(serde_json::json!({ + "cdn_url": "https://cdn/v.mp4", + "maybe_video_previews": { "still": "https://cdn/s.jpg", "animated": "https://cdn/a.webp", "still_thumbnail_template": "https://cdn/w={WIDTH}/s.jpg", "animated_thumbnail_template": "" } + })) + .unwrap(); + assert_eq!(video.thumbnail(512).as_deref(), Some("https://cdn/w=512/s.jpg")); + let image: MediaLinks = serde_json::from_value(serde_json::json!({ "cdn_url": "https://cdn/i.png", "maybe_thumbnail_template": null })).unwrap(); + assert_eq!(image.thumbnail(512).as_deref(), Some("https://cdn/i.png")); + } + + #[test] + fn unknown_statuses_and_fields_still_decode() { + let job: Job = serde_json::from_value(serde_json::json!({ "job_token": "j", "status": { "status": "something_new" }, "brand_new_field": 1 })).unwrap(); + assert_eq!(job.status.phase(), JobPhase::Failed); + assert_eq!(job.status.failure_reason(), "Generation failed"); + } +} diff --git a/artcraft-native/src/feed/grid.rs b/artcraft-native/src/feed/grid.rs new file mode 100644 index 0000000000..2cbf2bf59d --- /dev/null +++ b/artcraft-native/src/feed/grid.rs @@ -0,0 +1,531 @@ +//! The generation feed as a masonry grid (`GenerationGridView`) or a list (`GenerationListView`): +//! running jobs first-class alongside failures and finished media, newest first, loading more as +//! the user scrolls. + +use std::collections::{HashMap, HashSet}; + +use egui::{Align2, Color32, CornerRadius, FontFamily, FontId, Id, Mesh, Rect, Sense, Stroke, Ui, pos2, vec2}; + +use crate::backend::media_cache::{Lookup, MediaCache}; +use crate::feed::types::{FailedJob, FeedItem, MediaKind, PendingJob, pending_status, time_ago}; +use crate::theme; +use crate::ui::icons::{self, Icon}; +use crate::ui::{creator_icons, widgets}; + +/// `react-masonry-css` gutter and the cap on tall portraits (≈ 5:7). +const GAP: f32 = 8.0; +const MAX_RATIO: f32 = 1.4; +/// Start loading the next page this far before the end. +const LOAD_MORE_MARGIN: f32 = 400.0; +const LIST_THUMB: f32 = 100.0; + +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +pub enum ViewMode { + #[default] + Grid, + List, +} + +/// Something the user did in the feed. +#[derive(Clone, Debug, PartialEq)] +pub enum FeedAction { + Open(String), + Recreate(String), + MakeVideo(String), + Share(String), + Download(String), + CopyPrompt(String), + DismissFailed(String), + ToggleSelect(String), + LoadMore, +} + +/// Looks up a model's display name and maker for the cards' model chip. +pub trait ModelNames { + fn display_name(&self, model_id: &str) -> String; + fn creator(&self, model_id: &str) -> String; +} + +pub struct FeedView<'a> { + pub id: Id, + pub mode: ViewMode, + pub pending: &'a [PendingJob], + pub failed: &'a [FailedJob], + pub items: &'a [FeedItem], + pub has_more: bool, + pub loading: bool, + /// Items that are new this session (shown even before the library catches up). + pub selecting: bool, + pub selected: &'a HashSet, + pub last_viewed: Option<&'a str>, + /// Prompt texts by prompt token (list view and pending cards). + pub prompts: &'a HashMap, + pub make_video: bool, + pub bottom_padding: f32, +} + +enum Entry<'a> { + Pending(&'a PendingJob), + Failed(&'a FailedJob), + Item(&'a FeedItem), +} + +impl Entry<'_> { + fn time(&self) -> i64 { + match self { + Entry::Pending(j) => j.created_at, + Entry::Failed(j) => j.updated_at, + Entry::Item(i) => i.created_at, + } + } +} + +/// Measured height/width ratios of loaded thumbnails, so cards keep their shape. +#[derive(Clone, Default)] +pub struct RatioCache(HashMap); + +pub fn show(ui: &mut Ui, view: &FeedView<'_>, cache: &mut MediaCache, ratios: &mut RatioCache, names: &dyn ModelNames) -> Vec { + let mut entries: Vec> = view.pending.iter().map(Entry::Pending).chain(view.failed.iter().map(Entry::Failed)).chain(view.items.iter().map(Entry::Item)).collect(); + entries.sort_by_key(|e| std::cmp::Reverse(e.time())); + let mut actions = Vec::new(); + let now = chrono::Utc::now().timestamp(); + if view.pending.iter().any(|_| true) { + ui.ctx().request_repaint_after(std::time::Duration::from_secs(1)); + } + + egui::ScrollArea::vertical().id_salt(view.id.with("scroll")).auto_shrink([false, false]).show_viewport(ui, |ui, viewport| { + let width = ui.available_width(); + let origin = ui.min_rect().min; + let layout = match view.mode { + ViewMode::Grid => masonry(&entries, width, ratios), + ViewMode::List => list_layout(&entries, width), + }; + let total = layout.iter().map(|r| r.bottom()).fold(0.0_f32, f32::max); + ui.allocate_exact_size(vec2(width, total + view.bottom_padding + if view.has_more { 64.0 } else { 0.0 }), Sense::hover()); + + for (entry, local) in entries.iter().zip(&layout) { + if !local.intersects(viewport.expand(200.0)) { + continue; + } + let rect = local.translate(origin.to_vec2()); + match (entry, view.mode) { + (Entry::Pending(job), ViewMode::Grid) => pending_card(ui, rect, job, now, names), + (Entry::Failed(job), ViewMode::Grid) => failed_card(ui, view.id, rect, job, cache, names, &mut actions), + (Entry::Item(item), ViewMode::Grid) => item_card(ui, view, rect, item, cache, ratios, names, &mut actions), + (Entry::Pending(job), ViewMode::List) => pending_row(ui, rect, job, now, names), + (Entry::Failed(job), ViewMode::List) => failed_row(ui, view.id, rect, job, names, &mut actions), + (Entry::Item(item), ViewMode::List) => item_row(ui, view, rect, item, cache, names, now, &mut actions), + } + } + + if view.has_more { + let spinner = Rect::from_center_size(origin + vec2(width / 2.0, total + 32.0), vec2(24.0, 24.0)); + if view.loading { + icons::paint_spinner(ui, spinner, theme::MUTED); + } + if !view.loading && viewport.max.y + LOAD_MORE_MARGIN >= total { + actions.push(FeedAction::LoadMore); + } + } + }); + actions +} + +/// Number of columns for a width (`BREAKPOINT_COLS = {default: 4, 900: 3, 640: 2}`). +fn columns(width: f32) -> usize { + if width <= 640.0 { + 2 + } else if width <= 900.0 { + 3 + } else { + 4 + } +} + +/// Places each entry in the shortest column, like `react-masonry-css`. +fn masonry(entries: &[Entry<'_>], width: f32, ratios: &RatioCache) -> Vec { + let cols = columns(width); + let col_w = (width - GAP * (cols - 1) as f32) / cols as f32; + let mut heights = vec![0.0_f32; cols]; + entries + .iter() + .map(|entry| { + let ratio = match entry { + Entry::Item(item) => ratios.0.get(&item.token).copied().unwrap_or(1.0).min(MAX_RATIO), + _ => 1.0, + }; + let (col, y) = heights.iter().copied().enumerate().min_by(|a, b| a.1.total_cmp(&b.1)).unwrap_or((0, 0.0)); + let rect = Rect::from_min_size(pos2(col as f32 * (col_w + GAP), y), vec2(col_w, col_w * ratio)); + heights[col] = rect.bottom() + GAP; + rect + }) + .collect() +} + +/// One row per entry, centred at `max-w-5xl`. +fn list_layout(entries: &[Entry<'_>], width: f32) -> Vec { + let w = width.min(1024.0); + let x = (width - w) / 2.0; + let row_h = LIST_THUMB + 24.0; + (0..entries.len()).map(|i| Rect::from_min_size(pos2(x, i as f32 * row_h), vec2(w, row_h))).collect() +} + +fn pending_card(ui: &mut Ui, rect: Rect, job: &PendingJob, now: i64, names: &dyn ModelNames) { + let p = ui.painter(); + p.rect_filled(rect, theme::RADIUS, Color32::from_white_alpha(8)); + shimmer(ui, rect); + let (progress, time_label) = pending_status(job, now); + if job.batch_count > 1 { + let banner = Rect::from_min_max(rect.min + vec2(8.0, 8.0), pos2(rect.right() - 8.0, rect.top() + 34.0)); + p.rect_filled(banner, 0.0, Color32::from_black_alpha(153)); + p.text(banner.center(), Align2::CENTER_CENTER, format!("Generating {} {} \u{b7} Results may appear one at a time", job.batch_count, job.kind.plural()), FontId::new(10.0, FontFamily::Proportional), theme::fade(Color32::WHITE, 0.7)); + } + let c = rect.center() - vec2(0.0, 18.0); + icons::paint_spinner(ui, Rect::from_center_size(c, vec2(26.0, 26.0)), theme::fade(Color32::WHITE, 0.2)); + let p = ui.painter(); + p.text(c + vec2(0.0, 26.0), Align2::CENTER_CENTER, format!("{progress}%"), FontId::new(12.0, FontFamily::Monospace), theme::fade(Color32::WHITE, 0.4)); + p.text(c + vec2(0.0, 42.0), Align2::CENTER_CENTER, time_label, FontId::new(10.0, FontFamily::Proportional), theme::fade(Color32::WHITE, 0.3)); + let footer = bottom_gradient(ui, rect, 96.0, 178); + let text_rect = footer.shrink2(vec2(12.0, 10.0)); + let galley = clamp_lines(ui, &job.prompt, 12.0, theme::fade(Color32::WHITE, 0.8), text_rect.width(), 3); + let y = text_rect.bottom() - 24.0 - galley.size().y; + ui.painter().galley(pos2(text_rect.left(), y), galley, Color32::WHITE); + let model_id = job.model_id.as_deref().unwrap_or_default(); + model_chip(ui, pos2(text_rect.left(), text_rect.bottom() - 15.0), model_id, names, 10.0, theme::fade(Color32::WHITE, 0.5)); + widgets::progress_bar(ui.painter(), Rect::from_min_size(pos2(text_rect.left(), text_rect.bottom() - 2.0), vec2(text_rect.width(), 4.0)), progress as f32 / 100.0); +} + +fn failed_card(ui: &mut Ui, id: Id, rect: Rect, job: &FailedJob, cache: &mut MediaCache, names: &dyn ModelNames, actions: &mut Vec) { + ui.painter().rect_filled(rect, theme::RADIUS, Color32::from_rgba_unmultiplied(239, 68, 68, 26)); + if let Some(Lookup::Ready(t)) = job.ref_image.as_deref().map(|u| cache.get(ui.ctx(), u)) { + egui::Image::new(&t).uv(crate::prompt_box::deck::cover_uv(t.size_vec2())).tint(theme::fade(Color32::WHITE, 0.1)).paint_at(ui, rect); + } + let c = rect.center() - vec2(0.0, 20.0); + let p = ui.painter(); + icons::paint(p, Rect::from_center_size(c - vec2(0.0, 18.0), vec2(24.0, 24.0)), Icon::AlertCircle, theme::BAD); + p.text(c + vec2(0.0, 6.0), Align2::CENTER_CENTER, &job.reason, FontId::new(12.0, theme::medium()), theme::BAD); + if let Some(msg) = job.message.as_deref().filter(|m| *m != job.reason) { + let galley = clamp_lines(ui, msg, 10.0, theme::fade(theme::BAD, 0.6), rect.width() - 32.0, 3); + ui.painter().galley(pos2(rect.center().x - galley.size().x / 2.0, c.y + 16.0), galley, Color32::WHITE); + } + let button = Rect::from_center_size(c + vec2(0.0, 62.0), vec2(84.0, 28.0)); + let resp = ui.interact(button, id.with(("dismiss", &job.job_token)), Sense::click()).on_hover_cursor(egui::CursorIcon::PointingHand); + let p = ui.painter(); + p.rect_filled(button, theme::RADIUS, if resp.hovered() { theme::WASH_HOVER } else { theme::WASH }); + let ink = if resp.hovered() { theme::fade(Color32::WHITE, 0.7) } else { theme::fade(Color32::WHITE, 0.5) }; + icons::paint(p, Rect::from_center_size(button.left_center() + vec2(18.0, 0.0), vec2(12.0, 12.0)), Icon::X, ink); + p.text(button.left_center() + vec2(30.0, 0.0), Align2::LEFT_CENTER, "Dismiss", FontId::new(12.0, FontFamily::Proportional), ink); + if resp.clicked() { + actions.push(FeedAction::DismissFailed(job.job_token.clone())); + } + let footer = bottom_gradient(ui, rect, 56.0, 153); + let text = footer.shrink2(vec2(12.0, 10.0)); + let galley = clamp_lines(ui, &job.prompt, 12.0, theme::fade(Color32::WHITE, 0.7), text.width(), 1); + ui.painter().galley(pos2(text.left(), text.bottom() - 30.0), galley, Color32::WHITE); + model_chip(ui, pos2(text.left(), text.bottom() - 12.0), job.model_id.as_deref().unwrap_or_default(), names, 10.0, theme::fade(Color32::WHITE, 0.4)); +} + +#[allow(clippy::too_many_arguments)] +fn item_card(ui: &mut Ui, view: &FeedView<'_>, rect: Rect, item: &FeedItem, cache: &mut MediaCache, ratios: &mut RatioCache, names: &dyn ModelNames, actions: &mut Vec) { + let resp = ui.interact(rect, view.id.with(("item", &item.token)), Sense::click()).on_hover_cursor(egui::CursorIcon::PointingHand); + let hovered = resp.hovered(); + ui.painter().rect_filled(rect, theme::RADIUS, theme::fade(theme::CONTROLS, 0.4)); + match item.thumbnail.as_deref().map(|u| cache.get(ui.ctx(), u)) { + Some(Lookup::Ready(t)) => { + let size = t.size_vec2(); + if size.x > 0.0 && !ratios.0.contains_key(&item.token) { + ratios.0.insert(item.token.clone(), size.y / size.x); + } + egui::Image::new(&t).uv(cover_uv_for(size, rect.size())).corner_radius(theme::RADIUS).paint_at(ui, rect); + }, + Some(Lookup::Loading) => shimmer(ui, rect), + _ => icons::paint(ui.painter(), Rect::from_center_size(rect.center(), vec2(28.0, 28.0)), if item.kind == MediaKind::Video { Icon::Video } else { Icon::Image }, theme::FAINT), + } + if item.kind == MediaKind::Video { + let badge = Rect::from_center_size(rect.center(), vec2(40.0, 40.0)); + ui.painter().circle_filled(badge.center(), 20.0, Color32::from_black_alpha(110)); + icons::paint(ui.painter(), badge.shrink(12.0).translate(vec2(1.5, 0.0)), Icon::Play, theme::fade(Color32::WHITE, 0.9)); + } + let selected = view.selected.contains(&item.token); + let ring = if selected { + Some(Stroke::new(2.0, theme::ACCENT_400)) + } else if hovered { + Some(Stroke::new(2.0, theme::fade(theme::ACCENT_400, 0.6))) + } else if view.last_viewed == Some(item.token.as_str()) { + Some(Stroke::new(2.0, theme::fade(theme::ACCENT_400, 0.5))) + } else { + None + }; + if let Some(stroke) = ring { + ui.painter().rect_stroke(rect, theme::RADIUS, stroke, egui::StrokeKind::Inside); + } + if view.selecting { + let chip = Rect::from_min_size(rect.min + vec2(8.0, 8.0), vec2(20.0, 20.0)); + let (fill, border) = if selected { (theme::ACCENT_400, theme::ACCENT_400) } else { (Color32::from_black_alpha(102), theme::fade(Color32::WHITE, 0.6)) }; + ui.painter().rect(chip, theme::RADIUS, fill, Stroke::new(1.0, border), egui::StrokeKind::Inside); + if selected { + icons::paint(ui.painter(), chip.shrink(4.0), Icon::Check, Color32::WHITE); + } + } + if view.last_viewed == Some(item.token.as_str()) { + let galley = widgets::caps(ui, "Last viewed", 10.0, theme::medium(), 0.5, theme::fade(Color32::WHITE, 0.8)); + let badge = Rect::from_min_size(pos2(rect.right() - 8.0 - galley.size().x - 26.0, rect.top() + 8.0), vec2(galley.size().x + 26.0, 18.0)); + let p = ui.painter(); + p.rect_filled(badge, theme::RADIUS, Color32::from_black_alpha(178)); + icons::paint(p, Rect::from_center_size(badge.left_center() + vec2(11.0, 0.0), vec2(11.0, 11.0)), Icon::Eye, theme::fade(Color32::WHITE, 0.8)); + p.galley(pos2(badge.left() + 20.0, badge.center().y - galley.size().y / 2.0), galley, Color32::WHITE); + } + let mut action_clicked = false; + // The pointer may be on an action button rather than the card itself. + if (hovered || ui.rect_contains_pointer(rect)) && !view.selecting { + let footer = bottom_gradient(ui, rect, 56.0, 178); + let chip_y = footer.bottom() - 18.0; + let mut x = footer.left() + 8.0; + x = chip(ui, pos2(x, chip_y), Some(if item.kind == MediaKind::Video { Icon::Video } else { Icon::Image }), None, item.kind.label()); + if let Some(model) = item.model_id.as_deref() { + chip(ui, pos2(x + 6.0, chip_y), None, Some(&names.creator(model)), &truncate(&names.display_name(model), 16)); + } + let mut buttons: Vec<(Icon, &str, FeedAction)> = Vec::new(); + if item.prompt_token.is_some() { + buttons.push((Icon::RotateCw, "Recreate", FeedAction::Recreate(item.token.clone()))); + } + if view.make_video && item.kind == MediaKind::Image { + buttons.push((Icon::Video, "Make Video", FeedAction::MakeVideo(item.token.clone()))); + } + buttons.push((Icon::Link, "Share", FeedAction::Share(item.token.clone()))); + buttons.push((Icon::Download, "Download", FeedAction::Download(item.token.clone()))); + let pill = Rect::from_min_size(pos2(footer.right() - 8.0 - 8.0 - 28.0 * buttons.len() as f32, chip_y - 18.0), vec2(8.0 + 28.0 * buttons.len() as f32, 36.0)); + ui.painter().rect_filled(pill, 0.0, Color32::from_black_alpha(153)); + let mut child = ui.new_child(egui::UiBuilder::new().max_rect(pill.shrink(4.0)).layout(egui::Layout::left_to_right(egui::Align::Center))); + child.spacing_mut().item_spacing.x = 0.0; + for (icon, tip, action) in buttons { + if widgets::overlay_icon(&mut child, icon, tip).clicked() { + actions.push(action); + action_clicked = true; + } + } + } + if resp.clicked() && !action_clicked { + actions.push(if view.selecting { FeedAction::ToggleSelect(item.token.clone()) } else { FeedAction::Open(item.token.clone()) }); + } +} + +fn pending_row(ui: &mut Ui, rect: Rect, job: &PendingJob, now: i64, names: &dyn ModelNames) { + let thumb = Rect::from_min_size(rect.min + vec2(0.0, 12.0), vec2(LIST_THUMB, LIST_THUMB)); + ui.painter().rect_filled(thumb, theme::RADIUS, Color32::from_white_alpha(8)); + shimmer(ui, thumb); + icons::paint_spinner(ui, Rect::from_center_size(thumb.center(), vec2(22.0, 22.0)), theme::fade(Color32::WHITE, 0.25)); + let (progress, label) = pending_status(job, now); + let x = thumb.right() + 16.0; + let w = rect.right() - x; + let prompt = if job.prompt.is_empty() { "Generating\u{2026}" } else { job.prompt.as_str() }; + let galley = clamp_lines(ui, prompt, 14.0, theme::INK, w, 2); + let gh = galley.size().y; + ui.painter().galley(pos2(x, thumb.top()), galley, theme::INK); + let meta_y = thumb.top() + gh + 14.0; + let mx = model_chip(ui, pos2(x, meta_y), job.model_id.as_deref().unwrap_or_default(), names, 12.0, theme::MUTED); + if job.batch_count > 1 { + ui.painter().text(pos2(mx + 8.0, meta_y), Align2::LEFT_CENTER, format!("\u{b7} {} {}", job.batch_count, job.kind.plural()), FontId::new(12.0, FontFamily::Proportional), theme::MUTED); + } + let bar = Rect::from_min_size(pos2(x, meta_y + 16.0), vec2(w.min(320.0), 4.0)); + widgets::progress_bar(ui.painter(), bar, progress as f32 / 100.0); + ui.painter().text(pos2(bar.right() + 10.0, bar.center().y), Align2::LEFT_CENTER, format!("{progress}% \u{b7} {label}"), FontId::new(11.0, FontFamily::Monospace), theme::FAINT); + row_divider(ui, rect); +} + +fn failed_row(ui: &mut Ui, id: Id, rect: Rect, job: &FailedJob, names: &dyn ModelNames, actions: &mut Vec) { + let thumb = Rect::from_min_size(rect.min + vec2(0.0, 12.0), vec2(LIST_THUMB, LIST_THUMB)); + ui.painter().rect_filled(thumb, theme::RADIUS, Color32::from_rgba_unmultiplied(239, 68, 68, 26)); + icons::paint(ui.painter(), Rect::from_center_size(thumb.center(), vec2(24.0, 24.0)), Icon::AlertCircle, theme::BAD); + let x = thumb.right() + 16.0; + let w = rect.right() - x - 100.0; + let galley = clamp_lines(ui, &job.prompt, 14.0, theme::INK, w, 2); + let gh = galley.size().y; + ui.painter().galley(pos2(x, thumb.top()), galley, theme::INK); + ui.painter().text(pos2(x, thumb.top() + gh + 14.0), Align2::LEFT_CENTER, &job.reason, FontId::new(12.0, theme::medium()), theme::BAD); + if let Some(msg) = job.message.as_deref().filter(|m| *m != job.reason) { + let g = clamp_lines(ui, msg, 11.0, theme::fade(theme::BAD, 0.6), w, 2); + ui.painter().galley(pos2(x, thumb.top() + gh + 24.0), g, Color32::WHITE); + } + model_chip(ui, pos2(x, thumb.bottom() - 8.0), job.model_id.as_deref().unwrap_or_default(), names, 12.0, theme::FAINT); + let button = Rect::from_min_size(pos2(rect.right() - 92.0, thumb.top()), vec2(92.0, 28.0)); + let resp = ui.interact(button, id.with(("dismiss-row", &job.job_token)), Sense::click()).on_hover_cursor(egui::CursorIcon::PointingHand); + ui.painter().rect_filled(button, theme::RADIUS, if resp.hovered() { theme::WASH_HOVER } else { theme::WASH }); + ui.painter().text(button.center(), Align2::CENTER_CENTER, "Dismiss", FontId::new(12.0, FontFamily::Proportional), theme::MUTED); + if resp.clicked() { + actions.push(FeedAction::DismissFailed(job.job_token.clone())); + } + row_divider(ui, rect); +} + +#[allow(clippy::too_many_arguments)] +fn item_row(ui: &mut Ui, view: &FeedView<'_>, rect: Rect, item: &FeedItem, cache: &mut MediaCache, names: &dyn ModelNames, now: i64, actions: &mut Vec) { + let resp = ui.interact(rect, view.id.with(("row", &item.token)), Sense::click()); + let hovered = resp.hovered(); + if hovered { + ui.painter().rect_filled(rect.expand2(vec2(8.0, 0.0)), 0.0, Color32::from_white_alpha(6)); + } + let thumb = Rect::from_min_size(rect.min + vec2(0.0, 12.0), vec2(LIST_THUMB, LIST_THUMB)); + ui.painter().rect_filled(thumb, theme::RADIUS, theme::fade(theme::CONTROLS, 0.4)); + if let Some(Lookup::Ready(t)) = item.thumbnail.as_deref().map(|u| cache.get(ui.ctx(), u)) { + egui::Image::new(&t).uv(crate::prompt_box::deck::cover_uv(t.size_vec2())).corner_radius(theme::RADIUS).paint_at(ui, thumb); + } + if view.selected.contains(&item.token) { + ui.painter().rect_stroke(thumb, theme::RADIUS, Stroke::new(2.0, theme::ACCENT_400), egui::StrokeKind::Inside); + } + let x = thumb.right() + 16.0; + let w = rect.right() - x - 140.0; + let prompt = item.prompt_token.as_deref().and_then(|t| view.prompts.get(t)); + match prompt { + Some(text) => { + let g = clamp_lines(ui, text, 14.0, theme::INK, w, 3); + ui.painter().galley(pos2(x, thumb.top()), g, theme::INK); + }, + None if item.prompt_token.is_some() => { + for (i, frac) in [1.0, 0.7].iter().enumerate() { + ui.painter().rect_filled(Rect::from_min_size(pos2(x, thumb.top() + 4.0 + i as f32 * 20.0), vec2(w * frac, 12.0)), CornerRadius::same(2), theme::WASH); + } + }, + None => { + ui.painter().text(pos2(x, thumb.top() + 8.0), Align2::LEFT_CENTER, format!("{} Generation", item.kind.label()), FontId::new(14.0, FontFamily::Proportional), theme::MUTED); + }, + } + let meta_y = thumb.bottom() - 10.0; + let mut mx = x; + if let Some(model) = item.model_id.as_deref() { + mx = model_chip(ui, pos2(x, meta_y), model, names, 12.0, theme::MUTED); + ui.painter().text(pos2(mx + 6.0, meta_y), Align2::LEFT_CENTER, format!("\u{b7} {}", item.kind.label()), FontId::new(12.0, FontFamily::Proportional), theme::MUTED); + } + let _ = mx; + ui.painter().text(pos2(rect.right(), thumb.top() + 8.0), Align2::RIGHT_CENTER, time_ago(item.created_at, now), FontId::new(11.0, FontFamily::Proportional), theme::FAINT); + let mut action_clicked = false; + if hovered && !view.selecting { + let mut buttons: Vec<(Icon, &str, FeedAction)> = Vec::new(); + if let Some(text) = prompt { + buttons.push((Icon::Copy, "Copy prompt", FeedAction::CopyPrompt(text.clone()))); + } + if item.prompt_token.is_some() { + buttons.push((Icon::RotateCw, "Recreate", FeedAction::Recreate(item.token.clone()))); + } + if view.make_video && item.kind == MediaKind::Image { + buttons.push((Icon::Video, "Make Video", FeedAction::MakeVideo(item.token.clone()))); + } + buttons.push((Icon::Link, "Share", FeedAction::Share(item.token.clone()))); + buttons.push((Icon::Download, "Download", FeedAction::Download(item.token.clone()))); + let bar = Rect::from_min_size(pos2(rect.right() - 28.0 * buttons.len() as f32, thumb.bottom() - 28.0), vec2(28.0 * buttons.len() as f32, 28.0)); + let mut child = ui.new_child(egui::UiBuilder::new().max_rect(bar).layout(egui::Layout::left_to_right(egui::Align::Center))); + child.spacing_mut().item_spacing.x = 0.0; + for (icon, tip, action) in buttons { + if widgets::overlay_icon(&mut child, icon, tip).clicked() { + actions.push(action); + action_clicked = true; + } + } + } + if resp.on_hover_cursor(egui::CursorIcon::PointingHand).clicked() && !action_clicked { + actions.push(if view.selecting { FeedAction::ToggleSelect(item.token.clone()) } else { FeedAction::Open(item.token.clone()) }); + } + row_divider(ui, rect); +} + +fn row_divider(ui: &Ui, rect: Rect) { + ui.painter().hline(rect.x_range(), rect.bottom() - 0.5, Stroke::new(1.0, Color32::from_white_alpha(10))); +} + +/// A small dark chip: an icon (or a creator logo) and a label. Returns its right edge. +fn chip(ui: &Ui, left_center: egui::Pos2, icon: Option, creator: Option<&str>, label: &str) -> f32 { + let galley = ui.painter().layout_no_wrap(label.to_owned(), FontId::new(12.0, theme::medium()), theme::fade(Color32::WHITE, 0.9)); + let lead = if icon.is_some() || creator.is_some() { 16.0 } else { 0.0 }; + let rect = Rect::from_min_size(pos2(left_center.x, left_center.y - 12.0), vec2(20.0 + lead + galley.size().x, 24.0)); + let p = ui.painter(); + p.rect_filled(rect, 0.0, Color32::from_black_alpha(153)); + let icon_rect = Rect::from_center_size(pos2(rect.left() + 16.0, rect.center().y), vec2(11.0, 11.0)); + if let Some(icon) = icon { + icons::paint(p, icon_rect, icon, theme::fade(Color32::WHITE, 0.9)); + } else if let Some(creator) = creator { + let tex = creator_icons::texture(ui.ctx(), creator); + egui::Image::new(&tex).tint(theme::fade(Color32::WHITE, 0.9)).paint_at(ui, icon_rect.expand(0.5)); + } + p.galley(pos2(rect.left() + 10.0 + lead, rect.center().y - galley.size().y / 2.0), galley, Color32::WHITE); + rect.right() +} + +/// A creator logo followed by the model's name. Returns the right edge. +fn model_chip(ui: &Ui, left_center: egui::Pos2, model_id: &str, names: &dyn ModelNames, size: f32, color: Color32) -> f32 { + if model_id.is_empty() { + return left_center.x; + } + let icon_rect = Rect::from_center_size(pos2(left_center.x + size / 2.0 + 1.0, left_center.y), vec2(size + 2.0, size + 2.0)); + let tex = creator_icons::texture(ui.ctx(), &names.creator(model_id)); + egui::Image::new(&tex).tint(color).paint_at(ui, icon_rect); + let r = ui.painter().text(pos2(icon_rect.right() + 6.0, left_center.y), Align2::LEFT_CENTER, names.display_name(model_id), FontId::new(size, theme::medium()), color); + r.right() +} + +/// Darkens the bottom of `rect` (`bg-gradient-to-t from-black/70`), returning the faded band. +fn bottom_gradient(ui: &Ui, rect: Rect, height: f32, alpha: u8) -> Rect { + let band = Rect::from_min_max(pos2(rect.left(), (rect.bottom() - height).max(rect.top())), rect.max); + let mut mesh = Mesh::default(); + let (top, bottom) = (Color32::TRANSPARENT, Color32::from_black_alpha(alpha)); + mesh.colored_vertex(band.left_top(), top); + mesh.colored_vertex(band.right_top(), top); + mesh.colored_vertex(band.right_bottom(), bottom); + mesh.colored_vertex(band.left_bottom(), bottom); + mesh.add_triangle(0, 1, 2); + mesh.add_triangle(0, 2, 3); + ui.painter().add(mesh); + band +} + +/// The sweeping highlight over loading tiles (`.animate-shimmer`). +fn shimmer(ui: &Ui, rect: Rect) { + let t = (ui.input(|i| i.time) / 1.5).fract() as f32; + let x = rect.left() - rect.width() + t * rect.width() * 3.0; + let band = Rect::from_min_max(pos2(x, rect.top()), pos2(x + rect.width(), rect.bottom())).intersect(rect); + if band.width() > 0.0 { + let mut mesh = Mesh::default(); + let (edge, mid) = (Color32::TRANSPARENT, Color32::from_white_alpha(20)); + let cx = (x + rect.width() / 2.0).clamp(band.left(), band.right()); + for (px, c) in [(band.left(), edge), (cx, mid), (band.right(), edge)] { + mesh.colored_vertex(pos2(px, band.top()), c); + mesh.colored_vertex(pos2(px, band.bottom()), c); + } + mesh.add_triangle(0, 1, 2); + mesh.add_triangle(1, 2, 3); + mesh.add_triangle(2, 3, 4); + mesh.add_triangle(3, 4, 5); + ui.painter().add(mesh); + } + ui.ctx().request_repaint(); +} + +/// Lays out `text` wrapped to `width`, keeping at most `max_lines` lines (with an ellipsis). +fn clamp_lines(ui: &Ui, text: &str, size: f32, color: Color32, width: f32, max_lines: usize) -> std::sync::Arc { + let mut job = egui::text::LayoutJob::simple(text.to_owned(), FontId::new(size, FontFamily::Proportional), color, width); + job.wrap.max_rows = max_lines; + job.wrap.break_anywhere = false; + ui.painter().layout_job(job) +} + +fn truncate(s: &str, max: usize) -> String { + if s.chars().count() <= max { + s.to_owned() + } else { + format!("{}\u{2026}", s.chars().take(max - 1).collect::()) + } +} + +/// The UV rect that crops a texture of `size` to fill `target` (`object-cover`). +fn cover_uv_for(size: egui::Vec2, target: egui::Vec2) -> Rect { + if size.x <= 0.0 || size.y <= 0.0 || target.x <= 0.0 || target.y <= 0.0 { + return Rect::from_min_max(pos2(0.0, 0.0), pos2(1.0, 1.0)); + } + let (src, dst) = (size.y / size.x, target.y / target.x); + if src > dst { + let f = dst / src; + Rect::from_min_max(pos2(0.0, (1.0 - f) / 2.0), pos2(1.0, (1.0 + f) / 2.0)) + } else { + let f = src / dst; + Rect::from_min_max(pos2((1.0 - f) / 2.0, 0.0), pos2((1.0 + f) / 2.0, 1.0)) + } +} diff --git a/artcraft-native/src/feed/mod.rs b/artcraft-native/src/feed/mod.rs new file mode 100644 index 0000000000..3f73c874db --- /dev/null +++ b/artcraft-native/src/feed/mod.rs @@ -0,0 +1,3 @@ +pub mod grid; +pub mod store; +pub mod types; diff --git a/artcraft-native/src/feed/store.rs b/artcraft-native/src/feed/store.rs new file mode 100644 index 0000000000..43f281101c --- /dev/null +++ b/artcraft-native/src/feed/store.rs @@ -0,0 +1,326 @@ +//! One create page's feed (`useDesktopGenerationFeed` + `useGalleryData`): jobs in flight and +//! failures from the session's job list, results as they land, and the library underneath. + +use std::collections::{HashMap, HashSet}; + +use crate::backend::wire::{Job, JobPhase, MediaFile, unix_secs}; +use crate::backend::EnqueueMeta; +use crate::feed::types::{FailedJob, FeedItem, MediaKind, PendingJob}; +use crate::models::Catalog; + +/// Failures older than this are history, not news. +const FAILURE_WINDOW_SECS: i64 = 24 * 60 * 60; +/// Thumbnails are requested at this width (`getMediaThumbnail(@512)`). +pub const THUMBNAIL_WIDTH: u32 = 512; + +/// Something the store wants the app to do or say after an update. +#[derive(Debug, PartialEq)] +pub enum FeedNotice { + Completed, + Failed(String), + /// Expand a finished batch job into all of its files. + LoadBatch { + job_token: String, + batch_token: String, + }, +} + +#[derive(Default)] +pub struct FeedStore { + pub pending: Vec, + pub failed: Vec, + pub items: Vec, + pub has_more: bool, + pub loading: bool, + pub selecting: bool, + pub selected: HashSet, + pub last_viewed: Option, + next_page: u32, + library_started: bool, + /// Jobs seen finished (so only new ones announce themselves). + seen_complete: HashSet, + /// Jobs seen running in this session (so their outcome gets a toast). + seen_running: HashSet, + first_poll_done: bool, + dismissed: HashSet, + meta: HashMap, +} + +impl FeedStore { + pub fn has_content(&self) -> bool { + !self.pending.is_empty() || !self.failed.is_empty() || !self.items.is_empty() + } + + /// Shows the jobs a generate call just started, before the next poll catches up. + pub fn add_enqueued(&mut self, kind: MediaKind, job_tokens: &[String], meta: &EnqueueMeta, catalog: &Catalog) { + let now = chrono::Utc::now().timestamp(); + let expected = catalog.find(&meta.model_id).map_or(30.0, |m| m.expected_secs); + for token in job_tokens { + self.meta.insert(token.clone(), meta.clone()); + self.seen_running.insert(token.clone()); + if !self.pending.iter().any(|p| &p.job_token == token) { + self.pending.insert(0, PendingJob { job_token: token.clone(), kind, prompt: meta.prompt.clone(), model_id: Some(meta.model_id.clone()), created_at: now, server_progress: None, expected_secs: expected, batch_count: meta.batch_count }); + } + } + } + + /// Applies a poll of the session's jobs, keeping only `kind`'s. + pub fn apply_jobs(&mut self, kind: MediaKind, jobs: &[Job], catalog: &Catalog) -> Vec { + let now = chrono::Utc::now().timestamp(); + let mut notices = Vec::new(); + let mut pending = Vec::new(); + let mut failed = Vec::new(); + let relevant: Vec<&Job> = jobs.iter().filter(|j| job_kind(j, catalog) == Some(kind) && !self.dismissed.contains(&j.job_token)).collect(); + for job in relevant { + let meta = self.meta.get(&job.job_token).cloned(); + let meta = meta.as_ref(); + let model_id = meta.map(|m| m.model_id.clone()).or_else(|| job.request.maybe_model_type.clone()); + let prompt = meta.map(|m| m.prompt.clone()).or_else(|| job.request.maybe_raw_inference_text.clone()).unwrap_or_default(); + match job.status.phase() { + JobPhase::Running => { + self.seen_running.insert(job.job_token.clone()); + let expected = model_id.as_deref().and_then(|id| catalog.find(id)).map_or(if kind == MediaKind::Video { 900.0 } else { 30.0 }, |m| m.expected_secs); + pending.push(PendingJob { job_token: job.job_token.clone(), kind, prompt, model_id, created_at: unix_secs(&job.created_at), server_progress: Some(job.status.progress_percentage), expected_secs: expected, batch_count: meta.map_or(1, |m| m.batch_count) }); + }, + JobPhase::Failed => { + let updated = unix_secs(&job.updated_at); + if self.seen_running.remove(&job.job_token) { + notices.push(FeedNotice::Failed(job.status.maybe_failure_message.clone().unwrap_or_else(|| job.status.failure_reason()))); + } + if now - updated <= FAILURE_WINDOW_SECS { + failed.push(FailedJob { job_token: job.job_token.clone(), prompt, model_id, updated_at: updated, reason: job.status.failure_reason(), message: job.status.maybe_failure_message.clone().filter(|_| job.status.maybe_failure_category_updated.as_deref() != Some("unknown")), ref_image: meta.and_then(|m| m.ref_image.clone()) }); + } + }, + JobPhase::Succeeded => { + if !self.seen_complete.insert(job.job_token.clone()) || !self.first_poll_done { + continue; + } + if self.seen_running.remove(&job.job_token) { + notices.push(FeedNotice::Completed); + } + let Some(result) = &job.maybe_result else { + continue; + }; + // The finished card takes the pending card's place: date it by the job. + let created_at = unix_secs(&job.created_at); + self.push_item(FeedItem { token: result.entity_token.clone(), kind, thumbnail: result.media_links.thumbnail(THUMBNAIL_WIDTH), full_url: result.media_links.cdn_url.clone(), created_at, model_id: model_id.clone(), prompt_token: job.request.maybe_prompt_token.clone(), batch_token: result.maybe_batch_token.clone(), duration_secs: None }); + if let Some(batch) = &result.maybe_batch_token { + notices.push(FeedNotice::LoadBatch { job_token: job.job_token.clone(), batch_token: batch.clone() }); + } + }, + } + } + // Jobs started a moment ago may not be in the list yet: keep them. + for p in self.pending.drain(..) { + let listed = jobs.iter().any(|j| j.job_token == p.job_token); + if !listed && now - p.created_at < 60 && !pending.iter().any(|q: &PendingJob| q.job_token == p.job_token) { + pending.push(p); + } + } + // Everything finished before the first poll comes from the library instead. + self.first_poll_done = true; + pending.sort_by_key(|p| std::cmp::Reverse(p.created_at)); + failed.sort_by_key(|f| std::cmp::Reverse(f.updated_at)); + self.pending = pending; + self.failed = failed; + notices + } + + /// Adds every file of a finished batch, dated like the batch's first card. + pub fn apply_batch(&mut self, kind: MediaKind, files: &[MediaFile]) { + for file in files { + let mut item = feed_item(kind, file); + if let Some(first) = self.items.iter().find(|i| i.batch_token.is_some() && i.batch_token == file.maybe_batch_token) { + item.created_at = first.created_at; + } + self.push_item(item); + } + } + + pub fn library_started(&self) -> bool { + self.library_started + } + + /// The next library page to fetch, if one is due. + pub fn next_library_page(&mut self) -> Option { + if self.loading || (self.library_started && !self.has_more) { + return None; + } + self.loading = true; + self.library_started = true; + Some(self.next_page) + } + + pub fn apply_library_page(&mut self, kind: MediaKind, page: u32, files: &[MediaFile], total_pages: u32) { + self.loading = false; + if page != self.next_page { + return; + } + for file in files { + self.push_item(feed_item(kind, file)); + } + self.next_page = page + 1; + self.has_more = self.next_page < total_pages; + } + + pub fn library_failed(&mut self) { + self.loading = false; + } + + /// Starts the library over (after signing in or out). + pub fn reset(&mut self) { + *self = Self { dismissed: std::mem::take(&mut self.dismissed), ..Self::default() }; + } + + pub fn dismiss(&mut self, job_token: &str) { + self.dismissed.insert(job_token.to_owned()); + self.failed.retain(|f| f.job_token != job_token); + } + + pub fn remove_item(&mut self, token: &str) { + self.items.retain(|i| i.token != token); + self.selected.remove(token); + } + + pub fn find(&self, token: &str) -> Option<&FeedItem> { + self.items.iter().find(|i| i.token == token) + } + + /// Finished items newest first (the lightbox's prev/next order). + pub fn ordered_tokens(&self) -> Vec { + let mut items: Vec<&FeedItem> = self.items.iter().collect(); + items.sort_by_key(|i| std::cmp::Reverse(i.created_at)); + items.into_iter().map(|i| i.token.clone()).collect() + } + + fn push_item(&mut self, item: FeedItem) { + if !item.token.is_empty() && !self.items.iter().any(|i| i.token == item.token) { + self.items.push(item); + } + } +} + +/// Builds a feed item from a library or batch file. +pub fn feed_item(kind: MediaKind, file: &MediaFile) -> FeedItem { + FeedItem { + token: file.token.clone(), + kind: match file.media_class.as_deref() { + Some("video") => MediaKind::Video, + Some("image") => MediaKind::Image, + _ => kind, + }, + thumbnail: file.media_links.thumbnail(THUMBNAIL_WIDTH), + full_url: file.media_links.cdn_url.clone(), + created_at: unix_secs(&file.created_at), + model_id: file.maybe_model_type.clone().or_else(|| file.maybe_origin_model_type.clone()), + prompt_token: file.maybe_prompt_token.clone(), + batch_token: file.maybe_batch_token.clone(), + duration_secs: file.maybe_duration_millis.map(|ms| ms as f32 / 1000.0), + } +} + +/// Whether a job made an image or a video: by its model, else by its category. +fn job_kind(job: &Job, catalog: &Catalog) -> Option { + if let Some(model) = job.request.maybe_model_type.as_deref() { + if catalog.image.iter().any(|m| m.id == model) { + return Some(MediaKind::Image); + } + if catalog.video.iter().any(|m| m.id == model) { + return Some(MediaKind::Video); + } + } + let category = job.request.inference_category.as_str(); + if category.contains("video") { + Some(MediaKind::Video) + } else if category.contains("image") { + Some(MediaKind::Image) + } else { + None + } +} + +#[cfg(test)] +mod tests { + use super::*; + use crate::models::ModelInfo; + + fn catalog() -> Catalog { + let mut c = Catalog::default(); + c.set_image(vec![ModelInfo { id: "nano_banana_pro".into(), name: "Nano Banana Pro".into(), prompt_supported: true, ..Default::default() }]); + c.set_video(vec![ModelInfo { id: "seedance_2p0".into(), name: "Seedance 2.0".into(), ..Default::default() }]); + c + } + + fn job(token: &str, model: &str, status: &str, created: &str) -> Job { + serde_json::from_value(serde_json::json!({ + "job_token": token, + "request": { "inference_category": "image_generation", "maybe_model_type": model, "maybe_raw_inference_text": "a red knight" }, + "status": { "status": status, "progress_percentage": 40, "maybe_failure_message": "Too spicy", "maybe_failure_category_updated": "rule_bans_user_text_prompt" }, + "maybe_result": { "entity_token": format!("m_{token}"), "media_links": { "cdn_url": "https://cdn/x.png", "maybe_thumbnail_template": "https://cdn/w={WIDTH}/x.png" } }, + "created_at": created, + "updated_at": created, + })) + .expect("job json") + } + + fn now_rfc3339() -> String { + chrono::Utc::now().to_rfc3339() + } + + #[test] + fn first_poll_leaves_old_results_to_the_library() { + let (c, mut store) = (catalog(), FeedStore::default()); + let notices = store.apply_jobs(MediaKind::Image, &[job("j1", "nano_banana_pro", "complete_success", &now_rfc3339())], &c); + assert!(notices.is_empty()); + assert!(store.items.is_empty()); + } + + #[test] + fn running_jobs_become_pending_then_announce_their_result() { + let (c, mut store) = (catalog(), FeedStore::default()); + let t = now_rfc3339(); + store.apply_jobs(MediaKind::Image, &[], &c); + store.apply_jobs(MediaKind::Image, &[job("j1", "nano_banana_pro", "started", &t)], &c); + assert_eq!(store.pending.len(), 1); + assert_eq!(store.pending[0].prompt, "a red knight"); + assert_eq!(store.pending[0].server_progress, Some(40)); + + let notices = store.apply_jobs(MediaKind::Image, &[job("j1", "nano_banana_pro", "complete_success", &t)], &c); + assert_eq!(notices, vec![FeedNotice::Completed]); + assert!(store.pending.is_empty()); + assert_eq!(store.items[0].token, "m_j1"); + assert_eq!(store.items[0].thumbnail.as_deref(), Some("https://cdn/w=512/x.png")); + } + + #[test] + fn failures_show_with_their_reason_and_can_be_dismissed() { + let (c, mut store) = (catalog(), FeedStore::default()); + let t = now_rfc3339(); + store.apply_jobs(MediaKind::Image, &[job("j2", "nano_banana_pro", "pending", &t)], &c); + let notices = store.apply_jobs(MediaKind::Image, &[job("j2", "nano_banana_pro", "complete_failure", &t)], &c); + assert_eq!(notices, vec![FeedNotice::Failed("Too spicy".into())]); + assert_eq!(store.failed[0].reason, "Text prompt violates content policy"); + store.dismiss("j2"); + store.apply_jobs(MediaKind::Image, &[job("j2", "nano_banana_pro", "complete_failure", &t)], &c); + assert!(store.failed.is_empty()); + } + + #[test] + fn jobs_go_to_the_feed_of_their_model() { + let (c, mut store) = (catalog(), FeedStore::default()); + store.apply_jobs(MediaKind::Video, &[job("j3", "nano_banana_pro", "started", &now_rfc3339())], &c); + assert!(store.pending.is_empty()); + store.apply_jobs(MediaKind::Video, &[job("j4", "seedance_2p0", "started", &now_rfc3339())], &c); + assert_eq!(store.pending.len(), 1); + } + + #[test] + fn just_enqueued_jobs_survive_a_poll_that_predates_them() { + let (c, mut store) = (catalog(), FeedStore::default()); + let meta = EnqueueMeta { prompt: "p".into(), model_id: "nano_banana_pro".into(), batch_count: 2, ref_image: None }; + store.add_enqueued(MediaKind::Image, &["fresh".into()], &meta, &c); + store.apply_jobs(MediaKind::Image, &[], &c); + assert_eq!(store.pending.len(), 1); + assert_eq!(store.pending[0].batch_count, 2); + } +} diff --git a/artcraft-native/src/feed/types.rs b/artcraft-native/src/feed/types.rs new file mode 100644 index 0000000000..ee3ba9f209 --- /dev/null +++ b/artcraft-native/src/feed/types.rs @@ -0,0 +1,107 @@ +//! What the generation feed shows: jobs still running, jobs that failed, and finished media. + +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum MediaKind { + Image, + Video, +} + +impl MediaKind { + pub fn label(self) -> &'static str { + match self { + MediaKind::Image => "Image", + MediaKind::Video => "Video", + } + } + + pub fn plural(self) -> &'static str { + match self { + MediaKind::Image => "images", + MediaKind::Video => "videos", + } + } +} + +/// A finished image or video in the user's library. +#[derive(Clone, Debug)] +pub struct FeedItem { + /// The media file token. + pub token: String, + pub kind: MediaKind, + /// A thumbnail URL (512 px wide where the CDN can resize). + pub thumbnail: Option, + /// The original file. + pub full_url: String, + /// Unix seconds. + pub created_at: i64, + /// The model that made it (`maybe_model_type`). + pub model_id: Option, + pub prompt_token: Option, + pub batch_token: Option, + pub duration_secs: Option, +} + +/// A generation the server is still working on. +#[derive(Clone, Debug)] +pub struct PendingJob { + pub job_token: String, + pub kind: MediaKind, + pub prompt: String, + pub model_id: Option, + /// Unix seconds when it was enqueued. + pub created_at: i64, + /// The server's progress (0–100), when it reports any. + pub server_progress: Option, + /// How long this model usually takes, for the estimated progress bar. + pub expected_secs: f32, + pub batch_count: u32, +} + +/// A generation that failed or was cancelled. +#[derive(Clone, Debug)] +pub struct FailedJob { + pub job_token: String, + pub prompt: String, + pub model_id: Option, + pub updated_at: i64, + pub reason: String, + pub message: Option, + /// The first reference image, shown faintly behind the error. + pub ref_image: Option, +} + +/// The progress and time-left labels for a pending job (`derivePendingStatus`). +pub fn pending_status(job: &PendingJob, now: i64) -> (u8, String) { + let elapsed = (now - job.created_at).max(0) as f32; + let estimated = ((elapsed / job.expected_secs.max(1.0)) * 100.0).min(95.0) as u8; + let progress = job.server_progress.filter(|p| *p > 0).unwrap_or(estimated).min(99); + if progress >= 95 { + return (progress, "Almost done...".to_owned()); + } + let left = (job.expected_secs - elapsed).max(1.0) as i64; + let (h, m, s) = (left / 3600, (left % 3600) / 60, left % 60); + let label = if h > 0 && m > 0 { + format!("~{h}h {m}m") + } else if h > 0 { + format!("~{h}h") + } else if m > 0 { + format!("~{m}m") + } else { + format!("~{s}s") + }; + (progress, label) +} + +/// "just now", "5 minutes ago", … for list rows. +pub fn time_ago(then: i64, now: i64) -> String { + let d = (now - then).max(0); + let plural = |n: i64, unit: &str| format!("{n} {unit}{} ago", if n == 1 { "" } else { "s" }); + match d { + 0..=59 => "just now".to_owned(), + 60..=3599 => plural(d / 60, "minute"), + 3600..=86_399 => plural(d / 3600, "hour"), + 86_400..=2_591_999 => plural(d / 86_400, "day"), + 2_592_000..=31_535_999 => plural(d / 2_592_000, "month"), + _ => plural(d / 31_536_000, "year"), + } +} diff --git a/artcraft-native/src/main.rs b/artcraft-native/src/main.rs new file mode 100644 index 0000000000..b4d2b5c5ea --- /dev/null +++ b/artcraft-native/src/main.rs @@ -0,0 +1,33 @@ +#![cfg_attr(not(debug_assertions), windows_subsystem = "windows")] + +//! ArtCraft, natively: an egui desktop app over the ArtCraft API (no Tauri, no webview). + +mod app; +mod backend; +mod feed; +mod models; +mod overlays; +mod pages; +mod prompt_box; +mod shell; +mod theme; +mod ui; + +const APP_ID: &str = "ai.artcraft.native"; + +fn main() -> eframe::Result { + env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); + let mut viewport = egui::ViewportBuilder::default().with_title("ArtCraft").with_app_id(APP_ID).with_inner_size([1440.0, 900.0]).with_min_inner_size([960.0, 640.0]); + if let Some(icon) = app_icon() { + viewport = viewport.with_icon(icon); + } + let options = eframe::NativeOptions { viewport, persist_window: true, ..Default::default() }; + eframe::run_native("ArtCraft", options, Box::new(|cc| Ok(Box::new(app::ArtcraftApp::new(cc))))) +} + +/// The window and taskbar icon. +fn app_icon() -> Option { + const ICON: &[u8] = include_bytes!("../../crates/desktop/artcraft/icons/icon.png"); + let rgba = image::load_from_memory(ICON).ok()?.into_rgba8(); + Some(egui::IconData { width: rgba.width(), height: rgba.height(), rgba: rgba.into_raw() }) +} diff --git a/artcraft-native/src/models.rs b/artcraft-native/src/models.rs new file mode 100644 index 0000000000..84fd713a05 --- /dev/null +++ b/artcraft-native/src/models.rs @@ -0,0 +1,629 @@ +//! The model catalog: capabilities come from the server's OmniGen listing (so new models and +//! options show up without an app update); names, descriptions, families and typical durations +//! are filled in here when the server doesn't say. + +use crate::feed::grid::ModelNames; +use crate::feed::types::MediaKind; + +/// Default models (`defaultModelForPage.ts`). +pub const DEFAULT_IMAGE_MODEL: &str = "nano_banana_pro"; +pub const DEFAULT_VIDEO_MODEL: &str = "seedance_2p0"; +/// The fallback prompt limit (`maxPromptLength ?? 1000`). +pub const DEFAULT_PROMPT_MAX: usize = 1000; +/// The model pickers group by family once they list this many models. +const GROUP_THRESHOLD: usize = 8; + +/// One generation model and what it accepts. +#[derive(Clone, Debug, Default)] +pub struct ModelInfo { + pub id: String, + pub name: String, + pub description: String, + /// Snake-case maker (`google`, `bytedance`, …), for the logo. + pub creator: String, + pub family: String, + pub disabled: bool, + pub prompt_supported: bool, + /// `None` = unlimited. + pub prompt_max: Option, + pub aspect_ratios: Vec, + pub aspect_default: Option, + pub resolutions: Vec, + pub resolution_default: Option, + pub qualities: Vec, + pub quality_default: Option, + pub batch_sizes: Vec, + pub batch_default: u16, + pub image_refs_max: usize, + // Video only. + pub text_to_video: bool, + pub start_frame: bool, + pub start_frame_required: bool, + pub end_frame: bool, + pub sound_toggle: bool, + pub video_refs_max: usize, + pub video_refs_max_secs: Option, + pub audio_refs_max: usize, + pub audio_refs_max_secs: Option, + pub duration_options: Vec, + pub duration_min: Option, + pub duration_max: Option, + pub duration_max_with_refs: Option, + pub duration_default: Option, + pub bitrates: Vec, + pub bitrate_default: Option, + pub output_formats: Vec, + pub output_format_default: Option, + /// How long a generation usually takes (drives the estimated progress bar). + pub expected_secs: f32, +} + +impl ModelInfo { + /// Batch sizes the count picker offers (`predefined` or `1..=max`). + pub fn batch_options(&self) -> Vec { + if self.batch_sizes.is_empty() { + vec![1] + } else { + self.batch_sizes.clone() + } + } + + /// `count` if this model allows it, else its default. + pub fn valid_batch(&self, count: u16) -> u16 { + let options = self.batch_options(); + if options.contains(&count) { + count + } else if options.contains(&self.batch_default) { + self.batch_default + } else { + options[0] + } + } + + /// `current` if supported, else the default, else the first option (`resolveQuality` & co.). + pub fn resolve(current: Option<&str>, options: &[String], default: Option<&String>) -> Option { + match current { + Some(c) if options.iter().any(|o| o == c) => Some(c.to_owned()), + _ => default.filter(|d| options.is_empty() || options.contains(d)).cloned().or_else(|| options.first().cloned()), + } + } + + pub fn supports_reference_mode(&self) -> bool { + self.image_refs_max > 0 || self.video_refs_max > 0 || self.audio_refs_max > 0 + } + + /// Whether the duration picker shows (a range or several options). + pub fn duration_range(&self, with_refs: bool) -> Option<(u16, u16)> { + let max = if with_refs { self.duration_max_with_refs.or(self.duration_max) } else { self.duration_max }; + match (self.duration_min, max) { + (Some(min), Some(max)) if max > min => Some((min, max)), + _ => { + let (lo, hi) = (self.duration_options.iter().min()?, self.duration_options.iter().max()?); + (hi > lo).then_some((*lo, *hi)) + }, + } + } + + /// Snaps `current` into the model's duration range (preferring the higher neighbour), or its + /// default (`resolveVideoDuration`). + pub fn resolve_duration(&self, current: Option, with_refs: bool) -> Option { + let default = self.duration_default.or_else(|| self.duration_options.first().copied()).or(self.duration_min); + let current = current.or(default)?; + if !self.duration_options.is_empty() { + let cap = if with_refs { self.duration_max_with_refs } else { None }; + let mut options: Vec = self.duration_options.iter().copied().filter(|o| cap.is_none_or(|c| *o <= c)).collect(); + options.sort_unstable(); + return options.iter().copied().find(|&o| o >= current).or(options.last().copied()).or(default); + } + match self.duration_range(with_refs) { + Some((min, max)) => Some(current.clamp(min, max)), + None => default, + } + } +} + +/// Builds a model from the server's image listing. +pub fn image_model(d: &artcraft_client::endpoints::omni_gen::models::image::omni_gen_list_image_models::OmniGenImageModelDetails) -> ModelInfo { + let id = String::from(d.model.clone()); + let mut m = base(&id, MediaKind::Image, d.full_name.as_deref(), d.model_creator.clone().map(String::from)); + m.disabled = d.is_disabled.unwrap_or(false); + m.prompt_supported = d.text_prompt_supported.unwrap_or(true); + m.prompt_max = d.text_prompt_max_length.map(usize::from).or_else(|| default_prompt_max(&id)); + m.aspect_ratios = strings(&d.aspect_ratio_options); + m.aspect_default = d.aspect_ratio_default.clone().map(String::from); + m.resolutions = strings(&d.resolution_options); + m.resolution_default = d.resolution_default.clone().map(String::from); + m.qualities = strings(&d.quality_options); + m.quality_default = d.default_quality.clone().map(String::from); + m.batch_sizes = batch_sizes(d.batch_size_options.as_deref(), d.batch_size_min, d.batch_size_max); + m.batch_default = d.batch_size_default.unwrap_or(1); + m.image_refs_max = if d.image_refs_supported.unwrap_or(false) { d.image_refs_max.map_or(1, usize::from) } else { 0 }; + m +} + +/// Builds a model from the server's video listing. +pub fn video_model(d: &artcraft_client::endpoints::omni_gen::models::video::omni_gen_list_video_models::OmniGenVideoModelDetails) -> ModelInfo { + let id = String::from(d.model.clone()); + let mut m = base(&id, MediaKind::Video, d.full_name.as_deref(), d.model_creator.clone().map(String::from)); + if let Some(short) = d.extra_info_short.as_deref().filter(|s| !s.is_empty()) { + m.description = short.to_owned(); + } + m.disabled = d.is_disabled.unwrap_or(false); + m.prompt_supported = d.text_prompt_supported.unwrap_or(true); + m.prompt_max = d.text_prompt_max_length.map(usize::from).or_else(|| default_prompt_max(&id)); + m.text_to_video = d.text_to_video_supported.unwrap_or(true); + m.start_frame = d.starting_keyframe_supported.unwrap_or(false); + m.start_frame_required = d.starting_keyframe_required.unwrap_or(false); + m.end_frame = d.ending_keyframe_supported.unwrap_or(false); + m.sound_toggle = d.show_generate_with_sound_toggle.unwrap_or(false); + let max = |supported: Option, max: Option| if supported.unwrap_or(false) { max.map_or(1, usize::from) } else { 0 }; + m.image_refs_max = max(d.image_references_supported, d.image_references_max); + m.video_refs_max = max(d.video_references_supported, d.video_references_max); + m.video_refs_max_secs = d.video_references_max_total_duration_seconds; + m.audio_refs_max = max(d.audio_references_supported, d.audio_references_max); + m.audio_refs_max_secs = d.audio_references_max_total_duration_seconds; + m.aspect_ratios = strings(&d.aspect_ratio_options); + m.aspect_default = d.aspect_ratio_default.clone().map(String::from); + m.resolutions = strings(&d.resolution_options); + m.resolution_default = d.resolution_default.clone().map(String::from); + m.qualities = strings(&d.quality_options); + m.quality_default = d.default_quality.clone().map(String::from); + m.bitrates = strings(&d.bitrate_options); + m.bitrate_default = d.bitrate_default.clone().map(String::from); + m.output_formats = d.output_format_options.clone().unwrap_or_default(); + m.output_format_default = d.output_format_default.clone(); + m.duration_options = d.duration_seconds_options.clone().unwrap_or_default(); + m.duration_min = d.duration_seconds_min; + m.duration_max = d.duration_seconds_max; + m.duration_max_with_refs = d.duration_seconds_max_with_image_references; + m.duration_default = d.duration_seconds_default; + m.batch_sizes = batch_sizes(d.batch_size_options.as_deref(), d.batch_size_min, d.batch_size_max); + m.batch_default = d.batch_size_default.unwrap_or(1); + m +} + +fn strings>(options: &Option>) -> Vec { + options.as_deref().unwrap_or_default().iter().cloned().map(Into::into).collect() +} + +fn batch_sizes(options: Option<&[u16]>, min: Option, max: Option) -> Vec { + match options.filter(|o| !o.is_empty()) { + Some(options) => options.to_vec(), + None => (min.unwrap_or(1).max(1)..=max.unwrap_or(1).max(1)).collect(), + } +} + +fn base(id: &str, kind: MediaKind, full_name: Option<&str>, creator: Option) -> ModelInfo { + // Known families use the pickers' curated names ("Flux 1 Dev", not "FLUX.1 [dev]"); models + // the app doesn't know yet use the server's name. + let name = if has_curated_name(id) { display_name(id) } else { full_name.filter(|n| !n.is_empty()).map_or_else(|| display_name(id), str::to_owned) }; + // The server reports "artcraft" for models it serves itself; show the actual maker when the id + // says who that is (Nano Banana → Google), like the webapp. + let creator = match creator.filter(|c| !c.is_empty() && c != "unknown") { + Some(c) if c == "artcraft" && creator_for(id) != "artcraft" => creator_for(id).to_owned(), + Some(c) => c, + None => creator_for(id).to_owned(), + }; + ModelInfo { id: id.to_owned(), name, description: description(id).to_owned(), creator, family: family(id).to_owned(), prompt_supported: true, text_to_video: true, batch_default: 1, expected_secs: expected_secs(id, kind), ..Default::default() } +} + +/// Families whose picker names the app curates (the static model lists' `selectorName`s). +fn has_curated_name(id: &str) -> bool { + const PREFIXES: [&str; 11] = ["flux_", "nano_banana", "gpt_image", "seedream", "seedance", "kling", "veo_", "sora", "happy_horse", "grok_imagine", "qwen"]; + PREFIXES.iter().any(|p| id.starts_with(p)) +} + +/// A readable name for a model id: the irregular ones by table, the rest by rule +/// (`seedance_2p0_fast` → "Seedance 2.0 Fast"). +pub fn display_name(id: &str) -> String { + let special = match id { + "nano_banana" | "gemini_25_flash" => "Nano Banana", + "grok_image" => "Grok Image", + "grok_imagine_image" => "Grok", + "grok_imagine_video" => "Grok Video", + "grok_imagine_image_q" => "Grok Imagine Quality", + "gpt_image_1" => "GPT Image 1 (GPT-4o)", + "flux_pro_1" => "Flux Pro (Inpainting)", + "seedance_2p0_bp" => "Seedance 2.0 Plus", + "seedance_2p0_bp_fast" => "Seedance 2.0 Plus Fast", + "seedance_2p0_bp_mini" => "Seedance 2.0 Plus Mini", + "seedance_2p0_bpu" => "Seedance 2.0 Plus Ultra", + "seedance_2p0_bpu_fast" => "Seedance 2.0 Plus Ultra Fast", + "seedance_2p0_bpu_mini" => "Seedance 2.0 Plus Ultra Mini", + "marble_0p1_mini" => "Marble Mini", + "marble_0p1_plus" => "Marble Plus", + "minimax_h3" => "MiniMax H3", + _ => "", + }; + if !special.is_empty() { + return special.to_owned(); + } + let words: Vec = id + .split('_') + .filter(|w| !w.is_empty()) + .map(|w| { + let bytes = w.as_bytes(); + // "2p0" → "2.0", "1p5" → "1.5" + if bytes[0].is_ascii_digit() && w.contains('p') && w.chars().all(|c| c.is_ascii_digit() || c == 'p') { + return w.replace('p', "."); + } + match w { + "gpt" => "GPT".to_owned(), + "veo" => "Google Veo".to_owned(), + "u" => "Ultra".to_owned(), + "q" => "Quality".to_owned(), + _ => { + let mut c = w.chars(); + c.next().map_or_else(String::new, |f| f.to_uppercase().chain(c).collect()) + }, + } + }) + .collect(); + words.join(" ") +} + +/// A model's prompt limit when the listing doesn't give one (the static lists' `maxPromptLength`; +/// `None` = unlimited, unknown models get the desktop's 1000). +fn default_prompt_max(id: &str) -> Option { + const LIMITS: [(&str, Option); 15] = [("nano_banana", None), ("gpt_image", None), ("seedance_2", None), ("seedance_1", Some(3000)), ("grok_imagine_video", Some(4096)), ("grok_video", Some(4096)), ("grok", Some(8000)), ("midjourney", Some(6000)), ("flux", Some(4000)), ("seedream", Some(4000)), ("qwen", Some(800)), ("kling", Some(2500)), ("happy_horse", Some(2500)), ("sora", Some(2000)), ("veo", Some(5000))]; + LIMITS.iter().find(|(prefix, _)| id.starts_with(prefix)).map_or(Some(DEFAULT_PROMPT_MAX), |(_, limit)| *limit) +} + +/// The image picker's one-liners (`selectorDescription`). +fn description(id: &str) -> &'static str { + match id { + "grok_image" | "grok_imagine_image" => "Fast af", + "midjourney" | "midjourney_7" | "midjourney_7_niji" | "midjourney_8" => "Stunning style and quality", + "flux_pro_1p1_ultra" => "Higher quality model", + "flux_pro_1p1" => "High quality model", + "flux_1_dev" => "Fast, but lower quality", + "flux_1_schnell" => "Fastest image gen, but lowest quality", + "nano_banana" | "nano_banana_2" => "Fast instructive editing", + "nano_banana_pro" => "Powerful instructive editing", + "gpt_image_1" => "Slow, but super smart", + "gpt_image_1p5" => "Faster, improved", + "gpt_image_2" => "Smart with great text support", + "gpt_image_2p5_flare" => "Precise edits, keeps subjects intact", + "gpt_image_2p5_sunburst" => "Premium detail, slower", + "seedream_4" | "seedream_4p5" | "seedream_5_lite" => "Fast", + "grok_video" | "grok_imagine_video" => "Fastest video model", + "sora_2" => "Smart video model", + "veo_3" => "Slow, high-quality model", + _ => "", + } +} + +/// Typical generation time (the static list's `progressBarTime`). +fn expected_secs(id: &str, kind: MediaKind) -> f32 { + match id { + "grok_image" | "grok_imagine_image" | "flux_pro_1p1" | "flux_1_dev" | "flux_1_schnell" => 10.0, + "grok_video" | "grok_imagine_video" => 50.0, + "nano_banana" | "nano_banana_2" | "nano_banana_pro" => 25.0, + "flux_pro_1p1_ultra" => 35.0, + "midjourney" | "midjourney_7" | "midjourney_7_niji" | "midjourney_8" => 45.0, + "gpt_image_1" | "gpt_image_1p5" | "gpt_image_2p5_flare" | "seedream_4" | "seedream_4p5" | "seedream_5_lite" => 60.0, + "gpt_image_2" | "gpt_image_2p5_sunburst" => 120.0, + _ if kind == MediaKind::Video => 900.0, + _ => 30.0, + } +} + +/// The maker, by id prefix, when the server doesn't say. +pub fn creator_for(id: &str) -> &'static str { + const PREFIXES: [(&str, &str); 16] = [("flux", "black_forest_labs"), ("nano_banana", "google"), ("gemini", "google"), ("veo", "google"), ("imagen", "google"), ("gpt_image", "openai"), ("sora", "openai"), ("seedream", "bytedance"), ("seedance", "bytedance"), ("seededit", "bytedance"), ("kling", "kling"), ("grok", "grok"), ("midjourney", "midjourney"), ("qwen", "alibaba"), ("happy_horse", "alibaba"), ("minimax", "minimax")]; + PREFIXES.iter().find(|(p, _)| id.starts_with(p)).map_or("artcraft", |(_, c)| c) +} + +/// The picker family (`getModelFamilyName`). +fn family(id: &str) -> &'static str { + const FAMILIES: [(&str, &str); 22] = [("seedance", "Seedance"), ("kling", "Kling"), ("veo", "Veo"), ("sora", "Sora"), ("happy_horse", "Happy Horse"), ("wan", "Wan"), ("vidu", "Vidu"), ("preview", "Preview"), ("nano_banana", "Nano Banana"), ("gemini_25_flash", "Nano Banana"), ("seedream", "Seedream"), ("seededit", "SeedEdit"), ("gpt_image", "GPT Image"), ("flux", "Flux"), ("midjourney", "Midjourney"), ("grok", "Grok"), ("qwen", "Qwen"), ("recraft", "Recraft"), ("imagen", "Imagen"), ("minimax", "MiniMax"), ("marble", "World Labs"), ("suno", "Suno")]; + FAMILIES.iter().find(|(p, _)| id.starts_with(p)).map_or("Other", |(_, f)| f) +} + +/// Family order in the picker (`FAMILY_ORDER`): video families, then image families; the rest +/// alphabetical, "Other" last. +fn family_rank(family: &str) -> (usize, String) { + const ORDER: [&str; 17] = ["Seedance", "Kling", "Veo", "Sora", "Happy Horse", "Wan", "Vidu", "Grok", "Nano Banana", "Seedream", "GPT Image", "Flux", "Midjourney", "Qwen", "SeedEdit", "Recraft", "Imagen"]; + match ORDER.iter().position(|f| *f == family) { + Some(i) => (i, String::new()), + None if family == "Other" => (usize::MAX, String::new()), + None => (ORDER.len(), family.to_owned()), + } +} + +/// A group of models in the picker. +pub struct Family<'a> { + pub name: String, + pub models: Vec<&'a ModelInfo>, +} + +/// Groups `models` by family (when there are enough of them), newest variant first. +pub fn grouped(models: &[ModelInfo]) -> Option>> { + if models.len() < GROUP_THRESHOLD { + return None; + } + let mut families: Vec> = Vec::new(); + for m in models { + match families.iter_mut().find(|f| f.name == m.family) { + Some(f) => f.models.push(m), + None => families.push(Family { name: m.family.clone(), models: vec![m] }), + } + } + families.sort_by_key(|f| family_rank(&f.name)); + for f in &mut families { + f.models.sort_by(|a, b| natural_desc(&a.name, &b.name)); + } + Some(families) +} + +/// Descending, comparing digit runs as numbers ("Seedream 4.5" before "Seedream 4"). +fn natural_desc(a: &str, b: &str) -> std::cmp::Ordering { + fn key(s: &str) -> Vec<(String, f64)> { + s.split(|c: char| c.is_whitespace()).map(|w| (w.to_lowercase(), w.parse::().unwrap_or(-1.0))).collect() + } + let (ka, kb) = (key(a), key(b)); + for (x, y) in ka.iter().zip(&kb) { + let ord = if x.1 >= 0.0 && y.1 >= 0.0 { y.1.total_cmp(&x.1) } else { y.0.cmp(&x.0) }; + if ord != std::cmp::Ordering::Equal { + return ord; + } + } + kb.len().cmp(&ka.len()).reverse() +} + +/// The image page's list: text-to-image capable, enabled, sorted by name. +fn image_page_models(models: &[ModelInfo]) -> Vec { + const HIDDEN: [&str; 2] = ["minimax_h3_turbo", "minimax_h3_ultra"]; + let mut list: Vec = models.iter().filter(|m| m.prompt_supported && !m.disabled && !HIDDEN.contains(&m.id.as_str())).cloned().collect(); + list.sort_by_key(|m| m.name.to_lowercase()); + list +} + +/// The video page's list: enabled, without SwitchX, sorted by name. +fn video_page_models(models: &[ModelInfo]) -> Vec { + let mut list: Vec = models.iter().filter(|m| !m.disabled && m.id != "switch_x").cloned().collect(); + list.sort_by_key(|m| m.name.to_lowercase()); + list +} + +/// Both catalogs, for looking up names in the feed, and each create page's picker list. +#[derive(Default)] +pub struct Catalog { + pub image: Vec, + pub video: Vec, + pub image_page: Vec, + pub video_page: Vec, +} + +impl Catalog { + pub fn set_image(&mut self, models: Vec) { + self.image_page = image_page_models(&models); + self.image = models; + } + + pub fn set_video(&mut self, models: Vec) { + self.video_page = video_page_models(&models); + self.video = models; + } + + pub fn find(&self, id: &str) -> Option<&ModelInfo> { + self.image.iter().chain(&self.video).find(|m| m.id == id) + } +} + +impl ModelNames for Catalog { + fn display_name(&self, model_id: &str) -> String { + self.find(model_id).map_or_else(|| display_name(model_id), |m| m.name.clone()) + } + + fn creator(&self, model_id: &str) -> String { + self.find(model_id).map_or_else(|| creator_for(model_id).to_owned(), |m| m.creator.clone()) + } +} + +/// Aspect ratio labels (`AspectRatioPicker`). +pub fn aspect_label(value: &str) -> String { + match value { + "auto" => "Auto", + "square" => "Square", + "wide_five_by_four" => "5:4 (Wide)", + "wide_four_by_three" => "4:3 (Wide)", + "wide_three_by_two" => "3:2 (Wide)", + "wide_sixteen_by_nine" => "16:9 (Wide)", + "wide_twenty_one_by_nine" => "21:9 (Wide)", + "tall_four_by_five" => "4:5 (Tall)", + "tall_three_by_four" => "3:4 (Tall)", + "tall_two_by_three" => "2:3 (Tall)", + "tall_nine_by_sixteen" => "9:16 (Tall)", + "tall_nine_by_twenty_one" => "9:21 (Tall)", + "auto_2k" => "Auto (2K)", + "auto_3k" => "Auto (3K)", + "auto_4k" => "Auto (4K)", + "square_hd" => "Square (HD)", + "wide" => "Wide", + "tall" => "Tall", + other => other, + } + .to_owned() +} + +/// The proportions an aspect ratio's icon draws (`AspectRatioIcon`); `None` for the auto ones. +pub fn aspect_proportion(value: &str) -> Option<(f32, f32)> { + Some(match value { + "square" | "square_hd" => (1.0, 1.0), + "wide" => (16.0, 10.0), + "wide_five_by_four" => (5.0, 4.0), + "wide_four_by_three" => (4.0, 3.0), + "wide_three_by_two" => (3.0, 2.0), + "wide_sixteen_by_nine" => (16.0, 9.0), + "wide_twenty_one_by_nine" => (21.0, 9.0), + "tall" => (10.0, 16.0), + "tall_four_by_five" => (4.0, 5.0), + "tall_three_by_four" => (3.0, 4.0), + "tall_two_by_three" => (2.0, 3.0), + "tall_nine_by_sixteen" => (9.0, 16.0), + "tall_nine_by_twenty_one" => (9.0, 21.0), + _ => return None, + }) +} + +/// Resolution labels (`ResolutionPicker`). +pub fn resolution_label(value: &str) -> String { + match value { + "half_k" => "0.5K", + "four_eighty_p" => "480p", + "seven_twenty_p" => "720p", + "one_k" => "1K", + "ten_eighty_p" => "1080p", + "two_k" => "2K", + "three_k" => "3K", + "four_k" => "4K", + other => other, + } + .to_owned() +} + +/// Whether a resolution is high definition (2K and up), for its SD/HD caption. +pub fn resolution_is_hd(value: &str) -> bool { + matches!(value, "two_k" | "three_k" | "four_k") +} + +/// Quality labels (`QualityPicker`). +pub fn quality_label(value: &str) -> String { + match value { + "auto" => "Auto", + "max" => "Max", + "xhigh" => "Extra high", + "high" => "High", + "medium" => "Medium", + "low" => "Low", + other => other, + } + .to_owned() +} + +/// Bitrate labels. +pub fn bitrate_label(value: &str) -> String { + match value { + "normal" => "Normal".to_owned(), + "high" => "High".to_owned(), + other => other.to_owned(), + } +} + +#[cfg(test)] +mod tests { + use super::*; + + fn model(id: &str) -> ModelInfo { + ModelInfo { id: id.to_owned(), name: display_name(id), family: family(id).to_owned(), batch_default: 1, ..Default::default() } + } + + mod naming { + use super::*; + + #[test] + fn humanizes_versions_and_known_words() { + assert_eq!(display_name("seedance_2p0_fast"), "Seedance 2.0 Fast"); + assert_eq!(display_name("veo_3p1"), "Google Veo 3.1"); + assert_eq!(display_name("gpt_image_2p5_flare"), "GPT Image 2.5 Flare"); + assert_eq!(display_name("kling_3p0_pro"), "Kling 3.0 Pro"); + assert_eq!(display_name("nano_banana"), "Nano Banana"); + assert_eq!(display_name("seedance_2p0_bpu"), "Seedance 2.0 Plus Ultra"); + } + + #[test] + fn prefers_curated_names_and_the_real_maker() { + let nb = base("nano_banana_pro", MediaKind::Image, Some("Nano Banana Pro"), Some("artcraft".into())); + assert_eq!((nb.name.as_str(), nb.creator.as_str()), ("Nano Banana Pro", "google")); + let flux = base("flux_1_dev", MediaKind::Image, Some("FLUX.1 [dev]"), Some("black_forest_labs".into())); + assert_eq!(flux.name, "Flux 1 Dev"); + let mj = base("midjourney_7_niji", MediaKind::Image, Some("Midjourney v7 Niji (Anime)"), Some("midjourney".into())); + assert_eq!((mj.name.as_str(), mj.creator.as_str()), ("Midjourney v7 Niji (Anime)", "midjourney")); + } + + #[test] + fn falls_back_to_creator_by_prefix() { + assert_eq!(creator_for("seedream_4p5"), "bytedance"); + assert_eq!(creator_for("veo_3"), "google"); + assert_eq!(creator_for("something_new"), "artcraft"); + } + + #[test] + fn prompt_limits_follow_the_static_lists() { + assert_eq!(default_prompt_max("nano_banana_pro"), None); + assert_eq!(default_prompt_max("seedance_2p0"), None); + assert_eq!(default_prompt_max("seedance_1p5_pro"), Some(3000)); + assert_eq!(default_prompt_max("grok_imagine_video_1p5"), Some(4096)); + assert_eq!(default_prompt_max("grok_imagine_image"), Some(8000)); + assert_eq!(default_prompt_max("unknown_model"), Some(DEFAULT_PROMPT_MAX)); + } + } + + mod options { + use super::*; + + #[test] + fn resolve_prefers_current_then_default_then_first() { + let opts = vec!["square".to_owned(), "wide_sixteen_by_nine".to_owned()]; + let default = "wide_sixteen_by_nine".to_owned(); + assert_eq!(ModelInfo::resolve(Some("square"), &opts, Some(&default)).as_deref(), Some("square")); + assert_eq!(ModelInfo::resolve(Some("tall"), &opts, Some(&default)).as_deref(), Some("wide_sixteen_by_nine")); + assert_eq!(ModelInfo::resolve(None, &opts, None).as_deref(), Some("square")); + assert_eq!(ModelInfo::resolve(None, &[], None), None); + } + + #[test] + fn batch_counts_snap_to_valid_values() { + let mut m = model("grok_imagine_image"); + m.batch_sizes = vec![6]; + m.batch_default = 6; + assert_eq!(m.valid_batch(1), 6); + m.batch_sizes = vec![1, 2, 3, 4]; + m.batch_default = 1; + assert_eq!(m.valid_batch(3), 3); + assert_eq!(m.valid_batch(9), 1); + } + + #[test] + fn durations_clamp_to_ranges_and_snap_to_options() { + let mut m = model("seedance_2p0"); + m.duration_min = Some(4); + m.duration_max = Some(15); + m.duration_max_with_refs = Some(10); + m.duration_default = Some(5); + assert_eq!(m.resolve_duration(None, false), Some(5)); + assert_eq!(m.resolve_duration(Some(20), false), Some(15)); + assert_eq!(m.resolve_duration(Some(14), true), Some(10)); + assert_eq!(m.duration_range(false), Some((4, 15))); + + let mut m = model("sora_2"); + m.duration_options = vec![4, 8, 12]; + m.duration_default = Some(4); + assert_eq!(m.resolve_duration(Some(6), false), Some(8)); + assert_eq!(m.resolve_duration(Some(20), false), Some(12)); + assert_eq!(m.duration_range(false), Some((4, 12))); + } + } + + mod grouping { + use super::*; + + #[test] + fn groups_large_lists_by_family_newest_first() { + let ids = ["nano_banana", "nano_banana_pro", "nano_banana_2", "seedream_4", "seedream_4p5", "flux_1_dev", "gpt_image_1", "gpt_image_2"]; + let models: Vec = ids.iter().map(|id| model(id)).collect(); + let families = grouped(&models).expect("8 models group"); + let names: Vec<&str> = families.iter().map(|f| f.name.as_str()).collect(); + assert_eq!(names, ["Nano Banana", "Seedream", "GPT Image", "Flux"]); + let seedream: Vec<&str> = families[1].models.iter().map(|m| m.name.as_str()).collect(); + assert_eq!(seedream, ["Seedream 4.5", "Seedream 4"]); + } + + #[test] + fn small_lists_stay_flat() { + let models: Vec = ["veo_3", "sora_2"].iter().map(|id| model(id)).collect(); + assert!(grouped(&models).is_none()); + } + } +} diff --git a/artcraft-native/src/overlays/account.rs b/artcraft-native/src/overlays/account.rs new file mode 100644 index 0000000000..73561407a6 --- /dev/null +++ b/artcraft-native/src/overlays/account.rs @@ -0,0 +1,204 @@ +//! The sign-in dialog and the settings dialog. + +use egui::{Color32, Id, Sense, Stroke, Ui, pos2, vec2}; + +use crate::shell::{WEB_APP_URL, group_thousands}; +use crate::theme; +use crate::ui::icons::Icon; +use crate::ui::widgets; + +#[derive(Default)] +pub struct LoginDialog { + pub username: String, + pub password: String, + pub error: Option, + pub busy: bool, + /// A browser sign-in waiting for approval: (page, confirmation code). + pub device: Option<(String, String)>, +} + +#[derive(Debug, PartialEq)] +pub enum LoginAction { + Close, + Password, + Browser, + CancelBrowser, +} + +impl LoginDialog { + pub fn show(&mut self, ctx: &egui::Context) -> Option { + let mut action = None; + let close = widgets::modal(ctx, Id::new("login"), 420.0, |ui| { + ui.horizontal(|ui| { + ui.label(widgets::heading("Sign in to ArtCraft", 24.0)); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + if widgets::ghost(ui, Icon::X, None, "Close", false).clicked() { + action = Some(LoginAction::Close); + } + }); + }); + ui.add_space(4.0); + ui.label(egui::RichText::new("Use your ArtCraft account to generate images and videos.").color(theme::MUTED)); + ui.add_space(16.0); + let width = ui.available_width(); + match &self.device { + Some((url, code)) => { + widgets::hud(ui, "Confirmation code", theme::FAINT); + ui.add_space(6.0); + ui.label(egui::RichText::new(code).size(28.0).family(theme::mono_bold()).color(theme::INK).extra_letter_spacing(4.0)); + ui.add_space(6.0); + ui.label(egui::RichText::new("Approve the sign-in in your browser and check the code matches. This window updates by itself.").color(theme::MUTED)); + ui.add_space(10.0); + ui.horizontal(|ui| { + if widgets::button(ui, Some(Icon::ExternalLink), "Open page again", widgets::Kind::Secondary, 0.0, theme::CONTROL_H).clicked() { + ui.ctx().open_url(egui::OpenUrl::new_tab(url)); + } + if widgets::button(ui, None, "Cancel", widgets::Kind::Secondary, 0.0, theme::CONTROL_H).clicked() { + action = Some(LoginAction::CancelBrowser); + } + }); + }, + None => { + if ui.add_enabled_ui(!self.busy, |ui| widgets::button(ui, Some(Icon::Globe), "Sign in with browser", widgets::Kind::Primary, width, 40.0)).inner.clicked() { + action = Some(LoginAction::Browser); + } + ui.add_space(14.0); + divider_with_label(ui, "or"); + ui.add_space(14.0); + widgets::hud(ui, "Username or email", theme::FAINT); + ui.add_space(4.0); + let user_resp = text_field(ui, &mut self.username, false, "you@example.com"); + ui.add_space(10.0); + widgets::hud(ui, "Password", theme::FAINT); + ui.add_space(4.0); + let pass_resp = text_field(ui, &mut self.password, true, "\u{2022}\u{2022}\u{2022}\u{2022}\u{2022}\u{2022}\u{2022}\u{2022}"); + let submitted = (user_resp.lost_focus() || pass_resp.lost_focus()) && ui.input(|i| i.key_pressed(egui::Key::Enter)); + ui.add_space(14.0); + let ready = !self.username.trim().is_empty() && !self.password.is_empty() && !self.busy; + let clicked = ui.add_enabled_ui(ready, |ui| widgets::button(ui, if self.busy { None } else { Some(Icon::LogIn) }, if self.busy { "Signing in\u{2026}" } else { "Sign in" }, widgets::Kind::Secondary, width, 40.0)).inner.clicked(); + if ready && (clicked || submitted) { + action = Some(LoginAction::Password); + } + }, + } + if let Some(error) = &self.error { + ui.add_space(10.0); + ui.label(egui::RichText::new(error).color(theme::BAD)); + } + ui.add_space(16.0); + ui.horizontal(|ui| { + widgets::hud_link(ui, "Create account", &format!("{WEB_APP_URL}/signup")); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + widgets::hud_link(ui, "Forgot password", &format!("{WEB_APP_URL}/forgot-password")); + }); + }); + }); + if close && action.is_none() { + action = Some(if self.device.is_some() { LoginAction::CancelBrowser } else { LoginAction::Close }); + } + action + } +} + +#[derive(Debug, PartialEq)] +pub enum SettingsAction { + Close, + SignOut, + SignIn, +} + +/// The settings dialog (Settings → Misc and Account in the webapp). +pub fn settings_dialog(ctx: &egui::Context, enter_to_generate: &mut bool, username: Option<&str>, credits: Option, data_root: &std::path::Path) -> Option { + let mut action = None; + let close = widgets::modal(ctx, Id::new("settings"), 520.0, |ui| { + ui.horizontal(|ui| { + ui.label(widgets::heading("Settings", 24.0)); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + if widgets::ghost(ui, Icon::X, None, "Close", false).clicked() { + action = Some(SettingsAction::Close); + } + }); + }); + ui.add_space(14.0); + widgets::hud(ui, "General", theme::FAINT); + ui.add_space(6.0); + ui.horizontal(|ui| { + ui.vertical(|ui| { + ui.set_width(400.0); + ui.label(egui::RichText::new("Enter to generate").size(14.0).family(theme::medium())); + ui.label(egui::RichText::new("When on, pressing Enter submits the prompt and Shift+Enter adds a new line. When off (default), both Enter and Shift+Enter add a new line - use only the button to submit.").size(12.5).color(theme::MUTED)); + }); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + if switch(ui, *enter_to_generate).clicked() { + *enter_to_generate = !*enter_to_generate; + } + }); + }); + ui.add_space(18.0); + widgets::hud(ui, "Account", theme::FAINT); + ui.add_space(6.0); + match username { + Some(user) => { + ui.label(egui::RichText::new(format!("Signed in as @{user}")).size(14.0)); + if let Some(c) = credits { + ui.label(egui::RichText::new(format!("{} credits", group_thousands(c))).size(12.5).color(theme::MUTED)); + } + ui.add_space(8.0); + ui.horizontal(|ui| { + if widgets::button(ui, Some(Icon::Gem), "Buy credits", widgets::Kind::Accent, 0.0, theme::CONTROL_H).clicked() { + ui.ctx().open_url(egui::OpenUrl::new_tab(format!("{WEB_APP_URL}/pricing"))); + } + if widgets::button(ui, Some(Icon::LogOut), "Log out", widgets::Kind::Secondary, 0.0, theme::CONTROL_H).clicked() { + action = Some(SettingsAction::SignOut); + } + }); + }, + None => { + if widgets::button(ui, Some(Icon::LogIn), "Sign in", widgets::Kind::Primary, 0.0, theme::CONTROL_H).clicked() { + action = Some(SettingsAction::SignIn); + } + }, + } + ui.add_space(18.0); + widgets::hud(ui, "About", theme::FAINT); + ui.add_space(6.0); + ui.label(egui::RichText::new(format!("ArtCraft native {}", env!("CARGO_PKG_VERSION"))).size(13.0).color(theme::MUTED)); + if widgets::button(ui, Some(Icon::Folder), "Open data folder", widgets::Kind::Secondary, 0.0, theme::CONTROL_H).clicked() { + if let Err(err) = open::that(data_root) { + log::warn!("Couldn't open {}: {err}", data_root.display()); + } + } + }); + if close && action.is_none() { + action = Some(SettingsAction::Close); + } + action +} + +/// A single-line input on the sunken surface with a hairline (and a blue line while focused). +fn text_field(ui: &mut Ui, value: &mut String, password: bool, hint: &str) -> egui::Response { + let id = ui.next_auto_id(); + let focused = ui.memory(|m| m.has_focus(id)); + egui::Frame::new().fill(theme::SUNKEN).stroke(Stroke::new(1.0, if focused { theme::ACCENT } else { theme::LINE })).corner_radius(theme::RADIUS).inner_margin(egui::Margin::symmetric(10, 8)).show(ui, |ui| ui.add(egui::TextEdit::singleline(value).id(id).password(password).frame(egui::Frame::NONE).desired_width(f32::INFINITY).hint_text(egui::RichText::new(hint).color(theme::FAINT)))).inner +} + +/// An on/off switch. +fn switch(ui: &mut Ui, on: bool) -> egui::Response { + let (rect, resp) = ui.allocate_exact_size(vec2(36.0, 20.0), Sense::click()); + let t = ui.ctx().animate_bool(resp.id, on); + let fill = if on { theme::ACCENT } else { theme::WASH_HOVER }; + ui.painter().rect(rect, egui::CornerRadius::same(10), fill, Stroke::new(1.0, theme::LINE), egui::StrokeKind::Inside); + let x = egui::lerp(rect.left() + 10.0..=rect.right() - 10.0, t); + ui.painter().circle_filled(pos2(x, rect.center().y), 7.0, Color32::WHITE); + resp.on_hover_cursor(egui::CursorIcon::PointingHand) +} + +fn divider_with_label(ui: &mut Ui, label: &str) { + let (rect, _) = ui.allocate_exact_size(vec2(ui.available_width(), 12.0), Sense::hover()); + let galley = widgets::caps(ui, label, 10.0, theme::mono(), 1.5, theme::FAINT); + let gap = galley.size().x / 2.0 + 10.0; + let p = ui.painter(); + p.hline(rect.left()..=rect.center().x - gap, rect.center().y, theme::hairline()); + p.hline(rect.center().x + gap..=rect.right(), rect.center().y, theme::hairline()); + p.galley(rect.center() - galley.size() / 2.0, galley, theme::FAINT); +} diff --git a/artcraft-native/src/overlays/library_picker.rs b/artcraft-native/src/overlays/library_picker.rs new file mode 100644 index 0000000000..b7c18cb3b3 --- /dev/null +++ b/artcraft-native/src/overlays/library_picker.rs @@ -0,0 +1,197 @@ +//! "Pick from library" (`GalleryModal mode="select"`): the user's images, videos or audio in a +//! grid, choosing up to the free reference slots. + +use std::collections::HashSet; + +use egui::{Align2, Color32, FontId, Id, Rect, Sense, Stroke, pos2, vec2}; + +use crate::backend::media_cache::{Lookup, MediaCache}; +use crate::backend::wire::MediaFile; +use crate::feed::types::MediaKind; +use crate::prompt_box::deck::cover_uv; +use crate::prompt_box::refs::{ImageSlot, RefKind, RefMedia}; +use crate::theme; +use crate::ui::icons::{self, Icon}; +use crate::ui::widgets; + +const TILE_GAP: f32 = 8.0; +const COLUMNS: usize = 5; + +pub struct LibraryPicker { + pub kind: RefKind, + pub slot: ImageSlot, + /// Which page asked (the picked media goes back there). + pub page: MediaKind, + pub max: usize, + pub items: Vec, + pub loading: bool, + pub has_more: bool, + pub next_page: u32, + /// Already attached: shown but not selectable. + pub attached: HashSet, + selected: Vec, +} + +#[derive(Debug)] +pub enum PickerAction { + Close, + Confirm(Vec), + LoadMore, +} + +impl LibraryPicker { + pub fn new(kind: RefKind, slot: ImageSlot, page: MediaKind, max: usize, attached: HashSet) -> Self { + Self { kind, slot, page, max: max.max(1), items: Vec::new(), loading: false, has_more: true, next_page: 0, attached, selected: Vec::new() } + } + + /// The library's media class filter for this picker. + pub fn media_class(&self) -> &'static str { + match self.kind { + RefKind::Image => "image", + RefKind::Video => "video", + RefKind::Audio => "audio", + } + } + + pub fn apply_page(&mut self, page: u32, files: Vec, total_pages: u32) { + self.loading = false; + if page != self.next_page { + return; + } + for f in files { + if !self.items.iter().any(|i| i.token == f.token) { + self.items.push(f); + } + } + self.next_page = page + 1; + self.has_more = self.next_page < total_pages; + } + + pub fn show(&mut self, ctx: &egui::Context, cache: &mut MediaCache) -> Vec { + let mut actions = Vec::new(); + let screen = ctx.content_rect(); + let width = (screen.width() - 80.0).min(960.0); + let height = (screen.height() - 120.0).min(680.0); + let noun = match self.kind { + RefKind::Image => "images", + RefKind::Video => "videos", + RefKind::Audio => "audio", + }; + let close = widgets::modal(ctx, Id::new("library-picker"), width, |ui| { + ui.horizontal(|ui| { + ui.label(widgets::heading("Pick from library", 22.0)); + ui.add_space(8.0); + widgets::hud(ui, noun, theme::MUTED); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + if widgets::ghost(ui, Icon::X, None, "Close", false).clicked() { + actions.push(PickerAction::Close); + } + }); + }); + ui.add_space(10.0); + let grid_h = height - 120.0; + egui::ScrollArea::vertical().max_height(grid_h).min_scrolled_height(grid_h).auto_shrink([false, false]).show_viewport(ui, |ui, viewport| { + let w = ui.available_width(); + let tile = (w - TILE_GAP * (COLUMNS - 1) as f32) / COLUMNS as f32; + let rows = self.items.len().div_ceil(COLUMNS); + let total = rows as f32 * (tile + TILE_GAP); + let origin = ui.min_rect().min; + ui.allocate_exact_size(vec2(w, total + 48.0), Sense::hover()); + let mut toggled = None; + for (i, item) in self.items.iter().enumerate() { + let local = Rect::from_min_size(pos2((i % COLUMNS) as f32 * (tile + TILE_GAP), (i / COLUMNS) as f32 * (tile + TILE_GAP)), vec2(tile, tile)); + if !local.intersects(viewport.expand(tile)) { + continue; + } + let rect = local.translate(origin.to_vec2()); + let attached = self.attached.contains(&item.token); + let order = self.selected.iter().position(|t| *t == item.token); + if tile_ui(ui, rect, item, self.kind, attached, order, cache) { + toggled = Some(item.token.clone()); + } + } + if let Some(token) = toggled { + self.toggle(token); + } + if self.items.is_empty() && !self.loading && !self.has_more { + ui.painter().text(origin + vec2(w / 2.0, 80.0), Align2::CENTER_CENTER, format!("No {noun} in your library yet"), FontId::new(14.0, egui::FontFamily::Proportional), theme::MUTED); + } + if self.loading { + icons::paint_spinner(ui, Rect::from_center_size(origin + vec2(w / 2.0, total + 24.0), vec2(24.0, 24.0)), theme::MUTED); + } else if self.has_more && viewport.max.y + 300.0 >= total { + actions.push(PickerAction::LoadMore); + } + }); + ui.add_space(12.0); + ui.horizontal(|ui| { + widgets::hud(ui, &format!("{}/{} selected", self.selected.len(), self.max), theme::MUTED); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + let any = !self.selected.is_empty(); + if ui.add_enabled_ui(any, |ui| widgets::button(ui, None, "Use selected", widgets::Kind::Primary, 0.0, theme::CONTROL_H)).inner.clicked() { + actions.push(PickerAction::Confirm(self.picks())); + } + if ui.add_enabled_ui(any, |ui| widgets::button(ui, None, "Deselect all", widgets::Kind::Secondary, 0.0, theme::CONTROL_H)).inner.clicked() { + self.selected.clear(); + } + }); + }); + }); + if close { + actions.push(PickerAction::Close); + } + actions + } + + fn toggle(&mut self, token: String) { + if let Some(i) = self.selected.iter().position(|t| *t == token) { + self.selected.remove(i); + } else if self.max == 1 { + self.selected = vec![token]; + } else if self.selected.len() < self.max { + self.selected.push(token); + } + } + + fn picks(&self) -> Vec { + self.selected.iter().filter_map(|t| self.items.iter().find(|i| i.token == *t)).map(|f| RefMedia::from_library(self.kind, f.token.clone(), f.media_links.thumbnail(256), Some(f.media_links.cdn_url.clone()), f.maybe_duration_millis.map_or(0.0, |ms| ms as f32 / 1000.0))).collect() + } +} + +/// One square tile; returns whether it was clicked (and is selectable). +fn tile_ui(ui: &mut egui::Ui, rect: Rect, item: &MediaFile, kind: RefKind, attached: bool, order: Option, cache: &mut MediaCache) -> bool { + let resp = ui.interact(rect, Id::new(("picker-tile", &item.token)), if attached { Sense::hover() } else { Sense::click() }); + let p = ui.painter(); + p.rect_filled(rect, 0.0, theme::fade(theme::CONTROLS, 0.6)); + match item.media_links.thumbnail(256).map(|u| cache.get(ui.ctx(), &u)) { + Some(Lookup::Ready(t)) => { + let image = egui::Image::new(&t).uv(cover_uv(t.size_vec2())); + let image = if attached { image.tint(Color32::from_gray(90)) } else { image }; + image.paint_at(ui, rect); + }, + _ => { + let icon = match kind { + RefKind::Image => Icon::Image, + RefKind::Video => Icon::Video, + RefKind::Audio => Icon::Music, + }; + icons::paint(ui.painter(), Rect::from_center_size(rect.center(), vec2(26.0, 26.0)), icon, theme::FAINT); + }, + } + if let Some(ms) = item.maybe_duration_millis.filter(|_| kind != RefKind::Image) { + let strip = Rect::from_min_max(pos2(rect.left(), rect.bottom() - 18.0), rect.max); + ui.painter().rect_filled(strip, 0.0, Color32::from_black_alpha(178)); + ui.painter().text(strip.center(), Align2::CENTER_CENTER, format!("{:.0}s", ms as f32 / 1000.0), FontId::new(11.0, theme::semibold()), Color32::WHITE); + } + let p = ui.painter(); + if attached { + p.text(rect.center(), Align2::CENTER_CENTER, "Attached", FontId::new(11.0, theme::semibold()), theme::fade(Color32::WHITE, 0.7)); + } else if let Some(i) = order { + p.rect_stroke(rect, 0.0, Stroke::new(2.0, theme::ACCENT_400), egui::StrokeKind::Inside); + let chip = Rect::from_min_size(rect.min + vec2(8.0, 8.0), vec2(22.0, 22.0)); + p.rect_filled(chip, theme::RADIUS, theme::ACCENT_400); + p.text(chip.center(), Align2::CENTER_CENTER, (i + 1).to_string(), FontId::new(11.0, theme::semibold()), Color32::WHITE); + } else if resp.hovered() { + p.rect_stroke(rect, 0.0, Stroke::new(2.0, theme::fade(theme::ACCENT_400, 0.6)), egui::StrokeKind::Inside); + } + !attached && resp.on_hover_cursor(egui::CursorIcon::PointingHand).clicked() +} diff --git a/artcraft-native/src/overlays/lightbox.rs b/artcraft-native/src/overlays/lightbox.rs new file mode 100644 index 0000000000..d0dc197111 --- /dev/null +++ b/artcraft-native/src/overlays/lightbox.rs @@ -0,0 +1,277 @@ +//! The lightbox (`lightbox-modal`): the media large on black, prev/next through the feed, and a +//! side column with the prompt, details and actions. + +use egui::{Align2, Color32, FontId, Id, Key, Rect, Sense, Ui, pos2, vec2}; + +use crate::backend::media_cache::{Lookup, MediaCache}; +use crate::backend::wire::Prompt; +use crate::feed::grid::ModelNames; +use crate::feed::types::{FeedItem, MediaKind}; +use crate::theme; +use crate::ui::icons::{self, Icon}; +use crate::ui::{creator_icons, widgets}; + +const SIDE_WIDTH: f32 = 280.0; + +pub struct Lightbox { + pub kind: MediaKind, + pub token: String, + confirm_delete: bool, + prompt_expanded: bool, +} + +#[derive(Debug, PartialEq)] +pub enum LightboxAction { + Close, + Navigate(String), + Recreate, + MakeVideo, + Download, + Share, + Delete, + CopyPrompt(String), + Play(String), +} + +impl Lightbox { + pub fn new(kind: MediaKind, token: String) -> Self { + Self { kind, token, confirm_delete: false, prompt_expanded: false } + } + + pub fn show(&mut self, ctx: &egui::Context, item: &FeedItem, order: &[String], prompt: Option<&Prompt>, names: &dyn ModelNames, cache: &mut MediaCache) -> Vec { + let mut actions = Vec::new(); + let screen = ctx.content_rect(); + let size = vec2((screen.width() - 80.0).min(1200.0), (screen.height() - 80.0).min(760.0)); + let index = order.iter().position(|t| *t == item.token); + let prev = index.and_then(|i| i.checked_sub(1)).map(|i| order[i].clone()); + let next = index.and_then(|i| order.get(i + 1)).cloned(); + + let typing = ctx.memory(|m| m.focused().is_some()); + if !typing && !self.confirm_delete { + let (left, right) = ctx.input(|i| (i.key_pressed(Key::ArrowLeft) || i.key_pressed(Key::ArrowUp), i.key_pressed(Key::ArrowRight) || i.key_pressed(Key::ArrowDown))); + if let (true, Some(t)) = (left, &prev) { + actions.push(LightboxAction::Navigate(t.clone())); + } + if let (true, Some(t)) = (right, &next) { + actions.push(LightboxAction::Navigate(t.clone())); + } + } + + let close = widgets::modal(ctx, Id::new("lightbox"), size.x, |ui| { + ui.set_height(size.y - 32.0); + ui.horizontal_top(|ui| { + let media_rect = Rect::from_min_size(ui.cursor().min, vec2(ui.available_width() - SIDE_WIDTH - 16.0, size.y - 32.0)); + ui.allocate_rect(media_rect, Sense::hover()); + self.media(ui, media_rect, item, cache, &prev, &next, &mut actions); + ui.add_space(16.0); + ui.vertical(|ui| { + ui.set_width(SIDE_WIDTH); + self.side(ui, item, prompt, names, cache, &mut actions); + }); + }); + }); + if close && !self.confirm_delete { + actions.push(LightboxAction::Close); + } + if self.confirm_delete { + self.confirm(ctx, &mut actions); + } + actions + } + + #[allow(clippy::too_many_arguments)] + fn media(&self, ui: &mut Ui, rect: Rect, item: &FeedItem, cache: &mut MediaCache, prev: &Option, next: &Option, actions: &mut Vec) { + ui.painter().rect_filled(rect, 0.0, Color32::BLACK); + let url = if item.kind == MediaKind::Image { Some(item.full_url.as_str()) } else { item.thumbnail.as_deref() }; + match url.map(|u| cache.get(ui.ctx(), u)) { + Some(Lookup::Ready(texture)) => { + let fit = fit_inside(texture.size_vec2(), rect.shrink(8.0).size()); + egui::Image::new(&texture).paint_at(ui, Rect::from_center_size(rect.center(), fit)); + }, + Some(Lookup::Loading) => { + // Show the thumbnail while the full image loads. + if let Some(Lookup::Ready(t)) = item.thumbnail.as_deref().map(|u| cache.get(ui.ctx(), u)) { + let fit = fit_inside(t.size_vec2(), rect.shrink(8.0).size()); + egui::Image::new(&t).paint_at(ui, Rect::from_center_size(rect.center(), fit)); + } + icons::paint_spinner(ui, Rect::from_center_size(rect.center(), vec2(32.0, 32.0)), theme::MUTED); + }, + _ => { + ui.painter().text(rect.center(), Align2::CENTER_CENTER, "Image not available", FontId::new(14.0, egui::FontFamily::Proportional), theme::FAINT); + }, + } + if item.kind == MediaKind::Video { + let play = Rect::from_center_size(rect.center(), vec2(72.0, 72.0)); + let resp = ui.interact(play, Id::new(("lightbox-play", &item.token)), Sense::click()).on_hover_text("Play in your video player").on_hover_cursor(egui::CursorIcon::PointingHand); + ui.painter().circle_filled(play.center(), 36.0, Color32::from_black_alpha(if resp.hovered() { 200 } else { 150 })); + icons::paint(ui.painter(), play.shrink(22.0).translate(vec2(3.0, 0.0)), Icon::Play, Color32::WHITE); + if resp.clicked() { + actions.push(LightboxAction::Play(item.full_url.clone())); + } + } + let hovering = ui.rect_contains_pointer(rect); + for (target, left, tip) in [(prev, true, "Previous item"), (next, false, "Next item")] { + let Some(token) = target else { + continue; + }; + let x = if left { rect.left() + 28.0 } else { rect.right() - 28.0 }; + let button = Rect::from_center_size(pos2(x, rect.center().y), vec2(40.0, 40.0)); + let resp = ui.interact(button, Id::new(("lightbox-nav", tip)), Sense::click()).on_hover_text(tip).on_hover_cursor(egui::CursorIcon::PointingHand); + if hovering || resp.hovered() { + ui.painter().circle_filled(button.center(), 20.0, Color32::from_black_alpha(if resp.hovered() { 210 } else { 140 })); + icons::paint(ui.painter(), button.shrink(11.0), if left { Icon::ChevronLeft } else { Icon::ChevronRight }, Color32::WHITE); + } + if resp.clicked() { + actions.push(LightboxAction::Navigate(token.clone())); + } + } + } + + fn side(&mut self, ui: &mut Ui, item: &FeedItem, prompt: Option<&Prompt>, names: &dyn ModelNames, cache: &mut MediaCache, actions: &mut Vec) { + ui.horizontal(|ui| { + widgets::hud(ui, item.kind.label(), theme::MUTED); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + if widgets::ghost(ui, Icon::X, None, "Close", false).clicked() { + actions.push(LightboxAction::Close); + } + }); + }); + ui.add_space(8.0); + let text = prompt.and_then(|p| p.maybe_positive_prompt.clone()).filter(|t| !t.is_empty()); + ui.horizontal(|ui| { + widgets::hud(ui, "Prompt", theme::FAINT); + if let Some(t) = &text { + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + if ui.add(egui::Button::new(egui::RichText::new("Copy").size(11.0)).frame(false)).on_hover_cursor(egui::CursorIcon::PointingHand).clicked() { + actions.push(LightboxAction::CopyPrompt(t.clone())); + } + }); + } + }); + match (&text, item.prompt_token.is_some(), prompt.is_some()) { + (Some(t), _, _) => { + let mut job = egui::text::LayoutJob::simple(t.clone(), FontId::new(13.0, egui::FontFamily::Proportional), theme::INK, ui.available_width()); + if !self.prompt_expanded { + job.wrap.max_rows = 4; + } + let galley = ui.painter().layout_job(job); + let clipped = galley.elided; + ui.label(galley); + if clipped || self.prompt_expanded { + let label = if self.prompt_expanded { "Hide" } else { "See all" }; + if ui.add(egui::Button::new(egui::RichText::new(label).size(11.5).color(theme::ACCENT_INK)).frame(false)).clicked() { + self.prompt_expanded = !self.prompt_expanded; + } + } + }, + (None, true, false) => { + let (rect, _) = ui.allocate_exact_size(vec2(16.0, 16.0), Sense::hover()); + icons::paint_spinner(ui, rect, theme::FAINT); + }, + _ => { + ui.label(egui::RichText::new("No prompt").size(13.0).color(theme::FAINT)); + }, + } + ui.add_space(14.0); + widgets::hud(ui, "Information", theme::FAINT); + ui.add_space(4.0); + if let Some(model) = item.model_id.as_deref() { + info_row(ui, "Model", |ui| { + let tex = creator_icons::texture(ui.ctx(), &names.creator(model)); + ui.add(egui::Image::new(&tex).tint(theme::INK).fit_to_exact_size(vec2(13.0, 13.0))); + ui.label(egui::RichText::new(names.display_name(model)).size(12.5)); + }); + } + if let Some(p) = prompt { + if let Some(ar) = &p.maybe_aspect_ratio { + info_row(ui, "Aspect Ratio", |ui| { + ui.label(egui::RichText::new(crate::models::aspect_label(ar)).size(12.5)); + }); + } + if let Some(res) = &p.maybe_resolution { + info_row(ui, "Resolution", |ui| { + ui.label(egui::RichText::new(crate::models::resolution_label(res)).size(12.5)); + }); + } + } + if let Some(d) = item.duration_secs { + info_row(ui, "Duration", |ui| { + ui.label(egui::RichText::new(format!("{d:.1}s")).size(12.5)); + }); + } + if let Some(Lookup::Ready(t)) = (item.kind == MediaKind::Image).then(|| cache.get(ui.ctx(), &item.full_url)) { + let s = t.size(); + info_row(ui, "Size", |ui| { + ui.label(egui::RichText::new(format!("{} \u{d7} {}", s[0], s[1])).size(12.5)); + }); + } + if let Some(created) = chrono::DateTime::from_timestamp(item.created_at, 0) { + let local = created.with_timezone(&chrono::Local); + info_row(ui, "Created", |ui| { + ui.label(egui::RichText::new(local.format("%b %-d, %Y %-I:%M:%S %p").to_string()).size(12.5)); + }); + } + + ui.add_space(16.0); + let w = (ui.available_width() - 8.0) / 2.0; + if item.prompt_token.is_some() && widgets::button(ui, Some(Icon::RotateCw), "Recreate", widgets::Kind::Primary, ui.available_width(), theme::CONTROL_H).clicked() { + actions.push(LightboxAction::Recreate); + } + ui.horizontal_wrapped(|ui| { + ui.spacing_mut().item_spacing = vec2(8.0, 8.0); + if item.kind == MediaKind::Image && widgets::button(ui, Some(Icon::Video), "Make Video", widgets::Kind::Accent, w, theme::CONTROL_H).clicked() { + actions.push(LightboxAction::MakeVideo); + } + if widgets::button(ui, Some(Icon::Download), "Download", widgets::Kind::Secondary, w, theme::CONTROL_H).clicked() { + actions.push(LightboxAction::Download); + } + if widgets::button(ui, Some(Icon::Link), "Share", widgets::Kind::Secondary, w, theme::CONTROL_H).clicked() { + actions.push(LightboxAction::Share); + } + if widgets::button(ui, Some(Icon::Trash), "Delete", widgets::Kind::Danger, w, theme::CONTROL_H).clicked() { + self.confirm_delete = true; + } + }); + } + + fn confirm(&mut self, ctx: &egui::Context, actions: &mut Vec) { + let mut choice = None; + let close = widgets::modal(ctx, Id::new("lightbox-delete"), 420.0, |ui| { + ui.label(widgets::heading("Delete this media?", 20.0)); + ui.add_space(8.0); + ui.label(egui::RichText::new("This will permanently remove the media from your library. This action cannot be undone.").color(theme::MUTED)); + ui.add_space(16.0); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + if widgets::button(ui, None, "Delete", widgets::Kind::Danger, 0.0, theme::CONTROL_H).clicked() { + choice = Some(true); + } + if widgets::button(ui, None, "Cancel", widgets::Kind::Secondary, 0.0, theme::CONTROL_H).clicked() { + choice = Some(false); + } + }); + }); + if close || choice.is_some() { + self.confirm_delete = false; + } + if choice == Some(true) { + actions.push(LightboxAction::Delete); + } + } +} + +fn info_row(ui: &mut Ui, label: &str, value: impl FnOnce(&mut Ui)) { + ui.horizontal(|ui| { + let (rect, _) = ui.allocate_exact_size(vec2(96.0, 20.0), Sense::hover()); + ui.painter().text(rect.left_center(), Align2::LEFT_CENTER, label, FontId::new(12.0, egui::FontFamily::Proportional), theme::MUTED); + value(ui); + }); +} + +/// The largest size with `content`'s aspect that fits in `bounds`. +pub fn fit_inside(content: egui::Vec2, bounds: egui::Vec2) -> egui::Vec2 { + if content.x <= 0.0 || content.y <= 0.0 { + return bounds; + } + let scale = (bounds.x / content.x).min(bounds.y / content.y); + content * scale +} diff --git a/artcraft-native/src/overlays/mod.rs b/artcraft-native/src/overlays/mod.rs new file mode 100644 index 0000000000..627ae6bd1c --- /dev/null +++ b/artcraft-native/src/overlays/mod.rs @@ -0,0 +1,3 @@ +pub mod account; +pub mod library_picker; +pub mod lightbox; diff --git a/artcraft-native/src/pages/common.rs b/artcraft-native/src/pages/common.rs new file mode 100644 index 0000000000..1d1f85d393 --- /dev/null +++ b/artcraft-native/src/pages/common.rs @@ -0,0 +1,345 @@ +//! What the create pages share: the page shell (`DesktopCreatePageShell`), uploading references, +//! cost-estimate bookkeeping and the app-level requests pages make. + +use std::path::{Path, PathBuf}; +use std::sync::Arc; + +use egui::{Align2, Color32, Id, Mesh, Order, Rect, Ui, pos2, vec2}; +use serde_json::{Map, Value}; + +use crate::backend::media_cache::MediaCache; +use crate::backend::{Backend, Modality, UploadedMedia}; +use crate::feed::grid::{self, FeedAction, FeedView, RatioCache, ViewMode}; +use crate::feed::store::FeedStore; +use crate::feed::types::MediaKind; +use crate::models::Catalog; +use crate::prompt_box; +use crate::prompt_box::refs::{ImageSlot, RefKind, RefMedia, RefStatus, References}; +use crate::theme; +use crate::ui::toast::Toasts; +use crate::ui::widgets; + +/// How long settings must sit still before a cost estimate is requested. +const COST_DEBOUNCE_SECS: f64 = 0.3; +/// Gap between the prompt box and the window's bottom edge (`bottom-4`). +const BOX_BOTTOM: f32 = 16.0; + +/// The app services a page can use this frame. +pub struct Env<'a> { + pub ctx: egui::Context, + pub backend: &'a Backend, + pub cache: &'a mut MediaCache, + pub toasts: &'a mut Toasts, + pub catalog: &'a Catalog, + pub signed_in: bool, + pub enter_to_generate: bool, + pub view_mode: ViewMode, + pub ratios: &'a mut RatioCache, + pub prompts: &'a std::collections::HashMap, + pub requests: &'a mut Vec, +} + +/// Things only the app can do. +#[derive(Debug)] +pub enum AppRequest { + SignIn, + Open { kind: MediaKind, token: String }, + PickFromLibrary { kind: RefKind, slot: ImageSlot, max: usize, page: MediaKind }, + MakeVideo { token: String }, + Recreate { kind: MediaKind, token: String }, + Share(String), + Download(Vec), + CopyText(String), + Preview(String), + LoadMoreLibrary(FeedKey), +} + +/// Which feed a library page is for. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum FeedKey { + Image, + Video, + Library, +} + +impl FeedKey { + pub fn of(kind: MediaKind) -> Self { + match kind { + MediaKind::Image => FeedKey::Image, + MediaKind::Video => FeedKey::Video, + } + } + + /// The library's media class filter. + pub fn media_classes(self) -> &'static str { + match self { + FeedKey::Image => "image", + FeedKey::Video => "video", + FeedKey::Library => "image,video", + } + } +} + +/// The page around the feed: the splash empty state (or the feed), a fade behind the prompt box, +/// and the prompt box (drawn by `prompt_box`) floating at the bottom centre. +#[allow(clippy::too_many_arguments)] +pub fn create_shell(ui: &mut Ui, env: &mut Env<'_>, kind: MediaKind, title: &str, subtitle: &str, feed: &mut FeedStore, box_height: &mut f32, prompt_box: impl FnOnce(&mut Ui, &mut Env<'_>)) { + let area = ui.max_rect(); + let bottom_offset = *box_height + 40.0; + if feed.has_content() { + let view = FeedView { id: Id::new(("feed", kind.label())), mode: env.view_mode, pending: &feed.pending, failed: &feed.failed, items: &feed.items, has_more: feed.has_more, loading: feed.loading, selecting: feed.selecting, selected: &feed.selected, last_viewed: feed.last_viewed.as_deref(), prompts: env.prompts, make_video: kind == MediaKind::Image, bottom_padding: bottom_offset + 24.0 }; + let mut feed_ui = ui.new_child(egui::UiBuilder::new().max_rect(area.shrink2(vec2(12.0, 0.0)))); + let actions = grid::show(&mut feed_ui, &view, env.cache, env.ratios, env.catalog); + handle_feed_actions(env, kind, feed, actions); + bottom_fade(ui, area); + } else { + empty_state(ui, env, area, bottom_offset, title, subtitle); + } + if env.signed_in && !feed.library_started() { + env.requests.push(AppRequest::LoadMoreLibrary(FeedKey::of(kind))); + } + if feed.selecting { + selection_bar(ui, area, *box_height + 32.0, feed, kind, env.requests); + } + + let width = (area.width() - 32.0).min(prompt_box::MAX_WIDTH); + let pos = pos2(area.center().x, area.bottom() - BOX_BOTTOM); + let response = egui::Area::new(Id::new(("prompt-box", kind.label()))).order(Order::Middle).pivot(Align2::CENTER_BOTTOM).fixed_pos(pos).show(ui.ctx(), |ui| { + ui.set_width(width); + prompt_box(ui, env); + }); + *box_height = response.response.rect.height(); +} + +fn handle_feed_actions(env: &mut Env<'_>, kind: MediaKind, feed: &mut FeedStore, actions: Vec) { + for action in actions { + match action { + FeedAction::Open(token) => { + feed.last_viewed = Some(token.clone()); + env.requests.push(AppRequest::Open { kind, token }); + }, + FeedAction::ToggleSelect(token) => { + if !feed.selected.remove(&token) { + feed.selected.insert(token); + } + }, + FeedAction::DismissFailed(job) => feed.dismiss(&job), + FeedAction::LoadMore => env.requests.push(AppRequest::LoadMoreLibrary(FeedKey::of(kind))), + FeedAction::Recreate(token) => env.requests.push(AppRequest::Recreate { kind, token }), + FeedAction::MakeVideo(token) => env.requests.push(AppRequest::MakeVideo { token }), + FeedAction::Share(token) => env.requests.push(AppRequest::Share(token)), + FeedAction::Download(token) => env.requests.push(AppRequest::Download(vec![token])), + FeedAction::CopyPrompt(text) => env.requests.push(AppRequest::CopyText(text)), + } + } +} + +/// The floating "N selected · Download · ×" pill (`SelectionActionBar`), `bottom` above the +/// window's bottom edge. +pub fn selection_bar(ui: &Ui, area: Rect, bottom: f32, feed: &mut FeedStore, kind: MediaKind, requests: &mut Vec) { + let pos = pos2(area.center().x, area.bottom() - bottom); + egui::Area::new(Id::new(("selection-bar", kind.label()))).order(Order::Foreground).pivot(Align2::CENTER_BOTTOM).fixed_pos(pos).show(ui.ctx(), |ui| { + egui::Frame::new().fill(theme::fade(theme::PANEL, 0.95)).stroke(theme::hairline()).corner_radius(egui::CornerRadius::same(24)).inner_margin(egui::Margin::symmetric(10, 8)).shadow(theme::shadow()).show(ui, |ui| { + ui.horizontal(|ui| { + ui.spacing_mut().item_spacing.x = 10.0; + ui.add_space(6.0); + ui.label(egui::RichText::new(format!("{} selected", feed.selected.len())).size(13.0).family(theme::medium())); + let any = !feed.selected.is_empty(); + if ui.add_enabled_ui(any, |ui| widgets::button(ui, Some(crate::ui::icons::Icon::Download), "Download", widgets::Kind::Secondary, 0.0, 30.0)).inner.clicked() { + requests.push(AppRequest::Download(feed.selected.iter().cloned().collect())); + } + if widgets::ghost(ui, crate::ui::icons::Icon::X, None, "Exit selection", false).clicked() { + feed.selecting = false; + feed.selected.clear(); + } + }); + }); + }); +} + +/// The splash: a bordered section with corner marks, the page title and a sign-in prompt for +/// visitors (`CreateEmptyState`). +fn empty_state(ui: &mut Ui, env: &mut Env<'_>, area: Rect, bottom_offset: f32, title: &str, subtitle: &str) { + let usable = Rect::from_min_max(area.min, pos2(area.right(), area.bottom() - bottom_offset)); + let width = (usable.width() - 64.0).min(768.0); + let height = if env.signed_in { 190.0 } else { 250.0 }; + let section = Rect::from_center_size(usable.center(), vec2(width, height)); + let p = ui.painter(); + p.rect(section, 0.0, Color32::from_rgba_unmultiplied(242, 241, 238, 4), egui::Stroke::new(1.0, Color32::from_rgba_unmultiplied(242, 241, 238, 51)), egui::StrokeKind::Inside); + widgets::corner_marks(p, section); + let mut child = ui.new_child(egui::UiBuilder::new().max_rect(section.shrink2(vec2(40.0, 52.0)))); + child.label(widgets::heading(title, 48.0)); + child.add_space(12.0); + child.label(egui::RichText::new(subtitle).size(16.0).color(theme::MUTED)); + if !env.signed_in { + child.add_space(24.0); + if widgets::button(&mut child, Some(crate::ui::icons::Icon::Sparkles), "Sign in to create", widgets::Kind::Primary, 0.0, 44.0).clicked() { + env.requests.push(AppRequest::SignIn); + } + } +} + +/// The 192 px fade behind the floating prompt box (`h-48 from-ui-background`). +fn bottom_fade(ui: &Ui, area: Rect) { + let band = Rect::from_min_max(pos2(area.left(), area.bottom() - 192.0), area.max); + let mut mesh = Mesh::default(); + let (top, bottom) = (Color32::TRANSPARENT, theme::BG); + mesh.colored_vertex(band.left_top(), top); + mesh.colored_vertex(band.right_top(), top); + mesh.colored_vertex(band.right_bottom(), bottom); + mesh.colored_vertex(band.left_bottom(), bottom); + mesh.add_triangle(0, 1, 2); + mesh.add_triangle(0, 2, 3); + // Same layer as the feed (painted after it), so it stays under the floating prompt box. + ui.painter().add(mesh); +} + +/// The selected model, else the page default, else the first. +pub fn selected_model<'a>(models: &'a [crate::models::ModelInfo], selected: Option<&str>, default_id: &str) -> Option<&'a crate::models::ModelInfo> { + selected.and_then(|id| models.iter().find(|m| m.id == id)).or_else(|| models.iter().find(|m| m.id == default_id)).or_else(|| models.first()) +} + +// --- References ------------------------------------------------------------------------------- + +/// Starts uploading `path` into `slot` (or the deck for videos and audio). +pub fn upload_path(env: &mut Env<'_>, refs: &mut References, path: &Path, kind: RefKind, slot: ImageSlot) { + if kind == RefKind::Video && !path.extension().and_then(|e| e.to_str()).is_some_and(|e| e.eq_ignore_ascii_case("mp4")) { + env.toasts.error("Failed to upload video. Please upload an MP4 file."); + return; + } + let mut item = RefMedia::uploading(kind, None); + if kind == RefKind::Image { + let key = format!("local://{}", item.id); + match std::fs::read(path) { + Ok(bytes) => { + env.cache.insert_bytes(&env.ctx, &key, Arc::from(bytes)); + item.preview = Some(key); + }, + Err(err) => { + env.toasts.error(format!("Couldn't read {}: {err}", file_name(path))); + return; + }, + } + } + env.backend.upload_file(item.id, kind, path.to_path_buf()); + place(refs, item, slot); +} + +/// Uploads a pasted image (PNG bytes) into `slot`. +pub fn upload_png(env: &mut Env<'_>, refs: &mut References, png: Vec, slot: ImageSlot) { + let mut item = RefMedia::uploading(RefKind::Image, None); + let key = format!("local://{}", item.id); + env.cache.insert_bytes(&env.ctx, &key, Arc::from(png.clone())); + item.preview = Some(key); + env.backend.upload_png(item.id, png); + place(refs, item, slot); +} + +fn place(refs: &mut References, item: RefMedia, slot: ImageSlot) { + match (item.kind, slot) { + (RefKind::Image, ImageSlot::FirstFrame) => refs.first_frame = Some(item), + (RefKind::Image, ImageSlot::LastFrame) => refs.last_frame = Some(item), + (kind, _) => refs.list_mut(kind).push(item), + } +} + +/// Applies a finished upload. Returns `false` (and drops the reference) when it failed. +pub fn apply_upload(toasts: &mut Toasts, refs: &mut References, ref_id: u64, result: Result) -> bool { + match result { + Ok(media) => { + if let Some(r) = refs.find_mut(ref_id) { + r.status = RefStatus::Ready; + r.token = Some(media.token); + r.duration_secs = media.duration_secs; + r.full_url = media.full_url; + if r.preview.is_none() { + r.preview = media.thumbnail; + } + } + true + }, + Err(message) => { + let kind = refs.find_mut(ref_id).map_or("file", |r| r.kind.noun()); + refs.remove(ref_id); + toasts.error(format!("Failed to upload {kind}: {message}")); + false + }, + } +} + +/// Picked library media, ready to attach. +pub fn attach_from_library(refs: &mut References, kind: RefKind, slot: ImageSlot, picks: Vec) { + for pick in picks { + let already = refs.list(kind).iter().chain(refs.first_frame.iter()).chain(refs.last_frame.iter()).any(|r| r.token == pick.token); + if !already { + place(refs, RefMedia { kind, ..pick }, slot); + } + } +} + +/// Asks the user for files of `kinds` (`multiple` for decks). +pub fn pick_files(kinds: &[RefKind], multiple: bool) -> Vec { + let mut dialog = rfd::FileDialog::new(); + for kind in kinds { + let (name, exts): (&str, &[&str]) = match kind { + RefKind::Image => ("Images", &["png", "jpg", "jpeg", "webp", "gif", "bmp", "avif"]), + RefKind::Video => ("Videos (MP4)", &["mp4"]), + RefKind::Audio => ("Audio", &["mp3", "wav", "ogg", "flac", "aac", "m4a", "opus"]), + }; + dialog = dialog.add_filter(name, exts); + } + if multiple { + dialog.pick_files().unwrap_or_default() + } else { + dialog.pick_file().into_iter().collect() + } +} + +pub fn file_name(path: &Path) -> String { + path.file_name().and_then(|n| n.to_str()).unwrap_or("file").to_owned() +} + +// --- Cost estimates --------------------------------------------------------------------------- + +/// The latest cost estimate for a page, requested when the settings settle. +#[derive(Default)] +pub struct CostState { + /// The request the estimate below is for. + key: String, + pub credits: Option, + pending_key: Option<(String, f64)>, +} + +impl CostState { + /// Requests an estimate for `fields` once they've been stable for a moment. + pub fn update(&mut self, ui: &Ui, backend: &Backend, modality: Modality, fields: &Map) { + let key = Value::Object(fields.clone()).to_string(); + if key == self.key { + return; + } + let now = ui.input(|i| i.time); + match &self.pending_key { + Some((k, since)) if *k == key => { + if now - since >= COST_DEBOUNCE_SECS { + self.key = key.clone(); + self.credits = None; + self.pending_key = None; + backend.estimate_cost(modality, key, fields.clone()); + } else { + ui.ctx().request_repaint_after(std::time::Duration::from_secs_f64(COST_DEBOUNCE_SECS)); + } + }, + _ => { + self.pending_key = Some((key, now)); + ui.ctx().request_repaint_after(std::time::Duration::from_secs_f64(COST_DEBOUNCE_SECS)); + }, + } + } + + /// Takes an estimate that arrived for `key`. + pub fn apply(&mut self, key: &str, credits: Option) { + if key == self.key { + self.credits = credits; + } + } +} diff --git a/artcraft-native/src/pages/create_image.rs b/artcraft-native/src/pages/create_image.rs new file mode 100644 index 0000000000..74fb0f5800 --- /dev/null +++ b/artcraft-native/src/pages/create_image.rs @@ -0,0 +1,283 @@ +//! Create Image (`TextToImage` + `PromptBoxImage`): prompt, reference images, model, aspect +//! ratio, resolution, quality and count; the cost; and the image feed. + +use egui::{Id, Ui}; +use serde::{Deserialize, Serialize}; +use serde_json::{Map, Value, json}; + +use crate::backend::wire::Prompt; +use crate::backend::{EnqueueMeta, Modality}; +use crate::feed::store::FeedStore; +use crate::feed::types::MediaKind; +use crate::models::{DEFAULT_IMAGE_MODEL, DEFAULT_PROMPT_MAX, ModelInfo}; +use crate::pages::common::{self, AppRequest, CostState, Env}; +use crate::pages::toolbar; +use crate::prompt_box::deck::{DeckAction, DeckLimits}; +use crate::prompt_box::model_selector::model_selector; +use crate::prompt_box::refs::{ImageSlot, RefKind, RefMedia, References}; +use crate::prompt_box::{self, DeckMode, PromptBoxAction, PromptBoxProps, PromptBoxState, editor}; + +const PLACEHOLDER: &str = "Describe what you want in the image..."; + +/// What the page remembers between launches. +#[derive(Clone, Debug, Default, Serialize, Deserialize)] +#[serde(default)] +pub struct ImageSettings { + pub prompt: String, + pub model: Option, + pub aspect_ratio: Option, + pub resolution: Option, + pub quality: Option, + pub count: u16, +} + +#[derive(Default)] +pub struct CreateImagePage { + pub settings: ImageSettings, + pub refs: References, + pub feed: FeedStore, + pub cost: CostState, + pub generating: bool, + box_state: PromptBoxState, + box_height: f32, +} + +impl CreateImagePage { + pub fn new(settings: ImageSettings) -> Self { + let mut page = Self { settings, box_height: 140.0, ..Default::default() }; + page.box_state.editor.focus_requested = true; + page + } + + pub fn ui(&mut self, ui: &mut Ui, env: &mut Env<'_>) { + let models = &env.catalog.image_page; + let model = common::selected_model(models, self.settings.model.as_deref(), DEFAULT_IMAGE_MODEL).cloned(); + if let Some(m) = &model { + self.reconcile(m); + let fields = self.fields(m, true); + self.cost.update(ui, env.backend, Modality::Image, &fields); + } + let mut feed = std::mem::take(&mut self.feed); + let mut box_height = self.box_height; + common::create_shell(ui, env, MediaKind::Image, "Create Image", "Add a prompt, then generate", &mut feed, &mut box_height, |ui, env| self.prompt_box(ui, env, model.as_ref())); + self.feed = feed; + self.box_height = box_height; + } + + fn prompt_box(&mut self, ui: &mut Ui, env: &mut Env<'_>, model: Option<&ModelInfo>) { + let max_images = model.map_or(0, |m| m.image_refs_max); + let deck = if max_images > 0 { DeckMode::References(DeckLimits { max_images, max_videos: 0, max_video_secs: None, max_audios: 0, max_audio_secs: None, library: env.signed_in }) } else { DeckMode::None }; + let accepts: &[RefKind] = if max_images > 0 { &[RefKind::Image] } else { &[] }; + let prompt_max = model.map_or(Some(DEFAULT_PROMPT_MAX), |m| m.prompt_max); + let props = PromptBoxProps { id: Id::new("image-prompt-box"), placeholder: PLACEHOLDER, enter_to_generate: env.enter_to_generate, mentions: &[], max_length: Some(prompt_max), deck, accepts, credits: self.cost.credits, generate_enabled: !self.settings.prompt.trim().is_empty() && model.is_some(), generating: self.generating, generate_tooltip: "Generate", warning: None, banner: None }; + let models = &env.catalog.image_page; + let settings = &mut self.settings; + let mut picked_model = None; + let mut left = |ui: &mut Ui| { + if let Some(id) = model_selector(ui, Id::new("image-model"), models, model, false) { + picked_model = Some(id); + } + let Some(m) = model else { + return; + }; + let aspect = ModelInfo::resolve(settings.aspect_ratio.as_deref(), &m.aspect_ratios, m.aspect_default.as_ref()); + if let Some(v) = toolbar::aspect_ratio(ui, Id::new("image-aspect"), m, aspect.as_deref().unwrap_or("")) { + settings.aspect_ratio = Some(v); + } + let resolution = ModelInfo::resolve(settings.resolution.as_deref(), &m.resolutions, m.resolution_default.as_ref()); + if let Some(v) = toolbar::resolution(ui, Id::new("image-resolution"), m, resolution.as_deref().unwrap_or("")) { + settings.resolution = Some(v); + } + let quality = ModelInfo::resolve(settings.quality.as_deref(), &m.qualities, m.quality_default.as_ref()); + if let Some(v) = toolbar::quality(ui, Id::new("image-quality"), m, quality.as_deref().unwrap_or("")) { + settings.quality = Some(v); + } + }; + let count = settings.count; + let mut picked_count = None; + let mut right = |ui: &mut Ui| { + if let Some(m) = model { + picked_count = toolbar::count(ui, Id::new("image-count"), m, count, "images"); + } + }; + let actions = prompt_box::show(ui, &mut settings.prompt, &self.refs, &mut self.box_state, &props, env.cache, &mut left, &mut right); + if let Some(id) = picked_model { + self.settings.model = Some(id); + } + if let Some(n) = picked_count { + self.settings.count = n; + } + for action in actions { + self.handle(action, env, model, max_images); + } + } + + fn handle(&mut self, action: PromptBoxAction, env: &mut Env<'_>, model: Option<&ModelInfo>, max_images: usize) { + match action { + PromptBoxAction::Generate => self.generate(env, model), + PromptBoxAction::ClearAll => { + self.settings.prompt.clear(); + self.refs.clear(); + }, + PromptBoxAction::Deck(deck) => match deck { + DeckAction::Upload { .. } => { + let free = max_images.saturating_sub(self.refs.images.len()); + for path in common::pick_files(&[RefKind::Image], free > 1).into_iter().take(free) { + common::upload_path(env, &mut self.refs, &path, RefKind::Image, ImageSlot::Reference); + } + }, + DeckAction::Library { kind, slot } => { + env.requests.push(AppRequest::PickFromLibrary { kind, slot, max: max_images.saturating_sub(self.refs.images.len()).max(1), page: MediaKind::Image }); + }, + DeckAction::Remove(id) => self.refs.remove(id), + DeckAction::ClearAll => self.refs.images.clear(), + DeckAction::ReorderImages { from, to } => { + let item = self.refs.images.remove(from); + self.refs.images.insert(to.min(self.refs.images.len()), item); + }, + DeckAction::Preview(id) => { + if let Some(url) = self.refs.find_mut(id).and_then(|r| r.full_url.clone().or_else(|| r.preview.clone())) { + env.requests.push(AppRequest::Preview(url)); + } + }, + DeckAction::SwapFrames => {}, + }, + PromptBoxAction::DroppedFiles(paths) => self.add_dropped(env, &paths, max_images), + PromptBoxAction::PastedImage(png) => { + if self.refs.images.len() >= max_images { + env.toasts.error(max_images_message(max_images)); + } else { + common::upload_png(env, &mut self.refs, png, ImageSlot::Reference); + } + }, + } + } + + /// Routes dropped files: images into the deck (up to the model's limit); others get a note. + fn add_dropped(&mut self, env: &mut Env<'_>, paths: &[std::path::PathBuf], max_images: usize) { + let kinds: Vec> = paths.iter().map(|p| RefKind::from_path(p)).collect(); + let images: Vec<&std::path::PathBuf> = paths.iter().zip(&kinds).filter(|(_, k)| **k == Some(RefKind::Image)).map(|(p, _)| p).collect(); + let has_video = kinds.contains(&Some(RefKind::Video)); + let has_audio = kinds.contains(&Some(RefKind::Audio)); + if has_video || has_audio { + let what = match (has_video, has_audio) { + (true, true) => "Video or audio", + (true, false) => "Video", + _ => "Audio", + }; + env.toasts.error(format!("{what} references aren't available here")); + } else if images.is_empty() { + env.toasts.error("Only image files can be added here"); + } + if images.is_empty() { + return; + } + let free = max_images.saturating_sub(self.refs.images.len()); + if free == 0 { + env.toasts.error(max_images_message(max_images)); + return; + } + for path in images.into_iter().take(free) { + common::upload_path(env, &mut self.refs, path, RefKind::Image, ImageSlot::Reference); + } + } + + fn generate(&mut self, env: &mut Env<'_>, model: Option<&ModelInfo>) { + if self.generating || self.settings.prompt.trim().is_empty() { + return; + } + let Some(model) = model else { + return; + }; + if !env.signed_in { + env.requests.push(AppRequest::SignIn); + return; + } + let limit = model.prompt_max; + if editor::is_over_limit(&self.settings.prompt, limit) { + env.toasts.error(format!("Prompt exceeds the {} character limit for this model", limit.unwrap_or_default())); + return; + } + if self.refs.any_uploading() { + env.toasts.error("Please wait for your references to finish uploading"); + return; + } + self.generating = true; + let meta = EnqueueMeta { prompt: self.settings.prompt.clone(), model_id: model.id.clone(), batch_count: u32::from(self.settings.count.max(1)), ref_image: self.refs.images.first().and_then(|r| r.preview.clone()) }; + env.backend.generate(Modality::Image, self.fields(model, false), meta); + } + + /// The OmniGen request (`GenerateImageRequest` after `api_fields`). `estimate` swaps + /// still-uploading references for placeholders so the cost reflects them. + fn fields(&self, model: &ModelInfo, estimate: bool) -> Map { + let mut f = Map::new(); + f.insert("model".into(), json!(model.id)); + f.insert("prompt".into(), json!(self.settings.prompt)); + f.insert("image_batch_count".into(), json!(model.valid_batch(self.settings.count))); + if let Some(v) = ModelInfo::resolve(self.settings.aspect_ratio.as_deref(), &model.aspect_ratios, model.aspect_default.as_ref()) { + f.insert("aspect_ratio".into(), json!(v)); + } + if !model.resolutions.is_empty() { + if let Some(v) = ModelInfo::resolve(self.settings.resolution.as_deref(), &model.resolutions, model.resolution_default.as_ref()) { + f.insert("resolution".into(), json!(v)); + } + } + if !model.qualities.is_empty() { + if let Some(v) = ModelInfo::resolve(self.settings.quality.as_deref(), &model.qualities, model.quality_default.as_ref()) { + f.insert("quality".into(), json!(v)); + } + } + if model.image_refs_max > 0 && !self.refs.images.is_empty() { + let tokens: Vec = self.refs.images.iter().enumerate().filter_map(|(i, r)| r.token.clone().or_else(|| estimate.then(|| format!("mf_estimate_{i}")))).collect(); + if !tokens.is_empty() { + f.insert("image_media_tokens".into(), json!(tokens)); + } + } + if estimate { + f.remove("prompt"); + } + f + } + + /// Keeps the count valid for the model (`isValidGenerationCount`). + fn reconcile(&mut self, model: &ModelInfo) { + let count = model.valid_batch(self.settings.count); + if count != self.settings.count { + self.settings.count = count; + } + } + + pub fn on_enqueued(&mut self, env: &mut Env<'_>, job_tokens: &[String], meta: &EnqueueMeta) { + self.generating = false; + self.feed.add_enqueued(MediaKind::Image, job_tokens, meta, env.catalog); + env.toasts.success("Image generation enqueued!"); + } + + pub fn on_enqueue_failed(&mut self, env: &mut Env<'_>, message: &str) { + self.generating = false; + env.toasts.error(if message.is_empty() { "Failed to start image generation. Please try again." } else { message }); + } + + /// Recreate: the original prompt, model, settings and reference images. + pub fn apply_prompt(&mut self, prompt: &Prompt) { + self.settings.prompt = prompt.maybe_positive_prompt.clone().unwrap_or_default(); + if let Some(model) = &prompt.maybe_model_type { + self.settings.model = Some(model.clone()); + } + if prompt.maybe_aspect_ratio.is_some() { + self.settings.aspect_ratio = prompt.maybe_aspect_ratio.clone(); + } + if prompt.maybe_resolution.is_some() { + self.settings.resolution = prompt.maybe_resolution.clone(); + } + if let Some(count) = prompt.maybe_batch_count { + self.settings.count = count; + } + self.refs.images = prompt.maybe_context_images.iter().flatten().filter(|c| !matches!(c.semantic.as_str(), "vid_end_frame" | "vid_ref" | "audioref")).map(|c| RefMedia::from_library(RefKind::Image, c.media_token.clone(), c.media_links.thumbnail(256), Some(c.media_links.cdn_url.clone()), 0.0)).collect(); + self.box_state.editor.focus_requested = true; + } +} + +fn max_images_message(max: usize) -> String { + format!("Max {max} image reference{}", if max == 1 { "" } else { "s" }) +} diff --git a/artcraft-native/src/pages/create_video.rs b/artcraft-native/src/pages/create_video.rs new file mode 100644 index 0000000000..ef0f76a614 --- /dev/null +++ b/artcraft-native/src/pages/create_video.rs @@ -0,0 +1,541 @@ +//! Create Video (`ImageToVideo` + `PromptBoxVideo`): keyframe or omni-reference input, the +//! model's pickers (aspect ratio, resolution, bitrate, format, duration, sound, count), the cost, +//! and the video feed. + +use std::path::PathBuf; + +use egui::{Id, Ui}; +use serde::{Deserialize, Serialize}; +use serde_json::{Map, Value, json}; + +use crate::backend::wire::Prompt; +use crate::backend::{EnqueueMeta, Modality}; +use crate::feed::store::FeedStore; +use crate::feed::types::MediaKind; +use crate::models::{self, DEFAULT_PROMPT_MAX, DEFAULT_VIDEO_MODEL, ModelInfo}; +use crate::pages::common::{self, AppRequest, CostState, Env}; +use crate::pages::toolbar; +use crate::prompt_box::deck::{DeckAction, DeckLimits}; +use crate::prompt_box::editor::{self, MentionItem, MentionKind}; +use crate::prompt_box::model_selector::model_selector; +use crate::prompt_box::pickers::{self, PickOption, Trigger}; +use crate::prompt_box::refs::{ImageSlot, RefKind, RefMedia, References}; +use crate::prompt_box::{self, DeckMode, PromptBoxAction, PromptBoxProps, PromptBoxState}; +use crate::ui::icons::Icon; +use crate::ui::widgets::Leading; + +const PLACEHOLDER: &str = "Describe what you want to happen in the video..."; +const PLACEHOLDER_REFERENCE: &str = "Use @Image1, @Video1, @Audio1... to reference uploads in prompt..."; +const TEXT_ONLY_BANNER: &str = "This model can't generate from text alone - add a starting frame to animate your prompt."; + +/// How the user steers the video: first/last frames, or a mix of reference media. +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Serialize, Deserialize)] +pub enum InputMode { + Keyframe, + #[default] + Reference, +} + +/// What the page remembers between launches. +#[derive(Clone, Debug, Serialize, Deserialize)] +#[serde(default)] +pub struct VideoSettings { + pub prompt: String, + pub model: Option, + pub aspect_ratio: Option, + pub resolution: Option, + pub bitrate: Option, + pub output_format: Option, + pub duration: Option, + pub generate_audio: bool, + pub input_mode: InputMode, + pub count: u16, +} + +impl Default for VideoSettings { + fn default() -> Self { + Self { prompt: String::new(), model: None, aspect_ratio: None, resolution: None, bitrate: None, output_format: None, duration: None, generate_audio: true, input_mode: InputMode::Reference, count: 1 } + } +} + +#[derive(Default)] +pub struct CreateVideoPage { + pub settings: VideoSettings, + pub refs: References, + pub feed: FeedStore, + pub cost: CostState, + pub generating: bool, + box_state: PromptBoxState, + box_height: f32, +} + +impl CreateVideoPage { + pub fn new(settings: VideoSettings) -> Self { + let mut page = Self { settings, box_height: 140.0, ..Default::default() }; + page.box_state.editor.focus_requested = true; + page + } + + pub fn ui(&mut self, ui: &mut Ui, env: &mut Env<'_>) { + let model = common::selected_model(&env.catalog.video_page, self.settings.model.as_deref(), DEFAULT_VIDEO_MODEL).cloned(); + if let Some(m) = &model { + self.reconcile(m); + let fields = self.fields(m, true); + self.cost.update(ui, env.backend, Modality::Video, &fields); + } + let mut feed = std::mem::take(&mut self.feed); + let mut box_height = self.box_height; + common::create_shell(ui, env, MediaKind::Video, "Create Video", "Choose an image, add a prompt, then generate", &mut feed, &mut box_height, |ui, env| self.prompt_box(ui, env, model.as_ref())); + self.feed = feed; + self.box_height = box_height; + } + + fn prompt_box(&mut self, ui: &mut Ui, env: &mut Env<'_>, model: Option<&ModelInfo>) { + let mode = self.settings.input_mode; + let reference = mode == InputMode::Reference; + let limits = model.map(|m| deck_limits(m, env.signed_in)); + let deck = match (model, mode) { + (Some(m), InputMode::Keyframe) if m.start_frame => DeckMode::Keyframes { show_last: m.end_frame, library: env.signed_in }, + (Some(_), InputMode::Reference) => limits.clone().map_or(DeckMode::None, DeckMode::References), + _ => DeckMode::None, + }; + let accepts: Vec = match (&deck, model) { + (DeckMode::Keyframes { .. }, _) => vec![RefKind::Image], + (DeckMode::References(l), _) => [(RefKind::Image, l.max_images), (RefKind::Video, l.max_videos), (RefKind::Audio, l.max_audios)].into_iter().filter(|(_, n)| *n > 0).map(|(k, _)| k).collect(), + _ => Vec::new(), + }; + let mentions = if reference { self.mentions() } else { Vec::new() }; + let needs_start = model.is_some_and(|m| self.needs_start_frame(m)); + let banner = model.filter(|m| !m.text_to_video && !self.has_image_input()).map(|_| TEXT_ONLY_BANNER); + let props = PromptBoxProps { id: Id::new("video-prompt-box"), placeholder: if reference { PLACEHOLDER_REFERENCE } else { PLACEHOLDER }, enter_to_generate: env.enter_to_generate, mentions: &mentions, max_length: Some(model.map_or(Some(DEFAULT_PROMPT_MAX), |m| m.prompt_max)), deck, accepts: &accepts, credits: self.cost.credits, generate_enabled: !self.settings.prompt.trim().is_empty() && model.is_some() && !needs_start, generating: self.generating, generate_tooltip: if needs_start { "Add a starting image before generating" } else { "Generate" }, warning: needs_start.then_some("Starting frame required"), banner }; + + let models = &env.catalog.video_page; + let mut prompt = std::mem::take(&mut self.settings.prompt); + let count = self.settings.count; + let settings = &mut self.settings; + let with_refs = reference && !self.refs.images.is_empty(); + let mut picked_model = None; + let mut picked_mode = None; + let mut left = |ui: &mut Ui| { + if let Some(id) = model_selector(ui, Id::new("video-model"), models, model, true) { + picked_model = Some(id); + } + if let Some(m) = model { + picked_mode = video_toolbar(ui, m, settings, with_refs).or(picked_mode); + } + }; + let mut picked_count = None; + let mut right = |ui: &mut Ui| { + if let Some(m) = model { + picked_count = toolbar::count(ui, Id::new("video-count"), m, count, "videos"); + } + }; + let actions = prompt_box::show(ui, &mut prompt, &self.refs, &mut self.box_state, &props, env.cache, &mut left, &mut right); + self.settings.prompt = prompt; + if let Some(id) = picked_model { + self.settings.model = Some(id); + } + if let Some(n) = picked_count { + self.settings.count = n; + } + if let Some(mode) = picked_mode { + switch_mode(&mut self.settings, &mut self.refs, mode); + } + for action in actions { + self.handle(action, env, model, limits.as_ref()); + } + } + + fn handle(&mut self, action: PromptBoxAction, env: &mut Env<'_>, model: Option<&ModelInfo>, limits: Option<&DeckLimits>) { + match action { + PromptBoxAction::Generate => self.generate(env, model), + PromptBoxAction::ClearAll => { + self.settings.prompt.clear(); + self.refs.clear(); + }, + PromptBoxAction::Deck(deck) => match deck { + DeckAction::Upload { kinds, slot } => { + let multiple = slot == ImageSlot::Reference; + let paths = common::pick_files(&kinds, multiple); + self.add_files(env, &paths, slot, limits); + }, + DeckAction::Library { kind, slot } => { + let max = match slot { + ImageSlot::Reference => limits.map_or(1, |l| free_slots(&self.refs, kind, l)).max(1), + _ => 1, + }; + env.requests.push(AppRequest::PickFromLibrary { kind, slot, max, page: MediaKind::Video }); + }, + DeckAction::Remove(id) => self.refs.remove(id), + DeckAction::ClearAll => { + self.refs.images.clear(); + self.refs.videos.clear(); + self.refs.audios.clear(); + }, + DeckAction::ReorderImages { from, to } => { + let item = self.refs.images.remove(from); + self.refs.images.insert(to.min(self.refs.images.len()), item); + }, + DeckAction::Preview(id) => { + if let Some(url) = self.refs.find_mut(id).and_then(|r| r.full_url.clone().or_else(|| r.preview.clone())) { + env.requests.push(AppRequest::Preview(url)); + } + }, + DeckAction::SwapFrames => self.refs.swap_frames(), + }, + PromptBoxAction::DroppedFiles(paths) => self.add_files(env, &paths, ImageSlot::Reference, limits), + PromptBoxAction::PastedImage(png) => match self.settings.input_mode { + InputMode::Keyframe => match self.free_keyframe(model) { + Some(slot) => common::upload_png(env, &mut self.refs, png, slot), + None => env.toasts.error(frames_full_message(model)), + }, + InputMode::Reference => { + if limits.is_some_and(|l| free_slots(&self.refs, RefKind::Image, l) > 0) { + common::upload_png(env, &mut self.refs, png, ImageSlot::Reference); + } else { + env.toasts.error(max_message(RefKind::Image, limits.map_or(0, |l| l.max_images), None)); + } + }, + }, + } + } + + /// Routes picked or dropped files (`handleDroppedFiles`): keyframe mode fills the first frame, + /// then the last; reference mode adds each kind up to its limit. + fn add_files(&mut self, env: &mut Env<'_>, paths: &[PathBuf], slot: ImageSlot, limits: Option<&DeckLimits>) { + let model = common::selected_model(&env.catalog.video_page, self.settings.model.as_deref(), DEFAULT_VIDEO_MODEL).cloned(); + for path in paths { + let Some(kind) = RefKind::from_path(path) else { + env.toasts.error(format!("{} isn't a supported file", common::file_name(path))); + continue; + }; + match (self.settings.input_mode, kind) { + (InputMode::Keyframe, RefKind::Image) => { + let target = if slot == ImageSlot::Reference { self.free_keyframe(model.as_ref()) } else { Some(slot) }; + match target { + Some(slot) => common::upload_path(env, &mut self.refs, path, kind, slot), + None => env.toasts.error(frames_full_message(model.as_ref())), + } + }, + (InputMode::Keyframe, _) => env.toasts.error(format!("{} references aren't available here", if kind == RefKind::Video { "Video" } else { "Audio" })), + (InputMode::Reference, _) => { + let Some(l) = limits else { + continue; + }; + let max = match kind { + RefKind::Image => l.max_images, + RefKind::Video => l.max_videos, + RefKind::Audio => l.max_audios, + }; + if max == 0 { + env.toasts.error(format!("{}{} references aren't available here", kind.noun()[..1].to_uppercase(), &kind.noun()[1..])); + } else if free_slots(&self.refs, kind, l) == 0 { + let secs = if kind == RefKind::Video { l.max_video_secs } else { l.max_audio_secs }; + env.toasts.error(max_message(kind, max, secs.filter(|_| kind != RefKind::Image))); + } else { + common::upload_path(env, &mut self.refs, path, kind, ImageSlot::Reference); + } + }, + } + } + } + + /// After an upload lands: enforce the model's total-duration limits. + pub fn check_durations(&mut self, env: &mut Env<'_>, ref_id: u64) { + let Some(model) = common::selected_model(&env.catalog.video_page, self.settings.model.as_deref(), DEFAULT_VIDEO_MODEL) else { + return; + }; + for (kind, max) in [(RefKind::Video, model.video_refs_max_secs), (RefKind::Audio, model.audio_refs_max_secs)] { + let Some(max) = max else { + continue; + }; + if self.refs.list(kind).iter().any(|r| r.id == ref_id) && self.refs.total_secs(kind) > f32::from(max) + 0.5 { + self.refs.remove(ref_id); + env.toasts.error(format!("Total {} duration cannot exceed {max}s", kind.noun())); + } + } + } + + fn generate(&mut self, env: &mut Env<'_>, model: Option<&ModelInfo>) { + if self.generating { + return; + } + if self.settings.prompt.trim().is_empty() { + env.toasts.error("Please enter a prompt to generate video"); + return; + } + let Some(model) = model else { + env.toasts.error("Please select a model to generate video"); + return; + }; + if !env.signed_in { + env.requests.push(AppRequest::SignIn); + return; + } + let limit = model.prompt_max; + if editor::is_over_limit(&self.settings.prompt, limit) { + env.toasts.error(format!("Prompt exceeds the {} character limit for this model", limit.unwrap_or_default())); + return; + } + if self.needs_start_frame(model) { + env.toasts.error("Please add a starting frame image to generate video"); + return; + } + if self.refs.any_uploading() { + env.toasts.error("Please wait for your references to finish uploading"); + return; + } + self.generating = true; + let ref_image = self.refs.first_frame.as_ref().or(self.refs.images.first()).and_then(|r| r.preview.clone()); + let meta = EnqueueMeta { prompt: self.settings.prompt.clone(), model_id: model.id.clone(), batch_count: u32::from(model.valid_batch(self.settings.count)), ref_image }; + env.backend.generate(Modality::Video, self.fields(model, false), meta); + } + + /// The OmniGen request (`GenerateVideoRequest` after `api_fields`). + fn fields(&self, m: &ModelInfo, estimate: bool) -> Map { + let s = &self.settings; + let mut f = Map::new(); + f.insert("model".into(), json!(m.id)); + if !estimate { + f.insert("prompt".into(), json!(s.prompt)); + } + let resolved = [("aspect_ratio", ModelInfo::resolve(s.aspect_ratio.as_deref(), &m.aspect_ratios, m.aspect_default.as_ref())), ("resolution", ModelInfo::resolve(s.resolution.as_deref(), &m.resolutions, m.resolution_default.as_ref()).filter(|_| !m.resolutions.is_empty())), ("bitrate", ModelInfo::resolve(s.bitrate.as_deref(), &m.bitrates, m.bitrate_default.as_ref()).filter(|_| !m.bitrates.is_empty())), ("output_format", ModelInfo::resolve(s.output_format.as_deref(), &m.output_formats, m.output_format_default.as_ref()).filter(|_| !m.output_formats.is_empty()))]; + for (key, value) in resolved { + if let Some(v) = value { + f.insert(key.into(), json!(v)); + } + } + let reference = s.input_mode == InputMode::Reference; + if let Some(d) = m.resolve_duration(s.duration, reference && !self.refs.images.is_empty()) { + f.insert("duration_seconds".into(), json!(d)); + } + if m.sound_toggle { + f.insert("generate_audio".into(), json!(s.generate_audio)); + } + // Only models that list batch sizes take a count (older ones reject the field). + if !m.batch_sizes.is_empty() { + f.insert("video_batch_count".into(), json!(m.valid_batch(s.count))); + } + let token = |r: &RefMedia, i: usize| r.token.clone().or_else(|| estimate.then(|| format!("mf_estimate_{i}"))); + if reference { + for (key, list) in [("reference_image_media_tokens", &self.refs.images), ("reference_video_media_tokens", &self.refs.videos), ("reference_audio_media_tokens", &self.refs.audios)] { + let tokens: Vec = list.iter().enumerate().filter_map(|(i, r)| token(r, i)).collect(); + if !tokens.is_empty() { + f.insert(key.into(), json!(tokens)); + } + } + if estimate { + let millis = |kind| (self.refs.total_secs(kind) * 1000.0) as u32; + f.insert("estimate_only".into(), json!({ "total_input_video_duration_millis": millis(RefKind::Video), "total_input_audio_duration_millis": millis(RefKind::Audio) })); + } + } else { + if let Some(t) = self.refs.first_frame.as_ref().and_then(|r| token(r, 0)) { + f.insert("start_frame_image_media_token".into(), json!(t)); + } + if let Some(t) = self.refs.last_frame.as_ref().filter(|_| m.end_frame).and_then(|r| token(r, 1)) { + f.insert("end_frame_image_media_token".into(), json!(t)); + } + } + f + } + + /// Model-change reconciliation: input mode, end frame and count. + fn reconcile(&mut self, m: &ModelInfo) { + let wanted = match self.settings.input_mode { + InputMode::Reference if !m.supports_reference_mode() => InputMode::Keyframe, + InputMode::Keyframe if !m.start_frame && m.supports_reference_mode() => InputMode::Reference, + mode => mode, + }; + if wanted != self.settings.input_mode { + switch_mode(&mut self.settings, &mut self.refs, wanted); + } + if !m.end_frame && self.refs.last_frame.is_some() { + self.refs.last_frame = None; + } + self.settings.count = m.valid_batch(self.settings.count); + } + + fn needs_start_frame(&self, m: &ModelInfo) -> bool { + let keyframe = self.settings.input_mode == InputMode::Keyframe; + let required = (keyframe && m.start_frame_required) || (!m.text_to_video && m.start_frame); + required && !self.has_image_input() + } + + fn has_image_input(&self) -> bool { + match self.settings.input_mode { + InputMode::Keyframe => self.refs.first_frame.is_some(), + InputMode::Reference => !self.refs.images.is_empty(), + } + } + + /// The first empty keyframe slot, if any. + fn free_keyframe(&self, model: Option<&ModelInfo>) -> Option { + if self.refs.first_frame.is_none() { + Some(ImageSlot::FirstFrame) + } else if self.refs.last_frame.is_none() && model.is_some_and(|m| m.end_frame) { + Some(ImageSlot::LastFrame) + } else { + None + } + } + + /// `@Image1…`, `@Video1…`, `@Audio1…` for the attached references. + fn mentions(&self) -> Vec { + let mut items = editor::mention_items(MentionKind::Image, self.refs.images.iter().map(|r| r.preview.clone())); + items.extend(editor::mention_items(MentionKind::Video, self.refs.videos.iter().map(|r| r.preview.clone()))); + items.extend(editor::mention_items(MentionKind::Audio, self.refs.audios.iter().map(|_| None))); + items + } + + /// "Make Video" from an image: it becomes the first frame (or the first reference). + pub fn set_start_image(&mut self, image: RefMedia) { + match self.settings.input_mode { + InputMode::Keyframe => self.refs.first_frame = Some(image), + InputMode::Reference => self.refs.images = vec![image], + } + self.box_state.editor.focus_requested = true; + } + + pub fn on_enqueued(&mut self, env: &mut Env<'_>, job_tokens: &[String], meta: &EnqueueMeta) { + self.generating = false; + self.feed.add_enqueued(MediaKind::Video, job_tokens, meta, env.catalog); + env.toasts.success("Video generation enqueued!"); + } + + pub fn on_enqueue_failed(&mut self, env: &mut Env<'_>, message: &str) { + self.generating = false; + env.toasts.error(if message.is_empty() { "Failed to start video generation. Please try again." } else { message }); + } + + /// Recreate: the original prompt, model, settings and references. + pub fn apply_prompt(&mut self, prompt: &Prompt) { + let s = &mut self.settings; + s.prompt = prompt.maybe_positive_prompt.clone().unwrap_or_default(); + if prompt.maybe_model_type.is_some() { + s.model = prompt.maybe_model_type.clone(); + } + if prompt.maybe_aspect_ratio.is_some() { + s.aspect_ratio = prompt.maybe_aspect_ratio.clone(); + } + if prompt.maybe_resolution.is_some() { + s.resolution = prompt.maybe_resolution.clone(); + } + if prompt.maybe_duration_seconds.is_some() { + s.duration = prompt.maybe_duration_seconds; + } + if let Some(audio) = prompt.maybe_generate_audio { + s.generate_audio = audio; + } + self.refs.clear(); + for c in prompt.maybe_context_images.iter().flatten() { + let kind = match c.semantic.as_str() { + "vid_ref" => RefKind::Video, + "audioref" => RefKind::Audio, + _ => RefKind::Image, + }; + let item = RefMedia::from_library(kind, c.media_token.clone(), c.media_links.thumbnail(256), Some(c.media_links.cdn_url.clone()), 0.0); + match (c.semantic.as_str(), kind) { + ("vid_end_frame", _) => self.refs.last_frame = Some(item), + (_, RefKind::Image) if s.input_mode == InputMode::Keyframe && self.refs.first_frame.is_none() => self.refs.first_frame = Some(item), + (_, kind) => self.refs.list_mut(kind).push(item), + } + } + self.box_state.editor.focus_requested = true; + } +} + +/// The video-only pickers: aspect ratio through input mode (left toolbar after the model). +/// Returns a newly picked input mode (applied by the caller, since it moves references). +fn video_toolbar(ui: &mut Ui, m: &ModelInfo, s: &mut VideoSettings, with_refs: bool) -> Option { + let aspect = ModelInfo::resolve(s.aspect_ratio.as_deref(), &m.aspect_ratios, m.aspect_default.as_ref()); + if let Some(v) = toolbar::aspect_ratio(ui, Id::new("video-aspect"), m, aspect.as_deref().unwrap_or("")) { + s.aspect_ratio = Some(v); + } + let resolution = ModelInfo::resolve(s.resolution.as_deref(), &m.resolutions, m.resolution_default.as_ref()); + if let Some(v) = toolbar::resolution(ui, Id::new("video-resolution"), m, resolution.as_deref().unwrap_or("")) { + s.resolution = Some(v); + } + if !m.bitrates.is_empty() { + let current = ModelInfo::resolve(s.bitrate.as_deref(), &m.bitrates, m.bitrate_default.as_ref()).unwrap_or_default(); + let options: Vec> = m.bitrates.iter().map(|v| PickOption::new(v.clone(), models::bitrate_label(v))).collect(); + if let Some(v) = pickers::option_picker(ui, Id::new("video-bitrate"), Trigger::Pill(Leading::None), "Bitrate", "Bitrate", ¤t, &options) { + s.bitrate = Some(v); + } + } + if !m.output_formats.is_empty() { + let current = ModelInfo::resolve(s.output_format.as_deref(), &m.output_formats, m.output_format_default.as_ref()).unwrap_or_default(); + let options: Vec> = m.output_formats.iter().map(|v| PickOption::new(v.clone(), v.to_uppercase())).collect(); + if let Some(v) = pickers::option_picker(ui, Id::new("video-format"), Trigger::Pill(Leading::None), "Output Format", "Output format", ¤t, &options) { + s.output_format = Some(v); + } + } + if let (Some((min, max)), Some(current)) = (m.duration_range(with_refs), m.resolve_duration(s.duration, with_refs)) { + if let Some(v) = pickers::duration_picker(ui, Id::new("video-duration"), u32::from(current), u32::from(min), u32::from(max)) { + s.duration = Some(v as u16); + } + } + if m.sound_toggle && pickers::toggle(ui, Id::new("video-sound"), if s.generate_audio { Icon::Volume } else { Icon::VolumeOff }, "Sound", s.generate_audio, if s.generate_audio { "Sound: ON" } else { "Sound: OFF" }) { + s.generate_audio = !s.generate_audio; + } + if m.start_frame && m.supports_reference_mode() { + let options = [PickOption::new(InputMode::Keyframe, "Keyframe").subtitle("First/Last frame"), PickOption::new(InputMode::Reference, "Omni Reference").subtitle("Multi-media ref")]; + return pickers::option_picker(ui, Id::new("video-mode"), Trigger::Pill(Leading::None), "Input Mode", "Input mode", &s.input_mode, &options); + } + None +} + +/// Switches input mode, carrying the first image across: keyframe → reference moves the first +/// frame to the front of the deck (and drops the last frame); reference → keyframe takes the +/// deck's first image as the first frame (and drops videos and audio). +fn switch_mode(s: &mut VideoSettings, refs: &mut References, mode: InputMode) { + match mode { + InputMode::Reference => { + if let Some(first) = refs.first_frame.take() { + refs.images.insert(0, first); + } + refs.last_frame = None; + }, + InputMode::Keyframe => { + if refs.first_frame.is_none() && !refs.images.is_empty() { + refs.first_frame = Some(refs.images.remove(0)); + } + refs.videos.clear(); + refs.audios.clear(); + }, + } + s.input_mode = mode; +} + +fn deck_limits(m: &ModelInfo, library: bool) -> DeckLimits { + DeckLimits { max_images: m.image_refs_max, max_videos: m.video_refs_max, max_video_secs: m.video_refs_max_secs.map(f32::from), max_audios: m.audio_refs_max, max_audio_secs: m.audio_refs_max_secs.map(f32::from), library } +} + +fn free_slots(refs: &References, kind: RefKind, l: &DeckLimits) -> usize { + let max = match kind { + RefKind::Image => l.max_images, + RefKind::Video => l.max_videos, + RefKind::Audio => l.max_audios, + }; + max.saturating_sub(refs.list(kind).len()) +} + +fn max_message(kind: RefKind, max: usize, secs: Option) -> String { + let noun = match kind { + RefKind::Image => "image reference", + RefKind::Video => "video", + RefKind::Audio => "audio clip", + }; + let plural = if max == 1 { "" } else { "s" }; + match secs { + Some(s) => format!("Max {max} {noun}{plural} / {}s total", s.round() as i64), + None => format!("Max {max} {noun}{plural}"), + } +} + +fn frames_full_message(model: Option<&ModelInfo>) -> &'static str { + if model.is_some_and(|m| m.end_frame) { + "First and last frames are already set" + } else { + "The first frame is already set" + } +} diff --git a/artcraft-native/src/pages/mod.rs b/artcraft-native/src/pages/mod.rs new file mode 100644 index 0000000000..a20581c603 --- /dev/null +++ b/artcraft-native/src/pages/mod.rs @@ -0,0 +1,5 @@ +pub mod common; +pub mod create_image; +pub mod create_video; +pub mod other; +pub mod toolbar; diff --git a/artcraft-native/src/pages/other.rs b/artcraft-native/src/pages/other.rs new file mode 100644 index 0000000000..106ae11f52 --- /dev/null +++ b/artcraft-native/src/pages/other.rs @@ -0,0 +1,129 @@ +//! The pages around the create tools: Home, the Library, and a placeholder for tools that are +//! still web-only. + +use egui::{Color32, Id, Rect, Sense, Ui, pos2, vec2}; + +use crate::feed::grid::{self, FeedAction, FeedView}; +use crate::feed::store::FeedStore; +use crate::feed::types::MediaKind; +use crate::pages::common::{AppRequest, Env, FeedKey}; +use crate::shell::{Page, WEB_APP_URL}; +use crate::theme; +use crate::ui::icons::{self, Icon}; +use crate::ui::widgets; + +/// Home: what ArtCraft does and where to start. Returns a page to open. +pub fn home(ui: &mut Ui, signed_in: bool, requests: &mut Vec) -> Option { + let mut open = None; + let area = ui.max_rect(); + let width = (area.width() - 64.0).min(960.0); + let mut col = ui.new_child(egui::UiBuilder::new().max_rect(Rect::from_min_size(pos2(area.center().x - width / 2.0, area.top() + 56.0), vec2(width, area.height() - 56.0)))); + let ui = &mut col; + widgets::hud(ui, "01 / ArtCraft", theme::FAINT); + ui.add_space(10.0); + ui.label(widgets::heading("Capable tools for artists.", 52.0)); + ui.add_space(10.0); + ui.label(egui::RichText::new("Generate images and videos with the best models, steer them with references and keyframes, and keep everything in your library.").size(17.0).color(theme::MUTED)); + ui.add_space(28.0); + ui.horizontal(|ui| { + ui.spacing_mut().item_spacing.x = 16.0; + let card_w = (width - 16.0) / 2.0; + for (page, icon, title, text) in [(Page::CreateImage, Icon::Image, "Create Image", "Describe anything. See it in seconds."), (Page::CreateVideo, Icon::Video, "Create Video", "Describe a scene. See it in motion.")] { + if card(ui, card_w, icon, title, text) { + open = Some(page); + } + } + }); + if !signed_in { + ui.add_space(24.0); + if widgets::button(ui, Some(Icon::LogIn), "Sign in to start", widgets::Kind::Primary, 0.0, 44.0).clicked() { + requests.push(AppRequest::SignIn); + } + } + open +} + +fn card(ui: &mut Ui, width: f32, icon: Icon, title: &str, text: &str) -> bool { + let (rect, resp) = ui.allocate_exact_size(vec2(width, 180.0), Sense::click()); + let hovered = resp.hovered(); + let p = ui.painter(); + p.rect(rect, 0.0, if hovered { Color32::from_rgba_unmultiplied(242, 241, 238, 8) } else { Color32::from_rgba_unmultiplied(242, 241, 238, 4) }, egui::Stroke::new(1.0, if hovered { theme::LINE_STRONG } else { theme::LINE }), egui::StrokeKind::Inside); + widgets::corner_marks(p, rect); + icons::paint(p, Rect::from_min_size(rect.min + vec2(24.0, 24.0), vec2(26.0, 26.0)), icon, theme::INK); + let body = Rect::from_min_max(pos2(rect.left() + 24.0, rect.top() + 76.0), pos2(rect.right() - 24.0, rect.bottom() - 16.0)); + let mut inner = ui.new_child(egui::UiBuilder::new().max_rect(body).layout(egui::Layout::top_down(egui::Align::Min))); + inner.label(widgets::heading(title, 26.0)); + inner.add_space(4.0); + inner.label(egui::RichText::new(text).size(14.0).color(theme::MUTED)); + icons::paint(ui.painter(), Rect::from_center_size(pos2(rect.right() - 28.0, rect.top() + 36.0), vec2(16.0, 16.0)), Icon::ChevronRight, if hovered { theme::INK } else { theme::FAINT }); + resp.on_hover_cursor(egui::CursorIcon::PointingHand).clicked() +} + +/// The Library: everything generated, newest first. +pub fn library(ui: &mut Ui, env: &mut Env<'_>, feed: &mut FeedStore) { + let area = ui.max_rect(); + if !env.signed_in { + placeholder(ui, area, "Library", "Sign in to see everything you've generated.", None); + return; + } + if !feed.library_started() { + env.requests.push(AppRequest::LoadMoreLibrary(FeedKey::Library)); + } + if !feed.has_content() && !feed.loading { + placeholder(ui, area, "Library", "Your generations will appear here.", None); + return; + } + let view = FeedView { id: Id::new("library-feed"), mode: env.view_mode, pending: &[], failed: &[], items: &feed.items, has_more: feed.has_more, loading: feed.loading, selecting: feed.selecting, selected: &feed.selected, last_viewed: feed.last_viewed.as_deref(), prompts: env.prompts, make_video: true, bottom_padding: 24.0 }; + let mut child = ui.new_child(egui::UiBuilder::new().max_rect(area.shrink2(vec2(12.0, 0.0)).with_min_y(area.top() + 2.0))); + for action in grid::show(&mut child, &view, env.cache, env.ratios, env.catalog) { + match action { + FeedAction::Open(token) => { + let kind = feed.find(&token).map_or(MediaKind::Image, |i| i.kind); + feed.last_viewed = Some(token.clone()); + env.requests.push(AppRequest::Open { kind, token }); + }, + FeedAction::ToggleSelect(token) => { + if !feed.selected.remove(&token) { + feed.selected.insert(token); + } + }, + FeedAction::LoadMore => env.requests.push(AppRequest::LoadMoreLibrary(FeedKey::Library)), + FeedAction::Recreate(token) => { + let kind = feed.find(&token).map_or(MediaKind::Image, |i| i.kind); + env.requests.push(AppRequest::Recreate { kind, token }); + }, + FeedAction::MakeVideo(token) => env.requests.push(AppRequest::MakeVideo { token }), + FeedAction::Share(token) => env.requests.push(AppRequest::Share(token)), + FeedAction::Download(token) => env.requests.push(AppRequest::Download(vec![token])), + FeedAction::CopyPrompt(text) => env.requests.push(AppRequest::CopyText(text)), + FeedAction::DismissFailed(_) => {}, + } + } + if feed.selecting { + crate::pages::common::selection_bar(ui, area, 24.0, feed, MediaKind::Image, env.requests); + } +} + +/// A tool that hasn't come to the native app yet. +pub fn coming_soon(ui: &mut Ui, page: Page) { + let area = ui.max_rect(); + placeholder(ui, area, page.label(), "This tool is coming to the native app. You can use it in the ArtCraft web app in the meantime.", Some(format!("{WEB_APP_URL}{}", page.web_path()))); +} + +/// The bordered, corner-marked splash used for empty and placeholder pages. +fn placeholder(ui: &mut Ui, area: Rect, title: &str, text: &str, web_url: Option) { + let width = (area.width() - 64.0).min(768.0); + let section = Rect::from_center_size(area.center(), vec2(width, if web_url.is_some() { 240.0 } else { 180.0 })); + ui.painter().rect(section, 0.0, Color32::from_rgba_unmultiplied(242, 241, 238, 4), egui::Stroke::new(1.0, Color32::from_rgba_unmultiplied(242, 241, 238, 51)), egui::StrokeKind::Inside); + widgets::corner_marks(ui.painter(), section); + let mut child = ui.new_child(egui::UiBuilder::new().max_rect(section.shrink2(vec2(40.0, 44.0)))); + child.label(widgets::heading(title, 44.0)); + child.add_space(10.0); + child.label(egui::RichText::new(text).size(15.0).color(theme::MUTED)); + if let Some(url) = web_url { + child.add_space(20.0); + if widgets::button(&mut child, Some(Icon::ExternalLink), "Open in web app", widgets::Kind::Primary, 0.0, 40.0).clicked() { + child.ctx().open_url(egui::OpenUrl::new_tab(url)); + } + } +} diff --git a/artcraft-native/src/pages/toolbar.rs b/artcraft-native/src/pages/toolbar.rs new file mode 100644 index 0000000000..da9e4169e7 --- /dev/null +++ b/artcraft-native/src/pages/toolbar.rs @@ -0,0 +1,57 @@ +//! Toolbar pickers both create pages use, each shown only when the model offers a choice. + +use egui::{Id, Ui}; + +use crate::models::{self, ModelInfo}; +use crate::prompt_box::pickers::{self, OptionLead, PickOption, Trigger}; +use crate::ui::icons::Icon; +use crate::ui::widgets::Leading; + +/// The aspect ratio picker (`AspectRatioPicker`). `current` is the effective value. +pub fn aspect_ratio(ui: &mut Ui, id: Id, model: &ModelInfo, current: &str) -> Option { + if model.aspect_ratios.is_empty() { + return None; + } + let options: Vec> = model.aspect_ratios.iter().map(|v| PickOption::new(v.clone(), models::aspect_label(v)).lead(aspect_lead(v))).collect(); + let lead = match models::aspect_proportion(current) { + Some(ratio) => Leading::Aspect(Some(ratio)), + None => Leading::Icon(Icon::Wand), + }; + pickers::option_picker(ui, id, Trigger::Pill(lead), "Aspect Ratio", "Aspect Ratio", ¤t.to_owned(), &options) +} + +fn aspect_lead(value: &str) -> OptionLead { + match models::aspect_proportion(value) { + Some(ratio) => OptionLead::Aspect(Some(ratio)), + None => OptionLead::Icon(Icon::Wand), + } +} + +/// The resolution picker (`ResolutionPicker`), its pill captioned SD or HD. +pub fn resolution(ui: &mut Ui, id: Id, model: &ModelInfo, current: &str) -> Option { + if model.resolutions.is_empty() { + return None; + } + let options: Vec> = model.resolutions.iter().map(|v| PickOption::new(v.clone(), models::resolution_label(v))).collect(); + let caption = if models::resolution_is_hd(current) { "HD" } else { "SD" }; + pickers::option_picker(ui, id, Trigger::Pill(Leading::Caption(caption)), "Resolution", "Resolution", ¤t.to_owned(), &options) +} + +/// The quality picker (`QualityPicker`). +pub fn quality(ui: &mut Ui, id: Id, model: &ModelInfo, current: &str) -> Option { + if model.qualities.is_empty() { + return None; + } + let options: Vec> = model.qualities.iter().map(|v| PickOption::new(v.clone(), models::quality_label(v))).collect(); + pickers::option_picker(ui, id, Trigger::Pill(Leading::Icon(Icon::Gem)), "Quality", "Quality", ¤t.to_owned(), &options) +} + +/// The number of generations (`GenerationCountPicker`): a quiet copy-icon button. +pub fn count(ui: &mut Ui, id: Id, model: &ModelInfo, current: u16, noun: &str) -> Option { + let options: Vec> = model.batch_options().into_iter().map(|n| PickOption::new(n, n.to_string())).collect(); + if options.len() <= 1 { + ui.add_enabled_ui(false, |ui| crate::ui::widgets::ghost(ui, Icon::Copy, Some(¤t.to_string()), "Number of generations", false)); + return None; + } + pickers::option_picker(ui, id, Trigger::Ghost(Icon::Copy), &format!("No. of {noun}"), "Number of generations", ¤t, &options) +} diff --git a/artcraft-native/src/prompt_box/deck.rs b/artcraft-native/src/prompt_box/deck.rs new file mode 100644 index 0000000000..f33db02bee --- /dev/null +++ b/artcraft-native/src/prompt_box/deck.rs @@ -0,0 +1,529 @@ +//! The reference widgets left of the prompt: the fanned reference deck (images, videos, audio) +//! and the tilted first/last keyframe slots. + +use egui::emath::Rot2; +use egui::load::SizedTexture; +use egui::{Align2, Color32, CornerRadius, FontId, Id, Order, Pos2, Rect, Response, Sense, Shape, Stroke, Ui, Vec2, pos2, vec2}; + +use crate::backend::media_cache::{Lookup, MediaCache}; +use crate::prompt_box::refs::{ImageSlot, RefKind, RefMedia, RefStatus, References}; +use crate::theme; +use crate::ui::icons::{self, Icon}; +use crate::ui::widgets; + +/// `w-14`. +const CARD: f32 = 56.0; +/// Rotations of the collapsed fan's cards (`FAN_TRANSFORMS`), with their x offsets. +const FAN: [(f32, f32); 3] = [(-8.0, 0.0), (2.0, 12.0), (9.0, 24.0)]; +const OPEN_DELAY: f64 = 0.17; +const CLOSE_DELAY: f64 = 0.15; +const MENU_DELAY: f64 = 0.1; + +/// Something the user asked the deck to do; the prompt box carries it out. +#[derive(Clone, Debug, PartialEq)] +pub enum DeckAction { + /// Open the file picker for these kinds into `slot` (images only use the slot). + Upload { + kinds: Vec, + slot: ImageSlot, + }, + /// Open the library picker for `kind` into `slot`. + Library { + kind: RefKind, + slot: ImageSlot, + }, + Remove(u64), + ClearAll, + ReorderImages { + from: usize, + to: usize, + }, + Preview(u64), + SwapFrames, +} + +/// What the deck may offer, from the model's limits. +#[derive(Clone, Debug)] +pub struct DeckLimits { + pub max_images: usize, + pub max_videos: usize, + pub max_video_secs: Option, + pub max_audios: usize, + pub max_audio_secs: Option, + /// Whether "From library" is offered (always, once signed in). + pub library: bool, +} + +impl DeckLimits { + fn kinds(&self) -> Vec { + [(RefKind::Image, self.max_images), (RefKind::Video, self.max_videos), (RefKind::Audio, self.max_audios)].into_iter().filter(|(_, max)| *max > 0).map(|(k, _)| k).collect() + } + + fn max(&self, kind: RefKind) -> usize { + match kind { + RefKind::Image => self.max_images, + RefKind::Video => self.max_videos, + RefKind::Audio => self.max_audios, + } + } + + fn max_secs(&self, kind: RefKind) -> Option { + match kind { + RefKind::Image => None, + RefKind::Video => self.max_video_secs, + RefKind::Audio => self.max_audio_secs, + } + } +} + +/// The fanned reference deck. Returns the user's actions this frame. +pub fn reference_deck(ui: &mut Ui, id: Id, refs: &References, limits: &DeckLimits, cache: &mut MediaCache, always_expanded: bool) -> Vec { + let mut actions = Vec::new(); + let items: Vec<&RefMedia> = refs.images.iter().chain(&refs.videos).chain(&refs.audios).collect(); + let open_kinds: Vec = limits.kinds().into_iter().filter(|k| refs.list(*k).len() < limits.max(*k)).collect(); + if items.is_empty() && open_kinds.is_empty() { + return actions; + } + let menu = add_menu_entries(refs, limits, &open_kinds, ImageSlot::Reference); + + if always_expanded { + expanded_panel(ui, id, refs, &items, &open_kinds, &menu, cache, &mut actions); + return actions; + } + + if items.is_empty() { + let resp = add_tile(ui, id.with("empty"), "Reference", -6.0); + if resp.clicked() { + actions.push(DeckAction::Upload { kinds: open_kinds.clone(), slot: ImageSlot::Reference }); + } + hover_menu(ui, id.with("empty-menu"), &resp, &menu, &mut actions); + return actions; + } + + // Collapsed fan: footprint tracks the card count plus the + button's overhang. + let shown = items.len().min(3); + let stack_w = (shown - 1) as f32 * 12.0 + CARD; + let (rect, _) = ui.allocate_exact_size(vec2(stack_w + 12.0, CARD), Sense::hover()); + let stack = Rect::from_min_size(rect.min, vec2(stack_w, CARD)); + let expanded = hover_latch(ui, id.with("expand"), stack, OPEN_DELAY); + let painter = ui.painter().clone(); + if !expanded.open { + for (i, item) in items.iter().take(3).enumerate().rev() { + let (deg, dx) = FAN[i]; + let card = Rect::from_min_size(stack.min + vec2(dx, 0.0), vec2(CARD, CARD)); + paint_card(ui, &painter, card, deg, item, cache, false); + } + if items.len() > 3 { + let badge_text = items.len().to_string(); + let badge = Rect::from_center_size(pos2(stack.right() + 2.0, stack.top() + 2.0), vec2(8.0 + 7.0 * badge_text.len() as f32, 18.0)); + painter.rect_filled(badge, CornerRadius::same(9), theme::ACCENT); + painter.text(badge.center(), Align2::CENTER_CENTER, badge_text, FontId::new(10.0, theme::semibold()), Color32::WHITE); + } + if !open_kinds.is_empty() { + let plus = Rect::from_min_size(pos2(stack.right() - 12.0, stack.bottom() - 20.0), vec2(24.0, 24.0)); + let resp = ui.interact(plus, id.with("plus"), Sense::click()).on_hover_cursor(egui::CursorIcon::PointingHand); + let hovered = resp.hovered(); + painter.circle(plus.center(), if hovered { 13.0 } else { 12.0 }, widgets::blend(theme::CONTROLS, if hovered { theme::WASH_HOVER } else { Color32::TRANSPARENT }), Stroke::new(1.0, theme::LINE)); + icons::paint(&painter, plus.shrink(6.0), Icon::Plus, theme::INK); + if resp.clicked() { + actions.push(DeckAction::Upload { kinds: open_kinds.clone(), slot: ImageSlot::Reference }); + } + hover_menu(ui, id.with("plus-menu"), &resp, &menu, &mut actions); + } + } + if expanded.open { + // The panel overlays the deck from its bottom-left corner, growing up and right. + let area = egui::Area::new(id.with("panel")).order(Order::Foreground).pivot(Align2::LEFT_BOTTOM).fixed_pos(stack.left_bottom()).show(ui.ctx(), |ui| { + widgets::popover_frame().inner_margin(8).show(ui, |ui| { + ui.set_max_width(ui.ctx().content_rect().width() * 0.5); + expanded_panel(ui, id, refs, &items, &open_kinds, &menu, cache, &mut actions); + }); + }); + expanded.keep_open_while(ui, area.response.rect.union(stack)); + } + actions +} + +/// The first and last keyframe slots (the last only when `show_last`). +pub fn keyframe_cards(ui: &mut Ui, id: Id, refs: &References, show_last: bool, library: bool, cache: &mut MediaCache) -> Vec { + let mut actions = Vec::new(); + ui.horizontal(|ui| { + ui.spacing_mut().item_spacing.x = 0.0; + slot_card(ui, id.with("first"), refs.first_frame.as_ref(), "First frame", if show_last { -6.0 } else { 0.0 }, ImageSlot::FirstFrame, library, cache, &mut actions); + if show_last { + let both = refs.first_frame.is_some() && refs.last_frame.is_some(); + let (rect, _) = ui.allocate_exact_size(vec2(8.0, CARD), Sense::hover()); + let swap = Rect::from_center_size(rect.center() - vec2(0.0, 6.0), vec2(20.0, 20.0)); + let resp = ui.interact(swap, id.with("swap"), if both { Sense::click() } else { Sense::hover() }); + let hovered = resp.hovered() && both; + let p = ui.painter(); + p.circle( + swap.center(), + if hovered { 11.0 } else { 10.0 }, + Color32::from_black_alpha(if hovered { + 204 + } else if both { + 153 + } else { + 102 + }), + Stroke::new(1.0, theme::fade(Color32::WHITE, if both { 0.2 } else { 0.1 })), + ); + icons::paint(p, swap.shrink(5.0), Icon::ArrowLeftRight, theme::fade(Color32::WHITE, if both { 1.0 } else { 0.5 })); + if both && resp.on_hover_text("Swap frames").on_hover_cursor(egui::CursorIcon::PointingHand).clicked() { + actions.push(DeckAction::SwapFrames); + } + slot_card(ui, id.with("last"), refs.last_frame.as_ref(), "Last frame", 6.0, ImageSlot::LastFrame, library, cache, &mut actions); + } + }); + actions +} + +/// One labelled keyframe slot: a dashed add card, or the frame once set. +#[allow(clippy::too_many_arguments)] +fn slot_card(ui: &mut Ui, id: Id, item: Option<&RefMedia>, label: &str, tilt: f32, slot: ImageSlot, library: bool, cache: &mut MediaCache, actions: &mut Vec) { + ui.vertical(|ui| { + ui.spacing_mut().item_spacing.y = 2.0; + match item { + Some(item) => { + let (rect, resp) = ui.allocate_exact_size(vec2(CARD, CARD), Sense::click()); + let hovered = resp.hovered(); + let painter = ui.painter().clone(); + paint_card(ui, &painter, rect, if hovered { 0.0 } else { tilt }, item, cache, hovered); + if item.status == RefStatus::Ready { + if remove_button(ui, id.with("x"), rect, hovered) { + actions.push(DeckAction::Remove(item.id)); + } else if resp.on_hover_cursor(egui::CursorIcon::ZoomIn).clicked() { + actions.push(DeckAction::Preview(item.id)); + } + } + let (label_rect, _) = ui.allocate_exact_size(vec2(CARD, 10.0), Sense::hover()); + ui.painter().text(label_rect.center(), Align2::CENTER_CENTER, label, FontId::new(9.0, theme::medium()), theme::MUTED); + }, + None => { + let resp = add_tile(ui, id, label, tilt); + if resp.clicked() { + actions.push(DeckAction::Upload { kinds: vec![RefKind::Image], slot }); + } + { + let menu = vec![MenuGroup { kind: RefKind::Image, hint: None, slot, library }]; + hover_menu(ui, id.with("menu"), &resp, &menu, actions); + } + }, + } + }); +} + +/// The expanded deck: a header with "Clear all", the cards (reorderable images) and a + tile. +#[allow(clippy::too_many_arguments)] +fn expanded_panel(ui: &mut Ui, id: Id, refs: &References, items: &[&RefMedia], open_kinds: &[RefKind], menu: &[MenuGroup], cache: &mut MediaCache, actions: &mut Vec) { + if items.len() > 1 { + ui.horizontal(|ui| { + let n = items.len(); + ui.label(egui::RichText::new(format!("{n} reference{}", if n == 1 { "" } else { "s" })).size(11.0).family(theme::medium()).color(theme::MUTED)); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + let resp = ui.add(egui::Button::new(egui::RichText::new("Clear all").size(11.0)).frame(false)); + if resp.on_hover_cursor(egui::CursorIcon::PointingHand).clicked() { + actions.push(DeckAction::ClearAll); + } + }); + }); + } + let drag_id = id.with("dragging"); + let mut dragging: Option = ui.data(|d| d.get_temp(drag_id)); + let mut image_rects = Vec::with_capacity(refs.images.len()); + ui.horizontal_wrapped(|ui| { + ui.spacing_mut().item_spacing = vec2(6.0, 6.0); + for item in items { + let (rect, resp) = ui.allocate_exact_size(vec2(CARD, CARD), Sense::click_and_drag()); + let hovered = resp.hovered(); + let painter = ui.painter().clone(); + let image_index = refs.images.iter().position(|r| r.id == item.id); + if let Some(i) = image_index { + image_rects.push((i, rect)); + if resp.drag_started() && refs.images.len() > 1 { + dragging = Some(i); + } + } + paint_card(ui, &painter, rect, 0.0, item, cache, hovered && dragging.is_none()); + if dragging.is_some() && dragging == image_index { + painter.rect_filled(rect, theme::RADIUS, Color32::from_black_alpha(128)); + } + if item.status == RefStatus::Ready && dragging.is_none() { + if remove_button(ui, id.with(("x", item.id)), rect, hovered) { + actions.push(DeckAction::Remove(item.id)); + } else if resp.clicked() { + actions.push(DeckAction::Preview(item.id)); + } + } + } + if !open_kinds.is_empty() { + let (rect, resp) = ui.allocate_exact_size(vec2(CARD, CARD), Sense::click()); + paint_dashed_tile(ui.painter(), rect, 0.0, resp.hovered(), None); + let resp = resp.on_hover_cursor(egui::CursorIcon::PointingHand); + if resp.clicked() { + actions.push(DeckAction::Upload { kinds: open_kinds.to_vec(), slot: ImageSlot::Reference }); + } + hover_menu(ui, id.with("panel-menu"), &resp, menu, actions); + } + }); + // Drag to reorder images: drop onto another image's card. + if let Some(from) = dragging { + let released = ui.input(|i| i.pointer.any_released()); + if released { + if let Some(pos) = ui.input(|i| i.pointer.interact_pos()) { + if let Some((to, _)) = image_rects.iter().find(|(_, r)| r.contains(pos)) { + if *to != from { + actions.push(DeckAction::ReorderImages { from, to: *to }); + } + } + } + dragging = None; + } else { + ui.ctx().set_cursor_icon(egui::CursorIcon::Grabbing); + } + } + ui.data_mut(|d| match dragging { + Some(i) => { + d.insert_temp(drag_id, i); + }, + None => d.remove::(drag_id), + }); +} + +/// A 56 px card: the thumbnail (cover-fit), a kind badge for video/audio, a duration strip, and a +/// spinner while uploading. `tilt` is in degrees. +fn paint_card(ui: &Ui, painter: &egui::Painter, rect: Rect, tilt: f32, item: &RefMedia, cache: &mut MediaCache, hovered: bool) { + let rot = Rot2::from_angle(tilt.to_radians()); + let corners = rotated_corners(rect, rot); + painter.add(Shape::convex_polygon(corners.to_vec(), theme::fade(theme::CONTROLS, 0.95), Stroke::NONE)); + let texture = item.preview.as_deref().and_then(|key| match cache.get(ui.ctx(), key) { + Lookup::Ready(t) => Some(t), + _ => None, + }); + match texture { + Some(texture) => { + let uv = cover_uv(texture.size_vec2()); + let image = egui::Image::from_texture(SizedTexture::from_handle(&texture)).uv(uv).rotate(rot.angle(), Vec2::splat(0.5)); + let image = if item.status == RefStatus::Uploading { image.tint(Color32::from_gray(140)) } else { image }; + image.paint_at(ui, rect.shrink(2.0)); + }, + None => { + let icon = match item.kind { + RefKind::Image => Icon::Image, + RefKind::Video => Icon::Video, + RefKind::Audio => Icon::Music, + }; + icons::paint(painter, Rect::from_center_size(rect.center(), vec2(20.0, 20.0)), icon, theme::MUTED); + }, + } + if item.kind != RefKind::Image && tilt == 0.0 { + let badge = Rect::from_min_size(rect.min + vec2(3.0, 3.0), vec2(16.0, 16.0)); + painter.rect_filled(badge, 0.0, Color32::from_black_alpha(153)); + icons::paint(painter, badge.shrink(3.0), if item.kind == RefKind::Video { Icon::Video } else { Icon::Music }, Color32::WHITE); + if item.duration_secs > 0.0 { + let strip = Rect::from_min_max(pos2(rect.left(), rect.bottom() - 14.0), rect.max); + painter.rect_filled(strip, 0.0, Color32::from_black_alpha(178)); + painter.text(strip.center(), Align2::CENTER_CENTER, format!("{}s", item.duration_secs.round() as i64), FontId::new(10.0, theme::semibold()), Color32::WHITE); + } + } + if item.status == RefStatus::Uploading { + icons::paint_spinner(ui, Rect::from_center_size(rect.center(), vec2(24.0, 24.0)), Color32::WHITE); + } + let border = theme::fade(Color32::WHITE, if hovered { 0.8 } else { 0.3 }); + painter.add(Shape::closed_line(corners.to_vec(), Stroke::new(2.0, border))); +} + +/// The hover-revealed round × in a card's top-right corner. Returns whether it was clicked. +fn remove_button(ui: &mut Ui, id: Id, card: Rect, card_hovered: bool) -> bool { + let rect = Rect::from_min_size(pos2(card.right() - 22.0, card.top() + 2.0), vec2(20.0, 20.0)); + let resp = ui.interact(rect, id, Sense::click()); + if !(card_hovered || resp.hovered()) { + return false; + } + let fill = if resp.hovered() { theme::fade(theme::DANGER, 0.7) } else { Color32::from_black_alpha(128) }; + ui.painter().circle_filled(rect.center(), 10.0, fill); + icons::paint(ui.painter(), rect.shrink(5.0), Icon::X, Color32::WHITE); + resp.on_hover_text("Remove").on_hover_cursor(egui::CursorIcon::PointingHand).clicked() +} + +/// The dashed "+" card that adds a reference (straightens and grows on hover). +fn add_tile(ui: &mut Ui, id: Id, label: &str, tilt: f32) -> Response { + let (rect, _) = ui.allocate_exact_size(vec2(CARD, CARD), Sense::hover()); + let resp = ui.interact(rect, id, Sense::click()).on_hover_cursor(egui::CursorIcon::PointingHand); + let hovered = resp.hovered(); + paint_dashed_tile(ui.painter(), if hovered { rect.expand(1.4) } else { rect }, if hovered { 0.0 } else { tilt }, hovered, Some(label)); + resp +} + +fn paint_dashed_tile(painter: &egui::Painter, rect: Rect, tilt: f32, hovered: bool, label: Option<&str>) { + let rot = Rot2::from_angle(tilt.to_radians()); + let corners = rotated_corners(rect, rot); + let fill = theme::fade(theme::CONTROLS, if hovered { 0.6 } else { 0.4 }); + painter.add(Shape::convex_polygon(corners.to_vec(), fill, Stroke::NONE)); + let mut path = corners.to_vec(); + path.push(corners[0]); + painter.extend(Shape::dashed_line(&path, Stroke::new(2.0, theme::LINE_DASHED), 4.0, 3.0)); + let c = rect.center(); + match label { + Some(label) => { + icons::paint(painter, Rect::from_center_size(c - vec2(0.0, 6.0), vec2(18.0, 18.0)), Icon::Plus, theme::fade(theme::INK, 0.8)); + painter.text(c + vec2(0.0, 12.0), Align2::CENTER_CENTER, label, FontId::new(8.5, theme::medium()), theme::fade(theme::INK, 0.7)); + }, + None => icons::paint(painter, Rect::from_center_size(c, vec2(20.0, 20.0)), Icon::Plus, theme::fade(theme::INK, 0.8)), + } +} + +fn rotated_corners(rect: Rect, rot: Rot2) -> [Pos2; 4] { + let c = rect.center(); + [rect.left_top(), rect.right_top(), rect.right_bottom(), rect.left_bottom()].map(|p| c + rot * (p - c)) +} + +/// The UV rect that crops a texture of `size` to a centred square (`object-cover`). +pub fn cover_uv(size: Vec2) -> Rect { + if size.x <= 0.0 || size.y <= 0.0 { + return Rect::from_min_max(Pos2::ZERO, pos2(1.0, 1.0)); + } + if size.x > size.y { + let f = size.y / size.x; + Rect::from_min_max(pos2((1.0 - f) / 2.0, 0.0), pos2((1.0 + f) / 2.0, 1.0)) + } else { + let f = size.x / size.y; + Rect::from_min_max(pos2(0.0, (1.0 - f) / 2.0), pos2(1.0, (1.0 + f) / 2.0)) + } +} + +/// One kind's group in an add menu: its "Upload" / "From library" rows and a usage hint. +struct MenuGroup { + kind: RefKind, + hint: Option, + slot: ImageSlot, + library: bool, +} + +fn add_menu_entries(refs: &References, limits: &DeckLimits, open_kinds: &[RefKind], slot: ImageSlot) -> Vec { + open_kinds + .iter() + .map(|&kind| { + let count = format!("{}/{}", refs.list(kind).len(), limits.max(kind)); + let hint = match limits.max_secs(kind) { + Some(max) => format!("{count} \u{b7} {}/{}s", refs.total_secs(kind).round() as i64, max.round() as i64), + None => count, + }; + MenuGroup { kind, hint: Some(hint), slot, library: limits.library } + }) + .collect() +} + +/// The add menu that appears above a trigger after a short hover (the webapp's `DeckAddMenu`). +fn hover_menu(ui: &Ui, id: Id, trigger: &Response, groups: &[MenuGroup], actions: &mut Vec) { + // A lone "Upload" is what clicking does already: no menu (the webapp's `enabledActions > 1`). + let entries: usize = groups.iter().map(|g| 1 + usize::from(g.library)).sum(); + if entries <= 1 { + return; + } + let latch = hover_latch(ui, id, trigger.rect, MENU_DELAY); + if !latch.open { + return; + } + let show_groups = groups.len() > 1; + let area = egui::Area::new(id.with("area")).order(Order::Tooltip).pivot(Align2::CENTER_BOTTOM).fixed_pos(trigger.rect.center_top() - vec2(0.0, 2.0)).show(ui.ctx(), |ui| { + widgets::popover_frame().inner_margin(6).show(ui, |ui| { + ui.set_width(192.0); + ui.spacing_mut().item_spacing.y = 0.0; + for group in groups { + if show_groups { + ui.horizontal(|ui| { + ui.label(egui::RichText::new(group.kind.noun().to_uppercase()).size(10.0).family(theme::semibold()).color(theme::FAINT)); + if let Some(hint) = &group.hint { + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + ui.label(egui::RichText::new(hint).size(10.0).family(theme::medium()).color(theme::FAINT)); + }); + } + }); + } + if menu_entry(ui, Icon::Upload, "Upload") { + actions.push(DeckAction::Upload { kinds: vec![group.kind], slot: group.slot }); + latch.close(ui); + } + if group.library && menu_entry(ui, Icon::Library, if group.slot == ImageSlot::Reference { "From library" } else { "Pick from library" }) { + actions.push(DeckAction::Library { kind: group.kind, slot: group.slot }); + latch.close(ui); + } + } + }); + }); + latch.keep_open_while(ui, area.response.rect.union(trigger.rect)); +} + +fn menu_entry(ui: &mut Ui, icon: Icon, label: &str) -> bool { + let (rect, resp) = ui.allocate_exact_size(vec2(ui.available_width(), 30.0), Sense::click()); + let p = ui.painter(); + if resp.hovered() { + p.rect_filled(rect, theme::RADIUS, theme::WASH_HOVER); + } + icons::paint(p, Rect::from_center_size(pos2(rect.left() + 17.0, rect.center().y), vec2(14.0, 14.0)), icon, theme::fade(theme::INK, 0.6)); + p.text(pos2(rect.left() + 34.0, rect.center().y), Align2::LEFT_CENTER, label, FontId::new(13.0, theme::medium()), theme::INK); + resp.on_hover_cursor(egui::CursorIcon::PointingHand).clicked() +} + +/// Open-on-hover with a delay, staying open while the pointer is over the trigger or what it +/// opened (plus a grace period), like the webapp's hover menus. +struct HoverLatch { + id: Id, + open: bool, +} + +#[derive(Clone, Copy, Default)] +struct LatchState { + hover_since: Option, + left_at: Option, + open: bool, +} + +fn hover_latch(ui: &Ui, id: Id, trigger: Rect, delay: f64) -> HoverLatch { + let now = ui.input(|i| i.time); + let pointer = ui.input(|i| i.pointer.hover_pos()); + let over = pointer.is_some_and(|p| trigger.contains(p)); + let mut st: LatchState = ui.data(|d| d.get_temp(id).unwrap_or_default()); + if over { + st.left_at = None; + let since = *st.hover_since.get_or_insert(now); + if !st.open { + if now - since >= delay { + st.open = true; + } else { + ui.ctx().request_repaint_after(std::time::Duration::from_secs_f64(delay - (now - since))); + } + } + } else { + st.hover_since = None; + } + ui.data_mut(|d| d.insert_temp(id, st)); + HoverLatch { id, open: st.open } +} + +impl HoverLatch { + /// Keeps the latch open while the pointer is inside `region`; closes it `CLOSE_DELAY` after + /// the pointer leaves. + fn keep_open_while(&self, ui: &Ui, region: Rect) { + let now = ui.input(|i| i.time); + let inside = ui.input(|i| i.pointer.hover_pos()).is_some_and(|p| region.expand(4.0).contains(p)); + let mut st: LatchState = ui.data(|d| d.get_temp(self.id).unwrap_or_default()); + if inside { + st.left_at = None; + } else { + let left = *st.left_at.get_or_insert(now); + if now - left >= CLOSE_DELAY { + st = LatchState::default(); + } else { + ui.ctx().request_repaint_after(std::time::Duration::from_secs_f64(CLOSE_DELAY)); + } + } + ui.data_mut(|d| d.insert_temp(self.id, st)); + } + + fn close(&self, ui: &Ui) { + ui.data_mut(|d| d.insert_temp(self.id, LatchState::default())); + } +} diff --git a/artcraft-native/src/prompt_box/editor.rs b/artcraft-native/src/prompt_box/editor.rs new file mode 100644 index 0000000000..42714c1b7b --- /dev/null +++ b/artcraft-native/src/prompt_box/editor.rs @@ -0,0 +1,414 @@ +//! The prompt text field: auto-grows to ~4 lines then scrolls, expands or resizes on demand, +//! highlights `@Image1`-style mentions and offers them in an autocomplete dropdown, and shows a +//! length counter when the model has a limit. + +use egui::text::{CCursor, CCursorRange, LayoutJob}; +use egui::{Align2, Color32, FontFamily, FontId, Id, Key, KeyboardShortcut, Modifiers, Order, Rect, Sense, Stroke, TextBuffer, TextFormat, Ui, pos2, vec2}; + +use crate::theme; +use crate::ui::icons::{self, Icon}; + +/// `text-md`. +const FONT_SIZE: f32 = 16.0; +/// `min-h-[2.5em]`. +const MIN_HEIGHT: f32 = FONT_SIZE * 2.5; +/// `max-h-[5.5em]` while collapsed. +const COLLAPSED_MAX_HEIGHT: f32 = FONT_SIZE * 5.5; +/// `max-h-[500px]`. +const MAX_HEIGHT: f32 = 500.0; +/// `pr-8`: room for the fullscreen button. +const RIGHT_GUTTER: f32 = 32.0; + +const IMAGE_COLORS: [Color32; 5] = [Color32::from_rgb(96, 165, 250), Color32::from_rgb(251, 146, 60), Color32::from_rgb(167, 139, 250), Color32::from_rgb(52, 211, 153), Color32::from_rgb(251, 113, 133)]; +const VIDEO_COLORS: [Color32; 3] = [Color32::from_rgb(250, 204, 21), Color32::from_rgb(245, 158, 11), Color32::from_rgb(74, 222, 128)]; +const AUDIO_COLORS: [Color32; 2] = [Color32::from_rgb(192, 132, 252), Color32::from_rgb(232, 121, 249)]; + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum MentionKind { + Image, + Video, + Audio, +} + +/// Something the prompt can reference by name, e.g. `@Image2`. +#[derive(Clone, Debug)] +pub struct MentionItem { + pub label: String, + pub kind: MentionKind, + /// The 1-based index within its kind (picks the colour). + pub index: usize, + /// Media cache key of a thumbnail, if there is one. + pub preview: Option, +} + +impl MentionItem { + pub fn color(&self) -> Color32 { + let i = self.index.saturating_sub(1); + match self.kind { + MentionKind::Image => IMAGE_COLORS[i % IMAGE_COLORS.len()], + MentionKind::Video => VIDEO_COLORS[i % VIDEO_COLORS.len()], + MentionKind::Audio => AUDIO_COLORS[i % AUDIO_COLORS.len()], + } + } +} + +/// Per-editor UI state that outlives a frame. +#[derive(Default)] +pub struct EditorState { + /// The chevron's "expanded" mode: a tall, fixed-height field. + pub expanded: bool, + /// A height the user dragged the resize grip to. + pub manual_height: Option, + mention: Option, + /// Focus the field on the next frame (autofocus, after inserting a mention, after closing + /// fullscreen). + pub focus_requested: bool, +} + +struct MentionQuery { + /// Char index of the `@`. + anchor: usize, + /// What's typed after the `@` (without it). + filter: String, + selected: usize, +} + +pub struct EditorOptions<'a> { + pub id: Id, + pub placeholder: &'a str, + pub enter_to_generate: bool, + pub mentions: &'a [MentionItem], + /// `Some` shows an `n / max` counter; `Some(None)` shows `n / ∞`. + pub max_length: Option>, + /// Fill a fixed height (fullscreen mode) instead of auto-growing. + pub fixed_height: Option, + /// Draw the fullscreen button in the top right. + pub fullscreen_button: bool, + /// Draw the resize grip in the bottom right. + pub resizable: bool, +} + +#[derive(Default)] +pub struct EditorOutput { + pub submit: bool, + pub open_fullscreen: bool, + pub focused: bool, +} + +/// Draws the editor in the available width. +pub fn show(ui: &mut Ui, prompt: &mut String, state: &mut EditorState, opts: &EditorOptions<'_>, thumbnails: &mut dyn FnMut(&Ui, &str) -> Option) -> EditorOutput { + let mut out = EditorOutput::default(); + let id = opts.id; + let had_focus = ui.memory(|m| m.has_focus(id)); + let filtered = filtered_mentions(state, opts.mentions); + + // Keys the field mustn't see: dropdown navigation, and Enter when it generates. + if had_focus { + if !filtered.is_empty() { + handle_dropdown_keys(ui, id, prompt, state, &filtered); + } else if opts.enter_to_generate && consume_plain_enter(ui) { + out.submit = true; + } + } + + let width = ui.available_width(); + let height = editor_height(ui, state, opts); + let (outer, _) = ui.allocate_exact_size(vec2(width, height.unwrap_or(MIN_HEIGHT)), Sense::hover()); + let text_width = (width - RIGHT_GUTTER).max(40.0); + + let mentions = opts.mentions; + let mut layouter = |ui: &Ui, buf: &dyn TextBuffer, wrap_width: f32| { + let mut job = highlight(buf.as_str(), mentions); + job.wrap.max_width = wrap_width; + ui.fonts_mut(|f| f.layout_job(job)) + }; + + let return_key = if opts.enter_to_generate { KeyboardShortcut::new(Modifiers::SHIFT, Key::Enter) } else { KeyboardShortcut::new(Modifiers::NONE, Key::Enter) }; + let max_h = height.unwrap_or(COLLAPSED_MAX_HEIGHT); + let mut child = ui.new_child(egui::UiBuilder::new().max_rect(Rect::from_min_size(outer.min, vec2(width, max_h)))); + let scroll = egui::ScrollArea::vertical().id_salt(id.with("scroll")).max_height(max_h).auto_shrink([false, true]); + let scroll = if height.is_some() { scroll.min_scrolled_height(max_h) } else { scroll }; + let output = scroll + .show(&mut child, |ui| { + let min_h = height.unwrap_or(MIN_HEIGHT); + egui::TextEdit::multiline(prompt).id(id).frame(egui::Frame::NONE).font(FontId::new(FONT_SIZE, FontFamily::Proportional)).hint_text(egui::RichText::new(opts.placeholder).color(theme::MUTED).size(FONT_SIZE)).desired_width(text_width).desired_rows(1).min_size(vec2(text_width, min_h)).return_key(return_key).layouter(&mut layouter).show(ui) + }) + .inner; + let used_h = child.min_rect().height().clamp(MIN_HEIGHT, max_h); + // Grow the reserved space to what the field actually used (auto-grow). + if height.is_none() && used_h > outer.height() { + ui.allocate_exact_size(vec2(width, used_h - outer.height()), Sense::hover()); + } + let field_rect = Rect::from_min_size(outer.min, vec2(width, if height.is_some() { max_h } else { used_h })); + + if state.focus_requested { + state.focus_requested = false; + ui.memory_mut(|m| m.request_focus(id)); + let end = CCursor::new(prompt.chars().count()); + let mut st = output.state.clone(); + st.cursor.set_char_range(Some(CCursorRange::one(end))); + st.store(ui.ctx(), id); + } + out.focused = output.response.response.has_focus(); + + if output.response.response.changed() || (out.focused && output.cursor_range.is_some()) { + update_mention_query(state, prompt, output.cursor_range, opts.mentions); + } + if !out.focused && !had_focus { + state.mention = None; + } + + if opts.fullscreen_button { + let button = Rect::from_min_size(pos2(field_rect.right() - 24.0, field_rect.top()), vec2(24.0, 24.0)); + let resp = ui.interact(button, id.with("fullscreen"), Sense::click()).on_hover_text("Focus mode").on_hover_cursor(egui::CursorIcon::PointingHand); + let p = ui.painter(); + p.rect_filled(button, theme::RADIUS, if resp.hovered() { theme::WASH_HOVER } else { theme::WASH }); + icons::paint(p, button.shrink(6.0), Icon::Maximize, if resp.hovered() { theme::INK } else { theme::DIM }); + out.open_fullscreen = resp.clicked(); + } + + if opts.resizable { + resize_grip(ui, id, field_rect, state); + } + + if let Some(limit) = opts.max_length { + let count = prompt.chars().count(); + let over = limit.is_some_and(|max| count > max); + let text = match limit { + Some(max) => format!("{count} / {max}"), + None => format!("{count} / \u{221e}"), + }; + let color = if over { Color32::from_rgb(0xef, 0x44, 0x44) } else { theme::FAINT }; + ui.painter().text(pos2(field_rect.right() - 16.0, field_rect.bottom() + 4.0), Align2::RIGHT_BOTTOM, text, FontId::new(10.0, FontFamily::Monospace), color); + } + + if !filtered.is_empty() && out.focused { + mention_dropdown(ui, id, field_rect, prompt, state, &filtered, thumbnails); + } + out +} + +/// Whether the prompt exceeds `limit` characters. +pub fn is_over_limit(prompt: &str, limit: Option) -> bool { + limit.is_some_and(|max| prompt.chars().count() > max) +} + +/// The height the field takes: `None` auto-grows (collapsed), `Some` is fixed. +fn editor_height(ui: &Ui, state: &EditorState, opts: &EditorOptions<'_>) -> Option { + if let Some(h) = opts.fixed_height { + return Some(h); + } + if let Some(h) = state.manual_height { + return Some(h.clamp(MIN_HEIGHT, MAX_HEIGHT)); + } + // `clamp(120px, calc(100vh - 700px), 500px)`. + state.expanded.then(|| (ui.ctx().content_rect().height() - 700.0).clamp(120.0, MAX_HEIGHT)) +} + +/// Consumes a plain (unshifted) Enter press; returns whether there was one. +fn consume_plain_enter(ui: &Ui) -> bool { + ui.input_mut(|i| { + let before = i.events.len(); + i.events.retain(|e| !matches!(e, egui::Event::Key { key: Key::Enter, pressed: true, modifiers, .. } if !modifiers.shift && !modifiers.command && !modifiers.alt)); + before != i.events.len() + }) +} + +fn handle_dropdown_keys(ui: &Ui, id: Id, prompt: &mut String, state: &mut EditorState, filtered: &[&MentionItem]) { + let n = filtered.len(); + let (down, up, accept, escape) = ui.input_mut(|i| (i.consume_key(Modifiers::NONE, Key::ArrowDown), i.consume_key(Modifiers::NONE, Key::ArrowUp), i.consume_key(Modifiers::NONE, Key::Enter) || i.consume_key(Modifiers::NONE, Key::Tab), i.consume_key(Modifiers::NONE, Key::Escape))); + let Some(query) = state.mention.as_mut() else { + return; + }; + if down { + query.selected = (query.selected + 1) % n; + } + if up { + query.selected = (query.selected + n - 1) % n; + } + if escape { + state.mention = None; + return; + } + if accept { + let label = filtered[query.selected.min(n - 1)].label.clone(); + insert_mention(ui.ctx(), id, prompt, state, &label); + } +} + +/// Opens, updates or closes the dropdown from the text before the cursor. +fn update_mention_query(state: &mut EditorState, prompt: &str, cursor: Option, mentions: &[MentionItem]) { + // Keep the highlighted row while the same query stays open (arrow keys move it). + let previous = state.mention.take(); + if mentions.is_empty() { + return; + } + let Some(cursor) = cursor else { + return; + }; + let at = cursor.primary.index.0; + let before: String = prompt.chars().take(at).collect(); + let Some(anchor_byte) = before.rfind('@') else { + return; + }; + let after = &before[anchor_byte + 1..]; + if after.contains(char::is_whitespace) { + return; + } + let anchor = before[..anchor_byte].chars().count(); + let selected = previous.filter(|q| q.anchor == anchor && q.filter == after).map_or(0, |q| q.selected); + state.mention = Some(MentionQuery { anchor, filter: after.to_owned(), selected }); +} + +fn filtered_mentions<'a>(state: &EditorState, mentions: &'a [MentionItem]) -> Vec<&'a MentionItem> { + let Some(query) = &state.mention else { + return Vec::new(); + }; + let needle = format!("@{}", query.filter).to_lowercase(); + mentions.iter().filter(|m| m.label.to_lowercase().contains(&needle)).collect() +} + +/// Replaces `@filter` before the cursor with `label` and a space, and puts the cursor after it. +fn insert_mention(ctx: &egui::Context, id: Id, prompt: &mut String, state: &mut EditorState, label: &str) { + let Some(query) = state.mention.take() else { + return; + }; + let chars: Vec = prompt.chars().collect(); + let end = (query.anchor + 1 + query.filter.chars().count()).min(chars.len()); + let before: String = chars[..query.anchor].iter().collect(); + let after: String = chars[end..].iter().collect(); + *prompt = format!("{before}{label} {after}"); + if let Some(mut st) = egui::TextEdit::load_state(ctx, id) { + st.cursor.set_char_range(Some(CCursorRange::one(CCursor::new(query.anchor + label.chars().count() + 1)))); + st.store(ctx, id); + } +} + +fn mention_dropdown(ui: &Ui, id: Id, field: Rect, prompt: &mut String, state: &mut EditorState, filtered: &[&MentionItem], thumbnails: &mut dyn FnMut(&Ui, &str) -> Option) { + let selected = state.mention.as_ref().map_or(0, |q| q.selected); + let row_h = 44.0; + let h = 28.0 + row_h * filtered.len() as f32; + let rect = Rect::from_min_size(pos2(field.left(), field.top() - h - 4.0), vec2(256.0, h)); + let mut picked = None; + let mut hovered = None; + egui::Area::new(id.with("mentions")).order(Order::Foreground).fixed_pos(rect.min).show(ui.ctx(), |ui| { + let p = ui.painter(); + p.rect(rect, theme::RADIUS, theme::CONTROLS, theme::hairline(), egui::StrokeKind::Inside); + p.text(pos2(rect.left() + 12.0, rect.top() + 14.0), Align2::LEFT_CENTER, "MENTIONS", FontId::new(11.0, theme::mono_bold()), theme::fade(theme::INK, 0.5)); + for (i, item) in filtered.iter().enumerate() { + let row = Rect::from_min_size(pos2(rect.left(), rect.top() + 28.0 + row_h * i as f32), vec2(rect.width(), row_h)); + let resp = ui.interact(row, id.with(("mention", i)), Sense::click()); + resp.widget_info(|| egui::WidgetInfo::selected(egui::WidgetType::Button, true, i == selected, &item.label)); + if resp.hovered() { + hovered = Some(i); + } + let p = ui.painter(); + if i == selected { + p.rect_filled(row, 0.0, theme::WASH_HOVER); + } + let tile = Rect::from_min_size(pos2(row.left() + 12.0, row.center().y - 16.0), vec2(32.0, 32.0)); + p.rect(tile, 0.0, theme::fade(Color32::BLACK, 0.2), theme::hairline(), egui::StrokeKind::Inside); + match item.preview.as_deref().and_then(|key| thumbnails(ui, key)) { + Some(tex) => { + egui::Image::new(&tex).maintain_aspect_ratio(false).paint_at(ui, tile.shrink(1.0)); + }, + None => { + let icon = match item.kind { + MentionKind::Image => Icon::Image, + MentionKind::Video => Icon::Video, + MentionKind::Audio => Icon::Music, + }; + icons::paint(ui.painter(), tile.shrink(9.0), icon, theme::fade(Color32::WHITE, 0.6)); + }, + } + ui.painter().text(pos2(tile.right() + 10.0, row.center().y), Align2::LEFT_CENTER, &item.label, FontId::new(14.0, theme::medium()), item.color()); + if resp.clicked() { + picked = Some(item.label.clone()); + } + } + }); + if let (Some(i), Some(q)) = (hovered, state.mention.as_mut()) { + q.selected = i; + } + if let Some(label) = picked { + insert_mention(ui.ctx(), id, prompt, state, &label); + ui.memory_mut(|m| m.request_focus(id)); + } +} + +/// The three-line grip that resizes the field (`.promptbox-resize-wrap::after`). +fn resize_grip(ui: &mut Ui, id: Id, field: Rect, state: &mut EditorState) { + let grip = Rect::from_min_size(pos2(field.right() - 12.0, field.bottom() - 12.0), vec2(12.0, 12.0)); + let resp = ui.interact(grip, id.with("grip"), Sense::drag()).on_hover_cursor(egui::CursorIcon::ResizeVertical); + if resp.dragged() { + let current = state.manual_height.unwrap_or(field.height()); + state.manual_height = Some((current + resp.drag_delta().y).clamp(MIN_HEIGHT, MAX_HEIGHT)); + state.expanded = false; + } + let ink = theme::fade(Color32::WHITE, if resp.hovered() || resp.dragged() { 0.8 } else { 0.5 }); + let p = ui.painter(); + let c = grip.right_bottom() - vec2(2.0, 2.0); + for k in [3.0, 6.0, 9.0] { + p.line_segment([c - vec2(k, 0.0), c - vec2(0.0, k)], Stroke::new(1.0, ink)); + } +} + +/// The prompt as a layout job with each known mention coloured and bold. +fn highlight(text: &str, mentions: &[MentionItem]) -> LayoutJob { + let plain = TextFormat { font_id: FontId::new(FONT_SIZE, FontFamily::Proportional), color: theme::INK, ..Default::default() }; + let mut job = LayoutJob::default(); + if mentions.is_empty() || !text.contains('@') { + job.append(text, 0.0, plain); + return job; + } + let mut sorted: Vec<&MentionItem> = mentions.iter().collect(); + sorted.sort_by_key(|m| std::cmp::Reverse(m.label.len())); + let bytes = text.as_bytes(); + let (mut start, mut i) = (0, 0); + while i < text.len() { + let hit = (bytes[i] == b'@').then(|| sorted.iter().find(|m| text.get(i..i + m.label.len()).is_some_and(|s| s.eq_ignore_ascii_case(&m.label)))).flatten(); + match hit { + Some(m) => { + job.append(&text[start..i], 0.0, plain.clone()); + let end = i + m.label.len(); + job.append(&text[i..end], 0.0, TextFormat { font_id: FontId::new(FONT_SIZE, theme::semibold()), color: m.color(), ..Default::default() }); + start = end; + i = end; + }, + None => i += text[i..].chars().next().map_or(1, char::len_utf8), + } + } + job.append(&text[start..], 0.0, plain); + job +} + +/// Mention labels for `n` items of `kind` (`@Image1`, `@Image2`, …). +pub fn mention_items(kind: MentionKind, previews: impl Iterator>) -> Vec { + let name = match kind { + MentionKind::Image => "Image", + MentionKind::Video => "Video", + MentionKind::Audio => "Audio", + }; + previews.enumerate().map(|(i, preview)| MentionItem { label: format!("@{name}{}", i + 1), kind, index: i + 1, preview }).collect() +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn colours_known_mentions_case_insensitively() { + let mentions = mention_items(MentionKind::Image, [None, None].into_iter()); + let job = highlight("put @image2 next to @Image1, not @Image3", &mentions); + let coloured: Vec<&str> = job.sections.iter().filter(|s| s.format.color != theme::INK).map(|s| &job.text[s.byte_range.start.0..s.byte_range.end.0]).collect(); + assert_eq!(coloured, ["@image2", "@Image1"]); + assert_eq!(mentions[1].color(), IMAGE_COLORS[1]); + } + + #[test] + fn counts_characters_not_bytes_for_the_limit() { + assert!(!is_over_limit("\u{65e5}\u{672c}\u{8a9e}", Some(3))); + assert!(is_over_limit("\u{65e5}\u{672c}\u{8a9e}!", Some(3))); + assert!(!is_over_limit("anything", None)); + } +} diff --git a/artcraft-native/src/prompt_box/mod.rs b/artcraft-native/src/prompt_box/mod.rs new file mode 100644 index 0000000000..92e1afe38a --- /dev/null +++ b/artcraft-native/src/prompt_box/mod.rs @@ -0,0 +1,346 @@ +//! The prompt box shared by the create pages (`PromptBox` in the webapp): the reference deck or +//! keyframe slots beside the prompt, a toolbar of page-specific pickers, clear-all, the credit +//! cost and the generate button; plus drag & drop, pasted images and the focus-mode modal. + +pub mod deck; +pub mod editor; +pub mod model_selector; +pub mod pickers; +pub mod refs; +#[cfg(test)] +mod ui_tests; + +use std::path::PathBuf; + +use egui::{Align2, Color32, FontId, Id, Rect, Sense, Stroke, Ui, pos2, vec2}; + +use crate::backend::media_cache::MediaCache; +use crate::theme; +use crate::ui::icons::{self, Icon}; +use crate::ui::widgets; +use deck::{DeckAction, DeckLimits}; +use editor::{EditorOptions, EditorState, MentionItem}; +use refs::{RefKind, References}; + +/// The box's widest (`max-w-5xl`). +pub const MAX_WIDTH: f32 = 1024.0; + +/// What sits left of the prompt. +pub enum DeckMode { + None, + /// The fanned reference deck. + References(DeckLimits), + /// First (and maybe last) frame slots. + Keyframes { + show_last: bool, + library: bool, + }, +} + +/// The page's settings for one frame of the box. +pub struct PromptBoxProps<'a> { + pub id: Id, + pub placeholder: &'a str, + pub enter_to_generate: bool, + pub mentions: &'a [MentionItem], + /// `Some` shows the length counter (`Some(None)` = unlimited). + pub max_length: Option>, + pub deck: DeckMode, + /// Which kinds a drop or paste may add right now. + pub accepts: &'a [RefKind], + /// The cost of generating, when known. + pub credits: Option, + pub generate_enabled: bool, + pub generating: bool, + /// Shown on the generate button. + pub generate_tooltip: &'a str, + /// A red note left of the generate button ("Starting frame required"). + pub warning: Option<&'a str>, + /// An info strip above the prompt. + pub banner: Option<&'a str>, +} + +/// Something the page should do. +#[derive(Debug)] +pub enum PromptBoxAction { + Generate, + Deck(DeckAction), + ClearAll, + DroppedFiles(Vec), + PastedImage(Vec), +} + +/// UI state that outlives a frame. +#[derive(Default)] +pub struct PromptBoxState { + pub editor: EditorState, + pub fullscreen: bool, + confirm_clear: bool, + focused: bool, +} + +/// Draws the box in `ui` (which should be as wide as the box). `toolbar_left` holds the model +/// selector and pickers; `toolbar_right` the count picker. Both may be drawn twice in a frame +/// (box and focus mode), each under its own id. +#[allow(clippy::too_many_arguments)] +pub fn show(ui: &mut Ui, prompt: &mut String, refs: &References, state: &mut PromptBoxState, props: &PromptBoxProps<'_>, cache: &mut MediaCache, toolbar_left: &mut dyn FnMut(&mut Ui), toolbar_right: &mut dyn FnMut(&mut Ui)) -> Vec { + let mut actions = Vec::new(); + let frame = egui::Frame::new().fill(theme::fade(theme::CONTROLS, 0.95)).stroke(Stroke::new(1.0, if state.focused { theme::ACCENT } else { theme::LINE })).corner_radius(theme::RADIUS).inner_margin(16); + let response = frame.show(ui, |ui| { + if let Some(banner) = props.banner { + info_banner(ui, banner); + } + ui.horizontal_top(|ui| { + ui.spacing_mut().item_spacing.x = 12.0; + deck_widget(ui, props, refs, cache, false, &mut actions); + ui.vertical(|ui| { + let out = editor_ui(ui, prompt, state, props, cache, None); + state.focused = out.focused; + if out.submit { + actions.push(PromptBoxAction::Generate); + } + if out.open_fullscreen { + state.fullscreen = true; + } + }); + }); + ui.add_space(14.0); + ui.horizontal(|ui| { + ui.spacing_mut().item_spacing.x = 8.0; + toolbar_left(ui); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + ui.spacing_mut().item_spacing.x = 6.0; + generate_cluster(ui, props, &mut actions); + clear_all_button(ui, prompt, refs, state, &mut actions); + toolbar_right(ui); + if let Some(warning) = props.warning { + warning_label(ui, warning); + } + }); + }); + }); + let rect = response.response.rect; + expand_toggle(ui, props.id, rect, state); + drop_target(ui, props, rect, &mut actions); + paste_images(ui, props, &mut actions); + if state.fullscreen { + focus_mode(ui.ctx(), prompt, refs, state, props, cache, toolbar_left, &mut actions); + } + if state.confirm_clear { + confirm_clear(ui.ctx(), props.id, state, &mut actions); + } + actions +} + +fn editor_ui(ui: &mut Ui, prompt: &mut String, state: &mut PromptBoxState, props: &PromptBoxProps<'_>, cache: &mut MediaCache, fixed_height: Option) -> editor::EditorOutput { + let fullscreen = fixed_height.is_some(); + let opts = EditorOptions { id: if fullscreen { props.id.with("focus-editor") } else { props.id.with("editor") }, placeholder: props.placeholder, enter_to_generate: props.enter_to_generate, mentions: props.mentions, max_length: if fullscreen { None } else { props.max_length }, fixed_height, fullscreen_button: !fullscreen, resizable: !fullscreen }; + let ctx = ui.ctx().clone(); + editor::show(ui, prompt, &mut state.editor, &opts, &mut |_, key| match cache.get(&ctx, key) { + crate::backend::media_cache::Lookup::Ready(t) => Some(t), + _ => None, + }) +} + +fn deck_widget(ui: &mut Ui, props: &PromptBoxProps<'_>, refs: &References, cache: &mut MediaCache, always_expanded: bool, actions: &mut Vec) { + let deck_actions = match &props.deck { + DeckMode::None => Vec::new(), + DeckMode::References(limits) => deck::reference_deck(ui, props.id.with(("deck", always_expanded)), refs, limits, cache, always_expanded), + DeckMode::Keyframes { show_last, library } => deck::keyframe_cards(ui, props.id.with(("keyframes", always_expanded)), refs, *show_last, *library, cache), + }; + actions.extend(deck_actions.into_iter().map(PromptBoxAction::Deck)); +} + +/// The coins + cost and the round generate button (`GenerateIconButton`). +fn generate_cluster(ui: &mut Ui, props: &PromptBoxProps<'_>, actions: &mut Vec) { + if widgets::generate_button(ui, props.generate_enabled && !props.generating, props.generating, props.generate_tooltip).clicked() { + actions.push(PromptBoxAction::Generate); + } + if let Some(credits) = props.credits { + let ink = theme::fade(theme::INK, if props.generate_enabled { 0.8 } else { 0.4 }); + let galley = ui.painter().layout_no_wrap(credits.to_string(), FontId::new(13.0, theme::semibold()), ink); + let (rect, resp) = ui.allocate_exact_size(vec2(galley.size().x + 22.0, 36.0), Sense::hover()); + icons::paint(ui.painter(), Rect::from_center_size(pos2(rect.left() + 7.0, rect.center().y), vec2(14.0, 14.0)), Icon::Coins, ink); + ui.painter().galley(pos2(rect.left() + 20.0, rect.center().y - galley.size().y / 2.0), galley, ink); + resp.on_hover_text(format!("{credits} credit{} cost", if credits == 1 { "" } else { "s" })); + } +} + +/// The eraser button and the hairline after it (`PromptClearAllButton`). +fn clear_all_button(ui: &mut Ui, prompt: &mut String, refs: &References, state: &mut PromptBoxState, actions: &mut Vec) { + let (rule, _) = ui.allocate_exact_size(vec2(1.0, 20.0), Sense::hover()); + ui.painter().rect_filled(rule, 0.0, theme::fade(theme::INK, 0.15)); + let clearable = !prompt.is_empty() || !refs.is_empty(); + let resp = ui.add_enabled_ui(clearable, |ui| widgets::ghost(ui, Icon::Eraser, None, "Clear all", false)).inner; + if resp.clicked() { + if refs.is_empty() { + prompt.clear(); + actions.push(PromptBoxAction::ClearAll); + } else { + state.confirm_clear = true; + } + } +} + +fn confirm_clear(ctx: &egui::Context, id: Id, state: &mut PromptBoxState, actions: &mut Vec) { + let mut choice = None; + let resp = widgets::modal(ctx, id.with("confirm-clear"), 420.0, |ui| { + ui.label(widgets::heading("Clear all?", 20.0)); + ui.add_space(8.0); + ui.label(egui::RichText::new("This clears the prompt and also removes the attached references.").color(theme::MUTED)); + ui.add_space(16.0); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + if widgets::button(ui, None, "Clear all", widgets::Kind::Danger, 0.0, theme::CONTROL_H).clicked() { + choice = Some(true); + } + if widgets::button(ui, None, "Cancel", widgets::Kind::Secondary, 0.0, theme::CONTROL_H).clicked() { + choice = Some(false); + } + }); + }); + if resp || choice.is_some() { + state.confirm_clear = false; + } + if choice == Some(true) { + actions.push(PromptBoxAction::ClearAll); + } +} + +/// The chevron centred on the box's bottom edge that toggles the tall editor. +fn expand_toggle(ui: &mut Ui, id: Id, rect: Rect, state: &mut PromptBoxState) { + let button = Rect::from_center_size(pos2(rect.center().x, rect.bottom() - 6.0), vec2(38.0, 16.0)); + let resp = ui.interact(button, id.with("expand"), Sense::click()).on_hover_text(if state.editor.expanded { "Collapse" } else { "Expand" }).on_hover_cursor(egui::CursorIcon::PointingHand); + let ink = theme::fade(Color32::WHITE, if resp.hovered() { 0.9 } else { 0.3 }); + icons::paint(ui.painter(), Rect::from_center_size(button.center(), vec2(12.0, 12.0)), if state.editor.expanded { Icon::ChevronUp } else { Icon::ChevronDown }, ink); + if resp.clicked() { + state.editor.expanded = !state.editor.expanded; + state.editor.manual_height = None; + } +} + +fn warning_label(ui: &mut Ui, text: &str) { + let pulse = (ui.input(|i| i.time) * 2.0).sin() as f32 * 0.25 + 0.75; + ui.label(egui::RichText::new(text).size(12.0).color(theme::BAD)); + let (rect, _) = ui.allocate_exact_size(vec2(14.0, 14.0), Sense::hover()); + icons::paint(ui.painter(), rect, Icon::Info, theme::fade(theme::BAD, pulse)); + ui.ctx().request_repaint_after(std::time::Duration::from_millis(50)); +} + +fn info_banner(ui: &mut Ui, text: &str) { + egui::Frame::new().fill(theme::fade(theme::ACCENT, 0.12)).stroke(Stroke::new(1.0, theme::fade(theme::ACCENT, 0.35))).corner_radius(theme::RADIUS).inner_margin(egui::Margin::symmetric(10, 6)).show(ui, |ui| { + ui.horizontal(|ui| { + icons::icon(ui, Icon::Info, 14.0, theme::ACCENT_INK); + ui.label(egui::RichText::new(text).size(12.5).color(theme::INK)); + }); + }); + ui.add_space(10.0); +} + +/// Files dragged over the window: an overlay on the box, and the drop when released. +fn drop_target(ui: &mut Ui, props: &PromptBoxProps<'_>, rect: Rect, actions: &mut Vec) { + let (hovered, dropped) = ui.input(|i| (i.raw.hovered_files.clone(), i.raw.dropped_files.clone())); + if !dropped.is_empty() { + let paths: Vec = dropped.iter().map(|f| f.path().to_path_buf()).filter(|p| !p.as_os_str().is_empty()).collect(); + if !paths.is_empty() { + actions.push(PromptBoxAction::DroppedFiles(paths)); + } + return; + } + if hovered.is_empty() { + return; + } + let kinds: Vec> = hovered.iter().map(|f| f.path.as_deref().and_then(RefKind::from_path)).collect(); + // Without paths (some platforms) we can't tell yet: assume it fits. + let accepted = kinds.iter().all(|k| k.is_none() || k.is_some_and(|k| props.accepts.contains(&k))) && !props.accepts.is_empty(); + let keyframes = matches!(props.deck, DeckMode::Keyframes { .. }); + let p = ui.ctx().layer_painter(egui::LayerId::new(egui::Order::Foreground, props.id.with("drop-overlay"))); + p.rect_filled(rect, theme::RADIUS, theme::fade(theme::CONTROLS, 0.85)); + let border = if accepted { theme::fade(Color32::WHITE, 0.6) } else { theme::fade(theme::BAD, 0.8) }; + icons::dashed_rect(&p, rect.shrink(1.0), Stroke::new(2.0, border), 6.0, 4.0); + let chip = Rect::from_center_size(rect.center() - vec2(0.0, 22.0), vec2(36.0, 36.0)); + p.rect(chip, theme::RADIUS, theme::CONTROLS, theme::hairline(), egui::StrokeKind::Inside); + icons::paint(&p, chip.shrink(9.0), if accepted { Icon::Image } else { Icon::AlertCircle }, if accepted { theme::INK } else { theme::BAD }); + let names: Vec<&str> = props + .accepts + .iter() + .map(|k| match k { + RefKind::Image => "Images", + RefKind::Video => "Videos", + RefKind::Audio => "Audio", + }) + .collect(); + let (title, subtitle) = if !accepted { + ("That file type isn't supported".to_owned(), format!("Accepts {} files", names.join(", ").to_lowercase())) + } else if keyframes { + ("Drop to set your frames".to_owned(), "Frames".to_owned()) + } else { + ("Drop to add references".to_owned(), names.join(", ")) + }; + p.text(rect.center() + vec2(0.0, 10.0), Align2::CENTER_CENTER, title, FontId::new(14.0, theme::semibold()), theme::INK); + p.text(rect.center() + vec2(0.0, 28.0), Align2::CENTER_CENTER, subtitle, FontId::new(12.0, egui::FontFamily::Proportional), theme::MUTED); +} + +/// Ctrl/Cmd+V with an image on the clipboard. egui only forwards text pastes, so this watches for +/// the V key's release and reads the image itself. +fn paste_images(ui: &mut Ui, props: &PromptBoxProps<'_>, actions: &mut Vec) { + if props.accepts.is_empty() { + return; + } + let released = ui.input(|i| i.events.iter().any(|e| matches!(e, egui::Event::Key { key: egui::Key::V, pressed: false, modifiers, .. } if modifiers.command))); + if !released { + return; + } + let Ok(mut clipboard) = arboard::Clipboard::new() else { + return; + }; + let Ok(image) = clipboard.get_image() else { + return; + }; + let Some(rgba) = image::RgbaImage::from_raw(image.width as u32, image.height as u32, image.bytes.into_owned()) else { + return; + }; + let mut png = Vec::new(); + if image::DynamicImage::ImageRgba8(rgba).write_to(&mut std::io::Cursor::new(&mut png), image::ImageFormat::Png).is_ok() { + actions.push(PromptBoxAction::PastedImage(png)); + } +} + +/// Focus mode: a large editor in a modal, with the deck and toolbar at hand. +#[allow(clippy::too_many_arguments)] +fn focus_mode(ctx: &egui::Context, prompt: &mut String, refs: &References, state: &mut PromptBoxState, props: &PromptBoxProps<'_>, cache: &mut MediaCache, toolbar_left: &mut dyn FnMut(&mut Ui), actions: &mut Vec) { + let height = ctx.content_rect().height() * 0.7; + let mut done = false; + let closed = widgets::modal(ctx, props.id.with("focus-mode"), 896.0, |ui| { + ui.set_height(height); + ui.label(widgets::heading("Prompt", 22.0)); + ui.add_space(10.0); + let editor_h = (height - 160.0 - if refs.is_empty() { 0.0 } else { 80.0 }).max(120.0); + let out = editor_ui(ui, prompt, state, props, cache, Some(editor_h)); + if out.submit { + actions.push(PromptBoxAction::Generate); + } + if let Some(limit) = props.max_length { + let count = prompt.chars().count(); + let over = editor::is_over_limit(prompt, limit); + let text = limit.map_or_else(|| format!("{count} / \u{221e}"), |max| format!("{count} / {max}")); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Min), |ui| { + ui.label(egui::RichText::new(text).size(11.0).monospace().color(if over { Color32::from_rgb(0xef, 0x44, 0x44) } else { theme::FAINT })); + }); + } + ui.push_id("focus-deck", |ui| deck_widget(ui, props, refs, cache, true, actions)); + ui.add_space(12.0); + ui.horizontal(|ui| { + ui.push_id("focus-toolbar", |ui| ui.horizontal(|ui| toolbar_left(ui))); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + if widgets::button(ui, None, "Done", widgets::Kind::Primary, 0.0, theme::CONTROL_H).clicked() { + done = true; + } + ui.push_id("focus-clear", |ui| clear_all_button(ui, prompt, refs, state, actions)); + }); + }); + }); + if closed || done { + state.fullscreen = false; + state.editor.focus_requested = true; + } +} diff --git a/artcraft-native/src/prompt_box/model_selector.rs b/artcraft-native/src/prompt_box/model_selector.rs new file mode 100644 index 0000000000..d444428299 --- /dev/null +++ b/artcraft-native/src/prompt_box/model_selector.rs @@ -0,0 +1,130 @@ +//! The embedded model selector (`ClassyModelSelector variant="embedded"`): a pill with the +//! maker's logo and the model's name, opening "Select Model". Long lists group by family, each +//! family opening a flyout of its variants on hover. + +use egui::{Align2, Id, Order, Popup, Rect, Ui, pos2}; + +use crate::models::{self, ModelInfo}; +use crate::prompt_box::pickers; +use crate::ui::widgets::{self, Leading, RowLead}; +use crate::ui::{creator_icons, icons}; + +const PANEL_WIDTH: f32 = 280.0; +const FLYOUT_WIDTH: f32 = 300.0; + +/// Draws the selector; returns the id of a newly picked model. +pub fn model_selector(ui: &mut Ui, id: Id, models: &[ModelInfo], selected: Option<&ModelInfo>, show_badges: bool) -> Option { + let popup_id = ui.make_persistent_id(id).with("popup"); + let open = Popup::is_id_open(ui.ctx(), popup_id); + let label = selected.map_or("Select model", |m| m.name.as_str()); + let logo = selected.map(|m| creator_icons::texture(ui.ctx(), &m.creator)); + let resp = ui.push_id(id, |ui| { + ui.set_max_width(192.0 + 40.0); + match &logo { + Some(t) => widgets::pill(ui, Leading::Logo(t), label, open), + None => widgets::pill(ui, Leading::Icon(icons::Icon::Sparkles), label, open), + } + }); + let resp = resp.inner.on_hover_text("Model"); + let mut picked = None; + let hovered_family_id = id.with("family"); + pickers::popover(&resp, popup_id, |ui| { + ui.set_width(PANEL_WIDTH); + widgets::menu_header(ui, "Select Model"); + let max_h = ui.ctx().content_rect().height() * 0.6; + egui::ScrollArea::vertical().max_height(max_h).auto_shrink([false, true]).show(ui, |ui| match models::grouped(models) { + Some(families) => { + let mut hovered: Option = ui.data(|d| d.get_temp(hovered_family_id)); + for family in &families { + let contains_selected = selected.is_some_and(|s| family.models.iter().any(|m| m.id == s.id)); + let first = family.models[0]; + let tex = creator_icons::texture(ui.ctx(), &first.creator); + let subtitle = if contains_selected { selected.map(|s| s.name.as_str()) } else { None }; + let is_open = hovered.as_deref() == Some(family.name.as_str()); + if family.models.len() == 1 { + let row = widgets::menu_row(ui, RowLead::Logo(&tex), &first.name, non_empty(&first.description), contains_selected, false, false); + if row.hovered() { + hovered = None; + } + if row.clicked() { + picked = Some(first.id.clone()); + } + continue; + } + let row = widgets::menu_row(ui, RowLead::Logo(&tex), &family.name, subtitle, false, true, is_open); + if row.hovered() || row.clicked() { + hovered = Some(family.name.clone()); + } + if hovered.as_deref() == Some(family.name.as_str()) { + if let Some(id) = flyout(ui, id, row.rect, &family.name, &family.models, selected, show_badges) { + picked = Some(id); + } + } + } + ui.data_mut(|d| d.insert_temp(hovered_family_id, hovered)); + }, + None => { + for m in models { + if model_row(ui, m, selected, show_badges) { + picked = Some(m.id.clone()); + } + } + }, + }); + }); + if picked.is_some() { + Popup::close_id(ui.ctx(), popup_id); + ui.data_mut(|d| d.remove::>(hovered_family_id)); + } + picked.filter(|p| selected.is_none_or(|s| &s.id != p)) +} + +/// A family's variants, to the right of its row. +fn flyout(ui: &Ui, id: Id, row: Rect, family: &str, list: &[&ModelInfo], selected: Option<&ModelInfo>, show_badges: bool) -> Option { + let mut picked = None; + egui::Area::new(id.with(("flyout", family))).order(Order::Tooltip).pivot(Align2::LEFT_TOP).fixed_pos(pos2(row.right() + 10.0, row.top() - 32.0)).show(ui.ctx(), |ui| { + widgets::popover_frame().show(ui, |ui| { + ui.set_width(FLYOUT_WIDTH); + widgets::menu_header(ui, family); + for m in list { + if model_row(ui, m, selected, show_badges) { + picked = Some(m.id.clone()); + } + } + }); + }); + picked +} + +/// One model: logo tile, name, description (and capability badges for video). +fn model_row(ui: &mut Ui, m: &ModelInfo, selected: Option<&ModelInfo>, show_badges: bool) -> bool { + let tex = creator_icons::texture(ui.ctx(), &m.creator); + let is_selected = selected.is_some_and(|s| s.id == m.id); + let badges = if show_badges { capability_badges(m) } else { String::new() }; + let subtitle = match (m.description.is_empty(), badges.is_empty()) { + (true, true) => None, + (false, true) => Some(m.description.clone()), + (true, false) => Some(badges), + (false, false) => Some(format!("{} \u{b7} {badges}", m.description)), + }; + widgets::menu_row(ui, RowLead::Logo(&tex), &m.name, subtitle.as_deref(), is_selected, false, false).clicked() +} + +/// The video picker's capability badges ("Audio Support", "Start/End", "Reference"). +fn capability_badges(m: &ModelInfo) -> String { + let mut badges = Vec::new(); + if m.sound_toggle { + badges.push("Audio Support"); + } + if m.start_frame && m.end_frame { + badges.push("Start/End"); + } + if m.supports_reference_mode() { + badges.push("Reference"); + } + badges.join(" \u{b7} ") +} + +fn non_empty(s: &str) -> Option<&str> { + (!s.is_empty()).then_some(s) +} diff --git a/artcraft-native/src/prompt_box/pickers.rs b/artcraft-native/src/prompt_box/pickers.rs new file mode 100644 index 0000000000..5b09b7581a --- /dev/null +++ b/artcraft-native/src/prompt_box/pickers.rs @@ -0,0 +1,128 @@ +//! Toolbar pickers: a pill (or quiet icon button) that opens a popover above it with a titled +//! option list, the duration slider, and on/off toggles. + +use egui::{Popup, PopupCloseBehavior}; +use egui::{Id, RectAlign, Response, Ui}; + +use crate::theme; +use crate::ui::icons::Icon; +use crate::ui::widgets::{self, Leading, RowLead}; + +/// What an option shows at its left. +#[derive(Clone, Debug, PartialEq)] +pub enum OptionLead { + None, + Icon(Icon), + Aspect(Option<(f32, f32)>), +} + +#[derive(Clone, Debug)] +pub struct PickOption { + pub value: T, + pub label: String, + pub subtitle: Option, + pub lead: OptionLead, +} + +impl PickOption { + pub fn new(value: T, label: impl Into) -> Self { + Self { value, label: label.into(), subtitle: None, lead: OptionLead::None } + } + + pub fn lead(mut self, lead: OptionLead) -> Self { + self.lead = lead; + self + } + + pub fn subtitle(mut self, subtitle: impl Into) -> Self { + self.subtitle = Some(subtitle.into()); + self + } +} + +/// How a picker's trigger looks. +pub enum Trigger<'a> { + /// A toolbar pill with a lead and the selected label. + Pill(Leading<'a>), + /// A quiet 36 px icon button followed by the selected label (the count picker). + Ghost(Icon), +} + +/// A picker whose popover lists `options`; returns the newly chosen value. +pub fn option_picker(ui: &mut Ui, id: Id, trigger: Trigger<'_>, title: &str, tooltip: &str, current: &T, options: &[PickOption]) -> Option { + let selected = options.iter().find(|o| o.value == *current); + let label = selected.map_or("", |o| o.label.as_str()); + // Scoped to the parent, so the same picker in the box and in focus mode stay separate. + let popup_id = ui.make_persistent_id(id).with("popup"); + let open = Popup::is_id_open(ui.ctx(), popup_id); + let resp = ui.push_id(id, |ui| match trigger { + Trigger::Pill(lead) => widgets::pill(ui, lead, label, open), + Trigger::Ghost(icon) => widgets::ghost(ui, icon, Some(label), tooltip, open), + }); + let resp = resp.inner.on_hover_text(tooltip); + let mut picked = None; + popover(&resp, popup_id, |ui| { + ui.set_min_width(180.0); + widgets::menu_header(ui, title); + for option in options { + let lead = match option.lead { + OptionLead::None => RowLead::None, + OptionLead::Icon(icon) => RowLead::Icon(icon), + OptionLead::Aspect(ratio) => RowLead::Aspect(ratio), + }; + let is_selected = option.value == *current; + if widgets::menu_row(ui, lead, &option.label, option.subtitle.as_deref(), is_selected, false, false).clicked() { + picked = Some(option.value.clone()); + } + } + }); + if picked.is_some() { + Popup::close_id(ui.ctx(), popup_id); + } + picked.filter(|v| v != current) +} + +/// Opens a popover above `anchor` (toggled by clicking it) and fills it with `content`. +pub fn popover(anchor: &Response, popup_id: Id, content: impl FnOnce(&mut Ui)) { + Popup::from_toggle_button_response(anchor).id(popup_id).align(RectAlign::TOP_START).align_alternatives(&[RectAlign::BOTTOM_START, RectAlign::TOP_END]).gap(6.0).frame(widgets::popover_frame()).close_behavior(PopupCloseBehavior::CloseOnClickOutside).show(|ui| { + ui.spacing_mut().item_spacing.y = 2.0; + content(ui); + }); +} + +/// The duration popover: a clock pill reading `5s`, opening a 1-second-step slider between the +/// model's minimum and maximum. Returns the new value. +pub fn duration_picker(ui: &mut Ui, id: Id, current: u32, min: u32, max: u32) -> Option { + let popup_id = ui.make_persistent_id(id).with("popup"); + let open = Popup::is_id_open(ui.ctx(), popup_id); + let resp = ui.push_id(id, |ui| widgets::pill(ui, Leading::Icon(Icon::Clock), &format!("{current}s"), open)).inner.on_hover_text("Duration"); + let mut value = current; + popover(&resp, popup_id, |ui| { + ui.set_width(240.0); + widgets::menu_header(ui, "Duration"); + ui.add_space(4.0); + ui.horizontal(|ui| { + ui.add_space(8.0); + ui.style_mut().spacing.slider_width = 210.0; + ui.add(egui::Slider::new(&mut value, min..=max).step_by(1.0).suffix("s").show_value(false)); + }); + ui.horizontal(|ui| { + ui.add_space(8.0); + ui.label(egui::RichText::new(format!("{min}s")).size(11.0).color(theme::FAINT)); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + ui.add_space(8.0); + ui.label(egui::RichText::new(format!("{max}s")).size(11.0).color(theme::FAINT)); + ui.centered_and_justified(|ui| { + ui.label(egui::RichText::new(format!("{value}s")).size(13.0).family(theme::semibold()).color(theme::INK)); + }); + }); + }); + }); + (value != current).then_some(value) +} + +/// An on/off toolbar toggle (sound): a pill that's highlighted while on. +pub fn toggle(ui: &mut Ui, id: Id, icon: Icon, label: &str, on: bool, tooltip: &str) -> bool { + let resp = ui.push_id(id, |ui| widgets::pill(ui, Leading::Icon(icon), label, on)).inner.on_hover_text(tooltip); + resp.clicked() +} diff --git a/artcraft-native/src/prompt_box/refs.rs b/artcraft-native/src/prompt_box/refs.rs new file mode 100644 index 0000000000..76421728c2 --- /dev/null +++ b/artcraft-native/src/prompt_box/refs.rs @@ -0,0 +1,169 @@ +//! Reference media attached to a prompt: images, videos and audio clips, either uploaded from +//! disk or picked from the library. + +use std::sync::atomic::{AtomicU64, Ordering}; + +static NEXT_ID: AtomicU64 = AtomicU64::new(1); + +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum RefKind { + Image, + Video, + Audio, +} + +impl RefKind { + pub fn noun(self) -> &'static str { + match self { + RefKind::Image => "image", + RefKind::Video => "video", + RefKind::Audio => "audio", + } + } + + /// Which kind a file is, by extension (the webapp's drop routing lists). + pub fn from_path(path: &std::path::Path) -> Option { + let ext = path.extension()?.to_str()?.to_ascii_lowercase(); + match ext.as_str() { + "png" | "jpg" | "jpeg" | "webp" | "gif" | "bmp" | "avif" => Some(RefKind::Image), + "mp4" | "mov" | "webm" | "mkv" | "avi" | "m4v" => Some(RefKind::Video), + "mp3" | "wav" | "ogg" | "flac" | "aac" | "m4a" | "opus" => Some(RefKind::Audio), + _ => None, + } + } +} + +#[derive(Clone, Debug, PartialEq)] +pub enum RefStatus { + Uploading, + Ready, +} + +/// One attached reference. +#[derive(Clone, Debug)] +pub struct RefMedia { + pub id: u64, + pub kind: RefKind, + pub status: RefStatus, + /// The server's media file token, once uploaded (or picked from the library). + pub token: Option, + /// Media cache key of the thumbnail (a CDN URL or a `local://` key). + pub preview: Option, + /// The full-size URL, for the preview modal. + pub full_url: Option, + /// Seconds, for videos and audio (counts toward the model's total-duration limit). + pub duration_secs: f32, +} + +impl RefMedia { + pub fn uploading(kind: RefKind, preview: Option) -> Self { + Self { id: NEXT_ID.fetch_add(1, Ordering::Relaxed), kind, status: RefStatus::Uploading, token: None, preview, full_url: None, duration_secs: 0.0 } + } + + pub fn from_library(kind: RefKind, token: String, preview: Option, full_url: Option, duration_secs: f32) -> Self { + Self { id: NEXT_ID.fetch_add(1, Ordering::Relaxed), kind, status: RefStatus::Ready, token: Some(token), preview, full_url, duration_secs } + } +} + +/// Where an image goes: the reference deck, or one of the two keyframe slots. +#[derive(Clone, Copy, Debug, PartialEq, Eq, Hash)] +pub enum ImageSlot { + Reference, + FirstFrame, + LastFrame, +} + +/// Everything attached to one prompt box. +#[derive(Clone, Debug, Default)] +pub struct References { + pub images: Vec, + pub videos: Vec, + pub audios: Vec, + pub first_frame: Option, + pub last_frame: Option, +} + +impl References { + pub fn is_empty(&self) -> bool { + self.images.is_empty() && self.videos.is_empty() && self.audios.is_empty() && self.first_frame.is_none() && self.last_frame.is_none() + } + + pub fn clear(&mut self) { + *self = Self::default(); + } + + pub fn list(&self, kind: RefKind) -> &Vec { + match kind { + RefKind::Image => &self.images, + RefKind::Video => &self.videos, + RefKind::Audio => &self.audios, + } + } + + pub fn list_mut(&mut self, kind: RefKind) -> &mut Vec { + match kind { + RefKind::Image => &mut self.images, + RefKind::Video => &mut self.videos, + RefKind::Audio => &mut self.audios, + } + } + + pub fn total_secs(&self, kind: RefKind) -> f32 { + self.list(kind).iter().map(|r| r.duration_secs).sum() + } + + pub fn any_uploading(&self) -> bool { + let slots = self.first_frame.iter().chain(self.last_frame.iter()); + self.images.iter().chain(&self.videos).chain(&self.audios).chain(slots).any(|r| r.status == RefStatus::Uploading) + } + + /// Finds a reference anywhere by id. + pub fn find_mut(&mut self, id: u64) -> Option<&mut RefMedia> { + let slots = self.first_frame.iter_mut().chain(self.last_frame.iter_mut()); + self.images.iter_mut().chain(self.videos.iter_mut()).chain(self.audios.iter_mut()).chain(slots).find(|r| r.id == id) + } + + /// Removes a reference anywhere by id. + pub fn remove(&mut self, id: u64) { + for list in [&mut self.images, &mut self.videos, &mut self.audios] { + list.retain(|r| r.id != id); + } + if self.first_frame.as_ref().is_some_and(|r| r.id == id) { + self.first_frame = None; + } + if self.last_frame.as_ref().is_some_and(|r| r.id == id) { + self.last_frame = None; + } + } + + pub fn swap_frames(&mut self) { + std::mem::swap(&mut self.first_frame, &mut self.last_frame); + } +} + +#[cfg(test)] +mod tests { + use super::*; + use std::path::Path; + + #[test] + fn routes_files_by_extension() { + assert_eq!(RefKind::from_path(Path::new("a/B.PNG")), Some(RefKind::Image)); + assert_eq!(RefKind::from_path(Path::new("clip.mov")), Some(RefKind::Video)); + assert_eq!(RefKind::from_path(Path::new("beat.m4a")), Some(RefKind::Audio)); + assert_eq!(RefKind::from_path(Path::new("notes.txt")), None); + } + + #[test] + fn swapping_frames_and_removing_by_id() { + let mut refs = References::default(); + let (a, b) = (RefMedia::from_library(RefKind::Image, "a".into(), None, None, 0.0), RefMedia::from_library(RefKind::Image, "b".into(), None, None, 0.0)); + let a_id = a.id; + refs.first_frame = Some(a); + refs.last_frame = Some(b); + refs.swap_frames(); + assert_eq!(refs.first_frame.as_ref().and_then(|r| r.token.as_deref()), Some("b")); + refs.remove(a_id); + assert!(refs.last_frame.is_none()); + } +} diff --git a/artcraft-native/src/prompt_box/ui_tests.rs b/artcraft-native/src/prompt_box/ui_tests.rs new file mode 100644 index 0000000000..7baa196ad8 --- /dev/null +++ b/artcraft-native/src/prompt_box/ui_tests.rs @@ -0,0 +1,143 @@ +//! Drives the prompt box headlessly (egui_kittest): generate gating, Enter-to-generate, the +//! pickers, @-mentions and clear-all. + +use egui::accesskit::Role; +use egui_kittest::Harness; +use egui_kittest::kittest::Queryable; + +use crate::backend::media_cache::MediaCache; +use crate::models::ModelInfo; +use crate::pages::toolbar; +use crate::prompt_box::deck::DeckLimits; +use crate::prompt_box::editor::{MentionKind, mention_items}; +use crate::prompt_box::refs::{RefKind, References}; +use crate::prompt_box::{DeckMode, PromptBoxProps, PromptBoxState, show}; + +struct State { + // Keeps the media cache's runtime alive. + _rt: tokio::runtime::Runtime, + cache: MediaCache, + prompt: String, + refs: References, + box_state: PromptBoxState, + model: ModelInfo, + aspect: String, + enter_to_generate: bool, + with_mentions: bool, + actions: Vec, + /// The harness draws one frame while building: fonts are installed then and used from the next. + fonts_ready: bool, +} + +fn state() -> State { + let rt = tokio::runtime::Builder::new_current_thread().enable_all().build().expect("runtime"); + let cache = MediaCache::new(rt.handle().clone(), reqwest::Client::new()); + let model = ModelInfo { id: "nano_banana_pro".into(), name: "Nano Banana Pro".into(), aspect_ratios: vec!["square".into(), "wide_sixteen_by_nine".into()], image_refs_max: 4, batch_default: 1, ..Default::default() }; + State { _rt: rt, cache, prompt: String::new(), refs: References::default(), box_state: PromptBoxState::default(), model, aspect: "square".into(), enter_to_generate: false, with_mentions: false, actions: Vec::new(), fonts_ready: false } +} + +fn build(state: State) -> Harness<'static, State> { + let mut harness = Harness::builder().with_size(egui::vec2(1100.0, 600.0)).build_ui_state( + |ui, s: &mut State| { + if !s.fonts_ready { + crate::theme::apply(ui.ctx()); + s.fonts_ready = true; + return; + } + let mentions = if s.with_mentions { mention_items(MentionKind::Image, [None, None].into_iter()) } else { Vec::new() }; + let props = PromptBoxProps { id: egui::Id::new("test-box"), placeholder: "Describe what you want in the image...", enter_to_generate: s.enter_to_generate, mentions: &mentions, max_length: Some(Some(1000)), deck: DeckMode::References(DeckLimits { max_images: 4, max_videos: 0, max_video_secs: None, max_audios: 0, max_audio_secs: None, library: false }), accepts: &[RefKind::Image], credits: Some(15), generate_enabled: !s.prompt.trim().is_empty(), generating: false, generate_tooltip: "Generate", warning: None, banner: None }; + let (model, aspect) = (&s.model, &mut s.aspect); + let mut left = |ui: &mut egui::Ui| { + if let Some(v) = toolbar::aspect_ratio(ui, egui::Id::new("test-aspect"), model, aspect) { + *aspect = v; + } + }; + let mut right = |_: &mut egui::Ui| {}; + let actions = show(ui, &mut s.prompt, &s.refs, &mut s.box_state, &props, &mut s.cache, &mut left, &mut right); + s.actions.extend(actions.iter().map(|a| format!("{a:?}"))); + }, + state, + ); + harness.run(); + harness +} + +fn editor<'h>(harness: &'h Harness<'_, State>) -> egui_kittest::Node<'h> { + harness.get_by_role(Role::MultilineTextInput) +} + +#[test] +fn generate_needs_a_prompt() { + let mut harness = build(state()); + harness.get_by_label("Generate").click(); + harness.run(); + assert!(harness.state().actions.is_empty(), "disabled without a prompt"); + + harness.state_mut().prompt = "a red knight".into(); + harness.run(); + harness.get_by_label("Generate").click(); + harness.run(); + assert_eq!(harness.state().actions, ["Generate"]); +} + +#[test] +fn enter_generates_only_when_the_setting_is_on() { + let mut harness = build(state()); + editor(&harness).focus(); + harness.run(); + editor(&harness).type_text("hello"); + harness.key_press(egui::Key::Enter); + harness.run(); + assert_eq!(harness.state().prompt, "hello\n"); + assert!(harness.state().actions.is_empty()); + + let mut s = state(); + s.enter_to_generate = true; + let mut harness = build(s); + editor(&harness).focus(); + harness.run(); + editor(&harness).type_text("hello"); + harness.key_press(egui::Key::Enter); + harness.run(); + assert_eq!(harness.state().prompt, "hello"); + assert_eq!(harness.state().actions, ["Generate"]); +} + +#[test] +fn aspect_ratio_picker_opens_and_picks() { + let mut harness = build(state()); + harness.get_by_label("Square").click(); + harness.run(); + harness.get_by_label("16:9 (Wide)").click(); + harness.run(); + assert_eq!(harness.state().aspect, "wide_sixteen_by_nine"); + assert!(harness.query_by_label("16:9 (Wide)").is_some(), "the pill now shows the pick"); +} + +#[test] +fn typing_at_offers_mentions_and_enter_inserts_one() { + let mut s = state(); + s.with_mentions = true; + let mut harness = build(s); + editor(&harness).focus(); + harness.run(); + editor(&harness).type_text("put @Im"); + harness.run(); + assert!(harness.query_by_label("@Image2").is_some(), "dropdown lists the mentions"); + harness.key_press(egui::Key::ArrowDown); + harness.key_press(egui::Key::Enter); + harness.run(); + assert_eq!(harness.state().prompt, "put @Image2 "); + assert!(harness.state().actions.is_empty(), "Enter picked a mention, it didn't generate"); +} + +#[test] +fn clear_all_empties_the_prompt() { + let mut s = state(); + s.prompt = "something".into(); + let mut harness = build(s); + harness.get_by_label("Clear all").click(); + harness.run(); + assert_eq!(harness.state().prompt, ""); + assert_eq!(harness.state().actions, ["ClearAll"]); +} diff --git a/artcraft-native/src/shell.rs b/artcraft-native/src/shell.rs new file mode 100644 index 0000000000..6b6c91354f --- /dev/null +++ b/artcraft-native/src/shell.rs @@ -0,0 +1,395 @@ +//! The app frame from the webapp: a floating sidebar (`app-sidebar`) and the top bar with +//! breadcrumbs, feed toggles, credits and the account menu (`topbar`). + +use egui::{Align2, Color32, FontId, Id, Rect, Sense, Stroke, Ui, pos2, vec2}; + +use crate::feed::grid::ViewMode; +use crate::theme; +use crate::ui::icons::{self, Icon}; +use crate::ui::widgets; + +const SIDEBAR_WIDTH: f32 = 232.0; +const SIDEBAR_INSET: f32 = 8.0; +const TOPBAR_HEIGHT: f32 = 57.0; +const ROW_HEIGHT: f32 = 32.0; +pub const DISCORD_URL: &str = "https://discord.gg/artcraft"; +pub const GITHUB_URL: &str = "https://github.com/storytold/artcraft"; +pub const TUTORIALS_URL: &str = "https://www.youtube.com/@OfficialArtCraftStudios"; +pub const WEB_APP_URL: &str = "https://app.getartcraft.com"; + +/// Every page in the navigation. +#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize)] +pub enum Page { + Home, + #[default] + CreateImage, + CreateVideo, + CreateAudio, + Object3d, + World3d, + EditImage, + Stage3d, + VideoEditor, + RemoveBackground, + FrameExtractor, + Library, +} + +impl Page { + pub fn label(self) -> &'static str { + match self { + Page::Home => "Home", + Page::CreateImage => "Image", + Page::CreateVideo => "Video", + Page::CreateAudio => "Audio", + Page::Object3d => "3D Object", + Page::World3d => "3D World", + Page::EditImage => "Edit Image", + Page::Stage3d => "3D Stage", + Page::VideoEditor => "Edit Video", + Page::RemoveBackground => "BG Remove", + Page::FrameExtractor => "Frame Extract", + Page::Library => "Library", + } + } + + fn icon(self) -> Icon { + match self { + Page::Home => Icon::Home, + Page::CreateImage => Icon::Image, + Page::CreateVideo => Icon::Video, + Page::CreateAudio => Icon::Music, + Page::Object3d | Page::Stage3d => Icon::Box, + Page::World3d => Icon::Globe, + Page::EditImage => Icon::Pencil, + Page::VideoEditor | Page::FrameExtractor => Icon::Film, + Page::RemoveBackground => Icon::Wand, + Page::Library => Icon::Library, + } + } + + /// The breadcrumb trail (`Create › Image`). + pub fn crumbs(self) -> (&'static str, &'static str) { + match self { + Page::Home => ("ArtCraft", "Home"), + Page::CreateImage | Page::CreateVideo | Page::CreateAudio | Page::Object3d | Page::World3d => ("Create", self.label()), + Page::Library => ("Assets", "Library"), + _ => ("Studio", self.label()), + } + } + + /// A page by its web-app style slug (`create-image`), for `ARTCRAFT_PAGE`. + pub fn from_slug(slug: &str) -> Option { + Some(match slug { + "home" => Page::Home, + "create-image" | "image" => Page::CreateImage, + "create-video" | "video" => Page::CreateVideo, + "library" => Page::Library, + _ => return None, + }) + } + + /// Pages the native app has; the rest open a "coming soon" page. + pub fn is_ready(self) -> bool { + matches!(self, Page::Home | Page::CreateImage | Page::CreateVideo | Page::Library) + } + + /// The same tool in the web app. + pub fn web_path(self) -> &'static str { + match self { + Page::CreateAudio => "/create-audio", + Page::Object3d => "/create-object", + Page::World3d => "/create-world", + Page::EditImage => "/pagedraw", + Page::Stage3d => "/pagescene", + Page::VideoEditor => "/video-editor", + Page::RemoveBackground => "/create-vfx", + Page::FrameExtractor => "/frame-extractor", + Page::CreateVideo => "/create-video", + Page::Library => "/library", + _ => "/create-image", + } + } +} + +const SECTIONS: [(&str, &[Page]); 3] = [("Create", &[Page::CreateImage, Page::CreateVideo, Page::CreateAudio, Page::Object3d, Page::World3d]), ("Studio", &[Page::EditImage, Page::Stage3d, Page::VideoEditor, Page::RemoveBackground, Page::FrameExtractor]), ("Assets", &[Page::Library])]; + +/// Who's signed in, for the sidebar and top bar. +pub struct Account<'a> { + pub username: Option<&'a str>, + pub display_name: Option<&'a str>, + pub credits: Option, +} + +/// What the user did in the frame. +#[derive(Debug, PartialEq)] +pub enum ShellAction { + Navigate(Page), + ToggleSidebar, + SignIn, + SignOut, + OpenSettings, + SetViewMode(ViewMode), + ToggleSelect, +} + +/// The sidebar. Returns the user's action, if any. +pub fn sidebar(ui: &mut Ui, page: Page, account: &Account<'_>, logo: &egui::TextureHandle) -> Option { + let mut action = None; + let rect = ui.max_rect().shrink(SIDEBAR_INSET); + ui.painter().rect(rect, theme::RADIUS, theme::CONTROLS, theme::hairline(), egui::StrokeKind::Inside); + let mut inner = ui.new_child(egui::UiBuilder::new().max_rect(rect.shrink2(vec2(14.0, 10.0)))); + let ui = &mut inner; + ui.spacing_mut().item_spacing.y = 2.0; + + ui.horizontal(|ui| { + let h = 20.0; + let w = h * logo.size_vec2().x / logo.size_vec2().y.max(1.0); + ui.add(egui::Image::new(logo).fit_to_exact_size(vec2(w, h))); + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + if widgets::ghost(ui, Icon::PanelLeft, None, "Toggle Sidebar", false).clicked() { + action = Some(ShellAction::ToggleSidebar); + } + }); + }); + ui.add_space(6.0); + if nav_row(ui, Page::Home, page == Page::Home) { + action = Some(ShellAction::Navigate(Page::Home)); + } + for (title, pages) in SECTIONS { + ui.add_space(10.0); + widgets::section_label(ui, title, theme::SIDEBAR_INK); + for &p in pages { + if nav_row(ui, p, page == p) { + action = Some(ShellAction::Navigate(p)); + } + } + } + ui.add_space(10.0); + widgets::section_label(ui, "Resources", theme::SIDEBAR_INK); + for (label, icon, url) in [("Tutorials", Icon::Play, TUTORIALS_URL), ("Discord", Icon::Globe, DISCORD_URL), ("GitHub", Icon::ExternalLink, GITHUB_URL)] { + if link_row(ui, label, icon) { + ui.ctx().open_url(egui::OpenUrl::new_tab(url)); + } + } + + // The account sits at the bottom, like the webapp's download button. + let bottom = Rect::from_min_max(pos2(rect.left() + 10.0, rect.bottom() - 58.0), pos2(rect.right() - 10.0, rect.bottom() - 10.0)); + let mut foot = ui.new_child(egui::UiBuilder::new().max_rect(bottom)); + match account.username { + Some(username) => { + let resp = account_row(&mut foot, account.display_name.unwrap_or(username), account.credits); + if resp.clicked() { + action = Some(ShellAction::OpenSettings); + } + }, + None => { + if widgets::button(&mut foot, Some(Icon::LogIn), "Sign in", widgets::Kind::Primary, bottom.width(), 40.0).clicked() { + action = Some(ShellAction::SignIn); + } + }, + } + action +} + +/// The sidebar's full width (including its inset), for the panel. +pub fn sidebar_width() -> f32 { + SIDEBAR_WIDTH + SIDEBAR_INSET * 2.0 +} + +fn nav_row(ui: &mut Ui, page: Page, selected: bool) -> bool { + let (rect, resp) = ui.allocate_exact_size(vec2(ui.available_width(), ROW_HEIGHT), Sense::click()); + let hovered = resp.hovered(); + let p = ui.painter(); + if selected { + p.rect_filled(rect, theme::RADIUS, theme::WASH_SELECTED); + p.rect_filled(Rect::from_min_size(pos2(rect.left() - 8.0, rect.top() + 7.0), vec2(2.0, 18.0)), 0.0, Color32::WHITE); + } else if hovered { + p.rect_filled(rect, theme::RADIUS, theme::WASH); + } + let ink = if selected || hovered { Color32::WHITE } else { theme::SIDEBAR_INK }; + let ready = page.is_ready(); + let ink = if ready { ink } else { theme::fade(ink, 0.7) }; + icons::paint(p, Rect::from_center_size(pos2(rect.left() + 16.0, rect.center().y), vec2(15.0, 15.0)), page.icon(), ink); + let font = FontId::new(14.0, if selected { theme::medium() } else { egui::FontFamily::Proportional }); + p.text(pos2(rect.left() + 32.0, rect.center().y), Align2::LEFT_CENTER, page.label(), font, ink); + if !ready { + widgets::badge(p, ui, pos2(rect.right() - 6.0, rect.center().y), "Soon", theme::FAINT); + } + resp.on_hover_cursor(egui::CursorIcon::PointingHand).clicked() +} + +fn link_row(ui: &mut Ui, label: &str, icon: Icon) -> bool { + let (rect, resp) = ui.allocate_exact_size(vec2(ui.available_width(), ROW_HEIGHT), Sense::click()); + let hovered = resp.hovered(); + let p = ui.painter(); + if hovered { + p.rect_filled(rect, theme::RADIUS, theme::WASH); + } + let ink = if hovered { Color32::WHITE } else { theme::SIDEBAR_INK }; + icons::paint(p, Rect::from_center_size(pos2(rect.left() + 16.0, rect.center().y), vec2(15.0, 15.0)), icon, ink); + p.text(pos2(rect.left() + 32.0, rect.center().y), Align2::LEFT_CENTER, label, FontId::new(14.0, egui::FontFamily::Proportional), ink); + icons::paint(p, Rect::from_center_size(pos2(rect.right() - 12.0, rect.center().y), vec2(11.0, 11.0)), Icon::ExternalLink, theme::FAINT); + resp.on_hover_cursor(egui::CursorIcon::PointingHand).clicked() +} + +fn account_row(ui: &mut Ui, name: &str, credits: Option) -> egui::Response { + let (rect, resp) = ui.allocate_exact_size(vec2(ui.available_width(), 46.0), Sense::click()); + let hovered = resp.hovered(); + let p = ui.painter(); + p.rect(rect, theme::RADIUS, if hovered { theme::WASH_HOVER } else { theme::WASH }, theme::hairline(), egui::StrokeKind::Inside); + let avatar = Rect::from_center_size(pos2(rect.left() + 22.0, rect.center().y), vec2(28.0, 28.0)); + p.circle_filled(avatar.center(), 14.0, theme::ACCENT); + let initial = name.chars().next().map(|c| c.to_uppercase().to_string()).unwrap_or_default(); + p.text(avatar.center(), Align2::CENTER_CENTER, initial, FontId::new(13.0, theme::semibold()), Color32::WHITE); + p.text(pos2(avatar.right() + 10.0, rect.center().y - 8.0), Align2::LEFT_CENTER, name, FontId::new(13.5, theme::medium()), theme::INK); + let sub = credits.map_or_else(|| "Account".to_owned(), |c| format!("{} credits", group_thousands(c))); + p.text(pos2(avatar.right() + 10.0, rect.center().y + 9.0), Align2::LEFT_CENTER, sub, FontId::new(11.5, egui::FontFamily::Proportional), theme::MUTED); + icons::paint(p, Rect::from_center_size(pos2(rect.right() - 16.0, rect.center().y), vec2(14.0, 14.0)), Icon::Settings, theme::DIM); + resp.on_hover_cursor(egui::CursorIcon::PointingHand).on_hover_text("Settings") +} + +/// The top bar. `feed_toggles` shows the select and grid/list toggles (create pages). +pub fn topbar(ui: &mut Ui, page: Page, account: &Account<'_>, feed_toggles: Option<(ViewMode, bool)>, sidebar_open: bool) -> Option { + let mut action = None; + let rect = ui.max_rect(); + ui.painter().rect_filled(rect, 0.0, theme::PANEL); + ui.painter().hline(rect.x_range(), rect.bottom() - 0.5, theme::hairline()); + let mut bar = ui.new_child(egui::UiBuilder::new().max_rect(rect.shrink2(vec2(20.0, 0.0))).layout(egui::Layout::left_to_right(egui::Align::Center))); + let ui = &mut bar; + ui.spacing_mut().item_spacing.x = 8.0; + if !sidebar_open && widgets::ghost(ui, Icon::PanelLeft, None, "Toggle Sidebar", false).clicked() { + action = Some(ShellAction::ToggleSidebar); + } + let (section, leaf) = page.crumbs(); + widgets::hud(ui, section, theme::MUTED); + let (chev, _) = ui.allocate_exact_size(vec2(10.0, 10.0), Sense::hover()); + icons::paint(ui.painter(), chev, Icon::ChevronRight, theme::FAINT); + let galley = widgets::caps(ui, leaf, theme::HUD_SIZE, theme::mono(), theme::HUD_SPACING, theme::PANEL); + let (crumb, _) = ui.allocate_exact_size(galley.size() + vec2(12.0, 8.0), Sense::hover()); + ui.painter().rect_filled(crumb, 0.0, theme::INK); + ui.painter().galley(crumb.center() - galley.size() / 2.0, galley, theme::PANEL); + + ui.with_layout(egui::Layout::right_to_left(egui::Align::Center), |ui| { + ui.spacing_mut().item_spacing.x = 8.0; + match account.username { + Some(_) => { + if let Some(a) = account_menu(ui, account) { + action = Some(a); + } + if let Some(credits) = account.credits { + let resp = credits_pill(ui, credits); + if resp.clicked() { + ui.ctx().open_url(egui::OpenUrl::new_tab(format!("{WEB_APP_URL}/pricing"))); + } + } + }, + None => { + if widgets::button(ui, None, "Sign in", widgets::Kind::Primary, 0.0, 32.0).clicked() { + action = Some(ShellAction::SignIn); + } + }, + } + if let Some((mode, selecting)) = feed_toggles { + if let Some(m) = view_toggle(ui, mode) { + action = Some(ShellAction::SetViewMode(m)); + } + if segmented(ui, &[(Icon::SquareCheck, if selecting { "Exit selection" } else { "Select items" }, selecting)]).is_some() { + action = Some(ShellAction::ToggleSelect); + } + } + }); + action +} + +pub fn topbar_height() -> f32 { + TOPBAR_HEIGHT +} + +fn credits_pill(ui: &mut Ui, credits: u64) -> egui::Response { + let text = group_thousands(credits); + let galley = ui.painter().layout_no_wrap(text, FontId::new(13.0, theme::semibold()), theme::INK); + let (rect, resp) = ui.allocate_exact_size(vec2(galley.size().x + 40.0, 30.0), Sense::click()); + let hovered = resp.hovered(); + ui.painter().rect(rect, theme::RADIUS, if hovered { theme::WASH_HOVER } else { theme::WASH }, theme::hairline(), egui::StrokeKind::Inside); + icons::paint(ui.painter(), Rect::from_center_size(pos2(rect.left() + 16.0, rect.center().y), vec2(14.0, 14.0)), Icon::Coins, theme::INK); + ui.painter().galley(pos2(rect.left() + 28.0, rect.center().y - galley.size().y / 2.0), galley, theme::INK); + resp.on_hover_text("Your credit balance \u{b7} Buy credits").on_hover_cursor(egui::CursorIcon::PointingHand) +} + +fn account_menu(ui: &mut Ui, account: &Account<'_>) -> Option { + let name = account.display_name.or(account.username).unwrap_or("Account"); + let (rect, resp) = ui.allocate_exact_size(vec2(30.0, 30.0), Sense::click()); + ui.painter().circle(rect.center(), 15.0, theme::ACCENT, Stroke::new(if resp.hovered() { 2.0 } else { 0.0 }, Color32::WHITE)); + let initial = name.chars().next().map(|c| c.to_uppercase().to_string()).unwrap_or_default(); + ui.painter().text(rect.center(), Align2::CENTER_CENTER, initial, FontId::new(13.0, theme::semibold()), Color32::WHITE); + let resp = resp.on_hover_cursor(egui::CursorIcon::PointingHand); + let mut action = None; + egui::Popup::menu(&resp).frame(widgets::popover_frame()).align(egui::RectAlign::BOTTOM_END).show(|ui| { + ui.set_min_width(200.0); + ui.label(egui::RichText::new(name).size(13.0).family(theme::semibold())); + if let Some(u) = account.username { + ui.label(egui::RichText::new(format!("@{u}")).size(11.5).color(theme::MUTED)); + } + ui.add_space(4.0); + if widgets::menu_row(ui, widgets::RowLead::Icon(Icon::Settings), "Settings", None, false, false, false).clicked() { + action = Some(ShellAction::OpenSettings); + } + if widgets::menu_row(ui, widgets::RowLead::Icon(Icon::LogOut), "Log out", None, false, false, false).clicked() { + action = Some(ShellAction::SignOut); + } + }); + action +} + +/// The grid / list toggle (`GalleryViewToggle`). +fn view_toggle(ui: &mut Ui, mode: ViewMode) -> Option { + // Right-to-left: list first so grid ends up on the left. + let picked = segmented(ui, &[(Icon::List, "List view", mode == ViewMode::List), (Icon::LayoutGrid, "Grid view", mode == ViewMode::Grid)])?; + Some(if picked == 0 { ViewMode::List } else { ViewMode::Grid }) +} + +/// A segmented group of 24 px icon buttons; returns the clicked index. +fn segmented(ui: &mut Ui, buttons: &[(Icon, &str, bool)]) -> Option { + let w = 4.0 + 26.0 * buttons.len() as f32; + let (rect, _) = ui.allocate_exact_size(vec2(w, 30.0), Sense::hover()); + ui.painter().rect(rect, theme::RADIUS, Color32::from_white_alpha(10), Stroke::new(1.0, Color32::from_white_alpha(20)), egui::StrokeKind::Inside); + let mut clicked = None; + for (i, (icon, tip, active)) in buttons.iter().enumerate() { + let b = Rect::from_min_size(pos2(rect.left() + 3.0 + 26.0 * i as f32, rect.top() + 3.0), vec2(24.0, 24.0)); + let resp = ui.interact(b, Id::new(("segmented", *tip)), Sense::click()).on_hover_text(*tip).on_hover_cursor(egui::CursorIcon::PointingHand); + if *active || resp.hovered() { + ui.painter().rect_filled(b, theme::RADIUS, theme::WASH_HOVER); + } + icons::paint(ui.painter(), b.shrink(5.0), *icon, if *active { Color32::WHITE } else { theme::DIM }); + if resp.clicked() { + clicked = Some(i); + } + } + clicked +} + +/// `1234567` → `1,234,567` (`toLocaleString`). +pub fn group_thousands(n: u64) -> String { + let s = n.to_string(); + let mut out = String::with_capacity(s.len() + s.len() / 3); + for (i, c) in s.chars().enumerate() { + if i > 0 && (s.len() - i).is_multiple_of(3) { + out.push(','); + } + out.push(c); + } + out +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn groups_thousands_like_to_locale_string() { + assert_eq!(group_thousands(5663), "5,663"); + assert_eq!(group_thousands(1_234_567), "1,234,567"); + assert_eq!(group_thousands(15), "15"); + } +} diff --git a/artcraft-native/src/theme.rs b/artcraft-native/src/theme.rs new file mode 100644 index 0000000000..340d4e1175 --- /dev/null +++ b/artcraft-native/src/theme.rs @@ -0,0 +1,191 @@ +//! Colours, type and shapes of the ArtCraft webapp's brutalist system +//! (`artcraft-services/frontend/apps/artcraft-webapp`): near-black surfaces, white/15 hairlines, +//! Archivo display type, Inter body text, Geist Mono labels and 3 px corners on anything +//! pressable. Large surfaces (panels, cards, media tiles) stay square. + +use std::sync::Arc; + +use egui::epaint::text::VariationCoords; +use egui::{Color32, CornerRadius, FontData, FontDefinitions, FontFamily, FontId, FontTweak, Stroke, TextStyle, Visuals}; + +const fn hex(rgb: u32) -> Color32 { + let [_, r, g, b] = rgb.to_be_bytes(); + Color32::from_rgb(r, g, b) +} + +const fn alpha(rgb: u32, a: u8) -> Color32 { + let [_, r, g, b] = rgb.to_be_bytes(); + Color32::from_rgba_unmultiplied_const(r, g, b, a) +} + +/// `ui-background`: the page behind the feed. +pub const BG: Color32 = hex(0x121316); +/// `ui-panel`: the top bar, modals and the lightbox. +pub const PANEL: Color32 = hex(0x101014); +/// `ui-controls`: the sidebar, the prompt box and toolbar buttons. +pub const CONTROLS: Color32 = hex(0x1e1f22); +/// `ui-sunken`: wells and inputs. +pub const SUNKEN: Color32 = hex(0x060607); + +/// `base-fg`: body text. +pub const INK: Color32 = hex(0xf2f1ee); +pub const INK_STRONG: Color32 = Color32::WHITE; +/// `base-fg/60`: secondary text and placeholders. +pub const MUTED: Color32 = alpha(0xf2f1ee, 153); +/// `base-fg/50`: idle toolbar icons. +pub const DIM: Color32 = alpha(0xf2f1ee, 128); +/// `base-fg/40`: counters and captions. +pub const FAINT: Color32 = alpha(0xf2f1ee, 102); +/// The sidebar's link colour (`white/72`). +pub const SIDEBAR_INK: Color32 = alpha(0xffffff, 184); + +/// `white/15`: every hairline. +pub const LINE: Color32 = alpha(0xffffff, 38); +/// `white/25`: dashed drop targets. +pub const LINE_DASHED: Color32 = alpha(0xffffff, 64); +/// `base-fg/40`: outlined buttons and corner marks. +pub const LINE_STRONG: Color32 = alpha(0xf2f1ee, 102); +/// `white/5`: quiet fills. +pub const WASH: Color32 = alpha(0xffffff, 13); +/// `white/8`: the selected sidebar row. +pub const WASH_SELECTED: Color32 = alpha(0xffffff, 20); +/// `white/10`: hovered menu rows. +pub const WASH_HOVER: Color32 = alpha(0xffffff, 26); + +/// The brand blue (`primary`). +pub const ACCENT: Color32 = hex(0x2d81ff); +/// `primary-400`: progress bars and selection rings. +pub const ACCENT_400: Color32 = hex(0x59a7ff); +/// `ui-accent-ink`: blue text and focus rings. +pub const ACCENT_INK: Color32 = hex(0x74aaff); + +/// The inverted primary button (white block, near-black text). +pub const INVERT_BG: Color32 = Color32::WHITE; +pub const INVERT_FG: Color32 = hex(0x0b0b0c); + +/// `red-400`: failure text. +pub const BAD: Color32 = hex(0xf87171); +/// `red`: destructive fills. +pub const DANGER: Color32 = hex(0xd33242); +/// The "BETA" / "NEW" sidebar badges. +pub const BADGE_BETA: Color32 = hex(0xffc14d); + +/// 3 px: buttons, inputs, menus and the prompt box. +pub const RADIUS: CornerRadius = CornerRadius::same(3); + +/// Height of toolbar buttons (`py-1.5` + 14 px text + hairline). +pub const CONTROL_H: f32 = 34.0; +/// The `.hud-label`: 11 px Geist Mono, upper case, 0.15 em apart. +pub const HUD_SIZE: f32 = 11.0; +pub const HUD_SPACING: f32 = HUD_SIZE * 0.15; +/// Section labels and mono buttons are tracked a little tighter (0.12 em). +pub const LABEL_SPACING: f32 = HUD_SIZE * 0.12; + +pub fn hairline() -> Stroke { + Stroke::new(1.0, LINE) +} + +/// `c` at `a` (0–1) of its opacity. +pub fn fade(c: Color32, a: f32) -> Color32 { + c.gamma_multiply(a.clamp(0.0, 1.0)) +} + +/// The shadow under menus, modals and toasts. +pub fn shadow() -> egui::epaint::Shadow { + egui::epaint::Shadow { offset: [0, 8], blur: 24, spread: 0, color: Color32::from_black_alpha(140) } +} + +/// Inter 500. +pub fn medium() -> FontFamily { + FontFamily::Name("medium".into()) +} + +/// Inter 600. +pub fn semibold() -> FontFamily { + FontFamily::Name("semibold".into()) +} + +/// Archivo 620 at 118 % width: `.font-display` headings. +pub fn display() -> FontFamily { + FontFamily::Name("display".into()) +} + +/// Geist Mono 500: HUD labels. +pub fn mono() -> FontFamily { + FontFamily::Name("mono".into()) +} + +/// Geist Mono 600–700: section labels and mono buttons. +pub fn mono_bold() -> FontFamily { + FontFamily::Name("mono-bold".into()) +} + +fn visuals() -> Visuals { + let mut v = Visuals::dark(); + v.panel_fill = BG; + v.window_fill = PANEL; + v.extreme_bg_color = SUNKEN; + v.text_edit_bg_color = Some(Color32::TRANSPARENT); + v.faint_bg_color = CONTROLS; + v.code_bg_color = SUNKEN; + v.window_stroke = hairline(); + v.window_corner_radius = RADIUS; + v.menu_corner_radius = RADIUS; + v.window_shadow = shadow(); + v.popup_shadow = shadow(); + v.override_text_color = Some(INK); + v.hyperlink_color = ACCENT_INK; + v.selection.bg_fill = ACCENT; + v.selection.stroke = Stroke::new(1.0, Color32::WHITE); + v.text_cursor.stroke = Stroke::new(1.5, Color32::WHITE); + v.warn_fg_color = BADGE_BETA; + v.error_fg_color = BAD; + v.striped = false; + for (w, fill, stroke, fg) in [(&mut v.widgets.noninteractive, CONTROLS, LINE, MUTED), (&mut v.widgets.inactive, CONTROLS, LINE, INK), (&mut v.widgets.hovered, WASH_HOVER, LINE_STRONG, INK_STRONG), (&mut v.widgets.active, WASH_HOVER, LINE_STRONG, INK_STRONG), (&mut v.widgets.open, WASH_HOVER, LINE_STRONG, INK_STRONG)] { + w.bg_fill = fill; + w.weak_bg_fill = fill; + w.bg_stroke = Stroke::new(1.0, stroke); + w.corner_radius = RADIUS; + w.fg_stroke = Stroke::new(1.0, fg); + w.expansion = 0.0; + } + v +} + +/// Installs the fonts, colours and spacing. The app is dark only, like the webapp. +pub fn apply(ctx: &egui::Context) { + install_fonts(ctx); + ctx.set_visuals_of(egui::Theme::Dark, visuals()); + ctx.set_theme(egui::ThemePreference::Dark); + ctx.all_styles_mut(|style| { + style.spacing.item_spacing = egui::vec2(8.0, 6.0); + style.spacing.button_padding = egui::vec2(12.0, 6.0); + style.spacing.interact_size.y = CONTROL_H; + style.spacing.menu_margin = egui::Margin::same(4); + style.spacing.window_margin = egui::Margin::same(16); + style.spacing.scroll = egui::style::ScrollStyle { bar_width: 8.0, floating: true, ..egui::style::ScrollStyle::thin() }; + style.text_styles = [(TextStyle::Heading, FontId::new(24.0, display())), (TextStyle::Body, FontId::new(14.0, FontFamily::Proportional)), (TextStyle::Button, FontId::new(14.0, medium())), (TextStyle::Small, FontId::new(12.0, FontFamily::Proportional)), (TextStyle::Monospace, FontId::new(13.0, FontFamily::Monospace))].into(); + }); +} + +/// A font registered under `name`: its file, its variation coordinates and its family. +type Face<'a> = (&'a str, &'static [u8], &'a [([u8; 4], f32)], FontFamily); + +/// Registers the three variable fonts, each at the weights (and width) the webapp uses. +fn install_fonts(ctx: &egui::Context) { + const INTER: &[u8] = include_bytes!("../assets/fonts/Inter-Variable.ttf"); + const ARCHIVO: &[u8] = include_bytes!("../assets/fonts/Archivo-Variable.ttf"); + const GEIST_MONO: &[u8] = include_bytes!("../assets/fonts/GeistMono-Variable.ttf"); + let mut fonts = FontDefinitions::default(); + // egui's own fonts stay behind ours, for symbols and emoji ours don't have. + let fallback = fonts.families.get(&FontFamily::Proportional).cloned().unwrap_or_default(); + let faces: [Face<'_>; 7] = [("Inter", INTER, &[(*b"wght", 400.0), (*b"opsz", 14.0)], FontFamily::Proportional), ("Inter-Medium", INTER, &[(*b"wght", 500.0), (*b"opsz", 14.0)], medium()), ("Inter-SemiBold", INTER, &[(*b"wght", 600.0), (*b"opsz", 14.0)], semibold()), ("Archivo-Display", ARCHIVO, &[(*b"wght", 620.0), (*b"wdth", 118.0)], display()), ("GeistMono", GEIST_MONO, &[(*b"wght", 400.0)], FontFamily::Monospace), ("GeistMono-Medium", GEIST_MONO, &[(*b"wght", 500.0)], mono()), ("GeistMono-SemiBold", GEIST_MONO, &[(*b"wght", 650.0)], mono_bold())]; + for (name, bytes, coords, family) in faces { + let tweak = FontTweak { coords: VariationCoords::new(coords.iter().copied()), ..Default::default() }; + fonts.font_data.insert(name.to_owned(), Arc::new(FontData::from_static(bytes).tweak(tweak))); + let mut stack = vec![name.to_owned()]; + stack.extend(fallback.iter().cloned()); + fonts.families.insert(family, stack); + } + ctx.set_fonts(fonts); +} diff --git a/artcraft-native/src/ui/creator_icons.rs b/artcraft-native/src/ui/creator_icons.rs new file mode 100644 index 0000000000..f15bb11606 --- /dev/null +++ b/artcraft-native/src/ui/creator_icons.rs @@ -0,0 +1,73 @@ +//! Model makers' logos (the Tauri app's `/resources/images/services` SVGs), rasterized once into +//! white-on-transparent textures so they can be tinted like the webapp's `icon-auto-contrast`. + +use std::collections::HashMap; +use std::sync::{Arc, Mutex}; + +use egui::{ColorImage, TextureHandle, TextureOptions}; + +/// Rasterized side, in pixels (crisp up to ~32 pt at 2x). +const RASTER_SIDE: u32 = 64; + +macro_rules! service_svg { + ($name:literal) => { + include_bytes!(concat!("../../../frontend/apps/artcraft/app/public/resources/images/services/", $name, ".svg")) + }; +} + +/// The logo for a `ModelCreator` (snake_case, as the model listing sends it). +fn svg_for_creator(creator: &str) -> &'static [u8] { + match creator { + "alibaba" => service_svg!("alibaba"), + "artcraft" => service_svg!("artcraft"), + "black_forest_labs" | "blackforestlabs" | "bfl" => service_svg!("blackforestlabs"), + "bytedance" => service_svg!("bytedance"), + "fal" => service_svg!("fal"), + "google" => service_svg!("google"), + "grok" | "xai" => service_svg!("grok"), + "higgsfield" => service_svg!("higgsfield"), + "kling" | "kuaishou" => service_svg!("kling"), + "krea" => service_svg!("krea"), + "midjourney" => service_svg!("midjourney"), + "minimax" | "hailuo" => service_svg!("minimax"), + "open_ai" | "openai" => service_svg!("openai"), + "openart" | "open_art" => service_svg!("openart"), + "recraft" => service_svg!("recraft"), + "replicate" => service_svg!("replicate"), + "suno" => service_svg!("suno"), + "tencent" => service_svg!("tencent"), + "tensor_art" | "tensorart" => service_svg!("tensorart"), + "vidu" => service_svg!("vidu"), + "world_labs" | "worldlabs" => service_svg!("worldlabs"), + _ => service_svg!("generic"), + } +} + +#[derive(Clone, Default)] +struct Cache(Arc>>); + +/// A white logo for `creator`, to be tinted when drawn. +pub fn texture(ctx: &egui::Context, creator: &str) -> TextureHandle { + let cache: Cache = ctx.data_mut(|d| d.get_temp_mut_or_default::(egui::Id::new("creator-icons")).clone()); + let mut map = cache.0.lock().unwrap_or_else(|e| e.into_inner()); + if let Some(texture) = map.get(creator) { + return texture.clone(); + } + let image = rasterize_mask(svg_for_creator(creator)).unwrap_or_else(|| ColorImage::filled([1, 1], egui::Color32::TRANSPARENT)); + let texture = ctx.load_texture(format!("creator-{creator}"), image, TextureOptions::LINEAR); + map.insert(creator.to_owned(), texture.clone()); + texture +} + +/// Renders an SVG and keeps only its coverage: every pixel becomes white at the original alpha. +fn rasterize_mask(svg: &[u8]) -> Option { + let tree = resvg::usvg::Tree::from_data(svg, &resvg::usvg::Options::default()).ok()?; + let size = tree.size(); + let scale = RASTER_SIDE as f32 / size.width().max(size.height()); + let mut pixmap = resvg::tiny_skia::Pixmap::new(RASTER_SIDE, RASTER_SIDE)?; + let dx = (RASTER_SIDE as f32 - size.width() * scale) / 2.0; + let dy = (RASTER_SIDE as f32 - size.height() * scale) / 2.0; + resvg::render(&tree, resvg::tiny_skia::Transform::from_row(scale, 0.0, 0.0, scale, dx, dy), &mut pixmap.as_mut()); + let pixels = pixmap.pixels().iter().map(|p| egui::Color32::from_white_alpha(p.alpha())).collect(); + Some(ColorImage::new([RASTER_SIDE as usize, RASTER_SIDE as usize], pixels)) +} diff --git a/artcraft-native/src/ui/icons.rs b/artcraft-native/src/ui/icons.rs new file mode 100644 index 0000000000..7467aafd4b --- /dev/null +++ b/artcraft-native/src/ui/icons.rs @@ -0,0 +1,370 @@ +//! Line icons drawn on Lucide's 24-unit grid (the webapp's icon set), so they stay crisp at any +//! size without an icon font. + +use egui::{Color32, Painter, Pos2, Rect, Response, Sense, Shape, Stroke, Ui, vec2}; + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum Icon { + AlertCircle, + ArrowLeftRight, + ArrowUp, + Box, + Check, + ChevronDown, + ChevronLeft, + ChevronRight, + ChevronUp, + Clock, + Coins, + Copy, + Download, + Eraser, + Eye, + ExternalLink, + Film, + Folder, + Globe, + Gem, + Home, + Image, + Info, + LayoutGrid, + Link, + Library, + List, + LogIn, + LogOut, + Maximize, + Music, + PanelLeft, + Pencil, + Play, + Plus, + RotateCw, + Settings, + Sparkles, + SquareCheck, + Trash, + Upload, + Video, + Volume, + VolumeOff, + Wand, + X, +} + +/// Maps Lucide's 24-unit grid onto a rect. +struct Grid { + origin: Pos2, + scale: f32, + stroke: Stroke, +} + +impl Grid { + fn new(rect: Rect, color: Color32) -> Self { + let side = rect.width().min(rect.height()); + let origin = rect.center() - vec2(side, side) / 2.0; + let scale = side / 24.0; + // Lucide's 2-unit stroke, a touch lighter so small icons don't clog. + Self { origin, scale, stroke: Stroke::new((1.75 * scale).max(1.1), color) } + } + + fn p(&self, x: f32, y: f32) -> Pos2 { + self.origin + vec2(x, y) * self.scale + } + + fn line(&self, painter: &Painter, pts: &[(f32, f32)]) { + let pts: Vec = pts.iter().map(|&(x, y)| self.p(x, y)).collect(); + painter.add(Shape::line(pts, self.stroke)); + } + + fn closed(&self, painter: &Painter, pts: &[(f32, f32)]) { + let pts: Vec = pts.iter().map(|&(x, y)| self.p(x, y)).collect(); + painter.add(Shape::closed_line(pts, self.stroke)); + } + + fn rect(&self, painter: &Painter, x: f32, y: f32, w: f32, h: f32, r: f32) { + let rect = Rect::from_min_size(self.p(x, y), vec2(w, h) * self.scale); + painter.rect_stroke(rect, r * self.scale, self.stroke, egui::StrokeKind::Middle); + } + + fn circle(&self, painter: &Painter, x: f32, y: f32, r: f32) { + painter.circle_stroke(self.p(x, y), r * self.scale, self.stroke); + } + + fn dot(&self, painter: &Painter, x: f32, y: f32, r: f32) { + painter.circle_filled(self.p(x, y), r * self.scale, self.stroke.color); + } + + /// An arc round (cx, cy), angles in degrees clockwise from 3 o'clock. + fn arc(&self, painter: &Painter, cx: f32, cy: f32, r: f32, from: f32, to: f32) { + let steps = 24; + let pts: Vec = (0..=steps) + .map(|i| { + let a = (from + (to - from) * i as f32 / steps as f32).to_radians(); + self.p(cx + r * a.cos(), cy + r * a.sin()) + }) + .collect(); + painter.add(Shape::line(pts, self.stroke)); + } +} + +/// Paints `icon` centred in `rect`. +pub fn paint(painter: &Painter, rect: Rect, icon: Icon, color: Color32) { + let g = Grid::new(rect, color); + let p = painter; + match icon { + Icon::AlertCircle => { + g.circle(p, 12.0, 12.0, 10.0); + g.line(p, &[(12.0, 8.0), (12.0, 12.0)]); + g.dot(p, 12.0, 16.0, 1.1); + }, + Icon::ArrowLeftRight => { + g.line(p, &[(8.0, 3.0), (4.0, 7.0), (8.0, 11.0)]); + g.line(p, &[(4.0, 7.0), (20.0, 7.0)]); + g.line(p, &[(16.0, 21.0), (20.0, 17.0), (16.0, 13.0)]); + g.line(p, &[(20.0, 17.0), (4.0, 17.0)]); + }, + Icon::ArrowUp => { + g.line(p, &[(5.0, 12.0), (12.0, 5.0), (19.0, 12.0)]); + g.line(p, &[(12.0, 19.0), (12.0, 5.0)]); + }, + Icon::Box => { + g.closed(p, &[(12.0, 2.0), (21.0, 7.0), (21.0, 17.0), (12.0, 22.0), (3.0, 17.0), (3.0, 7.0)]); + g.line(p, &[(3.0, 7.0), (12.0, 12.0), (21.0, 7.0)]); + g.line(p, &[(12.0, 12.0), (12.0, 22.0)]); + }, + Icon::Check => g.line(p, &[(20.0, 6.0), (9.0, 17.0), (4.0, 12.0)]), + Icon::ChevronDown => g.line(p, &[(6.0, 9.0), (12.0, 15.0), (18.0, 9.0)]), + Icon::ChevronLeft => g.line(p, &[(15.0, 18.0), (9.0, 12.0), (15.0, 6.0)]), + Icon::ChevronRight => g.line(p, &[(9.0, 18.0), (15.0, 12.0), (9.0, 6.0)]), + Icon::ChevronUp => g.line(p, &[(18.0, 15.0), (12.0, 9.0), (6.0, 15.0)]), + Icon::Clock => { + g.circle(p, 12.0, 12.0, 10.0); + g.line(p, &[(12.0, 6.0), (12.0, 12.0), (16.0, 14.0)]); + }, + Icon::Coins => { + g.circle(p, 8.0, 8.0, 6.0); + g.arc(p, 15.5, 15.5, 6.0, -100.0, 190.0); + g.line(p, &[(7.0, 6.0), (8.0, 5.0), (8.0, 11.0)]); + }, + Icon::Copy => { + g.rect(p, 8.0, 8.0, 14.0, 14.0, 2.0); + g.line(p, &[(4.0, 16.0), (4.0, 4.0), (16.0, 4.0)]); + }, + Icon::Download => { + g.line(p, &[(12.0, 3.0), (12.0, 15.0)]); + g.line(p, &[(7.0, 10.0), (12.0, 15.0), (17.0, 10.0)]); + g.line(p, &[(4.0, 21.0), (20.0, 21.0)]); + }, + Icon::Eraser => { + g.closed(p, &[(7.0, 21.0), (3.5, 17.5), (14.0, 7.0), (21.0, 14.0), (14.0, 21.0)]); + g.line(p, &[(22.0, 21.0), (7.0, 21.0)]); + g.line(p, &[(9.0, 12.0), (16.0, 19.0)]); + }, + Icon::ExternalLink => { + g.line(p, &[(15.0, 3.0), (21.0, 3.0), (21.0, 9.0)]); + g.line(p, &[(10.0, 14.0), (21.0, 3.0)]); + g.line(p, &[(18.0, 13.0), (18.0, 19.0), (16.0, 21.0), (5.0, 21.0), (3.0, 19.0), (3.0, 8.0), (5.0, 6.0), (11.0, 6.0)]); + }, + Icon::Eye => { + g.closed(p, &[(2.0, 12.0), (5.0, 7.5), (9.0, 5.2), (12.0, 4.8), (15.0, 5.2), (19.0, 7.5), (22.0, 12.0), (19.0, 16.5), (15.0, 18.8), (12.0, 19.2), (9.0, 18.8), (5.0, 16.5)]); + g.circle(p, 12.0, 12.0, 3.0); + }, + Icon::Gem => { + g.closed(p, &[(6.0, 3.0), (18.0, 3.0), (22.0, 9.0), (12.0, 22.0), (2.0, 9.0)]); + g.line(p, &[(2.0, 9.0), (22.0, 9.0)]); + g.line(p, &[(11.0, 3.0), (8.0, 9.0), (12.0, 22.0), (16.0, 9.0), (13.0, 3.0)]); + }, + Icon::Info => { + g.circle(p, 12.0, 12.0, 10.0); + g.line(p, &[(12.0, 16.0), (12.0, 12.0)]); + g.dot(p, 12.0, 8.0, 1.1); + }, + Icon::Link => { + g.line(p, &[(10.0, 13.0), (11.0, 14.0), (14.0, 14.4), (16.5, 13.0), (20.0, 9.5), (20.6, 6.0), (18.0, 3.4), (14.5, 4.0), (12.8, 5.7)]); + g.line(p, &[(14.0, 11.0), (13.0, 10.0), (10.0, 9.6), (7.5, 11.0), (4.0, 14.5), (3.4, 18.0), (6.0, 20.6), (9.5, 20.0), (11.2, 18.3)]); + }, + Icon::LogIn => { + g.line(p, &[(15.0, 3.0), (19.0, 3.0), (21.0, 5.0), (21.0, 19.0), (19.0, 21.0), (15.0, 21.0)]); + g.line(p, &[(10.0, 17.0), (15.0, 12.0), (10.0, 7.0)]); + g.line(p, &[(15.0, 12.0), (3.0, 12.0)]); + }, + Icon::SquareCheck => { + g.rect(p, 3.0, 3.0, 18.0, 18.0, 2.0); + g.line(p, &[(8.0, 12.0), (11.0, 15.0), (16.0, 9.0)]); + }, + Icon::Film => { + g.rect(p, 3.0, 3.0, 18.0, 18.0, 2.0); + g.line(p, &[(7.0, 3.0), (7.0, 21.0)]); + g.line(p, &[(17.0, 3.0), (17.0, 21.0)]); + g.line(p, &[(3.0, 12.0), (21.0, 12.0)]); + g.line(p, &[(3.0, 7.5), (7.0, 7.5)]); + g.line(p, &[(17.0, 7.5), (21.0, 7.5)]); + g.line(p, &[(3.0, 16.5), (7.0, 16.5)]); + g.line(p, &[(17.0, 16.5), (21.0, 16.5)]); + }, + Icon::Folder => g.closed(p, &[(2.0, 5.0), (3.0, 4.0), (9.0, 4.0), (11.0, 7.0), (21.0, 7.0), (22.0, 8.0), (22.0, 19.0), (21.0, 20.0), (3.0, 20.0), (2.0, 19.0)]), + Icon::Globe => { + g.circle(p, 12.0, 12.0, 10.0); + g.line(p, &[(2.0, 12.0), (22.0, 12.0)]); + g.arc(p, 2.0, 12.0, 14.14, -45.0, 45.0); + g.arc(p, 22.0, 12.0, 14.14, 135.0, 225.0); + }, + Icon::Home => { + g.closed(p, &[(3.0, 10.0), (12.0, 3.0), (21.0, 10.0), (21.0, 21.0), (3.0, 21.0)]); + g.line(p, &[(9.0, 21.0), (9.0, 14.0), (15.0, 14.0), (15.0, 21.0)]); + }, + Icon::Image => { + g.rect(p, 3.0, 3.0, 18.0, 18.0, 2.0); + g.circle(p, 9.0, 9.0, 2.0); + g.line(p, &[(21.0, 15.0), (16.0, 10.0), (5.0, 21.0)]); + }, + Icon::LayoutGrid => { + for (x, y) in [(3.0, 3.0), (14.0, 3.0), (3.0, 14.0), (14.0, 14.0)] { + g.rect(p, x, y, 7.0, 7.0, 1.0); + } + }, + Icon::Library => { + g.line(p, &[(16.0, 6.0), (20.0, 20.0)]); + g.line(p, &[(12.0, 6.0), (12.0, 20.0)]); + g.line(p, &[(8.0, 8.0), (8.0, 20.0)]); + g.line(p, &[(4.0, 4.0), (4.0, 20.0)]); + }, + Icon::List => { + for y in [6.0, 12.0, 18.0] { + g.line(p, &[(8.0, y), (21.0, y)]); + g.dot(p, 3.5, y, 1.1); + } + }, + Icon::LogOut => { + g.line(p, &[(9.0, 21.0), (5.0, 21.0), (3.0, 19.0), (3.0, 5.0), (5.0, 3.0), (9.0, 3.0)]); + g.line(p, &[(16.0, 17.0), (21.0, 12.0), (16.0, 7.0)]); + g.line(p, &[(21.0, 12.0), (9.0, 12.0)]); + }, + Icon::Maximize => { + g.line(p, &[(15.0, 3.0), (21.0, 3.0), (21.0, 9.0)]); + g.line(p, &[(9.0, 21.0), (3.0, 21.0), (3.0, 15.0)]); + g.line(p, &[(21.0, 3.0), (14.0, 10.0)]); + g.line(p, &[(3.0, 21.0), (10.0, 14.0)]); + }, + Icon::Music => { + g.line(p, &[(9.0, 18.0), (9.0, 5.0), (21.0, 3.0), (21.0, 16.0)]); + g.circle(p, 6.0, 18.0, 3.0); + g.circle(p, 18.0, 16.0, 3.0); + }, + Icon::PanelLeft => { + g.rect(p, 3.0, 3.0, 18.0, 18.0, 2.0); + g.line(p, &[(9.0, 3.0), (9.0, 21.0)]); + }, + Icon::Pencil => { + g.closed(p, &[(17.0, 3.0), (21.0, 7.0), (7.5, 20.5), (2.0, 22.0), (3.5, 16.5)]); + g.line(p, &[(15.0, 5.0), (19.0, 9.0)]); + }, + Icon::Play => { + let pts = [g.p(7.0, 4.0), g.p(20.0, 12.0), g.p(7.0, 20.0)]; + p.add(Shape::convex_polygon(pts.to_vec(), color, Stroke::NONE)); + }, + Icon::Plus => { + g.line(p, &[(5.0, 12.0), (19.0, 12.0)]); + g.line(p, &[(12.0, 5.0), (12.0, 19.0)]); + }, + Icon::RotateCw => { + g.arc(p, 12.0, 12.0, 9.0, -60.0, 250.0); + g.line(p, &[(21.0, 3.0), (21.0, 8.5), (15.5, 8.5)]); + }, + Icon::Settings => { + g.circle(p, 12.0, 12.0, 3.0); + g.circle(p, 12.0, 12.0, 7.5); + for i in 0..8 { + let a = (i as f32 * 45.0).to_radians(); + g.line(p, &[(12.0 + 7.5 * a.cos(), 12.0 + 7.5 * a.sin()), (12.0 + 10.0 * a.cos(), 12.0 + 10.0 * a.sin())]); + } + }, + Icon::Sparkles => { + let star = |cx: f32, cy: f32, r: f32| { + let k = r * 0.28; + g.closed(p, &[(cx, cy - r), (cx + k, cy - k), (cx + r, cy), (cx + k, cy + k), (cx, cy + r), (cx - k, cy + k), (cx - r, cy), (cx - k, cy - k)]); + }; + star(10.0, 12.0, 8.0); + star(19.0, 5.0, 3.0); + }, + Icon::Trash => { + g.line(p, &[(3.0, 6.0), (21.0, 6.0)]); + g.line(p, &[(19.0, 6.0), (19.0, 20.0), (17.0, 22.0), (7.0, 22.0), (5.0, 20.0), (5.0, 6.0)]); + g.line(p, &[(8.0, 6.0), (8.0, 4.0), (10.0, 2.0), (14.0, 2.0), (16.0, 4.0), (16.0, 6.0)]); + }, + Icon::Upload => { + g.line(p, &[(12.0, 15.0), (12.0, 3.0)]); + g.line(p, &[(7.0, 8.0), (12.0, 3.0), (17.0, 8.0)]); + g.line(p, &[(4.0, 21.0), (20.0, 21.0)]); + }, + Icon::Video => { + g.rect(p, 2.0, 6.0, 14.0, 12.0, 2.0); + g.closed(p, &[(16.0, 10.5), (22.0, 7.0), (22.0, 17.0), (16.0, 13.5)]); + }, + Icon::Volume | Icon::VolumeOff => { + g.closed(p, &[(11.0, 5.0), (6.0, 9.0), (2.0, 9.0), (2.0, 15.0), (6.0, 15.0), (11.0, 19.0)]); + if icon == Icon::Volume { + g.arc(p, 12.0, 12.0, 4.0, -50.0, 50.0); + g.arc(p, 12.0, 12.0, 8.0, -50.0, 50.0); + } else { + g.line(p, &[(16.0, 9.0), (22.0, 15.0)]); + g.line(p, &[(22.0, 9.0), (16.0, 15.0)]); + } + }, + Icon::Wand => { + g.line(p, &[(3.0, 21.0), (15.0, 9.0)]); + g.line(p, &[(15.0, 4.0), (15.0, 6.0)]); + g.line(p, &[(18.0, 9.0), (20.0, 9.0)]); + g.line(p, &[(18.5, 5.5), (17.0, 7.0)]); + g.line(p, &[(11.0, 5.0), (12.0, 6.0)]); + g.line(p, &[(19.0, 13.0), (18.0, 12.0)]); + }, + Icon::X => { + g.line(p, &[(18.0, 6.0), (6.0, 18.0)]); + g.line(p, &[(6.0, 6.0), (18.0, 18.0)]); + }, + } +} + +/// Allocates a `size` square and paints `icon` in it. +pub fn icon(ui: &mut Ui, icon: Icon, size: f32, color: Color32) -> Response { + let (rect, resp) = ui.allocate_exact_size(vec2(size, size), Sense::hover()); + paint(ui.painter(), rect, icon, color); + resp +} + +/// The outline of an aspect ratio `w:h`, fitted inside `rect` (the webapp's `AspectRatioIcon`). +/// `None` draws the dashed "auto" frame. +pub fn paint_aspect(painter: &Painter, rect: Rect, ratio: Option<(f32, f32)>, color: Color32) { + let side = rect.width().min(rect.height()) * 0.8; + let stroke = Stroke::new(1.4, color); + match ratio { + Some((w, h)) if w > 0.0 && h > 0.0 => { + let size = if w >= h { vec2(side, side * h / w) } else { vec2(side * w / h, side) }; + let r = Rect::from_center_size(rect.center(), size); + painter.rect_stroke(r, 1.5, stroke, egui::StrokeKind::Middle); + }, + _ => { + let r = Rect::from_center_size(rect.center(), vec2(side, side)); + let shapes = Shape::dashed_line(&[r.left_top(), r.right_top(), r.right_bottom(), r.left_bottom(), r.left_top()], stroke, 2.5, 2.0); + painter.extend(shapes); + }, + } +} + +/// A spinner arc, like Lucide's `LoaderCircle` with `animate-spin`. +pub fn paint_spinner(ui: &Ui, rect: Rect, color: Color32) { + let t = ui.input(|i| i.time) as f32; + let g = Grid::new(rect, color); + let start = t * 360.0; + g.arc(ui.painter(), 12.0, 12.0, 9.0, start, start + 270.0); + ui.ctx().request_repaint(); +} + +/// A dashed outline round `rect` (drop targets and empty reference slots). +pub fn dashed_rect(painter: &Painter, rect: Rect, stroke: Stroke, dash: f32, gap: f32) { + let pts = [rect.left_top(), rect.right_top(), rect.right_bottom(), rect.left_bottom(), rect.left_top()]; + painter.extend(Shape::dashed_line(&pts, stroke, dash, gap)); +} diff --git a/artcraft-native/src/ui/mod.rs b/artcraft-native/src/ui/mod.rs new file mode 100644 index 0000000000..40b7de6762 --- /dev/null +++ b/artcraft-native/src/ui/mod.rs @@ -0,0 +1,4 @@ +pub mod creator_icons; +pub mod icons; +pub mod toast; +pub mod widgets; diff --git a/artcraft-native/src/ui/toast.rs b/artcraft-native/src/ui/toast.rs new file mode 100644 index 0000000000..221bc94323 --- /dev/null +++ b/artcraft-native/src/ui/toast.rs @@ -0,0 +1,97 @@ +//! Toasts: brief success and error notes stacked at the top right (the webapp's `toast`). + +use std::time::Duration; + +use egui::{Align2, Color32, FontId, Id, Order, Rect, Sense, pos2, vec2}; + +use crate::theme; +use crate::ui::icons::{self, Icon}; + +const DEFAULT_DURATION: Duration = Duration::from_secs(4); +const MAX_WIDTH: f32 = 448.0; +/// Below the top bar, like the webapp's `top-16 right-5`. +const TOP_OFFSET: f32 = 64.0; +const RIGHT_OFFSET: f32 = 20.0; + +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum ToastKind { + Success, + Error, +} + +struct Toast { + id: u64, + kind: ToastKind, + message: String, + expires_at: f64, +} + +#[derive(Default)] +pub struct Toasts { + next_id: u64, + items: Vec, + pending: Vec<(ToastKind, String)>, +} + +impl Toasts { + pub fn success(&mut self, message: impl Into) { + self.pending.push((ToastKind::Success, message.into())); + } + + pub fn error(&mut self, message: impl Into) { + self.pending.push((ToastKind::Error, message.into())); + } + + /// Draws the stack over everything else and drops expired toasts. + pub fn show(&mut self, ctx: &egui::Context) { + let now = ctx.input(|i| i.time); + for (kind, message) in self.pending.drain(..) { + // The same message twice in a row (e.g. a held Enter key) shows once, with a fresh timer. + self.items.retain(|t| !(t.kind == kind && t.message == message)); + self.next_id += 1; + self.items.push(Toast { id: self.next_id, kind, message, expires_at: now + DEFAULT_DURATION.as_secs_f64() }); + } + self.items.retain(|t| t.expires_at > now); + if self.items.is_empty() { + return; + } + let screen = ctx.content_rect(); + let mut y = screen.top() + TOP_OFFSET; + let mut dismissed = None; + for toast in &self.items { + let area = egui::Area::new(Id::new(("toast", toast.id))).order(Order::Tooltip).pivot(Align2::RIGHT_TOP).fixed_pos(pos2(screen.right() - RIGHT_OFFSET, y)).interactable(true); + let inner = area.show(ctx, |ui| { + let galley = ui.painter().layout(toast.message.clone(), FontId::new(14.0, egui::FontFamily::Proportional), theme::fade(Color32::WHITE, 0.9), MAX_WIDTH - 80.0); + let h = galley.size().y.max(24.0) + 20.0; + let w = 16.0 + 24.0 + 12.0 + galley.size().x + 12.0 + 12.0 + 16.0; + let (rect, _) = ui.allocate_exact_size(vec2(w, h), Sense::hover()); + let p = ui.painter(); + p.rect(rect, theme::RADIUS, theme::fade(theme::CONTROLS, 0.97), theme::hairline(), egui::StrokeKind::Inside); + let badge = Rect::from_min_size(pos2(rect.left() + 16.0, rect.center().y - 12.0), vec2(24.0, 24.0)); + let (fill, icon) = match toast.kind { + ToastKind::Success => (Color32::from_rgb(0x22, 0xc5, 0x5e), Icon::Check), + ToastKind::Error => (Color32::from_rgb(0xef, 0x44, 0x44), Icon::AlertCircle), + }; + p.rect_filled(badge, 0.0, fill); + icons::paint(p, badge.shrink(6.0), icon, Color32::WHITE); + p.galley(pos2(badge.right() + 12.0, rect.center().y - galley.size().y / 2.0), galley, Color32::WHITE); + let close = Rect::from_center_size(pos2(rect.right() - 22.0, rect.center().y), vec2(16.0, 16.0)); + let close_resp = ui.interact(close, Id::new(("toast-close", toast.id)), Sense::click()); + let ink = if close_resp.hovered() { theme::fade(Color32::WHITE, 0.8) } else { theme::fade(Color32::WHITE, 0.4) }; + icons::paint(p, close.shrink(2.0), Icon::X, ink); + close_resp.on_hover_cursor(egui::CursorIcon::PointingHand).clicked() + }); + if inner.inner { + dismissed = Some(toast.id); + } + y += inner.response.rect.height() + 8.0; + } + if let Some(id) = dismissed { + self.items.retain(|t| t.id != id); + } + // Wake up to expire the oldest toast on time. + if let Some(next) = self.items.iter().map(|t| t.expires_at).reduce(f64::min) { + ctx.request_repaint_after(Duration::from_secs_f64((next - now).max(0.0))); + } + } +} diff --git a/artcraft-native/src/ui/widgets.rs b/artcraft-native/src/ui/widgets.rs new file mode 100644 index 0000000000..c08ebf8d9d --- /dev/null +++ b/artcraft-native/src/ui/widgets.rs @@ -0,0 +1,354 @@ +//! Building blocks in the webapp's brutalist style: mono HUD labels, 3 px toolbar pills, the round +//! generate button, popover menus and corner registration marks. + +use std::sync::Arc; + +use egui::{Align2, Color32, CornerRadius, FontId, Frame, Galley, Margin, Painter, Rect, Response, Sense, Stroke, Ui, pos2, vec2}; + +use crate::theme; +use crate::ui::icons::{self, Icon}; + +/// `text` laid out upper case in `family`, `spacing` points between letters. +pub fn caps(ui: &Ui, text: &str, size: f32, family: egui::FontFamily, spacing: f32, color: Color32) -> Arc { + let format = egui::TextFormat { font_id: FontId::new(size, family), color, extra_letter_spacing: spacing, ..Default::default() }; + ui.painter().layout_job(egui::text::LayoutJob::single_section(text.to_uppercase(), format)) +} + +/// A `.hud-label`: 11 px Geist Mono, upper case, widely spaced. +pub fn hud(ui: &mut Ui, text: &str, color: Color32) -> Response { + let galley = caps(ui, text, theme::HUD_SIZE, theme::mono(), theme::HUD_SPACING, color); + let (rect, resp) = ui.allocate_exact_size(galley.size(), Sense::hover()); + ui.painter().galley(rect.min, galley, color); + resp.widget_info(|| egui::WidgetInfo::labeled(egui::WidgetType::Label, true, text)); + resp +} + +/// A sidebar section or menu heading: 11 px Geist Mono 600, upper case. +pub fn section_label(ui: &mut Ui, text: &str, color: Color32) -> Response { + let galley = caps(ui, text, theme::HUD_SIZE, theme::mono_bold(), theme::LABEL_SPACING, color); + let (rect, resp) = ui.allocate_exact_size(vec2(ui.available_width(), 32.0), Sense::hover()); + let pos = pos2(rect.left() + 8.0, rect.center().y - galley.size().y / 2.0); + ui.painter().galley(pos, galley, color); + resp +} + +/// A small badge after a sidebar link ("BETA", "NEW"): 9 px mono in `color` on a tinted chip. +pub fn badge(painter: &Painter, ui: &Ui, right_center: egui::Pos2, text: &str, color: Color32) { + let galley = caps(ui, text, 9.0, theme::mono_bold(), 0.9, color); + let size = galley.size() + vec2(10.0, 4.0); + let rect = Rect::from_min_size(pos2(right_center.x - size.x, right_center.y - size.y / 2.0), size); + painter.rect(rect, CornerRadius::same(2), theme::fade(color, 0.12), Stroke::new(1.0, theme::fade(color, 0.4)), egui::StrokeKind::Inside); + painter.galley(rect.center() - galley.size() / 2.0, galley, color); +} + +/// What a [`pill`] shows before its label. +pub enum Leading<'a> { + None, + Icon(Icon), + /// An aspect ratio outline (`None` = the dashed "auto" frame). + Aspect(Option<(f32, f32)>), + /// A small caption in front of the label ("SD", "HD"). + Caption(&'a str), + /// A model maker's logo. + Logo(&'a egui::TextureHandle), +} + +/// A toolbar pill (`bg-ui-controls border-white/15 rounded-[3px] px-3 py-1.5 text-sm font-medium`), +/// as used for the model, aspect ratio, resolution and duration pickers. +pub fn pill(ui: &mut Ui, leading: Leading<'_>, label: &str, open: bool) -> Response { + let enabled = ui.is_enabled(); + let font = FontId::new(14.0, theme::medium()); + let galley = ui.painter().layout_no_wrap(label.to_owned(), font, theme::INK); + let caption = match leading { + Leading::Caption(c) => Some(caps(ui, c, 9.0, theme::mono_bold(), 0.6, theme::DIM)), + _ => None, + }; + let lead_w = match (&leading, &caption) { + (Leading::None, _) => 0.0, + (_, Some(c)) => c.size().x + 6.0, + _ => 14.0 + 7.0, + }; + let size = vec2(12.0 + lead_w + galley.size().x + 12.0, theme::CONTROL_H); + let (rect, resp) = ui.allocate_exact_size(size, Sense::click()); + let hovered = resp.hovered() && enabled; + let p = ui.painter(); + let fill = if open || hovered { blend(theme::CONTROLS, theme::WASH_HOVER) } else { theme::CONTROLS }; + let stroke = if open { theme::LINE_STRONG } else { theme::LINE }; + p.rect(rect, theme::RADIUS, fill, Stroke::new(1.0, stroke), egui::StrokeKind::Inside); + let ink = if enabled { theme::INK } else { theme::FAINT }; + let mut x = rect.left() + 12.0; + let lead_rect = Rect::from_center_size(pos2(x + 7.0, rect.center().y), vec2(14.0, 14.0)); + match leading { + Leading::None => {}, + Leading::Icon(icon) => icons::paint(p, lead_rect, icon, ink), + Leading::Aspect(ratio) => icons::paint_aspect(p, lead_rect, ratio, ink), + Leading::Logo(texture) => { + egui::Image::new(texture).tint(ink).paint_at(ui, lead_rect); + }, + Leading::Caption(_) => { + if let Some(c) = caption { + p.galley(pos2(x, rect.center().y - c.size().y / 2.0), c, theme::DIM); + } + }, + } + x += lead_w; + p.galley_with_override_text_color(pos2(x, rect.center().y - galley.size().y / 2.0), galley, ink); + resp.widget_info(|| egui::WidgetInfo::labeled(egui::WidgetType::Button, enabled, label)); + if enabled { + resp.on_hover_cursor(egui::CursorIcon::PointingHand) + } else { + resp + } +} + +/// A transparent toolbar button with an icon and an optional trailing label +/// (`text-base-fg/50`, `hover:bg-white/5`): the count picker and clear-all. +pub fn ghost(ui: &mut Ui, icon: Icon, label: Option<&str>, tip: &str, active: bool) -> Response { + let enabled = ui.is_enabled(); + let galley = label.map(|l| ui.painter().layout_no_wrap(l.to_owned(), FontId::new(14.0, theme::medium()), theme::INK)); + let w = match &galley { + Some(g) => 10.0 + 15.0 + 6.0 + g.size().x + 10.0, + None => 36.0, + }; + let (rect, resp) = ui.allocate_exact_size(vec2(w, 36.0), Sense::click()); + let hovered = resp.hovered() && enabled; + let p = ui.painter(); + if hovered || active { + p.rect_filled(rect, theme::RADIUS, theme::WASH); + } + let ink = match (enabled, hovered || active) { + (false, _) => theme::fade(theme::DIM, 0.5), + (true, true) => theme::INK, + (true, false) => theme::DIM, + }; + match galley { + Some(g) => { + let icon_rect = Rect::from_center_size(pos2(rect.left() + 10.0 + 7.5, rect.center().y), vec2(15.0, 15.0)); + icons::paint(p, icon_rect, icon, ink); + p.galley_with_override_text_color(pos2(icon_rect.right() + 6.0, rect.center().y - g.size().y / 2.0), g, ink); + }, + None => icons::paint(p, Rect::from_center_size(rect.center(), vec2(16.0, 16.0)), icon, ink), + } + resp.widget_info(|| egui::WidgetInfo::labeled(egui::WidgetType::Button, enabled, tip)); + let resp = resp.on_hover_text(tip); + if enabled { + resp.on_hover_cursor(egui::CursorIcon::PointingHand) + } else { + resp + } +} + +/// A small square icon button for overlays (`h-7 w-7`, `hover:bg-white/15`). +pub fn overlay_icon(ui: &mut Ui, icon: Icon, tip: &str) -> Response { + let (rect, resp) = ui.allocate_exact_size(vec2(28.0, 28.0), Sense::click()); + let hovered = resp.hovered(); + if hovered { + ui.painter().rect_filled(rect, theme::RADIUS, Color32::from_white_alpha(38)); + } + let ink = if hovered { Color32::WHITE } else { Color32::from_white_alpha(217) }; + icons::paint(ui.painter(), Rect::from_center_size(rect.center(), vec2(14.0, 14.0)), icon, ink); + resp.widget_info(|| egui::WidgetInfo::labeled(egui::WidgetType::Button, true, tip)); + resp.on_hover_text(tip).on_hover_cursor(egui::CursorIcon::PointingHand) +} + +/// The round blue generate button (`GenerateIconButton`): an up arrow, a spinner while `loading`. +pub fn generate_button(ui: &mut Ui, enabled: bool, loading: bool, tip: &str) -> Response { + let (rect, resp) = ui.allocate_exact_size(vec2(36.0, 36.0), if enabled { Sense::click() } else { Sense::hover() }); + let hovered = resp.hovered() && enabled; + let fill = match (enabled, hovered) { + (false, _) => theme::fade(theme::ACCENT, 0.4), + (true, true) => theme::ACCENT_400, + (true, false) => theme::ACCENT, + }; + ui.painter().circle_filled(rect.center(), 18.0, fill); + let ink = if enabled { Color32::WHITE } else { theme::fade(Color32::WHITE, 0.5) }; + let inner = Rect::from_center_size(rect.center(), vec2(18.0, 18.0)); + if loading { + icons::paint_spinner(ui, inner, ink); + } else { + icons::paint(ui.painter(), inner, Icon::ArrowUp, ink); + } + resp.widget_info(|| egui::WidgetInfo::labeled(egui::WidgetType::Button, enabled, "Generate")); + let resp = resp.on_hover_text(tip); + if enabled { + resp.on_hover_cursor(egui::CursorIcon::PointingHand) + } else { + resp + } +} + +/// Which of the site's block button variants. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +pub enum Kind { + /// A white block with near-black text; fades a little on hover. + Primary, + /// Outlined in `base-fg/40`; inverts on hover. + Secondary, + /// The brand blue. + Accent, + /// Solid red. + Danger, +} + +/// A block button with a mono upper-case label (`SIGN UP TO CREATE`, `DOWNLOAD`), at least `width` +/// wide and `height` tall. +pub fn button(ui: &mut Ui, icon: Option, text: &str, kind: Kind, width: f32, height: f32) -> Response { + let enabled = ui.is_enabled(); + let galley = caps(ui, text, theme::HUD_SIZE, theme::mono_bold(), theme::LABEL_SPACING, theme::INK); + let icon_w = if icon.is_some() { 13.0 + 8.0 } else { 0.0 }; + let size = vec2((galley.size().x + icon_w + 40.0).max(width), height); + let (rect, resp) = ui.allocate_exact_size(size, Sense::click()); + let hovered = resp.hovered() && enabled; + let (fill, stroke, ink) = match kind { + Kind::Primary => (theme::fade(theme::INVERT_BG, if hovered { 0.88 } else { 1.0 }), Stroke::NONE, theme::INVERT_FG), + Kind::Accent => (if hovered { theme::ACCENT_400 } else { theme::ACCENT }, Stroke::NONE, Color32::WHITE), + Kind::Danger => (theme::fade(theme::DANGER, if hovered { 0.85 } else { 1.0 }), Stroke::NONE, Color32::WHITE), + Kind::Secondary if hovered => (theme::INVERT_BG, Stroke::NONE, theme::INVERT_FG), + Kind::Secondary => (Color32::TRANSPARENT, Stroke::new(1.0, theme::LINE_STRONG), theme::INK), + }; + let dim = |c: Color32| if enabled { c } else { theme::fade(c, 0.5) }; + let p = ui.painter(); + p.rect(rect, theme::RADIUS, dim(fill), Stroke::new(stroke.width, dim(stroke.color)), egui::StrokeKind::Inside); + let content_w = icon_w + galley.size().x; + let mut x = rect.center().x - content_w / 2.0; + if let Some(icon) = icon { + icons::paint(p, Rect::from_center_size(pos2(x + 6.5, rect.center().y), vec2(13.0, 13.0)), icon, dim(ink)); + x += icon_w; + } + p.galley_with_override_text_color(pos2(x, rect.center().y - galley.size().y / 2.0), galley, dim(ink)); + resp.widget_info(|| egui::WidgetInfo::labeled(egui::WidgetType::Button, enabled, text)); + if enabled { + resp.on_hover_cursor(egui::CursorIcon::PointingHand) + } else { + resp + } +} + +/// Fine registration marks at a panel's corners (the landing page's section corners). +pub fn corner_marks(painter: &Painter, rect: Rect) { + let stroke = Stroke::new(1.0, theme::LINE_STRONG); + for c in [rect.left_top(), rect.right_top(), rect.left_bottom(), rect.right_bottom()] { + painter.hline(c.x - 5.5..=c.x + 5.5, c.y, stroke); + painter.vline(c.x, c.y - 5.5..=c.y + 5.5, stroke); + } +} + +/// The frame of popovers and menus: the controls surface, a hairline and a soft shadow. +pub fn popover_frame() -> Frame { + Frame::new().fill(theme::CONTROLS).stroke(theme::hairline()).corner_radius(theme::RADIUS).shadow(theme::shadow()).inner_margin(Margin::same(4)) +} + +/// A popover's heading ("SELECT MODEL", "ASPECT RATIO") with a hairline under it. +pub fn menu_header(ui: &mut Ui, text: &str) { + let galley = caps(ui, text, theme::HUD_SIZE, theme::mono_bold(), theme::LABEL_SPACING, theme::fade(theme::INK, 0.5)); + let (rect, _) = ui.allocate_exact_size(vec2(ui.available_width(), 28.0), Sense::hover()); + ui.painter().galley(pos2(rect.left() + 8.0, rect.center().y - galley.size().y / 2.0), galley, theme::INK); +} + +/// What a [`menu_row`] shows at its left. +pub enum RowLead<'a> { + None, + Icon(Icon), + Aspect(Option<(f32, f32)>), + /// A 36 px tile with a model maker's logo (white texture, tinted). + Logo(&'a egui::TextureHandle), +} + +/// One option in a popover: a lead, a title, an optional muted subtitle, and a check when +/// `selected` (or a chevron when `submenu`). Highlights on hover or when `highlighted`. +pub fn menu_row(ui: &mut Ui, lead: RowLead<'_>, title: &str, subtitle: Option<&str>, selected: bool, submenu: bool, highlighted: bool) -> Response { + let enabled = ui.is_enabled(); + let h = if subtitle.is_some() { 48.0 } else { 34.0 }; + let (rect, resp) = ui.allocate_exact_size(vec2(ui.available_width(), h), Sense::click()); + let on = (resp.hovered() && enabled) || highlighted; + let p = ui.painter(); + if on { + p.rect_filled(rect, theme::RADIUS, theme::WASH_HOVER); + } + let ink = if enabled { theme::INK } else { theme::FAINT }; + let mut x = rect.left() + 8.0; + match lead { + RowLead::None => {}, + RowLead::Icon(icon) => { + icons::paint(p, Rect::from_center_size(pos2(x + 8.0, rect.center().y), vec2(15.0, 15.0)), icon, ink); + x += 26.0; + }, + RowLead::Aspect(ratio) => { + icons::paint_aspect(p, Rect::from_center_size(pos2(x + 8.0, rect.center().y), vec2(16.0, 16.0)), ratio, ink); + x += 26.0; + }, + RowLead::Logo(texture) => { + let tile = Rect::from_center_size(pos2(x + 18.0, rect.center().y), vec2(36.0, 36.0)); + let (fill, border) = if selected { (theme::WASH_HOVER, Color32::WHITE) } else { (theme::WASH, theme::LINE) }; + p.rect(tile, theme::RADIUS, fill, Stroke::new(1.0, border), egui::StrokeKind::Inside); + egui::Image::new(texture).tint(ink).paint_at(ui, Rect::from_center_size(tile.center(), vec2(18.0, 18.0))); + x += 46.0; + }, + } + let title_font = FontId::new(13.5, theme::medium()); + match subtitle { + Some(sub) => { + p.text(pos2(x, rect.center().y - 8.0), Align2::LEFT_CENTER, title, title_font, ink); + p.text(pos2(x, rect.center().y + 8.0), Align2::LEFT_CENTER, sub, FontId::new(11.5, egui::FontFamily::Proportional), theme::MUTED); + }, + None => { + p.text(pos2(x, rect.center().y), Align2::LEFT_CENTER, title, title_font, ink); + }, + } + let trail = Rect::from_center_size(pos2(rect.right() - 14.0, rect.center().y), vec2(13.0, 13.0)); + if selected { + icons::paint(p, trail, Icon::Check, theme::INK); + } else if submenu { + icons::paint(p, trail, Icon::ChevronRight, theme::DIM); + } + resp.widget_info(|| egui::WidgetInfo::selected(egui::WidgetType::Button, enabled, selected, title)); + if enabled { + resp.on_hover_cursor(egui::CursorIcon::PointingHand) + } else { + resp + } +} + +/// Paints `fg` over `bg` (for hover fills on opaque surfaces). +pub fn blend(bg: Color32, fg: Color32) -> Color32 { + let a = fg.a() as f32 / 255.0; + let mix = |b: u8, f: u8| (b as f32 * (1.0 - a) + f as f32 * a).round() as u8; + let fg = fg.to_srgba_unmultiplied(); + Color32::from_rgb(mix(bg.r(), fg[0]), mix(bg.g(), fg[1]), mix(bg.b(), fg[2])) +} + +/// A thin square progress bar (`h-1 bg-white/10`, filled in `primary-400`). +pub fn progress_bar(painter: &Painter, rect: Rect, fraction: f32) { + painter.rect_filled(rect, CornerRadius::same(2), theme::WASH_HOVER); + let fill = Rect::from_min_size(rect.min, vec2(rect.width() * fraction.clamp(0.0, 1.0), rect.height())); + painter.rect_filled(fill, CornerRadius::same(2), theme::ACCENT_400); +} + +/// A heading in the display face (Archivo 620, tracked in like the site's `tracking-[-0.03em]`). +pub fn heading(text: &str, size: f32) -> egui::RichText { + egui::RichText::new(text).size(size).family(theme::display()).color(theme::INK).extra_letter_spacing(-0.03 * size) +} + +/// A square modal on the panel surface with a dimmed backdrop. Returns whether it asked to close +/// (backdrop click or Escape). +pub fn modal(ctx: &egui::Context, id: egui::Id, width: f32, content: impl FnOnce(&mut Ui)) -> bool { + let frame = Frame::new().fill(theme::PANEL).stroke(theme::hairline()).inner_margin(Margin::same(16)).shadow(theme::shadow()); + let resp = egui::Modal::new(id).frame(frame).backdrop_color(Color32::from_black_alpha(153)).show(ctx, |ui| { + ui.set_width(width.min(ctx.content_rect().width() - 48.0)); + content(ui); + }); + resp.should_close() +} + +/// A mono link with an ↗: muted, brighter on hover. Opens `url` in the browser. +pub fn hud_link(ui: &mut Ui, text: &str, url: &str) -> Response { + let galley = caps(ui, &format!("{text} \u{2197}"), theme::HUD_SIZE, theme::mono(), theme::HUD_SPACING, theme::MUTED); + let (rect, resp) = ui.allocate_exact_size(galley.size(), Sense::click()); + let color = if resp.hovered() { theme::INK_STRONG } else { theme::MUTED }; + ui.painter().galley_with_override_text_color(rect.min, galley, color); + let resp = resp.on_hover_text(url).on_hover_cursor(egui::CursorIcon::PointingHand); + if resp.clicked() { + ui.ctx().open_url(egui::OpenUrl::new_tab(url)); + } + resp +}