# OPUS UI — full reference Source of truth: https://opusui.131199999.xyz. Per-item markdown with full source: https://opusui.131199999.xyz/md/. ## Aurora (`aurora`) Backgrounds / Shader. Northern-lights curtains with drifting vertical rays and a twinkling sky. The nearest curtain leans toward the pointer and glows brighter where you hover. File: components/opus/backgrounds/aurora.tsx ```tsx import { Aurora } from "@/components/opus/backgrounds/aurora";
…your content
``` - `colorA`: string = "#2af5a4" — Lower edge of the curtains (hex). - `colorB`: string = "#7c5cff" — Upper glow of the curtains (hex). - `colorC`: string = "#22d3ee" — Third curtain + pointer glow (hex). - `background`: string = "#050510" — Sky colour (hex). - `intensity`: number = 1 — Overall brightness, 0.2–2. - `height`: number = 1 — How tall the curtains reach, 0.4–2. - `stars`: boolean = true — Twinkling stars behind the aurora. - `speed`: number = 1 — Time multiplier. 0 freezes the animation; the pointer stays live. - `interactive`: boolean = true — React to the pointer (tracked on window, so overlaid content never blocks it). - `className`: string — Classes for the wrapper. Use `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Mesh Gradient (`mesh-gradient`) Backgrounds / Shader. A Stripe-style liquid gradient: four colour centres orbit on Lissajous paths, blended in linear light through a two-stage domain warp. The pointer is a soft gravity well that drags the colours toward it. File: components/opus/backgrounds/mesh-gradient.tsx ```tsx import { MeshGradient } from "@/components/opus/backgrounds/mesh-gradient"; ``` - `colors`: [string, string, string, string] — Four hex colours; the last one tends to fill the edges. - `warp`: number = 1 — Domain-warp strength — 0 calm, 2 liquid. - `grain`: number = 0.06 — Animated film grain (0–0.2). - `pull`: number = 1 — Strength of the pointer’s gravity well. - `speed`: number = 1 — Time multiplier. 0 freezes the animation; the pointer stays live. - `interactive`: boolean = true — React to the pointer (tracked on window, so overlaid content never blocks it). - `className`: string — Classes for the wrapper. Use `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Silk (`silk`) Backgrounds / Shader. Satin folds rendered as a lit height-field: normals from finite differences, diffuse + Blinn specular + anisotropic sheen. Your pointer is the light source. File: components/opus/backgrounds/silk.tsx ```tsx import { Silk } from "@/components/opus/backgrounds/silk"; ``` - `color / shadow / sheen`: string — Fabric, fold-shadow and highlight colours. - `scale`: number = 1 — Fold frequency. - `depth`: number = 1 — Fold depth (affects shading contrast). - `speed`: number = 1 — Time multiplier. 0 freezes the animation; the pointer stays live. - `interactive`: boolean = true — React to the pointer (tracked on window, so overlaid content never blocks it). - `className`: string — Classes for the wrapper. Use `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Liquid Marble (`liquid-marble`) Backgrounds / Shader. Inigo-Quilez-style triple domain warp f(p + f(p + f(p))) coloured from four inks. The pointer stirs a vortex into the flow, faster when you move faster. File: components/opus/backgrounds/liquid-marble.tsx ```tsx import { LiquidMarble } from "@/components/opus/backgrounds/liquid-marble"; ``` - `colors`: [string, string, string, string] — Base, ink, vein, highlight. - `scale`: number = 1 — Pattern zoom. - `contrast`: number = 1 — Vein contrast. - `speed`: number = 1 — Time multiplier. 0 freezes the animation; the pointer stays live. - `interactive`: boolean = true — React to the pointer (tracked on window, so overlaid content never blocks it). - `className`: string — Classes for the wrapper. Use `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Metaballs (`metaballs`) Backgrounds / Shader. A lava lamp of implicit-surface blobs with fake-3D shading from the field gradient. One blob is glued to your pointer and merges with the others on contact. File: components/opus/backgrounds/metaballs.tsx ```tsx import { Metaballs } from "@/components/opus/backgrounds/metaballs"; ``` - `colorA / colorB`: string — Vertical blob gradient. - `background`: string = "#0c0612" — Backdrop colour. - `size`: number = 1 — Blob radius multiplier. - `count`: number = 7 — Drifting blobs (2–10). - `glow`: number = 0.8 — Halo around the blobs. - `speed`: number = 1 — Time multiplier. 0 freezes the animation; the pointer stays live. - `interactive`: boolean = true — React to the pointer (tracked on window, so overlaid content never blocks it). - `className`: string — Classes for the wrapper. Use `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Topography (`topography`) Backgrounds / Shader. Animated contour map with anti-aliased isolines (via fwidth) and bolder index contours. The pointer raises a hill; clicking drops a ring of terrain that spreads outward. File: components/opus/backgrounds/topography.tsx ```tsx import { Topography } from "@/components/opus/backgrounds/topography"; ``` - `lineColor / accent`: string — Regular contour and every-5th index contour colours. - `background`: string — Map colour. - `density`: number = 14 — Contours per unit height. - `thickness`: number = 1.2 — Line weight (px). - `hill`: number = 1.2 — Height of the pointer hill. - `speed`: number = 1 — Time multiplier. 0 freezes the animation; the pointer stays live. - `interactive`: boolean = true — React to the pointer (tracked on window, so overlaid content never blocks it). - `className`: string — Classes for the wrapper. Use `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Halftone Waves (`halftone-waves`) Backgrounds / Shader. A rotated halftone screen whose dot sizes ride interfering waves. Hovering swells a lens of bigger dots; clicking sends a ring across the grid. File: components/opus/backgrounds/halftone-waves.tsx ```tsx import { HalftoneWaves } from "@/components/opus/backgrounds/halftone-waves"; ``` - `colorA / colorB`: string — Ink gradient across the screen. - `background`: string — Paper colour. - `cell`: number = 14 — Dot pitch in CSS px (resolution independent). - `angle`: number = 20 — Screen angle in degrees. - `shape`: "circle" | "square" | "diamond" = "circle" — Dot shape. - `speed`: number = 1 — Time multiplier. 0 freezes the animation; the pointer stays live. - `interactive`: boolean = true — React to the pointer (tracked on window, so overlaid content never blocks it). - `className`: string — Classes for the wrapper. Use `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Voronoi Glass (`voronoi-glass`) Backgrounds / Shader. Stained-glass cells from an animated Voronoi diagram with bevelled shading and glowing leads. The cell under the pointer lights up and its neighbours’ edges glow. File: components/opus/backgrounds/voronoi-glass.tsx ```tsx import { VoronoiGlass } from "@/components/opus/backgrounds/voronoi-glass"; ``` - `colorA / colorB`: string — Cell colours (randomly mixed per cell). - `edge`: string — Lead / edge glow colour. - `scale`: number = 5 — Cells across the short side. - `speed`: number = 1 — Time multiplier. 0 freezes the animation; the pointer stays live. - `interactive`: boolean = true — React to the pointer (tracked on window, so overlaid content never blocks it). - `className`: string — Classes for the wrapper. Use `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Hyperspace (`hyperspace`) Backgrounds / Shader. Jump-to-lightspeed star streaks in three rotated layers. The vanishing point steers toward your pointer, and every click punches the throttle for a burst. File: components/opus/backgrounds/hyperspace.tsx ```tsx import { Hyperspace } from "@/components/opus/backgrounds/hyperspace"; ``` - `colorA / colorB`: string — Star colours (cores fade to white). - `warp`: number = 0.6 — Streak length — 0 gives point stars. - `density`: number = 1 — Star count multiplier. - `speed`: number = 1 — Time multiplier. 0 freezes the animation; the pointer stays live. - `interactive`: boolean = true — React to the pointer (tracked on window, so overlaid content never blocks it). - `className`: string — Classes for the wrapper. Use `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Synthwave Grid (`synthwave-grid`) Backgrounds / Shader. An outrun horizon: infinite perspective grid, striped sun, noise-carved mountains and twinkling sky. Move the pointer to pan and tilt the camera. File: components/opus/backgrounds/synthwave-grid.tsx ```tsx import { SynthwaveGrid } from "@/components/opus/backgrounds/synthwave-grid"; ``` - `gridColor`: string — Neon grid lines. - `sunTop / sunBottom`: string — Sun gradient. - `skyTop / skyBottom`: string — Sky gradient. - `sun / mountains`: boolean = true — Toggle scene elements. - `speed`: number = 1 — Time multiplier. 0 freezes the animation; the pointer stays live. - `interactive`: boolean = true — React to the pointer (tracked on window, so overlaid content never blocks it). - `className`: string — Classes for the wrapper. Use `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Event Horizon (`event-horizon`) Backgrounds / Shader. A black hole with gravitational lensing, a Doppler-beamed accretion disk, a photon ring and the far side of the disk bent over the shadow. It drifts toward your pointer and warps the starfield behind it. File: components/opus/backgrounds/event-horizon.tsx ```tsx import { EventHorizon } from "@/components/opus/backgrounds/event-horizon"; ``` - `diskInner / diskOuter`: string — Accretion disk temperature gradient. - `nebula / background`: string — Space behind the hole. - `size`: number = 1 — Event-horizon radius multiplier. - `tilt`: number = 0.28 — How edge-on the disk appears (0.1–1). - `speed`: number = 1 — Time multiplier. 0 freezes the animation; the pointer stays live. - `interactive`: boolean = true — React to the pointer (tracked on window, so overlaid content never blocks it). - `className`: string — Classes for the wrapper. Use `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Liquid Chrome (`liquid-chrome`) Backgrounds / Shader. Polished molten metal: a noise height-field reflecting a procedural studio environment with strip lights and Fresnel tint. The pointer drags a ripple; clicks drop a splash. File: components/opus/backgrounds/liquid-chrome.tsx ```tsx import { LiquidChrome } from "@/components/opus/backgrounds/liquid-chrome"; ``` - `tint`: string — Colour of the reflected lights. - `shadow`: string — Colour of the dark reflections. - `scale / amplitude`: number = 1 / 1 — Wave frequency and height. - `speed`: number = 1 — Time multiplier. 0 freezes the animation; the pointer stays live. - `interactive`: boolean = true — React to the pointer (tracked on window, so overlaid content never blocks it). - `className`: string — Classes for the wrapper. Use `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Dither Field (`dither-field`) Backgrounds / Shader. 1-bit (or 3-tone) ordered dithering of drifting noise through a 2×2, 4×4 or 8×8 Bayer matrix at a chunky pixel size. The pointer is a soft spotlight. File: components/opus/backgrounds/dither-field.tsx ```tsx import { DitherField } from "@/components/opus/backgrounds/dither-field"; ``` - `color / background`: string — Ink and paper colours. - `midtone`: string — Optional third tone for a 3-level dither. - `pixel`: number = 3 — Dither pixel size (CSS px). - `matrix`: 2 | 4 | 8 = 8 — Bayer matrix size. - `bias`: number = 0 — Brightness offset. - `speed`: number = 1 — Time multiplier. 0 freezes the animation; the pointer stays live. - `interactive`: boolean = true — React to the pointer (tracked on window, so overlaid content never blocks it). - `className`: string — Classes for the wrapper. Use `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Caustics (`caustics`) Backgrounds / Shader. Light dancing on a pool floor — two layers of animated Voronoi edges refracted by a noisy water surface, with drifting motes. The pointer is a sunbeam that focuses the network. File: components/opus/backgrounds/caustics.tsx ```tsx import { Caustics } from "@/components/opus/backgrounds/caustics"; ``` - `light / deep / shallow`: string — Caustic light and water gradient. - `scale`: number = 1 — Pattern size. - `intensity`: number = 1 — Brightness of the light network. - `speed`: number = 1 — Time multiplier. 0 freezes the animation; the pointer stays live. - `interactive`: boolean = true — React to the pointer (tracked on window, so overlaid content never blocks it). - `className`: string — Classes for the wrapper. Use `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Light Rays (`light-rays`) Backgrounds / Shader. Volumetric god rays pouring from above, flickering through noise with dust caught in the beams. The source swings to aim at your pointer. File: components/opus/backgrounds/light-rays.tsx ```tsx import { LightRays } from "@/components/opus/backgrounds/light-rays"; ``` - `color / colorB`: string — Beam colours (alternating). - `background`: string — Darkness behind the light. - `rays`: number = 14 — Beam count. - `spread`: number = 0.7 — Cone width. - `dust`: boolean = true — Floating dust particles. - `speed`: number = 1 — Time multiplier. 0 freezes the animation; the pointer stays live. - `interactive`: boolean = true — React to the pointer (tracked on window, so overlaid content never blocks it). - `className`: string — Classes for the wrapper. Use `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Fluid (`fluid`) Backgrounds / Simulation. Real-time Navier–Stokes ink on the GPU: semi-Lagrangian advection, vorticity confinement, a 20-iteration Jacobi pressure solve and dye with fake lighting. Drag to stir, click to burst, or leave it to paint itself. File: components/opus/backgrounds/fluid.tsx ```tsx import { Fluid } from "@/components/opus/backgrounds/fluid"; ``` - `colors`: string[] — Dye palette cycled per stroke. Pass [] for a rainbow. - `background`: string = "#04040a" — Colour under the dye. - `curl`: number = 28 — Vorticity confinement — how swirly the flow is. - `dissipation`: number = 0.9 — How fast the dye fades. - `viscosity`: number = 0.25 — How fast motion dies down. - `radius / force`: number = 0.22 / 1 — Splat size and strength. - `shading`: boolean = true — Fake lighting from the dye gradient. - `autoplay`: boolean = true — Ambient splats while nobody interacts. - `simResolution / dyeResolution`: number = 128 / 720 — Grid sizes (short side). Lower for weak GPUs. - `interactive / className / children`: — — As for every OPUS background. ## Water Ripple (`water-ripple`) Backgrounds / Simulation. A height-field wave equation solved on the GPU, refracting a procedural tiled pool — or any image you pass. Move to leave a wake, click to drop a stone, and let the rain fall when idle. File: components/opus/backgrounds/water-ripple.tsx ```tsx import { WaterRipple } from "@/components/opus/backgrounds/water-ripple"; // or ripple any (same-origin / CORS) image: ``` - `image`: string — Image to refract (needs CORS if cross-origin). Omit for the procedural pool. - `deep / shallow / tile`: string — Procedural pool colours. - `tileSize`: number = 48 — Pool tile size (CSS px). - `radius / strength`: number = 0.03 / 0.35 — Drop size and height. - `damping`: number = 0.985 — Wave lifetime (0.9–0.999). - `refraction`: number = 0.04 — How strongly waves bend the image. - `rain`: boolean = true — Random drops while idle. ## Reaction–Diffusion (`reaction-diffusion`) Backgrounds / Simulation. The Gray–Scott model growing coral, mitosis, worms, mazes or spots in real time. Paint new life with your pointer; double-click to reseed. Every frame runs up to 24 simulation steps. File: components/opus/backgrounds/reaction-diffusion.tsx ```tsx import { ReactionDiffusion } from "@/components/opus/backgrounds/reaction-diffusion"; ``` - `pattern`: "coral" | "mitosis" | "worms" | "maze" | "spots" | "waves" = "coral" — Named feed/kill presets. - `feed / kill`: number — Override the Gray–Scott parameters directly. - `colorA / colorB / background`: string — Low/high concentration colours and the empty medium. - `speed`: number = 12 — Simulation steps per frame (1–24). - `scale`: number = 1 — Sim cell size: 1 = one cell per 2 CSS px. - `brush`: number = 0.02 — Paint radius. ## Constellation (`constellation`) Backgrounds / Canvas. Drifting nodes linked by distance-faded lines, accelerated with a spatial hash. The pointer wires itself into the network and attracts (or repels) nearby stars; clicks blast them apart. File: components/opus/backgrounds/constellation.tsx ```tsx import { Constellation } from "@/components/opus/backgrounds/constellation"; ``` - `color / accent`: string — Network colour and pointer-link colour. - `density`: number = 1 — Nodes per 10,000 px² (capped at 400). - `linkDistance`: number = 120 — Max link length (px). - `speed`: number = 1 — Cruise speed. - `mode`: "attract" | "repel" | "none" = "attract" — Pointer force. - `interactive`: boolean = true — React to the pointer (tracked on window). - `className`: string — Wrapper classes — `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Flow Field (`flow-field`) Backgrounds / Canvas. Thousands of particles riding the curl of a Perlin field — divergence-free, so streams never clump — leaving silky colour trails. The pointer is a vortex every stream bends around. File: components/opus/backgrounds/flow-field.tsx ```tsx import { FlowField } from "@/components/opus/backgrounds/flow-field"; ``` - `colors`: string[] — Gradient sampled by each particle’s heading. - `count`: number = 1800 — Particles (max 6000). - `scale`: number = 1.4 — Noise zoom. - `trail`: number = 0.93 — Trail persistence (0.8–0.995). - `weight`: number = 1.1 — Stroke width (px). - `interactive`: boolean = true — React to the pointer (tracked on window). - `className`: string — Wrapper classes — `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Dot Grid (`dot-grid`) Backgrounds / Canvas. A matrix of spring-loaded dots that bulge away from (or toward) the pointer and wobble back into place. Clicking sends a shockwave rolling through the grid. File: components/opus/backgrounds/dot-grid.tsx ```tsx import { DotGrid } from "@/components/opus/backgrounds/dot-grid"; ``` - `color / activeColor`: string — Resting and excited dot colours. - `gap / size`: number = 26 / 1.6 — Grid pitch and dot radius (px). - `radius`: number = 140 — Pointer influence radius (px). - `mode`: "push" | "pull" = "push" — Direction of the pointer force. - `stiffness`: number = 0.08 — Spring stiffness — lower is jelly. - `shockwave`: boolean = true — Click sends a ring through the grid. - `interactive`: boolean = true — React to the pointer (tracked on window). - `className`: string — Wrapper classes — `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Glyph Rain (`glyph-rain`) Backgrounds / Canvas. Digital rain in katakana, binary, hex, latin or block glyphs with mutating trails. Optional torch mode dims the rain except where your pointer shines. File: components/opus/backgrounds/glyph-rain.tsx ```tsx import { GlyphRain } from "@/components/opus/backgrounds/glyph-rain"; ``` - `color / headColor`: string — Trail and leading-glyph colours. - `glyphs`: "katakana" | "binary" | "hex" | "latin" | "blocks" = "katakana" — Character set. - `fontSize`: number = 16 — Glyph size (px). - `spotlight`: boolean = false — Torch mode: dark except around the pointer. - `interactive`: boolean = true — React to the pointer (tracked on window). - `className`: string — Wrapper classes — `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## ASCII Field (`ascii-field`) Backgrounds / Canvas. Two octaves of noise rendered through a character ramp — terminal art that breathes. The pointer sends ripples through the field and brightens what it touches. File: components/opus/backgrounds/ascii-field.tsx ```tsx import { AsciiField } from "@/components/opus/backgrounds/ascii-field"; ``` - `color / highlight`: string — Dim and bright character colours. - `ramp`: string = " .:-=+*#%@" — Characters from dark to bright. - `cell`: number = 14 — Character cell size (px). - `scale`: number = 1 — Noise zoom. - `interactive`: boolean = true — React to the pointer (tracked on window). - `className`: string — Wrapper classes — `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Boids (`boids`) Backgrounds / Canvas. Craig Reynolds’ flocking — separation, alignment, cohesion — on a spatial hash. The flock scatters from your pointer (blushing as it flees) or follows it like a shadow. File: components/opus/backgrounds/boids.tsx ```tsx import { Boids } from "@/components/opus/backgrounds/boids"; ``` - `color / alarm`: string — Calm and fleeing colours. - `count`: number = 160 — Number of boids (max 400). - `speed / size`: number = 110 / 6 — Cruise speed (px/s) and body size (px). - `mode`: "flee" | "follow" = "flee" — Pointer behaviour. - `interactive`: boolean = true — React to the pointer (tracked on window). - `className`: string — Wrapper classes — `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Magnetic Field (`magnetic-field`) Backgrounds / Canvas. A lattice of compass needles that swing to face the pointer (or orbit around it), growing and glowing as you get close. Idle, they track a wandering attractor. File: components/opus/backgrounds/magnetic-field.tsx ```tsx import { MagneticField } from "@/components/opus/backgrounds/magnetic-field"; ``` - `color / activeColor`: string — Far and near needle colours. - `gap / length`: number = 28 / 14 — Grid pitch and needle length (px). - `ease`: number = 0.12 — Rotation easing per frame. - `mode`: "toward" | "around" = "toward" — Point at the pointer, or orbit it. - `interactive`: boolean = true — React to the pointer (tracked on window). - `className`: string — Wrapper classes — `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Elastic Grid (`elastic-grid`) Backgrounds / Canvas. A rubber-sheet grid: the pointer is a lens that bulges (or pinches) the mesh, stretched edges glow, and every vertex springs back with a wobble. Clicks punch it. File: components/opus/backgrounds/elastic-grid.tsx ```tsx import { ElasticGrid } from "@/components/opus/backgrounds/elastic-grid"; ``` - `color / accent`: string — Line colour and stretch glow. - `cell`: number = 40 — Grid cell size (px). - `radius`: number = 180 — Lens radius (px). - `strength`: number = 0.6 — Positive bulges, negative pinches (−1..1). - `stiffness`: number = 0.07 — Spring stiffness. - `interactive`: boolean = true — React to the pointer (tracked on window). - `className`: string — Wrapper classes — `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Pixel Trail (`pixel-trail`) Backgrounds / Canvas. A grid that lights up cell by cell behind the pointer — strokes are rasterised so fast swipes leave no gaps — fading back with a shrink. Idle sparkles keep it alive. File: components/opus/backgrounds/pixel-trail.tsx ```tsx import { PixelTrail } from "@/components/opus/backgrounds/pixel-trail"; ``` - `colors`: string[] — Colours cycled along each stroke. - `gridColor`: string = "rgba(255,255,255,0.04)" — Grid lines (use "transparent" to hide). - `cell`: number = 22 — Cell size (px). - `fade`: number = 1.2 — Seconds to fade. - `brush`: number = 1 — Brush radius in cells. - `sparkle`: boolean = true — Random idle sparkles. - `interactive`: boolean = true — React to the pointer (tracked on window). - `className`: string — Wrapper classes — `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Optional content rendered above the canvas. ## Spotlight Grid (`spotlight-grid`) Backgrounds / CSS. The Linear/Vercel hero grid: a faint pattern with a pointer-following spotlight that reveals brighter lines and a colour wash. Driven by two CSS variables from a single rAF — zero re-renders. File: components/opus/backgrounds/spotlight-grid.tsx ```tsx import { SpotlightGrid } from "@/components/opus/backgrounds/spotlight-grid"; ``` - `pattern`: "lines" | "dots" | "cross" = "lines" — Grid style. - `lineColor / glowColor`: string — Resting and revealed line colours (any CSS colour). - `wash`: string — Soft colour under the spotlight. - `cell / radius`: number = 44 / 260 — Cell size and spotlight radius (px). - `fade`: boolean = true — Fade the grid toward the edges. - `className`: string — Wrapper classes — `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Content rendered on top. ## Aurora Blobs (`aurora-blobs`) Backgrounds / CSS. Blurred gradient orbs drifting on transform-only keyframes with a film-grain overlay. The cheapest beautiful background there is — and it renders on the server. File: components/opus/backgrounds/aurora-blobs.tsx ```tsx import { AuroraBlobs } from "@/components/opus/backgrounds/aurora-blobs"; ``` - `colors`: string[] — Up to five blob colours. - `background`: string — Base colour. - `blur`: number = 64 — Blur radius (px). - `duration`: number = 22 — Seconds per loop. - `opacity / grain`: number = 0.9 / 0.12 — Blob opacity and grain overlay. - `className`: string — Wrapper classes — `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Content rendered on top. ## Meteors (`meteors`) Backgrounds / CSS. A deterministic meteor shower over a faint star field — identical on server and client, animated purely with the `animate-meteor` keyframes from opus.css. File: components/opus/backgrounds/meteors.tsx ```tsx import { Meteors } from "@/components/opus/backgrounds/meteors"; ``` - `count`: number = 18 — Number of meteors. - `color / background`: string — Meteor and sky colours. - `angle`: number = 215 — Fall direction (deg). - `duration`: number = 7 — Average flight time (s). - `stars`: boolean = true — Static stars behind. - `className`: string — Wrapper classes — `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Content rendered on top. ## Pattern (`pattern`) Backgrounds / CSS. Eight SVG tile patterns — grid, dots, cross, diagonal, checker, plus, waves, isometric — with edge fades and optional pulsing highlight tiles. The workhorse behind most hero sections. File: components/opus/backgrounds/pattern.tsx ```tsx import { Pattern } from "@/components/opus/backgrounds/pattern"; ``` - `kind`: "grid" | "dots" | "cross" | "diagonal" | "checker" | "plus" | "waves" | "isometric" = "grid" — Tile shape. - `color`: string — Stroke/fill colour — any CSS colour. - `size / stroke`: number = 32 / 1 — Tile size and line width (px). - `fade`: "radial" | "top" | "bottom" | "x" | "none" = "radial" — Edge mask. - `highlights`: number = 0 — Randomly lit, pulsing tiles. - `className`: string — Wrapper classes — `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Content rendered on top. ## Retro Grid (`retro-grid`) Backgrounds / CSS. A CSS-3D perspective floor scrolling toward the viewer, with a horizon glow. The lightweight sibling of Synthwave Grid. File: components/opus/backgrounds/retro-grid.tsx ```tsx import { RetroGrid } from "@/components/opus/backgrounds/retro-grid"; ``` - `lineColor / glow / background`: string — Grid, horizon glow and sky. - `angle`: number = 68 — Floor tilt (deg). - `cell`: number = 60 — Cell size (px). - `duration`: number = 1.4 — Seconds per cell of travel. - `className`: string — Wrapper classes — `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Content rendered on top. ## Beams (`beams`) Backgrounds / CSS. Glowing light pulses racing along the lines of a faded grid — the “background beams” look with deterministic placement and no JavaScript. File: components/opus/backgrounds/beams.tsx ```tsx import { Beams } from "@/components/opus/backgrounds/beams"; ``` - `colors`: string[] — Beam colours (cycled). - `lineColor / background`: string — Grid and backdrop. - `cell / count / duration`: number = 64 / 14 / 5 — Grid pitch, number of beams, average crossing time. - `className`: string — Wrapper classes — `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Content rendered on top. ## Ripple Rings (`ripple-rings`) Backgrounds / CSS. Concentric rings breathing in a staggered wave, fading downward — a calm focal backdrop for a logo, avatar or call-to-action. File: components/opus/backgrounds/ripple-rings.tsx ```tsx import { RippleRings } from "@/components/opus/backgrounds/ripple-rings"; ``` - `color`: string — Ring colour — use rgba(…, 1) so the inner glow can derive its alpha. - `rings / base / step`: number = 8 / 180 / 90 — Count, first diameter and growth (px). - `duration`: number = 3.4 — Seconds per breath. - `className`: string — Wrapper classes — `absolute inset-0` to fill a relative parent. - `children`: ReactNode — Content rendered on top. ## Spotlight Card (`spotlight-card`) Effects / Pointer. A card lit by your pointer — a soft pool of light inside and a brighter rim where the light catches the border. File: components/opus/effects/spotlight-card.tsx ```tsx import { SpotlightCard } from "@/components/opus/effects/spotlight-card"; … ``` - `color`: string = "rgba(124,92,255,0.16)" — Light pooling inside the card. - `borderColor`: string = "rgba(167,139,250,0.75)" — Light on the border. - `radius`: number = 360 — Spotlight radius (px). - `...props`: HTMLAttributes
— Passed to the card element. ## Tilt Card (`tilt-card`) Effects / Pointer. 3D tilt with a specular glare and real depth — wrap children in to float them toward you. File: components/opus/effects/tilt-card.tsx ```tsx import { TiltCard, TiltLayer } from "@/components/opus/effects/tilt-card"; Floating title ``` - `max`: number = 12 — Max tilt (deg). - `scale`: number = 1.03 — Hover lift. - `glare`: boolean = true — Pointer-following specular highlight. - `perspective`: number = 900 — Perspective (px) — lower is more dramatic. - `TiltLayer.depth`: number = 30 — translateZ for a child layer (px). ## Magnetic (`magnetic`) Effects / Pointer. Pulls any element toward the pointer when it comes near, then springs back. Mark an inner node with data-magnetic-inner for parallax. File: components/opus/effects/magnetic.tsx ```tsx import { Magnetic } from "@/components/opus/effects/magnetic"; ``` - `range`: number = 60 — Reach beyond the element edge (px). - `strength`: number = 0.35 — Fraction of the pointer offset followed. - `innerStrength`: number = 0.2 — Extra travel for [data-magnetic-inner]. ## Glow Cards (`glow-cards`) Effects / Pointer. Linear-style grid: one pointer lights the borders of every nearby card, so the light appears to slide across the gaps. File: components/opus/effects/glow-cards.tsx ```tsx import { GlowGroup, GlowCard } from "@/components/opus/effects/glow-cards"; … ``` - `color`: string = "rgba(167,139,250,0.9)" — On : glow colour. - `radius`: number = 300 — On : glow radius (px). ## Lens (`lens`) Effects / Pointer. A magnifying glass over any React content — images, text, charts. The copy is scaled around the pointer and clipped to a circle. File: components/opus/effects/lens.tsx ```tsx import { Lens } from "@/components/opus/effects/lens"; ``` - `zoom`: number = 2.2 — Magnification. - `size`: number = 170 — Lens diameter (px). - `ringColor`: string — Ring around the lens. ## Hover Reveal List (`hover-reveal-list`) Effects / Pointer. An editorial index — hover a row and its image floats beside the cursor, leaning into your movement. File: components/opus/effects/hover-reveal-list.tsx ```tsx import { HoverRevealList } from "@/components/opus/effects/hover-reveal-list"; ``` - `items`: { title; meta?; image; href? }[] — Rows to render. - `previewWidth`: number = 260 — Floating preview width (px). ## Image Trail (`image-trail`) Effects / Pointer. Move across the area and a trail of images unfurls behind the pointer. Pooled DOM nodes and the Web Animations API — no re-renders. File: components/opus/effects/image-trail.tsx ```tsx import { ImageTrail } from "@/components/opus/effects/image-trail"; ``` - `images`: string[] — Image URLs, cycled. - `threshold`: number = 80 — Pointer distance between drops (px). - `width`: number = 160 — Image width (px). - `life`: number = 900 — ms each image lives. - `max`: number = 12 — Pool size. ## Parallax Depth (`parallax-depth`) Effects / Pointer. A pointer-driven parallax scene. Stack children — positive moves with you, negative against. File: components/opus/effects/parallax-depth.tsx ```tsx import { ParallaxDepth, ParallaxLayer } from "@/components/opus/effects/parallax-depth"; sky foreground ``` - `travel`: number = 30 — Max travel for depth 1 (px). - `ParallaxLayer.depth`: number = 1 — Layer multiplier (negative = opposite). ## Liquid Glass (`liquid-glass`) Effects / Pointer. Glass that refracts what’s behind it: backdrop blur + an SVG displacement map, rim lighting and a pointer-tracked specular. Frosted fallback outside Chromium. File: components/opus/effects/liquid-glass.tsx ```tsx import { LiquidGlass } from "@/components/opus/effects/liquid-glass"; … ``` - `refraction`: number = 60 — Displacement strength. - `blur`: number = 4 — Backdrop blur (px). - `tint`: string = "rgba(255,255,255,0.06)" — Glass tint. - `highlight`: boolean = true — Pointer specular. ## Border Beam (`border-beam`) Effects / Borders & light. A light that races around its parent’s border, inheriting the radius. Stack several with delays for orbiting comets. File: components/opus/effects/border-beam.tsx ```tsx import { BorderBeam } from "@/components/opus/effects/border-beam";
…
``` - `colorFrom / colorTo`: string — Head and tail colours. - `duration`: number = 6 — Seconds per lap. - `width`: number = 1.5 — Border thickness (px). - `length`: number = 0.18 — Beam length (fraction of a lap). - `delay`: number = 0 — Start offset (0–1 of a lap). - `reverse`: boolean — Counter-clockwise. ## Gradient Border (`gradient-border`) Effects / Borders & light. A container with a rotating multi-colour border and an optional blurred halo. File: components/opus/effects/gradient-border.tsx ```tsx import { GradientBorder } from "@/components/opus/effects/gradient-border";
…
``` - `colors`: string[] — Gradient stops (repeat the first at the end for a seamless loop). - `width`: number = 1.5 — Border thickness (px). - `duration`: number = 4 — Seconds per rotation (0 = static). - `glow`: number = 0.5 — Halo opacity. ## Shimmer Button (`shimmer-button`) Effects / Borders & light. A premium CTA: a spark orbits the border while a highlight sweeps across the face. File: components/opus/effects/shimmer-button.tsx ```tsx import { ShimmerButton } from "@/components/opus/effects/shimmer-button"; Get early access ``` - `shimmerColor`: string = "#ffffff" — Spark + sweep colour. - `background`: string — Button fill (gradients welcome). - `duration`: number = 3 — Seconds per orbit. ## Marquee (`marquee`) Effects / Motion. Seamless infinite scroller — horizontal or vertical, reversible, pause on hover, faded edges. Pure CSS. File: components/opus/effects/marquee.tsx ```tsx import { Marquee } from "@/components/opus/effects/marquee"; {logos} ``` - `duration`: number = 30 — Seconds per loop. - `gap`: string = "1rem" — Gap between items. - `reverse / vertical`: boolean — Direction and axis. - `pauseOnHover`: boolean = true — Pause while hovered. - `fade`: boolean = true — Mask the edges. - `repeat`: number = 2 — Copies of the content (raise for short lists on wide screens). ## Reveal (`reveal`) Effects / Motion. Scroll-into-view entrances — fade, blur, scale, flip, slide — with optional per-child stagger. File: components/opus/effects/reveal.tsx ```tsx import { Reveal } from "@/components/opus/effects/reveal";

