Search results now show where you are in a book: a completed check at the 0.999 threshold (same cut as the filter status arms), a partial progress bar along the cover while mid-read, nothing when you never opened it. Rendered in BookCard (any grid whose adapter loads viewer progress) and in the header-search dropdown rows. The progress rides a LEFT JOIN reading_progress on the SAME user_id param SearchMediaItemsUnified already binds for library visibility — one requester param, no new wire inputs, row-neutral join (the table is UNIQUE per media_item+user). SearchMediaItemsUnifiedRow and BookInfo gain the keys additively (viewer_percentage null when unknown, library_name empty on feeds that don't load it); contract_pins.md carries the changelog entry and the pin tests widen in lockstep. The header dropdown itself migrates off the innerHTML string renderer in search.ts (a rendering-ownership violation: a templ twin existed via the HX-Request branch). The input now hx-gets layout=dropdown and swaps the new templ SearchResults partial — titles/authors highlighted server-side (escape-first, safe by construction), rows with the same progress overlays — while a slim Alpine component owns only client-local state (min-length gating, open/close, keyboard selection, htmx lifecycle). web/src/rendering-allowlist.txt drops the search.ts baseline to zero accordingly. Integration test pins the per-user join (fresh user sees 1.0/0.42/null on the fixture; the shared admin sees null everywhere — read-only) and the dropdown partial's overlays/count/row count.
26 lines
889 B
Plaintext
26 lines
889 B
Plaintext
# Rendering-ownership baseline (AGENTS.md → Rendering ownership).
|
|
# Files allowed to build HTML in TypeScript, with their current innerHTML
|
|
# assignment counts (trivial `innerHTML = ""` clears don't count; the
|
|
# reader — web/src/reader/ — is a sanctioned island and not counted).
|
|
# `make lint-rendering` fails when a count grows above its baseline.
|
|
# Shrink counts as fragments move to templ partials — the end state of
|
|
# the triage is an empty list.
|
|
web/src/admin.ts:3
|
|
web/src/api-explorer.ts:4
|
|
web/src/bookshelf.ts:1
|
|
web/src/collection-rules.ts:6
|
|
web/src/collections.ts:5
|
|
web/src/custom-section-builder.ts:10
|
|
web/src/device-management.ts:4
|
|
web/src/docs.ts:1
|
|
web/src/dashboard.ts:2
|
|
web/src/linking.ts:3
|
|
web/src/markdown.ts:1
|
|
web/src/dom.ts:1
|
|
web/src/password_validation.ts:1
|
|
web/src/queue.ts:3
|
|
web/src/setup.ts:1
|
|
web/src/stats.ts:9
|
|
web/src/toast.ts:2
|
|
web/src/unlinked_books.ts:13
|