# Exchange tool surfaces beneath a continuing live note

This is a manual Fusion construction recipe for one source-grounded study.
No native project, import macro or verified Resolve execution is included.
Two actual Remotion exports accompany the kit; they do not prove a Resolve
match. Read the review limits and source-timing ledger before adapting it.

## Clock and scope

Create a 1920×1080 square-pixel composition at **24000/1001 fps** (normally
displayed as23.976), Global Start0 and Global End211. Do not substitute24fps.
No audio tracks. Local frame = source frame −2101. Source interval [2101,2313)
contains212 positions; local211 is the last included picture. End before the
source's separate live-action cut at2313. No closing fade or invented result.

Use the per-frame values in `controls.csv` as a construction table, not an
importable animation format. The CSV is regenerated from `src/model.ts` and
has one row per local frame. Numeric keys and the text-prefix rules below are
authoring controls. Actual decoder PTS are in `source-timing.json`, separately.

The source has a query/result surface, a lateral exchange into a reading
placeholder and a note that continues across that exchange. The note's later
fade onset is only bracketed. All curves, note character schedules, palettes,
font sizes, artwork and geometry here are authored. Do not report them as
official film measurements or current product behavior.

## Layer ownership

Build full-canvas transparent branches and combine them with Merge nodes over
a white Background. The required order, back to front, is:

1. White canvas, fixed task heading and three-dot ornament.
2. Rounded task frame and original gradient field.
3. Search and reader branches inside the same tool-viewport mask.
4. Note shadow, white note shell and its independently clipped text.
5. Pointer above the note; fixed live transport above the field.

The note and pointer are siblings of the tool viewport, never children of the
search or reader transform. Do not move the heading, live controls or whole
frame during the inner exchange. Keep source imagery out of every branch.

Coordinates below are top-left pixels. For a full-canvas Rectangle at(x,y,w,h),
use Center((x+w/2)/1920, 1−(y+h/2)/1080), Width=w/1920, Height=h/1080. A pixel
translation(dx,dy) changes normalized center by(dx/1920,−dy/1080). Apply each
translation once. Nested local coordinates must first add parent origins.
Draw local branches on full-canvas transparent images before these conversions;
cropped-image domains may otherwise change normalized coordinate meaning.

Use Rectangle/rounded-rectangle masks for panels and clipping, Polygon paths
for the pointer and identity marks, Ellipse masks for circles and gradient
fields, and Text+ for live copy. Recreate the SVG primitives manually; no SVG
import compatibility is claimed. The official Fusion manual reference is a
retained conceptual reference, not a current-version UI audit.

## Geometry and original artwork

Canvas ink is#25312d. All copy uses the bundled licensed Geist font. The task
heading starts(442,77), budget945px, size32, weight400. Place three2.5px circles
at global(1438,94),(1448,94),(1458,94). Do not scale text during panel motion.

Task frame=(442,126,1038,826), radius16, clipped. All coordinates in the next
three sections are relative to this frame. The gradient field is1070×858 at
(−16+driftX,−16+driftY); clip to the outer frame. Its two authored paths are
listed in `build-art.py`. Reconstruct three radial color fields: a full base
gradient, deep-color ellipses at(185,70),radii220×210 and(890,705),radii290×270,
plus a warm ellipse at(350,570),radii310×290. Deep opacity falls.8→0 and warm
.5→0. Garden colors are#81bfad/#b2dacc/#4b947d/#e9c791; Studio uses
#aca0d2/#d6c9e9/#7060a4/#ebc3a0. The first two are base/light.

The provided64×64 identity SVG is a rounded64×64 square,radius19, deep fill,
with an original white4px path. Garden uses the leaf path and Studio the
divided-window path from `build-art.py`. At result rows scale it to21×21; in
the reader use48×48. There are no source logos or embedded rasters.

## Search, stale rows and fresh results

The common tool viewport is(0,0,1038,750), clipped. Search panel is
(searchX,68,904,642), radius14, white. Header84px with a1px#edf0ee lower rule.
Place the25×26 search icon at(30,31) within the panel. Query text starts(62,26),
size26, fixed824px budget. Show the first floor(length×queryProgress) characters.
queryProgress=clamp((frame+1)/26), reaching1 at25. This is authored typing.

Each result starts(28,110+110×rowIndex), 846×92. Its identity is at(0,0), provider
text at(31,0), size17,#71817a,800px budget; title at(0,31), size25,824px budget.
Keep five stale and five fresh rows in separate branches at these same slots.
The scrollbar is(887,90,11,390),radius6,#edf0ee.

For row index0..4, stale alpha=1−smooth((frame−2×index)/3). All old rows are
gone at11. Fresh alpha is0 before26+2×index; then.15+.85×smooth((frame−26−
2×index)/3). All five are fully present at37. There is an empty body from11
through25. Do not merge this gap with the later reader transition.

## Tool exchange and reader

toolProgress is0 through73. Its authored smoothstep anchors are
(74,.08),(76,.45),(78,.76),(82,.96),(88,1); hold1 afterwards. Smoothstep between
each pair is p²(3−2p), clamped0..1. SearchX=68−1100×progress.
ReaderX=1100−1072×progress. Thus the search is fully outside the mask when
the reader finishes atX28. Keep both branches visible during travel; this is
not a dissolve, a full-frame camera move or a user-dragged window.

