From 87202de6566349fc73040c502c406bdbbe9704c6 Mon Sep 17 00:00:00 2001 From: HorizonCode Date: Thu, 29 Oct 2026 10:53:12 +0100 Subject: [PATCH] chore(themes): add new themes api v2, add in-app theme editor/creator, macos compatibility, fix asset loading, rework settings and setup wizard --- README.md | 79 +- THEME_API_V2.md | 424 ++++ bun.lock | 69 +- components.json | 2 +- eslint.config.js | 4 + package.json | 13 +- src-tauri/Cargo.lock | 84 + src-tauri/Cargo.toml | 13 + src-tauri/capabilities/default.json | 5 +- src-tauri/icons/Square107x107Logo.png | Bin 13553 -> 0 bytes src-tauri/icons/Square142x142Logo.png | Bin 20069 -> 0 bytes src-tauri/icons/Square150x150Logo.png | Bin 21642 -> 0 bytes src-tauri/icons/Square284x284Logo.png | Bin 54162 -> 0 bytes src-tauri/icons/Square30x30Logo.png | Bin 2180 -> 0 bytes src-tauri/icons/Square310x310Logo.png | Bin 62084 -> 0 bytes src-tauri/icons/Square44x44Logo.png | Bin 3862 -> 0 bytes src-tauri/icons/Square71x71Logo.png | Bin 7930 -> 0 bytes src-tauri/icons/Square89x89Logo.png | Bin 10748 -> 0 bytes src-tauri/icons/StoreLogo.png | Bin 4665 -> 0 bytes .../android/mipmap-anydpi-v26/ic_launcher.xml | 5 - .../icons/android/mipmap-hdpi/ic_launcher.png | Bin 3853 -> 0 bytes .../mipmap-hdpi/ic_launcher_foreground.png | Bin 24132 -> 0 bytes .../android/mipmap-hdpi/ic_launcher_round.png | Bin 4352 -> 0 bytes .../icons/android/mipmap-mdpi/ic_launcher.png | Bin 3625 -> 0 bytes .../mipmap-mdpi/ic_launcher_foreground.png | Bin 13885 -> 0 bytes .../android/mipmap-mdpi/ic_launcher_round.png | Bin 4229 -> 0 bytes .../android/mipmap-xhdpi/ic_launcher.png | Bin 9771 -> 0 bytes .../mipmap-xhdpi/ic_launcher_foreground.png | Bin 36109 -> 0 bytes .../mipmap-xhdpi/ic_launcher_round.png | Bin 11297 -> 0 bytes .../android/mipmap-xxhdpi/ic_launcher.png | Bin 17109 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_foreground.png | Bin 66417 -> 0 bytes .../mipmap-xxhdpi/ic_launcher_round.png | Bin 19609 -> 0 bytes .../android/mipmap-xxxhdpi/ic_launcher.png | Bin 25608 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_foreground.png | Bin 102571 -> 0 bytes .../mipmap-xxxhdpi/ic_launcher_round.png | Bin 29280 -> 0 bytes .../android/values/ic_launcher_background.xml | 4 - src-tauri/icons/ios/AppIcon-20x20@1x.png | Bin 1124 -> 0 bytes src-tauri/icons/ios/AppIcon-20x20@2x-1.png | Bin 3259 -> 0 bytes src-tauri/icons/ios/AppIcon-20x20@2x.png | Bin 3259 -> 0 bytes src-tauri/icons/ios/AppIcon-20x20@3x.png | Bin 6091 -> 0 bytes src-tauri/icons/ios/AppIcon-29x29@1x.png | Bin 2013 -> 0 bytes src-tauri/icons/ios/AppIcon-29x29@2x-1.png | Bin 5740 -> 0 bytes src-tauri/icons/ios/AppIcon-29x29@2x.png | Bin 5740 -> 0 bytes src-tauri/icons/ios/AppIcon-29x29@3x.png | Bin 10260 -> 0 bytes src-tauri/icons/ios/AppIcon-40x40@1x.png | Bin 3259 -> 0 bytes src-tauri/icons/ios/AppIcon-40x40@2x-1.png | Bin 9178 -> 0 bytes src-tauri/icons/ios/AppIcon-40x40@2x.png | Bin 9178 -> 0 bytes src-tauri/icons/ios/AppIcon-40x40@3x.png | Bin 15975 -> 0 bytes src-tauri/icons/ios/AppIcon-512@2x.png | Bin 365159 -> 0 bytes src-tauri/icons/ios/AppIcon-60x60@2x.png | Bin 15975 -> 0 bytes src-tauri/icons/ios/AppIcon-60x60@3x.png | Bin 28009 -> 0 bytes src-tauri/icons/ios/AppIcon-76x76@1x.png | Bin 8494 -> 0 bytes src-tauri/icons/ios/AppIcon-76x76@2x.png | Bin 22106 -> 0 bytes src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png | Bin 25116 -> 0 bytes src-tauri/src/commands.rs | 1037 ++++++-- src-tauri/src/lib.rs | 77 +- src-tauri/src/logging.rs | 537 ++++ src-tauri/src/macos.rs | 801 ++++++ src-tauri/src/presence.rs | 39 +- src-tauri/src/state.rs | 2 + src-tauri/src/theme_server.rs | 436 ++++ src-tauri/src/utils.rs | 162 +- src-tauri/tauri.conf.json | 17 +- src-tauri/tauri.macos.conf.json | 9 + src/app.css | 4 + .../components/confetti/ConfettiCannon.svelte | 182 ++ src/lib/components/theme/FontPreview.svelte | 88 + .../components/theme/ThemeEditorWindow.svelte | 2233 +++++++++++++++++ .../theme/ThemeElementInspector.svelte | 392 +++ src/lib/components/theme/ThemeStage.svelte | 193 ++ .../components/theme/ThemeV2Background.svelte | 251 ++ .../components/theme/ThemeV2Elements.svelte | 244 ++ .../ui/background/background.svelte | 10 - src/lib/components/ui/button/button.svelte | 2 + src/lib/components/ui/effects/Hearts.svelte | 106 - src/lib/components/ui/slider/slider.svelte | 48 + src/lib/components/ui/sonner/index.ts | 1 - src/lib/components/ui/sonner/sonner.svelte | 21 - src/lib/components/ui/switch/index.ts | 7 - src/lib/components/ui/switch/switch.svelte | 27 - .../components/ui/textarea/textarea.svelte | 22 + .../components/ui/titlebar/titlebar.svelte | 9 +- src/lib/fontsource.ts | 154 ++ src/lib/logging.ts | 98 + src/lib/osuUtil.ts | 27 + src/lib/sort.ts | 24 - src/lib/themeFonts.ts | 18 + src/lib/themeMedia.ts | 208 ++ src/lib/themePreview.ts | 1139 +++++++++ src/lib/themeV2.ts | 567 +++++ src/lib/themes.ts | 463 ++-- src/lib/userSettings.ts | 1 + src/lib/utils.ts | 4 +- src/routes/+layout.svelte | 151 +- src/screens/Launch.svelte | 954 ++++--- src/screens/SetupWizard.svelte | 921 ++++--- tsconfig.json | 2 +- 97 files changed, 10968 insertions(+), 1422 deletions(-) create mode 100644 THEME_API_V2.md delete mode 100644 src-tauri/icons/Square107x107Logo.png delete mode 100644 src-tauri/icons/Square142x142Logo.png delete mode 100644 src-tauri/icons/Square150x150Logo.png delete mode 100644 src-tauri/icons/Square284x284Logo.png delete mode 100644 src-tauri/icons/Square30x30Logo.png delete mode 100644 src-tauri/icons/Square310x310Logo.png delete mode 100644 src-tauri/icons/Square44x44Logo.png delete mode 100644 src-tauri/icons/Square71x71Logo.png delete mode 100644 src-tauri/icons/Square89x89Logo.png delete mode 100644 src-tauri/icons/StoreLogo.png delete mode 100644 src-tauri/icons/android/mipmap-anydpi-v26/ic_launcher.xml delete mode 100644 src-tauri/icons/android/mipmap-hdpi/ic_launcher.png delete mode 100644 src-tauri/icons/android/mipmap-hdpi/ic_launcher_foreground.png delete mode 100644 src-tauri/icons/android/mipmap-hdpi/ic_launcher_round.png delete mode 100644 src-tauri/icons/android/mipmap-mdpi/ic_launcher.png delete mode 100644 src-tauri/icons/android/mipmap-mdpi/ic_launcher_foreground.png delete mode 100644 src-tauri/icons/android/mipmap-mdpi/ic_launcher_round.png delete mode 100644 src-tauri/icons/android/mipmap-xhdpi/ic_launcher.png delete mode 100644 src-tauri/icons/android/mipmap-xhdpi/ic_launcher_foreground.png delete mode 100644 src-tauri/icons/android/mipmap-xhdpi/ic_launcher_round.png delete mode 100644 src-tauri/icons/android/mipmap-xxhdpi/ic_launcher.png delete mode 100644 src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_foreground.png delete mode 100644 src-tauri/icons/android/mipmap-xxhdpi/ic_launcher_round.png delete mode 100644 src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher.png delete mode 100644 src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_foreground.png delete mode 100644 src-tauri/icons/android/mipmap-xxxhdpi/ic_launcher_round.png delete mode 100644 src-tauri/icons/android/values/ic_launcher_background.xml delete mode 100644 src-tauri/icons/ios/AppIcon-20x20@1x.png delete mode 100644 src-tauri/icons/ios/AppIcon-20x20@2x-1.png delete mode 100644 src-tauri/icons/ios/AppIcon-20x20@2x.png delete mode 100644 src-tauri/icons/ios/AppIcon-20x20@3x.png delete mode 100644 src-tauri/icons/ios/AppIcon-29x29@1x.png delete mode 100644 src-tauri/icons/ios/AppIcon-29x29@2x-1.png delete mode 100644 src-tauri/icons/ios/AppIcon-29x29@2x.png delete mode 100644 src-tauri/icons/ios/AppIcon-29x29@3x.png delete mode 100644 src-tauri/icons/ios/AppIcon-40x40@1x.png delete mode 100644 src-tauri/icons/ios/AppIcon-40x40@2x-1.png delete mode 100644 src-tauri/icons/ios/AppIcon-40x40@2x.png delete mode 100644 src-tauri/icons/ios/AppIcon-40x40@3x.png delete mode 100644 src-tauri/icons/ios/AppIcon-512@2x.png delete mode 100644 src-tauri/icons/ios/AppIcon-60x60@2x.png delete mode 100644 src-tauri/icons/ios/AppIcon-60x60@3x.png delete mode 100644 src-tauri/icons/ios/AppIcon-76x76@1x.png delete mode 100644 src-tauri/icons/ios/AppIcon-76x76@2x.png delete mode 100644 src-tauri/icons/ios/AppIcon-83.5x83.5@2x.png create mode 100644 src-tauri/src/logging.rs create mode 100644 src-tauri/src/macos.rs create mode 100644 src-tauri/src/theme_server.rs create mode 100644 src-tauri/tauri.macos.conf.json create mode 100644 src/lib/components/confetti/ConfettiCannon.svelte create mode 100644 src/lib/components/theme/FontPreview.svelte create mode 100644 src/lib/components/theme/ThemeEditorWindow.svelte create mode 100644 src/lib/components/theme/ThemeElementInspector.svelte create mode 100644 src/lib/components/theme/ThemeStage.svelte create mode 100644 src/lib/components/theme/ThemeV2Background.svelte create mode 100644 src/lib/components/theme/ThemeV2Elements.svelte delete mode 100644 src/lib/components/ui/background/background.svelte delete mode 100644 src/lib/components/ui/effects/Hearts.svelte create mode 100644 src/lib/components/ui/slider/slider.svelte delete mode 100644 src/lib/components/ui/sonner/index.ts delete mode 100644 src/lib/components/ui/sonner/sonner.svelte delete mode 100644 src/lib/components/ui/switch/index.ts delete mode 100644 src/lib/components/ui/switch/switch.svelte create mode 100644 src/lib/components/ui/textarea/textarea.svelte create mode 100644 src/lib/fontsource.ts create mode 100644 src/lib/logging.ts delete mode 100644 src/lib/sort.ts create mode 100644 src/lib/themeFonts.ts create mode 100644 src/lib/themeMedia.ts create mode 100644 src/lib/themePreview.ts create mode 100644 src/lib/themeV2.ts diff --git a/README.md b/README.md index d78b543..4327a60 100644 --- a/README.md +++ b/README.md @@ -14,28 +14,60 @@ It enhances the osu! experience with quality-of-life features and integration sp ## πŸš€ Features - [x] Automatically updates osu! before launching -- [x] Automatically start/stop the OpenTabletDriver Daemon +- [x] Automatically start/stop the OpenTabletDriver Daemon (Windows) - [x] Automatic ingame login -- [x] Patches the osu! client to show misses in Relax and Autopilot +- [x] Patches the osu! client to show misses in Relax and Autopilot (Windows, Linux and macOS via Wine) - [x] Displays your EZPPFarm stats in the launcher - [x] Shows the number of imported beatmapsets - [x] Shows the number of imported skins - [x] Displays ping to the EZPPFarm server - [x] Discord Rich Presence - [x] Performance Display Overlay (currently in experimental patcher release stream) -- [x] Launcher Theming +- [x] Launcher Theming (API 1.0 bundles and API 2.0 declarative themes) +- [x] Advanced theme editor in its own window with freeform text/image/video/shape layers, fonts, live launcher preview and export --- ## πŸ’» Supported Platforms -| Platform | Status | -| -------- | ---------------------------------------- | -| Windows | βœ… Supported | -| macOS | ❌ Not supported | -| Linux | πŸ•§ Partially supported (via osu-winello) | +| Platform | Status | +| -------- | ------------------------------------------------------ | +| Windows | βœ… Supported | +| macOS | πŸ•§ Partially supported (via Wineskin/Whisky/CrossOver) | +| Linux | πŸ•§ Partially supported (via osu-winello) | -> Currently, only **Windows** is fully supported. Support for other platforms may be considered in the future. +> **Windows** remains the fully supported platform. OpenTabletDriver is Windows-only. On macOS, +> in-game patching runs the Windows patcher through the same Wine prefix as osu!, so that prefix +> needs a .NET runtime installed. + +### macOS + +osu! stable is a Windows build, so on macOS it runs inside a Wine wrapper. EZPPLauncher +supports Wineskin wrappers (the usual `osu!.app` wine skin), Whisky bottles and CrossOver +bottles. + +The setup wizard automatically looks for Wineskins in `/Applications` and `~/Applications`. +If detection fails, choose **Browse** and pick the `osu!.app` wrapper itself (or a Wine prefix +folder); the launcher resolves the osu! installation inside it, so there is no need to open the +bundle's package contents. + +--- + +## πŸͺ΅ Logs + +Launcher, osu! and patcher output is written to `.ezpplauncher/logs` in your home folder: + +| File | Contents | +| -------------- | -------------------------------------------------------------- | +| `launcher.log` | Launcher lifecycle, webview console output and uncaught errors | +| `osu.log` | osu! and osu! updater output, including stdout/stderr | +| `patcher.log` | Patcher output, including stdout/stderr | + +A file is only created when that stream actually writes a line. On each new session, or when +any file reaches 5 MiB, all three active files are bundled into a single +`logs__