Skip to content

feat(registry): filmed-screen curves, orbits and follows typing by default - #5499

Merged
vanceingalls merged 1 commit into
mainfrom
feat/registry-filmed-screen-defaults
Oct 12, 2026
Merged

vanceingalls merged 1 commit into
mainfrom
feat/registry-filmed-screen-defaults

Conversation

@vanceingalls

Copy link
Copy Markdown
Collaborator

What

A follow-up to #5487. It adds four options to filmed-screen, retunes its defaults, and replaces the demo. The defaults were tuned on a white page, filmed the way Vox shoots screens.

option default before
vignette 1.0 fixed 0.42
aberration 2.2× fixed 1×, none on the focused text
curve 0.15 none
led 0.45 fixed 0.9
rack 0.3 s 0.7 s
shot blur 0.45 0.9
shot tiltTo = tilt (new)
  • Curve: a barrel bend on the camera's view. It's normalised so the frame's corners stay in place: the middle swells toward the camera and straight lines bow outward, and the page edge never enters the shot. The vignette is computed before the curve, so it stays even.
  • Aberration: a quarter of the fringing now stays on the focused text, so it still reads as glass. Blur and LED-cell snapping are still off there.
  • LED grid: it now fades in only once a cell spans about 4 output pixels. Below that, on a light page, it aliased into strong moiré.
  • tiltTo: the tilt eases from tilt to tiltTo across a shot. Two shots chained through a glide give one continuous orbit.
  • rack 0.3: fast enough for focus to follow text as it's typed.

The demo

A white search homepage for a made-up engine, "lumen", with its own wordmark and copy. It's a neutral brand, so nothing here imitates a real site. A query types letter by letter: the camera follows each new letter while it orbits from one side of the screen to the other, and earlier letters soften as it moves on. Everything runs on the defaults; the mount passes no effect options.

Verified (CLI 0.8.147)

  • filmed-screen.test.mjs: 6/6, including the composite co-owner test, the second-mount test and the test that the demo's pasted library matches the snippet.
  • lint-registry-items, oxlint and oxfmt are clean.
  • check passes on the demo: no layout issues and 67/67 text checks at WCAG AA. Decorative chrome that sat permanently in the vignette (top links and the footer) was removed, because the audit read its contrast after the lens.
  • A full render: 8 s, no browser errors.

The catalog poster and video will be refreshed on the CDN from this demo.

🤖 Generated with Claude Code

…fault

New options, with defaults tuned on a white page filmed the way Vox shoots
screens:

- vignette (1.0, was a fixed 0.42) and aberration (2.2x, with a quarter of
  it kept on the focused text so it still reads as glass)
- curve (0.15): a barrel bend normalised so the frame's corners stay put
- led (0.45): the LED grid now only fades in once a cell spans ~4 output
  px; finer, it aliased into moire on light pages
- tiltTo per shot: the tilt eases between the two, for an orbit
- rack 0.3 (was 0.7), fast enough to follow text as it is typed, and shot
  blur 0.45 (was 0.9)

The demo is now a white search homepage for a made-up engine, "lumen": a
query types letter by letter while the camera follows each new letter and
orbits from one side of the screen to the other, all on defaults.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
@vanceingalls

Copy link
Copy Markdown
Collaborator Author

Catalog preview media already refreshed on the CDN from this demo: the poster is this head's Render catalog previews artifact, and the video is a full render of demo.html encoded with the generator's ffmpeg settings. Both are at the same URLs, invalidated.

@vanceingalls
vanceingalls merged commit 3886aae into main Oct 12, 2026
59 checks passed
@vanceingalls
vanceingalls deleted the feat/registry-filmed-screen-defaults branch October 12, 2026 20:12

@jrusso1020 jrusso1020 left a comment

Copy link
Copy Markdown
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Post-merge review of 433fe03e, which landed as 3886aaec: same parent, and the three files' patches are identical. No blocker. I'd have approved it. Two small clamps are worth a fix-forward, and nothing needs reverting.

