2e9fa45580
Deploy / deploy (push) Successful in 3m31s
Renders run 8 frames past the cut at each end. Directors were flagging glitches in unfixed handles as shot problems, so the player now marks them — without trimming or burning anything into the EXRs/MOV/MP4. - Version.handleHead/handleTail/pictureStartFrame, Export.handleHead/ handleTail; migration backfills pipeline exports and their preview versions from the manifest's handleFrames (else 8) - AE panel: "Includes handles [8] frames each end" -> manifest.review; older manifests fall back to source.handleFrames - finalize copies handles onto the Version; worker 1.6.4 reports the head slate length (pictureStartSeconds), else the player infers it as MP4 frames - EXR frameCount - Player: hatched HANDLE / SLATE regions and cut marks on the timeline, "HEAD/TAIL HANDLE · NOT IN EDIT" overlay on handle frames, HANDLE badge on notes, "Edit range only" toggle (default on in the client portal) - Staff Handles editor on the review page for manual uploads/corrections Also fixes two player bugs found while testing: timeToFrame floored float error (every seek landed a frame early), and J/reverse never ran (the keyboard effect's cleanup stopped it on the next render). Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
27 lines
1.0 KiB
TypeScript
27 lines
1.0 KiB
TypeScript
"use client";
|
|
|
|
import type { FrameRegion } from "@/lib/handles";
|
|
|
|
/**
|
|
* Flags a handle frame on the picture: an amber frame round the player and a
|
|
* "HANDLE · NOT IN EDIT" tag. Shown only while the playhead is in a handle so
|
|
* a reviewer can't mistake a glitch there for a problem in the cut.
|
|
*
|
|
* Purely a viewing aid over the player — it never reaches the media, passes
|
|
* every pointer event through, and sits outside the zoom layer so it stays
|
|
* readable at any zoom.
|
|
*/
|
|
export function HandleOverlay({ region }: { region: FrameRegion }) {
|
|
if (region !== "head" && region !== "tail") return null;
|
|
return (
|
|
<div
|
|
className="pointer-events-none absolute inset-0 ring-4 ring-inset ring-amber-400/80"
|
|
data-testid="handle-overlay"
|
|
>
|
|
<div className="absolute left-1/2 top-3 -translate-x-1/2 whitespace-nowrap rounded bg-amber-400 px-2.5 py-1 font-mono text-[11px] font-bold tracking-wide text-black shadow">
|
|
{region === "head" ? "HEAD" : "TAIL"} HANDLE · NOT IN EDIT
|
|
</div>
|
|
</div>
|
|
);
|
|
}
|