# Leave the editor through an action, dim and viewer handoff

**Draft manual construction guide. Moving-source fidelity and native Resolve
execution remain unverified.** Two original content variants form one example.

## Source and composition

Official film `jC0i_0wnly8`, selected native interval
[3000,3300),
60/1 fps. Use a silent 1920×1080 square-pixel
composition containing local frames 0–299. Exact duration:
300/60 seconds
(5.000000 s).
Source ordinal = 3000 + local frame. No frame-rate rounding,
extra opening pause, closing hold or narration belongs to this study.

The comparison is a retained, hash-bound 960×540 research excerpt. Preserved
native metadata and PTS ledgers bind its clock; the historical full master is
absent, so this is not a fresh full-master decode. Samples informed the build.
Intermediate paths and measured-looking coordinates below are authored
reconstruction controls, not official product timing, latency or design tokens.

## Setup and common coordinate rules

Verify the unmodified kit with `python3 verify_package.py`, then follow
`project/README.md`. Choose either input JSON content set. Install the bundled
licensed Geist font for Text+, and calibrate pixels, weight, tracking and
baselines against the supplied MP4; a font name alone does not guarantee parity.

Regenerate `docs/controls.csv` with
`node --experimental-strip-types scripts/controls.mjs`. Each row includes the
local frame, source ordinal and exact sampled controls. Fusion global frame =
composition start + CSV frame. Coordinates here use pixels from top-left, Y
down. For a point in normalized Fusion image coordinates, X=pixelX/1920 and
Y=1−pixelY/1080; convert top-left rectangles through their centers. Check the
installed tool's coordinate direction instead of assuming CSS and Fusion match.
Parent transforms apply after local transforms. A uniform pivoted transform is
pivot + scale×(point−pivot), followed by the stated translation. Convert angles
to your tool's convention. CSS rotations are clockwise in this Y-down space.

Continuous controls use the CSV per-frame values, not an unspecified default
spline. Held gates, text prefixes, colors and row indexes use stepped keys.
Smoothstep is t²(3−2t), with t clamped to [0,1]; linear progress is clamped t.
Rectangle masks need pixel-correct width and height; normalized X/Y values are
not interchangeable on a non-square raster. Match opacity, clipping and layer
order before attempting a moving comparison.

## Editor pullback, action push and viewer cut

Create the original editor as editable layers: a dark window at (32,20),
1856×1000, a portrait preview panel at window-local (608,50), 610×745, the
landscape study at panel-local (0,190), 610×344, and a bottom filmstrip at
window-local (22,814), 1810×123. The footer tool strip sits at window-local
(400,937), 888×63. Keep the Create affordance at the right of that strip.

The original landscape is vector artwork: layered hills, sun and an articulated
small traveller. `src/Scene.tsx` contains its complete SVG geometry in a 960×540
coordinate system. Rebuild those filled/stroked paths with Fusion shapes or
individual SVG layers. There is no licensed source robot/movie input. The
filmstrip is repeated original geometry, not recovered timeline thumbnails.

### Camera and action

- Apply the later push first: pivot (1230,984), uniform `pushScale`, then screen
  translation (`pushX`,`pushY`). Put the result inside an early camera group
  scaled by `introScale` around (960,540). That early scale falls 1.2→1 over
  0–36, then holds. These nested transform orders are not interchangeable.
- The original pointer moves (950,840)→(1230,984) over 30–60, then holds over
  the action region. This is an authored path, not a measured click coordinate.
- The action push runs 110–168: scale 1→1.9, X 0→−270, Y 0→−100. Use the CSV
  per-frame values. `cameraBlur` is a 0→5→0-pixel Gaussian approximation,
  not reconstructed shutter/motion blur; calibrate Fusion's blur units.
- At 218, set editorDim to .47 with a held key. Merge a black overlay inside
  the editor, then the spinner at window-local (893,507), size 54. Rotate its
  incomplete circle by `spinnerAngle`. Do not interpolate the dim gate.
- At 278, hard-switch `outputMode` to a separate dark CLIP VIEWER. Keep the
  viewer's header, title and lower playback controls; the source does not
  become a clean, chrome-free movie. Stop showing the old editor.

### Moving result

The viewer is at (40,24), 1840×1032. Its landscape viewport is viewer-local
(220,130), 1400×788; fit the 960×540 geometry with a centered cover crop. Use
`viewerScale` 1.18→1 and `viewerX` −160→0 over 278–299, with the local pivot
(960,540). The footer stays part of this reframing viewer.

For the traveller, let phase=`walkPhase` radians and stride=28×sin(phase)
degrees. The body group translates to (480+22×sin(phase/2),
337−6×abs(sin(phase))) in landscape pixels. Rotate the two leg paths by stride
and −stride around that group origin. Rotate arms by −.65×stride around
(−41,−43) and +.65×stride around (41,−43). Other body parts remain with the
body transform. The shadow X follows the body's X. The editor preview holds
phase zero; only the viewer advances phase. Stop after 299, with no invented
completion banner, export confirmation or further action.

This preserves an editor→action→dim→viewer structure. Exact product chrome,
source imagery, optical blur, pointer behavior and camera tracking differ.
The short original animated subject is not a recreation of the source film.


## Verification boundary

Inspect both actual exports at their native cadence, including entry/exit,
hard gates, layering, width, masks and holds. Shipped code checks font loading
and selected text-width budgets before rendering; it rejects oversized copy
instead of silently shrinking it. This is not arbitrary-input readability
approval or a guarantee that an independent Text+ rebuild fits.

The kit contains editable original geometry, fixtures, controls and tests;
source screenshots/movies are not renderer inputs. Native .drp execution,
tested Resolve import, independent moving-source review and source-quality
approval are not included. Existing matching pinned dependencies were used,
not a clean dependency install. A modified input needs a new render and review.
