import { ChevronDown, ChevronUp } from "lucide-react"; import { useState, type ReactNode } from "react"; import { Button } from "@/components/ui/button"; import { Slider } from "@/components/ui/slider"; import { useGlobalDark } from "@/components/theme"; import { RD_THEMES, RD_THEME_LABEL, FONT_SIZES, resolveRdTheme, useReaderPrefs, type RdTheme } from "@/lib/readerPrefs"; export interface ReaderSettingsProps { /** 进度滑条:value/max 页或千分比由调用方定,onChange 收整数 */ slider: { value: number; max: number; onChange: (v: number) => void; ariaLabel: string }; /** 位置文本,如 "3/12 · 25%" */ position?: string; /** 左半区按钮(导航/上一章/下一章等),调用方给 */ left?: ReactNode; /** 是否显示 A−/A+ 与字号(text/epub true;cbz/pdf false) */ showFont?: boolean; /** 「更多设置」展开区内容(按格式给:CBZ 翻页/RTL/连读/预读;Text 行距/边距;EPUB 字号/行距/边距) */ extra?: ReactNode; } /** 主题色卡样式(纸 #faf8f4 / 米 #f0e6d2 / 夜 #171512,与 --rd-bg 三值一致) */ const SWATCH: Record = { paper: "#faf8f4", sepia: "#f0e6d2", night: "#171512" }; /** 统一阅读设置栏:常驻行 = 进度滑条 + 位置 + 左区 + 主题卡(含跟随全局)+ A−/A+;「更多设置」展开区按格式给。 */ export function ReaderSettings({ slider, position, left, showFont = false, extra }: ReaderSettingsProps) { const pr = useReaderPrefs(); const globalDark = useGlobalDark(); const rd = resolveRdTheme(pr.prefs.themeMode, globalDark); const [open, setOpen] = useState(false); return (
{left &&
{left}
} {position && ( {position} )}
{RD_THEMES.map((t) => (
{showFont && ( <> )} {extra && ( )}
slider.onChange(v)} aria-label={slider.ariaLabel} /> {extra && open &&
{extra}
}
); }