{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "live-audio-minimal",
  "title": "Minimal Live Audio Skin",
  "description": "A compact live audio skin with play, live-edge, volume, error, and keyboard feedback controls.",
  "dependencies": [
    "@videojs/core@10.0.0-beta.32",
    "@videojs/react@10.0.0-beta.32",
    "cn",
    "react"
  ],
  "registryDependencies": [
    "@videojs/_resolve-class-name",
    "@videojs/_style-theme",
    "@videojs/container",
    "@videojs/status-announcer"
  ],
  "files": [
    {
      "path": "skins/files/live-audio-minimal/skins/live-audio/minimal/controls.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { Controls, Tooltip } from '@videojs/react';\n\nimport { cn } from '@/components/videojs/lib/resolve-class-name';\n\nimport { AudioPlayButton } from './play-button';\nimport { LiveButton } from './ui/buttons/live-button';\nimport { VolumePopover } from './ui/controls/volume-popover';\n\nexport function MinimalLiveAudioControls() {\n  return (\n    <Controls.Root visibility=\"always\">\n      <Controls.Content\n        className={cn(\n          'audio-controls',\n          'relative z-20 flex items-center rounded-media-controls bg-media-controls p-1 text-media-controls-foreground text-shadow-media',\n          'gap-2 shadow-media-hairline'\n        )}\n      >\n        <Tooltip.Provider>\n          <Controls.Group className={'flex items-center gap-px'}>\n            <AudioPlayButton />\n            <LiveButton />\n          </Controls.Group>\n\n          <div aria-hidden=\"true\" className={'flex-1'} />\n\n          <Controls.Group className={'flex items-center gap-px'}>\n            <VolumePopover boundary=\"viewport\" showTooltip side=\"left\" orientation=\"horizontal\" />\n          </Controls.Group>\n        </Tooltip.Provider>\n      </Controls.Content>\n    </Controls.Root>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/live-audio/minimal/controls.tsx"
    },
    {
      "path": "skins/files/live-audio-minimal/skins/live-audio/minimal/error-dialog.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { ErrorDialog } from '@videojs/react';\n\nimport { Button } from './ui/buttons/button';\n\nexport function AudioErrorDialog() {\n  return (\n    <ErrorDialog.Root>\n      <ErrorDialog.Backdrop className={'hidden'} />\n      <ErrorDialog.Popup\n        className={\n          'absolute inset-0 z-50 flex h-full max-h-none w-full translate-none flex-row items-center rounded-media-pill py-0 pe-1 outline-hidden not-data-open:hidden bg-media-background text-media-controls-foreground backdrop-filter-media-dialog duration-media-slower ease-out media-transitioning:blur-media-hidden-popup media-transitioning:opacity-0 gap-4 px-3 backdrop-filter-none transition-[opacity,filter,scale] media-transitioning:scale-media-hidden-popup'\n        }\n      >\n        <div className={'flex min-h-0 flex-1 flex-row items-center gap-2 overflow-visible'}>\n          <ErrorDialog.Title className={'m-0 text-media font-semibold leading-tight'} />\n          <ErrorDialog.Description className={'m-0 opacity-70 wrap-anywhere'} />\n        </div>\n        <div className={'flex shrink-0 gap-2'}>\n          <ErrorDialog.Close\n            render={<Button />}\n            className={\n              'h-media-control w-auto flex-none bg-media-primary! px-3 font-medium text-media-primary-foreground!'\n            }\n          />\n        </div>\n      </ErrorDialog.Popup>\n    </ErrorDialog.Root>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/live-audio/minimal/error-dialog.tsx"
    },
    {
      "path": "skins/files/live-audio-minimal/skins/live-audio/minimal/play-button.tsx",
      "content": "/** @jsxImportSource react */\n\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '@/components/videojs/lib/resolve-class-name';\n\nimport { ButtonTooltip } from './ui/buttons/button-tooltip';\nimport { PlayButton } from './ui/buttons/play-button';\nimport { BufferingIndicator } from './ui/feedback/buffering-indicator';\n\nexport type AudioPlayButtonProps = Omit<ComponentProps<'div'>, 'children'>;\n\nexport function AudioPlayButton({ className, ...props }: AudioPlayButtonProps = {}) {\n  return (\n    <div className={cn('relative inline-flex', className)} {...props}>\n      <BufferingIndicator\n        className={'z-20 rounded-media-control text-inherit! before:hidden data-visible:bg-media-controls'}\n      />\n      <ButtonTooltip boundary=\"viewport\" side=\"top\">\n        <PlayButton />\n      </ButtonTooltip>\n    </div>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/live-audio/minimal/play-button.tsx"
    },
    {
      "path": "skins/files/live-audio-minimal/skins/live-audio/minimal/skin.tsx",
      "content": "/** @jsxImportSource react */\n\nimport '../../../styles/theme.css';\nimport type { ComponentProps, ReactNode } from 'react';\n\nimport { cn } from '@/components/videojs/lib/resolve-class-name';\nimport { Container } from '@/components/videojs/ui/container';\nimport { StatusAnnouncer } from '@/components/videojs/ui/status-announcer';\n\nimport { LivePlaybackHotkeys } from '../../shared/live-playback-hotkeys';\nimport { MinimalLiveAudioControls } from './controls';\nimport { AudioErrorDialog } from './error-dialog';\n\nexport interface MinimalLiveAudioSkinProps extends Omit<NonNullable<ComponentProps<typeof Container>>, 'children'> {\n  children?: ReactNode;\n}\n\nexport function MinimalLiveAudioSkin({ children, className, ...props }: MinimalLiveAudioSkinProps = {}) {\n  return (\n    <Container\n      className={cn('h-auto! overflow-visible! bg-transparent! [container-type:inline-size]! after:hidden', className)}\n      data-theme=\"minimal\"\n      data-preset=\"live-audio\"\n      {...props}\n    >\n      {children}\n      <AudioErrorDialog />\n      <MinimalLiveAudioControls />\n      <LivePlaybackHotkeys />\n      <StatusAnnouncer />\n    </Container>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/live-audio/minimal/skin.tsx"
    },
    {
      "path": "skins/files/live-audio-minimal/skins/live-audio/minimal/ui/buttons/button-tooltip.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { Tooltip } from '@videojs/react';\nimport type { ReactElement, ReactNode } from 'react';\n\nimport { cn } from '@/components/videojs/lib/resolve-class-name';\n\nexport interface ButtonTooltipProps extends Tooltip.RootProps {\n  children: ReactElement;\n  label?: ReactNode;\n}\n\nexport function ButtonTooltip({ children, label, ...props }: ButtonTooltipProps) {\n  return (\n    <Tooltip.Root {...props}>\n      <Tooltip.Trigger render={children} />\n      <Tooltip.Popup\n        className={cn(\n          'm-0 overflow-visible border-0 text-inherit',\n          'media-transitioning:opacity-0 media-transitioning:blur-media-hidden-popup media-transitioning:scale-media-hidden-popup',\n          'data-starting-style:[transform:translate(var(--media-popup-translate-x-distance,0),var(--media-popup-translate-y-distance,0))]',\n          'data-ending-style:transform-none',\n          'data-[side=top]:origin-bottom data-[side=bottom]:origin-top data-[side=left]:origin-right data-[side=right]:origin-left',\n          'data-[side=top]:[--media-popup-translate-y-distance:var(--media-popup-translate-distance)]',\n          'data-[side=bottom]:[--media-popup-translate-y-distance:calc(var(--media-popup-translate-distance)*-1)]',\n          'data-[side=left]:[--media-popup-translate-x-distance:var(--media-popup-translate-distance)]',\n          'data-[side=right]:[--media-popup-translate-x-distance:calc(var(--media-popup-translate-distance)*-1)]',\n          'data-starting-style:filter-none',\n          'before:pointer-events-auto before:absolute',\n          'data-[side=top]:before:inset-x-0 data-[side=top]:before:top-full',\n          'data-[side=bottom]:before:inset-x-0 data-[side=bottom]:before:bottom-full',\n          'data-[side=left]:before:inset-y-0 data-[side=left]:before:left-full',\n          'data-[side=right]:before:inset-y-0 data-[side=right]:before:right-full',\n          'data-[side=top]:before:h-(--media-popup-side-offset) data-[side=bottom]:before:h-(--media-popup-side-offset)',\n          'data-[side=left]:before:w-(--media-popup-side-offset) data-[side=right]:before:w-(--media-popup-side-offset)',\n          'transition-media-popup data-ending-style:duration-media-instant',\n          'bg-media-popover text-media-popover-foreground surface-media after:surface-media-inset',\n          'after:hidden',\n          'whitespace-nowrap rounded-media-control py-1 text-media [--media-popup-side-offset:var(--media-tooltip-side-offset)]',\n          'data-open:flex data-open:items-center data-open:gap-1',\n          'px-2',\n          'shadow-media-tooltip!'\n        )}\n      >\n        {label ?? <Tooltip.Label />}\n        {!label && (\n          <Tooltip.Shortcut\n            className={\n              'min-w-[1.5em] rounded-[--spacing(1)] bg-media-muted p-[0.1em] text-center text-media-sm [font-family:inherit] font-semibold leading-tight -me-1'\n            }\n          />\n        )}\n      </Tooltip.Popup>\n    </Tooltip.Root>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/live-audio/minimal/ui/buttons/button-tooltip.tsx"
    },
    {
      "path": "skins/files/live-audio-minimal/skins/live-audio/minimal/ui/buttons/button.tsx",
      "content": "import type { ComponentProps } from 'react';\n\nimport { cn } from '@/components/videojs/lib/resolve-class-name';\n\n/** Shared button carrying the base interactive styles used by media controls. */\nexport type ButtonProps = ComponentProps<'button'>;\n\nexport function Button({ className, ...props }: ButtonProps) {\n  return (\n    <button\n      className={cn(\n        'grid size-media-control min-h-0 shrink-0 touch-manipulation select-none place-items-center rounded-media-control border-0 bg-transparent p-0 text-center text-inherit [corner-shape:var(--media-control-corner-shape)] [text-shadow:inherit] cursor-pointer focus-ring-media will-change-[scale] duration-media-base ease-out [transition-property:background-color,color,outline-offset,scale] media-highlighted:highlight-media focus-visible:outline-media-ring focus-visible:outline-offset-2 not-aria-disabled:active:scale-[0.97] motion-reduce:scale-100 motion-reduce:will-change-auto motion-reduce:[transition-property:background-color,color] aria-disabled:cursor-not-allowed aria-disabled:opacity-50 supports-[corner-shape:squircle]:rounded-2xl',\n        className\n      )}\n      {...props}\n    />\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/live-audio/minimal/ui/buttons/button.tsx"
    },
    {
      "path": "skins/files/live-audio-minimal/skins/live-audio/minimal/ui/buttons/live-button.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { LiveButton as LiveButtonPrimitive } from '@videojs/react';\n\nimport { cn, resolveClassName } from '@/components/videojs/lib/resolve-class-name';\n\nimport { Button } from './button';\n\nexport type LiveButtonProps = Omit<LiveButtonPrimitive.Props, 'children'>;\n\nexport function LiveButton({ className, ...props }: LiveButtonProps = {}) {\n  return (\n    <LiveButtonPrimitive\n      render={<Button />}\n      className={(state) =>\n        cn(\n          'inline-flex! w-auto items-center gap-1.5 px-3 py-2',\n          'text-media-sm leading-none font-semibold tracking-wider uppercase',\n          'before:inline-block before:size-2 before:shrink-0 before:rounded-media-pill',\n          'before:bg-current/40 before:transition-[background-color] before:duration-media-base before:ease-out',\n          'data-live-edge:before:bg-media-live',\n          resolveClassName(className, state)\n        )\n      }\n      {...props}\n    />\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/live-audio/minimal/ui/buttons/live-button.tsx"
    },
    {
      "path": "skins/files/live-audio-minimal/skins/live-audio/minimal/ui/buttons/mute-button.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { MuteButton as MuteButtonPrimitive } from '@videojs/react';\nimport {\n  VolumeOffIcon as VolumeOffIconPrimitive,\n  VolumeLowIcon as VolumeLowIconPrimitive,\n  VolumeHighIcon as VolumeHighIconPrimitive,\n} from '@videojs/react/icons/minimal';\n\nimport { cn, resolveClassName } from '@/components/videojs/lib/resolve-class-name';\n\nimport { Button } from './button';\n\nexport type MuteButtonProps = Omit<MuteButtonPrimitive.Props, 'children'>;\n\nexport function MuteButton({ className, ...props }: MuteButtonProps = {}) {\n  return (\n    <MuteButtonPrimitive\n      render={<Button />}\n      className={(state) => cn('group/mute', resolveClassName(className, state))}\n      {...props}\n    >\n      <VolumeOffIconPrimitive\n        className={cn(\n          'col-start-1 row-start-1 size-media-icon drop-shadow-media-icon',\n          'transition-[opacity,scale] duration-media-base ease-out',\n          'opacity-0 group-data-muted/mute:scale-100 group-data-muted/mute:opacity-100'\n        )}\n      />\n      <VolumeLowIconPrimitive\n        className={cn(\n          'col-start-1 row-start-1 size-media-icon drop-shadow-media-icon',\n          'transition-[opacity,scale] duration-media-base ease-out',\n          'opacity-0',\n          'group-not-data-muted/mute:group-data-[volume-level=low]/mute:opacity-100',\n          'group-not-data-muted/mute:group-data-[volume-level=low]/mute:scale-100'\n        )}\n      />\n      <VolumeHighIconPrimitive\n        className={cn(\n          'col-start-1 row-start-1 size-media-icon drop-shadow-media-icon',\n          'transition-[opacity,scale] duration-media-base ease-out',\n          'opacity-0',\n          'group-not-data-muted/mute:group-not-data-[volume-level=low]/mute:opacity-100',\n          'group-not-data-muted/mute:group-not-data-[volume-level=low]/mute:scale-100'\n        )}\n      />\n    </MuteButtonPrimitive>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/live-audio/minimal/ui/buttons/mute-button.tsx"
    },
    {
      "path": "skins/files/live-audio-minimal/skins/live-audio/minimal/ui/buttons/play-button.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { PlayButton as PlayButtonPrimitive } from '@videojs/react';\nimport {\n  RestartIcon as RestartIconPrimitive,\n  PlayIcon as PlayIconPrimitive,\n  PauseIcon as PauseIconPrimitive,\n} from '@videojs/react/icons/minimal';\n\nimport { cn, resolveClassName } from '@/components/videojs/lib/resolve-class-name';\n\nimport { Button } from './button';\n\nexport type PlayButtonProps = Omit<PlayButtonPrimitive.Props, 'children'>;\n\nexport function PlayButton({ className, ...props }: PlayButtonProps = {}) {\n  return (\n    <PlayButtonPrimitive\n      render={<Button />}\n      className={(state) => cn('group/play', resolveClassName(className, state))}\n      {...props}\n    >\n      <RestartIconPrimitive\n        className={cn(\n          'col-start-1 row-start-1 size-media-icon drop-shadow-media-icon',\n          'transition-[opacity,scale] duration-media-base ease-out',\n          'scale-media-hidden-icon opacity-0 group-data-ended/play:scale-100 group-data-ended/play:opacity-100'\n        )}\n      />\n      <PlayIconPrimitive\n        className={cn(\n          'col-start-1 row-start-1 size-media-icon drop-shadow-media-icon',\n          'transition-[opacity,scale] duration-media-base ease-out',\n          'scale-media-hidden-icon opacity-0',\n          'group-not-data-ended/play:group-data-paused/play:opacity-100',\n          'group-not-data-ended/play:group-data-paused/play:scale-100',\n          'group-not-data-ended/play:group-not-data-started/play:opacity-100',\n          'group-not-data-ended/play:group-not-data-started/play:scale-100'\n        )}\n      />\n      <PauseIconPrimitive\n        className={cn(\n          'col-start-1 row-start-1 size-media-icon drop-shadow-media-icon',\n          'transition-[opacity,scale] duration-media-base ease-out',\n          'scale-media-hidden-icon opacity-0',\n          'group-data-started/play:group-not-data-paused/play:group-not-data-ended/play:opacity-100',\n          'group-data-started/play:group-not-data-paused/play:group-not-data-ended/play:scale-100'\n        )}\n      />\n    </PlayButtonPrimitive>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/live-audio/minimal/ui/buttons/play-button.tsx"
    },
    {
      "path": "skins/files/live-audio-minimal/skins/live-audio/minimal/ui/controls/volume-popover.tsx",
      "content": "/** @jsxImportSource react */\nimport type { VolumeSliderProps as CoreVolumeSliderProps } from '@videojs/core';\nimport { VolumePopover as VolumePopoverPrimitive } from '@videojs/react';\nimport type { ClassValue } from 'cn';\n\nimport { cn } from '@/components/videojs/lib/resolve-class-name';\n\nimport { ButtonTooltip } from '../buttons/button-tooltip';\nimport { MuteButton } from '../buttons/mute-button';\nimport { VolumeSlider } from '../sliders/volume-slider';\n\nexport interface VolumePopoverProps extends Omit<VolumePopoverPrimitive.RootProps, 'children'> {\n  className?: ClassValue;\n  orientation?: CoreVolumeSliderProps['orientation'];\n  showTooltip?: boolean;\n}\n\nexport function VolumePopover({\n  className,\n  showTooltip = false,\n  side = 'top',\n  orientation = 'vertical',\n  ...props\n}: VolumePopoverProps = {}) {\n  return (\n    <VolumePopoverPrimitive.Root openOnHover delay={200} closeDelay={100} side={side} {...props}>\n      <ButtonTooltip delay={0} disabled={!showTooltip} sticky side=\"top\">\n        <VolumePopoverPrimitive.Trigger render={<MuteButton className={cn(className)} />} />\n      </ButtonTooltip>\n      <VolumePopoverPrimitive.Popup\n        className={cn(\n          'm-0 overflow-visible border-0 text-inherit',\n          'media-transitioning:opacity-0 media-transitioning:blur-media-hidden-popup media-transitioning:scale-media-hidden-popup',\n          'data-starting-style:[transform:translate(var(--media-popup-translate-x-distance,0),var(--media-popup-translate-y-distance,0))]',\n          'data-ending-style:transform-none',\n          'data-[side=top]:origin-bottom data-[side=bottom]:origin-top data-[side=left]:origin-right data-[side=right]:origin-left',\n          'data-[side=top]:[--media-popup-translate-y-distance:var(--media-popup-translate-distance)]',\n          'data-[side=bottom]:[--media-popup-translate-y-distance:calc(var(--media-popup-translate-distance)*-1)]',\n          'data-[side=left]:[--media-popup-translate-x-distance:var(--media-popup-translate-distance)]',\n          'data-[side=right]:[--media-popup-translate-x-distance:calc(var(--media-popup-translate-distance)*-1)]',\n          'data-starting-style:filter-none',\n          'before:pointer-events-auto before:absolute',\n          'data-[side=top]:before:inset-x-0 data-[side=top]:before:top-full',\n          'data-[side=bottom]:before:inset-x-0 data-[side=bottom]:before:bottom-full',\n          'data-[side=left]:before:inset-y-0 data-[side=left]:before:left-full',\n          'data-[side=right]:before:inset-y-0 data-[side=right]:before:right-full',\n          'data-[side=top]:before:h-(--media-popup-side-offset) data-[side=bottom]:before:h-(--media-popup-side-offset)',\n          'data-[side=left]:before:w-(--media-popup-side-offset) data-[side=right]:before:w-(--media-popup-side-offset)',\n          'transition-media-popup data-ending-style:duration-media-instant',\n          'bg-media-popover text-media-popover-foreground surface-media after:surface-media-inset',\n          'after:hidden',\n          'rounded-media-control px-0 py-3 [--media-popup-side-offset:var(--media-popover-side-offset)]',\n          'data-[side=right]:rounded-none data-[side=right]:p-0 data-[side=right]:px-3 data-[side=right]:surface-media-none! data-[side=right]:after:hidden',\n          'data-[side=right]:[--media-popover-side-offset:0rem]',\n          'data-[side=left]:rounded-none data-[side=left]:border-0 data-[side=left]:py-0 data-[side=left]:ps-16 data-[side=left]:pe-2',\n          'data-[side=left]:surface-media-none! data-[side=left]:bg-linear-to-l data-[side=left]:from-media-controls data-[side=left]:from-80% data-[side=left]:to-transparent',\n          'data-[side=left]:after:hidden',\n          'data-[side=left]:[--media-popover-side-offset:0rem]'\n        )}\n      >\n        <VolumeSlider orientation={orientation} />\n      </VolumePopoverPrimitive.Popup>\n    </VolumePopoverPrimitive.Root>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/live-audio/minimal/ui/controls/volume-popover.tsx"
    },
    {
      "path": "skins/files/live-audio-minimal/skins/live-audio/minimal/ui/feedback/buffering-indicator.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { BufferingIndicator as BufferingIndicatorPrimitive } from '@videojs/react';\nimport { SpinnerIcon as SpinnerIconPrimitive } from '@videojs/react/icons/minimal';\n\nimport { cn, resolveClassName } from '@/components/videojs/lib/resolve-class-name';\n\nexport type BufferingIndicatorProps = Omit<BufferingIndicatorPrimitive.Props, 'children'>;\n\nexport function BufferingIndicator({ className, ...props }: BufferingIndicatorProps = {}) {\n  return (\n    <BufferingIndicatorPrimitive\n      className={(state) =>\n        cn(\n          'pointer-events-none absolute inset-0 hidden place-content-center text-media-controls-foreground',\n          'before:absolute before:inset-0 before:bg-media-backdrop/35 before:backdrop-filter-media-indicator',\n          'not-data-visible:[--media-spinner-animation:none] data-visible:grid',\n          resolveClassName(className, state)\n        )\n      }\n      {...props}\n    >\n      <SpinnerIconPrimitive className={'relative z-30 size-media-icon drop-shadow-media-icon'} />\n    </BufferingIndicatorPrimitive>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/live-audio/minimal/ui/feedback/buffering-indicator.tsx"
    },
    {
      "path": "skins/files/live-audio-minimal/skins/live-audio/minimal/ui/sliders/slider.tsx",
      "content": "import type { ComponentProps } from 'react';\n\nimport { cn } from '@/components/videojs/lib/resolve-class-name';\n\n/** Shared slider track. */\nexport type SliderTrackProps = ComponentProps<'div'>;\n\nexport function SliderTrack({ className, ...props }: SliderTrackProps) {\n  return (\n    <div\n      className={cn(\n        'relative isolate w-full select-none overflow-hidden rounded-media-pill bg-current/20 data-[orientation=horizontal]:h-1 data-[orientation=vertical]:h-full data-[orientation=vertical]:w-1',\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\n/** Shared slider fill. */\nexport type SliderFillProps = ComponentProps<'div'>;\n\nexport function SliderFill({ className, ...props }: SliderFillProps) {\n  return (\n    <div\n      className={cn(\n        'pointer-events-none absolute rounded-[inherit] transition-[clip-path] duration-media-slider ease-out group-data-dragging/slider:duration-0 group-data-seeking/slider:duration-0 bg-media-primary data-[orientation=horizontal]:inset-y-0 data-[orientation=horizontal]:left-0 data-[orientation=horizontal]:w-full data-[orientation=horizontal]:clip-media-x-[--media-slider-fill] group-data-dragging/slider:data-[orientation=horizontal]:clip-media-x-[--media-slider-pointer] data-[orientation=vertical]:inset-x-0 data-[orientation=vertical]:bottom-0 data-[orientation=vertical]:h-full data-[orientation=vertical]:clip-media-y-[--media-slider-fill] group-data-dragging/slider:data-[orientation=vertical]:clip-media-y-[--media-slider-pointer]',\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\n/** Shared slider buffer. */\nexport type SliderBufferProps = ComponentProps<'div'>;\n\nexport function SliderBuffer({ className, ...props }: SliderBufferProps) {\n  return (\n    <div\n      className={cn(\n        'pointer-events-none absolute rounded-[inherit] transition-[clip-path] duration-media-slider ease-out group-data-dragging/slider:duration-0 group-data-seeking/slider:duration-0 bg-current/20 data-[orientation=horizontal]:inset-y-0 data-[orientation=horizontal]:left-0 data-[orientation=horizontal]:w-full data-[orientation=horizontal]:clip-media-x-[--media-slider-buffer] data-[orientation=vertical]:inset-x-0 data-[orientation=vertical]:bottom-0 data-[orientation=vertical]:h-full data-[orientation=vertical]:clip-media-y-[--media-slider-buffer]',\n        className\n      )}\n      {...props}\n    />\n  );\n}\n\n/** Shared slider thumb. */\nexport type SliderThumbProps = ComponentProps<'div'>;\n\nexport function SliderThumb({ className, ...props }: SliderThumbProps) {\n  return (\n    <div\n      className={cn(\n        'absolute z-10 top-1/2 left-(--media-slider-fill) size-3 -translate-x-1/2 -translate-y-1/2 rounded-media-control bg-current select-none transition-[opacity,height,width,outline-offset,left,top,scale] duration-media-slider ease-out group-data-dragging/slider:transition-[opacity,height,width,outline-offset,scale] group-data-dragging/slider:scale-90 data-[orientation=vertical]:top-[calc(100%-var(--media-slider-fill))] data-[orientation=vertical]:left-1/2 group-data-dragging/slider:data-[orientation=horizontal]:left-(--media-slider-pointer) group-data-dragging/slider:data-[orientation=vertical]:top-[calc(100%-var(--media-slider-pointer))] outline-transparent shadow-media-thumb focus-ring-media focus-visible:outline-media-ring focus-visible:outline-offset-2',\n        className\n      )}\n      {...props}\n    />\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/live-audio/minimal/ui/sliders/slider.tsx"
    },
    {
      "path": "skins/files/live-audio-minimal/skins/live-audio/minimal/ui/sliders/volume-slider.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { VolumeSlider as VolumeSliderPrimitive } from '@videojs/react';\n\nimport { cn, resolveClassName } from '@/components/videojs/lib/resolve-class-name';\n\nimport { SliderFill, SliderThumb, SliderTrack } from './slider';\n\nexport type VolumeSliderProps = Omit<VolumeSliderPrimitive.RootProps, 'children'>;\n\nexport function VolumeSlider({ className, ...props }: VolumeSliderProps = {}) {\n  return (\n    <VolumeSliderPrimitive.Root\n      className={(state) =>\n        cn(\n          'group/slider relative flex flex-1 cursor-pointer items-center justify-center outline-hidden',\n          'rounded-media-pill',\n          'data-[orientation=horizontal]:[height:var(--media-slider-height,--spacing(8))] data-[orientation=horizontal]:min-w-20',\n          'data-[orientation=vertical]:h-20 data-[orientation=vertical]:w-8 data-[orientation=vertical]:min-w-0',\n          'media-volume-slider',\n          resolveClassName(className, state)\n        )\n      }\n      thumbAlignment=\"edge\"\n      {...props}\n    >\n      <VolumeSliderPrimitive.Track render={<SliderTrack />}>\n        <VolumeSliderPrimitive.Fill render={<SliderFill />} />\n      </VolumeSliderPrimitive.Track>\n      <VolumeSliderPrimitive.Thumb render={<SliderThumb />} className={'scale-100 opacity-100'} />\n    </VolumeSliderPrimitive.Root>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/live-audio/minimal/ui/sliders/volume-slider.tsx"
    },
    {
      "path": "skins/files/live-audio-minimal/skins/shared/live-playback-hotkeys.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { Hotkey } from '@videojs/react';\n\nexport interface LivePlaybackHotkeysProps {\n  disabled?: boolean | undefined;\n}\n\nexport function LivePlaybackHotkeys({ disabled = false }: LivePlaybackHotkeysProps = {}) {\n  return (\n    <>\n      <Hotkey disabled={disabled} keys=\"Space\" action=\"togglePaused\" />\n      <Hotkey disabled={disabled} keys=\"k\" action=\"togglePaused\" />\n      <Hotkey disabled={disabled} keys=\"m\" action=\"toggleMuted\" />\n      <Hotkey disabled={disabled} keys=\"ArrowUp\" action=\"volumeStep\" />\n      <Hotkey disabled={disabled} keys=\"ArrowDown\" action=\"volumeStep\" />\n    </>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/shared/live-playback-hotkeys.tsx"
    }
  ],
  "meta": {
    "framework": "react",
    "style": "tailwind",
    "role": "skin",
    "styling": "tailwind",
    "preset": "live-audio",
    "media": "audio",
    "theme": "minimal",
    "public": true
  },
  "docs": "Requires `@videojs/react@10.0.0-beta.32`, which is installed with this item.\n\n```tsx\nimport { HlsAudio } from '@videojs/react/media/hls-audio';\nimport { LiveAudioPlayer } from '@videojs/react/live-audio';\n\nimport { MinimalLiveAudioSkin } from '@/components/videojs/skins/live-audio/minimal/skin';\n\nexport function Player({ src }: { src: string }) {\n  return (\n    <LiveAudioPlayer>\n      <MinimalLiveAudioSkin className=\"aspect-video w-full\">\n        <HlsAudio src={src} />\n      </MinimalLiveAudioSkin>\n    </LiveAudioPlayer>\n  );\n}\n```",
  "categories": [
    "media",
    "skins",
    "live-audio"
  ],
  "type": "registry:block"
}