overhaul settings: split into routed sub-tabs, add server logs, changelog, reusable setting components

- Rename Server tab to Settings with horizontal sub-tab navigation (General, Generation, GPU, Logs, Changelog)
- All sub-tabs are proper routes under /settings/* with /server redirect for backwards compat
- General: connection settings, link cards (docs + discord), API reference card, app updates
- Generation: auto-chunking, crossfade, normalize, autoplay as SettingRow components
- GPU: info card with platform-aware icons (Apple logo for MPS), CUDA management, explainer text
- Logs: real-time server log viewer piped from Tauri sidecar via event system (Tauri-only)
- Changelog: parsed from CHANGELOG.md at build time via Vite virtual module plugin
- New reusable SettingRow/SettingSection components for consistent settings layout
- New Toggle (switch) UI component replacing checkboxes in settings
- Toast viewport now offsets when audio player is open
- Sidebar stays active on settings sub-routes (fuzzy matching)
This commit is contained in:
James Pine
2026-03-16 09:31:14 -07:00
parent e0a798dc0d
commit 2c63dfff25
30 changed files with 1879 additions and 60 deletions
+6 -1
View File
@@ -1,4 +1,4 @@
import type { PlatformLifecycle } from '@/platform/types';
import type { PlatformLifecycle, ServerLogEntry } from '@/platform/types';
class WebLifecycle implements PlatformLifecycle {
onServerReady?: () => void;
@@ -27,6 +27,11 @@ class WebLifecycle implements PlatformLifecycle {
async setupWindowCloseHandler(): Promise<void> {
// No-op for web - no window close handling needed
}
subscribeToServerLogs(_callback: (_entry: ServerLogEntry) => void): () => void {
// No-op for web - server logs are not available
return () => {};
}
}
export const webLifecycle = new WebLifecycle();
+3 -2
View File
@@ -1,10 +1,11 @@
import path from 'node:path';
import react from '@vitejs/plugin-react';
import tailwindcss from '@tailwindcss/vite';
import react from '@vitejs/plugin-react';
import { defineConfig } from 'vite';
import { changelogPlugin } from '../app/plugins/changelog';
export default defineConfig({
plugins: [react(), tailwindcss()],
plugins: [react(), tailwindcss(), changelogPlugin(path.resolve(__dirname, '..'))],
resolve: {
alias: {
'@': path.resolve(__dirname, '../app/src'),