Download complete editable project · Read review limits
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:
- White canvas, fixed task heading and three-dot ornament.
- Rounded task frame and original gradient field.
- Search and reader branches inside the same tool-viewport mask.
- Note shadow, white note shell and its independently clipped text.
- 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.