/** Per-knob performance settings, shown under `?pi=1`. Stored in this browser's * localStorage (see lib/perfSettings.ts) and applied by a reload, because the knobs are * read once at module load. Nothing changes until "Speichern". */ import { useState } from "react"; import { FULL, PERF, PI, resetPerfSettings, savePerfSettings, type PerfSettings, } from "../lib/perfSettings"; type BoolKey = { [K in keyof PerfSettings]: PerfSettings[K] extends boolean ? K : never }[keyof PerfSettings]; type NumKey = { [K in keyof PerfSettings]: PerfSettings[K] extends number ? K : never }[keyof PerfSettings]; const TOGGLES: [BoolKey, string, string][] = [ ["ambience", "Animierter Hintergrund", "Canvas im Abspielbildschirm (größter CPU-Verbraucher)"], ["cardBlur", "Weichzeichner auf Karten", "Backdrop-Blur je Album-Karte und Titelzeile"], ["viewTransitions", "Übergänge", "Ein-/Ausblenden beim Öffnen von Gruppen und Alben"], ["decorativeAnimations", "Deko-Animationen", "Blasen im Zimmer, schwimmender Delfin"], ["cardShadows", "Schatten auf Karten", "Schlagschatten unter den Album-Karten"], ["tileShadows", "Schatten auf Kacheln", "Schlagschatten unter den Kacheln im Raster"], ["petAnimations", "Tippen: Tiere bewegen sich", "Aus: Tiere stehen still"], ["tippenBubbles", "Tippen: Blasen", "Aufsteigende Blasen im Hintergrund"], ["tippenViewTransitions", "Tippen: Übergänge", "Ein-/Ausblenden der Bildschirme"], ["serviceWorker", "Service Worker", "Aus: vorhandener Worker wird entfernt"], ["coverWarmup", "Cover vorladen", "Cover im Hintergrund dekodieren"], ]; const NUMBERS: [NumKey, string, string, number, number, number][] = [ ["playbackClockFps", "Fortschrittsbalken: Updates/s", "0 = jeder Frame", 0, 60, 1], ["ambienceScale", "Hintergrund: Auflösung", "Faktor der Canvas-Größe", 0.1, 1, 0.05], ["ambienceMaxPx", "Hintergrund: max. Pixel", "Obergrenze je Achse", 256, 4096, 64], ["ambienceMaxFps", "Hintergrund: max. FPS", "0 = unbegrenzt", 0, 60, 1], ["ambienceMaxBubbles", "Hintergrund: max. Blasen", "0 = unbegrenzt", 0, 500, 5], ]; const pill = (background: string, color: string) => ({ border: "none", cursor: "pointer", background, color, fontSize: 15, fontWeight: 800, padding: "11px 20px", borderRadius: 999, }) as const; export function PerfPanel({ onClose }: { onClose: () => void }) { const [draft, setDraft] = useState({ ...PERF }); const save = () => { savePerfSettings(draft); location.reload(); }; const reset = () => { resetPerfSettings(); location.reload(); }; return (
⚡ Leistung
{TOGGLES.map(([key, label, hint]) => ( ))} {NUMBERS.map(([key, label, hint, min, max, step]) => ( ))}
Wird nur in diesem Browser gespeichert und gilt nur mit ?pi=1.
); }