1. Curve normalisation is correct.

  • s = s0·(1 + k|s0|²) / (1 + k|corner|²) maps the frame's corners to themselves.

  • For every pixel in frame, |s0|² ≤ |corner|², so the factor is ≤ 1. Each sampled ray therefore lies on the segment from the centre to the flat ray, and the curve can't show any of the page that the flat shot didn't. For k ≥ 0 the map is monotonic in radius, so nothing folds.

  • What it costs is a zoom. At 16:9 with the default 0.15:

    • the centre is magnified 1.156×;
    • the top and bottom edge midpoints are pulled in about 10% (0.897);
    • the side midpoints are pulled in about 3%.

    (At 9:16 it's 1.049× in the centre.) So a framing that fit flat can lose content near the top or bottom centre edge, and this stacks with the shot's zoom. It's worth one line in the README.

  • Should-fix: clamp curve at 0. A negative value makes the factor > 1, so it samples outside the flat frame, and at 16:9 the map folds below about −0.32. Math.max(0, …) where the uniform is set, or saying ≥ 0 in the docs.

2. Computing the vignette on s0 is the right choice. Vignetting is the camera's falloff in image space. On the curved s it would weaken toward the centre and change shape with curve. With curve: 0, s0 == s, so vignette: 0.42 reproduces the old look exactly.

  • The new default is much stronger, though. At 16:9 the corners go from 62% to 10% brightness and the side midpoints from 76% to 43%. On a white page that reads as a lens; on a dark page the corners go black.
  • Should-fix: above vignette ≈ 1.11 (16:9) the factor goes negative at the corners. col then goes below zero before the scanline and grain terms are applied. col *= max(0.0, 1.0 - uVig * dot(v, v)); fixes it.

3. Changing the defaults is acceptable without an opt-in.

  • The registry copies the snippet into the project (compositions/components/filmed-screen.html), so existing projects keep their copy and render exactly as before. Only a fresh add gets the new look.
  • #5487 landed earlier today, no release tag contains it, and the item is marked experimental, so almost nobody has it yet.
  • One caveat for the README: passing the old values doesn't fully restore the old look. The old values are blur 0.9, rack 0.7, vignette 0.42, aberration 1, led 0.9, curve 0. But the LED fade-in threshold (cells spanning 2.2–4.5 px, now 4.0–6.5) and the quarter of fringing on the focused element are hard-coded. aberration also scales the cut tear's fringing, so tears are 2.2× too.
  • A short "Previous look" line with those values would help anyone who liked #5487's version.

Also checked

  • tiltTo unset gives lerp(a, a, x) == a exactly, so the rotation is unchanged.
  • A glide evaluates the previous shot past its end, and smoother clamps, so it starts from that shot's tiltTo. Orbits chain correctly.
  • The LED grid's new fade-in (only once a cell spans ~4 output px) only fades the grid in later, so on light pages it can only alias less.

Tests and CI. filmed-screen.test.mjs passes 6/6 locally at 433fe03e. All 39 checks are green, and the required set is green with the Windows jobs skipped by path.

No render from me, so I haven't looked at the moiré or the lumen demo on screen.

— Rames

jrusso1020 pushed a commit to iamcipherdev/hyperframes that referenced this pull request Oct 12, 2026
)

* fix(registry): clamp filmed-screen's curve and vignette

Post-merge review of heygen-com#5499:

- curve is clamped at 0: a negative value samples outside the frame and
  folds over below about -0.32.
- the vignette factor is clamped at 0: above vignette ~1.11 it went
  negative in the corners.
- README: a "previous look" line with the pre-heygen-com#5499 values, noting that
  the LED fade-in threshold and the trace of fringing on the focused
  element are hard-coded.

The demo renders the same: at the defaults neither clamp is reached.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

* fix(registry): point filmed-screen's catalog page at its recorded preview

The catalog builds this item's payload as unsupported (it needs
canvas-draw-element), and without preview.video the page fell back to the
flag notice: "Needs chrome://flags/#canvas-draw-element to render live"
under a "Recorded preview" caption, with no video, whatever the visitor's
flags. The manifest now names the CDN video and poster the way the
liquid-glass blocks do; the regenerated page carries video= and poster=
instead of needsFlag.

Co-Authored-By: Claude Opus 5.5 <[email protected]>

---------

Co-authored-by: Claude Opus 5.5 <[email protected]>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants