diff --git a/frontend/src/components/rd-slider.tsx b/frontend/src/components/rd-slider.tsx
new file mode 100644
index 0000000..e2f732e
--- /dev/null
+++ b/frontend/src/components/rd-slider.tsx
@@ -0,0 +1,37 @@
+/** 阅读器主题内的滑条配置项:说明 + 整数档位滑条 + 锚点刻度. */
+export function RdSlider({
+ label,
+ ariaLabel,
+ min,
+ max,
+ value,
+ onChange,
+}: {
+ label: string;
+ ariaLabel: string;
+ min: number;
+ max: number;
+ value: number;
+ onChange: (v: number) => void;
+}) {
+ return (
+
+
{label}
+
onChange(Number(e.target.value))}
+ />
+
+ {Array.from({ length: max - min + 1 }, (_, i) => (
+ {min + i}
+ ))}
+
+
+ );
+}
diff --git a/frontend/src/readers/CbzReader.tsx b/frontend/src/readers/CbzReader.tsx
index af69618..2d531f6 100644
--- a/frontend/src/readers/CbzReader.tsx
+++ b/frontend/src/readers/CbzReader.tsx
@@ -5,6 +5,7 @@ import { useEffect, useMemo, useRef, useState, type MouseEvent } from "react";
import { api, formatPageUrl } from "../api/client";
import { btn } from "../components/ui";
import { BookmarksTab } from "../components/Bookmarks";
+import { RdSlider } from "../components/rd-slider";
import { ReaderNav, type NavTab } from "../components/reader-nav";
import { fetchObjectUrl } from "../lib/authImage";
import { useProgressSaver, type ReaderProps } from "../lib/useProgress";
@@ -395,25 +396,14 @@ export default function CbzReader({ book, initialLocator, initialPercent, chrome
{locked && (
-
-
预读:锁章末尾时提前挂载其后 N 章
-
setPrefetch(Number(e.target.value))}
- />
-
- 0
- 1
- 2
- 3
-
-
+
)}