From ec1699839232a2e43e00b35f2326b099c34dffd5 Mon Sep 17 00:00:00 2001 From: lunarcleint Date: Fri, 13 Feb 2026 22:39:26 -0700 Subject: [PATCH 01/56] i messed up t he stash... --- src/assets/fonts/BeVietnamPro-ExtraBold.ttf | Bin 0 -> 138372 bytes src/ui/Categories.vue | 83 ++++++++++++++++++++ src/ui/Titlebar.vue | 13 +++ 3 files changed, 96 insertions(+) create mode 100644 src/assets/fonts/BeVietnamPro-ExtraBold.ttf create mode 100644 src/ui/Categories.vue create mode 100644 src/ui/Titlebar.vue diff --git a/src/assets/fonts/BeVietnamPro-ExtraBold.ttf b/src/assets/fonts/BeVietnamPro-ExtraBold.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c6ab04ddca339dd4882bf8def0d2044b88f1aaa9 GIT binary patch literal 138372 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
1m1X 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 BZ(9HW literal 0 HcmV?d00001 diff --git a/src/ui/Categories.vue b/src/ui/Categories.vue new file mode 100644 index 0000000..2f3266a --- /dev/null +++ b/src/ui/Categories.vue @@ -0,0 +1,83 @@ + + + + + \ No newline at end of file diff --git a/src/ui/Titlebar.vue b/src/ui/Titlebar.vue new file mode 100644 index 0000000..f8be376 --- /dev/null +++ b/src/ui/Titlebar.vue @@ -0,0 +1,13 @@ + + + \ No newline at end of file From ded2318a081ab8b47b2aac1f479264183cc35c83 Mon Sep 17 00:00:00 2001 From: lunarcleint Date: Fri, 13 Feb 2026 22:39:44 -0700 Subject: [PATCH 02/56] rest --- src-tauri/Cargo.lock | 350 ++++++++++++++++++++++++++-- src-tauri/Cargo.toml | 1 + src-tauri/capabilities/default.json | 12 +- src-tauri/src/lib.rs | 12 + src-tauri/tauri.conf.json | 9 +- src/Root.vue | 2 +- src/main.css | 6 + src/ui/Library.vue | 52 ++--- 8 files changed, 389 insertions(+), 55 deletions(-) diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index da758d4..9b18edb 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -8,6 +8,12 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "ahash" +version = "0.4.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0453232ace82dee0dd0b4c87a59bd90f7b53b314f3e0f61fe2ee7c8a16482289" + [[package]] name = "aho-corasick" version = "1.1.4" @@ -290,6 +296,12 @@ dependencies = [ "serde_core", ] +[[package]] +name = "block" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0d8c1fef690941d3e7788d328517591fecc684c084084702d6ff1641e993699a" + [[package]] name = "block-buffer" version = "0.10.4" @@ -479,6 +491,12 @@ version = "1.0.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9330f8b2ff13f34540b44e946ef35111825727b38d33286ef986142615121801" +[[package]] +name = "cfg_aliases" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "613afe47fcd5fac7ccf1db93babcb082c5994d996f20b8b159f2ad1658eb5724" + [[package]] name = "chrono" version = "0.4.43" @@ -491,6 +509,36 @@ dependencies = [ "windows-link 0.2.1", ] +[[package]] +name = "cocoa" +version = "0.25.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f6140449f97a6e97f9511815c5632d84c8aacf8ac271ad77c559218161a1373c" +dependencies = [ + "bitflags 1.3.2", + "block", + "cocoa-foundation", + "core-foundation 0.9.4", + "core-graphics 0.23.2", + "foreign-types", + "libc", + "objc", +] + +[[package]] +name = "cocoa-foundation" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8c6234cbb2e4c785b456c0644748b1ac416dd045799740356f8363dfe00c93f7" +dependencies = [ + "bitflags 1.3.2", + "block", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", + "libc", + "objc", +] + [[package]] name = "colog" version = "1.4.0" @@ -552,6 +600,16 @@ dependencies = [ "version_check", ] +[[package]] +name = "core-foundation" +version = "0.9.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "91e195e091a93c46f7102ec7818a2aa394e1e1771c3ab4825963fa03e45afb8f" +dependencies = [ + "core-foundation-sys", + "libc", +] + [[package]] name = "core-foundation" version = "0.10.1" @@ -568,6 +626,19 @@ version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" +[[package]] +name = "core-graphics" +version = "0.23.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c07782be35f9e1140080c6b96f0d44b739e2278479f64e02fdab4e32dfd8b081" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "core-graphics-types 0.1.3", + "foreign-types", + "libc", +] + [[package]] name = "core-graphics" version = "0.24.0" @@ -575,12 +646,23 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fa95a34622365fa5bbf40b20b75dba8dfa8c94c734aea8ac9a5ca38af14316f1" dependencies = [ "bitflags 2.10.0", - "core-foundation", - "core-graphics-types", + "core-foundation 0.10.1", + "core-graphics-types 0.2.0", "foreign-types", "libc", ] +[[package]] +name = "core-graphics-types" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "45390e6114f68f718cc7a830514a96f903cccd70d02a8f6d9f643ac4ba45afaf" +dependencies = [ + "bitflags 1.3.2", + "core-foundation 0.9.4", + "libc", +] + [[package]] name = "core-graphics-types" version = "0.2.0" @@ -588,7 +670,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3d44a101f213f6c4cdc1853d4b78aef6db6bdfa3468798cc1d9912f4735013eb" dependencies = [ "bitflags 2.10.0", - "core-foundation", + "core-foundation 0.10.1", "libc", ] @@ -813,6 +895,15 @@ dependencies = [ "syn 2.0.115", ] +[[package]] +name = "dlv-list" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68df3f2b690c1b86e65ef7830956aededf3cb0a16f898f79b9a6f421a7b6211b" +dependencies = [ + "rand 0.8.5", +] + [[package]] name = "dpi" version = "0.1.2" @@ -875,6 +966,19 @@ version = "1.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "66b7e2430c6dff6a955451e2cfc438f09cea1965a9d6f87f7e3b90decc014099" +[[package]] +name = "enigo" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "802e4b2ae123615659085369b453cba87c5562e46ed8050a909fee18a9bc3157" +dependencies = [ + "core-graphics 0.23.2", + "libc", + "objc", + "pkg-config", + "windows 0.51.1", +] + [[package]] name = "enumflags2" version = "0.7.12" @@ -992,6 +1096,15 @@ dependencies = [ "rustc_version", ] +[[package]] +name = "file-locker" +version = "1.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "75ae8b5984a4863d8a32109a848d038bd6d914f20f010cc141375f7a183c41cf" +dependencies = [ + "nix", +] + [[package]] name = "find-msvc-tools" version = "0.1.9" @@ -1056,6 +1169,16 @@ dependencies = [ "percent-encoding", ] +[[package]] +name = "freedesktop_entry_parser" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db9c27b72f19a99a895f8ca89e2d26e4ef31013376e56fdafef697627306c3e4" +dependencies = [ + "nom", + "thiserror 1.0.69", +] + [[package]] name = "futf" version = "0.1.5" @@ -1464,6 +1587,15 @@ dependencies = [ "syn 2.0.115", ] +[[package]] +name = "hashbrown" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" +dependencies = [ + "ahash", +] + [[package]] name = "hashbrown" version = "0.12.3" @@ -2017,6 +2149,29 @@ dependencies = [ "libc", ] +[[package]] +name = "linicon" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ee8c5653188a809616c97296180a0547a61dba205bcdcbdd261dbd022a25fd9" +dependencies = [ + "file-locker", + "freedesktop_entry_parser", + "linicon-theme", + "memmap2", + "thiserror 1.0.69", +] + +[[package]] +name = "linicon-theme" +version = "1.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a4f8240c33bb08c5d8b8cdea87b683b05e61037aa76ff26bef40672cc6ecbb80" +dependencies = [ + "freedesktop_entry_parser", + "rust-ini", +] + [[package]] name = "linux-raw-sys" version = "0.11.0" @@ -2050,6 +2205,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c41e0c4fef86961ac6d6f8a82609f55f31b05e4fce149ac5710e439df7619ba4" +[[package]] +name = "malloc_buf" +version = "0.0.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62bb907fe88d54d8d9ce32a3cceab4218ed2f6b7d35617cafe9adf84e43919cb" +dependencies = [ + "libc", +] + [[package]] name = "markup5ever" version = "0.14.1" @@ -2087,6 +2251,15 @@ version = "2.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f8ca58f447f06ed17d5fc4043ce1b10dd205e060fb3ce5b979b8ed8e59ff3f79" +[[package]] +name = "memmap2" +version = "0.5.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "83faa42c0a078c393f6b29d5db232d8be22776a891f8f56e5284faee4a20b327" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.9.1" @@ -2102,6 +2275,12 @@ version = "0.3.17" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6877bb514081ee2a7ff5ef9de3281f14a4dd4bceac4c09388074a6b5df8a139a" +[[package]] +name = "minimal-lexical" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a" + [[package]] name = "miniz_oxide" version = "0.8.9" @@ -2134,6 +2313,7 @@ dependencies = [ "serini", "tauri", "tauri-build", + "tauri-plugin-decorum", "tauri-plugin-dialog", "tauri-plugin-opener", ] @@ -2195,12 +2375,34 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.10.0", + "cfg-if", + "cfg_aliases", + "libc", +] + [[package]] name = "nodrop" version = "0.1.14" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "72ef4a56884ca558e5ddb05a1d1e7e1bfd9a68d9ed024c21704cc98872dae1bb" +[[package]] +name = "nom" +version = "7.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a" +dependencies = [ + "memchr", + "minimal-lexical", +] + [[package]] name = "num-conv" version = "0.2.0" @@ -2238,6 +2440,15 @@ dependencies = [ "syn 2.0.115", ] +[[package]] +name = "objc" +version = "0.2.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "915b1b472bc21c53464d6c8461c9d3af805ba1ef837e1cac254428f4a77177b1" +dependencies = [ + "malloc_buf", +] + [[package]] name = "objc2" version = "0.6.3" @@ -2480,6 +2691,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "ordered-multimap" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1c672c7ad9ec066e428c00eb917124a06f08db19e2584de982cc34b1f4c12485" +dependencies = [ + "dlv-list", + "hashbrown 0.9.1", +] + [[package]] name = "ordered-stream" version = "0.2.0" @@ -3120,6 +3341,16 @@ dependencies = [ "windows-sys 0.60.2", ] +[[package]] +name = "rust-ini" +version = "0.17.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63471c4aa97a1cf8332a5f97709a79a4234698de6a1f5087faf66f2dae810e22" +dependencies = [ + "cfg-if", + "ordered-multimap", +] + [[package]] name = "rustc_version" version = "0.4.1" @@ -3636,8 +3867,8 @@ checksum = "f3a753bdc39c07b192151523a3f77cd0394aa75413802c883a0f6f6a0e5ee2e7" dependencies = [ "bitflags 2.10.0", "block2", - "core-foundation", - "core-graphics", + "core-foundation 0.10.1", + "core-graphics 0.24.0", "crossbeam-channel", "dispatch", "dlopen2", @@ -3662,7 +3893,7 @@ dependencies = [ "tao-macros", "unicode-segmentation", "url", - "windows", + "windows 0.61.3", "windows-core 0.61.2", "windows-version", "x11-dl", @@ -3733,7 +3964,7 @@ dependencies = [ "webkit2gtk", "webview2-com", "window-vibrancy", - "windows", + "windows 0.61.3", ] [[package]] @@ -3816,6 +4047,23 @@ dependencies = [ "walkdir", ] +[[package]] +name = "tauri-plugin-decorum" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "db925c61a04a937028bc91ad8ae64a93b84a1715b964530925a54e793d494999" +dependencies = [ + "anyhow", + "cocoa", + "enigo", + "linicon", + "objc", + "rand 0.8.5", + "serde", + "tauri", + "tauri-plugin", +] + [[package]] name = "tauri-plugin-dialog" version = "2.6.0" @@ -3874,7 +4122,7 @@ dependencies = [ "tauri-plugin", "thiserror 2.0.18", "url", - "windows", + "windows 0.61.3", "zbus", ] @@ -3900,7 +4148,7 @@ dependencies = [ "url", "webkit2gtk", "webview2-com", - "windows", + "windows 0.61.3", ] [[package]] @@ -3926,7 +4174,7 @@ dependencies = [ "url", "webkit2gtk", "webview2-com", - "windows", + "windows 0.61.3", "wry", ] @@ -4697,7 +4945,7 @@ checksum = "7130243a7a5b33c54a444e54842e6a9e133de08b5ad7b5861cd8ed9a6a5bc96a" dependencies = [ "webview2-com-macros", "webview2-com-sys", - "windows", + "windows 0.61.3", "windows-core 0.61.2", "windows-implement", "windows-interface", @@ -4721,7 +4969,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "381336cfffd772377d291702245447a5251a2ffa5bad679c99e61bc48bacbf9c" dependencies = [ "thiserror 2.0.18", - "windows", + "windows 0.61.3", "windows-core 0.61.2", ] @@ -4771,6 +5019,16 @@ dependencies = [ "windows-version", ] +[[package]] +name = "windows" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca229916c5ee38c2f2bc1e9d8f04df975b4bd93f9955dc69fabb5d91270045c9" +dependencies = [ + "windows-core 0.51.1", + "windows-targets 0.48.5", +] + [[package]] name = "windows" version = "0.61.3" @@ -4793,6 +5051,15 @@ dependencies = [ "windows-core 0.61.2", ] +[[package]] +name = "windows-core" +version = "0.51.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f1f8cf84f35d2db49a46868f947758c7a1138116f7fac3bc844f43ade1292e64" +dependencies = [ + "windows-targets 0.48.5", +] + [[package]] name = "windows-core" version = "0.61.2" @@ -4961,6 +5228,21 @@ dependencies = [ "windows_x86_64_msvc 0.42.2", ] +[[package]] +name = "windows-targets" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a2fa6e2155d7247be68c096456083145c183cbbbc2764150dda45a87197940c" +dependencies = [ + "windows_aarch64_gnullvm 0.48.5", + "windows_aarch64_msvc 0.48.5", + "windows_i686_gnu 0.48.5", + "windows_i686_msvc 0.48.5", + "windows_x86_64_gnu 0.48.5", + "windows_x86_64_gnullvm 0.48.5", + "windows_x86_64_msvc 0.48.5", +] + [[package]] name = "windows-targets" version = "0.52.6" @@ -5018,6 +5300,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "597a5118570b68bc08d8d59125332c54f1ba9d9adeedeef5b99b02ba2b0698f8" +[[package]] +name = "windows_aarch64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8" + [[package]] name = "windows_aarch64_gnullvm" version = "0.52.6" @@ -5036,6 +5324,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e08e8864a60f06ef0d0ff4ba04124db8b0fb3be5776a5cd47641e942e58c4d43" +[[package]] +name = "windows_aarch64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc" + [[package]] name = "windows_aarch64_msvc" version = "0.52.6" @@ -5054,6 +5348,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c61d927d8da41da96a81f029489353e68739737d3beca43145c8afec9a31a84f" +[[package]] +name = "windows_i686_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e" + [[package]] name = "windows_i686_gnu" version = "0.52.6" @@ -5084,6 +5384,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "44d840b6ec649f480a41c8d80f9c65108b92d89345dd94027bfe06ac444d1060" +[[package]] +name = "windows_i686_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406" + [[package]] name = "windows_i686_msvc" version = "0.52.6" @@ -5102,6 +5408,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8de912b8b8feb55c064867cf047dda097f92d51efad5b491dfb98f6bbb70cb36" +[[package]] +name = "windows_x86_64_gnu" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e" + [[package]] name = "windows_x86_64_gnu" version = "0.52.6" @@ -5120,6 +5432,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "26d41b46a36d453748aedef1486d5c7a85db22e56aff34643984ea85514e94a3" +[[package]] +name = "windows_x86_64_gnullvm" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc" + [[package]] name = "windows_x86_64_gnullvm" version = "0.52.6" @@ -5138,6 +5456,12 @@ version = "0.42.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9aec5da331524158c6d1a4ac0ab1541149c0b9505fde06423b02f5ef0106b9f0" +[[package]] +name = "windows_x86_64_msvc" +version = "0.48.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538" + [[package]] name = "windows_x86_64_msvc" version = "0.52.6" @@ -5311,7 +5635,7 @@ dependencies = [ "webkit2gtk", "webkit2gtk-sys", "webview2-com", - "windows", + "windows 0.61.3", "windows-core 0.61.2", "windows-version", "x11-dl", diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 2cbce49..cd3a28e 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -20,3 +20,4 @@ serde_json = "1" log = "0.4.29" colog = "1.4.0" serini = "0.2.2" +tauri-plugin-decorum = "1.1.1" diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index d238f3d..5056b03 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -9,6 +9,16 @@ "core:default", "opener:default", "core:window:default", - "dialog:default" + "dialog:default", + "core:window:allow-close", + "core:window:allow-center", + "core:window:allow-minimize", + "core:window:allow-maximize", + "core:window:allow-set-size", + "core:window:allow-set-focus", + "core:window:allow-is-maximized", + "core:window:allow-start-dragging", + "core:window:allow-toggle-maximize", + "decorum:allow-show-snap-overlay" ] } \ No newline at end of file diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index cce7ee4..0be3115 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,6 +1,7 @@ use crate::{engines::EngineContext, instances::InstanceList, mods::ModContext}; use std::{collections::HashMap, sync::Mutex}; use tauri::Manager; +use tauri_plugin_decorum::WebviewWindowExt; mod engines; mod instances; @@ -34,7 +35,18 @@ pub fn run() { tauri::Builder::default() .plugin(tauri_plugin_dialog::init()) + .plugin(tauri_plugin_decorum::init()) .setup(|app| { + let main_window = app.get_webview_window("main").unwrap(); + main_window.create_overlay_titlebar().unwrap(); + + #[cfg(target_os = "macos")] + { + main_window.set_traffic_lights_inset(12.0, 16.0).unwrap(); + main_window.make_transparent().unwrap(); + main_window.set_window_level(25).unwrap(); + } + let app_data_path = app .path() .app_data_dir() diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index 0cff240..776a186 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -13,15 +13,18 @@ "windows": [ { "title": "Modfriend", + "label": "main", "minWidth": 1000, "minHeight": 600, - "visible": false, - "backgroundColor": "#2d1e32" + "titleBarStyle": "Overlay", + "hiddenTitle": true, + "decorations": false } ], "security": { "csp": null - } + }, + "withGlobalTauri": true }, "bundle": { "active": true, diff --git a/src/Root.vue b/src/Root.vue index bd4fef5..ffdc198 100644 --- a/src/Root.vue +++ b/src/Root.vue @@ -10,5 +10,5 @@ onMounted(() => { diff --git a/src/main.css b/src/main.css index ded27d9..b8ee42b 100644 --- a/src/main.css +++ b/src/main.css @@ -96,3 +96,9 @@ @apply bg-bg-primary/50 rounded-xl overflow-hidden; } } + +button#decorum-tb-minimize, +button#decorum-tb-maximize, +button#decorum-tb-close { + color: white +} \ No newline at end of file diff --git a/src/ui/Library.vue b/src/ui/Library.vue index 133d6f8..7c76873 100644 --- a/src/ui/Library.vue +++ b/src/ui/Library.vue @@ -4,6 +4,8 @@ import { SplitterGroup, SplitterPanel, SplitterResizeHandle } from 'reka-ui'; import { invoke } from '@tauri-apps/api/core'; import { onMounted, ref } from 'vue'; import { open } from '@tauri-apps/plugin-dialog'; +import Titlebar from './Titlebar.vue'; +import Categories from './Categories.vue'; interface ListDisplayInfo { canonInfo: CanonInfo; @@ -50,42 +52,13 @@ async function refreshEngineContexts() { } onMounted(refreshEngineContexts); - - diff --git a/src/composables/useBackground.ts b/src/composables/useBackground.ts index a187c85..09f8f44 100644 --- a/src/composables/useBackground.ts +++ b/src/composables/useBackground.ts @@ -1,14 +1,44 @@ import { ref } from 'vue'; const background = ref(''); +type BackgroundChangeCallback = ( + newBackground: string, + previousBackground: string, +) => void; +const backgroundChangeCallbacks = new Set(); export function useBackground() { + // Prefer using this function over directly setting the background, as it will trigger callbacks function setBackground(newBackground: string) { + const previousBackground = background.value; + + if (newBackground === previousBackground) { + return; + } + background.value = newBackground; + + for (const callback of backgroundChangeCallbacks) { + // Make sure that one error doesn't prevent other callbacks from running + try { + callback(newBackground, previousBackground); + } catch (error) { + console.error('Background change callback failed', error); + } + } + } + + function onBackgroundChange(callback: BackgroundChangeCallback) { + backgroundChangeCallbacks.add(callback); + + return () => { + backgroundChangeCallbacks.delete(callback); + }; } return { background, setBackground, + onBackgroundChange, }; } From f96b78af4754f41e6a7adde81c3f9f9a8fb488a9 Mon Sep 17 00:00:00 2001 From: lunarcleint Date: Mon, 16 Mar 2026 00:51:22 -0700 Subject: [PATCH 26/56] Fix title bar on MacOS. --- package-lock.json | 8 -------- src-tauri/src/lib.rs | 3 +++ src/components/Titlebar.vue | 7 ++++++- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/package-lock.json b/package-lock.json index 02bbe67..2c337ea 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1610,7 +1610,6 @@ "integrity": "sha512-oH72nZRfDv9lADUBSo104Aq7gPHpQZc4BTx38r9xf9pg5LfP6EzSyH2n7qFmmxRQXh7YlUXODcYsg6PuTDSxGg==", "devOptional": true, "license": "MIT", - "peer": true, "dependencies": { "undici-types": "~7.16.0" } @@ -1692,7 +1691,6 @@ "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.28.tgz", "integrity": "sha512-6TnKMiNkd6u6VeVDhZn/07KhEZuBSn43Wd2No5zaP5s3xm8IqFTHBj84HJah4UepSUJTro5SoqqlOY22FKY96g==", "license": "MIT", - "peer": true, "dependencies": { "@babel/parser": "^7.29.0", "@vue/compiler-core": "3.5.28", @@ -2426,7 +2424,6 @@ "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", "license": "MIT", - "peer": true, "engines": { "node": ">=12" }, @@ -2453,7 +2450,6 @@ } ], "license": "MIT", - "peer": true, "dependencies": { "nanoid": "^3.3.11", "picocolors": "^1.1.1", @@ -2509,7 +2505,6 @@ "integrity": "sha512-I7AIg5boAr5R0FFtJ6rCfD+LFsWHp81dolrFD8S79U9tb8Az2nGrJncnMSnys+bpQJfRUzqs9hnA81OAA3hCuQ==", "dev": true, "license": "MIT", - "peer": true, "bin": { "prettier": "bin/prettier.cjs" }, @@ -2659,7 +2654,6 @@ "integrity": "sha512-hjcS1mhfuyi4WW8IWtjP7brDrG2cuDZukyrYrSauoXGNgx0S7zceP07adYkJycEr56BOUTNPzbInooiN3fn1qw==", "devOptional": true, "license": "Apache-2.0", - "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -2680,7 +2674,6 @@ "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.1.tgz", "integrity": "sha512-+Oxm7q9hDoLMyJOYfUYBuHQo+dkAloi33apOPP56pzj+vsdJDzr+j1NISE5pyaAuKL4A3UD34qd0lx5+kfKp2g==", "license": "MIT", - "peer": true, "dependencies": { "esbuild": "^0.25.0", "fdir": "^6.4.4", @@ -2762,7 +2755,6 @@ "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.28.tgz", "integrity": "sha512-BRdrNfeoccSoIZeIhyPBfvWSLFP4q8J3u8Ju8Ug5vu3LdD+yTM13Sg4sKtljxozbnuMu1NB1X5HBHRYUzFocKg==", "license": "MIT", - "peer": true, "dependencies": { "@vue/compiler-dom": "3.5.28", "@vue/compiler-sfc": "3.5.28", diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index d45357d..afb7c83 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -43,7 +43,10 @@ pub fn run() { #[cfg(not(target_os = "linux"))] { let main_window = app.get_webview_window("main").unwrap(); + + #[cfg(target_os = "windows")] main_window.set_decorations(false).unwrap(); + main_window.create_overlay_titlebar().unwrap(); } diff --git a/src/components/Titlebar.vue b/src/components/Titlebar.vue index 4405cc0..1b5b24a 100644 --- a/src/components/Titlebar.vue +++ b/src/components/Titlebar.vue @@ -1,6 +1,10 @@ + + @@ -11,3 +15,4 @@ font-family: system-ui; } + From dee14fd13050d0ae1dd18b1ad7f8e1a3028e2822 Mon Sep 17 00:00:00 2001 From: Sqirra Moon Date: Tue, 17 Mar 2026 21:25:45 +0800 Subject: [PATCH 27/56] Simplify background change logic --- src/Root.vue | 111 +------------------------------ src/components/Background.vue | 70 +++++++++++++++++++ src/composables/useBackground.ts | 44 ------------ src/core/store.ts | 9 +++ src/views/Browse.vue | 6 +- src/views/Library.vue | 6 +- src/views/Queue.vue | 6 +- src/views/Settings.vue | 6 +- 8 files changed, 90 insertions(+), 168 deletions(-) create mode 100644 src/components/Background.vue delete mode 100644 src/composables/useBackground.ts create mode 100644 src/core/store.ts diff --git a/src/Root.vue b/src/Root.vue index d3cbae3..38d0519 100644 --- a/src/Root.vue +++ b/src/Root.vue @@ -1,4 +1,5 @@ + + + + diff --git a/src/composables/useBackground.ts b/src/composables/useBackground.ts deleted file mode 100644 index 09f8f44..0000000 --- a/src/composables/useBackground.ts +++ /dev/null @@ -1,44 +0,0 @@ -import { ref } from 'vue'; - -const background = ref(''); -type BackgroundChangeCallback = ( - newBackground: string, - previousBackground: string, -) => void; -const backgroundChangeCallbacks = new Set(); - -export function useBackground() { - // Prefer using this function over directly setting the background, as it will trigger callbacks - function setBackground(newBackground: string) { - const previousBackground = background.value; - - if (newBackground === previousBackground) { - return; - } - - background.value = newBackground; - - for (const callback of backgroundChangeCallbacks) { - // Make sure that one error doesn't prevent other callbacks from running - try { - callback(newBackground, previousBackground); - } catch (error) { - console.error('Background change callback failed', error); - } - } - } - - function onBackgroundChange(callback: BackgroundChangeCallback) { - backgroundChangeCallbacks.add(callback); - - return () => { - backgroundChangeCallbacks.delete(callback); - }; - } - - return { - background, - setBackground, - onBackgroundChange, - }; -} diff --git a/src/core/store.ts b/src/core/store.ts new file mode 100644 index 0000000..f9ac9c1 --- /dev/null +++ b/src/core/store.ts @@ -0,0 +1,9 @@ +import { reactive } from 'vue'; + +type GlobalStore = { + background: string; +}; + +export const globalStore = reactive({ + background: '', +}); diff --git a/src/views/Browse.vue b/src/views/Browse.vue index 72a71bd..0d1dded 100644 --- a/src/views/Browse.vue +++ b/src/views/Browse.vue @@ -1,13 +1,11 @@ diff --git a/src/views/Library.vue b/src/views/Library.vue index ea98ad7..ee298c9 100644 --- a/src/views/Library.vue +++ b/src/views/Library.vue @@ -10,7 +10,7 @@ import { } from 'reka-ui'; import { onMounted, ref } from 'vue'; -import { useBackground } from '../composables/useBackground'; +import { globalStore } from '@core/store'; interface ListDisplayInfo { canonInfo: CanonInfo; @@ -21,8 +21,6 @@ const LAST_SELECTED_INSTANCE_KEY = 'lastSelectedInstance'; const listItems = ref([]); const curItem = ref(); -const { setBackground } = useBackground(); - async function handleAddClick() { const selected = await open({ title: 'Select Engine Directory', @@ -132,7 +130,7 @@ function getLastSelectedInstance(): ListDisplayInfo | undefined { onMounted(async () => { await refreshEngineContexts(); const bgModule = await import('@assets/images/bg/codename.png?url'); // This is just a temporary thing, as the background should load dynamically based on the selected mod - setBackground(bgModule.default); + globalStore.background = bgModule.default; curItem.value = getLastSelectedInstance(); }); diff --git a/src/views/Queue.vue b/src/views/Queue.vue index c4a0117..606a835 100644 --- a/src/views/Queue.vue +++ b/src/views/Queue.vue @@ -1,13 +1,11 @@ diff --git a/src/views/Settings.vue b/src/views/Settings.vue index 09c3b14..6a28d86 100644 --- a/src/views/Settings.vue +++ b/src/views/Settings.vue @@ -1,13 +1,11 @@ From b0b2f8712f18ab49a62478c926d09e1ab9de28e1 Mon Sep 17 00:00:00 2001 From: lunarcleint Date: Thu, 19 Mar 2026 02:25:13 -0700 Subject: [PATCH 28/56] Fix overlay titlebar on MacOS. --- src-tauri/src/lib.rs | 12 ++++++++++-- src/Root.vue | 3 ++- src/components/Categories.vue | 3 ++- src/components/Titlebar.vue | 6 +----- 4 files changed, 15 insertions(+), 9 deletions(-) diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index afb7c83..824ed7b 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -40,12 +40,20 @@ pub fn run() { .plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_decorum::init()) .setup(|app| { + // Linux overlay title bar removal is temporary until decorum plugin is fixed #[cfg(not(target_os = "linux"))] { let main_window = app.get_webview_window("main").unwrap(); - #[cfg(target_os = "windows")] - main_window.set_decorations(false).unwrap(); + #[cfg(not(target_os = "macos"))] + { + main_window.set_decorations(false).unwrap(); + } + + #[cfg(target_os = "macos")] + { + main_window.set_traffic_lights_inset(20.0, 30.0).unwrap(); + } main_window.create_overlay_titlebar().unwrap(); } diff --git a/src/Root.vue b/src/Root.vue index 38d0519..bc69fdc 100644 --- a/src/Root.vue +++ b/src/Root.vue @@ -34,7 +34,8 @@ const curCategoryComponent = computed(() => {
- + + import { Category } from '@core/ui.ts'; +import { platform } from '@tauri-apps/plugin-os'; const props = defineProps<{ curCategory: Category; @@ -12,7 +13,7 @@ const emit = defineEmits<{