voice-nav-01
elevenlabs/voice-nav-01FreeBlock
Voice-nav site navigation
Install it
npx shadcn@latest add https://raw.githubusercontent.com/elevenlabs/ui/main/apps/www/public/r/voice-nav-01.jsonSource
1"use client"23import { useCallback, useEffect, useRef, useState } from "react"45import { cn } from "@/lib/utils"6import { voiceToSiteAction } from "@/app/voice-nav/actions/voice-to-site"7import {8 Card,9 CardDescription,10 CardHeader,11 CardTitle,12} from "@/components/ui/card"13import { VoiceButton } from "@/components/ui/voice-button"1415const AUDIO_CONSTRAINTS: MediaStreamConstraints = {16 audio: {17 echoCancellation: true,18 noiseSuppression: true,19 autoGainControl: true,20 },21}2223const SUPPORTED_MIME_TYPES = ["audio/webm;codecs=opus", "audio/webm"] as const2425function getMimeType(): string {26 for (const type of SUPPORTED_MIME_TYPES) {27 if (MediaRecorder.isTypeSupported(type)) {28 return type29 }30 }31 return "audio/webm"32}3334export default function Page() {35 const [url, setUrl] = useState("https://elevenlabs.io/docs")36 const [isRecording, setIsRecording] = useState(false)37 const [isProcessing, setIsProcessing] = useState(false)38 const [error, setError] = useState("")39 const [success, setSuccess] = useState(false)4041 const mediaRecorderRef = useRef<MediaRecorder | null>(null)42 const audioChunksRef = useRef<Blob[]>([])43 const streamRef = useRef<MediaStream | null>(null)4445 const cleanupStream = useCallback(() => {46 if (streamRef.current) {47 streamRef.current.getTracks().forEach((track) => track.stop())48 streamRef.current = null49 }50 }, [])5152 const processAudio = useCallback(async (audioBlob: Blob) => {53 setIsProcessing(true)54 setError("")55 setSuccess(false)5657 try {58 const audioFile = new File([audioBlob], "audio.webm", {59 type: audioBlob.type,60 })6162 const result = await voiceToSiteAction(audioFile)6364 if (result.data?.url) {65 setUrl(result.data.url)66 setSuccess(true)67 }68 } catch (err) {69 console.error("Voice input error:", err)70 setError(err instanceof Error ? err.message : "Failed to process audio")71 } finally {72 setIsProcessing(false)73 }74 }, [])7576 const stopRecording = useCallback(() => {77 if (mediaRecorderRef.current?.state !== "inactive") {78 mediaRecorderRef.current?.stop()79 }80 cleanupStream()81 setIsRecording(false)82 }, [cleanupStream])8384 const startRecording = useCallback(async () => {85 try {86 setError("")87 audioChunksRef.current = []8889 const stream =90 await navigator.mediaDevices.getUserMedia(AUDIO_CONSTRAINTS)91 streamRef.current = stream9293 const mimeType = getMimeType()94// … truncated
What it pulls in
npm packages
Other registry items
Files it writes
More from shadcn/ui
All 50 items| Component | Registry | Kind | Access | Installs | Command |
|---|---|---|---|---|---|
| music-player-01music-player-01 | shadcn/ui | Blocks | Free | no deps | |
| music-player-02music-player-02 | shadcn/ui | Blocks | Free | no deps | |
| pong-01pong-01 | shadcn/ui | Blocks | Free | 1 dep · 6 files | |
| realtime-transcriber-01realtime-transcriber-01 | shadcn/ui | Blocks | Free | 2 deps · 3 files | |
| speaker-01speaker-01 | shadcn/ui | Blocks | Free | no deps · 2 files | |
| transcriber-01transcriber-01 | shadcn/ui | Blocks | Free | 2 deps · 2 files | |
| voice-chat-01voice-chat-01 | shadcn/ui | Blocks | Free | 1 dep | |
| voice-chat-02voice-chat-02 | shadcn/ui | Blocks | Free | 2 deps |
