PluginBench
Skill
Pass
Audit score 90

cuboid-carousel

heygen-com/hyperframes

3D carousel of bevelled cuboids with wave motion and customizable card content.

What is cuboid-carousel?

A HyperFrames composition that animates a chain of 3D cuboids riding a travelling wave, displaying card content in a carousel pattern. Use this for dynamic, visually striking content presentations with full control over geometry, materials, lighting, and motion timing.

  • Renders a chain of bevelled cuboids that fly in from the right, cruise with per-cuboid rotation stagger, decelerate to a hero hold, then exit left
  • Supports custom card content via JSON or built-in list with selectable hero card
  • Provides 40 variables for complete control: cuboid geometry, materials, lighting rigs, shadows, camera, and segment durations/easing
  • Automatically spaces cuboids to prevent overlap based on dimensions and reachable extent
  • Delivers 1920×1080 output at 30 fps with 6.67-second duration
  • Implements seek-safe closed-form animation (no rAF loops) for reliable frame-accurate rendering

How to install cuboid-carousel

npx skills add https://github.com/heygen-com/hyperframes --skill cuboid-carousel
Prerequisites
  • Node.js and npx installed
  • HyperFrames CLI (npx hyperframes)
  • Host HTML file to mount the composition block
  • Optional: custom card content as JSON
Claude Code
Cursor
Windsurf
Cline

How to use cuboid-carousel

  1. 1.Install the skill with `npx hyperframes add cuboid-carousel`
  2. 2.Mount the composition in your host `index.html` using the provided `data-composition-id` and `data-composition-src` attributes
  3. 3.Customize variables via `data-composition-variables` attribute (geometry, colors, lighting, camera, timings)
  4. 4.Optionally provide custom card content as JSON in the `cardsJson` variable, or use the built-in card list
  5. 5.Render with custom values using `npx hyperframes render` with `--variables` flag, or play/seek the timeline via `window.__timelines["cuboid-carousel"]`

Use cases

Good for
  • Product showcase or portfolio carousel with 3D card flips and wave motion
  • Marketing video content block with customizable lighting and material finishes
  • Interactive presentation tool where hero card selection drives visual focus
  • Animated background or hero section for web pages requiring premium motion graphics
  • Video editing composition for inserting dynamic carousel sequences into larger productions
Who it's for
  • Motion designers and video producers using HyperFrames
  • Web developers building premium interactive experiences
  • Marketing and creative teams producing branded video content
  • Developers integrating 3D animations into web or video applications

cuboid-carousel FAQ

Can I use custom card content?

Yes. Pass card data as JSON in the `cardsJson` variable, or select from the built-in list and set `heroCard` (1-based index) to choose which card is the hero.

What are the memory and performance requirements?

Each live instance budgets roughly 350 MB; run one composition at a time. Renderer uses WebGL, GSAP, Canvas 2D, PMREM, and shadow maps.

How do I adjust the animation timing?

Use the 40 variables to control segment durations and easing. Variables like `cameraSettleFrame` and hero exit rotations (`heroExitX`, `heroExitY`, `heroExitZ`) let you fine-tune motion.

Is the animation seek-safe?

Yes. Every frame is a closed-form function of time; the composition re-syncs on the `hf-seek` CustomEvent, making it safe for frame-accurate scrubbing and rendering.

What fonts and external dependencies are required?

Inter from Google Fonts is used. External runtime dependencies are Three.js modules and addons (RoomEnvironment, BufferGeometryUtils) included in the assets folder.

Full instructions (SKILL.md)

Source of truth, from heygen-com/hyperframes.


name: cuboid-carousel description: A chain of bevelled cuboids rides a travelling wave as a content carousel. HyperFrames block, 1920×1080, 6.666666666666667s, 40 variables.

Cuboid Carousel

Rounded, bevelled cuboids carrying card content fly in from the right as one rigid group, cruise with a per-cuboid rotation stagger, decelerate to a hero hold, then exit left. Spacing is derived from the cuboid dimensions and the largest reachable X half-extent, so cuboids can never overlap. Forty variables carry the original DialKit schema: geometry, materials, lights, shadows, backdrop, camera and every segment duration and easing. Cards come from the built-in list or a JSON variable.

Composition id: cuboid-carousel. Duration 6.666666666666667 s at 30 fps, 1920×1080.

Files

  • cuboid-carousel.html (38 KB)
  • assets/Three-LICENSE.txt (1 KB)
  • assets/addons/environments/RoomEnvironment.js (5 KB)
  • assets/addons/utils/BufferGeometryUtils.js (36 KB)
  • assets/cuboid-motion.js (593 KB)
  • assets/gsap-3.14.2.min.js (128 KB)
  • assets/GSAP-NOTICE.txt (1 KB)
  • assets/three.core.min.js (554 KB)
  • assets/three.module.min.js (468 KB)

Install

