{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "podcast-audio-player",
  "title": "Podcast Audio Player",
  "type": "registry:block",
  "files": [
    {
      "path": "packages/registry-react/blocks/podcast-audio-player/PodcastAudioPlayer.tsx",
      "content": "'use client'\n\nimport * as React from 'react'\nimport {\n  Bookmark,\n  BookmarkCheck,\n  BookOpen,\n  Check,\n  Clock,\n  Copy,\n  Download,\n  ExternalLink,\n  FastForward,\n  Headphones,\n  Heart,\n  ListMusic,\n  Mic,\n  Pause,\n  Play,\n  Radio,\n  RotateCcw,\n  RotateCw,\n  Share2,\n  SkipBack,\n  SkipForward,\n  Volume1,\n  Volume2,\n  VolumeX,\n} from 'lucide-react'\nimport { Accordion, AccordionContent, AccordionItem, AccordionTrigger } from '@/components/ui/accordion'\nimport { Avatar, AvatarFallback, AvatarImage } from '@/components/ui/avatar'\nimport { Badge } from '@/components/ui/badge'\nimport { Button } from '@/components/ui/button'\nimport { Card, CardContent, CardDescription, CardFooter, CardHeader, CardTitle } from '@/components/ui/card'\nimport { Progress } from '@/components/ui/progress'\nimport { Separator } from '@/components/ui/separator'\nimport { Slider } from '@/components/ui/slider'\n\nexport interface Chapter {\n  id: number\n  title: string\n  subtitle: string\n  start: number\n  end: number\n  durationFormatted: string\n}\n\nexport interface Panelist {\n  name: string\n  role: string\n  company: string\n  avatar: string\n  fallback: string\n  bio: string\n  handle: string\n}\n\nexport interface ReferenceLink {\n  title: string\n  description: string\n  url: string\n  tag: string\n}\n\nconst waveformBars = [\n  32, 48, 65, 88, 60, 42, 75, 96, 85, 62, 50, 78, 92, 100, 84, 60, 38, 70, 88, 95, 80, 54, 42, 68, 85, 92, 76, 60, 46,\n  64, 82, 45,\n]\n\nconst chapters: Chapter[] = [\n  {\n    id: 1,\n    title: 'Intro & State of Tooling',\n    subtitle: 'Why traditional CSS workflows break at scale',\n    start: 0, // 00:00\n    end: 495, // 08:15\n    durationFormatted: '08:15',\n  },\n  {\n    id: 2,\n    title: 'The Monorepo Pivot',\n    subtitle: 'Moving away from monolithic npm component packages',\n    start: 495, // 08:15\n    end: 1360, // 22:40\n    durationFormatted: '14:25',\n  },\n  {\n    id: 3,\n    title: 'OKLCH Math & Contrast Engines',\n    subtitle: 'Perceptual uniformity, APCA contrast & wide-gamut P3',\n    start: 1360, // 22:40\n    end: 2290, // 38:10\n    durationFormatted: '15:30',\n  },\n  {\n    id: 4,\n    title: 'Q&A & Future Standards',\n    subtitle: 'Audience questions, migration playbooks & CSS Color 5',\n    start: 2290, // 38:10\n    end: 2912, // 48:32\n    durationFormatted: '10:22',\n  },\n]\n\nconst panelists: Panelist[] = [\n  {\n    name: 'Elena Rostova',\n    role: 'Staff Design Engineer',\n    company: 'Linear',\n    avatar: 'https://images.unsplash.com/photo-1534528741775-53994a69daeb?w=150&auto=format&fit=crop&q=80',\n    fallback: 'ER',\n    bio: 'Pioneered Linear dark mode tokens, high-density keyboard workflows, and micro-interactions.',\n    handle: '@erostova',\n  },\n  {\n    name: 'Marcus Vance',\n    role: 'Head of UI Architecture',\n    company: 'Vercel',\n    avatar: 'https://images.unsplash.com/photo-1507003211169-0a1dd7228f2d?w=150&auto=format&fit=crop&q=80',\n    fallback: 'MV',\n    bio: 'Core architect on headless design systems, token compilers, and zero-runtime CSS workflows.',\n    handle: '@marcusvance',\n  },\n  {\n    name: 'Dr. Aris Thorne',\n    role: 'Color Science Lead',\n    company: 'W3C CSS Working Group',\n    avatar: 'https://images.unsplash.com/photo-1500648767791-00dcc994a43e?w=150&auto=format&fit=crop&q=80',\n    fallback: 'AT',\n    bio: 'Author on CSS Color Module 4 & 5, APCA contrast metric integration, and gamut mapping algorithms.',\n    handle: '@aristhorne',\n  },\n]\n\nconst referenceLinks: ReferenceLink[] = [\n  {\n    title: 'OKLCH Color Space Visualizer',\n    description: 'Interactive gamut mapper, lightness ramp generator, and P3 inspector.',\n    url: 'https://oklch.com',\n    tag: 'Tooling',\n  },\n  {\n    title: 'W3C CSS Color Module Level 4',\n    description: 'Official W3C specification defining oklch(), oklab(), and wide-gamut coordinates.',\n    url: 'https://www.w3.org/TR/css-color-4/',\n    tag: 'Specification',\n  },\n  {\n    title: 'UIPKGE Component Registry Architecture',\n    description: 'The unbundled registry distribution model for Vue and React design systems.',\n    url: 'https://uipkge.dev',\n    tag: 'Architecture',\n  },\n  {\n    title: 'APCA Accessible Perceptual Contrast Algorithm',\n    description: 'Next-generation readability standard replacing legacy WCAG 2 ratio formulas.',\n    url: 'https://git.apcacontrast.com',\n    tag: 'Accessibility',\n  },\n]\n\nfunction formatTime(seconds: number): string {\n  const m = Math.floor(seconds / 60)\n  const s = Math.floor(seconds % 60)\n  return `${m.toString().padStart(2, '0')}:${s.toString().padStart(2, '0')}`\n}\n\nexport function PodcastAudioPlayer({ className }: { className?: string }) {\n  // Audio Playback State\n  const [isPlaying, setIsPlaying] = React.useState(false)\n  const [currentTime, setCurrentTime] = React.useState(860) // 14:20\n  const totalDuration = 2912 // 48:32\n  const [volume, setVolume] = React.useState(80)\n  const [isMuted, setIsMuted] = React.useState(false)\n  const [playbackSpeed, setPlaybackSpeed] = React.useState(1.0)\n  const speedOptions = [1.0, 1.25, 1.5, 2.0]\n  const [isBookmarked, setIsBookmarked] = React.useState(false)\n  const [isLiked, setIsLiked] = React.useState(false)\n  const [likeCount, setLikeCount] = React.useState(342)\n  const [isCopied, setIsCopied] = React.useState(false)\n  const [isDownloaded, setIsDownloaded] = React.useState(false)\n\n  // Timer Effect\n  React.useEffect(() => {\n    let interval: ReturnType<typeof setInterval> | null = null\n    if (isPlaying) {\n      interval = setInterval(() => {\n        setCurrentTime((prev) => {\n          if (prev < totalDuration) {\n            return prev + 1\n          } else {\n            setIsPlaying(false)\n            return prev\n          }\n        })\n      }, 1000 / playbackSpeed)\n    }\n    return () => {\n      if (interval) clearInterval(interval)\n    }\n  }, [isPlaying, playbackSpeed, totalDuration])\n\n  const formattedCurrentTime = formatTime(currentTime)\n  const formattedTotalTime = formatTime(totalDuration)\n  const remainingTime = `-${formatTime(totalDuration - currentTime)}`\n  const progressPercent = (currentTime / totalDuration) * 100\n\n  const currentChapter = React.useMemo(() => {\n    return chapters.find((c) => currentTime >= c.start && currentTime < c.end) || chapters[chapters.length - 1]\n  }, [currentTime])\n\n  const currentChapterProgress = React.useMemo(() => {\n    const ch = currentChapter\n    const elapsed = currentTime - ch.start\n    const total = ch.end - ch.start\n    return Math.min(100, Math.max(0, (elapsed / total) * 100))\n  }, [currentTime, currentChapter])\n\n  const seekTo = (seconds: number) => {\n    setCurrentTime(Math.max(0, Math.min(seconds, totalDuration)))\n  }\n\n  const handleWaveformClick = (event: React.MouseEvent<HTMLDivElement>) => {\n    const target = event.currentTarget\n    const rect = target.getBoundingClientRect()\n    const clickX = event.clientX - rect.left\n    const ratio = Math.max(0, Math.min(1, clickX / rect.width))\n    seekTo(Math.round(ratio * totalDuration))\n  }\n\n  const skipSeconds = (delta: number) => {\n    seekTo(currentTime + delta)\n  }\n\n  const cycleSpeed = () => {\n    const currentIndex = speedOptions.indexOf(playbackSpeed)\n    const nextIndex = (currentIndex + 1) % speedOptions.length\n    setPlaybackSpeed(speedOptions[nextIndex])\n  }\n\n  const skipToNextChapter = () => {\n    const currentIndex = chapters.findIndex((c) => c.id === currentChapter.id)\n    if (currentIndex < chapters.length - 1) {\n      seekTo(chapters[currentIndex + 1].start)\n    }\n  }\n\n  const skipToPrevChapter = () => {\n    const ch = currentChapter\n    if (currentTime - ch.start > 4) {\n      seekTo(ch.start)\n    } else {\n      const currentIndex = chapters.findIndex((c) => c.id === ch.id)\n      if (currentIndex > 0) {\n        seekTo(chapters[currentIndex - 1].start)\n      } else {\n        seekTo(0)\n      }\n    }\n  }\n\n  const toggleMute = () => {\n    setIsMuted((prev) => !prev)\n  }\n\n  const toggleLike = () => {\n    setIsLiked((prev) => {\n      const next = !prev\n      setLikeCount((c) => (next ? c + 1 : c - 1))\n      return next\n    })\n  }\n\n  const handleCopyLink = () => {\n    setIsCopied(true)\n    setTimeout(() => {\n      setIsCopied(false)\n    }, 2000)\n  }\n\n  const handleDownload = () => {\n    setIsDownloaded(true)\n    setTimeout(() => {\n      setIsDownloaded(false)\n    }, 3000)\n  }\n\n  return (\n    <div\n      data-slot=\"podcast-audio-player\"\n      className={['bg-background text-foreground w-full space-y-6', className].filter(Boolean).join(' ')}\n    >\n      {/* EPISODE HERO CARD */}\n      <Card className=\"overflow-hidden border shadow-xs\">\n        <CardContent className=\"p-5 sm:p-7\">\n          <div className=\"flex flex-col gap-6 lg:flex-row lg:items-center lg:justify-between\">\n            {/* Left Column: Cover Art & Episode Details */}\n            <div className=\"flex flex-col gap-5 sm:flex-row sm:items-center\">\n              {/* Podcast Cover Artwork Thumbnail */}\n              <div className=\"from-primary/20 via-primary/10 to-background ring-border/80 group relative flex size-28 shrink-0 items-center justify-center overflow-hidden rounded-2xl border bg-gradient-to-br shadow-md ring-1 sm:size-32\">\n                {/* Animated Soundwave/Vinyl Graphic */}\n                <div className=\"border-primary/30 absolute inset-2 rounded-xl border border-dashed opacity-60 transition-transform duration-700 group-hover:rotate-45\" />\n                <div className=\"bg-card/90 relative z-10 flex size-14 items-center justify-center rounded-xl border shadow-xs\">\n                  <Radio className=\"text-primary size-7\" />\n                </div>\n                <div className=\"bg-background/90 text-foreground absolute right-2 bottom-2 rounded-md px-1.5 py-0.5 font-mono text-xs font-semibold shadow-xs\">\n                  EP #48\n                </div>\n              </div>\n\n              {/* Episode Meta & Titles */}\n              <div className=\"space-y-2\">\n                <div className=\"flex flex-wrap items-center gap-2\">\n                  <Badge variant=\"outline\" className=\"gap-1 text-xs font-semibold\">\n                    <Mic className=\"text-primary size-3\" />\n                    <span>The Design Systems Podcast</span>\n                  </Badge>\n                  <Badge variant=\"secondary\" className=\"font-mono text-xs\">\n                    Season 4 · Episode #48\n                  </Badge>\n                  <Badge variant=\"outline\" className=\"border-success/30 bg-success/10 text-success font-mono text-xs\">\n                    Lossless 320kbps\n                  </Badge>\n                </div>\n\n                <h1 className=\"text-foreground text-xl font-bold tracking-tight sm:text-2xl lg:text-3xl\">\n                  Deconstructing OKLCH & Zero-Dependency Component Registries\n                </h1>\n\n                <div className=\"text-muted-foreground flex flex-wrap items-center gap-3 text-xs sm:text-sm\">\n                  {/* Hosts Avatars */}\n                  <div className=\"flex items-center gap-2\">\n                    <div className=\"flex shrink-0 -space-x-2 overflow-hidden\">\n                      <Avatar className=\"border-background ring-border size-6 border-2 ring-1\">\n                        <AvatarImage src={panelists[0].avatar} alt={panelists[0].name} />\n                        <AvatarFallback>{panelists[0].fallback}</AvatarFallback>\n                      </Avatar>\n                      <Avatar className=\"border-background ring-border size-6 border-2 ring-1\">\n                        <AvatarImage src={panelists[1].avatar} alt={panelists[1].name} />\n                        <AvatarFallback>{panelists[1].fallback}</AvatarFallback>\n                      </Avatar>\n                      <Avatar className=\"border-background ring-border size-6 border-2 ring-1\">\n                        <AvatarImage src={panelists[2].avatar} alt={panelists[2].name} />\n                        <AvatarFallback>{panelists[2].fallback}</AvatarFallback>\n                      </Avatar>\n                    </div>\n                    <span className=\"text-foreground font-medium\">Elena Rostova, Marcus Vance & Dr. Aris Thorne</span>\n                  </div>\n                  <span>·</span>\n                  <div className=\"flex items-center gap-1 font-mono text-xs tabular-nums\">\n                    <Clock className=\"size-3.5\" />\n                    <span>48 mins</span>\n                  </div>\n                </div>\n              </div>\n            </div>\n\n            {/* Right Column: Primary Hero Actions */}\n            <div className=\"flex flex-wrap items-center gap-2 border-t pt-4 lg:border-t-0 lg:pt-0\">\n              {/* Like Button */}\n              <Button\n                variant={isLiked ? 'default' : 'outline'}\n                size=\"sm\"\n                className=\"h-9 gap-1.5 text-xs font-semibold shadow-xs\"\n                onClick={toggleLike}\n              >\n                <Heart className={`size-4 ${isLiked ? 'fill-current' : 'text-muted-foreground'}`} />\n                <span className=\"font-mono tabular-nums\">{likeCount}</span>\n              </Button>\n\n              {/* Bookmark Button */}\n              <Button\n                variant=\"outline\"\n                size=\"icon\"\n                className=\"size-9 shadow-xs\"\n                aria-label={isBookmarked ? 'Remove bookmark' : 'Bookmark episode'}\n                onClick={() => setIsBookmarked((b) => !b)}\n              >\n                {isBookmarked ? (\n                  <BookmarkCheck className=\"text-primary size-4\" />\n                ) : (\n                  <Bookmark className=\"text-muted-foreground size-4\" />\n                )}\n              </Button>\n\n              {/* Share / Copy Link */}\n              <Button\n                variant=\"outline\"\n                size=\"sm\"\n                className=\"h-9 gap-1.5 text-xs font-semibold shadow-xs\"\n                onClick={handleCopyLink}\n              >\n                {isCopied ? <Check className=\"text-success size-4\" /> : <Share2 className=\"size-4\" />}\n                <span>{isCopied ? 'Link Copied' : 'Share'}</span>\n              </Button>\n\n              {/* Download Episode */}\n              <Button\n                variant=\"outline\"\n                size=\"icon\"\n                className=\"size-9 shadow-xs\"\n                aria-label={isDownloaded ? 'Downloaded' : 'Download episode'}\n                onClick={handleDownload}\n              >\n                {isDownloaded ? <Check className=\"text-success size-4\" /> : <Download className=\"size-4\" />}\n              </Button>\n            </div>\n          </div>\n        </CardContent>\n      </Card>\n\n      {/* AUDIO PLAYER CONTROLS (CENTERPIECE) */}\n      <Card className=\"border shadow-xs\">\n        <CardContent className=\"space-y-6 p-5 sm:p-7\">\n          {/* Currently Playing Chapter Header */}\n          <div className=\"flex flex-col justify-between gap-2 sm:flex-row sm:items-center\">\n            <div className=\"space-y-1\">\n              <div className=\"flex items-center gap-2\">\n                <span className=\"bg-primary size-2 animate-pulse rounded-full\" />\n                <span className=\"text-muted-foreground font-mono text-xs font-semibold tracking-wider uppercase\">\n                  Now Playing · Chapter {currentChapter.id} of {chapters.length}\n                </span>\n              </div>\n              <h2 className=\"text-foreground text-base font-bold tracking-tight sm:text-lg\">{currentChapter.title}</h2>\n              <p className=\"text-muted-foreground text-xs\">{currentChapter.subtitle}</p>\n            </div>\n\n            <div className=\"flex items-center gap-2 self-start font-mono text-xs font-semibold tabular-nums sm:self-auto\">\n              <Badge variant=\"outline\" className=\"border-primary/30 bg-primary/5 gap-1 px-2.5 py-1\">\n                <span className=\"text-primary font-bold\">{formattedCurrentTime}</span>\n                <span className=\"text-muted-foreground\">/</span>\n                <span className=\"text-muted-foreground\">{formattedTotalTime}</span>\n              </Badge>\n              <span className=\"text-muted-foreground text-xs\">{remainingTime}</span>\n            </div>\n          </div>\n\n          {/* 32-BAR VISUAL SVG AUDIO WAVEFORM SCRUBBER */}\n          <div className=\"space-y-2\">\n            <div\n              className=\"group/wave bg-muted/30 hover:bg-muted/50 border-border/80 relative flex h-24 w-full cursor-pointer items-center justify-between rounded-xl border p-4 transition-colors select-none\"\n              role=\"slider\"\n              aria-label=\"Audio Waveform Scrubber\"\n              aria-valuenow={currentTime}\n              aria-valuemin={0}\n              aria-valuemax={totalDuration}\n              onClick={handleWaveformClick}\n            >\n              {/* Background SVG Waveform Bars */}\n              <div className=\"flex h-full w-full items-center justify-between gap-1 sm:gap-1.5\">\n                {waveformBars.map((barHeight, index) => {\n                  const isPlayed = (index / waveformBars.length) * 100 <= progressPercent\n                  const isCurrentBar = isPlaying && Math.floor((progressPercent / 100) * waveformBars.length) === index\n\n                  return (\n                    <div key={index} className=\"flex h-full flex-1 items-center justify-center\">\n                      {/* Single Audio Bar */}\n                      <div\n                        className={[\n                          'w-full max-w-[8px] rounded-full transition-[height] duration-150',\n                          isPlayed ? 'bg-primary' : 'bg-muted-foreground/25 group-hover/wave:bg-muted-foreground/35',\n                          isCurrentBar ? 'ring-primary/40 scale-y-110 ring-2' : '',\n                        ]\n                          .filter(Boolean)\n                          .join(' ')}\n                        style={{\n                          height: `${barHeight}%`,\n                        }}\n                      />\n                    </div>\n                  )\n                })}\n              </div>\n\n              {/* Interactive Timeline Cursor Scrubber Line */}\n              <div\n                className=\"bg-foreground pointer-events-none absolute top-0 bottom-0 z-10 w-0.5 transition-colors\"\n                style={{ left: `${progressPercent}%` }}\n              >\n                <div className=\"bg-primary ring-background absolute -top-1 left-1/2 size-3.5 -translate-x-1/2 rounded-full shadow-md ring-2 transition-transform group-hover/wave:scale-125\" />\n              </div>\n\n              {/* Chapter Notch Markers on Waveform Bottom */}\n              <div className=\"pointer-events-none absolute right-4 bottom-1.5 left-4 flex justify-between\">\n                {chapters.map((ch) => (\n                  <span\n                    key={ch.id}\n                    className=\"absolute flex flex-col items-center\"\n                    style={{ left: `${(ch.start / totalDuration) * 100}%` }}\n                  >\n                    <span className=\"bg-muted-foreground/50 h-2 w-0.5\" />\n                  </span>\n                ))}\n              </div>\n            </div>\n\n            {/* Bottom Time & Chapter Range Indicators */}\n            <div className=\"text-muted-foreground flex items-center justify-between font-mono text-xs tabular-nums\">\n              <div className=\"flex items-center gap-1.5\">\n                <span className=\"text-foreground font-semibold\">{formattedCurrentTime}</span>\n                <span>(Chapter progress: {Math.round(currentChapterProgress)}%)</span>\n              </div>\n              <span>{formattedTotalTime}</span>\n            </div>\n          </div>\n\n          {/* MAIN PLAYBACK CONTROLS BAR */}\n          <div className=\"flex flex-col items-center justify-between gap-4 pt-2 md:flex-row\">\n            {/* Left: Secondary Tools (Speed & Chapter Navigation) */}\n            <div className=\"flex items-center gap-2\">\n              {/* Speed Selector Button */}\n              <Button\n                variant=\"outline\"\n                size=\"sm\"\n                className=\"hover:bg-accent h-9 gap-1 px-2.5 font-mono text-xs font-bold shadow-xs\"\n                aria-label=\"Cycle Playback Speed\"\n                onClick={cycleSpeed}\n              >\n                <FastForward className=\"text-primary size-3.5\" />\n                <span>{playbackSpeed.toFixed(playbackSpeed % 1 === 0 ? 1 : 2)}x</span>\n              </Button>\n\n              {/* Previous Chapter */}\n              <Button\n                variant=\"ghost\"\n                size=\"icon\"\n                className=\"text-muted-foreground hover:text-foreground size-9\"\n                aria-label=\"Previous Chapter\"\n                onClick={skipToPrevChapter}\n              >\n                <SkipBack className=\"size-4\" />\n              </Button>\n\n              {/* Next Chapter */}\n              <Button\n                variant=\"ghost\"\n                size=\"icon\"\n                className=\"text-muted-foreground hover:text-foreground size-9\"\n                aria-label=\"Next Chapter\"\n                onClick={skipToNextChapter}\n              >\n                <SkipForward className=\"size-4\" />\n              </Button>\n            </div>\n\n            {/* Center: Core Transport Buttons (15s Rewind, Play/Pause, 15s Fast Forward) */}\n            <div className=\"flex items-center gap-3\">\n              {/* 15s Rewind */}\n              <Button\n                variant=\"outline\"\n                size=\"icon\"\n                className=\"size-10 rounded-full shadow-xs\"\n                aria-label=\"Rewind 15 seconds\"\n                onClick={() => skipSeconds(-15)}\n              >\n                <RotateCcw className=\"size-4.5\" />\n              </Button>\n\n              {/* Primary Play / Pause Circle Button */}\n              <Button\n                variant=\"default\"\n                size=\"icon\"\n                className=\"bg-primary text-primary-foreground hover:bg-primary/90 focus-visible:ring-ring size-13 rounded-full shadow-lg transition-[color,background-color,border-color,box-shadow,opacity,transform,scale,translate,rotate] hover:scale-105 focus-visible:ring-2 active:scale-95\"\n                aria-label={isPlaying ? 'Pause episode' : 'Play episode'}\n                onClick={() => setIsPlaying((p) => !p)}\n              >\n                {isPlaying ? (\n                  <Pause className=\"size-6 fill-current\" />\n                ) : (\n                  <Play className=\"ml-0.5 size-6 fill-current\" />\n                )}\n              </Button>\n\n              {/* 15s Fast Forward */}\n              <Button\n                variant=\"outline\"\n                size=\"icon\"\n                className=\"size-10 rounded-full shadow-xs\"\n                aria-label=\"Fast forward 15 seconds\"\n                onClick={() => skipSeconds(15)}\n              >\n                <RotateCw className=\"size-4.5\" />\n              </Button>\n            </div>\n\n            {/* Right: Volume Slider Controls */}\n            <div className=\"flex items-center gap-2.5\">\n              <Button\n                variant=\"ghost\"\n                size=\"icon\"\n                className=\"text-muted-foreground hover:text-foreground size-9\"\n                aria-label={isMuted ? 'Unmute' : 'Mute'}\n                onClick={toggleMute}\n              >\n                {isMuted || volume === 0 ? (\n                  <VolumeX className=\"text-destructive size-4.5\" />\n                ) : volume < 50 ? (\n                  <Volume1 className=\"size-4.5\" />\n                ) : (\n                  <Volume2 className=\"size-4.5\" />\n                )}\n              </Button>\n\n              <div className=\"w-24 sm:w-28\">\n                <Slider\n                  value={[isMuted ? 0 : volume]}\n                  onValueChange={(val) => {\n                    if (isMuted) setIsMuted(false)\n                    setVolume(val[0])\n                  }}\n                  min={0}\n                  max={100}\n                  step={1}\n                  className=\"cursor-pointer\"\n                />\n              </div>\n              <span className=\"text-muted-foreground w-8 text-right font-mono text-xs tabular-nums\">\n                {isMuted ? '0%' : `${volume}%`}\n              </span>\n            </div>\n          </div>\n\n          <Separator />\n\n          {/* CHAPTER NAVIGATION BAR */}\n          <div className=\"space-y-3\">\n            <div className=\"flex items-center justify-between\">\n              <div className=\"flex items-center gap-2\">\n                <ListMusic className=\"text-primary size-4\" />\n                <h3 className=\"text-foreground text-xs font-bold tracking-tight uppercase\">Chapter Navigation</h3>\n              </div>\n              <span className=\"text-muted-foreground font-mono text-xs\">4 Chapters · 48m 32s Total</span>\n            </div>\n\n            <div className=\"grid grid-cols-1 gap-2.5 sm:grid-cols-2 lg:grid-cols-4\">\n              {chapters.map((ch) => {\n                const isActive = currentChapter.id === ch.id\n                return (\n                  <div\n                    key={ch.id}\n                    className={[\n                      'group flex cursor-pointer flex-col justify-between rounded-xl border p-3 text-xs transition-colors duration-200',\n                      isActive\n                        ? 'border-primary/50 bg-primary/5 ring-primary/20 shadow-xs ring-1'\n                        : 'bg-card hover:bg-muted/40 border-border/70',\n                    ].join(' ')}\n                    onClick={() => seekTo(ch.start)}\n                  >\n                    <div className=\"space-y-1\">\n                      <div className=\"flex items-center justify-between\">\n                        <Badge\n                          variant={isActive ? 'default' : 'outline'}\n                          className=\"h-5 px-1.5 font-mono text-xs font-semibold\"\n                        >\n                          CH {ch.id}\n                        </Badge>\n                        <span className=\"text-muted-foreground font-mono text-xs tabular-nums\">\n                          {formatTime(ch.start)}\n                        </span>\n                      </div>\n                      <div className=\"text-foreground line-clamp-1 font-semibold\">{ch.title}</div>\n                      <div className=\"text-muted-foreground line-clamp-1 text-xs\">{ch.subtitle}</div>\n                    </div>\n\n                    {/* Active Chapter Progress Mini Indicator */}\n                    <div className=\"mt-2.5 pt-1\">\n                      {isActive ? (\n                        <Progress value={currentChapterProgress} className=\"h-1\" />\n                      ) : (\n                        <div\n                          className={[\n                            'h-1 w-full rounded-full',\n                            currentTime >= ch.end ? 'bg-primary/40' : 'bg-muted',\n                          ].join(' ')}\n                        />\n                      )}\n                    </div>\n                  </div>\n                )\n              })}\n            </div>\n          </div>\n        </CardContent>\n      </Card>\n\n      {/* EPISODE SHOW NOTES & GUEST LINKS ACCORDION */}\n      <Card className=\"border shadow-xs\">\n        <CardHeader className=\"pb-3\">\n          <div className=\"flex items-center justify-between\">\n            <div className=\"flex items-center gap-2\">\n              <BookOpen className=\"text-primary size-4\" />\n              <CardTitle className=\"text-base font-bold tracking-tight sm:text-lg\">\n                Episode Show Notes & Comprehensive Guide\n              </CardTitle>\n            </div>\n            <Badge variant=\"outline\" className=\"font-mono text-xs\">\n              Full Notes\n            </Badge>\n          </div>\n          <CardDescription className=\"text-xs sm:text-sm\">\n            Deep dive references, color math formulas, guest bios, and resource bookmarks from this episode.\n          </CardDescription>\n        </CardHeader>\n\n        <CardContent className=\"pt-1\">\n          <Accordion type=\"single\" collapsible defaultValue=\"summary\" className=\"w-full\">\n            {/* Accordion Item 1: Episode Summary */}\n            <AccordionItem value=\"summary\">\n              <AccordionTrigger className=\"text-xs font-semibold hover:no-underline sm:text-sm\">\n                <div className=\"flex items-center gap-2\">\n                  <span className=\"bg-primary/10 text-primary flex size-5 items-center justify-center rounded-full text-xs font-bold\">\n                    1\n                  </span>\n                  <span>Executive Summary & Key Takeaways</span>\n                </div>\n              </AccordionTrigger>\n              <AccordionContent className=\"space-y-3 pt-2 text-xs leading-relaxed\">\n                <p className=\"text-muted-foreground\">\n                  In this episode, we break down why traditional HSL and sRGB color models fall short when building\n                  modern, accessible multi-theme design systems. We explore how the OKLCH color space decouples\n                  perceptual lightness from chroma and hue, eliminating contrast inversion bugs when shifting from light\n                  to OLED dark mode.\n                </p>\n\n                <div className=\"grid grid-cols-1 gap-3 pt-1 sm:grid-cols-3\">\n                  <div className=\"bg-muted/30 space-y-1 rounded-lg border p-3\">\n                    <div className=\"text-foreground font-semibold\">Perceptual Uniformity</div>\n                    <p className=\"text-muted-foreground text-xs\">\n                      Lightness (L) in OKLCH remains consistent regardless of hue angle, unlike HSL where yellow appears\n                      far brighter than blue.\n                    </p>\n                  </div>\n\n                  <div className=\"bg-muted/30 space-y-1 rounded-lg border p-3\">\n                    <div className=\"text-foreground font-semibold\">Zero-Dependency Registries</div>\n                    <p className=\"text-muted-foreground text-xs\">\n                      Unbundled component distribution gives engineering teams 100% source code ownership with zero\n                      semantic version drift.\n                    </p>\n                  </div>\n\n                  <div className=\"bg-muted/30 space-y-1 rounded-lg border p-3\">\n                    <div className=\"text-foreground font-semibold\">Tailwind v4 @theme</div>\n                    <p className=\"text-muted-foreground text-xs\">\n                      Direct CSS variable binding with OKLCH tokens unlocks dynamic color-mix tints without JavaScript\n                      runtime overhead.\n                    </p>\n                  </div>\n                </div>\n              </AccordionContent>\n            </AccordionItem>\n\n            {/* Accordion Item 2: Detailed Chapter Breakdown */}\n            <AccordionItem value=\"chapters\">\n              <AccordionTrigger className=\"text-xs font-semibold hover:no-underline sm:text-sm\">\n                <div className=\"flex items-center gap-2\">\n                  <span className=\"bg-primary/10 text-primary flex size-5 items-center justify-center rounded-full text-xs font-bold\">\n                    2\n                  </span>\n                  <span>Timestamped Chapter Breakdown & Discussion Topics</span>\n                </div>\n              </AccordionTrigger>\n              <AccordionContent className=\"space-y-2.5 pt-2 text-xs\">\n                {chapters.map((ch) => (\n                  <div\n                    key={ch.id}\n                    className=\"bg-muted/20 hover:bg-muted/40 flex items-center justify-between rounded-lg border p-3 transition-colors\"\n                  >\n                    <div className=\"space-y-0.5\">\n                      <div className=\"flex items-center gap-2\">\n                        <span className=\"text-foreground font-semibold\">\n                          Chapter {ch.id}: {ch.title}\n                        </span>\n                      </div>\n                      <p className=\"text-muted-foreground text-xs\">{ch.subtitle}</p>\n                    </div>\n\n                    <Button\n                      variant=\"outline\"\n                      size=\"sm\"\n                      className=\"h-7 gap-1 px-2.5 font-mono text-xs font-bold tabular-nums\"\n                      onClick={() => seekTo(ch.start)}\n                    >\n                      <Play className=\"text-primary size-2.5 fill-current\" />\n                      <span>{formatTime(ch.start)}</span>\n                    </Button>\n                  </div>\n                ))}\n              </AccordionContent>\n            </AccordionItem>\n\n            {/* Accordion Item 3: Featured Panelists & Guests */}\n            <AccordionItem value=\"panelists\">\n              <AccordionTrigger className=\"text-xs font-semibold hover:no-underline sm:text-sm\">\n                <div className=\"flex items-center gap-2\">\n                  <span className=\"bg-primary/10 text-primary flex size-5 items-center justify-center rounded-full text-xs font-bold\">\n                    3\n                  </span>\n                  <span>Featured Hosts & Guest Panel</span>\n                </div>\n              </AccordionTrigger>\n              <AccordionContent className=\"space-y-3 pt-2 text-xs\">\n                <div className=\"grid grid-cols-1 gap-3 md:grid-cols-3\">\n                  {panelists.map((person) => (\n                    <div\n                      key={person.name}\n                      className=\"bg-muted/25 flex flex-col justify-between space-y-3 rounded-xl border p-3.5\"\n                    >\n                      <div className=\"flex items-start gap-3\">\n                        <Avatar className=\"ring-border size-10 border ring-1\">\n                          <AvatarImage src={person.avatar} alt={person.name} />\n                          <AvatarFallback>{person.fallback}</AvatarFallback>\n                        </Avatar>\n                        <div className=\"min-w-0 space-y-0.5\">\n                          <div className=\"text-foreground truncate font-bold\">{person.name}</div>\n                          <div className=\"text-muted-foreground truncate text-xs\">{person.role}</div>\n                          <Badge variant=\"secondary\" className=\"h-4 px-1 text-xs\">\n                            {person.company}\n                          </Badge>\n                        </div>\n                      </div>\n                      <p className=\"text-muted-foreground text-xs leading-relaxed\">{person.bio}</p>\n                      <div className=\"text-primary font-mono text-xs\">{person.handle}</div>\n                    </div>\n                  ))}\n                </div>\n              </AccordionContent>\n            </AccordionItem>\n\n            {/* Accordion Item 4: Mentioned Resources & External Links */}\n            <AccordionItem value=\"resources\">\n              <AccordionTrigger className=\"text-xs font-semibold hover:no-underline sm:text-sm\">\n                <div className=\"flex items-center gap-2\">\n                  <span className=\"bg-primary/10 text-primary flex size-5 items-center justify-center rounded-full text-xs font-bold\">\n                    4\n                  </span>\n                  <span>Mentioned Resources & Specifications</span>\n                </div>\n              </AccordionTrigger>\n              <AccordionContent className=\"space-y-2.5 pt-2 text-xs\">\n                <div className=\"grid grid-cols-1 gap-2.5 sm:grid-cols-2\">\n                  {referenceLinks.map((link) => (\n                    <a\n                      key={link.title}\n                      href={link.url}\n                      target=\"_blank\"\n                      rel=\"noreferrer\"\n                      className=\"bg-muted/25 hover:bg-muted/50 group flex flex-col justify-between rounded-xl border p-3.5 transition-colors\"\n                    >\n                      <div className=\"space-y-1\">\n                        <div className=\"flex items-center justify-between\">\n                          <span className=\"text-foreground group-hover:text-primary flex items-center gap-1.5 font-semibold transition-colors\">\n                            {link.title}\n                            <ExternalLink className=\"text-muted-foreground group-hover:text-primary size-3 transition-colors\" />\n                          </span>\n                          <Badge variant=\"outline\" className=\"font-mono text-xs\">\n                            {link.tag}\n                          </Badge>\n                        </div>\n                        <p className=\"text-muted-foreground text-xs leading-relaxed\">{link.description}</p>\n                      </div>\n                      <div className=\"text-muted-foreground pt-2 font-mono text-xs\">{link.url}</div>\n                    </a>\n                  ))}\n                </div>\n              </AccordionContent>\n            </AccordionItem>\n          </Accordion>\n        </CardContent>\n\n        <CardFooter className=\"bg-muted/20 flex flex-wrap items-center justify-between gap-3 border-t p-4 text-xs\">\n          <div className=\"text-muted-foreground flex items-center gap-2\">\n            <Headphones className=\"text-primary size-4\" />\n            <span>Produced by The Design Systems Guild · All rights reserved</span>\n          </div>\n\n          <div className=\"flex items-center gap-2\">\n            <Button variant=\"ghost\" size=\"sm\" className=\"h-7 text-xs\" onClick={handleCopyLink}>\n              <Copy className=\"mr-1 size-3.5\" />\n              <span>Copy Transcript Link</span>\n            </Button>\n          </div>\n        </CardFooter>\n      </Card>\n    </div>\n  )\n}\n\nexport default PodcastAudioPlayer\n",
      "type": "registry:block",
      "target": "~/components/blocks/PodcastAudioPlayer.tsx"
    }
  ],
  "dependencies": [
    "lucide-react"
  ],
  "devDependencies": [],
  "registryDependencies": [
    "https://uipkge.dev/r/react/accordion.json",
    "https://uipkge.dev/r/react/avatar.json",
    "https://uipkge.dev/r/react/badge.json",
    "https://uipkge.dev/r/react/button.json",
    "https://uipkge.dev/r/react/card.json",
    "https://uipkge.dev/r/react/progress.json",
    "https://uipkge.dev/r/react/separator.json",
    "https://uipkge.dev/r/react/slider.json"
  ],
  "description": "Spotify and Apple Podcasts style audio player with 32-bar visual SVG waveform scrubber, chapter markers, playback speed controls, and show notes accordion.",
  "categories": [
    "media",
    "app",
    "audio"
  ]
}