cuboid-carousel — Claude skill: 3D card carousel
A skill that renders a 3D carousel of bevelled cuboids carrying card content: they fly in from the right, ride a wave, and exit left. Useful for promo clips and title sequences.
npx skills add heygen-com/hyperframes --skill cuboid-carousel -a claude-codeWhat cuboid-carousel does
cuboid-carousel is a HyperFrames block: a ready composition cuboid-carousel.html at 1920×1080, 6.666666666666667 s at 30 fps. A chain of rounded, bevelled cuboids flies in from the right as one rigid group, each cuboid rotating with its own stagger, then the group decelerates to a hero hold and exits left. Spacing is derived from the cuboid dimensions and the largest reachable X half-extent, so cuboids never overlap.
Under the hood: Three.js, GSAP 3.14.2, assets/cuboid-motion.js and environment addons. Forty variables carry the original DialKit schema — geometry, materials, lights, shadows, backdrop, camera, and per-segment durations and easings. Cards come from the built-in list or a JSON variable, cardsJson. One paused GSAP timeline registers as window.__timelines["cuboid-carousel"] and re-syncs on the hf-seek CustomEvent, so every frame is a closed-form function of time.
Mind the memory budget: roughly 350 MB per live instance, so run one at a time. Rendering uses WebGL and Canvas 2D with shadow maps and PMREM. Install it if you want a finished 3D card transition and don't mind tuning forty parameters. If your project has no Three.js or GSAP, a static CSS animation is the cheaper route.
What it helps with
- build a 3D card carousel without hand-setting the scene
- show a content list riding a wave with per-item rotation
- hold one hero card larger than the rest
- swap in your own cards through a JSON variable
- tune lights, shadows and camera to match a brand
Example prompts for the agent
- install the cuboid-carousel skill and list the variables that control the camera
- replace the cards in cuboid-carousel with my JSON via cardsJson
- make the third card the hero and drop gap to 0.05
How to install cuboid-carousel
1Skills CLI (Vercel)
npx skills add heygen-com/hyperframes --skill cuboid-carousel -a claude-code2Manually: put the files in place
~/.claude/skills/cuboid-carousel/SKILL.mdCopy the whole skill folder; for one project use .claude/skills/cuboid-carousel/
1Skills CLI (Vercel)
npx skills add heygen-com/hyperframes --skill cuboid-carousel -a codex2Manually: put the files in place
.agents/skills/cuboid-carousel/SKILL.mdFor all projects use ~/.agents/skills/
1Skills CLI (Vercel)
npx skills add heygen-com/hyperframes --skill cuboid-carousel -a cursor2Manually: put the files in place
.cursor/skills/cuboid-carousel/SKILL.mdCursor also reads .agents/skills/ and .claude/skills/
1GitHub CLI
gh skill install heygen-com/hyperframes cuboid-carousel2Manually: put the files in place
.github/skills/cuboid-carousel/SKILL.md1Skills CLI (Vercel)
npx skills add heygen-com/hyperframes --skill cuboid-carousel -a gemini-cli2Platform CLI
gemini skills install https://github.com/heygen-com/hyperframes --path registry/blocks/cuboid-carouselManually: put the files in place
.devin/skills/cuboid-carousel/SKILL.mdThe legacy .windsurf/skills/ path still works
Skills CLI (Vercel)
npx skills add heygen-com/hyperframes --skill cuboid-carousel -a opencodeClaude.ai
Zip the folder and upload it in Settings → Capabilities → Skills
From the same set14
The whole set →Similar
Questions about cuboid-carousel
How do I install cuboid-carousel in Claude?
Run npx skills add heygen-com/hyperframes --skill cuboid-carousel -a claude-code. The skill lands at ~/.claude/skills/cuboid-carousel/SKILL.md.
What does cuboid-carousel do?
It renders a HyperFrames block where a chain of bevelled cuboids rides a travelling wave as a content carousel: entry from the right, a hero hold, exit to the left.
What does the skill need to run?
The composition loads Three.js and GSAP from ./assets/, and the Inter webfont from Google Fonts. Each live instance costs roughly 350 MB, so run one at a time.
Source text
SKILL.md · Apache-2.0
--- 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`: ```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: ```sh npx --yes [email protected] 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). | id | type | default | label / range | | ------------------- | ------ | ----------- | ---------------------------------------------------- | | `cardsJson` | string | `""` | Content · Cards JSON (optional, see CARDS in source) | | `heroCard` | number | `4` | Content · Hero card (1-based) 1–12 step 1 | | `count` | number | `8` | Content · Repeating card count 1–12 step 1 | | `gap` | number | `0.01` | Layout · Extra gap between cuboids 0–1.5 step 0.005 | | `cuboidWidth` | number | `1.7` | Cuboid · Width 0.3–5 step 0.01 | | `cuboidHeight` | number | `2.4` | Cuboid · Height 0.3–6 step 0.01 | | `cuboidDepth` | number | `0.14` | Cuboid · Thickness (depth) 0.02–2 step 0.01 | | `cornerRadius` | number | `0.105` | Cuboid · Corner radius 0–0.6 step 0.005 | | `bevelSize` | number | `0.03` | Cuboid · Bevel size (edge chamfer) 0–0.3 step 0.001 | | `bevelThickness` | number | `0.04` | Cuboid · Bevel thickness 0–0.3 step 0.001 | | `smoothness` | number | `32` | Cuboid · Smoothness (segments) 1–32 step 1 | | `bodyColor` | color | `"#242424"` | Cuboid · Body colour | | `roughness` | number | `0.6` | Cuboid · Roughness 0–1 step 0.01 | | `metalness` | number | `0.4` | Cuboid · Metalness 0–1 step 0.01 | | `heroScale` | number | `1` | Hero · Isolated scale 1–1.6 step 0.01 | | `heroFillIntensity` | number | `0.55` | Hero · Face light intensity 0–2 step 0.05 | | `heroExitX` | number | `288` | Hero · Exit X rotation degrees -720–720 step 1 | | `heroExitY` | number | `-234` | Hero · Exit Y rotation degrees -720–720 step 1 | | `heroExitZ` | number | `198` | Hero · Exit Z rotation degrees -720–720 step 1 | | `ambientIntensity` | number | `0.35` | Lights · Ambient intensity 0–4 step 0.01 | | `ambientColor` | color | `"#ffffff"` | Lights · Ambient colour | | `topIntensity` | number | `3.1` | Lights · Top rig intensity 0–12 step 0.05 | | `topColor` | color | `"#ffffff"` | Lights · Top rig colour | | `bottomIntensity` | number | `2.15` | Lights · Bottom rig intensity 0–12 step 0.05 | | `bottomColor` | color | `"#ffcaad"` | Lights · Bottom rig colour | | `keyIntensity` | number | `5` | Lights · Key rig intensity 0–12 step 0.05 | | `keyColor` | color | `"#ffe9d6"` | Lights · Key rig colour | | `shadowRadius` | number | `44.5` | Shadows · Softness at map size 2048 0–50 step 0.5 | | `shadowMapSize` | number | `2048` | Shadows · Map size 512–4096 step 256 | | `backdrop` | color | `"#0b0d13"` | Background · Colour | | `cameraFov` | number | `11` | Camera · Initial Field of view 10–90 step 0.5 | | `cameraX` | number | `-1.65` | Camera · Initial X -20–20 step 0.05 | | `cameraY` | number | `8.5` | Camera · Initial Y -20–20 step 0.05 | | `cameraZ` | number | `-8.508708` | Camera · Initial Z (distance) -20–50 step 0.1 | | `cameraSettleFrame` | number | `70` | Camera · Settle frame (30 fps) 20–90 step 1 | | `handheldStrength` | number | `1` | Camera · Handheld hold strength 0–1 step 0.05 | | `cameraTargetFov` | number | `34` | Camera target · Field of view 10–90 step 0.5 | | `cameraTargetX` | number | `-7.25` | Camera target · X -20–20 step 0.05 | | `cameraTargetY` | number | `1.15` | Camera target · Y -20–20 step 0.05 | | `cameraTargetZ` | number | `6.2` | Camera 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.
© heygen-com · Apache-2.0 · heygen-com/hyperframes