UI batch: tagging flow, series browse, fandom chips, nav #89

Merged
bvandeusen merged 5 commits from dev into main 2026-06-09 20:48:19 -04:00
Owner

Rolls up the dev work since the last main merge (#88).

Tagging flow

  • Focus returns to the tag input after accepting an auto-suggested tag (Suggestions panel + inline dropdown), mobile keyboard guard preserved. (4958e8f)
  • Tag-input dropdown searches the full prediction setSuggestionService.for_image(threshold_override=) + GET /images/<id>/suggestions?min=<f> surface every stored prediction (down to the 0.05 store floor), alias-resolved, so low-confidence actions/features can be accepted in canonical formatting instead of hand-typed. The Suggestions panel stays curated at the configured threshold. (c999c64)

Series browse

  • Search field (instant name/artist filter) + per-card kebab with Rename (reuses the tag-rename collision-merge flow) and Delete (confirm; removes the series + chapter/page ordering, keeps the images). (e4cebf7)

Tags / fandom

  • Character chips show their fandom name (truncated to 15 chars, full name on hover) on both modal-open paths, resolved via a Tag self-join. (978f49a)

Navigation

  • Settings pinned to the right edge as a gear, separated from the content nav (was stranded mid-row). Mobile unchanged. (a509020)

All commits CI-green on their dev head SHA.

🤖 Generated with Claude Code

Rolls up the dev work since the last main merge (#88). ## Tagging flow - **Focus returns to the tag input** after accepting an auto-suggested tag (Suggestions panel + inline dropdown), mobile keyboard guard preserved. (`4958e8f`) - **Tag-input dropdown searches the full prediction set** — `SuggestionService.for_image(threshold_override=)` + `GET /images/<id>/suggestions?min=<f>` surface every stored prediction (down to the 0.05 store floor), alias-resolved, so low-confidence actions/features can be accepted in canonical formatting instead of hand-typed. The Suggestions panel stays curated at the configured threshold. (`c999c64`) ## Series browse - **Search field** (instant name/artist filter) + **per-card kebab** with Rename (reuses the tag-rename collision-merge flow) and Delete (confirm; removes the series + chapter/page ordering, keeps the images). (`e4cebf7`) ## Tags / fandom - **Character chips show their fandom name** (truncated to 15 chars, full name on hover) on both modal-open paths, resolved via a Tag self-join. (`978f49a`) ## Navigation - **Settings pinned to the right edge** as a gear, separated from the content nav (was stranded mid-row). Mobile unchanged. (`a509020`) All commits CI-green on their dev head SHA. 🤖 Generated with [Claude Code](https://claude.com/claude-code)
bvandeusen added 5 commits 2026-06-09 20:48:12 -04:00
feat(modal): return focus to tag input after accepting a suggestion
CI / lint (push) Successful in 2s
CI / frontend-build (push) Successful in 19s
CI / backend-lint-and-test (push) Successful in 39s
CI / integration (push) Successful in 3m19s
4958e8f7d4
Accepting an auto-suggested tag (Suggestions panel or the autocomplete
dropdown) left focus on <body>, so the operator had to re-click the tag field
to add the next one. Expose TagAutocomplete.focus (the existing mobile-aware
focusInput) and call it after accept from both paths; SuggestionsPanel emits
'accepted' for the parent to refocus. Operator-asked 2026-06-08.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(series): browse search + per-card kebab (rename/delete)
CI / lint (push) Successful in 2s
CI / backend-lint-and-test (push) Successful in 26s
CI / frontend-build (push) Successful in 49s
CI / integration (push) Successful in 3m13s
e4cebf70d1
The Series browse tab had no way to find a series in a long grid and no
per-series actions. Add a search field (instant client-side name/artist filter
over the already-loaded list) and a kebab on each card with Rename (reuses
TagRenameDialog → PATCH /api/tags/<id>, with its collision-merge flow) and
Delete (confirm dialog → DELETE /api/admin/tags/<id>; series_page/chapter/
suggestion cascade, images kept). Gap badge moved to the cover's top-left so the
kebab can sit top-right. Operator-asked 2026-06-09.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(tags): show a character's fandom on its chip (truncated)
CI / lint (push) Successful in 3s
CI / frontend-build (push) Successful in 23s
CI / backend-lint-and-test (push) Successful in 43s
CI / integration (push) Successful in 3m27s
978f49adcc
A character chip with a fandom only rendered a bare arrow. Surface the fandom
NAME inline, truncated to 15 chars (full name in the tooltip). Resolve the name
via a Tag self-join in both tag paths the modal uses — list_for_image
(/api/images/<id>/tags) and gallery get_image_with_tags
(/api/gallery/image/<id>) — so chips show the fandom on first open and after any
reload. Falls back to the bare arrow when only fandom_id is known. Operator-asked
2026-06-09.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(suggestions): tag-input dropdown searches the full prediction set
CI / lint (push) Successful in 2s
CI / frontend-build (push) Successful in 21s
CI / backend-lint-and-test (push) Successful in 40s
CI / integration (push) Successful in 3m18s
c999c64cbe
The typed dropdown sourced the threshold-filtered panel list (>= 0.70 general),
so low-confidence actions/features the model DID predict never appeared — forcing
hand-typed custom tags instead of accepting the model's canonical formatting.

Add a threshold override: SuggestionService.for_image(threshold_override=) and
GET /images/<id>/suggestions?min=<f> surface EVERY stored prediction (down to the
0.05 store floor), alias-resolved and normalized, still excluding applied/rejected
and unsurfaced categories. The suggestions store gains allByCategory + loadAll
(min=0); the dropdown searches that full set (cap 20), while the Suggestions panel
stays curated at the configured threshold. Accept/dismiss drop from both lists.

Operator-asked 2026-06-09. Test: a 0.30 general prediction is hidden by default
but surfaced with threshold_override=0.0; unsurfaced categories still excluded.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
feat(nav): pin Settings to the right edge, separated from content nav
CI / lint (push) Successful in 3s
CI / frontend-build (push) Successful in 25s
CI / backend-lint-and-test (push) Successful in 49s
CI / integration (push) Successful in 3m20s
a50902071a
Settings is configuration, not content, but sat mid-row (between Series and
Posts). Pull it out of the centered content links and pin it to the right as a
gear+label, matching the convention that config lives at the right edge. Mobile
is unchanged — Settings stays in the hamburger menu (navRoutes still includes
it). Operator-asked 2026-06-09.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
bvandeusen merged commit 2bfc9936a1 into main 2026-06-09 20:48:19 -04:00
Sign in to join this conversation.
No Reviewers
No Label
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: bvandeusen/FabledCurator#89