Commit Graph
182 Commits
Author SHA1 Message Date
hectorqin 1f534ee4c3 feat(shell): one page column for the four tabs, 我的 as the settings hub
- 首页/书架/影音/我的 share --page-measure and --page-gutter, so content edges stay put across tabs at every width; 我的 lays its groups two per row on wide screens.
- 我的 gathers every setting (偏好 / 管理 / 账号); its panels live at /me/:panel and return to 我的.
- 影音设置 keeps only media settings and links to 我的; 来源与刮削 is now reachable.
- 系统设置 moves from the shelf header to 我的 → 管理.
2026-10-20 14:58:00 +08:00
Kiro Agent f15365d03c feat(shelf): 在读 / 想读 / 已读 and 分组 (prototypes 2 and 19)
Server: user_books gains reading_status. The shelf list computes each
book's readingState — an explicit 在读/已读 mark wins, otherwise progress
decides (>=99% 已读, started 在读), and 想读 gives way once reading starts —
filters by ?status=, and PUT /api/v1/books/:id/reading-status sets or
clears the mark.

Client: chips 全部/在读/想读/已读 and 分组 (a series or a tag from the
shelf's facets) above the toolbar, all kept in the URL; a state label on
each cover; the ⋯ menu marks 想读/在读/已读, clears the mark, or takes the
book off the shelf.

Docs: API, UI and media user guide for this and the other V3.1 gaps.
2026-10-20 04:47:06 +00:00
Kiro Agent 68e085482c feat(media): library management states and 扫描与元数据 (prototype 20)
Server:
- Scan jobs record the number of files listed (total), so a running scan
  can report a real percentage.
- New 扫描设置 business settings, shown as the page's 扫描与元数据 card:
  自动扫描新文件 (hourly rescan of every library, default on),
  刮削封面与简介 (after a completed scan, scrape items that have no online
  metadata and were never attempted, with the first configured provider;
  default off), 读取内嵌字幕与歌词 (default on; off hides embedded subtitle
  streams and lyrics tags), 扫描隐藏文件夹 (default off: names starting
  with '.' are skipped, e.g. ._film.mp4 resource forks).
- MediaAutomation runs the scheduled scans and post-scan scraping as the
  first active administrator; MediaScanner gains onFinished/isScanning.

Client:
- Each library card shows its latest scan: 上次扫描 今天 09:12 beside
  重新扫描; 正在扫描 · 已处理 62% with a progress bar and 取消; or the
  failure (路径不可访问…) with 重试 and 查看详情 (the tasks page).
  Starting or cancelling a scan now stays on the page; scan-jobs is polled.
- 扫描与元数据 card beside the list saves each switch with the settings
  revision, and hides itself on servers without these settings.
2026-10-20 04:41:03 +00:00
Kiro Agent b71a2ddd4e feat(media): 字幕与音轨 sheet and landscape full screen
Prototype 12: 字幕, 音轨 and 版本 are tabs of one sheet. The subtitle tab
lists 关闭, sidecars (外挂 · srt), extracted and browser-embedded streams
(内嵌); 添加外挂字幕 converts an SRT/VTT/ASS file from the device to WebVTT
in the browser (UTF-8, UTF-16 or GB18030) and selects it for the session;
字幕延迟 shifts sidecar cues in 0.5 s steps from their original timing; 字号
(小/标准/大) is saved per device and drives ::cue.

Prototype 13: a 全屏 button enters full screen on the player, locks the
phone to landscape where allowed, and floats 选集, 倍速, 适应屏幕 (cover),
字幕 and 锁定 over the picture; they fade with DPlayer's controller. 锁定
stops taps from reaching the player until unlocked. Speed presets are also
in the 更多 sheet. All of this is web-only; the Android player keeps its
own menus.
2026-10-20 04:33:53 +00:00
Kiro Agent 807f69b129 feat(shell): desktop search across books and media, and connection status
The desktop sidebar gets the prototype's search box (搜索书名、片名、歌曲、有声书),
opening a new /search page that shows the first books (library index) and
media results with links to each full search. The account block shows the
sync engine's view of the server: 已连接, 正在同步, 离线 or 同步出错.
2026-10-20 04:28:32 +00:00
Kiro Agent c30e07c270 feat(reader): reading papers as a reader setting
白纸 / 暖黄 / 浅绿 / 灰调 / 夜间 (prototypes 4 and 23) tint only the reading
page — paper, ink, readouts — while the chrome keeps the reading theme.
Stored per device in AppSettings (paper, paperFollowsDark), set from the
reader's 外观 sheet or 外观与主题. 夜间 makes the reader dark; a light paper
gives way to the theme's dark values while the app is dark unless
跟随系统深色模式 is off. Old sepia/green/dark page themes migrate to the
matching paper. Tokens are mirrored in TS and CSS and held to contrast by
theme-tokens.test.ts.
2026-10-20 04:26:51 +00:00
Kiro Agent 858a7479bf feat(theme): V3.1 semantic tokens, four themes and a reading theme
Implements docs/prototypes/Reader V3 主题语义令牌.md (v3.1):

- 暖陶 (default), 雾蓝, 青绿 app themes plus the reading-only 黑白灰, each
  light and dark. Components read --color-* tokens from
  styles/theme-tokens.css, selected by data-theme + data-mode; the
  TypeScript mirror lives in shared/theme/theme.ts.
- Brand is split per the spec: brand/ch-* only fill (with on-brand/on-ch on
  top), brand-text/ch-*-text for text. --reader-accent/--media-accent are now
  brand text; --reader-fill/--media-fill are brand fills. Selected segmented
  controls use brand-soft + brand-text.
- One preference per server+account (reader.theme.v2): app theme, mode
  (system/light/dark), the follow-system light/dark pair, and the reading
  theme. V3 choices migrate per spec §8 (rose falls back to 暖陶 light).
- 外观与主题 rebuilt from prototype 23: follow-system switch with the
  light/dark pair, app-theme cards with light/dark previews, and the
  reading theme (跟随应用 / 黑白灰).
- Reader: 黑白灰 is set on the reader container only; the appearance panel
  offers 跟随应用/黑白灰 and 明暗; day/night sets the mode; the e-ink preset
  uses 黑白灰 light.
- Video and music players wear the current theme's dark values (§4.7).
- Removed the legacy light/sepia/green/dark palettes and the
  <html data-theme> writes from reader settings, which would now collide
  with data-theme="green".
- Tests: theme-tokens.test.ts keeps CSS and TS values identical and checks
  the §5 contrast pairs for all 8 palettes; theme.test.tsx covers migration,
  resolution, the controller and the settings page.
2026-10-20 04:05:35 +00:00
hectorqin 5ffee3db51 feat(media): add play modes and customizable system themes 2026-10-20 10:17:18 +08:00
Claude 16da95b243 feat(media): phone channel switch as segments; remove the old channel rail
The three media channels are a segmented control in the page header on phones
(the sidebar lists them from 701px up), and every channel page now has its
one h1. ChannelSwitcher, MediaChannelEntry, renderChannelLinks and the
legacy showChannelEntry are removed. Shell breakpoints move to 700/701px.

Review script react-app.mjs follows the new DOM (app-nav selectors, summary
and option roles for the favourites filter).
2026-10-19 22:33:28 +08:00
Claude 6625e24ebf feat(ui): bring every remaining page onto the V3 theme
Mantine follows the app theme (colour scheme and primary/blue variables), so
the source editor, plugin page and dialogs stop being default blue.
Desktop video player puts the episode rail beside the picture and aligns the
tool row with it. 我的 and 首页 are top-level pages and lose the back arrow;
the theme page no longer says it only applies to media.
2026-10-19 22:33:28 +08:00
Claude c0dc54efab feat(reader): one theme for reading and media, V3 reader chrome
The book now wears the same six app themes as every other page (plus
follow-system); the separate white/sepia/green/dark reading themes are gone.
The 外观 sheet's swatches are the app themes drawn in their own colours and
the day/night rail button switches between 暖纸 and 深夜. The bottom bar
becomes a rounded sheet. 界面 is renamed 外观 in the bar, panel, review
scripts and spec.

Shelf title is 书架 in the serif face and loses the now-redundant headphones
link. docs/ui.md gains the V3 shell section.
2026-10-19 22:33:27 +08:00
Claude cecbef148c feat(shell): V3 navigation, 首页, and one theme for reading and media
One navigation replaces the media channel rail: a four-tab bar on phones
(首页 / 书架 / 影音 / 我的) and a sidebar from 900px up, with the three media
channels under 影音. The bar shows on top-level pages, gives way to each
page's own back arrow on pushed pages, and is absent for the book and the
player.

AuthenticatedShell now applies the chosen theme to every page except the
book, so shelf, library and sources wear the same palette as media. Channel
colours become theme tokens (--media-theme-ch-*) held to AA by test.

首页 shows where you left off: the book (continueReading), unfinished video
and audiobook (history), and the shelf. It replaces the redirect to
/media/video.

Fixed headers and the search/more actions, which were positioned against the
old rail, now clear the sidebar.
2026-10-19 22:33:27 +08:00
Claude f232787213 feat(account): 我的 page at /me
Account card (name, server, role), links to the pages that own library,
sources, media libraries, theme, playback and account settings, and sign out.
Reached from the channel navigation and the shelf header. Follows the media
theme tokens. Fixes the channel-current check so /media/* is not mistaken for /me.
2026-10-19 22:33:26 +08:00
Claude fdd3a70401 feat(media): one more-options entry, distinct lyrics and episode icons
The now-playing title row carried an ellipsis that opened the same sheet as
the header (or options-row) ellipsis. Drop it; the header one stays.

Lyrics no longer reuse the book icon that means chapters; episodes no longer
share the layers icon with versions. The v2 review script measures the
remaining more-options button.
2026-10-19 22:33:26 +08:00
Claude bf325ec072 feat(reader): reorder appearance and read-aloud sheets by use
Appearance: font size, line height, theme (drawn as swatches in each theme's
own paper and ink) and brightness now fill the first screen. Margins,
alignment, font, TXT rows and the four readouts move into closed <details>.

Read aloud: the start button is first and primary; rate gains preset steps;
pitch and volume are folded under 更多. Capability hiding is unchanged.

Spec updated in docs/ui.md; chrome tests cover order, folds and swatches.
2026-10-19 22:33:17 +08:00
Claude d4eb2e7a34 feat(media): V3 theme palettes with contrast guard
Retune the six media themes to the V3 semantic palette. Theme ids are
unchanged so saved choices keep working; only names change (暖砂 -> 暖纸,
深海 -> 深夜). System appearance now resolves to 暖纸 / 深夜.

Add a vitest guard that checks WCAG AA text pairs for every theme.
2026-10-19 22:33:17 +08:00
Claude faf0ffd17a fix(ui-review): use reply in reading-overrides fixture route
The reading-overrides fixture handler referenced an undefined res, so
npm run ui:review:reader crashed on startup.
2026-10-19 22:33:16 +08:00
hectorqin 875fec84dd fix(media): sync prototype routes and review tooling 2026-10-08 09:51:42 +08:00
hectorqin 075a49f361 fix(web): preserve media task return route 2026-10-05 17:09:38 +08:00
hectorqin 8584d7b4e3 fix(web): align React UI with legacy reader UX
Unify media secondary page chrome, loading states, playback controls, favorites filtering, and source/library screens with the legacy reader experience.
2026-10-05 13:23:27 +08:00
hectorqin 81836d6e79 fix(web): tighten mobile media spacing 2026-10-04 11:59:45 +08:00
hectorqin 6b0dbede17 fix(web): match media browse order 2026-10-04 11:46:39 +08:00
hectorqin cd003020f3 fix(web): align media continuation states 2026-10-04 11:40:26 +08:00
hectorqin 8bce0d91aa fix(web): guard empty media resources 2026-10-04 11:08:31 +08:00
hectorqin 007cc3c754 fix(web): finish media UX alignment
Align the React media detail, player, history, queue, shelf, and resource flows with the legacy UX. Refresh the migration validation record and add focused route, resource, and shelf parity coverage.
2026-10-04 11:02:23 +08:00
hectorqin c0af84a00f test(web): verify React media flows against legacy UX 2026-10-03 20:19:52 +08:00
hectorqin 4f001ac2d4 fix(web): align React media screens with legacy UX 2026-10-03 18:24:12 +08:00
hectorqin fdba9a4c5d test(web): add React UI review harness 2026-10-03 15:42:56 +08:00
hectorqin 050b8e89db refactor(web): finish media feature migration 2026-10-03 15:04:34 +08:00
hectorqin 2aaa4280c7 refactor(web): migrate client to React architecture 2026-10-03 12:12:30 +08:00
hectorqin 3e18738568 fix(media): move folder actions into heading 2026-10-02 23:59:30 +08:00
hectorqin a4586faadd feat(extensions): support file and batch actions 2026-10-02 23:30:08 +08:00
hectorqin 053a7e61f1 fix(media): align detail loading header 2026-10-02 23:03:29 +08:00
hectorqin 54add280c8 fix(ui): refine media menus and source search 2026-10-02 22:51:55 +08:00
hectorqin ca840c80f5 fix(media): align detail loading header 2026-10-02 22:06:33 +08:00
hectorqin 276160c07a fix(media): type detail loading skeleton 2026-10-02 16:10:00 +08:00
hectorqin 77659e5272 fix(media): match detail loading skeleton to page layout 2026-10-02 16:08:04 +08:00
hectorqin 5c59cae0b0 fix(ui): align metadata search and folder menus 2026-10-02 14:25:30 +08:00
hectorqin 3cf1834c6d fix(media): improve video playback details and resume card 2026-10-02 11:43:21 +08:00
hectorqin 80124d8c4e chore: commit current workspace changes 2026-10-02 11:24:25 +08:00
hectorqin c9f72f2879 fix(media): clear stale playback errors and refine detail hero 2026-10-02 11:07:06 +08:00
hectorqin 092485ef51 fix(media): refine library management cards 2026-10-02 11:01:56 +08:00
hectorqin 59e499d5db fix(media): simplify library and detail actions 2026-10-02 10:29:41 +08:00
hectorqin 8c3acbad7a fix(media): refine task tabs and detail menus 2026-10-02 10:14:19 +08:00
hectorqin 6ccc615db8 fix(media): move resource and folder actions into menus 2026-10-02 09:48:16 +08:00
hectorqin ef8c133f0a fix(media): hide resource action for artists 2026-10-01 17:06:03 +08:00
hectorqin dbf4b59d75 feat(media): streamline resource and task management 2026-10-01 16:58:49 +08:00
hectorqin 19bec1ba62 fix(media): refine scan task tabs 2026-10-01 16:33:18 +08:00
hectorqin f42a87856d fix(media): improve metadata matching layout 2026-10-01 15:52:34 +08:00
hectorqin 2ebe99944b fix(android): keep library upload picker clickable 2026-10-01 14:48:57 +08:00