# Refresh a preview after its completion message

This is a manual construction guide for the original editable study, not an
executed Resolve project. Both page previews are Remotion exports. Source-quality,
independent moving-review and native Resolve approvals are absent.

## Native timeline

Create a1920×1080 composition at exactly24000/1001 fps,93 frames long. Local
frames0–92 correspond to source E3dDr_QtBuo[395,488). Duration is3.878875 seconds.
Use the23.976 preset only if the resulting clock is24000/1001; do not use24fps,
optical flow, frame blending, a dissolve, or added handles. Use no audio track.
The attribution/timing records are in source-observations.json and source-timing.json.

Read every row of controls.csv on this same local clock. Visibility values are
held gates, not fades. Numeric camera/pointer/fade values are already sampled
from src/model.ts; transfer those samples rather than using Fusion Auto splines.
All geometry below uses top-left pixel coordinates before the camera transform.

## Build order and domains

Use a1920×1080 transparent working domain. Build DesktopField separately; it
does not follow the camera. Build Workspace, Presenter and Pointer as a second
transparent group, in that order, then apply Camera once to their combined image.
Normal-Over merge that result onto DesktopField. Crop the final result to1920×1080.

Inside Workspace use a1760×1000 transparent domain and a28px rounded mask. Child
coordinates in the next table are local to Workspace. Clip the entire merged
workspace to that mask before placing it at(100,40) in the working domain.
Do not clip Presenter or Pointer to the workspace: they are separate siblings.

| Layer, back to front | Rectangle x,y,w,h | Construction |
|---|---|---|
| Workspace base |0,0,1760,1000|Fill `#f3f5f2`;28px corners|
| Browser chrome |0,0,1760,64|White;1px bottom rule `#e0e6e2`|
| Conversation |0,64,550,936|White;1px right rule;clip its children|
| Preview field |550,64,1210,936|Fill `#f3f5f2`, remains at every frame|
| Document name bar |550,64,1210,62|White;previewVisible gate|
| Document paper |578,150,1150,1450|White;1px `#e0e6e2`;previewVisible gate|
| Preparing label |1065,514,360,32|18px,400,`#aeb9b2`;preparingVisible gate|
| Refresh pill |1040,129,220,40|Fill `#239edd`,24px radius;refreshVisible gate|

For a Rectangle/Ellipse mask in a W×H domain, a pixel box(x,y,w,h) maps to center
((x+w/2)/W,1-(y+h/2)/H) and normalized size(w/W,h/H). Polygon coordinates use
(x/W,1-y/H). Keep exact dimensions and clipping order; a larger document domain
does not change the workspace's own crop. Give colors normal alpha and use
Normal Over, not Screen blending or a black key.

Add the browser circles at(32,31),(60,31),(88,31),radius9, in `#ed9b8a`,
`#e8c67d`,`#83b79c`. Rebuild the small fourth glyph from Scene.tsx's path.
The selected tab is(552,10,372,45),12px corners,`#eef2ed`. Its title and the two
neighboring titles use the positions/font sizes in Scene.tsx. These are fictional
document-app labels, not source product chrome or a current product demonstration.

## Document typography and unchanged copy

Install the bundled Geist font and retain its license. Use Text+ for every line;
do not bake the page into an image. Content comes from inputs/default.json or
inputs/adaptation.json. Use one copy of the document content across the reload.
There is no separate after-result, data change, progress badge or version increment.

The document text positions below are local to Document paper. Ink is `#202a29`.
Line spacing is explicit; no wrapping, automatic text fitting or type shrinking.

| Text |x,y,width|Size / weight / line spacing|
|---|---|---|
| title |132,110,900|44 /650 /58|
| fixed draft metadata |132,181,900|20 /550 /32|
| purpose, two lines |132,246,900|22 /400 /32|
| Story heading |132,332,900|32 /650 /44|
| steps, eight lines |154,389,880|22 /400 /32|
| Audience and outcome heading |132,686,900|32 /650 /44|
| audience, two lines |132,741,900|22 /400 /32|
| Messaging heading |132,841,900|32 /650 /44|
| message, two lines |132,896,900|22 /400 /32|

The plan-note divider is at(132,1006),885px wide,2px `#dfe6e1`; its text has24px
top padding and20px size. It is mostly outside the selected camera view but stays
in the editable document. The name bar uses filename at(578,78),22px/500,710px
budget, and DOC at(1330,79),21px/400 in `#84918d`.

Text+ normalized font Size, variable weight and baseline require calibration
against the native reference outputs. Match the listed pixel metrics and actual
line advances; report a font-instance limitation rather than silently changing
weight or fitting type. Browser rendering checks full content widths before
encoding; character-count validation alone is not permission to overflow.

## Conversation layers

