# Grow a continuing prompt around inline references

**Manual DaVinci Resolve / Fusion construction guide. Review open.**
No native project, import macro or verified Resolve execution is included.
Both Original and Adaptation previews are actual silent Remotion exports.
Source-quality, independent moving review and native application parity remain
unverified. Two content variants count as one editing example.

## Native clock

Create a1920×1080 progressive, square-pixel composition with104 frames, local
0..103, at exact24000/1001fps. Duration is104104/24000seconds. If the installed
Resolve setup cannot retain that cadence, stop and resolve the setup rather
than round to24, interpolate frames or extend the ending. Fusion global frame
equals composition start plus local frame.

`source-timing.json` binds source0j9yDUDMrBs[1396,1500), timebase1/24000 and
1001ticks/frame. Source1500 is a different presenter shot and is excluded.
The shot begins with a populated two-line prompt, not an empty composer. It
ends on a completed unsent prompt, not a retrieved result or generated draft.

## Files and regeneration

Use the eight original SVGs in `public/art`, the bundled Geist font and its
license, `inputs/default.json` or `inputs/adaptation.json`, and `docs/controls.csv`.
`docs/text-controls-default.json` and `docs/text-controls-adaptation.json` list
every visible original text run and icon at every native position. These are
construction records, not a source transcript. No source image is an input.

From the extracted `project` directory, regenerate controls without Remotion:

```sh
node --experimental-strip-types scripts/controls.mjs > controls-regenerated.csv
node --experimental-strip-types scripts/text-controls.mjs default > text-default-regenerated.json
node --experimental-strip-types scripts/text-controls.mjs adaptation > text-adaptation-regenerated.json
```

## Layer order

1. Put the selected studio/field workspace SVG over an opaque background at
   1940×1080. Its left edge follows `contextDrift`,0→−12px. This original slow
   drift replaces the filmed setting; it is not recovered camera tracking.
2. Merge the white composer over it at `panelLeft`, `panelTop`, `panelWidth`,
   `panelHeight`, with52px corner radius. Copy the per-frame bounds exactly.
3. Merge the separate white plus circle and dark send circle. They are siblings
   of the composer, not children of its top-edge transform or clipping mask.
4. Merge each text row and inline icon over the panel. Each row follows the
   panel's top edge. Preserve the declared run order and spacing.
5. Merge the caret after the last visible run on the currently active row.
   Do not put it after an earlier completed row or make it a send animation.

The panel never becomes a submitted bubble and never swaps to a result screen.
There is no shared fade, voice capture, spinner, click cursor or audio layer.

## Asymmetric edge growth

The measured white width stays approximately738px at x652..1390. The numbers
are raster estimates, not recovered CSS/Fusion authoring values. At settled
states, the panel center is[1021,540]. It temporarily sits lower on each growth
onset because the bottom jumps before the upper edge finishes settling.

| Local | Source | Required panel/text relationship |
| --- | --- | --- |
|0..20|1396..1416|Two lines; top455,bottom625. First line and first glyph already present.|
|21|1417|Third row opens; bottom jumps654,top first moves445.|
|22..27|1418..1423|Bottom stays654; top settles through436,433,429,428,427,426.|
|28..47|1424..1443|Three-row hold; top426,bottom654.|
|48|1444|Fourth row opens; bottom jumps684,top415.|
|49..55|1445..1451|Bottom stays684; top settles407,403,401,398,397,397,396.|
|56..72|1452..1468|Four-row hold; top396,bottom684.|
|73|1469|Fifth row opens; bottom jumps714,top385.|
|74..80|1470..1476|Bottom stays714; top settles377,373,370,368,368,367,366.|
|81..103|1477..1499|Five-row hold; top366,bottom714.|

Use held values from `controls.csv` at every native frame. Do not replace the
table with one centered size tween or interpolate new frames between keys.
The bottom-driven controls must stay still during each top-edge settling run.

## Bottom controls

