"use client"; import { ReaderSettings, TTSSettings } from "@/lib/types"; import { X, Sun, Moon, BookOpen } from "lucide-react"; interface SettingsPanelProps { isOpen: boolean; onClose: () => void; readerSettings: ReaderSettings; onReaderSettingsChange: (settings: ReaderSettings) => void; ttsSettings: TTSSettings; onTTSSettingsChange: (settings: TTSSettings) => void; availableVoices: SpeechSynthesisVoice[]; } export function SettingsPanel({ isOpen, onClose, readerSettings, onReaderSettingsChange, ttsSettings, onTTSSettingsChange, availableVoices, }: SettingsPanelProps) { if (!isOpen) return null; return ( <> {/* Backdrop */}
{/* Panel */}

Settings

{/* Theme */}

Theme

{[ { value: "dark", icon: Moon, label: "Dark" }, { value: "light", icon: Sun, label: "Light" }, { value: "sepia", icon: BookOpen, label: "Sepia" }, ].map(({ value, icon: Icon, label }) => ( ))}
{/* Font Size */}

Font Size: {readerSettings.fontSize}px

onReaderSettingsChange({ ...readerSettings, fontSize: parseInt(e.target.value), }) } className="w-full accent-[var(--accent)]" />
14px 32px
{/* Font Family */}

Font

{[ { value: "serif", label: "Serif", sample: "Georgia" }, { value: "sans", label: "Sans", sample: "Helvetica" }, { value: "mono", label: "Mono", sample: "Monaco" }, { value: "system", label: "System", sample: "Default" }, ].map(({ value, label, sample }) => ( ))}
{/* Line Height */}

Line Height: {readerSettings.lineHeight}

onReaderSettingsChange({ ...readerSettings, lineHeight: parseFloat(e.target.value), }) } className="w-full accent-[var(--accent)]" />
Tight Loose
{/* Content Width */}

Content Width: {readerSettings.maxWidth}px

onReaderSettingsChange({ ...readerSettings, maxWidth: parseInt(e.target.value), }) } className="w-full accent-[var(--accent)]" />
Narrow Wide

{/* TTS Settings */}

Text-to-Speech Engine

{[ { value: "edge", label: "Edge", desc: "Fast, natural" }, { value: "kokoro", label: "Kokoro", desc: "High quality" }, { value: "browser", label: "Browser", desc: "Built-in" }, ].map(({ value, label, desc }) => ( ))}
{/* TTS Speed */}

TTS Speed: {ttsSettings.speed}x

onTTSSettingsChange({ ...ttsSettings, speed: parseFloat(e.target.value), }) } className="w-full accent-[var(--accent)]" />
0.5x 3x
{/* Browser Voice Selection */} {ttsSettings.engine === "browser" && availableVoices.length > 0 && (

Voice

)} {/* Edge TTS info */} {ttsSettings.engine === "edge" && (

Uses Microsoft neural voices via Edge TTS. Fast and natural sounding. Requires the edge-tts Docker container running on the server.

)} {/* Kokoro info */} {ttsSettings.engine === "kokoro" && (

High quality local TTS. Slower as it generates full audio before playing. Requires the kokoro Docker container running on the server.

)}
); }