diff --git a/web/src/main.ts b/web/src/main.ts
index 410aa33..4dc735c 100644
--- a/web/src/main.ts
+++ b/web/src/main.ts
@@ -393,14 +393,14 @@ function main() {
must("#library"),
{ kind: "library" },
);
- // no origin click to restore focus to on a deep link — the series
- // view's back control is the closest stand-in
+ // no origin click to restore focus to on a deep link — the library
+ // rail button is the closest stand-in
tvDeck.open({
title,
sub,
seriesId,
target,
- origin: must("#series-back"),
+ origin: must("#nav-library"),
returnTo: must("#series"),
parentRoute: { kind: "series", seriesId },
});
@@ -1294,7 +1294,6 @@ function externalLink(label: string, href: string): HTMLAnchorElement {
function movieMain(views: HideableView[]): MovieView {
const view = must("#movie");
const deckEl = must("#deck");
- const back = must("#movie-back");
const statusEl = must("#movie-status");
const hero = must("#movie-hero");
const poster = must("#movie-poster");
@@ -1906,7 +1905,8 @@ function movieMain(views: HideableView[]): MovieView {
filesSection.hidden = true;
diskRows.replaceChildren();
sweep.disabled = false;
- back.focus();
+ titleEl.setAttribute("tabindex", "-1");
+ titleEl.focus();
await load();
}
@@ -1929,8 +1929,6 @@ function movieMain(views: HideableView[]): MovieView {
target?.focus();
}
- back.addEventListener("click", close);
-
// capture + stopImmediatePropagation: one Escape steps back one layer —
// the library and search decks also listen for Escape on this window
window.addEventListener(
@@ -3125,7 +3123,6 @@ const SERIES_REFRESH_WAIT_MS = 30_000;
function seriesMain(tvDeck: TvReleasesView, views: HideableView[]): SeriesView {
const view = must("#series");
const deckEl = must("#deck");
- const back = must("#series-back");
const hero = must("#series-hero");
const poster = must("#series-poster");
const titleEl = must("#series-title");
@@ -3793,7 +3790,8 @@ function seriesMain(tvDeck: TvReleasesView, views: HideableView[]): SeriesView {
view.hidden = false;
clearRemove();
clearRichDetail();
- back.focus();
+ titleEl.setAttribute("tabindex", "-1");
+ titleEl.focus();
await load();
}
@@ -3814,8 +3812,6 @@ function seriesMain(tvDeck: TvReleasesView, views: HideableView[]): SeriesView {
origin?.focus();
}
- back.addEventListener("click", close);
-
// capture, like every other layer: the tv deck's listener is registered
// first, so one Esc steps back one layer
window.addEventListener(
diff --git a/web/src/style.css b/web/src/style.css
index 8a0ca95..efe15b9 100644
--- a/web/src/style.css
+++ b/web/src/style.css
@@ -528,6 +528,12 @@ body {
flex: 1;
}
+/* movie and series: the hero banner meets the rail — no top padding (#229) */
+.deck#movie,
+.deck#series {
+ padding-top: 0;
+}
+
.deck-status {
margin: 0 0 var(--space-4);
color: var(--ink-muted);