e3855a5 — remove the frontend-orphaned cluster tag-gaps route + BulkTagService.tag_gaps + tests (the gallery bulk editor's other methods stay).
c8a8e23 — return focus to the tag input after every action: navigation (neighbour/breadcrumb/random/seed, hardened nextTick→rAF so the grid re-render can't steal it), tag add/remove, and the rename + fandom-assignment dialogs (@after-leave). Applies to the modal too.
e34f79f — show Provenance in the Explore rail above Tags (post title/description often names the character); ProvenancePanel gains optional imageId/image props, modal unchanged.
Three CI-green dev commits:
- **`e3855a5`** — remove the frontend-orphaned cluster tag-gaps route + `BulkTagService.tag_gaps` + tests (the gallery bulk editor's other methods stay).
- **`c8a8e23`** — return focus to the tag input after every action: navigation (neighbour/breadcrumb/random/seed, hardened nextTick→rAF so the grid re-render can't steal it), tag add/remove, and the rename + fandom-assignment dialogs (`@after-leave`). Applies to the modal too.
- **`e34f79f`** — show Provenance in the Explore rail above Tags (post title/description often names the character); `ProvenancePanel` gains optional imageId/image props, modal unchanged.
Green on dev (runs 1534 / 1535 / 1536).
🤖 Generated with [Claude Code](https://claude.com/claude-code)
The cluster tag-gap feature's only UI (Explore's TagGapPanel) was removed in the
3-pane rework, leaving the backend that fed it with no caller. Surgical removal:
- drop the POST /api/images/cluster/tag-gaps route (cluster_tag_gaps)
- drop BulkTagService.tag_gaps (+ the now-unused `import math`)
- drop the tag_gaps tests (test_bulk_tag_service, test_api_bulk_tags)
BulkTagService's common_tags / bulk_add / bulk_remove stay — they still back the
gallery bulk editor. Pure deletion, no behaviour change.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Explore is a rapid walk-and-tag surface, so focus must keep returning to the tag
input with no extra click (operator-asked 2026-06-26). Two gaps closed:
- Navigation hardening: refocus on every focused-image change (neighbour click,
breadcrumb, Random image, seed) now runs nextTick → requestAnimationFrame, so
it lands AFTER the post-navigation re-render/paint instead of being stolen
back by the neighbour-grid re-render.
- All tag actions refocus, in both Explore and the modal: tag add (existing/new)
and remove now hand focus back like accept-suggestion already did; and the
rename + fandom-assignment dialogs refocus on @after-leave (fires after
Vuetify's own focus-return to the activator, so ours wins).
TagAutocomplete's mobile guard is preserved throughout (no soft-keyboard pop on
touch). Modal behaviour gains the same stickier focus — consistent, low-risk.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
The post title/description frequently names the character, so surface it while
tagging in Explore (operator-asked 2026-06-26). ProvenancePanel gains optional
imageId/image props (default = modal store, so the modal is unchanged) since
provenance is its own system loaded by id; ExploreView renders it above TagPanel
in the right rail, hosted on the anchor. Self-collapses when the image has no
provenance.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Three CI-green dev commits:
e3855a5— remove the frontend-orphaned cluster tag-gaps route +BulkTagService.tag_gaps+ tests (the gallery bulk editor's other methods stay).c8a8e23— return focus to the tag input after every action: navigation (neighbour/breadcrumb/random/seed, hardened nextTick→rAF so the grid re-render can't steal it), tag add/remove, and the rename + fandom-assignment dialogs (@after-leave). Applies to the modal too.e34f79f— show Provenance in the Explore rail above Tags (post title/description often names the character);ProvenancePanelgains optional imageId/image props, modal unchanged.Green on dev (runs 1534 / 1535 / 1536).
🤖 Generated with Claude Code