Bring the engine you need. Not the whole garage.
Hyperiux Vault is source-first. Effects are added into your project as editable files, not hidden behind a sealed package.
That matters for dependencies.
A scroll reveal, a magnetic cursor, and a WebGL scene should not carry the same technical weight. Some effects need only React and CSS. Some need GSAP or Motion. Some need Three.js, React Three Fiber, shaders, canvas, and a little respect for the GPU.
Vault keeps dependency requirements visible and scoped to the effect you install.
No surprise engines. No drive-by Three.js.
Vault dependencies fall into two groups.
| Type | Meaning |
|---|---|
| Structural requirements | The base framework, runtime, and styling setup your project needs before using Vault |
| Peer engines | Animation, rendering, or utility libraries required by specific effects |
Structural requirements are expected across Vault. Peer engines are added only when an effect needs them.
That keeps the project cleaner, the bundle easier to reason about, and the interaction layer easier to own.
Motion should earn its place in the build.
Every Vault effect assumes a modern React setup.
| Requirement | Supported setup |
|---|---|
| Runtime | Node.js 18.17+ or 20+ recommended |
| Framework | React 18+ or Next.js 14/15 |
| Styling | Tailwind CSS v3 or v4 |
| Language | TypeScript recommended, modern JavaScript supported |
| Package manager | npm, pnpm, yarn, or bun |
| Project structure | App Router, Pages Router, or modern Vite React setup |
Vault works best in projects that separate server and client behavior clearly.
That is especially important for effects that use:
If an effect touches the browser directly, it usually needs a client boundary.
"use client";Servers are many things.
They are not GPU theatres.
Peer engines are libraries used by specific Vault effects.
They are not installed globally for every pattern. They are declared by the effect that needs them.
| Interaction layer | Common peer engines | Used for |
|---|---|---|
| Scroll effects | gsap, motion | Scroll triggers, reveal timing, pinned sections, timeline control |
| Cursor effects | gsap | Pointer tracking, magnetic motion, hover trails, inertia |
| Text animations | gsap, motion | Line reveals, character motion, sequencing, masked text |
| Page transitions | motion | Route transitions, entry and exit states, layout continuity |
| WebGL and 3D effects | three, @react-three/fiber, @react-three/drei | Canvas scenes, 3D objects, shaders, camera movement, WebGL rendering |
| Backgrounds | gsap, motion, three, @react-three/fiber | Ambient layers, particles, gradients, canvas motion |
| Buttons and microinteractions | gsap, motion | Hover states, press states, magnetic motion, small feedback systems |
Not every effect in a category uses every engine listed above.
Check the effect page before installing.
A text reveal should not need a 3D pipeline. A WebGL scene probably will.
That is not bloat. That is choosing the right machine for the trick.
When you add an effect with the Hyperiux CLI, the CLI reads the effect manifest.
npx hyperiux add phantom-image-trailThe manifest defines what the effect needs, including:
If a dependency is required, the CLI makes it visible during installation.
Depending on your CLI configuration, Vault either prompts before installing missing packages or prints the exact package-manager command so you can install them manually.
Example:
npm install gsapOr:
pnpm add gsapThe point is simple: dependencies should be attached to the effect that uses them.
Not sprayed across your project because one day you might animate something.
If you install an effect manually, install only the dependencies listed on that effect page.
Example for a GSAP-based effect:
npm install gsapExample for a Motion-based effect:
npm install motionExample for a WebGL or React Three Fiber effect:
npm install three @react-three/fiber @react-three/dreiUse your package manager of choice.
pnpm add gsapyarn add gsapbun add gsapDo not install the entire creative internet just to animate a headline.
The effect page or registry manifest is the source of truth.
The example below shows the shape of a typical dependency block, not a universal version policy:
{
"dependencies": {
"gsap": "^3.12.5",
"motion": "^12.0.0",
"three": "^0.160.0",
"@react-three/fiber": "^8.15.0",
"@react-three/drei": "^9.90.0"
}
}Use the versions listed by the effect you install.
Animation and rendering libraries move. Your lockfile remembers.
Make sure it remembers the right thing.
Some older examples may reference framer-motion.
Newer Vault effects may use motion.
Use the package specified by the effect page.
Do not install both unless your project actually needs both.
Two animation libraries in one project can be fine.
Two animation libraries because nobody checked the docs is how bundle weight learns to reproduce.
Vault is designed to keep effects local and modular.
Adding one effect should not make every page pay for every other effect.
Still, source ownership means you are responsible for how the effect is imported, rendered, and bundled inside your app.
To keep things clean:
The install is the beginning.
The bundle is where the truth comes out.
Vault effect files are structured to support clean imports.
That helps bundlers remove unused code, but tree-shaking is not magic.
It depends on:
Prefer direct imports.
import PhantomImageTrail from "@/components/phantom-image-trail";Avoid importing a full local index of effects into a shared layout unless you actually need it there.
Your layout is not a storage unit.
WebGL and canvas effects need extra care.
They may depend on:
For Next.js, heavy WebGL components often work best with dynamic imports.
import dynamic from "next/dynamic";
const PhantomImageTrail = dynamic(
() => import("@/components/phantom-image-trail"),
{ ssr: false }
);Use this when server rendering does not make sense.
Especially when the component needs window, document, canvas, WebGL, or GPU-backed rendering.
Vault effects may use Tailwind classes for layout, styling, spacing, responsive behavior, and visual states.
For Tailwind v3 projects, make sure Tailwind scans the folder where Vault files are installed.
Example:
export default {
content: [
"./app/**/*.{ts,tsx}",
"./pages/**/*.{ts,tsx}",
"./components/**/*.{ts,tsx}",
"./components/hyperiux/**/*.{ts,tsx}"
],
theme: {
extend: {}
},
plugins: []
};Tailwind v4 projects may handle configuration differently depending on the setup.
If your project does not use a traditional Tailwind config file, make sure the Vault directory is included through your CSS or project configuration entry point.
If an effect renders but looks broken, check Tailwind content paths first.
It is usually that.
Then check CSS variables. Then check whether you copied the whole effect.Then, briefly, blame yourself.
Dependencies are not just installation details.
They affect runtime behavior.
Watch for:
Prefer transform-based motion where possible.
Good properties:
transform: translate3d(0, 0, 0);
transform: scale3d(1, 1, 1);
transform: rotate3d(0, 1, 0, 15deg);
opacity: 1;Riskier properties for frequent animation:
Move pixels intelligently. Do not ask the browser to rebuild the room every frame. For deeper testing guidance, see Performance Notes.
Motion should respect the person watching it.
Effects that include movement should provide a calmer path for users who prefer reduced motion.
That may mean:
Use the browser preference.
A scoped fallback is safer than applying reduced-motion rules globally across the whole app.
@media (prefers-reduced-motion: reduce) {
.hyperiux-effect,
.hyperiux-effect * {
animation-duration: 0.01ms;
animation-iteration-count: 1;
transition-duration: 0.01ms;
scroll-behavior: auto;
}
}Use a global selector only if you intentionally want a site-wide reduced-motion policy.
For component-level behavior, check reduced motion in JavaScript when needed.
const prefersReducedMotion =
typeof window !== "undefined" &&
window.matchMedia("(prefers-reduced-motion: reduce)").matches;Reduced motion is not the boring version.
It is the considerate version.
For deeper guidance, see Reduced Motion.
Dependencies are not only a bundle concern.
They affect how the interaction behaves.
When adding motion-heavy effects, check that:
The motion layer should support the page.
It should not hold the content hostage.
For deeper implementation guidance, see Accessibility.
Use the CLI doctor command to inspect your setup.
npx hyperiux doctorThe doctor command checks common dependency and setup issues.
It can report:
Example output:
Hyperiux Doctor
Project detected: Next.js
Tailwind config found
Components alias resolved
Missing dependency: gsap
phantom-image-trail uses browser APIs and should be rendered inside a client boundary
Next steps:
npm install gsap
Add "use client" to the component entry file.Run it after adding effects, moving files, upgrading effects, or changing dependencies.
It will not fix your taste. It will fix a surprising number of setup issues.
Install the package listed by the effect page or CLI output.
npm install gsapThen run:
npx hyperiux doctorCheck whether the project uses both framer-motion and motion.
Keep both only if required.
If not, standardize around the package used by your installed effects.
Make sure Tailwind scans the Vault directory.
content: [
"./components/hyperiux/**/*.{ts,tsx}"
]For Tailwind v4, check your CSS or project configuration entry point instead of assuming a traditional config file exists.
Check:
Check:
Check:
Run your bundle analyzer if the project uses one. Guessing is not profiling.
Use these as a final check before shipping.
Small motion. Big signal. Small bundle. Better signal.