feat(frontend): readerPrefs v2 unified structure (TDD)
This commit is contained in:
@@ -8,7 +8,14 @@ import { ReaderNav, type NavTab } from "../components/reader-nav";
|
||||
import { btn } from "../components/ui";
|
||||
import { chapterText, seekChapter, splitChapters } from "../lib/chapters";
|
||||
import { decodeText } from "../lib/encoding";
|
||||
import { FONT_SIZES, RD_THEMES, RD_THEME_LABEL, useReaderPrefs, type RdTheme } from "../lib/readerPrefs";
|
||||
import {
|
||||
FONT_SIZES,
|
||||
RD_THEMES,
|
||||
RD_THEME_LABEL,
|
||||
resolveRdTheme,
|
||||
useReaderPrefs,
|
||||
type RdTheme,
|
||||
} from "../lib/readerPrefs";
|
||||
import { useProgressSaver, type ReaderProps } from "../lib/useProgress";
|
||||
|
||||
type Prefs = ReturnType<typeof useReaderPrefs>;
|
||||
@@ -91,13 +98,13 @@ function ReaderSheet({
|
||||
<button
|
||||
key={t}
|
||||
aria-label={`${RD_THEME_LABEL[t]}色主题`}
|
||||
aria-pressed={pr.prefs.theme === t}
|
||||
onClick={() => pr.setTheme(t)}
|
||||
aria-pressed={resolveRdTheme(pr.prefs.themeMode, false) === t}
|
||||
onClick={() => pr.setThemeMode(t)}
|
||||
className="h-5 w-5 rounded-full transition-transform hover:scale-110"
|
||||
style={{
|
||||
background: SWATCH[t],
|
||||
boxShadow:
|
||||
pr.prefs.theme === t
|
||||
resolveRdTheme(pr.prefs.themeMode, false) === t
|
||||
? "0 0 0 2px var(--rd-link)"
|
||||
: "inset 0 0 0 1px color-mix(in oklab, currentColor 35%, transparent)",
|
||||
}}
|
||||
@@ -106,16 +113,16 @@ function ReaderSheet({
|
||||
</div>
|
||||
<button
|
||||
className="rd-btn"
|
||||
onClick={() => pr.bump(-1)}
|
||||
disabled={pr.prefs.sizeIdx === 0}
|
||||
onClick={() => pr.bumpText(-1)}
|
||||
disabled={pr.prefs.text.sizeIdx === 0}
|
||||
aria-label="减小字号"
|
||||
>
|
||||
A−
|
||||
</button>
|
||||
<button
|
||||
className="rd-btn"
|
||||
onClick={() => pr.bump(1)}
|
||||
disabled={pr.prefs.sizeIdx === FONT_SIZES.length - 1}
|
||||
onClick={() => pr.bumpText(1)}
|
||||
disabled={pr.prefs.text.sizeIdx === FONT_SIZES.length - 1}
|
||||
aria-label="加大字号"
|
||||
>
|
||||
A+
|
||||
@@ -176,7 +183,7 @@ function MdView({ book, initialLocator, initialPercent, chrome }: ReaderProps) {
|
||||
if (err) return <LoadState text={err} onRetry={retry} />;
|
||||
if (text == null) return <LoadState text="正文加载中…" />;
|
||||
return (
|
||||
<div className="rd-surface relative flex h-full flex-col" data-rd={pr.prefs.theme}>
|
||||
<div className="rd-surface relative flex h-full flex-col" data-rd={resolveRdTheme(pr.prefs.themeMode, false)}>
|
||||
<div
|
||||
ref={boxRef}
|
||||
onScroll={onScroll}
|
||||
@@ -299,7 +306,7 @@ function TxtView({ book, initialLocator, initialPercent, chrome }: ReaderProps)
|
||||
const total = chapters.length > 1 ? Math.min(1, (ci + frac) / chapters.length) : frac;
|
||||
|
||||
return (
|
||||
<div className="rd-surface relative flex h-full flex-col" data-rd={pr.prefs.theme}>
|
||||
<div className="rd-surface relative flex h-full flex-col" data-rd={resolveRdTheme(pr.prefs.themeMode, false)}>
|
||||
<div
|
||||
ref={boxRef}
|
||||
onScroll={onScroll}
|
||||
|
||||
Reference in New Issue
Block a user