…

…

``` - `effect`: "fade" | "fade-up" | "fade-down" | "slide-left" | "slide-right" | "scale" | "blur" | "flip" = "fade-up" — Entrance style. - `delay / stagger / duration`: number = 0 / 0 / 700 — Timing (ms). - `repeat`: boolean = false — Hide again when leaving the viewport. - `threshold`: number = 0.15 — IntersectionObserver threshold. ## Dock (`dock`) Effects / Motion. macOS dock magnification with transforms only — icons scale and neighbours shift to make room, the glass shelf widens with them. File: components/opus/effects/dock.tsx ```tsx import { Dock } from "@/components/opus/effects/dock"; , onClick }]} /> ``` - `items`: DockItem[] — { id, label, icon, onClick?, href?, active? } - `size`: number = 48 — Base icon size (px). - `magnification`: number = 1.8 — Peak scale. - `distance`: number = 150 — Influence distance (px). ## Animated List (`animated-list`) Effects / Motion. Notification-feed choreography: items drop in from the top with a springy settle while older ones recede. File: components/opus/effects/animated-list.tsx ```tsx import { AnimatedList } from "@/components/opus/effects/animated-list"; {notifications} ``` - `interval`: number = 1400 — ms between items. - `loop`: boolean = true — Restart after the last item. - `max`: number = 5 — Items visible at once. ## Confetti (`confetti`) Effects / Motion. A `confetti()` function with physics, flutter and three shapes, plus a . One shared canvas, removed when the last piece lands. File: components/opus/effects/confetti.tsx ```tsx import { confetti, ConfettiButton } from "@/components/opus/effects/confetti"; confetti({ x: 200, y: 300, spread: 90 }); Celebrate ``` - `x / y`: number — Origin in viewport px (default: screen centre). - `count / spread / angle / velocity`: number = 120 / 70 / -90 / 900 — Burst shape. - `colors`: string[] — Palette. - `shape`: "square" | "circle" | "strip" | "mixed" = "mixed" — Piece shape. - `gravity`: number = 1 — Fall speed multiplier. ## Scroll Progress (`scroll-progress`) Effects / Motion. A reading-progress bar for the page or any scroll container, animated with scaleX only. File: components/opus/effects/scroll-progress.tsx ```tsx import { ScrollProgress } from "@/components/opus/effects/scroll-progress"; // page // a scroll box ``` - `container`: RefObject — Scroll container (default: window). - `color`: string — Bar background. - `height`: number = 3 — Bar height (px). - `position`: "top" | "bottom" = "top" — Edge. ## Ripple (`ripple`) Effects / Motion. Material-style ink from the exact press point; grows while held, fades on release. File: components/opus/effects/ripple.tsx ```tsx import { Ripple } from "@/components/opus/effects/ripple"; ``` - `color`: string = "currentColor" — Ink colour. - `duration`: number = 650 — Grow time (ms). ## Custom Cursor (`custom-cursor`) Effects / Cursor. Dot + lagging ring that swells over links, morphs into a label with data-cursor-text, and squishes on press. Scoped or page-wide; off on touch. File: components/opus/effects/custom-cursor.tsx ```tsx import { CustomCursor } from "@/components/opus/effects/custom-cursor"; // in your root layout
…
``` - `color`: string = "#ffffff" — Cursor colour. - `size`: number = 36 — Ring diameter (px). - `ease`: number = 0.18 — Ring lag. - `blend`: "difference" | "normal" | "exclusion" = "difference" — mix-blend-mode. - `hideNative`: boolean = true — Hide the OS cursor in scope. - `scope`: string — Element id to restrict to. ## Click Spark (`click-spark`) Effects / Cursor. Every click throws a ring of sparks in currentColor — a tiny, satisfying acknowledgement. File: components/opus/effects/click-spark.tsx ```tsx import { ClickSpark } from "@/components/opus/effects/click-spark"; … ``` - `color`: string = "currentColor" — Spark colour. - `count / radius / length`: number = 8 / 26 / 10 — Spark count, travel and size (px). - `duration`: number = 0.45 — Seconds. ## Scramble Text (`scramble-text`) Text / Animated. A decoder effect — characters cycle through random glyphs and lock in left to right. Plays on mount, on view or on hover. File: components/opus/text/scramble-text.tsx ```tsx import { ScrambleText } from "@/components/opus/text/scramble-text"; ``` - `text`: string — Final text (also the aria-label). - `trigger`: "mount" | "view" | "hover" = "view" — When to play. - `speed`: number = 32 — ms per character settle. - `charset`: string — Glyphs used while scrambling. - `as`: ElementType = "span" — Element to render. ## Gradient Text (`gradient-text`) Text / Animated. Text filled with a slowly panning gradient via background-clip. Zero JS. File: components/opus/text/gradient-text.tsx ```tsx import { GradientText } from "@/components/opus/text/gradient-text";