The white plus circle is102×102 at left=`panelLeft−116`,top=`panelBottom−100`.
Its dark plus is centered with44px horizontal/vertical strokes,4px thickness,
round caps. The dark send circle is76×76 at left=`panelLeft+panelWidth−92`,
top=`panelBottom−90`; draw an original white up-arrow using5px rounded strokes.
The supplied React/SVG paths are the exact editable reference for those shapes.
Dark ink is#181d20. Neither circle scales during line growth.

## Inline text and glyphs

Use bundled Geist at40px, weight450, tracking−0.3px,52px line box and60px row
step. If the native font implementation cannot reproduce these settings,
record the mismatch; the Remotion render does not prove native font parity.
Text origin is(`panelLeft+50`,`panelTop+31+row×60`), with zero-based row.
Keep explicit authored rows rather than automatic paragraph wrapping.

Create a Text+ layer for each text run, preserving whitespace, and an original
SVG layer for each icon. Text is dark `#181d20` except reference labels, which use
`#256ba3` for Studio or `#236e71` for Field. Every icon is36×36 with4px right gap;
align its bottom5px below the text baseline, as in `src/Scene.tsx`. Lay out
successive runs by the rendered advance of the previous run. Do not allocate
the full future label width while only its prefix is visible.

Read the complete per-frame run list from the selected `text-controls` file.
For an edited phrase of length L and its ratio from `controls.csv`, retain the
first min(L,max(0,floor(L×ratio+0.5))) characters. Source-derived progress keys
are reused proportionally for new copy; this is an authored adaptation, not
identical source glyph timing. The fixed connector is `, the `; the second
reference gets a comma once its label is complete.

| Local | Inline relationship |
| --- | --- |
|0|First room glyph and a partial first reference already exist.|
|8..12|First label completes, then connector types; document glyph appears12.|
|12..17|Document glyph precedes its label. Label types18..20.|
|21..32|Third row's black prefix types; notes glyph appears32.|
|32..35|Notes glyph precedes its label. Label types36..40.|
|41..44|Black connective suffix appears after that label.|
|48..50|Fourth-row notes glyph precedes its new reference label.|
|51..60|Fourth reference types, followed by its black suffix61..72.|
|73..74|Fifth row is open before its closing text begins.|
|75..82|Closing text types, reaching its period at82.|
|83..103|Completed prompt holds without caret.|

The caret is2×38px with2px left gap, dark ink, and a−7px inline vertical offset.
Its earlier holds are authored: absent12..16,32..35 and48..50; otherwise visible
before83, then absent. Earlier source caret/icon micro-motion was not fully
measured. Do not call these exact recovered source cursor timings.

## Editable content and width gate

The exact input fields are `theme`, `lead`, `reference1`, `reference2`,
`line3Prefix`, `reference3`, `line3Suffix`, `reference4`, `line4Suffix`, `closing`.
Theme is studio or field; other fields are trimmed ASCII prose with schema
limits in `src/model.ts`. Closing must end with a period. Edit a copied project,
then regenerate controls and render to new output paths.

The actual renderer loads the bundled font and checks complete rich-line widths,
including each40px icon-plus-gap advance. Row1 budget is638px; rows2..5 have
570px budgets, reserving room for caret and send while each is the active row.
Oversized edits fail before encoding. Do not silently shrink type, clip a label
or move send to evade the gate. Native construction must check its own text
advances and control clearance; it has not been executed here.

## Verification and limits

Inspect0,12,18,20,21,27,32,36,48,51,55,73,75,80,82,83,103 first. Check that the
top settles while the bottom controls hold, inline icons precede their labels,
text never reaches send, and the final prompt remains unsent. Source photos,
performer, branding, exact copy and app glyphs are not adaptation assets.
Original illustrations, palette, typography, cursor holds and internal glyph
geometry differ. Hash/clock tests and sampled stills do not confer source-quality,
independent moving review or native Resolve approval.
