From 2b191443520d3e11923bd6621b99d6a1dc2a9529 Mon Sep 17 00:00:00 2001 From: dream_pep Date: Sat, 11 Jul 2026 23:33:44 +0800 Subject: [PATCH] =?UTF-8?q?20260711=E5=AD=98=E6=A1=A301?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .env.beta | 2 +- .gitignore | 3 + AGENTS.md | 37 +- CRASH_MONITOR_PLAN.md | 144 +++++ DEV.md | 528 +++++++++--------- LICENSE | 47 ++ README.md | 48 +- electron-builder.yml | 13 +- electron/core/instance.js | 281 ++++++++-- electron/core/instance.ts | 418 +++++++++++--- electron/handlers/background.js | 27 + electron/handlers/background.ts | 26 + electron/handlers/instance.js | 130 ++++- electron/handlers/instance.ts | 175 +++++- electron/handlers/window.js | 21 +- electron/handlers/window.ts | 23 +- electron/main.ts | 14 +- electron/preload.ts | 45 ++ package.json | 22 +- plans/tauri-to-electron.md | 68 +-- pnpm-lock.yaml | 196 ++++++- public/background-2.jpeg | Bin 0 -> 3031473 bytes public/background.png | Bin 221537 -> 173573 bytes public/beta.ico | Bin 209796 -> 0 bytes public/beta.png | Bin 425915 -> 0 bytes public/{ => icons/beta}/icon.ico | Bin public/{ => icons/beta}/icon.png | Bin public/{dev.ico => icons/dev/icon.ico} | Bin public/{dev.png => icons/dev/icon.png} | Bin public/{run.ico => icons/run/icon.ico} | Bin public/{run.png => icons/run/icon.png} | Bin scripts/switch-icon.js | 17 +- scripts/version.js | 53 ++ src/App.tsx | 2 + src/api/instance.ts | 163 +++++- src/components/BetaWarning.tsx | 17 + src/components/VersionCard.tsx | 7 +- src/components/background/BackgroundLayer.tsx | 15 +- src/components/silk/Silk.tsx | 12 +- src/components/system/TitleBar.tsx | 4 +- src/components/ui/sonner.tsx | 47 ++ src/index.css | 5 + src/layouts/RootLayout.tsx | 13 + src/lib/version.ts | 3 + src/pages/gallery/index.tsx | 8 + src/pages/home/InstanceTitle.tsx | 23 + src/pages/home/StartCard.tsx | 1 + src/pages/home/index.tsx | 4 +- src/pages/setting/general/about.tsx | 2 +- src/pages/setting/general/copyright.tsx | 6 +- .../setting/personalization/theme-bg.tsx | 11 +- src/stores/authStore.ts | 2 +- src/stores/instanceStore.ts | 92 +-- src/stores/routeStore.ts | 2 + src/types/electron.d.ts | 2 + vite.config.ts | 4 + 56 files changed, 2156 insertions(+), 627 deletions(-) create mode 100644 CRASH_MONITOR_PLAN.md create mode 100644 LICENSE create mode 100644 public/background-2.jpeg delete mode 100644 public/beta.ico delete mode 100644 public/beta.png rename public/{ => icons/beta}/icon.ico (100%) rename public/{ => icons/beta}/icon.png (100%) rename public/{dev.ico => icons/dev/icon.ico} (100%) rename public/{dev.png => icons/dev/icon.png} (100%) rename public/{run.ico => icons/run/icon.ico} (100%) rename public/{run.png => icons/run/icon.png} (100%) create mode 100644 scripts/version.js create mode 100644 src/components/BetaWarning.tsx create mode 100644 src/components/ui/sonner.tsx create mode 100644 src/lib/version.ts create mode 100644 src/pages/gallery/index.tsx create mode 100644 src/pages/home/InstanceTitle.tsx diff --git a/.env.beta b/.env.beta index 79d1153..8ec26a1 100644 --- a/.env.beta +++ b/.env.beta @@ -3,5 +3,5 @@ VITE_APP_ICON=/beta.png VITE_START_POP=true VITE_START_POP_TITLE="你正在使用 UI 预览版本" -VITE_START_POP_INFO="此版本是专门用于进行检测是否有UI问题的版本,因此功能将会缺失" +VITE_START_POP_INFO="此版本是专门用于进行检测是否有 UI 问题的版本,因此功能将会缺失" VITE_START_POP_BOUTTON="我已了解" \ No newline at end of file diff --git a/.gitignore b/.gitignore index 46fa6ef..3c29258 100644 --- a/.gitignore +++ b/.gitignore @@ -27,3 +27,6 @@ dist-electron # Electron electron/*.js electron/*.d.ts + +# Build resources (generated by switch-icon.js) +build/ diff --git a/AGENTS.md b/AGENTS.md index 6d7318a..31ff137 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -9,13 +9,16 @@ pnpm dev # full app dev (renderer + main process) pnpm dev:renderer # frontend only (vite, port 1420) pnpm dev:main # electron main process only pnpm build # production build (vite + tsc) -pnpm dist:win # build Windows installer +pnpm dist:dev # dev icon + Windows installer +pnpm dist:beta # beta icon + Windows installer +pnpm dist:run # production icon + Windows installer ``` ## Architecture - **Frontend** (`src/`): React 19 + Vite 7 + Tailwind v4 + shadcn/ui + Zustand stores - **Main Process** (`electron/`): Node.js/TypeScript, manages windows, IPC handlers, @xmcl/* packages +- **Icon System** (`public/icons/{dev,beta,run}/`): Mode-specific icons, copied to `build/` at build time - IPC: Frontend → `ipcRenderer.invoke()` → `ipcMain.handle()` → main process → `webContents.send()` → Frontend ## Key gotchas @@ -23,23 +26,42 @@ pnpm dist:win # build Windows installer - **Electron main process**: `electron/main.ts` is the entry point. All @xmcl/* packages run here. - **Preload script**: `electron/preload.ts` exposes `window.electronAPI` via context bridge. - **IPC handlers**: All handlers are in `electron/handlers/` directory. +- **Mutable win ref**: `electron/main.ts` uses a mutable `win` object — handlers read `win.mainWindow` at runtime, not at registration time. - **Config**: YAML format (`Koring.yml`) stored next to executable. Sparse save (only non-default values). - **Auth**: JSON file (`koring-auth.json`) stored next to executable. - **Path alias**: `@/` maps to `src/` (configured in `vite.config.ts` and `tsconfig.json`). - **Dev mode**: Vite runs on port 1420, Electron loads from localhost. +- **Asset paths**: Use `import.meta.env.BASE_URL` prefix for public assets. Absolute paths break in packaged app. ## Build & bundle ```bash pnpm build # Vite build + TypeScript compile -pnpm dist:win # electron-builder Windows installer -pnpm dist:mac # electron-builder macOS DMG -pnpm dist:linux # electron-builder Linux AppImage +pnpm dist:dev # switch-icon dev + electron-builder Windows installer +pnpm dist:beta # switch-icon beta + electron-builder Windows installer +pnpm dist:run # switch-icon run + electron-builder Windows installer ``` +Each `dist:*` command runs: `pnpm build` → `pnpm icon:{mode}` → `electron-builder --win` + +## Icon switching + +``` +public/icons/ + dev/icon.ico, icon.png + beta/icon.ico, icon.png + run/icon.ico, icon.png + +build/ ← generated by switch-icon.js (gitignored) + icon.ico + icon.png +``` + +`electron-builder.yml` uses `buildResources: build` to read icons from `build/`. + ## Electron notes -- `electron/main.ts`: App entry, window management, IPC handler registration +- `electron/main.ts`: App entry, window management, splash→main transition (ready-to-show + 1.5s min) - `electron/preload.ts`: Context bridge for secure IPC - `electron/config.ts`: YAML config management (sparse save) - `electron/auth.ts`: Auth data persistence (JSON file) @@ -52,5 +74,6 @@ pnpm dist:linux # electron-builder Linux AppImage - `src/api/*.ts`: API modules wrapping IPC calls - `src/stores/`: Zustand state management - `src/hooks/useTheme.ts`: Dark mode sync with Electron theme -- `src/components/system/WindowControls.tsx`: Custom window controls (min/max/close) -- `src/components/system/TitleBar.tsx`: Custom title bar with navigation +- `src/components/system/WindowControls.tsx`: Custom window controls (min/max/close), uses `