* feat(catalog): shelve 3D objects and cursors in their own catalog sections Carries the generator grouping rules from #4310 and #4308. * feat(registry): add a starfield ambient overlay From #4313. * feat(registry): add a falling snow ambient overlay From #4331. * feat(registry): add a torn-paper-rip transition From #4321. * feat(registry): add a paper-collage-reveal transition From #4322. * feat(registry): add a curtain-reveal transition From #4323. * feat(registry): add 3D objects: product turntable, glass hero, exploded stack, extruded logo From #4310. * feat(registry): add eight cursor animations and the dart cursor From #4308. * fix(catalog): find items by everyday editor words and accept a bare search word From #4311. * chore(registry): remove the simulated-cursor component The Cursors section's new pointer animations replace it (from #4308). * fix(registry): take cursor-zoom-follow's screenshot from runtime variables only The declared default is empty, so page markup never becomes an image URL. Clears the code-scanning alert raised on #4308. * docs(cli): show a catalog search example that finds items "smoke" matches nothing in the catalog; "crossfade" finds fade-through. * chore(ci): allow the simulated-cursor removal in the deletion guard * fix(ci): skip tracked files missing from disk in the player CDN pin check Catalog regeneration removes a deleted item's pages before the publish PR untracks them, so the check crashed on every catalog deletion PR. * chore(cli): drop comments that narrate catalog search history * fix(registry): drag-drop keeps the family arrow and shows the drop slot only while hovering * fix(registry): agent cursor labels its steps in an accent tag, no glow or sparkles, in 4.8 s * fix(registry): annotate cursor draws a tapered marker stroke and clears the circled value * fix(registry): show real file thumbnails and end the context menu demo sooner * fix(registry): give marquee select real photos, a Finder-blue marquee and a tighter loop * fix(registry): centre the text-select toolbar on the selection and tighten its timing * fix(registry): selection cursors default to the macOS system blue * style(registry): format the agent and annotate cursor sources * fix(registry): dart-cursor stops covering the choice it makes and shows the export finishing * fix(registry): frame the product turntable fully and light it with two studio softboxes * fix(registry): touch-indicator taps like a real phone and the post it taps gets liked * fix(registry): press-ripple confirms with a check and small click rings at the cursor * fix(registry): exploded stack separates at once and marks each layer in blue as it is labelled * fix(registry): extruded logo settles facing the camera, set in Geist Bold with a neutral rim * fix(registry): magnetic cursor docks its toolbar on the selection and ends after the press * style(registry): format the exploded stack source * fix(registry): glyph trail becomes a tutorial cursor path with numbered steps on a settings screen * fix(registry): make glass-hero a clear lens that shows the headline through it * fix(registry): snow reads as real snowfall with bokeh flakes over a winter title card * fix(registry): oversized cursor is a 3.5x arrow that clicks a real editor toggle on * fix(registry): starfield reads as a drifting night sky over a real title card * style(registry): format the glass hero source * fix(registry): make the paper tear show a white fibrous edge and lift the torn sheet away * fix(registry): curtain reveal draws velvet folds that gather onto a title card * fix(registry): make every zoom-follow click change the screen and read at zoom * fix(registry): paper collage pieces stay opaque, tear with deckled grain and lift away on an arc * refactor(registry): drop dead code and correct stale comments in reworked items * fix(registry): agent cursor scrubs cleanly, docs match press-ripple, fictional demo names * docs(registry): catalog notes say oversized-cursor exits and how it differs from press-ripple * docs(registry): plain lowercase comments in oversized-cursor and touch-indicator * docs(registry): oversized-cursor names CLICK_AT as the click cue
press-ripple
Product demo payoff primitive: a cursor decel-arrives from off-stage (power3.out,
it arrives, it never passes through), lands a few px off-center on a
caller-positioned target zone, target and cursor compress in lockstep, two small
click rings grow from the cursor tip while the label swaps to a check plus
done_label, then the cursor exits off-stage the way it came. The confirmed
state holds dead-still to the end of the clip; the cursor never occludes the
label during the hold. 2.4s authored, elastic HOLD (never time-scaled).
Mounting
<div
class="clip"
data-composition-id="press-ripple"
data-composition-src="./components/press-ripple.html"
data-variable-values='{"label":"Approve run","target_x":62,"target_y":58,"accent":"blue"}'
data-start="0"
data-duration="2.4"
data-track-index="0"
></div>
Variables
| id | type | default | notes |
|---|---|---|---|
| label | string | "Get started" | Text in the default pill. Ignored when the slot is replaced. |
| done_label | string | "Saved" | Text beside the check once the default pill is pressed. Keep it no wider than label; the pill keeps the label's width. |
| target_x | number | 50 | Zone center, percent of host width (8 to 92). |
| target_y | number | 50 | Zone center, percent of host height (8 to 92). |
| press_at | number | 0.9 | Seconds from mount start when the compression begins. Clamped so the press tail (release, rings, cursor exit, 0.8s) and any exit stay inside the clip duration. |
| cursor | enum | light | light (white pointer, dark stroke) or dark (inverse). |
| accent | enum | green | green maps to --brand, blue to --accent, violet to --accent-2. Colors the click rings and the confirmation check. |
| exit | enum | none | none holds the pressed state (frame roots own transitions); fade or up add a 0.45s departure. |
Target slot
The element marked data-slot="target" is the press surface. Its default child
is a token-styled pill (--surface body, --border edge, --font-body at
weight 600) carrying label, and a check plus done_label layered over it.
The pill keeps its fill when pressed; only the label changes. Replace the slot's children in your installed copy
to press anything else: an icon button, a card, a toggle.
The slot wrapper flips data-state="idle" to data-state="pressed" at the
press (seek-safe: scrubbing backwards restores idle). Custom slot content can
key its own pressed look off that attribute, mirroring the default rule:
.pr-target-slot[data-state="pressed"] .my-thing {
/* pressed look */
}
Choreography
- 0.00s: target settles in (fade + short rise, power3.out).
- press_at - 0.6s: cursor departs off-stage bottom-right (0.45s, power3.out), tip landing slightly below-right of the zone center (human aim), then a 0.15s dwell.
- press_at: target and cursor compress to 0.93 in lockstep (cursor scales about its tip).
- press_at + 0.12s: pressed state lands; release springs back (back.out). Two
2px accent rings grow from the cursor tip, 16px to 72px radius at 1920 wide
(320ms, power2.out), the second 60ms behind at 60% opacity. The label swaps
to a check plus
done_label(scale 0.3 to 1, blur 3px to 0, 300ms). - press_at + 0.4s: the cursor exits off-stage bottom-right (0.4s, power2.in, accelerating away), clearing the label before the hold begins.
- HOLD: dead still on the confirmed state, elastic with the clip duration, cursor gone.
Sync point press fires the moment compression starts; align SFX or a
downstream reveal to it.
Known tripwire
The bundler mirrors composition variables as scoped CSS custom properties, so
this unit's own accent variable becomes --accent: blue inside its subtree,
shadowing the contract token (and blue is a valid CSS color). The script
detects the shadow and substitutes the literal contract fallback for the blue
mapping, so accent: "blue" renders the soft contract blue, not pure blue.