From 7b8ff2636cdb38e2f32df82ec5825d3dc7f89259 Mon Sep 17 00:00:00 2001 From: HorizonCode Date: Tue, 10 Dec 2024 10:08:23 +0100 Subject: [PATCH] add shadcn-svelte, add custom titlebar --- bun.lockb | Bin 44264 -> 105019 bytes components.json | 17 + package.json | 21 +- postcss.config.js | 6 + src-tauri/Cargo.lock | 771 +++++++++++++++++- src-tauri/Cargo.toml | 5 + src-tauri/capabilities/default.json | 14 +- src-tauri/src/actions.rs | 9 - src-tauri/src/lib.rs | 17 +- src-tauri/tauri.conf.json | 5 +- src/app.css | 75 ++ src/app.html | 27 +- src/lib/components/ui/button/button.svelte | 74 ++ src/lib/components/ui/button/index.ts | 17 + src/lib/components/ui/input/index.ts | 7 + src/lib/components/ui/input/input.svelte | 22 + .../components/ui/titlebar/titlebar.svelte | 57 ++ src/lib/utils.ts | 6 + src/routes/+layout.svelte | 10 + src/routes/+page.svelte | 166 +--- svelte.config.js | 5 + tailwind.config.ts | 96 +++ tsconfig.json | 2 +- 23 files changed, 1221 insertions(+), 208 deletions(-) create mode 100644 components.json create mode 100644 postcss.config.js delete mode 100644 src-tauri/src/actions.rs create mode 100644 src/app.css create mode 100644 src/lib/components/ui/button/button.svelte create mode 100644 src/lib/components/ui/button/index.ts create mode 100644 src/lib/components/ui/input/index.ts create mode 100644 src/lib/components/ui/input/input.svelte create mode 100644 src/lib/components/ui/titlebar/titlebar.svelte create mode 100644 src/lib/utils.ts create mode 100644 src/routes/+layout.svelte create mode 100644 tailwind.config.ts diff --git a/bun.lockb b/bun.lockb index cb3bc551991b141ed1797fda8359a437c163608e..fa48c16c81be2c3e9e3f6e369a507b5598a4821a 100644 GIT binary patch literal 105019 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 UbF;W!zC6|Y(t93TC+-XSUuc3UNdN!< diff --git a/components.json b/components.json new file mode 100644 index 0000000..b4696e4 --- /dev/null +++ b/components.json @@ -0,0 +1,17 @@ +{ + "$schema": "https://next.shadcn-svelte.com/schema.json", + "style": "default", + "tailwind": { + "config": "tailwind.config.ts", + "css": "src\\app.css", + "baseColor": "gray" + }, + "aliases": { + "components": "$lib/components", + "utils": "$lib/utils", + "ui": "$lib/components/ui", + "hooks": "$lib/hooks" + }, + "typescript": true, + "registry": "https://next.shadcn-svelte.com/registry" +} diff --git a/package.json b/package.json index 7c788d0..3c4fba7 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ezpplauncher", - "version": "0.1.0", + "version": "3.0.0", "description": "", "type": "module", "scripts": { @@ -14,19 +14,32 @@ }, "license": "MIT", "dependencies": { + "@tailwindcss/typography": "^0.5.15", "@tauri-apps/api": "^2", + "@tauri-apps/plugin-dialog": "~2", + "@tauri-apps/plugin-fs": "~2", "@tauri-apps/plugin-shell": "^2", - "@tauri-apps/plugin-sql": "^2.2.0" + "@tauri-apps/plugin-sql": "^2.2.0", + "lucide-svelte": "^0.468.0", + "radix-icons-svelte": "^1.2.1" }, "devDependencies": { "@sveltejs/adapter-static": "^3.0.5", "@sveltejs/kit": "^2.7.0", "@sveltejs/vite-plugin-svelte": "^4.0.0", + "@tauri-apps/cli": "^2", + "autoprefixer": "^10.4.20", + "bits-ui": "^1.0.0-next.69", + "clsx": "^2.1.1", + "sass-embedded": "^1.82.0", "svelte": "^5.0.0", "svelte-check": "^4.0.0", + "tailwind-merge": "^2.5.5", + "tailwind-variants": "^0.3.0", + "tailwindcss": "^3.4.9", + "tailwindcss-animate": "^1.0.7", "tslib": "^2.8.0", "typescript": "^5.5.0", - "vite": "^5.4.10", - "@tauri-apps/cli": "^2" + "vite": "^5.4.10" } } diff --git a/postcss.config.js b/postcss.config.js new file mode 100644 index 0000000..ba80730 --- /dev/null +++ b/postcss.config.js @@ -0,0 +1,6 @@ +export default { + plugins: { + tailwindcss: {}, + autoprefixer: {} + } +}; diff --git a/src-tauri/Cargo.lock b/src-tauri/Cargo.lock index beb4d7d..9a83320 100644 --- a/src-tauri/Cargo.lock +++ b/src-tauri/Cargo.lock @@ -80,6 +80,170 @@ version = "1.0.94" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c1fd03a028ef38ba2276dce7e33fcd6369c158a1bca17946c4b1b701891c1ff7" +[[package]] +name = "ashpd" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e9c39d707614dbcc6bed00015539f488d8e3fe3e66ed60961efc0c90f4b380b3" +dependencies = [ + "enumflags2", + "futures-channel", + "futures-util", + "rand 0.8.5", + "raw-window-handle", + "serde", + "serde_repr", + "tokio", + "url", + "wayland-backend", + "wayland-client", + "wayland-protocols", + "zbus 5.1.1", +] + +[[package]] +name = "async-broadcast" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20cd0e2e25ea8e5f7e9df04578dc6cf5c83577fd09b1a46aaf5c85e1c33f2a7e" +dependencies = [ + "event-listener", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-channel" +version = "2.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89b47800b0be77592da0afd425cc03468052844aff33b84e33cc696f64e77b6a" +dependencies = [ + "concurrent-queue", + "event-listener-strategy", + "futures-core", + "pin-project-lite", +] + +[[package]] +name = "async-executor" +version = "1.13.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "30ca9a001c1e8ba5149f91a74362376cc6bc5b919d92d988668657bd570bdcec" +dependencies = [ + "async-task", + "concurrent-queue", + "fastrand", + "futures-lite", + "slab", +] + +[[package]] +name = "async-fs" +version = "2.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ebcd09b382f40fcd159c2d695175b2ae620ffa5f3bd6f664131efff4e8b9e04a" +dependencies = [ + "async-lock", + "blocking", + "futures-lite", +] + +[[package]] +name = "async-io" +version = "2.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a2b323ccce0a1d90b449fd71f2a06ca7faa7c54c2751f06c9bd851fc061059" +dependencies = [ + "async-lock", + "cfg-if", + "concurrent-queue", + "futures-io", + "futures-lite", + "parking", + "polling", + "rustix", + "slab", + "tracing", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-lock" +version = "3.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ff6e472cdea888a4bd64f342f09b3f50e1886d32afe8df3d663c01140b811b18" +dependencies = [ + "event-listener", + "event-listener-strategy", + "pin-project-lite", +] + +[[package]] +name = "async-process" +version = "2.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "63255f1dc2381611000436537bbedfe83183faa303a5a0edaf191edef06526bb" +dependencies = [ + "async-channel", + "async-io", + "async-lock", + "async-signal", + "async-task", + "blocking", + "cfg-if", + "event-listener", + "futures-lite", + "rustix", + "tracing", +] + +[[package]] +name = "async-recursion" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3b43422f69d8ff38f95f1b2bb76517c91589a924d1559a0e935d7c8ce0274c11" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + +[[package]] +name = "async-signal" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "637e00349800c0bdf8bfc21ebbc0b6524abea702b0da4168ac00d070d0c0b9f3" +dependencies = [ + "async-io", + "async-lock", + "atomic-waker", + "cfg-if", + "futures-core", + "futures-io", + "rustix", + "signal-hook-registry", + "slab", + "windows-sys 0.59.0", +] + +[[package]] +name = "async-task" +version = "4.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b75356056920673b02621b35afd0f7dda9306d03c79a30f5c56c44cf256e3de" + +[[package]] +name = "async-trait" +version = "0.1.83" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "atk" version = "0.18.2" @@ -112,6 +276,12 @@ dependencies = [ "num-traits", ] +[[package]] +name = "atomic-waker" +version = "1.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0" + [[package]] name = "autocfg" version = "1.4.0" @@ -190,6 +360,19 @@ dependencies = [ "objc2", ] +[[package]] +name = "blocking" +version = "1.6.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "703f41c54fc768e63e091340b424302bb1c29ef4aa0c7f10fe849dfb114d29ea" +dependencies = [ + "async-channel", + "async-task", + "futures-io", + "futures-lite", + "piper", +] + [[package]] name = "brotli" version = "7.0.0" @@ -637,6 +820,17 @@ dependencies = [ "serde", ] +[[package]] +name = "derivative" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fcc3dd5e9e9c0b295d6e1e4d811fb6f157d5ffd784b8d202fc62eac8035a770b" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + [[package]] name = "derive_more" version = "0.99.18" @@ -700,6 +894,15 @@ dependencies = [ "syn 2.0.90", ] +[[package]] +name = "dlib" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" +dependencies = [ + "libloading", +] + [[package]] name = "dlopen2" version = "0.7.0" @@ -729,6 +932,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" @@ -803,6 +1012,33 @@ dependencies = [ "cfg-if", ] +[[package]] +name = "endi" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a3d8a32ae18130a3c84dd492d4215c3d913c3b07c6b63c2eb3eb7ff1101ab7bf" + +[[package]] +name = "enumflags2" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d232db7f5956f3f14313dc2f87985c58bd2c695ce124c8cdd984e08e15ac133d" +dependencies = [ + "enumflags2_derive", + "serde", +] + +[[package]] +name = "enumflags2_derive" +version = "0.7.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "de0d48a183585823424a4ce1aa132d174a6a81bd540895822eb4c8373a8e49e8" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.90", +] + [[package]] name = "equivalent" version = "1.0.1" @@ -851,6 +1087,16 @@ dependencies = [ "pin-project-lite", ] +[[package]] +name = "event-listener-strategy" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3c3e4e0dd3673c1139bf041f3008816d9cf2946bbfac2945c09e523b8d7b05b2" +dependencies = [ + "event-listener", + "pin-project-lite", +] + [[package]] name = "ezpplauncher" version = "0.1.0" @@ -859,7 +1105,10 @@ dependencies = [ "serde_json", "tauri", "tauri-build", + "tauri-plugin-dialog", + "tauri-plugin-fs", "tauri-plugin-shell", + "tauri-plugin-single-instance", "tauri-plugin-sql", ] @@ -1005,6 +1254,19 @@ version = "0.3.31" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9e5c1b78ca4aae1ac06c48a526a655760685149f0d465d21f37abfe57ce075c6" +[[package]] +name = "futures-lite" +version = "2.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cef40d21ae2c515b51041df9ed313ed21e572df340ea58a922a0aefe7e8891a1" +dependencies = [ + "fastrand", + "futures-core", + "futures-io", + "parking", + "pin-project-lite", +] + [[package]] name = "futures-macro" version = "0.3.31" @@ -1253,7 +1515,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0bb0228f477c0900c880fd78c8759b95c7636dbd7842707f49e132378aa2acdc" dependencies = [ "heck 0.4.1", - "proc-macro-crate 2.0.2", + "proc-macro-crate 2.0.0", "proc-macro-error", "proc-macro2", "quote", @@ -1382,6 +1644,12 @@ version = "0.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea" +[[package]] +name = "hermit-abi" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fbf6a919d6cf397374f7dfeeea91d974c7c0a7221d0d0f4f20d859d329e53fcc" + [[package]] name = "hex" version = "0.4.3" @@ -2116,6 +2384,31 @@ version = "1.0.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "650eef8c711430f1a879fdd01d4745a7deea475becfb90269c06775983bbf086" +[[package]] +name = "nix" +version = "0.27.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2eb04e9c688eff1c89d72b407f168cf79bb9e867a9d3323ed6c01519eb9cc053" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "libc", + "memoffset", +] + +[[package]] +name = "nix" +version = "0.29.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "71e2746dc3a24dd78b3cfcb7be93368c6de9963d30f43a6a73998a9cf4b17b46" +dependencies = [ + "bitflags 2.6.0", + "cfg-if", + "cfg_aliases", + "libc", + "memoffset", +] + [[package]] name = "nodrop" version = "0.1.14" @@ -2200,7 +2493,7 @@ version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ - "proc-macro-crate 2.0.2", + "proc-macro-crate 1.3.1", "proc-macro2", "quote", "syn 2.0.90", @@ -2324,6 +2617,7 @@ checksum = "0ee638a5da3799329310ad4cfa62fbf045d5f56e3ef5ba4149e7452dcf89d5a8" dependencies = [ "bitflags 2.6.0", "block2", + "dispatch", "libc", "objc2", ] @@ -2465,6 +2759,16 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "04744f49eae99ab78e0d5c0b603ab218f515ea8cfe5a456d7629ad883a3b6e7d" +[[package]] +name = "ordered-stream" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9aa2b01e1d916879f73a53d01d1d6cee68adbb31d6d9177a8cfce093cced1d50" +dependencies = [ + "futures-core", + "pin-project-lite", +] + [[package]] name = "os_pipe" version = "1.2.1" @@ -2702,6 +3006,17 @@ version = "0.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" +[[package]] +name = "piper" +version = "0.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "96c8c490f422ef9a4efd2cb5b42b76c8613d7e7dfc1caf667b8a3350a5acc066" +dependencies = [ + "atomic-waker", + "fastrand", + "futures-io", +] + [[package]] name = "pkcs1" version = "0.7.5" @@ -2737,7 +3052,7 @@ checksum = "42cf17e9a1800f5f396bc67d193dc9411b59012a5876445ef450d449881e1016" dependencies = [ "base64 0.22.1", "indexmap 2.7.0", - "quick-xml", + "quick-xml 0.32.0", "serde", "time", ] @@ -2755,6 +3070,21 @@ dependencies = [ "miniz_oxide", ] +[[package]] +name = "polling" +version = "3.7.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a604568c3202727d1507653cb121dbd627a58684eb09a820fd746bee38b4442f" +dependencies = [ + "cfg-if", + "concurrent-queue", + "hermit-abi", + "pin-project-lite", + "rustix", + "tracing", + "windows-sys 0.59.0", +] + [[package]] name = "powerfmt" version = "0.2.0" @@ -2788,14 +3118,22 @@ dependencies = [ [[package]] name = "proc-macro-crate" -version = "2.0.2" +version = "2.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b00f26d3400549137f92511a46ac1cd8ce37cb5598a96d382381458b992a5d24" +checksum = "7e8366a6159044a37876a2b9817124296703c586a5c92e2c53751fa06d8d43e8" dependencies = [ - "toml_datetime", "toml_edit 0.20.2", ] +[[package]] +name = "proc-macro-crate" +version = "3.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ecf48c7ca261d60b74ab1a7b20da18bede46776b2e55535cb958eb595c5fa7b" +dependencies = [ + "toml_edit 0.22.22", +] + [[package]] name = "proc-macro-error" version = "1.0.4" @@ -2844,6 +3182,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "quick-xml" +version = "0.36.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7649a7b4df05aed9ea7ec6f628c67c9953a43869b8bc50929569b2999d443fe" +dependencies = [ + "memchr", +] + [[package]] name = "quote" version = "1.0.37" @@ -3026,6 +3373,29 @@ dependencies = [ "windows-registry", ] +[[package]] +name = "rfd" +version = "0.15.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46f6f80a9b882647d9014673ca9925d30ffc9750f2eed2b4490e189eaebd01e8" +dependencies = [ + "ashpd", + "block2", + "glib-sys", + "gobject-sys", + "gtk-sys", + "js-sys", + "log", + "objc2", + "objc2-app-kit", + "objc2-foundation", + "raw-window-handle", + "wasm-bindgen", + "wasm-bindgen-futures", + "web-sys", + "windows-sys 0.48.0", +] + [[package]] name = "rsa" version = "0.9.7" @@ -3116,6 +3486,12 @@ dependencies = [ "syn 2.0.90", ] +[[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" @@ -3337,6 +3713,15 @@ version = "1.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64" +[[package]] +name = "signal-hook-registry" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1" +dependencies = [ + "libc", +] + [[package]] name = "signature" version = "2.2.0" @@ -3665,6 +4050,12 @@ 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 = "string_cache" version = "0.8.7" @@ -3966,6 +4357,47 @@ dependencies = [ "walkdir", ] +[[package]] +name = "tauri-plugin-dialog" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8b59fd750551b1066744ab956a1cd6b1ea3e1b3763b0b9153ac27a044d596426" +dependencies = [ + "log", + "raw-window-handle", + "rfd", + "serde", + "serde_json", + "tauri", + "tauri-plugin", + "tauri-plugin-fs", + "thiserror 2.0.6", + "url", +] + +[[package]] +name = "tauri-plugin-fs" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1a1edf18000f02903a7c2e5997fb89aca455ecbc0acc15c6535afbb883be223" +dependencies = [ + "anyhow", + "dunce", + "glob", + "percent-encoding", + "schemars", + "serde", + "serde_json", + "serde_repr", + "tauri", + "tauri-plugin", + "tauri-utils", + "thiserror 2.0.6", + "toml 0.8.2", + "url", + "uuid", +] + [[package]] name = "tauri-plugin-shell" version = "2.2.0" @@ -3987,6 +4419,21 @@ dependencies = [ "tokio", ] +[[package]] +name = "tauri-plugin-single-instance" +version = "2.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0f36019ee9832dc99e4450bb55a21cfad8633b19c2c18bd17c7741939b070ede" +dependencies = [ + "serde", + "serde_json", + "tauri", + "thiserror 2.0.6", + "tracing", + "windows-sys 0.59.0", + "zbus 4.0.1", +] + [[package]] name = "tauri-plugin-sql" version = "2.2.0" @@ -4235,7 +4682,9 @@ dependencies = [ "libc", "mio", "pin-project-lite", + "signal-hook-registry", "socket2", + "tracing", "windows-sys 0.52.0", ] @@ -4278,9 +4727,9 @@ dependencies = [ [[package]] name = "toml_datetime" -version = "0.6.3" +version = "0.6.8" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7cda73e2f1397b1262d6dfdcef8aafae14d1de7748d66822d3bfeeb6d03e5e4b" +checksum = "0dd7358ecb8fc2f8d014bf86f6f638ce72ba252a2c3a2572f2a795f1d23efb41" dependencies = [ "serde", ] @@ -4295,7 +4744,7 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.5.40", ] [[package]] @@ -4308,7 +4757,18 @@ dependencies = [ "serde", "serde_spanned", "toml_datetime", - "winnow", + "winnow 0.5.40", +] + +[[package]] +name = "toml_edit" +version = "0.22.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ae48d6208a266e853d946088ed816055e556cc6028c5e8e2b84d9fa5dd7c7f5" +dependencies = [ + "indexmap 2.7.0", + "toml_datetime", + "winnow 0.6.20", ] [[package]] @@ -4388,6 +4848,17 @@ version = "1.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "42ff0bf0c66b8238c6f3b578df37d0b7848e55df8577b3f74f92a69acceeb825" +[[package]] +name = "uds_windows" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89daebc3e6fd160ac4aa9fc8b3bf71e1f74fbf92367ae71fb83a037e8bf164b9" +dependencies = [ + "memoffset", + "tempfile", + "winapi", +] + [[package]] name = "unic-char-property" version = "0.9.0" @@ -4675,6 +5146,66 @@ dependencies = [ "web-sys", ] +[[package]] +name = "wayland-backend" +version = "0.3.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "056535ced7a150d45159d3a8dc30f91a2e2d588ca0b23f70e56033622b8016f6" +dependencies = [ + "cc", + "downcast-rs", + "rustix", + "scoped-tls", + "smallvec", + "wayland-sys", +] + +[[package]] +name = "wayland-client" +version = "0.31.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b66249d3fc69f76fd74c82cc319300faa554e9d865dab1f7cd66cc20db10b280" +dependencies = [ + "bitflags 2.6.0", + "rustix", + "wayland-backend", + "wayland-scanner", +] + +[[package]] +name = "wayland-protocols" +version = "0.32.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7cd0ade57c4e6e9a8952741325c30bf82f4246885dca8bf561898b86d0c1f58e" +dependencies = [ + "bitflags 2.6.0", + "wayland-backend", + "wayland-client", + "wayland-scanner", +] + +[[package]] +name = "wayland-scanner" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "597f2001b2e5fc1121e3d5b9791d3e78f05ba6bfa4641053846248e3a13661c3" +dependencies = [ + "proc-macro2", + "quick-xml 0.36.2", + "quote", +] + +[[package]] +name = "wayland-sys" +version = "0.31.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "efa8ac0d8e8ed3e3b5c9fc92c7881406a268e11555abe36493efabe649a29e09" +dependencies = [ + "dlib", + "log", + "pkg-config", +] + [[package]] name = "web-sys" version = "0.3.76" @@ -5136,6 +5667,15 @@ dependencies = [ "memchr", ] +[[package]] +name = "winnow" +version = "0.6.20" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "36c1fec1a2bb5866f07c25f68c26e565c4c200aebb96d7e55710c19d3e8ac49b" +dependencies = [ + "memchr", +] + [[package]] name = "winreg" version = "0.52.0" @@ -5222,6 +5762,16 @@ dependencies = [ "pkg-config", ] +[[package]] +name = "xdg-home" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ec1cdab258fb55c0da61328dc52c8764709b249011b2cad0454c72f0bf10a1f6" +dependencies = [ + "libc", + "windows-sys 0.59.0", +] + [[package]] name = "yoke" version = "0.7.5" @@ -5246,6 +5796,127 @@ dependencies = [ "synstructure", ] +[[package]] +name = "zbus" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b8e3d6ae3342792a6cc2340e4394334c7402f3d793b390d2c5494a4032b3030" +dependencies = [ + "async-broadcast", + "async-executor", + "async-fs", + "async-io", + "async-lock", + "async-process", + "async-recursion", + "async-task", + "async-trait", + "blocking", + "derivative", + "enumflags2", + "event-listener", + "futures-core", + "futures-sink", + "futures-util", + "hex", + "nix 0.27.1", + "ordered-stream", + "rand 0.8.5", + "serde", + "serde_repr", + "sha1", + "static_assertions", + "tracing", + "uds_windows", + "windows-sys 0.52.0", + "xdg-home", + "zbus_macros 4.0.1", + "zbus_names 3.0.0", + "zvariant 4.0.0", +] + +[[package]] +name = "zbus" +version = "5.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1162094dc63b1629fcc44150bcceeaa80798cd28bcbe7fa987b65a034c258608" +dependencies = [ + "async-broadcast", + "async-recursion", + "async-trait", + "enumflags2", + "event-listener", + "futures-core", + "futures-util", + "hex", + "nix 0.29.0", + "ordered-stream", + "serde", + "serde_repr", + "static_assertions", + "tokio", + "tracing", + "uds_windows", + "windows-sys 0.59.0", + "winnow 0.6.20", + "xdg-home", + "zbus_macros 5.1.1", + "zbus_names 4.1.0", + "zvariant 5.1.0", +] + +[[package]] +name = "zbus_macros" +version = "4.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7a3e850ff1e7217a3b7a07eba90d37fe9bb9e89a310f718afcde5885ca9b6d7" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "regex", + "syn 1.0.109", + "zvariant_utils 1.1.0", +] + +[[package]] +name = "zbus_macros" +version = "5.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2cd2dcdce3e2727f7d74b7e33b5a89539b3cc31049562137faf7ae4eb86cd16d" +dependencies = [ + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn 2.0.90", + "zbus_names 4.1.0", + "zvariant 5.1.0", + "zvariant_utils 3.0.2", +] + +[[package]] +name = "zbus_names" +version = "3.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4b9b1fef7d021261cc16cba64c351d291b715febe0fa10dc3a443ac5a5022e6c" +dependencies = [ + "serde", + "static_assertions", + "zvariant 4.0.0", +] + +[[package]] +name = "zbus_names" +version = "4.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "856b7a38811f71846fd47856ceee8bccaec8399ff53fb370247e66081ace647b" +dependencies = [ + "serde", + "static_assertions", + "winnow 0.6.20", + "zvariant 5.1.0", +] + [[package]] name = "zerocopy" version = "0.7.35" @@ -5315,3 +5986,83 @@ dependencies = [ "quote", "syn 2.0.90", ] + +[[package]] +name = "zvariant" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4e09e8be97d44eeab994d752f341e67b3b0d80512a8b315a0671d47232ef1b65" +dependencies = [ + "endi", + "enumflags2", + "serde", + "static_assertions", + "zvariant_derive 4.0.0", +] + +[[package]] +name = "zvariant" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1200ee6ac32f1e5a312e455a949a4794855515d34f9909f4a3e082d14e1a56f" +dependencies = [ + "endi", + "enumflags2", + "serde", + "static_assertions", + "url", + "winnow 0.6.20", + "zvariant_derive 5.1.0", + "zvariant_utils 3.0.2", +] + +[[package]] +name = "zvariant_derive" +version = "4.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "72a5857e2856435331636a9fbb415b09243df4521a267c5bedcd5289b4d5799e" +dependencies = [ + "proc-macro-crate 1.3.1", + "proc-macro2", + "quote", + "syn 1.0.109", + "zvariant_utils 1.1.0", +] + +[[package]] +name = "zvariant_derive" +version = "5.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "687e3b97fae6c9104fbbd36c73d27d149abf04fb874e2efbd84838763daa8916" +dependencies = [ + "proc-macro-crate 3.2.0", + "proc-macro2", + "quote", + "syn 2.0.90", + "zvariant_utils 3.0.2", +] + +[[package]] +name = "zvariant_utils" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "00bedb16a193cc12451873fee2a1bc6550225acece0e36f333e68326c73c8172" +dependencies = [ + "proc-macro2", + "quote", + "syn 1.0.109", +] + +[[package]] +name = "zvariant_utils" +version = "3.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "20d1d011a38f12360e5fcccceeff5e2c42a8eb7f27f0dcba97a0862ede05c9c6" +dependencies = [ + "proc-macro2", + "quote", + "serde", + "static_assertions", + "syn 2.0.90", + "winnow 0.6.20", +] diff --git a/src-tauri/Cargo.toml b/src-tauri/Cargo.toml index 445b8e5..7b16285 100644 --- a/src-tauri/Cargo.toml +++ b/src-tauri/Cargo.toml @@ -23,4 +23,9 @@ tauri-plugin-shell = "2" serde = { version = "1", features = ["derive"] } serde_json = "1" tauri-plugin-sql = "2.2.0" +tauri-plugin-dialog = "2" +tauri-plugin-fs = "2" + +[target.'cfg(not(any(target_os = "android", target_os = "ios")))'.dependencies] +tauri-plugin-single-instance = "2" diff --git a/src-tauri/capabilities/default.json b/src-tauri/capabilities/default.json index 3bb4cc4..a22b619 100644 --- a/src-tauri/capabilities/default.json +++ b/src-tauri/capabilities/default.json @@ -2,9 +2,17 @@ "$schema": "../gen/schemas/desktop-schema.json", "identifier": "default", "description": "Capability for the main window", - "windows": ["main"], + "windows": [ + "main" + ], "permissions": [ "core:default", - "shell:allow-open" + "shell:allow-open", + "shell:default", + "dialog:default", + "core:window:allow-start-dragging", + "core:window:allow-minimize", + "core:window:allow-close", + "fs:default" ] -} +} \ No newline at end of file diff --git a/src-tauri/src/actions.rs b/src-tauri/src/actions.rs deleted file mode 100644 index 760a92b..0000000 --- a/src-tauri/src/actions.rs +++ /dev/null @@ -1,9 +0,0 @@ -#[tauri::command] -pub fn wave(name: &str) -> String { - format!("Hello, {}! You've been waved from Rust, with a different file!", name) -} - -#[tauri::command] -pub fn greet(name: &str) -> String { - format!("Hello, {}! You've been greeted from Rust, with a different file!", name) -} \ No newline at end of file diff --git a/src-tauri/src/lib.rs b/src-tauri/src/lib.rs index e276ed4..8472259 100644 --- a/src-tauri/src/lib.rs +++ b/src-tauri/src/lib.rs @@ -1,12 +1,23 @@ // Learn more about Tauri commands at https://tauri.app/develop/calling-rust/ -mod actions; +use tauri::Manager; #[cfg_attr(mobile, tauri::mobile_entry_point)] pub fn run() { - tauri::Builder::default() + let mut builder = tauri::Builder::default().plugin(tauri_plugin_fs::init()); + #[cfg(desktop)] + { + builder = builder.plugin(tauri_plugin_single_instance::init(|app, _args, _cwd| { + let _ = app + .get_webview_window("main") + .expect("no main window") + .set_focus(); + })); + } + + builder + .plugin(tauri_plugin_dialog::init()) .plugin(tauri_plugin_shell::init()) .plugin(tauri_plugin_sql::Builder::default().build()) - .invoke_handler(tauri::generate_handler![actions::greet, actions::wave]) .run(tauri::generate_context!()) .expect("error while running tauri application"); } diff --git a/src-tauri/tauri.conf.json b/src-tauri/tauri.conf.json index e59ead7..af2a148 100644 --- a/src-tauri/tauri.conf.json +++ b/src-tauri/tauri.conf.json @@ -14,7 +14,8 @@ { "title": "ezpplauncher", "width": 800, - "height": 600 + "height": 600, + "decorations": false } ], "security": { @@ -32,4 +33,4 @@ "icons/icon.ico" ] } -} +} \ No newline at end of file diff --git a/src/app.css b/src/app.css new file mode 100644 index 0000000..f6371a4 --- /dev/null +++ b/src/app.css @@ -0,0 +1,75 @@ +@tailwind base; +@tailwind components; +@tailwind utilities; + +@layer base { + :root { + --background: 0 0% 100%; + --foreground: 224 71.4% 4.1%; + --muted: 220 14.3% 95.9%; + --muted-foreground: 220 8.9% 46.1%; + --popover: 0 0% 100%; + --popover-foreground: 224 71.4% 4.1%; + --card: 0 0% 100%; + --card-foreground: 224 71.4% 4.1%; + --border: 220 13% 91%; + --input: 220 13% 91%; + --primary: 220.9 39.3% 11%; + --primary-foreground: 210 20% 98%; + --secondary: 220 14.3% 95.9%; + --secondary-foreground: 220.9 39.3% 11%; + --accent: 220 14.3% 95.9%; + --accent-foreground: 220.9 39.3% 11%; + --destructive: 0 72.2% 50.6%; + --destructive-foreground: 210 20% 98%; + --ring: 224 71.4% 4.1%; + --radius: 0.5rem; + --sidebar-background: 0 0% 98%; + --sidebar-foreground: 240 5.3% 26.1%; + --sidebar-primary: 240 5.9% 10%; + --sidebar-primary-foreground: 0 0% 98%; + --sidebar-accent: 240 4.8% 95.9%; + --sidebar-accent-foreground: 240 5.9% 10%; + --sidebar-border: 220 13% 91%; + --sidebar-ring: 217.2 91.2% 59.8%; + } + + .dark { + --background: 224 71.4% 4.1%; + --foreground: 210 20% 98%; + --muted: 215 27.9% 16.9%; + --muted-foreground: 217.9 10.6% 64.9%; + --popover: 224 71.4% 4.1%; + --popover-foreground: 210 20% 98%; + --card: 224 71.4% 4.1%; + --card-foreground: 210 20% 98%; + --border: 215 27.9% 16.9%; + --input: 215 27.9% 16.9%; + --primary: 210 20% 98%; + --primary-foreground: 220.9 39.3% 11%; + --secondary: 215 27.9% 16.9%; + --secondary-foreground: 210 20% 98%; + --accent: 215 27.9% 16.9%; + --accent-foreground: 210 20% 98%; + --destructive: 0 62.8% 30.6%; + --destructive-foreground: 210 20% 98%; + --ring: 216 12.2% 83.9%; + --sidebar-background: 240 5.9% 10%; + --sidebar-foreground: 240 4.8% 95.9%; + --sidebar-primary: 224.3 76.3% 48%; + --sidebar-primary-foreground: 0 0% 100%; + --sidebar-accent: 240 3.7% 15.9%; + --sidebar-accent-foreground: 240 4.8% 95.9%; + --sidebar-border: 240 3.7% 15.9%; + --sidebar-ring: 217.2 91.2% 59.8%; + } +} + +@layer base { + * { + @apply border-border; + } + body { + @apply bg-background text-foreground; + } +} \ No newline at end of file diff --git a/src/app.html b/src/app.html index 92e7e33..dfd0454 100644 --- a/src/app.html +++ b/src/app.html @@ -1,13 +1,16 @@ - - - - - - Tauri + SvelteKit + Typescript App - %sveltekit.head% - - -
%sveltekit.body%
- - + + + + + + + Tauri + SvelteKit + Typescript App + %sveltekit.head% + + + +
%sveltekit.body%
+ + + \ No newline at end of file diff --git a/src/lib/components/ui/button/button.svelte b/src/lib/components/ui/button/button.svelte new file mode 100644 index 0000000..8f44d5c --- /dev/null +++ b/src/lib/components/ui/button/button.svelte @@ -0,0 +1,74 @@ + + + + +{#if href} + + {@render children?.()} + +{:else} + +{/if} diff --git a/src/lib/components/ui/button/index.ts b/src/lib/components/ui/button/index.ts new file mode 100644 index 0000000..fb585d7 --- /dev/null +++ b/src/lib/components/ui/button/index.ts @@ -0,0 +1,17 @@ +import Root, { + type ButtonProps, + type ButtonSize, + type ButtonVariant, + buttonVariants, +} from "./button.svelte"; + +export { + Root, + type ButtonProps as Props, + // + Root as Button, + buttonVariants, + type ButtonProps, + type ButtonSize, + type ButtonVariant, +}; diff --git a/src/lib/components/ui/input/index.ts b/src/lib/components/ui/input/index.ts new file mode 100644 index 0000000..f47b6d3 --- /dev/null +++ b/src/lib/components/ui/input/index.ts @@ -0,0 +1,7 @@ +import Root from "./input.svelte"; + +export { + Root, + // + Root as Input, +}; diff --git a/src/lib/components/ui/input/input.svelte b/src/lib/components/ui/input/input.svelte new file mode 100644 index 0000000..598829f --- /dev/null +++ b/src/lib/components/ui/input/input.svelte @@ -0,0 +1,22 @@ + + + diff --git a/src/lib/components/ui/titlebar/titlebar.svelte b/src/lib/components/ui/titlebar/titlebar.svelte new file mode 100644 index 0000000..c0744d7 --- /dev/null +++ b/src/lib/components/ui/titlebar/titlebar.svelte @@ -0,0 +1,57 @@ + + +
+
+ +
+
+ +
+
+ + diff --git a/src/lib/utils.ts b/src/lib/utils.ts new file mode 100644 index 0000000..ac680b3 --- /dev/null +++ b/src/lib/utils.ts @@ -0,0 +1,6 @@ +import { type ClassValue, clsx } from "clsx"; +import { twMerge } from "tailwind-merge"; + +export function cn(...inputs: ClassValue[]) { + return twMerge(clsx(inputs)); +} diff --git a/src/routes/+layout.svelte b/src/routes/+layout.svelte new file mode 100644 index 0000000..b72b069 --- /dev/null +++ b/src/routes/+layout.svelte @@ -0,0 +1,10 @@ + + + +
+ {@render children()} +
diff --git a/src/routes/+page.svelte b/src/routes/+page.svelte index 667f133..d74b4c4 100644 --- a/src/routes/+page.svelte +++ b/src/routes/+page.svelte @@ -1,167 +1,5 @@ -
-

Welcome to Tauri + Svelte

- - -

Click on the Tauri, Vite, and SvelteKit logos to learn more.

- -
- - -
- -
- - -
-

{greetMsg}

-
- - + diff --git a/svelte.config.js b/svelte.config.js index 2d45f91..1596388 100644 --- a/svelte.config.js +++ b/svelte.config.js @@ -9,6 +9,11 @@ const config = { preprocess: vitePreprocess(), kit: { adapter: adapter(), + alias: { + '@/*': "./src/lib/*", + "$lib": "./src/lib", + "$lib/*": "./src/lib/*" + } }, }; diff --git a/tailwind.config.ts b/tailwind.config.ts new file mode 100644 index 0000000..59a4897 --- /dev/null +++ b/tailwind.config.ts @@ -0,0 +1,96 @@ +import { fontFamily } from "tailwindcss/defaultTheme"; +import type { Config } from "tailwindcss"; +import tailwindcssAnimate from "tailwindcss-animate"; + +const config: Config = { + darkMode: "class", + content: ["./src/**/*.{html,js,svelte,ts}"], + safelist: ["dark"], + theme: { + container: { + center: true, + padding: "2rem", + screens: { + "2xl": "1400px" + } + }, + extend: { + colors: { + border: "hsl(var(--border) / )", + input: "hsl(var(--input) / )", + ring: "hsl(var(--ring) / )", + background: "hsl(var(--background) / )", + foreground: "hsl(var(--foreground) / )", + primary: { + DEFAULT: "hsl(var(--primary) / )", + foreground: "hsl(var(--primary-foreground) / )" + }, + secondary: { + DEFAULT: "hsl(var(--secondary) / )", + foreground: "hsl(var(--secondary-foreground) / )" + }, + destructive: { + DEFAULT: "hsl(var(--destructive) / )", + foreground: "hsl(var(--destructive-foreground) / )" + }, + muted: { + DEFAULT: "hsl(var(--muted) / )", + foreground: "hsl(var(--muted-foreground) / )" + }, + accent: { + DEFAULT: "hsl(var(--accent) / )", + foreground: "hsl(var(--accent-foreground) / )" + }, + popover: { + DEFAULT: "hsl(var(--popover) / )", + foreground: "hsl(var(--popover-foreground) / )" + }, + card: { + DEFAULT: "hsl(var(--card) / )", + foreground: "hsl(var(--card-foreground) / )" + }, + sidebar: { + DEFAULT: "hsl(var(--sidebar-background))", + foreground: "hsl(var(--sidebar-foreground))", + primary: "hsl(var(--sidebar-primary))", + "primary-foreground": "hsl(var(--sidebar-primary-foreground))", + accent: "hsl(var(--sidebar-accent))", + "accent-foreground": "hsl(var(--sidebar-accent-foreground))", + border: "hsl(var(--sidebar-border))", + ring: "hsl(var(--sidebar-ring))", + }, + }, + borderRadius: { + xl: "calc(var(--radius) + 4px)", + lg: "var(--radius)", + md: "calc(var(--radius) - 2px)", + sm: "calc(var(--radius) - 4px)" + }, + fontFamily: { + sans: [...fontFamily.sans] + }, + keyframes: { + "accordion-down": { + from: { height: "0" }, + to: { height: "var(--bits-accordion-content-height)" }, + }, + "accordion-up": { + from: { height: "var(--bits-accordion-content-height)" }, + to: { height: "0" }, + }, + "caret-blink": { + "0%,70%,100%": { opacity: "1" }, + "20%,50%": { opacity: "0" }, + }, + }, + animation: { + "accordion-down": "accordion-down 0.2s ease-out", + "accordion-up": "accordion-up 0.2s ease-out", + "caret-blink": "caret-blink 1.25s ease-out infinite", + }, + }, + }, + plugins: [tailwindcssAnimate], +}; + +export default config; diff --git a/tsconfig.json b/tsconfig.json index 593dc19..1bb642e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -9,7 +9,7 @@ "skipLibCheck": true, "sourceMap": true, "strict": true, - "moduleResolution": "bundler" + "moduleResolution": "bundler", } // Path aliases are handled by https://kit.svelte.dev/docs/configuration#alias // except $lib which is handled by https://kit.svelte.dev/docs/configuration#files