matrix
elevenlabs/matrixFreeComponent
shadcn/ui publishes no description for this item.
Install it
npx shadcn@latest add https://raw.githubusercontent.com/elevenlabs/ui/main/apps/www/public/r/matrix.jsonSource
1"use client"23import * as React from "react"4import { useEffect, useMemo, useRef, useState } from "react"56import { cn } from "@/lib/utils"78export type Frame = number[][]9type MatrixMode = "default" | "vu"1011interface CellPosition {12 x: number13 y: number14}1516interface MatrixProps extends React.HTMLAttributes<HTMLDivElement> {17 rows: number18 cols: number19 pattern?: Frame20 frames?: Frame[]21 fps?: number22 autoplay?: boolean23 loop?: boolean24 size?: number25 gap?: number26 palette?: {27 on: string28 off: string29 }30 brightness?: number31 ariaLabel?: string32 onFrame?: (index: number) => void33 mode?: MatrixMode34 levels?: number[]35}3637function clamp(value: number): number {38 return Math.max(0, Math.min(1, value))39}4041function ensureFrameSize(frame: Frame, rows: number, cols: number): Frame {42 const result: Frame = []43 for (let r = 0; r < rows; r++) {44 const row = frame[r] || []45 result.push([])46 for (let c = 0; c < cols; c++) {47 result[r][c] = row[c] ?? 048 }49 }50 return result51}5253function useAnimation(54 frames: Frame[] | undefined,55 options: {56 fps: number57 autoplay: boolean58 loop: boolean59 onFrame?: (index: number) => void60 }61): { frameIndex: number; isPlaying: boolean } {62 const [frameIndex, setFrameIndex] = useState(0)63 const [isPlaying, setIsPlaying] = useState(options.autoplay)64 const frameIdRef = useRef<number | undefined>(undefined)65 const lastTimeRef = useRef<number>(0)66 const accumulatorRef = useRef<number>(0)6768 useEffect(() => {69 if (!frames || frames.length === 0 || !isPlaying) {70 return71 }7273 const frameInterval = 1000 / options.fps7475 const animate = (currentTime: number) => {76 if (lastTimeRef.current === 0) {77 lastTimeRef.current = currentTime78 }7980 const deltaTime = currentTime - lastTimeRef.current81 lastTimeRef.current = currentTime82 accumulatorRef.current += deltaTime8384 if (accumulatorRef.current >= frameInterval) {85 accumulatorRef.current -= frameInterval8687 setFrameIndex((prev) => {88 const next = prev + 189 if (next >= frames.length) {90 if (options.loop) {91 options.onFrame?.(0)92 return 093 } else {94 setIsPlaying(false)95 return prev96 }97 }98 options.onFrame?.(next)99 return next100 })101 }102103 frameIdRef.current = requestAnimationFrame(animate)104 }105106// … truncated
Files it writes
More from shadcn/ui
All 50 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| audio-playeraudio-player | shadcn/ui | Components | Free | 2 deps | |
| bar-visualizerbar-visualizer | shadcn/ui | Components | Free | no deps | |
| conversationconversation | shadcn/ui | Components | Free | 1 dep | |
| conversation-barconversation-bar | shadcn/ui | Components | Free | 1 dep | |
| live-waveformlive-waveform | shadcn/ui | Components | Free | no deps | |
| messagemessage | shadcn/ui | Components | Free | 1 dep | |
| mic-selectormic-selector | shadcn/ui | Components | Free | no deps | |
| orborb | shadcn/ui | Components | Free | 4 deps |
