{
  "$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"
  ],
  "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 className={cn('audio-controls', 'audio-controls-content')}>\n        <Tooltip.Provider>\n          <Controls.Group className={'audio-controls-start'}>\n            <AudioPlayButton />\n            <LiveButton />\n          </Controls.Group>\n\n          <div aria-hidden=\"true\" className={'audio-controls-spacer'} />\n\n          <Controls.Group className={'audio-controls-end'}>\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={'audio-dialog-backdrop'} />\n      <ErrorDialog.Popup className={'audio-dialog-popup'}>\n        <div className={'audio-dialog-content'}>\n          <ErrorDialog.Title className={'audio-dialog-title'} />\n          <ErrorDialog.Description className={'audio-dialog-description'} />\n        </div>\n        <div className={'audio-dialog-actions'}>\n          <ErrorDialog.Close render={<Button />} className={'audio-dialog-close'} />\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('audio-play-button', className)} {...props}>\n      <BufferingIndicator className={'audio-play-button-buffering-indicator'} />\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 './skin.css';\nimport '../../../styles/theme.css';\nimport type { ComponentProps, ReactNode } from 'react';\n\nimport { cn } from '@/components/videojs/lib/resolve-class-name';\n\nimport { LivePlaybackHotkeys } from '../../shared/live-playback-hotkeys';\nimport { MinimalLiveAudioControls } from './controls';\nimport { AudioErrorDialog } from './error-dialog';\nimport { StatusAnnouncer } from './ui/feedback/status-announcer';\nimport { Container } from './ui/layout/container';\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 className={cn('audio-skin', className)} data-theme=\"minimal\" data-preset=\"live-audio\" {...props}>\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          'media-popup',\n          'media-popup-safe-area',\n          'media-popup-transition',\n          'media-popup-surface',\n          'media-tooltip'\n        )}\n      >\n        {label ?? <Tooltip.Label />}\n        {!label && <Tooltip.Shortcut className={'media-tooltip-shortcut'} />}\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 <button className={cn('media-button', className)} {...props} />;\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) => cn('media-live-button', resolveClassName(className, state))}\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('media-mute-button', resolveClassName(className, state))}\n      {...props}\n    >\n      <VolumeOffIconPrimitive className={cn('media-button-icon', 'media-mute-button-off-icon')} />\n      <VolumeLowIconPrimitive className={cn('media-button-icon', 'media-mute-button-low-icon')} />\n      <VolumeHighIconPrimitive className={cn('media-button-icon', 'media-mute-button-high-icon')} />\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('media-play-button', resolveClassName(className, state))}\n      {...props}\n    >\n      <RestartIconPrimitive className={cn('media-button-icon', 'media-play-button-restart-icon')} />\n      <PlayIconPrimitive className={cn('media-button-icon', 'media-play-button-play-icon')} />\n      <PauseIconPrimitive className={cn('media-button-icon', 'media-play-button-pause-icon')} />\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          'media-popup',\n          'media-popup-safe-area',\n          'media-popup-transition',\n          'media-popup-surface',\n          'media-volume-popover'\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) => cn('media-buffering-indicator', resolveClassName(className, state))}\n      {...props}\n    >\n      <SpinnerIconPrimitive className={'media-buffering-indicator-spinner-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/feedback/status-announcer.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { StatusAnnouncer as StatusAnnouncerPrimitive } from '@videojs/react';\n\nimport { cn, resolveClassName } from '@/components/videojs/lib/resolve-class-name';\n\nexport type StatusAnnouncerProps = Omit<StatusAnnouncerPrimitive.Props, 'children'>;\n\nexport function StatusAnnouncer({ className, ...props }: StatusAnnouncerProps = {}) {\n  return (\n    <StatusAnnouncerPrimitive\n      className={(state) => cn('media-status-announcer', resolveClassName(className, state))}\n      {...props}\n    />\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/live-audio/minimal/ui/feedback/status-announcer.tsx"
    },
    {
      "path": "skins/files/live-audio-minimal/skins/live-audio/minimal/ui/layout/container.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { Container as ContainerPrimitive } from '@videojs/react';\n\nimport { cn } from '@/components/videojs/lib/resolve-class-name';\n\nexport type ContainerProps = ContainerPrimitive.Props;\n\nexport function Container({ children, className, ...props }: ContainerProps) {\n  return (\n    <ContainerPrimitive className={cn('media-skin', 'media-container', className)} {...props}>\n      {children}\n    </ContainerPrimitive>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/live-audio/minimal/ui/layout/container.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 <div className={cn('media-slider-track', className)} {...props} />;\n}\n\n/** Shared slider fill. */\nexport type SliderFillProps = ComponentProps<'div'>;\n\nexport function SliderFill({ className, ...props }: SliderFillProps) {\n  return <div className={cn('media-slider-fill', className)} {...props} />;\n}\n\n/** Shared slider buffer. */\nexport type SliderBufferProps = ComponentProps<'div'>;\n\nexport function SliderBuffer({ className, ...props }: SliderBufferProps) {\n  return <div className={cn('media-slider-buffer', className)} {...props} />;\n}\n\n/** Shared slider thumb. */\nexport type SliderThumbProps = ComponentProps<'div'>;\n\nexport function SliderThumb({ className, ...props }: SliderThumbProps) {\n  return <div className={cn('media-slider-thumb', className)} {...props} />;\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) => cn('media-slider', 'media-volume-slider', resolveClassName(className, state))}\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={'media-volume-slider-thumb'} />\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"
    },
    {
      "path": "skins/files/live-audio-minimal/skin.css",
      "content": "@layer components {\n  @scope (.media-skin[data-theme=\"minimal\"][data-preset=\"live-audio\"]) {\n    .media-status-announcer {\n      clip-path: inset(50%);\n      white-space: nowrap;\n      border-width: 0;\n      width: 1px;\n      height: 1px;\n      margin: -1px;\n      padding: 0;\n      position: absolute;\n      overflow: hidden;\n    }\n  }\n\n  @scope (.media-skin[data-theme=\"minimal\"][data-preset=\"live-audio\"]) {\n    .media-container,\n    :scope.media-container {\n      isolation: isolate;\n      border-radius: var(--media-video-border-radius);\n      background-color: var(--media-background);\n      width: 100%;\n      height: 100%;\n      font-family: var(--media-font-family, \"Inter Variable\", Inter, ui-sans-serif, system-ui, sans-serif);\n      font-size: calc(var(--media-spacing) * 3.25);\n      -webkit-font-smoothing: auto;\n      -moz-osx-font-smoothing: auto;\n      outline-offset: -4px;\n      transition-property: outline-offset, outline-color;\n      transition-duration: 0.15s;\n      transition-duration: var(--media-duration-fast);\n      --spacing: var(--media-spacing);\n      outline: 2px solid #0000;\n      line-height: 1.5;\n      transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n      display: block;\n      position: relative;\n      overflow: clip;\n      container: media-root / size;\n    }\n\n    .media-container:after,\n    :scope.media-container:after {\n      pointer-events: none;\n      inset: calc(var(--media-spacing) * 0);\n      z-index: 10;\n      border-radius: inherit;\n      content: \"\";\n      box-shadow:\n        0 0 #0000,\n        0 0 #0000,\n        0 0 #0000,\n        0 0 #0000,\n        inset 0 0 0 1px var(--media-frame-border);\n      position: absolute;\n    }\n\n    .media-container:focus-visible,\n    :scope.media-container:focus-visible {\n      outline-offset: 2px;\n      outline-color: var(--media-ring);\n    }\n\n    .media-container:fullscreen:after,\n    :scope.media-container:fullscreen:after {\n      content: \"\";\n      display: none;\n    }\n  }\n\n  @scope (.media-skin[data-theme=\"minimal\"][data-preset=\"live-audio\"]) {\n    .media-button {\n      width: var(--media-control-size);\n      height: var(--media-control-size);\n      min-height: calc(var(--media-spacing) * 0);\n      cursor: pointer;\n      touch-action: manipulation;\n      border-radius: var(--media-control-radius);\n      padding: calc(var(--media-spacing) * 0);\n      text-align: center;\n      color: inherit;\n      outline-offset: -2px;\n      transition-property: background-color, color, outline-offset, scale;\n      transition-duration: var(--media-duration);\n      will-change: scale;\n      -webkit-user-select: none;\n      user-select: none;\n      corner-shape: var(--media-control-corner-shape);\n      text-shadow: inherit;\n      background-color: #0000;\n      border-style: solid;\n      border-width: 0;\n      outline: 2px solid #0000;\n      flex-shrink: 0;\n      place-items: center;\n      transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n      display: grid;\n    }\n\n    .media-button:focus-visible {\n      outline-offset: 2px;\n      outline-color: var(--media-ring);\n    }\n\n    .media-button:not([aria-disabled=\"true\"]):active {\n      scale: 0.97;\n    }\n\n    .media-button[aria-disabled=\"true\"] {\n      cursor: not-allowed;\n      opacity: 0.5;\n    }\n\n    @supports (corner-shape: squircle) {\n      .media-button {\n        border-radius: 1rem;\n      }\n    }\n\n    @media (prefers-reduced-motion: reduce) {\n      .media-button {\n        will-change: auto;\n        transition-property: background-color, color;\n        scale: 1;\n      }\n    }\n\n    .media-button:where(:focus-visible, [aria-expanded=\"true\"], [data-highlighted]):where(\n        :not([aria-disabled=\"true\"])\n      ) {\n      background-color: var(--media-accent);\n      color: var(--media-accent-foreground);\n    }\n\n    @media (hover: hover) {\n      .media-button:hover:where(:not([aria-disabled=\"true\"])) {\n        background-color: var(--media-accent);\n        color: var(--media-accent-foreground);\n      }\n    }\n  }\n\n  @scope (.media-skin[data-theme=\"minimal\"][data-preset=\"live-audio\"]) {\n    .audio-dialog-actions {\n      gap: calc(var(--media-spacing) * 2);\n      flex-shrink: 0;\n      display: flex;\n    }\n\n    .audio-dialog-backdrop {\n      display: none;\n    }\n\n    .audio-dialog-close {\n      height: var(--media-control-size);\n      width: auto;\n      padding-inline: calc(var(--media-spacing) * 3);\n      flex: none;\n      font-weight: 500;\n      background-color: var(--media-primary) !important;\n      color: var(--media-primary-foreground) !important;\n    }\n\n    .audio-dialog-content {\n      min-height: calc(var(--media-spacing) * 0);\n      align-items: center;\n      gap: calc(var(--media-spacing) * 2);\n      flex-direction: row;\n      flex: 1;\n      display: flex;\n      overflow: visible;\n    }\n\n    .audio-dialog-description {\n      margin: calc(var(--media-spacing) * 0);\n      overflow-wrap: anywhere;\n      opacity: 0.7;\n    }\n\n    .audio-dialog-popup {\n      inset: calc(var(--media-spacing) * 0);\n      z-index: 50;\n      align-items: center;\n      gap: calc(var(--media-spacing) * 4);\n      background-color: var(--media-background);\n      width: 100%;\n      height: 100%;\n      max-height: none;\n      padding-inline: calc(var(--media-spacing) * 3);\n      padding-block: calc(var(--media-spacing) * 0);\n      color: var(--media-controls-foreground);\n      backdrop-filter: var(--media-backdrop-filter-dialog);\n      transition-property: opacity, filter, scale;\n      transition-duration: 0.15s;\n      transition-duration: var(--media-duration-slower);\n      border-radius: 9999px;\n      outline-style: none;\n      flex-direction: row;\n      padding-inline-end: calc(var(--media-spacing) * 1);\n      transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n      display: flex;\n      position: absolute;\n      translate: none;\n    }\n\n    @media (forced-colors: active) {\n      .audio-dialog-popup {\n        outline-offset: 2px;\n        outline: 2px solid #0000;\n      }\n    }\n\n    .audio-dialog-popup:not([data-open]) {\n      display: none;\n    }\n\n    .audio-dialog-popup:is([data-starting-style], [data-ending-style]) {\n      scale: var(--media-hidden-popup-scale) var(--media-hidden-popup-scale);\n      opacity: 0;\n      filter: blur(var(--media-hidden-popup-blur));\n    }\n\n    .audio-dialog-title {\n      margin: calc(var(--media-spacing) * 0);\n      font-size: calc(var(--media-spacing) * 3.25);\n      font-weight: 600;\n      line-height: 1.25;\n    }\n  }\n\n  @scope (.media-skin[data-theme=\"minimal\"][data-preset=\"live-audio\"]) {\n    .media-live-button {\n      align-items: center;\n      gap: calc(var(--media-spacing) * 1.5);\n      width: auto;\n      padding-inline: calc(var(--media-spacing) * 3);\n      padding-block: calc(var(--media-spacing) * 2);\n      font-size: calc(var(--media-spacing) * 2.75);\n      letter-spacing: 0.05em;\n      text-transform: uppercase;\n      font-weight: 600;\n      line-height: 1;\n      display: inline-flex !important;\n    }\n\n    .media-live-button:before {\n      width: calc(var(--media-spacing) * 2);\n      height: calc(var(--media-spacing) * 2);\n      transition-property: background-color;\n      transition-duration: 0.15s;\n      transition-duration: var(--media-duration);\n      content: \"\";\n      background-color: currentColor;\n      border-radius: 9999px;\n      flex-shrink: 0;\n      transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n      display: inline-block;\n    }\n\n    @supports (color: color-mix(in lab, red, red)) {\n      .media-live-button:before {\n        background-color: color-mix(in oklab, currentcolor 40%, transparent);\n      }\n    }\n\n    .media-live-button[data-live-edge]:before {\n      content: \"\";\n      background-color: var(--media-live-color);\n    }\n  }\n\n  @scope (.media-skin[data-theme=\"minimal\"][data-preset=\"live-audio\"]) {\n    .media-popup {\n      margin: calc(var(--media-spacing) * 0);\n      color: inherit;\n      border-style: solid;\n      border-width: 0;\n      overflow: visible;\n    }\n\n    .media-popup[data-ending-style] {\n      transform: none;\n    }\n\n    .media-popup[data-starting-style] {\n      transform: translate(var(--media-popup-translate-x-distance, 0), var(--media-popup-translate-y-distance, 0));\n      filter: none;\n    }\n\n    .media-popup[data-side=\"bottom\"] {\n      transform-origin: top;\n      --media-popup-translate-y-distance: calc(var(--media-popup-translate-distance) * -1);\n    }\n\n    .media-popup[data-side=\"left\"] {\n      transform-origin: 100%;\n      --media-popup-translate-x-distance: var(--media-popup-translate-distance);\n    }\n\n    .media-popup[data-side=\"right\"] {\n      transform-origin: 0;\n      --media-popup-translate-x-distance: calc(var(--media-popup-translate-distance) * -1);\n    }\n\n    .media-popup[data-side=\"top\"] {\n      transform-origin: bottom;\n      --media-popup-translate-y-distance: var(--media-popup-translate-distance);\n    }\n\n    .media-popup:is([data-starting-style], [data-ending-style]) {\n      scale: var(--media-hidden-popup-scale) var(--media-hidden-popup-scale);\n      opacity: 0;\n      filter: blur(var(--media-hidden-popup-blur));\n    }\n\n    .media-popup-safe-area:before {\n      pointer-events: auto;\n      content: \"\";\n      position: absolute;\n    }\n\n    .media-popup-safe-area[data-side=\"bottom\"]:before {\n      inset-inline: calc(var(--media-spacing) * 0);\n      content: \"\";\n      height: var(--media-popup-side-offset);\n      bottom: 100%;\n    }\n\n    .media-popup-safe-area[data-side=\"left\"]:before {\n      inset-block: calc(var(--media-spacing) * 0);\n      content: \"\";\n      width: var(--media-popup-side-offset);\n      left: 100%;\n    }\n\n    .media-popup-safe-area[data-side=\"right\"]:before {\n      inset-block: calc(var(--media-spacing) * 0);\n      content: \"\";\n      width: var(--media-popup-side-offset);\n      right: 100%;\n    }\n\n    .media-popup-safe-area[data-side=\"top\"]:before {\n      inset-inline: calc(var(--media-spacing) * 0);\n      content: \"\";\n      height: var(--media-popup-side-offset);\n      top: 100%;\n    }\n\n    .media-popup-surface {\n      background-color: var(--media-popover);\n      color: var(--media-popover-foreground);\n      box-shadow:\n        0 0 0 1px var(--media-surface-border, var(--media-border)),\n        var(--media-shadow-surface);\n      backdrop-filter: var(--media-backdrop-filter-surface);\n    }\n\n    .media-popup-surface:after {\n      z-index: 10;\n      pointer-events: none;\n      border-radius: inherit;\n      box-shadow: var(--media-shadow-surface-inset);\n      content: \"\";\n      display: none;\n      position: absolute;\n      inset: 0;\n    }\n\n    .media-popup-transition {\n      transition-property: opacity, filter, transform, scale;\n      transition-duration: var(--media-duration-fast);\n      transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n    }\n\n    .media-popup-transition[data-ending-style] {\n      transition-duration: var(--media-duration-instant);\n    }\n\n    .media-tooltip {\n      border-radius: var(--media-control-radius);\n      padding-inline: calc(var(--media-spacing) * 2);\n      padding-block: calc(var(--media-spacing) * 1);\n      font-size: calc(var(--media-spacing) * 3.25);\n      white-space: nowrap;\n      --media-popup-side-offset: var(--media-tooltip-side-offset);\n      box-shadow:\n        0 0 #0000,\n        0 0 #0000,\n        0 0 #0000,\n        0 0 #0000,\n        var(--media-shadow-tooltip) !important;\n    }\n\n    .media-tooltip[data-open] {\n      align-items: center;\n      gap: calc(var(--media-spacing) * 1);\n      display: flex;\n    }\n\n    .media-tooltip-shortcut {\n      border-radius: calc(var(--media-spacing) * 1);\n      background-color: var(--media-muted);\n      text-align: center;\n      min-width: 1.5em;\n      font-family: inherit;\n      font-size: calc(var(--media-spacing) * 2.75);\n      margin-inline-end: calc(var(--media-spacing) * -1);\n      padding: 0.1em;\n      font-weight: 600;\n      line-height: 1.25;\n    }\n  }\n\n  @scope (.media-skin[data-theme=\"minimal\"][data-preset=\"live-audio\"]) {\n    .media-button-icon {\n      width: var(--media-icon-size, calc(var(--media-spacing) * 4.5));\n      height: var(--media-icon-size, calc(var(--media-spacing) * 4.5));\n      filter: drop-shadow(0 1px 0 var(--media-shadow-current-color));\n      transition-property: opacity, scale;\n      transition-duration: 0.15s;\n      transition-duration: var(--media-duration);\n      grid-row-start: 1;\n      grid-column-start: 1;\n      transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n    }\n\n    .media-mute-button-high-icon {\n      opacity: 0;\n    }\n\n    @scope (.media-mute-button) {\n      &:not([data-muted]):not([data-volume-level=\"low\"]) .media-mute-button-high-icon {\n        opacity: 1;\n        scale: 1;\n      }\n    }\n\n    .media-mute-button-low-icon {\n      opacity: 0;\n    }\n\n    @scope (.media-mute-button) {\n      &:not([data-muted])[data-volume-level=\"low\"] .media-mute-button-low-icon {\n        opacity: 1;\n        scale: 1;\n      }\n    }\n\n    .media-mute-button-off-icon {\n      opacity: 0;\n    }\n\n    @scope (.media-mute-button) {\n      &[data-muted] .media-mute-button-off-icon {\n        opacity: 1;\n        scale: 1;\n      }\n    }\n  }\n\n  @scope (.media-skin[data-theme=\"minimal\"][data-preset=\"live-audio\"]) {\n    .media-slider-buffer {\n      pointer-events: none;\n      border-radius: inherit;\n      transition-property: clip-path;\n      transition-duration: 0.15s;\n      transition-duration: var(--media-duration-slider);\n      background-color: currentColor;\n      transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n      position: absolute;\n    }\n\n    @supports (color: color-mix(in lab, red, red)) {\n      .media-slider-buffer {\n        background-color: color-mix(in oklab, currentcolor 20%, transparent);\n      }\n    }\n\n    @scope (.media-slider) {\n      &[data-dragging] .media-slider-buffer,\n      &[data-seeking] .media-slider-buffer {\n        transition-duration: 0s;\n      }\n    }\n\n    .media-slider-buffer[data-orientation=\"horizontal\"] {\n      inset-block: calc(var(--media-spacing) * 0);\n      left: calc(var(--media-spacing) * 0);\n      width: 100%;\n      clip-path: inset(0 calc(100% - var(--media-slider-buffer)) 0 0 round var(--media-control-radius));\n    }\n\n    .media-slider-buffer[data-orientation=\"vertical\"] {\n      inset-inline: calc(var(--media-spacing) * 0);\n      bottom: calc(var(--media-spacing) * 0);\n      height: 100%;\n      clip-path: inset(calc(100% - var(--media-slider-buffer)) 0 0 0 round var(--media-control-radius));\n    }\n\n    .media-slider-fill {\n      pointer-events: none;\n      border-radius: inherit;\n      background-color: var(--media-primary);\n      transition-property: clip-path;\n      transition-duration: 0.15s;\n      transition-duration: var(--media-duration-slider);\n      transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n      position: absolute;\n    }\n\n    @scope (.media-slider) {\n      &[data-dragging] .media-slider-fill,\n      &[data-seeking] .media-slider-fill {\n        transition-duration: 0s;\n      }\n    }\n\n    .media-slider-fill[data-orientation=\"horizontal\"] {\n      inset-block: calc(var(--media-spacing) * 0);\n      left: calc(var(--media-spacing) * 0);\n      width: 100%;\n      clip-path: inset(0 calc(100% - var(--media-slider-fill)) 0 0 round var(--media-control-radius));\n    }\n\n    @scope (.media-slider) {\n      &[data-dragging] .media-slider-fill[data-orientation=\"horizontal\"] {\n        clip-path: inset(0 calc(100% - var(--media-slider-pointer)) 0 0 round var(--media-control-radius));\n      }\n    }\n\n    .media-slider-fill[data-orientation=\"vertical\"] {\n      inset-inline: calc(var(--media-spacing) * 0);\n      bottom: calc(var(--media-spacing) * 0);\n      height: 100%;\n      clip-path: inset(calc(100% - var(--media-slider-fill)) 0 0 0 round var(--media-control-radius));\n    }\n\n    @scope (.media-slider) {\n      &[data-dragging] .media-slider-fill[data-orientation=\"vertical\"] {\n        clip-path: inset(calc(100% - var(--media-slider-pointer)) 0 0 0 round var(--media-control-radius));\n      }\n    }\n\n    .media-slider-thumb {\n      top: 50%;\n      left: var(--media-slider-fill);\n      z-index: 10;\n      width: calc(var(--media-spacing) * 3);\n      height: calc(var(--media-spacing) * 3);\n      border-radius: var(--media-control-radius);\n      box-shadow:\n        0 0 #0000,\n        0 0 #0000,\n        0 0 #0000,\n        0 0 #0000,\n        var(--media-shadow-thumb);\n      outline-offset: -2px;\n      transition-property: opacity, height, width, outline-offset, left, top, scale;\n      transition-duration: 0.15s;\n      transition-duration: var(--media-duration-slider);\n      -webkit-user-select: none;\n      user-select: none;\n      background-color: currentColor;\n      outline: 2px solid #0000;\n      transition-timing-function: cubic-bezier(0, 0, 0.2, 1);\n      position: absolute;\n      translate: -50% -50%;\n    }\n\n    @scope (.media-slider) {\n      &[data-dragging] .media-slider-thumb {\n        transition-property: opacity, height, width, outline-offset, scale;\n        transition-duration: 0.15s;\n        transition-timing-function: cubic-bezier(0.4, 0, 0.2, 1);\n        scale: 0.9;\n      }\n    }\n\n    .media-slider-thumb:focus-visible {\n      outline-offset: 2px;\n      outline-color: var(--media-ring);\n    }\n\n    @scope (.media-slider) {\n      &[data-dragging] .media-slider-thumb[data-orientation=\"horizontal\"] {\n        left: var(--media-slider-pointer);\n      }\n    }\n\n    .media-slider-thumb[data-orientation=\"vertical\"] {\n      top: calc(100% - var(--media-slider-fill));\n      left: 50%;\n    }\n\n    @scope (.media-slider) {\n      &[data-dragging] .media-slider-thumb[data-orientation=\"vertical\"] {\n        top: calc(100% - var(--media-slider-pointer));\n      }\n    }\n\n    .media-slider-track {\n      isolation: isolate;\n      -webkit-user-select: none;\n      user-select: none;\n      background-color: currentColor;\n      border-radius: 9999px;\n      width: 100%;\n      position: relative;\n      overflow: hidden;\n    }\n\n    @supports (color: color-mix(in lab, red, red)) {\n      .media-slider-track {\n        background-color: color-mix(in oklab, currentcolor 20%, transparent);\n      }\n    }\n\n    .media-slider-track[data-orientation=\"horizontal\"] {\n      height: calc(var(--media-spacing) * 1);\n    }\n\n    .media-slider-track[data-orientation=\"vertical\"] {\n      height: 100%;\n      width: calc(var(--media-spacing) * 1);\n    }\n  }\n\n  @scope (.media-skin[data-theme=\"minimal\"][data-preset=\"live-audio\"]) {\n    .media-slider {\n      cursor: pointer;\n      border-radius: 9999px;\n      outline-style: none;\n      flex: 1;\n      justify-content: center;\n      align-items: center;\n      display: flex;\n      position: relative;\n    }\n\n    @media (forced-colors: active) {\n      .media-slider {\n        outline-offset: 2px;\n        outline: 2px solid #0000;\n      }\n    }\n\n    .media-slider[data-orientation=\"horizontal\"] {\n      height: var(--media-slider-height, calc(var(--media-spacing) * 8));\n      min-width: calc(var(--media-spacing) * 20);\n    }\n\n    .media-slider[data-orientation=\"vertical\"] {\n      height: calc(var(--media-spacing) * 20);\n      width: calc(var(--media-spacing) * 8);\n      min-width: calc(var(--media-spacing) * 0);\n    }\n\n    .media-volume-slider-thumb {\n      opacity: 1;\n      scale: 1;\n    }\n  }\n\n  @scope (.media-skin[data-theme=\"minimal\"][data-preset=\"live-audio\"]) {\n    .media-volume-popover {\n      border-radius: var(--media-control-radius);\n      padding-inline: calc(var(--media-spacing) * 0);\n      padding-block: calc(var(--media-spacing) * 3);\n      --media-popup-side-offset: var(--media-popover-side-offset);\n    }\n\n    .media-volume-popover[data-side=\"left\"] {\n      background-image: linear-gradient(to left, var(--media-controls) 80%, transparent 100%);\n      padding-block: calc(var(--media-spacing) * 0);\n      --media-popover-side-offset: 0rem;\n      border-style: solid;\n      border-width: 0;\n      border-radius: 0;\n      padding-inline-start: calc(var(--media-spacing) * 16);\n      padding-inline-end: calc(var(--media-spacing) * 2);\n      box-shadow: none !important;\n      backdrop-filter: none !important;\n      background-color: #0000 !important;\n    }\n\n    .media-volume-popover[data-side=\"left\"]:after {\n      content: \"\";\n      display: none;\n    }\n\n    .media-volume-popover[data-side=\"right\"] {\n      padding: calc(var(--media-spacing) * 0);\n      padding-inline: calc(var(--media-spacing) * 3);\n      --media-popover-side-offset: 0rem;\n      border-radius: 0;\n      box-shadow: none !important;\n      backdrop-filter: none !important;\n      background-color: #0000 !important;\n    }\n\n    .media-volume-popover[data-side=\"right\"]:after {\n      content: \"\";\n      display: none;\n    }\n  }\n\n  @scope (.media-skin[data-theme=\"minimal\"][data-preset=\"live-audio\"]) {\n    .media-play-button-pause-icon {\n      scale: var(--media-hidden-icon-scale) var(--media-hidden-icon-scale);\n      opacity: 0;\n    }\n\n    @scope (.media-play-button) {\n      &[data-started]:not([data-paused]):not([data-ended]) .media-play-button-pause-icon {\n        opacity: 1;\n        scale: 1;\n      }\n    }\n\n    .media-play-button-play-icon {\n      scale: var(--media-hidden-icon-scale) var(--media-hidden-icon-scale);\n      opacity: 0;\n    }\n\n    @scope (.media-play-button) {\n      &:not([data-ended]):not([data-started]) .media-play-button-play-icon,\n      &:not([data-ended])[data-paused] .media-play-button-play-icon {\n        opacity: 1;\n        scale: 1;\n      }\n    }\n\n    .media-play-button-restart-icon {\n      scale: var(--media-hidden-icon-scale) var(--media-hidden-icon-scale);\n      opacity: 0;\n    }\n\n    @scope (.media-play-button) {\n      &[data-ended] .media-play-button-restart-icon {\n        opacity: 1;\n        scale: 1;\n      }\n    }\n  }\n\n  @scope (.media-skin[data-theme=\"minimal\"][data-preset=\"live-audio\"]) {\n    .media-buffering-indicator {\n      pointer-events: none;\n      inset: calc(var(--media-spacing) * 0);\n      color: var(--media-controls-foreground);\n      place-content: center;\n      display: none;\n      position: absolute;\n    }\n\n    .media-buffering-indicator:not([data-visible]) {\n      --media-spinner-animation: none;\n    }\n\n    .media-buffering-indicator:before {\n      inset: calc(var(--media-spacing) * 0);\n      background-color: var(--media-backdrop);\n      content: \"\";\n      backdrop-filter: var(--media-backdrop-filter-indicator);\n      position: absolute;\n    }\n\n    @supports (color: color-mix(in lab, red, red)) {\n      .media-buffering-indicator:before {\n        background-color: color-mix(in oklab, var(--media-backdrop) 35%, transparent);\n      }\n    }\n\n    .media-buffering-indicator[data-visible] {\n      display: grid;\n    }\n\n    .media-buffering-indicator-spinner-icon {\n      z-index: 30;\n      width: var(--media-icon-size, calc(var(--media-spacing) * 4.5));\n      height: var(--media-icon-size, calc(var(--media-spacing) * 4.5));\n      filter: drop-shadow(0 1px 0 var(--media-shadow-current-color));\n      position: relative;\n    }\n  }\n\n  @scope (.media-skin[data-theme=\"minimal\"][data-preset=\"live-audio\"]) {\n    .audio-play-button {\n      display: inline-flex;\n      position: relative;\n    }\n\n    .audio-play-button-buffering-indicator {\n      z-index: 20;\n      border-radius: var(--media-control-radius);\n      color: inherit !important;\n    }\n\n    .audio-play-button-buffering-indicator:before {\n      content: \"\";\n      display: none;\n    }\n\n    .audio-play-button-buffering-indicator[data-visible] {\n      background-color: var(--media-controls);\n    }\n  }\n\n  @scope (.media-skin[data-theme=\"minimal\"][data-preset=\"live-audio\"]) {\n    .audio-controls-content {\n      z-index: 20;\n      align-items: center;\n      gap: calc(var(--media-spacing) * 2);\n      border-radius: var(--media-controls-radius);\n      background-color: var(--media-controls);\n      padding: calc(var(--media-spacing) * 1);\n      color: var(--media-controls-foreground);\n      box-shadow:\n        0 0 #0000,\n        0 0 #0000,\n        0 0 #0000,\n        0 0 #0000,\n        0 0 0 1px var(--media-border);\n      text-shadow: 0 1px 0 var(--media-shadow-current-color);\n      display: flex;\n      position: relative;\n    }\n\n    .audio-controls-end {\n      align-items: center;\n      gap: 1px;\n      display: flex;\n    }\n\n    .audio-controls-spacer {\n      flex: 1;\n    }\n\n    .audio-controls-start {\n      align-items: center;\n      gap: 1px;\n      display: flex;\n    }\n  }\n\n  @scope (.media-skin[data-theme=\"minimal\"][data-preset=\"live-audio\"]) {\n    .audio-skin,\n    :scope.audio-skin {\n      background-color: #0000 !important;\n      height: auto !important;\n      overflow: visible !important;\n      container-type: inline-size !important;\n    }\n\n    .audio-skin:after,\n    :scope.audio-skin:after {\n      content: \"\";\n      display: none;\n    }\n  }\n}\n",
      "type": "registry:style",
      "target": "@components/videojs/skins/live-audio/minimal/skin.css"
    }
  ],
  "meta": {
    "framework": "react",
    "style": "css",
    "role": "skin",
    "styling": "css",
    "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"
}