# Return from authorization while the catalog rebuilds

This is a manual Resolve/Fusion construction for an editable Remotion study.
Two fictional content variants demonstrate one treatment. No native Resolve
execution, importable .drp, moving-source review or source-quality approval
is claimed. Illustrative account text does not assert real provider behavior.

## Native interval

Use1920×1080 at24000/1001 fps and exactly236 frames. Local0 is retained
source2466; local235 is2701. The half-open source extent is[2466,2702).
`source-timing.json` binds every actual native PTS at time base1/24000,
1001ticks per frame. The source film is research-only, not an active input.
There is no asserted equivalence to an absent historical source rendition.
Set the rate before editing and keep the output silent. Do not append a
confirmation hold: only the last three positions expose the final catalog.

The app leaves filtered connector results for a separate account browser.
After account choice, confirmation and permissions, eight blank callback
frames precede the returned app dialog. Continue remains for two frames.
Finishing clears the query; the catalog populates behind the dialog before
the dialog leaves. Background data must not depend on dialog visibility.

## Original content and type

Choose `inputs/default.json` or `inputs/adaptation.json`. Exact keys are
`theme`, `connector`, `provider`, `description`, `accountNames`,
`accountEmails`, `permissions`, and `otherTools`. Theme is meadow or harbor.
Names, emails and permission lines each contain exactly two strings;
otherTools contains six. The two accounts must be distinct. Connector and
other tool names must be unique. Preserve the first account and the same
connector identity throughout all stages; do not introduce another tool at
the ending. Only trimmed printable ASCII without markup is accepted.

The bundled licensed Geist font is loaded before measuring actual widths.
`TEXT` and `limits` in `src/model.ts` give the string caps and pixel budgets.
Connector is34px/weight400 with425px budget; provider17px/500 with550px;
description14px/400 with265px; account names18px/500 and emails15px/400 with
335px each; permission lines16px/400 with425px; other tool names17px/500
with250px. Composite confirmation and connection headings are also measured.
The browser rejects overflow without wrapping or shrinking. Calibrate Text+
against raster samples; normalized Resolve font size is not CSS pixel size.

Four original SVGs have a byte-reproducible generator at
`scripts/build-art.py`: two desktop fields and two illustrated insets.
Their primitive trees are in `docs/asset-construction.json`. UI, icons,
pointer, text and browser/dialog construction remain live in `src/Scene.tsx`.
The connector mark is the same green geometric mark at every stage. Other
marks are fictional colored shapes, not source service identities. No source
portrait, branding, screenshots or production footage is an adaptation asset.

## Coordinate and layer construction

All positions below are1920×1080 top-left pixels. For a rectangle(x,y,w,h),
normalized Center=((x+w/2)/1920,1-(y+h/2)/1080); normalized width=w/1920 and
height=h/1080. Keep full-raster transparent group canvases for stable pivots.
Build separate Desktop, App, Browser, app Scrim, ConnectionDialog, Inset and
Pointer groups. Inset and Pointer are screen-space and never inherit app zoom.

| Group | Geometry and content |
| --- | --- |
| Desktop |Original full-raster gradient/path SVG.|
| App window |(60,34),1800×1008,20px corners;242px sidebar inside.|
| App title/search |Plugins at(735,151); helper at(735,198); search(735,239),820×40.|
| Filtered catalog |Public at(735,310); row origin(735,369);376×70 cards;415px column and91px row spacing.|
| Populated catalog |Installed at(735,304); seven38px marks begin(735,343),98px spacing. Public at429; rows begin477.|
| Browser window |(60,34),1800×1008;51px topbar,45px left strip; pale original browser colors.|
| Browser card |Window-relative(445,299),980×392; permissions height535.|
| Browser header |52px tall; geometric connector mark plus provider text.|
| Browser left block |Card-relative(35,85)mark; title(35,137),425px wide,34px/42px leading.|
| Account chooser |Two rows at card+(506,99+73*index),430×65, avatar/name/email; separate Use another account.|
| Confirmation |Same account in a held pill at card+(36,246),386×36; right explanatory copy at(510,106).|
| Permissions |Account pill at(36,282); two example scopes at(510,106); original disclaimer, Cancel/Allow at card bottom.|
| Working wash |White over the card, opacity0.63;4px progress line begins at card+(18,0).|
| Callback |No card; spinner at browser-relative(916,512),26×26.|
| Scrim |App window rectangle(60,34),1800×1008,18% dark overlay. Only200–232.|
| Connection dialog |(720,285),456×530; two original marks, held explanatory text, action at+(24,483),408×31.|
| Inset |(1512,104),286×366; original illustration and independent opacity.|
| Pointer |pointerX,pointerY;25×32 original arrow path.|

In the initial app-only interval0–56, transform App around its top-left raster
pivot: scale1.5, then translate(−720,−60). On return, App uses scale1 and
translation(0,0). This is a cut, not a continuous camera animation. A point
maps to(appX+appScale*x,appY+appScale*y). Browser, Inset, Pointer, Scrim and
ConnectionDialog do not inherit this transform.

Within App, catalogMode0 is the filtered list, mode1 the sparse header, mode2
the full list. The search text uses `searchVisible`; the Installed strip uses
`installedVisible`. Keep these controls separate from `dialogVisible`.
The first connector loses its Install action once the full catalog appears;
the other sample tools retain their own buttons. These are drawn states, not
functional authorization or permission logic.

## Exact frame schedule

Regenerate `docs/controls.csv` with
`node --experimental-strip-types scripts/controls.mjs`. It contains a value
for every native frame and every named control. If manually keying Fusion,
key consecutive numeric values at each frame with linear interpolation;
hold all categorical, boolean and string switches. This is not a tested
CSV-import workflow or an automatic Fusion macro.

| Local interval/gate | Visible state |
| --- | --- |
|0–42|Filtered result with Install; no app connection dialog.|
|43–56|Same result with Loading and small rotating spinner.|
|57–116|Cut to separate account browser and two-account chooser.|
|72 onward|Authored highlighted first account row.|
|87–116|Washed chooser and progress line; chosen within sampled source support.|
|117–146|Signing-back-in confirmation; Cancel/Continue. Wash from143.|
|147–191|Permissions and explicit Cancel/Allow. Wash from186.|
|188–198|Independent inset fade; gone by198.|
|192–199|Exactly eight blank callback-spinner frames. No card or app dialog.|
|200–201|App returns with dimmed filtered catalog and dialog showing Continue.|
|202–204|Action becomes Finishing connection; background search clears to sparse header.|
|205–232|Installed strip and wider catalog populate while the same dialog remains.|
|233–235|Dialog and scrim gone; installed connector exposed for three frames.|

The spinner rotates by frame*22degrees. Progress width and pointer paths are
authored fits; read the per-frame CSV rather than estimating easing. Fine
source camera movement, exact typography/materials and provider-specific
layout are not recovered. The native gate order and callback duration are
observed; user action/down times inside sparse brackets are not asserted.

## Verify and export

Inspect42/43,56/57,116/117,146/147,191/192,199/200,201/202,204/205 and232/233.
Continue must survive200 and201. At205 the Installed marks must already be
present behind the scrim while the foreground still says Finishing connection.
At233 the same background remains after the overlay leaves. Do not show a
pre-authorization app dialog, wait for dismissal before populating, add a
success receipt, or include the next film's second-connector search.

Check both content variants for exact stage ownership, readable fitted copy
and original identity continuity. Export silent H.264 MP4,1920×1080,
24000/1001,236 frames. Confirm frame count and encoded native PTS afterward.
Source-quality, moving comparison and native Resolve approval remain open.