Build beautiful things

``` - `colors`: string[] — Stops (repeat the first at the end for a seamless pan). - `duration`: number = 6 — Seconds per pan (0 = static). - `angle`: number = 90 — Gradient angle. ## Shiny Text (`shiny-text`) Text / Animated. A sheen sweeping across muted text — perfect for announcement pills and “thinking…” states. Inherits your text colour. File: components/opus/text/shiny-text.tsx ```tsx import { ShinyText } from "@/components/opus/text/shiny-text"; ✦ Introducing v2 ``` - `duration`: number = 2.8 — Seconds per sweep. - `width`: number = 24 — Shine band width (%). - `dim`: number = 0.45 — Resting opacity of the text. ## Typewriter (`typewriter`) Text / Animated. Types, holds and deletes phrases with a human-ish rhythm and a blinking caret. Screen readers get the full list once. File: components/opus/text/typewriter.tsx ```tsx import { Typewriter } from "@/components/opus/text/typewriter"; ``` - `words`: string[] — Phrases in order. - `typeSpeed / deleteSpeed`: number = 70 / 35 — ms per character. - `pause`: number = 1400 — Hold time (ms). - `loop`: boolean = true — Cycle forever. - `caret`: "bar" | "block" | "underscore" | "none" = "bar" — Caret style. ## Number Ticker (`number-ticker`) Text / Animated. Counts to a value with an expo-out ease when it scrolls into view, and animates from the current number on every change. Intl-formatted. File: components/opus/text/number-ticker.tsx ```tsx import { NumberTicker } from "@/components/opus/text/number-ticker"; ``` - `value`: number — Target value. - `from`: number = 0 — Start value. - `duration`: number = 1600 — ms. - `format / locale`: Intl.NumberFormatOptions / string — Formatting. - `startOnView`: boolean = true — Wait until visible. ## Text Reveal (`text-reveal`) Text / Animated. Splits a heading into words or characters and reveals them in a stagger — blur, rise, fade or masked slide. File: components/opus/text/text-reveal.tsx ```tsx import { TextReveal } from "@/components/opus/text/text-reveal"; ``` - `text`: string — The text (kept as aria-label). - `by`: "word" | "char" = "word" — Split granularity. - `effect`: "blur" | "rise" | "fade" | "mask" = "blur" — Entrance. - `stagger / duration / delay`: number — Timing (ms). ## Rotating Words (`rotating-words`) Text / Animated. Swaps words in place while the slot glides to the new width, so the sentence never jumps. Slide, flip or blur. File: components/opus/text/rotating-words.tsx ```tsx import { RotatingWords } from "@/components/opus/text/rotating-words";

