scrub-bar
elevenlabs/scrub-barFreeComponent
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/scrub-bar.jsonSource
1"use client"23import * as React from "react"4import {5 createContext,6 useCallback,7 useContext,8 useRef,9 type ComponentProps,10 type HTMLAttributes,11} from "react"1213import { cn } from "@/lib/utils"14import { Progress } from "@/components/ui/progress"1516function formatTimestamp(value: number) {17 if (!Number.isFinite(value) || value < 0) return "0:00"18 const totalSeconds = Math.floor(value)19 const minutes = Math.floor(totalSeconds / 60)20 const seconds = totalSeconds % 6021 return `${minutes}:${seconds.toString().padStart(2, "0")}`22}2324interface ScrubBarContextValue {25 duration: number26 value: number27 progress: number28 onScrub?: (time: number) => void29 onScrubStart?: () => void30 onScrubEnd?: () => void31}3233const ScrubBarContext = createContext<ScrubBarContextValue | null>(null)3435function useScrubBarContext() {36 const context = useContext(ScrubBarContext)37 if (!context) {38 throw new Error("useScrubBarContext must be used within a ScrubBar.Root")39 }40 return context41}4243interface ScrubBarContainerProps extends HTMLAttributes<HTMLDivElement> {44 duration: number45 value: number46 onScrub?: (time: number) => void47 onScrubStart?: () => void48 onScrubEnd?: () => void49}5051function ScrubBarContainer({52 duration,53 value,54 onScrub,55 onScrubStart,56 onScrubEnd,57 children,58 className,59 ...props60}: ScrubBarContainerProps) {61 const progress = duration > 0 ? (value / duration) * 100 : 06263 const contextValue: ScrubBarContextValue = {64 duration,65 value,66 progress,67 onScrub,68 onScrubStart,69 onScrubEnd,70 }7172 return (73 <ScrubBarContext.Provider value={contextValue}>74 <div75 data-slot="scrub-bar-root"76 className={cn("flex w-full items-center", className)}77 {...props}78 >79 {children}80 </div>81 </ScrubBarContext.Provider>82 )83}84ScrubBarContainer.displayName = "ScrubBarContainer"8586type ScrubBarTrackProps = HTMLAttributes<HTMLDivElement>8788function ScrubBarTrack({ className, children, ...props }: ScrubBarTrackProps) {89 const trackRef = useRef<HTMLDivElement | null>(null)90 const { duration, onScrub, onScrubStart, onScrubEnd, value } =91 useScrubBarContext()9293 const getTimeFromClientX = useCallback(94 (clientX: number) => {95 const track = trackRef.current96 if (!track || !duration) return null97 const rect = track.getBoundingClientRect()98 const ratio = (clientX - rect.left) / rect.width99 const clamped = Math.min(Math.max(ratio, 0), 1)100// … truncated
What it pulls in
Other registry items
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 | |
| matrixmatrix | shadcn/ui | Components | Free | no deps | |
| messagemessage | shadcn/ui | Components | Free | 1 dep | |
| mic-selectormic-selector | shadcn/ui | Components | Free | no deps |