Conversation children use its550×936 domain. The working group is visible on
[0,14); the completed group on[14,93). The common composer remains at(22,862),
504×154,23px corners,white with a1px `#dfe6e1` border; it is intentionally clipped
by the conversation domain. Rebuild its placeholder and plus/up controls from
the live text in Scene.tsx. Do not add typed input or a sent request.

The working group has its status at(25,32),21px in `#84918d`, three23px body lines
at(25,105), three22px checklist rows at(25,264),49px spacing, and a22px preparing
sentence at(25,470). Use the exact fixed strings in Conversation in Scene.tsx.

The completed group has a378×57 bubble at(146,24),19px corners,`#f0f3f0`; its
fixed line is22px. Add the earlier-status line(25,148),21px; a501px rule at(24,184);
the22px file-open line at(25,216); and a420×128 request bubble at(105,293),20px
corners,`#f1f4f1`. Its three request lines start(123,307),23px/400 with31px spacing
and384px width budget. The completed status is at(25,495),21px; the next rule
at(24,535); six response lines at(25,562),23px/400 with32px spacing and485px
budget; then the18px utility labels at(25,780). Rules are `#e8ece9`.

Keep this completed group unchanged across local53,54,55. The preview's
one-frame blank is not a blank of the conversation or the entire window.

## Original vector assets and foreground

Four SVGs supply two desktop fields and two still presenter illustrations. Their
original generating parameters and paths are in scripts/build-art.py; the full
primitive trees and hashes are in asset-construction.json. They contain no
source photographs, embedded raster, source branding or external image URLs.

Recreate each SVG with native Background, Rectangle/Ellipse/Polygon masks and
gradients. Preserve the listed viewBox, path control points, fill/stroke widths,
cap styles and alpha. For desktop-field gradients use the SVG bounding-box
coordinates; merge its translucent curves and light ellipse over the base.
The presenter is a still vector figure behind a laptop, not a replacement
talking-head recording or a speaking/synthesized performer. No mouth animation
or voice is supplied.

Place DesktopField across the1920×1080 final frame. Place Presenter at working
coordinates(1350,130),225×288,14px corners; multiply its final alpha by
presenterOpacity. The default uses meadow art, the adaptation harbor art. Neither
theme is a different motion example.

Build Pointer in a43×57 local domain from the path `M3 3v43l12-12 8 18 8-4-9-17 17-1Z`,
fill `#202826`,white3px stroke with round joins. Place its top-left at pointerX,
pointerY and gate pointerVisible. The pointer is inside Camera but above both
Workspace and Presenter. No click ripple, mouse-down indicator or click sound.

Rebuild the pill's small refresh arrow from Scene.tsx. Label it Refresh preview
in17px white with the separate19px close glyph and translucent separator. The
original render uses soft shadows: workspace(0,14,70,`#04141945`),presenter
(0,5,18,`#19312124`),paper(0,4,16,`#233b2310`),pill(0,2,6,`#1783b824`),pointer
(0,2,2,black25%). Use separate blurred-alpha/shadow merges behind each object.
CSS blur kernels and native Fusion blur differ; calibrate and record that
unverified difference rather than claiming a native matching render.

## Gates and camera

| Local frame |Required state|
|---|---|
|0–5|Working conversation, document present, no refresh pill|
|6|Refresh pill appears over the existing preview|
|8–17|Authored presenter fade; fully absent at17|
|14|Completed conversation replaces working text; document/pill stay|
|28|Pointer enters the authored path|
|53|Completed conversation, document/name bar and pill are all present|
|54|Only preview/name bar/pill clear; Preparing preview label appears|
|55|Identical document/name bar restore; pill never returns|
|56–75|Common workspace/presenter/pointer camera releases outward|
|75–92|Wide context holds; pointer finishes its path|

Camera is a top-left-origin mapping of the entire foreground group:
Xout=cameraX+cameraScale×Xin;Yout=cameraY+cameraScale×Yin. It is1.28 at(−66,−41)
through55 and1 at(0,0) from75. Use the complete samples in controls.csv. Check a
known corner with the mapping before keying: at local0,working point(100,40)
must land at(62,10.2). At75 the same point lands at(100,40). Adjust native
Transform pivot/center conventions until both mappings hold; do not apply the
scale to each nested child again. DesktopField remains fixed behind this group.

The source directly establishes refresh arrival at400/401, the preview clear at
448/449 and restoration at449/450. The completed response is bracketed by407–409;
local14 is an authored selection within that bracket. Pointer/fade/camera curves
and UI geometry are authored approximations. This is not product latency data.

## Verification before reuse

Check local5/6,13/14,53/54/55 and75/92 at native scale. Verify that there is
exactly one blank preview frame, that the response never clears, and that all
document copy is identical before/after. Check both content variants for actual
font fit. Export93 silent H.264 frames without retiming, then verify24000/1001
cadence and compare the moving output against the reference. Rendering, pixel
masks and this manual guide do not replace native Resolve or source-quality review.
