This component no longer exists. It was in Svelte Animations’s manifest when we first indexed it and is not there now — the registry served its inventory on 2026-08-05 and this item was not on it. The install command below will fail. It is kept here because a tutorial somewhere still tells people to run it.
Warp Background
svelte-animations/warp-backgroundRemovedBlock
A 3D perspective grid background with animated light beams that create a warping effect.
Install it
npx shadcn@latest add https://sv-animations.vercel.app/r/warp-background.jsonSource
1<script lang="ts">2 import { motion } from "motion-sv";3 import { cn } from "$UTILS$";4 import type { Snippet } from "svelte";5 import type { HTMLAttributes } from "svelte/elements";67 interface BeamProps {8 width: string | number;9 x: string | number;10 delay: number;11 duration: number;12 }1314 interface WarpBackgroundProps extends HTMLAttributes<HTMLDivElement> {15 children: Snippet;16 class?: string;17 perspective?: number;18 beamsPerSide?: number;19 beamSize?: number;20 beamDelayMax?: number;21 beamDelayMin?: number;22 beamDuration?: number;23 gridColor?: string;24 }2526 let {27 children,28 perspective = 100,29 class: className,30 beamsPerSide = 3,31 beamSize = 5,32 beamDelayMax = 3,33 beamDelayMin = 0,34 beamDuration = 3,35 gridColor = "var(--border)",36 ...props37 }: WarpBackgroundProps = $props();3839 const generateBeams = () => {40 const beams = [];41 const cellsPerSide = Math.floor(100 / beamSize);42 const step = cellsPerSide / beamsPerSide;4344 for (let i = 0; i < beamsPerSide; i++) {45 const x = Math.floor(i * step);46 const delay = Math.random() * (beamDelayMax - beamDelayMin) + beamDelayMin;47 beams.push({ x, delay });48 }49 return beams;50 };5152 const topBeams = generateBeams();53 const rightBeams = generateBeams();54 const bottomBeams = generateBeams();55 const leftBeams = generateBeams();5657 const containerStyle = $derived(`58 --perspective: ${perspective}px;59 --grid-color: ${gridColor};60 --beam-size: ${beamSize}%;61 `);62</script>6364<div class={cn("relative rounded border p-20", className)} {...props}>65 <div66 style={containerStyle}67 class="@container-[size] pointer-events-none absolute top-0 left-0 size-full overflow-hidden [clipPath:inset(0)] perspective-(--perspective) transform-3d"68 >69 <!-- top side -->70 <div71 class="@container absolute z-20 h-[100cqmax] w-[100cqi] origin-[50%_0%] transform-[rotateX(-90deg)] bg-size-[var(--beam-size)_var(--beam-size)] [background:linear-gradient(var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_-0.5px_/var(--beam-size)_var(--beam-size),linear-gradient(90deg,var(--grid-color)_0_1px,transparent_1px_var(--beam-size))_50%_50%_/var(--beam-size)_var(--beam-size)] transform-3d"72 >73 {#each topBeams as beam, index}74 {@const hue = Math.floor(Math.random() * 360)}75 {@const ar = Math.floor(Math.random() * 10) + 1}76 <motion.div77 style={{78 "--x": `${beam.x * beamSize}%`,79 "--width": `${beamSize}%`,80 "--aspect-ratio": `${ar}`,81// … truncated
What it pulls in
npm packages
