Skip to content

feat(registry): hw write-on wave — hw-write-title block + control surfaces for the handwritten family - #3557

Merged
miguel-heygen merged 2 commits into
heygen-com:mainfrom
jbernard077:feat/registry-hw-writeon-wave
Aug 31, 2026
Merged

feat(registry): hw write-on wave — hw-write-title block + control surfaces for the handwritten family#3557
miguel-heygen merged 2 commits into
heygen-com:mainfrom
jbernard077:feat/registry-hw-writeon-wave

Conversation

@jbernard077

@jbernard077 jbernard077 commented Aug 31, 2026

Copy link
Copy Markdown
Contributor

One wave to the handwritten family: a new true write-on title block, plus declared
control surfaces and a completed stroke-texture matrix for the family's four
components. The clips' shipped behavior is preserved — every existing single-path
caller renders exactly as today (legacy helper bodies kept verbatim; proven in a
dedicated legacy-wiring harness).

What's added

  • hw-write-title (NEW block) — a true glyph write-on: pen-traced Caveat built
    from baked per-glyph centerline strokes (75-glyph table in
    assets/baked/caveat-pen.js), curvature-adaptive pen velocity, real pen lifts, and
    an underline finisher. Controls: scheme / animation / boil / writeOn /
    underline.
  • hw-boil — the family runtime grows hwBoilPose (declared boil poses over the
    family-locked frameDrop), hwPenEase, and the completed stroke matrix
    (hwStrokeTypes / hwStrokeApply / hwDrawOn): sharp + deterministic seeded spray
    no feTurbulence anywhere.
  • hw-arrowhwArrowBuild CONFIG-reading build (arrowStyle / strokeType /
    boil), split curve+head, and a travel-aligned arrival stretch on the head: it pops
    the moment the accelerating draw lands, volume preserved, snappy spring recovery.
    hwArrowPath ships byte-identical; hwArrowOn runs the shipped body verbatim on
    non-built targets (legacy dur honored).
  • hw-box-label — entrance "draw" | "drop" (the drop lands with a contact
    squash on a deform wrapper, label counter-scaled to net identity, bouncy recovery),
    strokeType, promoted labelPos, boil base.
  • hw-callout-circle — promoted labelAt, strokeType on outline + connector, a
    measured pop squash on arrival, boil base.

Every shared family helper ships one byte-identical text across all its carriers
(items and demos), verified programmatically; the two intentional divergences
(hw-callout-circle's pen-less hwDrawOn; per-item spring register subsets) are
deliberate and documented.

Controls declarations (pairs with #3227)

Each item declares its control surface in registry-item.json controls, agreeing
field-for-field with the CONFIG comment grammar, in the shape proposed by #3227. The
declarations are inert until that PR lands (today's schema ignores unknown fields and
today's codegen renders no table) and activate automatically when it does. Comment
shorthand used in the sources: g09 = the declared-control-surface convention
(#3227); g21 = the volume-preserving squash-and-stretch principle (#3221's
volume-squash-stretch rule).

Validation

One reference build (24s reel exercising every addition, plus per-item and
legacy-wiring harnesses):

Evidence Result
hyperframes check 0 errors, 0 warnings (reel + every item/demo harness)
Double-render framemd5 910/910 bit-identical
Seek-shuffle (shuffled vs ascending seeks) 8/8 bit-identical, 2 in each spray/boil-heavy scene
Flash safety (WCAG 2.3.1) zero violations, worst 0.0 flashes/s
Deformation physics burn-ins hand-recomputed (S = softness·v/2000 exact); volume law asserted every deformation frame, console-error read-back
Bounded controls unknown variant → declared default + console error, frame-identical to the authored state

Component demos each exercise ≥1 non-default control state under
<name>-demo composition ids. An 8-state contact sheet for the new block and the
preview MP4s can be attached on request (external-contributor flow); the
caveat-pen.js bake generator (bake-centerlines.mjs, deterministic) is available
on request as provenance — deliberately not shipped in the item.

Fonts: Caveat-700 (OFL), byte-identical to the copies the family already bundles —
no new font ships.

🤖 Generated with Claude Code

Preview media

(videos attached below — reference reel first, then one demo render per component, then the new block rendered in its ink scheme; the block's default chalk scheme is authored for dark host stages, which the reel shows)

00-reference-reel.mp4
hw-arrow-demo.mp4
hw-boil-demo.mp4
hw-box-label-demo.mp4
hw-callout-circle-demo.mp4
hw-write-title-ink.mp4

Note for the maintainer

The "Catalog: search index covers the registry" check names the expected external-contributor gap — the search index needs the opt-in embedding model, so per CONTRIBUTING a maintainer regenerates it before merge. Everything else is green.

…faces for four hw components

Adds hw-write-title (true glyph write-on: pen-traced Caveat via baked
centerline masks, curvature-adaptive pen velocity, pen lifts, underline)
and grows the handwritten family's four components with declared control
surfaces (controls per the heygen-com#3227 convention), the completed stroke-texture
matrix (sharp + deterministic seeded spray — no feTurbulence), boil poses,
and physically-derived arrival deformation (travel-aligned squash with
volume preserved and spring recovery). Shipped single-path callers keep
working unchanged (legacy helper bodies preserved; proven in a legacy
wiring harness).

Validated in one reference build: check clean, double-render framemd5
910/910 bit-identical, seek-shuffle 8/8, WCAG 2.3.1 flash-scan zero
violations, physics burn-ins hand-recomputed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@miguel-heygen

miguel-heygen commented Aug 31, 2026

Copy link
Copy Markdown
Collaborator

@jbernard077 can you attach a video of the components pls in the pr description? that would be helpful to check quality

@jbernard077

Copy link
Copy Markdown
Contributor Author

@miguel-heygen done — videos are in the description now: the reference reel first (all five items staged together, with burned-in spec overlays), then one demo render per component, then the new block standalone in its ink scheme. The block appears twice on purpose: its default chalk scheme is authored for dark host stages (that's what the reel shows), so the standalone render uses ink to read on white.

Also flagged in the description: the one red check ("Catalog: search index covers the registry") is the documented external-contributor gap — needs the opt-in embedding model, so per CONTRIBUTING it's a maintainer regenerate-before-merge. Happy to adjust anything else.

@miguel-heygen
miguel-heygen enabled auto-merge (squash) August 31, 2026 03:46
@miguel-heygen
miguel-heygen disabled auto-merge August 31, 2026 03:46
@miguel-heygen
miguel-heygen merged commit 5b45bcc into heygen-com:main Aug 31, 2026
47 checks passed
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