# Sequencer Timeline Editor UI

Task: `TODOS.phase-72.72.15.2.1`

The sequencer timeline editor UI is represented by a `V2Editor`
TimelineVisualizer widget spec and a deterministic layout model. The model is
built from `FV2SequencerSequenceSpec` so editor widgets can render the same
horizontal timeline, playhead, zoom, scroll, and track headers that automation
validates.

## Runtime API

- Widget spec: `FV2SequencerTimelineEditorWidgetSpec`
- Viewport spec: `FV2SequencerTimelineEditorViewportSpec`
- Track header: `FV2SequencerTimelineTrackHeaderSpec`
- Row model: `FV2SequencerTimelineTrackRowModel`
- Layout model: `FV2SequencerTimelineEditorModel`
- Issue enum: `EV2SequencerTimelineEditorIssueType`

`BuildSequencerTimelineEditorWidgetSpec` targets the `TimelineVisualizer`
surface and requires a horizontal timeline, frame ruler, keyframe lanes, track
headers, playhead, zoom, and horizontal scroll support.
`BuildSequencerTimelineEditorViewportSpec` captures the current frame, zoom in
pixels per frame, scroll frame offset, visible frame count, header width, row
height, and timeline width.

## Layout Behavior

`BuildSequencerTimelineEditorModel` converts sequence tracks into stable track
headers and rows. It computes:

- visible frame window from `ScrollFrameOffset` and `VisibleFrameCount`;
- `PlayheadX` from `HeaderWidth + (CurrentFrame - VisibleStartFrame) * Zoom`;
- `bPlayheadVisible` for scroll windows that include the current frame;
- track header labels, row index, binding id, muted/locked state, and color
  tokens;
- visible keyframe frames for property, camera, event, audio, animation, and
  rail/cut rows.

The default fixture uses `Seq.DataModel.CouncilIntro` at frame `60`, zoom `4`,
visible frames `0-120`, and playhead X `460`.

## QA Inventory

- Horizontal timeline: widget spec and model require `bHorizontalTimeline`.
- Playhead: default model computes a visible playhead at `460`.
- Zoom: changing zoom from `4` to `8` changes playhead X from `460` to `700`.
- Scroll: visible frame window `90-150` keeps frame `150` visible.
- Track headers: three headers are generated for the default sequencer data
  model.
- Off-path: empty tracks report missing headers, invalid zoom reports
  `InvalidZoom`, and scrolling away from the playhead stays valid while marking
  `bPlayheadVisible=false`.

`js_repl` Playwright interaction was unavailable in this session and the
affected surface is Unreal editor data rather than browser-rendered UI, so
verification is through UE editor automation and contract gates.

## Verification

- `python3 V2/ue/Tools/check-v2-sequencer-timeline-editor.py`
- `V2.Editor.Sequencer.TimelineEditor`
- `python3 V2/ue/Tools/check-v2-editor-module.py`
- `python3 V2/ue/Tools/check-v2-ci-workflow.py`
