Files
Miguel Ángel 590c192498 feat(catalog): add 3D objects, cursors, snow, starfield and paper transitions (#4349)
* 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
2026-09-28 22:03:59 +00:00
..

before-after-wipe

Two full-bleed content panels compare a before and an after state. The before panel stays fully visible as the base layer; the after panel wipes over it from the left edge in one pass and the divider rests at rest_split percent for the whole hold. The divider (and its knob) stays hidden until the wipe starts, then fades in as it departs the left edge, so the lead-in never shows a half-clipped handle. Label chips mark each side. This ports comparison-split's divider-wipe mechanic onto real content slots: you supply the two visuals, the primitive supplies the wipe.

Files

  • before-after-wipe.html: the mountable sub-composition (install target: compositions/components/before-after-wipe.html).
  • registry-item.json: registry metadata and the variables block.

Variables

id type default notes
label_a string Before chip on the base panel; empty string hides it
label_b string After chip on the revealed panel; empty string hides it
rest_split number 50 divider resting position, 0 to 100 percent
wipe_at number 0.25 seconds after mount start when the wipe begins (0 to 8)
accent enum green green maps to --brand, blue to --accent, violet to --accent-2
exit enum none none holds the final frame; fade and up release the stage

Envelope: IN = wipe_at + 1.05s wipe travel, OUT = 0.5s only when exit is fade or up, HOLD is the sole elastic phase. The wipe-land sync point (hf:sfx id wipe-land-soft) fires when the divider lands, 1.30s at defaults.

The slot mechanism

The primitive ships two named slot panels inside its <template>:

<div class="baw-slot" data-slot="before">...</div>
<div class="baw-slot" data-slot="after">...</div>

Each slot's default children are a token-styled wireframe card (muted on the before layer, brand-tinted on the after layer), so an untouched mount still reads as a tasteful comparison. To show your own content, install the component and replace the children of each [data-slot] element in your installed copy (the runtime clones only the primitive's own template on mount, so slot content lives in the component file, not on the host clip).

Rules:

  • Both slots are full-bleed and share one coordinate space; align the two states so the wipe reads as one surface changing, not two images sliding.
  • Direct img/video children are automatically sized to cover the panel (object-fit: cover). Arbitrary HTML works too; size it in cqw/cqh.
  • Keep the label chips and divider alone; they render above slot content.

Worked example

Install, then fill the slots with two screenshots:

npx hyperframes add before-after-wipe

In compositions/components/before-after-wipe.html, replace each slot's default block:

<div class="baw-slot" data-slot="before">
  <img src="../../assets/dashboard-old.png" alt="" />
</div>
...
<div class="baw-slot" data-slot="after">
  <img src="../../assets/dashboard-new.png" alt="" />
</div>

Mount it from a host composition like any sub-composition:

<div
  class="clip"
  data-composition-id="before-after-wipe"
  data-composition-src="./components/before-after-wipe.html"
  data-variable-values='{"label_a":"v1","label_b":"v2","rest_split":62,"accent":"blue"}'
  data-start="2"
  data-duration="5"
  data-track-index="0"
></div>

The wipe starts 0.25s after the clip mounts, lands at 62 percent, and the comparison holds still for the rest of the clip window (exit defaults to none; frame roots own scene transitions).