Skip to content

feat(registry): 249 seamless image-loop blocks (95 motion families, 1:1) - #3810

Draft
WaterrrForever wants to merge 1 commit into
mainfrom
feat/registry-loop-blocks
Draft

feat(registry): 249 seamless image-loop blocks (95 motion families, 1:1)#3810
WaterrrForever wants to merge 1 commit into
mainfrom
feat/registry-loop-blocks

Conversation

@WaterrrForever

Copy link
Copy Markdown
Collaborator

feat(registry): 249 seamless image-loop blocks (95 motion families, 1:1)

What: 249 registry blocks named loop-<family>[-<n>], one per loop variant, 1080×1080. Every block is a seamless
image loop driven by ONE paused GSAP timeline that recomputes all card transforms from t (seek-safe, deterministic),
with data-composition-variables for every engine parameter plus image1..N content slots (monochrome placeholders by default).
95 families: rings/orbits/globes/spirals/tunnels (3D under CSS perspective), carousels/marquees/tickers/filmstrips, decks/stacks/flips,
grids/mosaics/wipes, wheels, parallax/field/proximity flythroughs, and more — see docs/catalog/blocks/loop-*.mdx.

How they were built: each family is a hand-written engine whose constants were measured against a set of 512² reference loops
(frame sheets, DOM probes, tracked edges) and graded match / partial / unverified per variant (181 / 30 / 38). The catalog blocks are a
mechanical transform of those engines (static duration, prefixed ids, inlined runtime, variables, async image decode) — generator and
notes live in the authoring repo, not here.

Validation

  • node scripts/lint-registry-items.mjs <all 249> → 0 errors
  • npx oxfmt --check registry/blocks/loop-*/*.html → clean
  • hyperframes check (runtime, no-contrast) on one variant per family → see checklist below
  • registry/registry.json, docs/catalog/, docs/public/catalog-index.json regenerated by the repo scripts
  • previews: docs/images/catalog/blocks/loop-*.{mp4,png} rendered at 720² (maintainers may regenerate with generate-catalog-previews.ts)

Related items: carousel-circle/orbit/path/vision/text-circle 1..5 (#3790) cover five motion-designed carousels with swings and text;
these blocks are uniform-speed seamless loops of the same image-card idiom and complement them (globe ≈ orbit's sphere, ring/wheel ≈ circle
are the closest pairs; mechanisms differ).

Usage guidance: 4–20 s loops; images any aspect (mediaFit crop/natural); set backgroundType: solid for a flat ground.
Known pitfalls: root duration is fixed per block (change it by picking another variant); 3D families need data-layout-allow-overflow (set);
placeholders are data-URI SVGs, so an unset image slot never 404s.

preview: not published yet — 720² previews are rendered locally (docs/images/catalog/blocks/loop-*.{mp4,png}, gitignored) and need the docs-images upload; happy to run hyperframes publish on request. Section curation and overlap with #3790 are open questions for review (see Related items).

🤖 Generated with Claude Code

…s, 1:1)

One block per loop variant (loop-<family>[-<n>], 1080x1080), one hand-written engine per family,
driven by a single paused GSAP timeline that recomputes every card transform from t. Every engine
parameter is exposed through data-composition-variables, grouped like a template editor's panel
(Media / Background / Appearance / Animation / Template options), plus image1..N content slots
that default to monochrome SVG placeholders. No third-party media ships.

Validation: scripts/lint-registry-items.mjs 249/249, oxfmt clean, hyperframes check on one variant
per family (95/95), registry.json + docs/catalog pages regenerated by the repo scripts. Previews are
rendered locally (720^2) and need the docs-images upload.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
@mintlify

mintlify Bot commented Sep 9, 2026

Copy link
Copy Markdown

Preview deployment for your docs. Learn more about Mintlify Previews.

Project Status Preview Updated
hyperframes 🟢 Ready View Preview Sep 9, 2026, 10:46 AM

💡 Tip: Enable Automations to automatically generate PRs for you.

face(w, t, `rotateX(-90deg) translateZ(${h / 2}px)`, { ...edge(front), n: [0, 1, 0] });
for (const F of faces)
if (F.el.style.background.includes("repeating"))
F.el.style.backgroundImage = F.n[1] ? lines.replace("90deg", "90deg") : lines;
face(w, t, `rotateX(-90deg) translateZ(${h / 2}px)`, { ...edge(front), n: [0, 1, 0] });
for (const F of faces)
if (F.el.style.background.includes("repeating"))
F.el.style.backgroundImage = F.n[1] ? lines.replace("90deg", "90deg") : lines;
face(w, t, `rotateX(-90deg) translateZ(${h / 2}px)`, { ...edge(front), n: [0, 1, 0] });
for (const F of faces)
if (F.el.style.background.includes("repeating"))
F.el.style.backgroundImage = F.n[1] ? lines.replace("90deg", "90deg") : lines;
face(w, t, `rotateX(-90deg) translateZ(${h / 2}px)`, { ...edge(front), n: [0, 1, 0] });
for (const F of faces)
if (F.el.style.background.includes("repeating"))
F.el.style.backgroundImage = F.n[1] ? lines.replace("90deg", "90deg") : lines;
face(w, t, `rotateX(-90deg) translateZ(${h / 2}px)`, { ...edge(front), n: [0, 1, 0] });
for (const F of faces)
if (F.el.style.background.includes("repeating"))
F.el.style.backgroundImage = F.n[1] ? lines.replace("90deg", "90deg") : lines;
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