Reader=(readerX,28,982,724),radius13,fill#818983. Header=(0,0,982,46),#f3f5f3,
with centered size20#69756d label. White paper=(54,100,874,700),radius20,
clipped by the reader. Center a size21 reading-mode label at paperY18.

Skeleton bars live at paper(27,55). Use#f4f6f4, generally radius14:

| x | y | width | height |
| --- | --- | --- | --- |
| 0 | 0 | 820 | 48 |
| 0 | 66 | 142 | 140 |
| 166 | 66 | 642 | 33 |
| 166 | 120 | 590 | 33 |
| 166 | 174 | 650 | 33 |
| 0 | 232 | 780 | 33 |
| 0 | 288 | 718 | 33 |
| 0 | 344 | 790 | 33 |
| 0 | 400 | 820 | 33 |
| 0 | 456 | 740 | 33 |
| 0 | 512 | 790 | 33 |

The142×140 block uses radius4. Put the48×48 mark at paper(413,242). Provider
is centered in paper(37,315,800),size30,weight500. Title is centered in
paper(37,371,800),size22,line28. Initially use the first fresh result's title;
at178 replace it with the two canonical readerTitleLines. The first provider
stays the same. Preserve this title change: the source does not establish
an unchanged title. The skeleton never turns into a resolved article.

## Independent foreground note

The note shell starts at frame-local(480,376),width540,radius14,white,1px
#e9ede9 border. Keep this position through the tool exchange. Text begins
(16,16) inside the note, size22,line33,504px budget. Clip text to an inset viewport at(16,16,504,noteHeight−32),
then apply its own vertical scroll inside that mask. The16px padding remains
empty; clipping at the shell edge would leave fragments of retired lines. The shell itself must
not inherit the scrolling offset. Shadow is a separate black-green branch,
approximately18px lower with28px blur and.13 alpha; Resolve blur units must
be judged visually, not assumed numerically equivalent to CSS pixels.

For each of the nine explicit old-note lines, show a prefix with progress
clamp((frame−start)/(end−start)). Use these authored intervals:

| Line | Start | End |
| --- | --- | --- |
| 0 | −25 | −1 |
| 1 | −5 | 25 |
| 2 | 26 | 59 |
| 3 | 60 | 81 |
| 4 | 82 | 104 |
| 5 | 105 | 123 |
| 6 | 124 | 143 |
| 7 | 144 | 155 |
| 8 | 156 | 164 |

At local0 one full line and a partial second line already exist. Never add a
fresh note entrance. For starts82,105,124,144,156, add one33px upward scroll
over four frames using smoothstep. Sum those five contributions. At160 the
offset is−165px, leaving the newest four lines. Do not scroll the reader.

Old note shell-height anchors: (0,98),(25,98),(30,131),(59,131),(64,164),
(165,164),(173,65). Interpolate smoothly; the top stays fixed. Text alpha is1
through165, then1−smooth((frame−165)/5), zero at170. That fade is chosen within
the source's inspected bracket, not measured frame-perfectly. The shell stays
visible and contracts while the text clears. Do not remove the whole card.

At174 select the two newNoteLines, reset text scroll to0, restore text alpha1.
Their prefix progress is clamp((frame−173)/25) and clamp((frame−197)/14).
New shell-height anchors are(174,65),(197,65),(198,66),(202,98). Keep the new
text independent of the title change at178. This late restart is not part of
the tool exchange at74. taskComplete stays0 at every included frame.

## Pointer, transport and fixed regions

Pointer coordinates and field drift are exported in the CSV. PointerX uses
(0,630),(45,624),(73,629),(88,631),(155,630),(211,630). PointerY uses
(0,345),(60,343),(88,348),(155,347),(211,346). Smoothstep each segment. Place
the30×34 pointer box at(pointerX−12,pointerY−6), use pathM3,2 L27,12 L16,17
L12,30 Z, fill#17251e, white3px outline. It has no click-scale animation.

Field driftX anchors:(0,−6),(105,5),(211,−2); driftY:(0,−3),(120,5),(211,1).
The background drift does not move the task, tool mask or live transport.
Transport SVG begins(27,782): two5px round-capped pause strokes atx4/12,
y7..20, a5px white line from(38,14)to(922,14), and9px circle at(922,14).
The LIVE label is at(970,782),size21,white. These are illustrative controls,
not a playback widget wired to real work.

## Adaptation and verification

Use one complete Garden or Studio JSON record. Keep five old/five new results,
nine old-note/two new-note lines and two canonical title lines. Do not paste
source UI or narration into either variant. Use Text+ per explicit line; never
silently wrap or shrink. Browser-font budgets are task945 at32; query824 at26;
provider800 at17; result824 at25; note504 at22; reader provider770 at30;
reader title800 at22. Recheck the actual Resolve font metrics separately.

Check local0,11,25/26,37,73/74,78,88,124,165/170/173/174,178 and211. Verify
the query/result gap, overlapping lateral exchange, continuing note clock,
held task frame, late note reset and unfinished ending. Compare the actual
exports with the separately attributed source excerpt at native cadence.
Model tests, selected pixel regions, hash checks, browser playback and sampled
stills are not independent moving or source-quality approval. Native Resolve
rendering and comparison remain outstanding.
