Commit Graph
98 Commits
Author SHA1 Message Date
XingfenD 03bc537308 feat(ui): semantic light/dark tokens, ThemeProvider with FOUC guard, token-restyle Toaster/Cover 2026-09-08 17:17:44 +08:00
XingfenD 87b7545a94 feat(ui): shadcn/radix toolchain — deps, @ alias, cn, generated primitives 2026-09-08 17:07:28 +08:00
XingfenD ee676c2d2e docs(plan): modern redesign phase-1 implementation plan — 8 tasks from toolchain to acceptance walkthrough 2026-09-08 17:02:02 +08:00
XingfenD b8a5b3deb6 docs(design): phase-1 modern redesign spec — shadcn/radix foundation, dual theme, app shell, shelf/admin rebuild; readers deferred to phase 2 2026-09-08 16:49:46 +08:00
XingfenD 2721df8ea9 fix(web): upload toast always showed 0 files (live FileList read after input reset); snapshot before upload 2026-09-08 16:22:12 +08:00
XingfenD e5dacc0a77 fix(cbz): clamp locked cur at chapter end, hide 连读 on flat packs, silent restore, tighten prefetch storage 2026-09-08 15:28:27 +08:00
XingfenD 60c4ccf26f fix(cbz): window-relative scroll geometry locks head boundary; default prefetch 2 when key absent 2026-09-08 15:15:42 +08:00
XingfenD f63b639f64 feat(cbz): chapter-scoped continuous reading — lock scroll at chapter end, screen paging, prefetch next N chapters; drop 连读/整页/适高 modes 2026-09-08 15:01:28 +08:00
XingfenD cd251b940c feat(cbz): pure chapter-window helpers (chapterIndexAt/chapterWin) with table tests 2026-09-08 14:56:46 +08:00
XingfenD bba82e5529 docs(plan): correct container names to podman compose underscores 2026-09-08 14:54:34 +08:00
XingfenD 497dc16604 fix(deploy): COPY paths in web Dockerfiles still referenced old web/ dir after web->frontend rename — dev image build failed 2026-09-08 14:53:29 +08:00
XingfenD 37ddff89a5 docs(cbz): chapter-scoped reading implementation plan — 3 tasks, virt helpers TDD first 2026-09-08 14:51:03 +08:00
XingfenD a39ddf7b57 docs: add cbz chapter-scoped reading design spec 2026-09-08 14:45:15 +08:00
XingfenD ec3f2c587e feat(reader): remove admin delete button from reader header; shelf card hover remains the only delete entry 2026-09-08 13:08:46 +08:00
XingfenD a43b73dcef fix(cbz): attach resize observer via callback ref + drop vh from scroll-mode geometry deps — fixes constant per-page gaps and refetch storm on mobile 2026-09-08 13:05:58 +08:00
XingfenD 32b9d3a136 feat(ui): content-first shelf redesign — responsive cover grid, hover overlays, format badges, skeletons, sticky blurred top bar, brand login, SVG icon set, animated toasts 2026-09-08 13:05:40 +08:00
XingfenD 02ac3e5f7f Merge branch 'feat/bookmarks' 2026-09-08 12:33:32 +08:00
XingfenD 40e9999e6a chore(bookmarks): changelog + e2e verification (create/jump/patch/delete against live api, seek page serves real jpeg) 2026-09-08 12:32:36 +08:00
XingfenD d989668650 feat(bookmarks): shared useBookmarks panel + wired into all four readers 2026-09-08 01:06:39 +08:00
XingfenD b2c5c4a445 feat(bookmarks): client plumbing — saver capture + bookmark api 2026-09-08 01:04:44 +08:00
XingfenD 0fe3bc3057 feat(bookmarks): api+store — per-user CRUD, owner-scoped 404, percent-ordered list 2026-09-08 01:03:44 +08:00
XingfenD e117ad52d3 docs(bookmarks): implementation plan — 4 tasks, backend vertical slice first, shared useBookmarks panel wired into all readers 2026-09-08 00:59:46 +08:00
XingfenD 928e52c604 docs(bookmarks): design spec — per-user bookmarks table, REST CRUD with owner-scoped 404s, capture/seek reuse of progress locators, shared sidebar component 2026-09-08 00:40:00 +08:00
XingfenD aa18eb66eb Merge branch 'feat/cbz-chapters' 2026-09-08 00:24:40 +08:00
XingfenD 66466ec8d1 Merge branch 'feat/chunked-upload' 2026-09-08 00:24:40 +08:00
XingfenD b8da9fd92e feat(cbz): adapt reader to real archive structure — PageIndex skips macOS junk (__MACOSX/ and ._ AppleDouble were polluting pages with 163-byte blacks), pages endpoint derives chapters[{title,start}] from folder layout, imageless zip now lands state=error instead of an empty reader, CbzReader gains 目录 sidebar + prev/next chapter (TextReader pattern, rd-* classes); pagesidx cache key bumped for one-time invalidation; e2e on 311MB 調教開關:第二季.zip: 15048→7524 real pages, 52 chapters, all JPEGs 2026-09-08 00:22:13 +08:00
XingfenD 7d650107d2 feat(upload): resumable chunked upload protocol for large files — init(parts≤32MB)/status/complete endpoints with fingerprint-derived deterministic uploadId (same file resumes, no restart), sessions in BOOKS_DIR/.uploads with 24h sweep, frontend uploadBook auto-switches >16MB to 8MB parts (retry x3 in place, skip received); oversize single POST now reports honest 413 too_large instead of "multipart field 'file' required" (was MaxBytesReader abort mislabeled); UPLOAD_MAX_MB wired into both compose stacks (cap total, .env.example 2048), nginx body limit drops to 32m; testCfg limit 1MB, CJK/fullwidth-colon filename proven unaffected; e2e verified with 311MB real file (39 parts, sha1 match) 2026-09-07 23:56:40 +08:00
XingfenD aba1e58fa6 Merge branch 'feat/reader-warm-theme' 2026-09-07 23:18:14 +08:00
XingfenD c6dfb92c76 fix(cbz): smooth scrollbar/slider dragging — rAF-coalesce scroll handler, idle-debounced prefetch, frame-batched height corrections, PageHeights.setEst converges unseen pages to the first measured page size, page slider seeks instantly while scrubbing (no per-notch smooth-animation restart); restore lost ### Fixed header in changelog 2026-09-07 23:13:04 +08:00
XingfenD 065fde5b56 feat(reader): immersive chrome + WeChat-Read/Mihon-style bottom sheets — tap-center toggles header/toolbar, progress & page sliders seek anywhere, WYSIWYG theme swatches, A± font size; CBZ gains 连读/整页/适高 modes, edge-tap & arrow-key paging, persisted mode (seekChapter helper + test) 2026-09-07 23:03:26 +08:00
XingfenD 7e63c21902 feat(reader): stop detecting 卷 in txt splitting (volume lines stay body text, volume-only books fall back to pseudo-sections); replace chapter dropdown with a 目录 sidebar overlay (active row highlighted + centered, click-away/pick to close) 2026-09-07 22:42:10 +08:00
XingfenD 7fb01ce335 feat(ui): warm library palette (zinc+emerald -> stone+amber) with hover/focus feedback; text reader gains paper/sepia/night themes + persisted font-size (lib/readerPrefs.ts), serif justified measure; PDF drops emoji icons for 首页/末页, CBZ pill page counter, EPUB centered spread, blur reader header with format badge, aria labels on login/search/chapter select 2026-09-07 22:37:47 +08:00
XingfenD 2478da059b Merge branch 'fix/txt-chapters-render' 2026-09-07 22:23:32 +08:00
XingfenD f47f2a6199 fix(reader): split large txt into chapters (章 as boundaries, 卷 as optgroup labels, pseudo-sections when unmarked) rendered one at a time so the browser stops freezing; decode via strict-UTF-8-then-GB18030 with UTF-16 BOM sniffing to kill mojibake; progress locator {ch,scrollFraction} with old global-fraction fallback 2026-09-07 22:21:29 +08:00
XingfenD 991de0ef26 Merge branch 'feat/server-generated-library-root' 2026-09-07 21:59:48 +08:00
XingfenD 45eefd6741 feat(libs): create library by name only; root_path derived server-side as BOOKS_DIR/SafeName(name), validated at creation; drop root_path input from admin UI; align changelogs to bilingual template; trim AGENTS.md to rules not derivable from repo layout 2026-09-07 21:56:59 +08:00
XingfenD ca64bc0d73 refactor(repo): conform structure to AGENTS.md (web->frontend, internal/api->cmd/webui/{api,handlers}, docs/README+CHANGELOGs, module .gitignores, drop stray library/ and committed debug bins) 2026-09-07 21:37:30 +08:00
XingfenD 961de429f9 fix(deploy): pin distinct image tags per compose (booklib/{api,web}:{dev,prod}); same project name shared default tags so dev up without --build ran the prod image 2026-09-07 21:24:33 +08:00
XingfenD 95317a0108 docs(readme): rewrite run/dev/migrate instructions for dev/release deploy spec
- scripts/smoke.sh: idempotent re-run (reuse existing member/library on 409)
- web client.ts: probe localStorage methods, not typeof (node 22+ stub regression)
2026-09-07 21:09:11 +08:00
XingfenD 0de824cc6a feat(deploy): dev compose runs full stack with source mounts, delve, shared volumes; vite proxy target via env (dlv --accept-multiclient, GOPROXY=goproxy.cn in dev image) 2026-09-07 21:04:40 +08:00
XingfenD 0ea918fae6 feat(deploy): release compose under deploy/ with shared named volumes and rendered config mounts; drop root compose 2026-09-07 20:55:57 +08:00
XingfenD 67dc4bc2bf feat(deploy): dev/prod Dockerfiles in service dirs (backend/,web/), templates live beside rendered outputs, entrypoint copies /etc/booklib conf before resolver injection 2026-09-07 20:53:41 +08:00
XingfenD a78442da54 feat(deploy): prepare.sh + config templates, migrate env to deploy/, gitignore rendered outputs 2026-09-07 20:18:12 +08:00
XingfenD 505f660dbd fix: self-heal missing library root on access; accept .zip in admin upload picker 2026-09-07 20:16:26 +08:00
XingfenD 6b3a4e5240 docs(plan): docker deploy conformance implementation plan (5 tasks); spec: smoke storage path item 2026-09-07 19:42:39 +08:00
XingfenD e563c88913 docs(spec): docker deployment conformance redesign (dev/release compose, prepare.sh, shared volumes, storage path) 2026-09-07 19:36:34 +08:00
XingfenD 22ae1717f4 docs: tick completed plan checkboxes, mark spec as implemented 2026-09-07 17:27:24 +08:00
XingfenD 73af5c1d78 merge: booklib frontend Plan 2 (shelf, four readers, admin, PWA, dockerized SPA, web smoke green) 2026-09-07 17:24:16 +08:00
XingfenD 1adb596981 docs(plan): execution-time amendments log for plan2-frontend 2026-09-07 17:22:04 +08:00
XingfenD cc66a648b0 fix(web): logout-path parity, CSP header, epub display fallback + small review nits 2026-09-07 17:17:33 +08:00
XingfenD 67c95e7bdc fix(deploy): runtime DNS re-resolution via resolv.conf-injected resolver, both runtimes 2026-09-07 16:48:58 +08:00
XingfenD 96e96fec51 feat(web): pwa offline caching, dockerized SPA, full-stack nginx smoke 2026-09-07 16:33:50 +08:00
XingfenD 1bd7688ee6 feat(web): admin users CRUD + libraries create/scan/upload 2026-09-07 16:18:58 +08:00
XingfenD 4f4eff871c feat(web): epub reader via epubjs arraybuffer bootstrap with cfi progress 2026-09-07 16:15:10 +08:00
XingfenD de3015e537 feat(web): pdf reader with dpr-aware canvas rendering and keyboard paging 2026-09-07 16:08:49 +08:00
XingfenD b2e40a5049 feat(web): txt/md reader with dompurified markdown and scroll-fraction progress 2026-09-07 16:04:37 +08:00
XingfenD e08f1dd5b9 docs(plan): PageHeights.range end-exclusive matches its tests 2026-09-07 16:02:53 +08:00
XingfenD 654e4febf1 feat(web): cbz reader — virtual scroll with height correction, prefetch, progress restore 2026-09-07 15:58:01 +08:00
XingfenD 052b94bb6a docs(plan): lazy import lands with first reader wiring (noUnusedLocals) 2026-09-07 15:49:44 +08:00
XingfenD 97f6d2d3b6 feat(web): throttled progress saver with keepalive flush, reader dispatch shell 2026-09-07 15:47:11 +08:00
XingfenD 36a2014a8b docs(plan): shelf scan button carries isAdmin guard (constraint governs) 2026-09-07 15:44:25 +08:00
XingfenD bc81b03d6a fix(web): hide scan trigger from members per admin-only write rule 2026-09-07 15:44:08 +08:00
XingfenD cf512b7d5a feat(web): shelf with library tabs, search, dir groups, covers, continue-reading, admin delete/scan 2026-09-07 15:40:03 +08:00
XingfenD 63b41f333e feat(web): authed blob image pipeline with LRU, cover card, dir grouping 2026-09-07 15:36:19 +08:00
XingfenD b231b62720 fix(web): login honors from-path redirect; me-error clears stored token 2026-09-07 15:32:13 +08:00
XingfenD c34289ebbe feat(web): auth context, login page, route guards, toast/error shell 2026-09-07 15:27:11 +08:00
XingfenD 2f0fc25c7c feat(web): typed api client with bearer token, 401 logout, binary channels 2026-09-07 15:23:18 +08:00
XingfenD 0cc040d750 feat(web): vite+react+ts+tailwind4 scaffold, vitest, /api dev proxy 2026-09-07 15:19:02 +08:00
XingfenD b730b7acb4 docs(plan): frontend Plan 2 — shelf, four readers, admin, PWA, dockerized SPA 2026-09-07 15:14:58 +08:00
XingfenD b09bcf5772 merge: booklib backend Plan 1 (scaffold→scanner→API→deploy, e2e smoke green) 2026-09-07 13:05:52 +08:00
XingfenD e0783e5e6a chore: smoke tmpdir hygiene, seed pw floor, README 2026-09-07 12:44:47 +08:00
XingfenD 93638ed647 fix(api): classify DB errors in library paths 2026-09-07 12:44:47 +08:00
XingfenD 12f6e82308 fix(api): lazy cover self-heal + tmp-file skip 2026-09-07 12:44:47 +08:00
XingfenD 4b40dd669b fix(redis): lock acquisition fails open per spec §9 2026-09-07 12:44:47 +08:00
XingfenD 6adbab44c3 fix(security): trusted-proxy-scoped login rate limit 2026-09-07 12:44:47 +08:00
XingfenD f7c27272ba fix(deploy): app-owned cache/books dirs in image + .dockerignore 2026-09-07 12:18:49 +08:00
XingfenD 94b215c2b3 feat(deploy): compose w/ nginx api-prefix ingress, scaled stateless api, e2e smoke 2026-09-06 19:59:27 +08:00
XingfenD a11bf28155 fix(backend): dbErr 503 degradation for connection-class DB errors 2026-09-06 19:53:19 +08:00
XingfenD 04095b5438 feat(backend): main wiring, graceful shutdown, local smoke green 2026-09-06 19:52:42 +08:00
XingfenD 8f18072843 feat(backend): reading progress upsert + listing, path-keyed survival 2026-09-05 20:59:11 +08:00
XingfenD 8206c7a4ed fix(backend): single error body on pages paths, reject newline entry names, empty-index cache skip 2026-09-05 20:56:05 +08:00
XingfenD 0946f6be5a feat(backend): cover/file/pages endpoints — immutable URLs, Range, disk+redis caches 2026-09-05 00:48:40 +08:00
XingfenD 249619b857 feat(backend): book list/detail/delete with embedded progress + cache cleanup 2026-09-05 00:42:08 +08:00
XingfenD 193d7612b5 feat(backend): directory scanner — diff, error state, covers, cache sweep, redis lock 2026-09-05 00:31:32 +08:00
XingfenD 4e84a8aeb7 feat(backend): immutable cache dir scheme + stale sweep 2026-09-05 00:23:57 +08:00
XingfenD b02ca67d16 feat(backend): cover extraction for cbz and epub (opf cover-image/meta) 2026-09-05 00:23:02 +08:00
XingfenD 589cb210bb feat(backend): zip page index with natural sort, zip-slip rejection, content hash 2026-09-05 00:22:13 +08:00
XingfenD ed4ee2458f feat(backend): user + library admin API, atomic sanitized upload 2026-09-05 00:16:33 +08:00
XingfenD 51735680e0 test(backend): setupAPI points BooksDir at os.TempDir and resets shared loginrl key 2026-09-05 00:16:33 +08:00
XingfenD 18e31396f3 fix(backend): login timing-guard uses a valid bcrypt hash so the compare actually runs 2026-09-04 23:59:39 +08:00
XingfenD bc88cabc47 feat(backend): jwt middleware, login with redis rate limit, /auth/me 2026-09-04 23:58:26 +08:00
XingfenD a2f202ada6 fix(backend): seed admin tolerates only unique-violation, propagates other errors 2026-09-04 23:54:48 +08:00
XingfenD a20b32fe26 docs(plan): test suite command uses -p 1 (shared-PG destructive fixtures race) 2026-09-04 23:54:03 +08:00
XingfenD b224288dae feat(backend): bcrypt+jwt auth package and admin seeding 2026-09-04 23:50:52 +08:00
XingfenD c1761d0f3e feat(backend): pg schema + store queries incl. path-keyed progress 2026-09-04 23:48:05 +08:00
XingfenD d4972d6d4c docs(plan): fix unclosed code fence in Task 2, bump api build image to golang:1.26 2026-09-04 23:43:19 +08:00
XingfenD ad934d9812 feat(backend): module scaffold, config, gin router with healthz 2026-09-04 23:39:31 +08:00
XingfenD 2458c9ca4d docs: book-comic-library spec + backend implementation plan 2026-09-04 23:36:04 +08:00