Made for

``` - `words`: string[] — Words to cycle. - `interval`: number = 2200 — ms per word. - `effect`: "slide" | "flip" | "blur" = "slide" — Swap animation. ## Morphing Text (`morphing-text`) Text / Animated. Words melt into one another — a cross-blur pushed through an SVG alpha threshold for a liquid, gooey morph. File: components/opus/text/morphing-text.tsx ```tsx import { MorphingText } from "@/components/opus/text/morphing-text"; ``` - `words`: string[] — Words to morph between. - `morphTime / holdTime`: number = 1.1 / 1.6 — Seconds. ## Slot Counter (`slot-counter`) Text / Animated. An odometer — every digit is a 0–9 column that rolls with a springy overshoot when the value changes. File: components/opus/text/slot-counter.tsx ```tsx import { SlotCounter } from "@/components/opus/text/slot-counter"; ``` - `value`: number — Number to show. - `format / locale`: Intl.NumberFormatOptions / string — Formatting. - `duration`: number = 900 — Base roll time (ms). ## Glitch Text (`glitch-text`) Text / Animated. RGB-split slice glitch from two pseudo-element copies — always on, or only while hovered. Zero JS. File: components/opus/text/glitch-text.tsx ```tsx import { GlitchText } from "@/components/opus/text/glitch-text"; ``` - `text`: string — Text (copied into data-text for the layers). - `onHover`: boolean = false — Glitch only while hovered. - `speed`: number = 2.2 — Seconds per cycle. - `colorA / colorB`: string — Split colours. ## Highlighter (`highlighter`) Text / Interactive. Hand-drawn emphasis that draws itself into view — marker, underline, circle, strike-through or box. File: components/opus/text/highlighter.tsx ```tsx import { Highlighter } from "@/components/opus/text/highlighter"; Components that actually ship ``` - `variant`: "highlight" | "underline" | "circle" | "strike" | "box" = "highlight" — Mark style. - `color`: string = "#facc15" — Ink colour. - `duration / delay`: number = 800 / 0 — Timing (ms). ## Text Pressure (`text-pressure`) Text / Interactive. Each letter’s variable-font weight responds to pointer proximity — a typographic lens. Static fonts still get the stretch. File: components/opus/text/text-pressure.tsx ```tsx import { TextPressure } from "@/components/opus/text/text-pressure"; ``` - `minWeight / maxWeight`: number = 200 / 900 — wght axis range. - `radius`: number = 160 — Influence radius (px). - `stretch`: number = 0.25 — Extra scaleY under the pointer. ## Particle Text (`particle-text`) Text / Interactive. Text rasterised into thousands of particles that scatter from your pointer and spring home. Clicks blow the letters apart. File: components/opus/text/particle-text.tsx ```tsx import { ParticleText } from "@/components/opus/text/particle-text"; ``` - `text`: string — Text to sample. - `colors`: string[] — Left→right gradient. - `fontWeight / fontFamily`: number / string = 800 / "inherit" — Sampling font (auto-fitted). - `density`: number = 4 — Sampling step (px) — lower = more particles. - `size / radius`: number = 1.6 / 90 — Particle size and repel radius (px). ## Circular Text (`circular-text`) Text / Interactive. Text set on a rotating circle — the “scroll down ·” badge — speeding up on hover. Pure SVG + CSS. File: components/opus/text/circular-text.tsx ```tsx import { CircularText } from "@/components/opus/text/circular-text"; ``` - `text`: string — Text around the circle (add separators). - `size`: number = 140 — Diameter (px). - `duration`: number = 14 — Seconds per turn. - `fontSize / spacing`: number = 12 / 0.28 — Type size and tracking (em). ## Ring Carousel (`ring-carousel`) 3D / Gallery. A 3D cylinder of cards — drag with inertia and snapping, arrow keys, or let it auto-spin. The front card gets data-front. File: components/opus/three/ring-carousel.tsx ```tsx import { RingCarousel } from "@/components/opus/three/ring-carousel"; {cards} ``` - `itemWidth / gap`: number = 220 / 24 — Card width and spacing (px) — radius is derived. - `autoplay`: number = 8 — Idle spin (deg/s); pauses on hover. - `snap`: boolean = true — Settle on the nearest card. - `tilt / perspective`: number = -8 / 1200 — Camera tilt and perspective. ## Sphere Gallery (`sphere-gallery`) 3D / Gallery. Stand inside a dome of images. Drag to look around with inertia; click a tile to bring it forward. CSS 3D only. File: components/opus/three/sphere-gallery.tsx ```tsx import { SphereGallery } from "@/components/opus/three/sphere-gallery"; ``` - `images`: string[] — Image URLs (repeated to fill the sphere). - `radius / tile`: number = 420 / 110 — Sphere radius and tile size (px). - `rings`: number = 5 — Latitude rings. - `speed`: number = 6 — Idle rotation (deg/s). ## Coverflow (`coverflow`) 3D / Gallery. Classic coverflow with reflections — click, drag, swipe, wheel or arrow keys. Exposes listbox semantics. File: components/opus/three/coverflow.tsx ```tsx import { Coverflow } from "@/components/opus/three/coverflow"; {covers} ``` - `initial`: number = 0 — Starting index. - `itemWidth`: number = 220 — Cover size (px). - `angle / spacing`: number = 55 / 0.42 — Side rotation and spread. - `onChange`: (i: number) => void — Active index changed. ## Expand Gallery (`expand-gallery`) 3D / Gallery. Hover-accordion panels that widen to reveal the image and caption. Keyboard focus expands too. File: components/opus/three/expand-gallery.tsx ```tsx import { ExpandGallery } from "@/components/opus/three/expand-gallery"; ``` - `items`: { image; title; caption? }[] — Panels. - `grow`: number = 5 — Flex-grow of the active panel. ## 3D Marquee (`marquee-3d`) 3D / Gallery. A tilted wall of endlessly scrolling columns with alternating directions — a striking hero backdrop, zero JS. File: components/opus/three/marquee-3d.tsx ```tsx import { Marquee3D } from "@/components/opus/three/marquee-3d"; ``` - `items`: ReactNode[] — Tiles distributed across columns. - `columns`: number = 4 — Column count. - `duration`: number = 40 — Seconds per loop. - `rotateX / rotateZ`: number = 28 / -22 — Wall tilt (deg). ## Dot Globe (`dot-globe`) 3D / Objects. A dotted planet on canvas — Fibonacci sphere, procedural continents, pulsing markers and great-circle arcs with comets. Drag to spin. File: components/opus/three/dot-globe.tsx ```tsx import { DotGlobe } from "@/components/opus/three/dot-globe"; ``` - `color / oceanColor / accent`: string — Land, ocean and arc/marker colours. - `dots`: number = 2200 — Sphere resolution. - `speed`: number = 8 — Auto-spin (deg/s). - `markers`: { lat; lng; label? }[] — Pins. - `arcs`: [number, number][] — Marker index pairs to connect. - `seed`: number = 3 — Continent layout. ## Card Stack (`card-stack`) 3D / Objects. A swipeable deck: drag the top card and fling it — it flies off with spin and returns to the back. Keys and buttons too. File: components/opus/three/card-stack.tsx ```tsx import { CardStack } from "@/components/opus/three/card-stack"; …}>{cards} ``` - `depth`: number = 3 — Visible cards behind the top one. - `threshold`: number = 110 — Drag distance for a throw (px). - `onSwipe`: (index, "left" | "right") => void — Called after a throw. ## Flip Card (`flip-card`) 3D / Objects. A two-sided card that turns over in 3D on hover/focus, or on click/Enter. X or Y axis, springy easing. File: components/opus/three/flip-card.tsx ```tsx import { FlipCard } from "@/components/opus/three/flip-card"; } back={} trigger="click" /> ``` - `front / back`: ReactNode — Faces. - `trigger`: "hover" | "click" = "hover" — How it flips. - `axis`: "y" | "x" = "y" — Rotation axis. ## Button (`button`) Components / General. Eight variants, seven sizes, a width-stable loading state and `buttonVariants()` for links that should look like buttons. File: components/opus/ui/button.tsx ```tsx import { Button, buttonVariants } from "@/components/opus/ui/button"; Docs ``` - `variant`: "primary" | "secondary" | "outline" | "soft" | "ghost" | "destructive" | "link" | "glow" = "primary" — Visual style. - `size`: "xs" | "sm" | "md" | "lg" | "icon" | "icon-sm" | "icon-xs" = "md" — Height and padding. icon sizes are square. - `loading`: boolean = false — Spinner overlay; disables the button and sets aria-busy. - `...props`: ButtonHTMLAttributes — Everything a native