Manual search buckets and attribute chips #79
@@ -2,13 +2,13 @@
|
||||
version: 1
|
||||
slug: "web-src-main-ts"
|
||||
primary_target: "web/src/main.ts"
|
||||
related_targets: ["web/index.html","web/src/search.ts","web/src/style.css"]
|
||||
related_targets: ["web/index.html","web/src/search.ts","web/src/releases.ts","web/src/style.css"]
|
||||
---
|
||||
|
||||
# Surface: unified search (web/src/main.ts, §9.2)
|
||||
# Surface: unified search + release deck (web/src/main.ts, §9.2 + §9.3)
|
||||
|
||||
Mode: Operate. The operator finds or adds a title without knowing which of
|
||||
the two they are doing.
|
||||
the two they are doing, and picks a release from decisions, not name dumps.
|
||||
|
||||
- Audience: the household operator; desktop mostly, phone sometimes.
|
||||
- Task: one rail-mounted command input. Typing swaps the chain board for the
|
||||
@@ -17,10 +17,23 @@ the two they are doing.
|
||||
engraved micro-label headings, machined rows, chips on the right.
|
||||
- Add flow: inline panel under a TMDB row — root radio cards (audience name,
|
||||
policy name, path), main pre-selected, one confirm. Never a separate page.
|
||||
- Release deck (§9.3, issue #31): a library row opens the buckets view.
|
||||
ELIGIBLE leads with fixed-width attribute chips in aligned mono columns
|
||||
(rem-width `.cw-*` classes shared by chips and the column header, so the
|
||||
pseudo-table survives flex wrapping); WAIVED and REJECTED collapse to
|
||||
counts behind cyan show/hide toggles. Release name is a secondary
|
||||
truncated line, full string plus indexer/date/bytes on row expand. Every
|
||||
waived/rejected row carries a verdict chip naming the rule. Grab is its
|
||||
own control per row; on a waived row it is "waive + grab" and writes the
|
||||
per-title override (rule→override mapping in releases.ts — bookkeeping,
|
||||
never policy; verdicts always come from the API). Esc steps back one
|
||||
layer: deck → search results → board.
|
||||
- Manual intake: magnet / .torrent input routes to a MANUAL GRAB panel showing
|
||||
parsed display name and btih; grab wiring lands with the release buckets
|
||||
(issue #31/#22), and the panel says so honestly.
|
||||
parsed display name and btih; magnet grab wiring is issue #22, and the
|
||||
panel says so honestly.
|
||||
- Constraints: 250 ms debounce, AbortController cancellation, token-gated CSS,
|
||||
cyan for interaction only, dead-air rule (no idle animation).
|
||||
- Unresolved: library rows are informational until the library view (#32)
|
||||
gives them a destination; TMDB search is movie-only until series land (#39).
|
||||
cyan for interaction only, dead-air rule (no idle animation), no horizontal
|
||||
scroll at any viewport (§9.3 acceptance criterion).
|
||||
- Unresolved: releases land in the persisted store only once the daemon
|
||||
consumes search commands (#68-adjacent); TMDB search is movie-only until
|
||||
series land (#39).
|
||||
|
||||
@@ -35,6 +35,14 @@
|
||||
a pasted magnet or .torrent routes to a manual-intake panel. There is
|
||||
no separate add page, ever. Esc returns to the board; "/" focuses the
|
||||
box from anywhere.
|
||||
BUCKETS (§9.3, issue #31): a library row opens the release deck — the
|
||||
policy engine's verdicts, inverted from Radarr: ELIGIBLE rows lead with
|
||||
fixed-width attribute chips (score res source hdr audio size seed) in
|
||||
aligned mono columns; WAIVED and REJECTED collapse to counts. The
|
||||
release name is secondary, truncated, full on expand. Every rejected
|
||||
row names its killing rule; one click on a waived row writes the
|
||||
override and grabs. No horizontal scroll at any viewport. Esc returns
|
||||
to the search deck.
|
||||
-->
|
||||
<header class="rail">
|
||||
<div class="rail-id">
|
||||
@@ -87,6 +95,85 @@
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<main class="deck releases" id="releases" hidden>
|
||||
<header class="releases-head">
|
||||
<button type="button" class="control" id="releases-back">back</button>
|
||||
<div class="releases-id">
|
||||
<h2 class="releases-title" id="releases-title">—</h2>
|
||||
<span class="releases-year readout dim" id="releases-year">—</span>
|
||||
</div>
|
||||
<button type="button" class="control" id="releases-sweep">search indexers</button>
|
||||
</header>
|
||||
<p class="deck-status readout" id="releases-status" role="status" hidden></p>
|
||||
|
||||
<section class="deck-group" id="bucket-eligible" hidden aria-labelledby="label-eligible">
|
||||
<header class="deck-head">
|
||||
<h3 class="deck-label" id="label-eligible">eligible</h3>
|
||||
<span class="deck-count readout" id="count-eligible"></span>
|
||||
</header>
|
||||
<div class="colhead" aria-hidden="true">
|
||||
<span class="cw cw-score">score</span>
|
||||
<span class="cw cw-res">res</span>
|
||||
<span class="cw cw-src">source</span>
|
||||
<span class="cw cw-hdr">hdr</span>
|
||||
<span class="cw cw-aud">audio</span>
|
||||
<span class="cw cw-size">size</span>
|
||||
<span class="cw cw-seed">seed</span>
|
||||
</div>
|
||||
<ul class="deck-rows" id="rows-eligible"></ul>
|
||||
</section>
|
||||
|
||||
<section class="deck-group" id="bucket-waived" hidden aria-labelledby="label-waived">
|
||||
<header class="deck-head bucket-head">
|
||||
<h3 class="deck-label" id="label-waived">waived</h3>
|
||||
<button
|
||||
type="button"
|
||||
class="bucket-toggle readout"
|
||||
id="toggle-waived"
|
||||
aria-expanded="false"
|
||||
aria-controls="wrap-waived"
|
||||
></button>
|
||||
</header>
|
||||
<div id="wrap-waived" hidden>
|
||||
<div class="colhead" aria-hidden="true">
|
||||
<span class="cw cw-score">score</span>
|
||||
<span class="cw cw-res">res</span>
|
||||
<span class="cw cw-src">source</span>
|
||||
<span class="cw cw-hdr">hdr</span>
|
||||
<span class="cw cw-aud">audio</span>
|
||||
<span class="cw cw-size">size</span>
|
||||
<span class="cw cw-seed">seed</span>
|
||||
</div>
|
||||
<ul class="deck-rows" id="rows-waived"></ul>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="deck-group" id="bucket-rejected" hidden aria-labelledby="label-rejected">
|
||||
<header class="deck-head bucket-head">
|
||||
<h3 class="deck-label" id="label-rejected">rejected</h3>
|
||||
<button
|
||||
type="button"
|
||||
class="bucket-toggle readout"
|
||||
id="toggle-rejected"
|
||||
aria-expanded="false"
|
||||
aria-controls="wrap-rejected"
|
||||
></button>
|
||||
</header>
|
||||
<div id="wrap-rejected" hidden>
|
||||
<div class="colhead" aria-hidden="true">
|
||||
<span class="cw cw-score">score</span>
|
||||
<span class="cw cw-res">res</span>
|
||||
<span class="cw cw-src">source</span>
|
||||
<span class="cw cw-hdr">hdr</span>
|
||||
<span class="cw cw-aud">audio</span>
|
||||
<span class="cw cw-size">size</span>
|
||||
<span class="cw cw-seed">seed</span>
|
||||
</div>
|
||||
<ul class="deck-rows" id="rows-rejected"></ul>
|
||||
</div>
|
||||
</section>
|
||||
</main>
|
||||
|
||||
<main class="board">
|
||||
<section class="chain" aria-label="signal chain">
|
||||
<article class="module area-tmdb" data-check="tmdb">
|
||||
|
||||
@@ -1,4 +1,22 @@
|
||||
|
|
||||
import { type CheckStatus, type Probe, probeHealth } from "./health";
|
||||
import {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
bucketOf,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
formatAudio,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
formatHdr,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
formatPublishDate,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
formatResolution,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
formatScore,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
formatSeeders,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
formatSize,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
formatSource,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
grabRelease,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
type MovieRelease,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
movieReleases,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
queueSearch,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
ruleLabel,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
waiveAndGrab,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
waiverOverride,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
} from "./releases";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
import {
|
||||
addMovie,
|
||||
type LibraryMovie,
|
||||
@@ -165,7 +183,7 @@ function main() {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}, POLL_MS);
|
||||
void probe();
|
||||
|
||||
searchMain(board);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
searchMain(board, releasesMain());
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
||||
const DEBOUNCE_MS = 250;
|
||||
@@ -181,7 +199,7 @@ interface DeckRefs {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
manualIntake: HTMLElement;
|
||||
}
|
||||
|
||||
function searchMain(board: HTMLElement) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
function searchMain(board: HTMLElement, releases: ReleasesView) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const input = must<HTMLInputElement>("#search");
|
||||
const hint = must<HTMLElement>("#search-hint");
|
||||
const refs: DeckRefs = {
|
||||
@@ -222,11 +240,13 @@ function searchMain(board: HTMLElement) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
function showBoard() {
|
||||
controller?.abort();
|
||||
controller = null;
|
||||
releases.hide();
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
refs.deck.hidden = true;
|
||||
board.hidden = false;
|
||||
}
|
||||
|
||||
function showDeck() {
|
||||
releases.hide();
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
board.hidden = true;
|
||||
refs.deck.hidden = false;
|
||||
}
|
||||
@@ -290,7 +310,7 @@ function searchMain(board: HTMLElement) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
refs.groups.library.section.hidden = false;
|
||||
refs.groups.library.count.textContent = String(response.library.length);
|
||||
for (const movie of response.library) {
|
||||
refs.groups.library.rows.append(libraryRow(movie, roots));
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
refs.groups.library.rows.append(libraryRow(movie, roots, releases.open));
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
}
|
||||
if (response.tmdb.length > 0) {
|
||||
@@ -403,9 +423,15 @@ function rowTitle(title: string, year: number | null): HTMLElement {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
return wrap;
|
||||
}
|
||||
|
||||
function libraryRow(movie: LibraryMovie, roots: Root[]): HTMLLIElement {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
function libraryRow(
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
movie: LibraryMovie,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
roots: Root[],
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
open: (movie: LibraryMovie, origin: HTMLElement) => void,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
): HTMLLIElement {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const item = document.createElement("li");
|
||||
item.className = "row";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const row = document.createElement("button");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
row.type = "button";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
row.className = "row row-tmdb";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const chips = document.createElement("span");
|
||||
chips.className = "row-chips";
|
||||
const root = roots.find((candidate) => candidate.id === movie.root_id);
|
||||
@@ -421,7 +447,15 @@ function libraryRow(movie: LibraryMovie, roots: Root[]): HTMLLIElement {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (movie.blocked) {
|
||||
chips.append(chip("blocked"));
|
||||
}
|
||||
item.append(rowTitle(movie.title, movie.year), chips);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const affordance = document.createElement("span");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
affordance.className = "row-add readout";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
affordance.textContent = "releases";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
chips.append(affordance);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
row.append(rowTitle(movie.title, movie.year), chips);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
row.addEventListener("click", () => {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
open(movie, row);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
});
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
item.append(row);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
return item;
|
||||
}
|
||||
|
||||
@@ -586,6 +620,366 @@ function addPanel(movie: TmdbMovie, roots: Root[], row: HTMLButtonElement): HTML
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
return panel;
|
||||
}
|
||||
|
||||
/* ---- release deck (§9.3, issue #31) ---------------------------------- */
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
interface ReleasesView {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
open: (movie: LibraryMovie, origin: HTMLElement) => void;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
hide: () => void;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
interface BucketRefs {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
section: HTMLElement;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
rows: HTMLUListElement;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
function releasesMain(): ReleasesView {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const view = must<HTMLElement>("#releases");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const deck = must<HTMLElement>("#deck");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const back = must<HTMLButtonElement>("#releases-back");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const title = must<HTMLElement>("#releases-title");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const year = must<HTMLElement>("#releases-year");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const sweep = must<HTMLButtonElement>("#releases-sweep");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const status = must<HTMLElement>("#releases-status");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const eligible: BucketRefs & { count: HTMLElement } = {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
section: must<HTMLElement>("#bucket-eligible"),
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
count: must<HTMLElement>("#count-eligible"),
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
rows: must<HTMLUListElement>("#rows-eligible"),
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
};
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const collapsed = {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
waived: {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
section: must<HTMLElement>("#bucket-waived"),
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
toggle: must<HTMLButtonElement>("#toggle-waived"),
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
wrap: must<HTMLElement>("#wrap-waived"),
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
rows: must<HTMLUListElement>("#rows-waived"),
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
},
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
rejected: {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
section: must<HTMLElement>("#bucket-rejected"),
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
toggle: must<HTMLButtonElement>("#toggle-rejected"),
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
wrap: must<HTMLElement>("#wrap-rejected"),
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
rows: must<HTMLUListElement>("#rows-rejected"),
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
},
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
} as const;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
let current: LibraryMovie | null = null;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
let origin: HTMLElement | null = null;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const actions: ReleaseActions = {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
reload: () => load(),
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
notify: (text, tone) => setStatus(text, tone),
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
};
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
// guards a stale fetch from painting over a newer view
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
let sequence = 0;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
let refetchTimer: number | undefined;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
function setStatus(text: string | null, tone?: "fault") {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
status.hidden = text === null;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
status.textContent = text ?? "";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (tone) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
status.dataset.tone = tone;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
} else {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
delete status.dataset.tone;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
function clearBuckets() {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
eligible.section.hidden = true;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
eligible.rows.replaceChildren();
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
for (const bucket of [collapsed.waived, collapsed.rejected]) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
bucket.section.hidden = true;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
bucket.wrap.hidden = true;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
bucket.toggle.setAttribute("aria-expanded", "false");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
bucket.rows.replaceChildren();
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
function setToggle(bucket: (typeof collapsed)["waived"], count: number) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const open = !bucket.wrap.hidden;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
bucket.toggle.textContent = open ? `hide ${count}` : `show ${count}`;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
bucket.toggle.setAttribute("aria-expanded", String(open));
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
for (const bucket of [collapsed.waived, collapsed.rejected]) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
bucket.toggle.addEventListener("click", () => {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
bucket.wrap.hidden = !bucket.wrap.hidden;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
setToggle(bucket, bucket.rows.childElementCount);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
});
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
function render(releases: MovieRelease[]) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const movie = current;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (!movie) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
return;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
clearBuckets();
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (releases.length === 0) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
setStatus("no releases indexed for this title — search indexers runs a sweep now");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
return;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
setStatus(null);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
// the API pre-sorts by bucket then score; splitting preserves order
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const buckets = {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
eligible: releases.filter((release) => bucketOf(release) === "eligible"),
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
waived: releases.filter((release) => bucketOf(release) === "waived"),
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
rejected: releases.filter((release) => bucketOf(release) === "rejected"),
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
};
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
eligible.section.hidden = false;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
eligible.count.textContent = String(buckets.eligible.length);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (buckets.eligible.length > 0) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
for (const release of buckets.eligible) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
eligible.rows.append(releaseRow(release, movie, "eligible", actions));
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
} else {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
// §9.3: over-strict filters must be visible, not silently absent
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const none = document.createElement("li");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
none.className = "rel rel-none readout dim";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
none.textContent = "none — every candidate was waived or rejected by policy";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
eligible.rows.append(none);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
for (const name of ["waived", "rejected"] as const) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const rows = buckets[name];
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (rows.length === 0) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
continue;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const bucket = collapsed[name];
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
bucket.section.hidden = false;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
for (const release of rows) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
bucket.rows.append(releaseRow(release, movie, name, actions));
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
setToggle(bucket, rows.length);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
async function load() {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const movie = current;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (!movie) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
return;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
sequence += 1;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const ticket = sequence;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
setStatus("reading releases…");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const outcome = await movieReleases(movie.id);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (ticket !== sequence || current !== movie) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
return;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (outcome.kind === "error") {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
clearBuckets();
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
setStatus(`releases unavailable — ${outcome.detail}`, "fault");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
return;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
render(outcome.releases);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
function open(movie: LibraryMovie, from: HTMLElement) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
current = movie;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
origin = from;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
title.textContent = movie.title;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
year.textContent = movie.year === null ? "—" : String(movie.year);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
deck.hidden = true;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
view.hidden = false;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
clearBuckets();
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
sweep.disabled = false;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
back.focus();
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
void load();
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
function hide() {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
view.hidden = true;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
current = null;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
sequence += 1;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
window.clearTimeout(refetchTimer);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
function close() {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const target = origin;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
hide();
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
deck.hidden = false;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
target?.focus();
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
back.addEventListener("click", close);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
// capture + stopPropagation: one Escape steps back one layer, instead
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
// of falling through to the search deck's own Escape handler
|
||||
|
naps62-yolo marked this conversation as resolved
Outdated
naps62-yolo
commented
Closing the release deck unhides Closing the release deck unhides `#deck`; the existing window Escape handler then receives this same event and immediately sends the user to the board. Stop propagation here, or make that handler ignore Escape while the release view is active.
<!-- agent-meta: {"model":"gpt-5","session":"01a02b62"} -->
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
window.addEventListener(
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
"keydown",
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
(event) => {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (event.key === "Escape" && !view.hidden) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
event.stopPropagation();
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
close();
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
},
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
true,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
sweep.addEventListener("click", () => {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const movie = current;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (!movie) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
return;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
sweep.disabled = true;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
void queueSearch(movie.id).then((outcome) => {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (current !== movie) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
return;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
sweep.disabled = false;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (outcome.kind === "error") {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
setStatus(`search failed — ${outcome.detail}`, "fault");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
return;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
setStatus("search queued — indexers answer asynchronously, rereading shortly");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
window.clearTimeout(refetchTimer);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
refetchTimer = window.setTimeout(() => {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
void load();
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}, 3000);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
});
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
});
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
return { open, hide };
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
interface ReleaseActions {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
reload: () => Promise<void>;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
notify: (text: string, tone?: "fault") => void;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
/** One classified release: chips lead, the name is secondary (§9.3). */
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
function releaseRow(
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
release: MovieRelease,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
movie: LibraryMovie,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
bucket: "eligible" | "waived" | "rejected",
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
actions: ReleaseActions,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
): HTMLLIElement {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const item = document.createElement("li");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
item.className = "rel";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const line = document.createElement("button");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
line.type = "button";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
line.className = "rel-line";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
line.setAttribute("aria-expanded", "false");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const columns: [string, string, string][] = [
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
["cw-score", "score", formatScore(release.score)],
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
["cw-res", "resolution", formatResolution(release.parsed)],
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
["cw-src", "source", formatSource(release.parsed)],
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
["cw-hdr", "hdr", formatHdr(release.parsed)],
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
["cw-aud", "audio", formatAudio(release.parsed)],
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
["cw-size", "size", formatSize(release.size)],
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
["cw-seed", "seeders", formatSeeders(release.seeders)],
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
];
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
for (const [width, label, value] of columns) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
line.append(
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
chip(value, (span) => {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
span.classList.add("cw", width);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
span.setAttribute("aria-label", value === "—" ? `${label} unclaimed` : `${label} ${value}`);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (value === "—") {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
span.classList.add("dim");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
// the world's non-colour eligible mark rides the leading chip
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (bucket === "eligible" && width === "cw-score") {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
span.dataset.verdict = "eligible";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}),
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (bucket !== "eligible") {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
line.append(
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
chip(`${bucket} · ${ruleLabel(release.rejected_rule)}`, (span) => {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
span.dataset.verdict = bucket;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}),
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const name = document.createElement("span");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
name.className = "rel-name readout";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
name.textContent = release.name;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
line.append(name);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
item.append(line);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const note = document.createElement("span");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
note.className = "rel-note readout";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
note.setAttribute("role", "status");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
note.hidden = true;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (bucket !== "rejected") {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const grab = document.createElement("button");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
grab.type = "button";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
grab.className = "control rel-grab";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const writesOverride = bucket === "waived" && waiverOverride(release.rejected_rule) !== null;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
grab.textContent = writesOverride ? "waive + grab" : "grab";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
grab.addEventListener("click", () => {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
grab.disabled = true;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
note.hidden = false;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
delete note.dataset.tone;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
note.textContent = "grabbing…";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const action =
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
bucket === "waived"
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
? waiveAndGrab(movie.id, release.id, release.rejected_rule)
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
: grabRelease(movie.id, release.id).then((outcome) =>
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
outcome.kind === "done"
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
? ({ kind: "done", overrideWritten: false } as const)
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
: ({ kind: "error", detail: outcome.detail, overrideWritten: false } as const),
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
void action.then((outcome) => {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const text =
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
outcome.kind === "error"
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
? `${outcome.overrideWritten ? "override written · " : ""}grab failed — ${outcome.detail}`
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
: `${outcome.overrideWritten ? "override written · " : ""}grab sent`;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (outcome.kind === "error") {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
grab.disabled = false;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
note.textContent = text;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
note.dataset.tone = "fault";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
} else {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
note.textContent = text;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (outcome.overrideWritten) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
// the override changed classification; reread the verdicts and
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
// keep the outcome visible past the re-render
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
void actions.reload().then(() => {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
actions.notify(text, outcome.kind === "error" ? "fault" : undefined);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
});
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
});
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
});
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
item.append(grab);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
item.append(note);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const full = document.createElement("div");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
full.className = "rel-full";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
full.hidden = true;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
line.addEventListener("click", () => {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (full.childElementCount === 0) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const raw = document.createElement("p");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
raw.className = "rel-raw readout";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
raw.textContent = release.name;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
full.append(raw);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const meta = document.createElement("p");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
meta.className = "rel-meta readout dim";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const published = formatPublishDate(release.publish_date);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
meta.textContent = [
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
`indexer ${release.indexer_id}`,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
published === null ? null : `published ${published}`,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
`${release.size} bytes`,
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
]
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
.filter((part) => part !== null)
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
.join(" · ");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
full.append(meta);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
if (bucket === "waived" && waiverOverride(release.rejected_rule) !== null) {
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
const waiver = document.createElement("p");
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
waiver.className = "rel-meta readout dim";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
waiver.textContent = "waive + grab writes this title's override, then grabs";
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
full.append(waiver);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
full.hidden = !full.hidden;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
line.setAttribute("aria-expanded", String(!full.hidden));
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
});
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
item.append(full);
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
return item;
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
}
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
function renderManual(intake: HTMLElement, kind: "magnet" | "torrent_url", raw: string) {
|
||||
const parsed = parseManualInput(kind, raw);
|
||||
intake.replaceChildren();
|
||||
|
||||
|
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
naps62-yolo
commented
Fixed in Fixed in fb7fe49 — the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.
<!-- agent-meta: {"model":"claude-fable-5","session":"62e4c09a"} -->
|
||||
@@ -0,0 +1,261 @@
|
||||
// Hand-written mirror of arr-api's /api/movies/{id}/releases, grab and
|
||||
// override schemas — same reasoning as search.ts: the generated client
|
||||
// (src/api/) is uncommitted, so CI's tsc cannot see it.
|
||||
|
||||
export type Bucket = "eligible" | "waived" | "rejected";
|
||||
|
||||
/** What the release name claims (arr-parse `NameClaims`, §5.6). */
|
||||
export interface ParsedClaims {
|
||||
resolution?: string | null;
|
||||
source?: string | null;
|
||||
codec?: string | null;
|
||||
hdr?: string[];
|
||||
languages?: string[];
|
||||
}
|
||||
|
||||
export interface MovieRelease {
|
||||
id: number;
|
||||
indexer_id: number;
|
||||
guid: string;
|
||||
name: string;
|
||||
size: number;
|
||||
seeders: number | null;
|
||||
publish_date: string | null;
|
||||
download_url: string;
|
||||
parsed: ParsedClaims;
|
||||
score: number | null;
|
||||
verdict: string | null;
|
||||
rejected_rule: string | null;
|
||||
}
|
||||
|
||||
export type ReleasesOutcome =
|
||||
| { kind: "results"; releases: MovieRelease[] }
|
||||
| { kind: "error"; detail: string };
|
||||
|
||||
export async function movieReleases(movieId: number): Promise<ReleasesOutcome> {
|
||||
try {
|
||||
const response = await fetch(`/api/movies/${movieId}/releases`);
|
||||
if (!response.ok) {
|
||||
return { kind: "error", detail: await errorDetail(response) };
|
||||
}
|
||||
return { kind: "results", releases: (await response.json()) as MovieRelease[] };
|
||||
} catch {
|
||||
return { kind: "error", detail: "daemon unreachable" };
|
||||
}
|
||||
}
|
||||
|
||||
export type ActionOutcome = { kind: "done" } | { kind: "error"; detail: string };
|
||||
|
||||
/** §6.2 manual trigger: one targeted sweep, user-initiated. */
|
||||
export async function queueSearch(movieId: number): Promise<ActionOutcome> {
|
||||
try {
|
||||
const response = await fetch(`/api/movies/${movieId}/search`, { method: "POST" });
|
||||
if (!response.ok) {
|
||||
return { kind: "error", detail: await errorDetail(response) };
|
||||
}
|
||||
return { kind: "done" };
|
||||
} catch {
|
||||
return { kind: "error", detail: "daemon unreachable" };
|
||||
}
|
||||
}
|
||||
|
||||
export async function grabRelease(movieId: number, releaseId: number): Promise<ActionOutcome> {
|
||||
try {
|
||||
const response = await fetch(`/api/movies/${movieId}/releases/${releaseId}/grab`, {
|
||||
method: "POST",
|
||||
});
|
||||
if (!response.ok) {
|
||||
return { kind: "error", detail: await errorDetail(response) };
|
||||
}
|
||||
return { kind: "done" };
|
||||
} catch {
|
||||
return { kind: "error", detail: "daemon unreachable" };
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The per-title override one click on a waived row writes (§5.2, §9.3).
|
||||
* Mapping a rule name to its override is bookkeeping, not policy — the
|
||||
* verdict itself always comes from the API.
|
||||
*/
|
||||
export function waiverOverride(rule: string | null): Record<string, unknown> | null {
|
||||
switch (rule) {
|
||||
case "required_audio":
|
||||
return { allow_english_audio: true };
|
||||
case "resolution":
|
||||
return { only_4k: false };
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
}
|
||||
|
||||
export type WaiveOutcome =
|
||||
| { kind: "done"; overrideWritten: boolean }
|
||||
| { kind: "error"; detail: string; overrideWritten: boolean };
|
||||
|
||||
/** One click on a waived row: write the override, then grab (§9.3). */
|
||||
export async function waiveAndGrab(
|
||||
movieId: number,
|
||||
releaseId: number,
|
||||
rule: string | null,
|
||||
): Promise<WaiveOutcome> {
|
||||
const override = waiverOverride(rule);
|
||||
let overrideWritten = false;
|
||||
if (override) {
|
||||
try {
|
||||
const current = await fetch(`/api/movies/${movieId}`);
|
||||
if (!current.ok) {
|
||||
return { kind: "error", detail: await errorDetail(current), overrideWritten };
|
||||
}
|
||||
const movie = (await current.json()) as { overrides: Record<string, unknown> };
|
||||
const patch = await fetch(`/api/movies/${movieId}`, {
|
||||
method: "PATCH",
|
||||
headers: { "content-type": "application/json" },
|
||||
body: JSON.stringify({ overrides: { ...movie.overrides, ...override } }),
|
||||
});
|
||||
if (!patch.ok) {
|
||||
return { kind: "error", detail: await errorDetail(patch), overrideWritten };
|
||||
}
|
||||
overrideWritten = true;
|
||||
} catch {
|
||||
return { kind: "error", detail: "daemon unreachable", overrideWritten };
|
||||
}
|
||||
}
|
||||
const grabbed = await grabRelease(movieId, releaseId);
|
||||
if (grabbed.kind === "error") {
|
||||
return { kind: "error", detail: grabbed.detail, overrideWritten };
|
||||
}
|
||||
return { kind: "done", overrideWritten };
|
||||
}
|
||||
|
||||
export function bucketOf(release: MovieRelease): Bucket {
|
||||
if (release.verdict === "eligible") {
|
||||
return "eligible";
|
||||
}
|
||||
if (release.verdict === "waived") {
|
||||
return "waived";
|
||||
}
|
||||
return "rejected";
|
||||
}
|
||||
|
||||
/* ---- chip formatting: parsed attributes to fixed-width mono values ---- */
|
||||
|
||||
const SOURCE_LABEL: Record<string, string> = {
|
||||
Cam: "cam",
|
||||
Telesync: "ts",
|
||||
Telecine: "tc",
|
||||
Screener: "scr",
|
||||
Dvd: "dvd",
|
||||
Hdtv: "hdtv",
|
||||
WebRip: "webrip",
|
||||
WebDl: "web-dl",
|
||||
BluRay: "bluray",
|
||||
Remux: "remux",
|
||||
};
|
||||
|
||||
const HDR_LABEL: Record<string, string> = {
|
||||
DolbyVision: "DV",
|
||||
Hdr10Plus: "HDR10+",
|
||||
Hdr10: "HDR10",
|
||||
Hdr: "HDR",
|
||||
Hlg: "HLG",
|
||||
Sdr: "SDR",
|
||||
};
|
||||
|
||||
const LANGUAGE_LABEL: Record<string, string> = {
|
||||
PtBr: "pt-BR",
|
||||
PtPt: "pt-PT",
|
||||
Portuguese: "pt",
|
||||
English: "en",
|
||||
French: "fr",
|
||||
German: "de",
|
||||
Spanish: "es",
|
||||
Italian: "it",
|
||||
Multi: "multi",
|
||||
Dual: "dual",
|
||||
};
|
||||
|
||||
/** §5.7 rule names as short chip words. */
|
||||
const RULE_LABEL: Record<string, string> = {
|
||||
required_audio: "audio",
|
||||
dub_blacklist: "dub",
|
||||
portuguese_unverified: "pt unverified",
|
||||
dolby_vision_profile: "dv profile",
|
||||
resolution: "resolution",
|
||||
source: "source",
|
||||
size: "size",
|
||||
};
|
||||
|
||||
export function formatScore(score: number | null): string {
|
||||
return score === null ? "—" : String(Math.round(score));
|
||||
}
|
||||
|
||||
export function formatResolution(parsed: ParsedClaims): string {
|
||||
return parsed.resolution ?? "—";
|
||||
}
|
||||
|
||||
export function formatSource(parsed: ParsedClaims): string {
|
||||
if (!parsed.source) {
|
||||
return "—";
|
||||
}
|
||||
return SOURCE_LABEL[parsed.source] ?? parsed.source.toLowerCase();
|
||||
}
|
||||
|
||||
export function formatHdr(parsed: ParsedClaims): string {
|
||||
const markers = parsed.hdr ?? [];
|
||||
if (markers.length === 0) {
|
||||
return "—";
|
||||
}
|
||||
return markers.map((marker) => HDR_LABEL[marker] ?? marker).join(" ");
|
||||
}
|
||||
|
||||
export function formatAudio(parsed: ParsedClaims): string {
|
||||
const markers = parsed.languages ?? [];
|
||||
if (markers.length === 0) {
|
||||
return "—";
|
||||
}
|
||||
return markers.map((marker) => LANGUAGE_LABEL[marker] ?? marker.toLowerCase()).join(" ");
|
||||
}
|
||||
|
||||
export function formatSize(bytes: number): string {
|
||||
if (bytes <= 0) {
|
||||
return "—";
|
||||
}
|
||||
const gib = bytes / 2 ** 30;
|
||||
if (gib >= 100) {
|
||||
return `${Math.round(gib)}G`;
|
||||
}
|
||||
if (gib >= 1) {
|
||||
return `${gib.toFixed(1)}G`;
|
||||
}
|
||||
return `${Math.round(bytes / 2 ** 20)}M`;
|
||||
}
|
||||
|
||||
export function formatSeeders(seeders: number | null): string {
|
||||
return seeders === null ? "—" : String(seeders);
|
||||
}
|
||||
|
||||
export function ruleLabel(rule: string | null): string {
|
||||
if (rule === null) {
|
||||
return "unclassified";
|
||||
}
|
||||
return RULE_LABEL[rule] ?? rule.replaceAll("_", " ");
|
||||
}
|
||||
|
||||
/** The publish date as a calendar day; the exact instant is noise here. */
|
||||
export function formatPublishDate(date: string | null): string | null {
|
||||
if (date === null) {
|
||||
return null;
|
||||
}
|
||||
const day = date.slice(0, 10);
|
||||
return /^\d{4}-\d{2}-\d{2}$/.test(day) ? day : date;
|
||||
}
|
||||
|
||||
async function errorDetail(response: Response): Promise<string> {
|
||||
try {
|
||||
const body = (await response.json()) as { error?: string };
|
||||
return body.error ?? `http ${response.status}`;
|
||||
} catch {
|
||||
return `http ${response.status}`;
|
||||
}
|
||||
}
|
||||
@@ -629,6 +629,18 @@ body {
|
||||
border-color: oklch(from var(--verdict-eligible) l c h / 45%);
|
||||
}
|
||||
|
||||
/* the dashed border is the visible mark of a relaxed rule */
|
||||
.chip[data-verdict="waived"] {
|
||||
color: var(--verdict-waived);
|
||||
border-style: dashed;
|
||||
border-color: oklch(from var(--verdict-waived) l c h / 55%);
|
||||
}
|
||||
|
||||
/* rejected is the policy working, never fault red */
|
||||
.chip[data-verdict="rejected"] {
|
||||
color: var(--verdict-rejected);
|
||||
}
|
||||
|
||||
.chip[data-movie-state="imported"] {
|
||||
color: var(--ink);
|
||||
}
|
||||
@@ -745,6 +757,201 @@ body {
|
||||
color: var(--verdict-eligible);
|
||||
}
|
||||
|
||||
/* ---- release deck (§9.3) ---------------------------------------------- */
|
||||
|
||||
.releases-head {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--space-2) var(--space-3);
|
||||
margin: 0 0 var(--space-6);
|
||||
}
|
||||
|
||||
.releases-id {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
display: flex;
|
||||
align-items: baseline;
|
||||
gap: var(--space-2);
|
||||
}
|
||||
|
||||
.releases-title {
|
||||
margin: 0;
|
||||
font-family: var(--font-display);
|
||||
font-size: var(--text-lg);
|
||||
font-weight: 700;
|
||||
letter-spacing: 0.04em;
|
||||
line-height: 1.1;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
}
|
||||
|
||||
.releases-year {
|
||||
font-size: var(--text-xs);
|
||||
}
|
||||
|
||||
.bucket-head {
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.bucket-toggle {
|
||||
margin-left: auto;
|
||||
min-height: 2.75rem;
|
||||
padding: 0 var(--space-2);
|
||||
font-size: var(--text-xs);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.08em;
|
||||
color: var(--accent);
|
||||
background: none;
|
||||
border: 0;
|
||||
cursor: pointer;
|
||||
transition: color 150ms var(--ease-out);
|
||||
}
|
||||
|
||||
.bucket-toggle:hover {
|
||||
color: var(--accent-bright);
|
||||
}
|
||||
|
||||
/* fixed-width mono columns: chips and header labels share rem widths, so
|
||||
the pseudo-table survives font-size differences and flex wrapping alike */
|
||||
.cw {
|
||||
display: inline-block;
|
||||
flex: none;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
line-height: 1.25rem;
|
||||
}
|
||||
|
||||
.cw-score {
|
||||
width: 4.5rem;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.cw-res {
|
||||
width: 4rem;
|
||||
}
|
||||
|
||||
.cw-src {
|
||||
width: 4.5rem;
|
||||
}
|
||||
|
||||
.cw-hdr {
|
||||
width: 6rem;
|
||||
}
|
||||
|
||||
.cw-aud {
|
||||
width: 7.5rem;
|
||||
}
|
||||
|
||||
.cw-size {
|
||||
width: 4.5rem;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.cw-seed {
|
||||
width: 3.5rem;
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
.colhead {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--space-1);
|
||||
padding: var(--space-2) var(--space-1) 0;
|
||||
}
|
||||
|
||||
.colhead .cw {
|
||||
padding: 0 var(--space-2);
|
||||
border: 1px solid transparent;
|
||||
font-family: var(--font-readout);
|
||||
font-size: var(--text-2xs);
|
||||
text-transform: uppercase;
|
||||
letter-spacing: 0.04em;
|
||||
color: var(--ink-faint);
|
||||
}
|
||||
|
||||
.rel {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--space-1) var(--space-2);
|
||||
padding: var(--space-2) var(--space-1);
|
||||
border-bottom: 1px solid oklch(from var(--line) l c h / 45%);
|
||||
}
|
||||
|
||||
/* the whole line is the expand affordance; grab is its own control */
|
||||
.rel-line {
|
||||
flex: 1;
|
||||
min-width: 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
gap: var(--space-1);
|
||||
padding: 0;
|
||||
font: inherit;
|
||||
text-align: left;
|
||||
color: inherit;
|
||||
background: none;
|
||||
border: 0;
|
||||
border-radius: var(--radius);
|
||||
cursor: pointer;
|
||||
transition: background 150ms var(--ease-out);
|
||||
}
|
||||
|
||||
.rel-line:hover,
|
||||
.rel-line:focus-visible {
|
||||
background: var(--panel);
|
||||
}
|
||||
|
||||
/* §9.3: the release name is secondary — evidence, not the primary key */
|
||||
.rel-name {
|
||||
flex-basis: 100%;
|
||||
min-width: 0;
|
||||
overflow: hidden;
|
||||
white-space: nowrap;
|
||||
text-overflow: ellipsis;
|
||||
font-size: var(--text-xs);
|
||||
color: var(--ink-faint);
|
||||
}
|
||||
|
||||
.rel-none {
|
||||
padding: var(--space-2) var(--space-1);
|
||||
font-size: var(--text-xs);
|
||||
border-bottom: 1px solid oklch(from var(--line) l c h / 45%);
|
||||
}
|
||||
|
||||
.rel-note {
|
||||
font-size: var(--text-xs);
|
||||
color: var(--ink-muted);
|
||||
}
|
||||
|
||||
.rel-note[data-tone="fault"] {
|
||||
color: var(--signal-fault);
|
||||
}
|
||||
|
||||
.rel-full {
|
||||
flex-basis: 100%;
|
||||
padding: var(--space-2) var(--space-3);
|
||||
background: var(--panel);
|
||||
border: 1px solid var(--line);
|
||||
border-radius: var(--radius);
|
||||
box-shadow: inset 0 1px var(--highlight);
|
||||
}
|
||||
|
||||
.rel-raw {
|
||||
margin: 0;
|
||||
overflow-wrap: anywhere;
|
||||
font-size: var(--text-xs);
|
||||
color: var(--ink);
|
||||
}
|
||||
|
||||
.rel-meta {
|
||||
margin: var(--space-1) 0 0;
|
||||
font-size: var(--text-2xs);
|
||||
}
|
||||
|
||||
/* ---- manual intake ---------------------------------------------------- */
|
||||
|
||||
.intake .module-detail {
|
||||
@@ -779,6 +986,21 @@ body {
|
||||
flex-basis: 100%;
|
||||
}
|
||||
|
||||
.releases-id {
|
||||
order: -1;
|
||||
flex-basis: 100%;
|
||||
}
|
||||
|
||||
/* the row and the column header must wrap at the same width, so the
|
||||
grab control drops below the line instead of narrowing it */
|
||||
.rel-line {
|
||||
flex-basis: 100%;
|
||||
}
|
||||
|
||||
.rel-grab {
|
||||
margin-left: auto;
|
||||
}
|
||||
|
||||
.board {
|
||||
padding: var(--space-6) var(--space-4);
|
||||
}
|
||||
|
||||
Fixed in
fb7fe49— the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.Fixed in
fb7fe49— the release deck's Escape handler now runs in the capture phase and stops propagation, so one press steps releases → search deck → board one layer at a time. Verified with real key events in the browser.