Install with npx hyperframes add cuboid-carousel; by default the files above land under compositions/cuboid-carousel/. Then mount the block from the host index.html:

<div
  data-composition-id="cuboid-carousel"
  data-composition-src="compositions/cuboid-carousel/cuboid-carousel.html"
  data-start="0"
  data-duration="6.666666666666667"
  data-track-index="1"
  data-width="1920"
  data-height="1080"
></div>

Render with custom values by targeting the composition file directly:

npx --yes hyperframes@0.8.12 render 'compositions/cuboid-carousel/cuboid-carousel.html' --variables '{"cardsJson":"","heroCard":4}'

Variables

Read at runtime via window.__hyperframes.getVariables(); declared on the composition root as data-composition-variables (single-quoted attribute, plain JSON).

idtypedefaultlabel / range
cardsJsonstring""Content · Cards JSON (optional, see CARDS in source)
heroCardnumber4Content · Hero card (1-based) 1–12 step 1
countnumber8Content · Repeating card count 1–12 step 1
gapnumber0.01Layout · Extra gap between cuboids 0–1.5 step 0.005
cuboidWidthnumber1.7Cuboid · Width 0.3–5 step 0.01
cuboidHeightnumber2.4Cuboid · Height 0.3–6 step 0.01
cuboidDepthnumber0.14Cuboid · Thickness (depth) 0.02–2 step 0.01
cornerRadiusnumber0.105Cuboid · Corner radius 0–0.6 step 0.005
bevelSizenumber0.03Cuboid · Bevel size (edge chamfer) 0–0.3 step 0.001
bevelThicknessnumber0.04Cuboid · Bevel thickness 0–0.3 step 0.001
smoothnessnumber32Cuboid · Smoothness (segments) 1–32 step 1
bodyColorcolor"#242424"Cuboid · Body colour
roughnessnumber0.6Cuboid · Roughness 0–1 step 0.01
metalnessnumber0.4Cuboid · Metalness 0–1 step 0.01
heroScalenumber1Hero · Isolated scale 1–1.6 step 0.01
heroFillIntensitynumber0.55Hero · Face light intensity 0–2 step 0.05
heroExitXnumber288Hero · Exit X rotation degrees -720–720 step 1
heroExitYnumber-234Hero · Exit Y rotation degrees -720–720 step 1
heroExitZnumber198Hero · Exit Z rotation degrees -720–720 step 1
ambientIntensitynumber0.35Lights · Ambient intensity 0–4 step 0.01
ambientColorcolor"#ffffff"Lights · Ambient colour
topIntensitynumber3.1Lights · Top rig intensity 0–12 step 0.05
topColorcolor"#ffffff"Lights · Top rig colour
bottomIntensitynumber2.15Lights · Bottom rig intensity 0–12 step 0.05
bottomColorcolor"#ffcaad"Lights · Bottom rig colour
keyIntensitynumber5Lights · Key rig intensity 0–12 step 0.05
keyColorcolor"#ffe9d6"Lights · Key rig colour
shadowRadiusnumber44.5Shadows · Softness at map size 2048 0–50 step 0.5
shadowMapSizenumber2048Shadows · Map size 512–4096 step 256
backdropcolor"#0b0d13"Background · Colour
cameraFovnumber11Camera · Initial Field of view 10–90 step 0.5
cameraXnumber-1.65Camera · Initial X -20–20 step 0.05
cameraYnumber8.5Camera · Initial Y -20–20 step 0.05
cameraZnumber-8.508708Camera · Initial Z (distance) -20–50 step 0.1
cameraSettleFramenumber70Camera · Settle frame (30 fps) 20–90 step 1
handheldStrengthnumber1Camera · Handheld hold strength 0–1 step 0.05
cameraTargetFovnumber34Camera target · Field of view 10–90 step 0.5
cameraTargetXnumber-7.25Camera target · X -20–20 step 0.05
cameraTargetYnumber1.15Camera target · Y -20–20 step 0.05
cameraTargetZnumber6.2Camera target · Z 2–50 step 0.1

Runtime contract

  • One paused GSAP timeline registered as window.__timelines["cuboid-carousel"].
  • Re-syncs on the hf-seek CustomEvent; every frame is a closed-form function of time (seeded PRNG only, no rAF loops, no Date.now).
  • Renderer: WebGL, GSAP, Canvas 2D, PMREM, Shadow maps. Budget roughly 350 MB per live instance; run one at a time.
  • External runtime dependencies: ./assets/three.module.min.js, ./assets/addons/.
  • Web fonts from Google Fonts: Inter.

Editing rules (from the source project)

  1. Keep data-composition-variables a single-quoted attribute with plain " JSON. Never save it through Studio's Design panel.
  2. Do not put <canvas> in static markup; create it at runtime.
  3. Keep every visual state a function of t; seek-safety is what makes the block renderable.