{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "video-minimal",
  "title": "Minimal Video Skin",
  "description": "A compact on-demand video skin with wrapping controls and the complete video component set.",
  "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/poster",
    "@videojs/status-announcer"
  ],
  "files": [
    {
      "path": "skins/files/video-minimal/skins/shared/playback-hotkeys.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { Hotkey } from '@videojs/react';\n\nexport interface PlaybackHotkeysProps {\n  disabled?: boolean | undefined;\n}\n\nexport function PlaybackHotkeys({ disabled = false }: PlaybackHotkeysProps = {}) {\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=\"ArrowRight\" action=\"seekStep\" />\n      <Hotkey disabled={disabled} keys=\"ArrowLeft\" action=\"seekStep\" />\n      <Hotkey disabled={disabled} keys=\"l\" action=\"seekStep\" />\n      <Hotkey disabled={disabled} keys=\"j\" action=\"seekStep\" />\n      <Hotkey disabled={disabled} keys=\"ArrowUp\" action=\"volumeStep\" />\n      <Hotkey disabled={disabled} keys=\"ArrowDown\" action=\"volumeStep\" />\n      <Hotkey disabled={disabled} keys=\"0-9\" action=\"seekToPercent\" />\n      <Hotkey disabled={disabled} keys=\"Home\" action=\"seekToPercent\" value={0} />\n      <Hotkey disabled={disabled} keys=\"End\" action=\"seekToPercent\" value={100} />\n      <Hotkey disabled={disabled} keys=\">\" action=\"speedUp\" />\n      <Hotkey disabled={disabled} keys=\"<\" action=\"speedDown\" />\n    </>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/shared/playback-hotkeys.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/controls.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { Controls, Time, Tooltip } from '@videojs/react';\n\nimport { cn } from '@/components/videojs/lib/resolve-class-name';\n\nimport { VideoSettingsMenu } from './settings-menu';\nimport { AirPlayButton } from './ui/buttons/airplay-button';\nimport { ButtonTooltip } from './ui/buttons/button-tooltip';\nimport { CaptionsButton } from './ui/buttons/captions-button';\nimport { CastButton } from './ui/buttons/cast-button';\nimport { FullscreenButton } from './ui/buttons/fullscreen-button';\nimport { PiPButton } from './ui/buttons/pip-button';\nimport { PlayButton } from './ui/buttons/play-button';\nimport { VolumePopover } from './ui/controls/volume-popover';\nimport { TimeSlider } from './ui/sliders/time-slider';\n\nexport function MinimalVideoControls() {\n  return (\n    <Controls.Root>\n      <Controls.Backdrop\n        className={\n          'pointer-events-none absolute inset-0 z-10 rounded-[inherit] bg-(image:--media-controls-gradient) transition-opacity duration-media-controls ease-out not-data-visible:opacity-0'\n        }\n      />\n      <Controls.Content\n        className={cn(\n          'video-controls',\n          'group/controls text-media-controls-foreground text-shadow-media',\n          'duration-media-controls-half ease-out',\n          'absolute inset-x-1 bottom-1 z-20 flex items-center gap-x-2 rounded-media-controls bg-transparent p-1 media-opaque:bg-media-background',\n          'transition-[filter,opacity,translate]',\n          'not-data-visible:pointer-events-none not-data-visible:opacity-0',\n          'not-data-visible:duration-media-controls',\n          'not-data-visible:translate-y-media-hidden-offset pointer-fine:not-data-visible:blur-media-hidden',\n          'media-wide:inset-x-2 media-wide:bottom-2',\n          'media-wide:[--media-popover-side-offset:--spacing(3)]',\n          'media-wide:[--media-tooltip-side-offset:var(--media-popover-side-offset)]',\n          'flex-wrap media-wide:flex-nowrap'\n        )}\n      >\n        <Tooltip.Provider>\n          <Controls.Group className={'flex flex-1 items-center gap-px media-wide:flex-none'}>\n            <ButtonTooltip side=\"top\">\n              <PlayButton />\n            </ButtonTooltip>\n            <VolumePopover showTooltip side=\"right\" orientation=\"horizontal\" />\n          </Controls.Group>\n\n          <Controls.Group\n            className={\n              '@container/video-time-controls -order-1 flex flex-none basis-full flex-row-reverse items-center gap-3 px-1.5 [--media-slider-height:--spacing(5)] media-wide:order-none media-wide:min-w-0 media-wide:flex-1 media-wide:flex-row media-wide:[--media-slider-height:--spacing(8)] media-wide:mask-media-volume media-wide:[mask-size:200%_100%] group-has-[[data-volume-level][aria-expanded=true]]/controls:media-wide:mask-media-volume-open'\n            }\n          >\n            <Time.Group className={'flex items-center gap-1'}>\n              <Time.Value\n                className={cn(\n                  'cursor-pointer rounded-sm tabular-nums focus-ring-media',\n                  'transition-[outline-color,outline-offset] duration-media-fast ease-out',\n                  'focus-visible:outline-media-ring focus-visible:outline-offset-2',\n                  'supports-[corner-shape:squircle]:rounded-2xl supports-[corner-shape:squircle]:[corner-shape:squircle]',\n                  'hidden media-wide:inline'\n                )}\n                type=\"current\"\n                toggle\n              />\n              <Time.Separator className={'hidden media-wide:inline media-wide:text-current/60'} />\n              <Time.Value className={'tabular-nums media-wide:text-current/60'} type=\"duration\" />\n            </Time.Group>\n            <TimeSlider previewOverflow=\"clamp\" />\n          </Controls.Group>\n\n          <Controls.Group\n            className={\n              'flex flex-1 items-center justify-end gap-px media-wide:flex-none media-max-wide:mask-media-volume media-max-wide:[mask-size:400%_100%] group-has-[[data-volume-level][aria-expanded=true]]/controls:media-max-wide:mask-media-volume-open'\n            }\n          >\n            <ButtonTooltip side=\"top\">\n              <CaptionsButton />\n            </ButtonTooltip>\n            <VideoSettingsMenu />\n            <Controls.Group className={'flex items-center gap-px'}>\n              <ButtonTooltip side=\"top\">\n                <CastButton />\n              </ButtonTooltip>\n              <ButtonTooltip side=\"top\">\n                <AirPlayButton />\n              </ButtonTooltip>\n              <ButtonTooltip side=\"top\">\n                <PiPButton />\n              </ButtonTooltip>\n              <ButtonTooltip side=\"top\">\n                <FullscreenButton />\n              </ButtonTooltip>\n            </Controls.Group>\n          </Controls.Group>\n        </Tooltip.Provider>\n      </Controls.Content>\n    </Controls.Root>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/controls.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/gestures.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { Gesture } from '@videojs/react';\n\nexport interface VideoGesturesProps {\n  disabled?: boolean | undefined;\n}\n\nexport function VideoGestures({ disabled = false }: VideoGesturesProps = {}) {\n  return (\n    <>\n      <Gesture disabled={disabled} type=\"tap\" action=\"togglePaused\" pointer=\"mouse\" region=\"center\" />\n      <Gesture disabled={disabled} type=\"tap\" action=\"toggleControls\" pointer=\"touch\" />\n      <Gesture disabled={disabled} type=\"doubletap\" action=\"seekStep\" region=\"left\" />\n      <Gesture disabled={disabled} type=\"doubletap\" action=\"toggleFullscreen\" region=\"center\" />\n      <Gesture disabled={disabled} type=\"doubletap\" action=\"seekStep\" region=\"right\" />\n    </>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/gestures.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/hotkeys.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { Hotkey } from '@videojs/react';\n\nimport { PlaybackHotkeys } from '../../shared/playback-hotkeys';\n\nexport interface VideoHotkeysProps {\n  disabled?: boolean | undefined;\n}\n\nexport function VideoHotkeys({ disabled = false }: VideoHotkeysProps = {}) {\n  return (\n    <>\n      <PlaybackHotkeys disabled={disabled} />\n      <Hotkey disabled={disabled} keys=\"f\" action=\"toggleFullscreen\" />\n      <Hotkey disabled={disabled} keys=\"c\" action=\"toggleSubtitles\" />\n      <Hotkey disabled={disabled} keys=\"i\" action=\"togglePictureInPicture\" />\n    </>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/hotkeys.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/settings-menu.tsx",
      "content": "/** @jsxImportSource react */\n\nimport type { ComponentProps } from 'react';\n\nimport { AudioTrackMenu } from './ui/menus/audio-track-menu';\nimport { CaptionsSubmenu } from './ui/menus/captions-submenu';\nimport { PlaybackRateSubmenu } from './ui/menus/playback-rate-submenu';\nimport { QualityMenu } from './ui/menus/quality-menu';\nimport { SettingsMenu } from './ui/menus/settings-menu';\n\nexport type VideoSettingsMenuProps = Omit<NonNullable<ComponentProps<typeof SettingsMenu>>, 'children'>;\n\nexport function VideoSettingsMenu(props: VideoSettingsMenuProps = {}) {\n  return (\n    <SettingsMenu {...props}>\n      <QualityMenu />\n      <AudioTrackMenu />\n      <PlaybackRateSubmenu />\n      <CaptionsSubmenu />\n    </SettingsMenu>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/settings-menu.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/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 { Poster } from '@/components/videojs/ui/poster';\n\nimport { MinimalVideoControls } from './controls';\nimport { VideoGestures } from './gestures';\nimport { VideoHotkeys } from './hotkeys';\nimport { VideoStatusIndicators } from './status-indicators';\nimport { BufferingIndicator } from './ui/feedback/buffering-indicator';\nimport { ErrorDialog } from './ui/feedback/error-dialog';\n\nexport interface MinimalVideoSkinProps extends Omit<NonNullable<ComponentProps<typeof Container>>, 'children'> {\n  children?: ReactNode;\n  renderPoster?: NonNullable<ComponentProps<typeof Poster>>['children'];\n}\n\nexport function MinimalVideoSkin({ children, className, renderPoster, ...props }: MinimalVideoSkinProps = {}) {\n  return (\n    <Container\n      className={cn('pointer-fine:not-data-controls-visible:cursor-none', className)}\n      data-theme=\"minimal\"\n      data-preset=\"video\"\n      {...props}\n    >\n      {children}\n      <Poster>{renderPoster}</Poster>\n      <BufferingIndicator />\n      <ErrorDialog />\n\n      <MinimalVideoControls />\n\n      <VideoHotkeys />\n      <VideoGestures />\n      <VideoStatusIndicators />\n    </Container>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/skin.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/status-indicators.tsx",
      "content": "/** @jsxImportSource react */\n\nimport type { ComponentProps } from 'react';\n\nimport { cn } from '@/components/videojs/lib/resolve-class-name';\nimport { StatusAnnouncer } from '@/components/videojs/ui/status-announcer';\n\nimport { SeekIndicator } from './ui/feedback/seek-indicator';\nimport { PlaybackStatusIndicator, StatusIndicator } from './ui/feedback/status-indicator';\nimport { VolumeIndicator } from './ui/feedback/volume-indicator';\n\nexport type VideoStatusIndicatorsProps = Omit<ComponentProps<'div'>, 'children'>;\n\nexport function VideoStatusIndicators({ className, ...props }: VideoStatusIndicatorsProps = {}) {\n  return (\n    <>\n      <StatusAnnouncer />\n      <div\n        className={cn(\n          'pointer-events-none absolute inset-0 grid grid-cols-3 items-center justify-items-center text-media-controls-foreground',\n          className\n        )}\n        {...props}\n      >\n        <VolumeIndicator />\n        <StatusIndicator />\n        <SeekIndicator />\n        <PlaybackStatusIndicator />\n      </div>\n    </>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/status-indicators.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/ui/buttons/airplay-button.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { AirPlayButton as AirPlayButtonPrimitive } from '@videojs/react';\nimport {\n  AirPlayEnterIcon as AirPlayEnterIconPrimitive,\n  AirPlayExitIcon as AirPlayExitIconPrimitive,\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 AirPlayButtonProps = Omit<AirPlayButtonPrimitive.Props, 'children'>;\n\nexport function AirPlayButton({ className, ...props }: AirPlayButtonProps = {}) {\n  return (\n    <AirPlayButtonPrimitive\n      render={<Button />}\n      className={(state) =>\n        cn(\n          'group/airplay',\n          'not-data-[airplay-state=connected]:[--media-icon-airplay-fill-animation:none]',\n          'not-data-[airplay-state=connected]:[--media-icon-airplay-triangle-animation:none]',\n          resolveClassName(className, state)\n        )\n      }\n      {...props}\n    >\n      <AirPlayEnterIconPrimitive\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-not-data-[airplay-state=connected]/airplay:scale-100',\n          'group-not-data-[airplay-state=connected]/airplay:opacity-100'\n        )}\n      />\n      <AirPlayExitIconPrimitive\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-[airplay-state=connected]/airplay:scale-100',\n          'group-data-[airplay-state=connected]/airplay:opacity-100'\n        )}\n      />\n    </AirPlayButtonPrimitive>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/ui/buttons/airplay-button.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/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/video/minimal/ui/buttons/button-tooltip.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/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/video/minimal/ui/buttons/button.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/ui/buttons/captions-button.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { CaptionsButton as CaptionsButtonPrimitive } from '@videojs/react';\nimport {\n  CaptionsOffIcon as CaptionsOffIconPrimitive,\n  CaptionsOnIcon as CaptionsOnIconPrimitive,\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 CaptionsButtonProps = Omit<CaptionsButtonPrimitive.Props, 'children'>;\n\nexport function CaptionsButton({ className, ...props }: CaptionsButtonProps = {}) {\n  return (\n    <CaptionsButtonPrimitive\n      render={<Button />}\n      className={(state) => cn('group/captions', resolveClassName(className, state))}\n      {...props}\n    >\n      <CaptionsOffIconPrimitive\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-not-data-active/captions:scale-100 group-not-data-active/captions:opacity-100'\n        )}\n      />\n      <CaptionsOnIconPrimitive\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-active/captions:scale-100 group-data-active/captions:opacity-100'\n        )}\n      />\n    </CaptionsButtonPrimitive>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/ui/buttons/captions-button.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/ui/buttons/cast-button.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { CastButton as CastButtonPrimitive } from '@videojs/react';\nimport {\n  CastEnterIcon as CastEnterIconPrimitive,\n  CastExitIcon as CastExitIconPrimitive,\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 CastButtonProps = Omit<CastButtonPrimitive.Props, 'children'>;\n\nexport function CastButton({ className, ...props }: CastButtonProps = {}) {\n  return (\n    <CastButtonPrimitive\n      render={<Button />}\n      className={(state) => cn('group/cast', resolveClassName(className, state))}\n      {...props}\n    >\n      <CastEnterIconPrimitive\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-not-data-[cast-state=connected]/cast:scale-100',\n          'group-not-data-[cast-state=connected]/cast:opacity-100'\n        )}\n      />\n      <CastExitIconPrimitive\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-[cast-state=connected]/cast:scale-100',\n          'group-data-[cast-state=connected]/cast:opacity-100'\n        )}\n      />\n    </CastButtonPrimitive>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/ui/buttons/cast-button.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/ui/buttons/fullscreen-button.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { FullscreenButton as FullscreenButtonPrimitive } from '@videojs/react';\nimport {\n  FullscreenEnterIcon as FullscreenEnterIconPrimitive,\n  FullscreenExitIcon as FullscreenExitIconPrimitive,\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 FullscreenButtonProps = Omit<FullscreenButtonPrimitive.Props, 'children'>;\n\nexport function FullscreenButton({ className, ...props }: FullscreenButtonProps = {}) {\n  return (\n    <FullscreenButtonPrimitive\n      render={<Button />}\n      className={(state) => cn('group/fullscreen', resolveClassName(className, state))}\n      {...props}\n    >\n      <FullscreenEnterIconPrimitive\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-not-data-fullscreen/fullscreen:scale-100 group-not-data-fullscreen/fullscreen:opacity-100'\n        )}\n      />\n      <FullscreenExitIconPrimitive\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-fullscreen/fullscreen:scale-100 group-data-fullscreen/fullscreen:opacity-100'\n        )}\n      />\n    </FullscreenButtonPrimitive>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/ui/buttons/fullscreen-button.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/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/video/minimal/ui/buttons/mute-button.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/ui/buttons/pip-button.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { PiPButton as PiPButtonPrimitive } from '@videojs/react';\nimport {\n  PipEnterIcon as PipEnterIconPrimitive,\n  PipExitIcon as PipExitIconPrimitive,\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 PiPButtonProps = Omit<PiPButtonPrimitive.Props, 'children'>;\n\nexport function PiPButton({ className, ...props }: PiPButtonProps = {}) {\n  return (\n    <PiPButtonPrimitive\n      render={<Button />}\n      className={(state) => cn('group/pip', resolveClassName(className, state))}\n      {...props}\n    >\n      <PipEnterIconPrimitive\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-not-data-pip/pip:scale-100 group-not-data-pip/pip:opacity-100'\n        )}\n      />\n      <PipExitIconPrimitive\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-pip/pip:scale-100 group-data-pip/pip:opacity-100'\n        )}\n      />\n    </PiPButtonPrimitive>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/ui/buttons/pip-button.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/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/video/minimal/ui/buttons/play-button.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/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/video/minimal/ui/controls/volume-popover.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/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/video/minimal/ui/feedback/buffering-indicator.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/ui/feedback/error-dialog.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { ErrorDialog as ErrorDialogPrimitive } from '@videojs/react';\n\nimport { Button } from '../buttons/button';\n\nexport function ErrorDialog() {\n  return (\n    <ErrorDialogPrimitive.Root>\n      <ErrorDialogPrimitive.Backdrop\n        className={\n          'absolute inset-0 z-40 bg-media-backdrop/20 opacity-100 backdrop-filter-media-dialog not-data-open:hidden transition-opacity delay-media-dialog duration-media-dialog ease-out media-transitioning:opacity-0 data-ending-style:delay-0 data-ending-style:duration-media-instant'\n        }\n      />\n      <ErrorDialogPrimitive.Popup\n        className={\n          'absolute top-1/2 left-1/2 z-50 flex w-media-dialog-width max-w-media-dialog max-h-[calc(100%-0.5rem)] -translate-x-1/2 -translate-y-1/2 flex-col gap-3 rounded-media-dialog text-media-popover-foreground outline-hidden not-data-open:hidden text-shadow-media-dialog transition-[opacity,scale] delay-media-dialog duration-media-dialog ease-out media-transitioning:scale-media-hidden-popup media-transitioning:opacity-0 data-ending-style:delay-0 p-4 data-ending-style:duration-media-instant'\n        }\n      >\n        <div className={'flex min-h-0 flex-col gap-2 overflow-y-auto py-1.5'}>\n          <ErrorDialogPrimitive.Title className={'m-0 text-media-lg font-semibold leading-tight'} />\n          <ErrorDialogPrimitive.Description className={'m-0 opacity-70 wrap-anywhere'} />\n        </div>\n        <div className={'flex shrink-0 gap-2'}>\n          <ErrorDialogPrimitive.Close\n            render={<Button />}\n            className={\n              'h-media-control w-full flex-1 bg-media-primary! px-4 py-2 font-medium text-media-primary-foreground!'\n            }\n          />\n        </div>\n      </ErrorDialogPrimitive.Popup>\n    </ErrorDialogPrimitive.Root>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/ui/feedback/error-dialog.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/ui/feedback/seek-indicator.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { SeekIndicator as SeekIndicatorPrimitive } from '@videojs/react';\nimport { ChevronIcon as ChevronIconPrimitive } from '@videojs/react/icons/minimal';\n\nimport { cn, resolveClassName } from '@/components/videojs/lib/resolve-class-name';\n\nexport type SeekIndicatorProps = Omit<SeekIndicatorPrimitive.RootProps, 'children'>;\n\nexport function SeekIndicator({ className, ...props }: SeekIndicatorProps = {}) {\n  return (\n    <SeekIndicatorPrimitive.Root\n      className={(state) =>\n        cn(\n          'group/seek-status col-start-2 row-start-1 grid place-content-center gap-1 p-4 text-center',\n          'media-wide:p-6',\n          'data-[direction=backward]:col-start-1 data-[direction=backward]:justify-self-start',\n          'data-[direction=forward]:col-start-3 data-[direction=forward]:justify-self-end',\n          resolveClassName(className, state)\n        )\n      }\n      {...props}\n    >\n      <ChevronIconPrimitive\n        className={\n          'hidden size-media-icon-lg group-data-direction/seek-status:block group-data-[direction=backward]/seek-status:[scale:-1_1] transition-[translate,opacity] duration-media-slow ease-in-out group-media-transitioning/seek-status:opacity-0 group-data-[direction=forward]/seek-status:group-data-starting-style/seek-status:-translate-x-media-hidden-seek-offset group-data-[direction=backward]/seek-status:group-data-starting-style/seek-status:translate-x-media-hidden-seek-offset'\n        }\n      />\n      <SeekIndicatorPrimitive.Value className={'tabular-nums'} />\n    </SeekIndicatorPrimitive.Root>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/ui/feedback/seek-indicator.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/ui/feedback/status-indicator.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { StatusIndicator as StatusIndicatorPrimitive } from '@videojs/react';\nimport {\n  CaptionsOnIcon as CaptionsOnIconPrimitive,\n  CaptionsOffIcon as CaptionsOffIconPrimitive,\n  FullscreenEnterIcon as FullscreenEnterIconPrimitive,\n  FullscreenExitIcon as FullscreenExitIconPrimitive,\n  PipEnterIcon as PipEnterIconPrimitive,\n  PipExitIcon as PipExitIconPrimitive,\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\nconst TOP_STATUS_ACTIONS = ['toggleSubtitles', 'toggleFullscreen', 'togglePictureInPicture'] as const;\n\nconst PLAYBACK_STATUS_ACTIONS = ['togglePaused'] as const;\n\nexport type StatusIndicatorProps = Omit<StatusIndicatorPrimitive.RootProps, 'children'>;\n\nexport function StatusIndicator({ className, ...props }: StatusIndicatorProps = {}) {\n  return (\n    <StatusIndicatorPrimitive.Root\n      actions={TOP_STATUS_ACTIONS}\n      className={(state) =>\n        cn(\n          'pointer-events-none absolute origin-top text-inherit',\n          'duration-media-fast ease-out',\n          'media-transitioning:opacity-0 media-transitioning:duration-media-indicator media-transitioning:ease-in',\n          'inset-x-0 top-0 flex justify-center pt-3 pb-32 bg-(image:--media-indicator-gradient) text-shadow-media',\n          'pointer-fine:motion-media-[translate,filter,opacity] pointer-coarse:motion-media-[translate,opacity]',\n          'pointer-fine:media-transitioning:blur-media-hidden',\n          'data-ending-style:translate-y-media-hidden-indicator-offset',\n          'group/input-status',\n          resolveClassName(className, state)\n        )\n      }\n      {...props}\n    >\n      <div\n        className={cn(\n          'items-center justify-between gap-2 px-2.5 py-1',\n          'media-opaque:rounded-media-control media-opaque:bg-media-background',\n          'flex'\n        )}\n      >\n        <CaptionsOnIconPrimitive\n          className={'hidden shrink-0 group-data-[status=captions-on]/input-status:block drop-shadow-media-icon'}\n        />\n        <CaptionsOffIconPrimitive\n          className={'hidden shrink-0 group-data-[status=captions-off]/input-status:block drop-shadow-media-icon'}\n        />\n        <FullscreenEnterIconPrimitive\n          className={'hidden shrink-0 group-data-[status=fullscreen]/input-status:block drop-shadow-media-icon'}\n        />\n        <FullscreenExitIconPrimitive\n          className={'hidden shrink-0 group-data-[status=exit-fullscreen]/input-status:block drop-shadow-media-icon'}\n        />\n        <PipEnterIconPrimitive\n          className={'hidden shrink-0 group-data-[status=pip]/input-status:block drop-shadow-media-icon'}\n        />\n        <PipExitIconPrimitive\n          className={'hidden shrink-0 group-data-[status=exit-pip]/input-status:block drop-shadow-media-icon'}\n        />\n        <StatusIndicatorPrimitive.Value className={'ml-auto'} />\n      </div>\n    </StatusIndicatorPrimitive.Root>\n  );\n}\n\nexport type PlaybackStatusIndicatorProps = Omit<StatusIndicatorPrimitive.RootProps, 'children'>;\n\nexport function PlaybackStatusIndicator({ className, ...props }: PlaybackStatusIndicatorProps = {}) {\n  return (\n    <StatusIndicatorPrimitive.Root\n      actions={PLAYBACK_STATUS_ACTIONS}\n      className={(state) =>\n        cn(\n          'group/playback-status col-start-2 row-start-1 grid place-content-center p-4 text-center',\n          'transition-[opacity,scale] duration-media-slow ease-out',\n          'media-transitioning:scale-media-hidden-playback media-transitioning:opacity-0',\n          'data-ending-style:duration-media-fast data-ending-style:ease-in',\n          resolveClassName(className, state)\n        )\n      }\n      {...props}\n    >\n      <PlayIconPrimitive\n        className={\n          'col-start-1 row-start-1 scale-media-hidden-icon opacity-0 transition-[opacity,scale] duration-media-base ease-out group-data-[status=play]/playback-status:scale-100 group-data-[status=play]/playback-status:opacity-100 size-media-icon-xl'\n        }\n      />\n      <PauseIconPrimitive\n        className={\n          'col-start-1 row-start-1 scale-media-hidden-icon opacity-0 transition-[opacity,scale] duration-media-base ease-out group-data-[status=pause]/playback-status:scale-100 group-data-[status=pause]/playback-status:opacity-100 size-media-icon-xl'\n        }\n      />\n    </StatusIndicatorPrimitive.Root>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/ui/feedback/status-indicator.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/ui/feedback/volume-indicator.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { VolumeIndicator as VolumeIndicatorPrimitive } from '@videojs/react';\nimport {\n  VolumeHighIcon as VolumeHighIconPrimitive,\n  VolumeLowIcon as VolumeLowIconPrimitive,\n  VolumeOffIcon as VolumeOffIconPrimitive,\n} from '@videojs/react/icons/minimal';\n\nimport { cn, resolveClassName } from '@/components/videojs/lib/resolve-class-name';\n\nexport type VolumeIndicatorProps = Omit<VolumeIndicatorPrimitive.RootProps, 'children'>;\n\nexport function VolumeIndicator({ className, ...props }: VolumeIndicatorProps = {}) {\n  return (\n    <VolumeIndicatorPrimitive.Root\n      className={(state) =>\n        cn(\n          'pointer-events-none absolute origin-top text-inherit',\n          'duration-media-fast ease-out',\n          'media-transitioning:opacity-0 media-transitioning:duration-media-indicator media-transitioning:ease-in',\n          'inset-x-0 top-0 flex justify-center pt-3 pb-32 bg-(image:--media-indicator-gradient) text-shadow-media',\n          'pointer-fine:motion-media-[translate,filter,opacity] pointer-coarse:motion-media-[translate,opacity]',\n          'pointer-fine:media-transitioning:blur-media-hidden',\n          'data-ending-style:translate-y-media-hidden-indicator-offset',\n          'group/volume-status',\n          resolveClassName(className, state)\n        )\n      }\n      {...props}\n    >\n      <VolumeIndicatorPrimitive.Fill\n        className={cn(\n          'items-center justify-between gap-2 px-2.5 py-1',\n          'media-opaque:rounded-media-control media-opaque:bg-media-background',\n          'rounded-[inherit]',\n          'grid w-[min(80%,14rem)] grid-cols-[auto_minmax(0,1fr)_auto] [transform:translateX(0)]',\n          'before:col-start-2 before:row-start-1 before:h-0.75 before:w-full before:rounded-media-pill',\n          'before:bg-current/20 before:shadow-[0_1px_0_var(--media-shadow-subtle-current-color)]',\n          'after:col-start-2 after:row-start-1 after:h-0.75 after:w-[var(--media-volume-fill,0%)] after:justify-self-start',\n          'after:rounded-media-pill after:bg-media-primary',\n          'after:transition-[width] after:duration-media-slow after:ease-linear',\n          'motion-safe:group-[:is([data-min],[data-max]):not([data-starting-style],[data-ending-style])]/volume-status:nudge-media'\n        )}\n      >\n        <VolumeHighIconPrimitive\n          className={\n            'hidden shrink-0 group-data-[level=high]/volume-status:block col-start-1 row-start-1 drop-shadow-media-icon'\n          }\n        />\n        <VolumeLowIconPrimitive\n          className={\n            'hidden shrink-0 group-data-[level=low]/volume-status:block col-start-1 row-start-1 drop-shadow-media-icon'\n          }\n        />\n        <VolumeOffIconPrimitive\n          className={\n            'hidden shrink-0 group-data-[level=off]/volume-status:block col-start-1 row-start-1 drop-shadow-media-icon'\n          }\n        />\n        <VolumeIndicatorPrimitive.Value className={'col-start-3 row-start-1'} />\n      </VolumeIndicatorPrimitive.Fill>\n    </VolumeIndicatorPrimitive.Root>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/ui/feedback/volume-indicator.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/ui/menus/audio-track-menu.tsx",
      "content": "/** @jsxImportSource react */\nimport { audioText } from '@videojs/core/i18n/text/menu';\nimport { Menu } from '@videojs/react';\nimport { Text as TextPrimitive } from '@videojs/react';\nimport { SpeechIcon as SpeechIconPrimitive } from '@videojs/react/icons/minimal';\nimport { AudioTrackRadioGroup } from '@videojs/react/ui/audio-track-radio-group';\n\nimport { MenuChevron } from './menu-chevron';\nimport { RadioItem } from './radio-item';\n\nexport type AudioTrackMenuProps = Omit<Menu.RootProps, 'children'>;\n\nexport function AudioTrackMenu({ ...props }: AudioTrackMenuProps = {}) {\n  return (\n    <Menu.Root {...props}>\n      <AudioTrackRadioGroup.Root>\n        <Menu.Trigger\n          className={\n            'group/menu-trigger-item relative flex cursor-pointer select-none items-center gap-1.5 rounded-media-menu-item px-2 py-1.5 text-start whitespace-nowrap focus-ring-media media-highlighted:highlight-media focus-visible:outline-media-ring focus-visible:outline-offset-2 text-shadow-media transition-[background-color,color] duration-media-fast ease-in-out media-anchored:duration-media-instant media-anchored:media-highlighted:duration-media-slow justify-between tabular-nums text-inherit data-[availability=unavailable]:hidden data-[availability=unsupported]:hidden aria-disabled:pointer-events-none aria-disabled:cursor-not-allowed aria-disabled:opacity-50 media-anchored:data-highlighted:[anchor-name:--media-menu-item-highlight-anchor] media-anchored:media-highlighted:bg-transparent'\n          }\n        >\n          <SpeechIconPrimitive\n            className={\n              'shrink-0 drop-shadow-media-icon text-media-muted-foreground size-media-icon group-media-highlighted/menu-trigger-item:text-inherit'\n            }\n          />\n          <TextPrimitive token={audioText.key}>{audioText.text}</TextPrimitive>\n          <span className={'ms-auto inline-flex min-w-0 items-center gap-1 ps-2 text-current/65'}>\n            <AudioTrackRadioGroup.Value className={'max-w-24 truncate'} />\n            <MenuChevron />\n          </span>\n        </Menu.Trigger>\n        <Menu.Content\n          className={\n            '[anchor-scope:--media-menu-item-highlight-anchor] media-anchored:before:anchor-media-highlight media-anchored:has-data-[highlighted=]:before:duration-0 absolute max-h-[inherit] overflow-auto overscroll-none outline-hidden not-data-submenu:flex not-data-submenu:flex-col not-data-submenu:gap-0.5 transition-[translate,filter] duration-media-menu ease-out not-data-submenu:inset-x-1 not-data-submenu:top-1 not-data-submenu:data-[child-open]:-translate-x-full not-data-submenu:data-[child-open]:[&:dir(rtl)]:translate-x-full not-data-submenu:data-[child-open]:blur-media-hidden not-data-submenu:data-[child-open]:before:hidden data-submenu:inset-x-0 data-submenu:top-0 data-submenu:z-10 data-submenu:[max-height:inherit] data-submenu:p-1 data-submenu:media-transitioning:pointer-events-none data-submenu:media-transitioning:overflow-hidden data-submenu:media-transitioning:translate-x-full data-submenu:media-transitioning:[&:dir(rtl)]:-translate-x-full data-submenu:media-transitioning:blur-media-hidden'\n          }\n        >\n          <Menu.Item\n            className={\n              'group/menu-back-item relative flex cursor-pointer select-none items-center gap-1.5 rounded-media-menu-item px-2 py-1.5 text-start whitespace-nowrap focus-ring-media media-highlighted:highlight-media focus-visible:outline-media-ring focus-visible:outline-offset-2 text-shadow-media transition-[background-color,color] duration-media-fast ease-in-out media-anchored:duration-media-instant media-anchored:media-highlighted:duration-media-slow mb-0.5 w-full'\n            }\n          >\n            <MenuChevron back />\n            <TextPrimitive token={audioText.key}>{audioText.text}</TextPrimitive>\n          </Menu.Item>\n          <Menu.Separator\n            className={'my-1 block border-b border-media-border media-opaque:border-media-foreground/25'}\n          />\n          <AudioTrackRadioGroup.Options\n            className={\n              'flex [max-height:inherit] flex-col gap-0.5 [anchor-scope:--media-menu-item-highlight-anchor] media-anchored:before:anchor-media-highlight media-anchored:has-data-[highlighted=]:before:duration-0'\n            }\n            renderItem={(props, item) => (\n              <RadioItem {...props}>\n                <span>{item.label}</span>\n              </RadioItem>\n            )}\n          ></AudioTrackRadioGroup.Options>\n        </Menu.Content>\n      </AudioTrackRadioGroup.Root>\n    </Menu.Root>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/ui/menus/audio-track-menu.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/ui/menus/captions-submenu.tsx",
      "content": "/** @jsxImportSource react */\nimport { captionsText } from '@videojs/core/i18n/text/menu';\nimport { Menu } from '@videojs/react';\nimport { Text as TextPrimitive } from '@videojs/react';\nimport { CaptionsOffIcon as CaptionsOffIconPrimitive } from '@videojs/react/icons/minimal';\nimport { CaptionsRadioGroup } from '@videojs/react/ui/captions-radio-group';\n\nimport { MenuChevron } from './menu-chevron';\nimport { RadioItem } from './radio-item';\n\nexport type CaptionsSubmenuProps = Omit<Menu.RootProps, 'children'>;\n\nexport function CaptionsSubmenu({ ...props }: CaptionsSubmenuProps = {}) {\n  return (\n    <Menu.Root {...props}>\n      <CaptionsRadioGroup.Root>\n        <Menu.Trigger\n          className={\n            'group/menu-trigger-item relative flex cursor-pointer select-none items-center gap-1.5 rounded-media-menu-item px-2 py-1.5 text-start whitespace-nowrap focus-ring-media media-highlighted:highlight-media focus-visible:outline-media-ring focus-visible:outline-offset-2 text-shadow-media transition-[background-color,color] duration-media-fast ease-in-out media-anchored:duration-media-instant media-anchored:media-highlighted:duration-media-slow justify-between tabular-nums text-inherit data-[availability=unavailable]:hidden data-[availability=unsupported]:hidden aria-disabled:pointer-events-none aria-disabled:cursor-not-allowed aria-disabled:opacity-50 media-anchored:data-highlighted:[anchor-name:--media-menu-item-highlight-anchor] media-anchored:media-highlighted:bg-transparent'\n          }\n        >\n          <CaptionsOffIconPrimitive\n            className={\n              'shrink-0 drop-shadow-media-icon text-media-muted-foreground size-media-icon group-media-highlighted/menu-trigger-item:text-inherit'\n            }\n          />\n          <TextPrimitive token={captionsText.key}>{captionsText.text}</TextPrimitive>\n          <span className={'ms-auto inline-flex min-w-0 items-center gap-1 ps-2 text-current/65'}>\n            <CaptionsRadioGroup.Value className={'max-w-24 truncate'} />\n            <MenuChevron />\n          </span>\n        </Menu.Trigger>\n        <Menu.Content\n          className={\n            '[anchor-scope:--media-menu-item-highlight-anchor] media-anchored:before:anchor-media-highlight media-anchored:has-data-[highlighted=]:before:duration-0 absolute max-h-[inherit] overflow-auto overscroll-none outline-hidden not-data-submenu:flex not-data-submenu:flex-col not-data-submenu:gap-0.5 transition-[translate,filter] duration-media-menu ease-out not-data-submenu:inset-x-1 not-data-submenu:top-1 not-data-submenu:data-[child-open]:-translate-x-full not-data-submenu:data-[child-open]:[&:dir(rtl)]:translate-x-full not-data-submenu:data-[child-open]:blur-media-hidden not-data-submenu:data-[child-open]:before:hidden data-submenu:inset-x-0 data-submenu:top-0 data-submenu:z-10 data-submenu:[max-height:inherit] data-submenu:p-1 data-submenu:media-transitioning:pointer-events-none data-submenu:media-transitioning:overflow-hidden data-submenu:media-transitioning:translate-x-full data-submenu:media-transitioning:[&:dir(rtl)]:-translate-x-full data-submenu:media-transitioning:blur-media-hidden'\n          }\n        >\n          <Menu.Item\n            className={\n              'group/menu-back-item relative flex cursor-pointer select-none items-center gap-1.5 rounded-media-menu-item px-2 py-1.5 text-start whitespace-nowrap focus-ring-media media-highlighted:highlight-media focus-visible:outline-media-ring focus-visible:outline-offset-2 text-shadow-media transition-[background-color,color] duration-media-fast ease-in-out media-anchored:duration-media-instant media-anchored:media-highlighted:duration-media-slow mb-0.5 w-full'\n            }\n          >\n            <MenuChevron back />\n            <TextPrimitive token={captionsText.key}>{captionsText.text}</TextPrimitive>\n          </Menu.Item>\n          <Menu.Separator\n            className={'my-1 block border-b border-media-border media-opaque:border-media-foreground/25'}\n          />\n          <CaptionsRadioGroup.Options\n            className={\n              'flex [max-height:inherit] flex-col gap-0.5 [anchor-scope:--media-menu-item-highlight-anchor] media-anchored:before:anchor-media-highlight media-anchored:has-data-[highlighted=]:before:duration-0'\n            }\n            renderItem={(props, item) => (\n              <RadioItem {...props}>\n                <span>{item.label}</span>\n              </RadioItem>\n            )}\n          ></CaptionsRadioGroup.Options>\n        </Menu.Content>\n      </CaptionsRadioGroup.Root>\n    </Menu.Root>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/ui/menus/captions-submenu.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/ui/menus/menu-chevron.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { ChevronIcon as ChevronIconPrimitive } from '@videojs/react/icons/minimal';\nimport type { ClassValue } from 'cn';\n\nimport { cn } from '@/components/videojs/lib/resolve-class-name';\n\nexport interface MenuChevronProps {\n  back?: boolean;\n  className?: ClassValue;\n}\n\nexport function MenuChevron({ back = false, className }: MenuChevronProps = {}) {\n  return (\n    <ChevronIconPrimitive\n      className={cn(\n        back\n          ? 'shrink-0 drop-shadow-media-icon text-media-muted-foreground size-media-icon-sm rotate-180 [&:dir(rtl)]:rotate-0 [&:dir(rtl)]:[scale:1_1] group-media-highlighted/menu-back-item:text-inherit'\n          : 'shrink-0 drop-shadow-media-icon text-media-muted-foreground size-media-icon-sm [&:dir(rtl)]:[scale:-1_1] group-media-highlighted/menu-trigger-item:text-inherit',\n        className\n      )}\n    />\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/ui/menus/menu-chevron.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/ui/menus/playback-rate-submenu.tsx",
      "content": "/** @jsxImportSource react */\nimport { speedText } from '@videojs/core/i18n/text/menu';\nimport { Menu } from '@videojs/react';\nimport { Text as TextPrimitive } from '@videojs/react';\nimport { SpeedIcon as SpeedIconPrimitive } from '@videojs/react/icons/minimal';\nimport { PlaybackRateRadioGroup } from '@videojs/react/ui/playback-rate-radio-group';\n\nimport { MenuChevron } from './menu-chevron';\nimport { RadioItem } from './radio-item';\n\nexport type PlaybackRateSubmenuProps = Omit<Menu.RootProps, 'children'>;\n\nexport function PlaybackRateSubmenu({ ...props }: PlaybackRateSubmenuProps = {}) {\n  return (\n    <Menu.Root {...props}>\n      <PlaybackRateRadioGroup.Root>\n        <Menu.Trigger\n          className={\n            'group/menu-trigger-item relative flex cursor-pointer select-none items-center gap-1.5 rounded-media-menu-item px-2 py-1.5 text-start whitespace-nowrap focus-ring-media media-highlighted:highlight-media focus-visible:outline-media-ring focus-visible:outline-offset-2 text-shadow-media transition-[background-color,color] duration-media-fast ease-in-out media-anchored:duration-media-instant media-anchored:media-highlighted:duration-media-slow justify-between tabular-nums text-inherit data-[availability=unavailable]:hidden data-[availability=unsupported]:hidden aria-disabled:pointer-events-none aria-disabled:cursor-not-allowed aria-disabled:opacity-50 media-anchored:data-highlighted:[anchor-name:--media-menu-item-highlight-anchor] media-anchored:media-highlighted:bg-transparent'\n          }\n        >\n          <SpeedIconPrimitive\n            className={\n              'shrink-0 drop-shadow-media-icon text-media-muted-foreground size-media-icon group-media-highlighted/menu-trigger-item:text-inherit'\n            }\n          />\n          <TextPrimitive token={speedText.key}>{speedText.text}</TextPrimitive>\n          <span className={'ms-auto inline-flex min-w-0 items-center gap-1 ps-2 text-current/65'}>\n            <PlaybackRateRadioGroup.Value className={'max-w-24 truncate'} />\n            <MenuChevron />\n          </span>\n        </Menu.Trigger>\n        <Menu.Content\n          className={\n            '[anchor-scope:--media-menu-item-highlight-anchor] media-anchored:before:anchor-media-highlight media-anchored:has-data-[highlighted=]:before:duration-0 absolute max-h-[inherit] overflow-auto overscroll-none outline-hidden not-data-submenu:flex not-data-submenu:flex-col not-data-submenu:gap-0.5 transition-[translate,filter] duration-media-menu ease-out not-data-submenu:inset-x-1 not-data-submenu:top-1 not-data-submenu:data-[child-open]:-translate-x-full not-data-submenu:data-[child-open]:[&:dir(rtl)]:translate-x-full not-data-submenu:data-[child-open]:blur-media-hidden not-data-submenu:data-[child-open]:before:hidden data-submenu:inset-x-0 data-submenu:top-0 data-submenu:z-10 data-submenu:[max-height:inherit] data-submenu:p-1 data-submenu:media-transitioning:pointer-events-none data-submenu:media-transitioning:overflow-hidden data-submenu:media-transitioning:translate-x-full data-submenu:media-transitioning:[&:dir(rtl)]:-translate-x-full data-submenu:media-transitioning:blur-media-hidden'\n          }\n        >\n          <Menu.Item\n            className={\n              'group/menu-back-item relative flex cursor-pointer select-none items-center gap-1.5 rounded-media-menu-item px-2 py-1.5 text-start whitespace-nowrap focus-ring-media media-highlighted:highlight-media focus-visible:outline-media-ring focus-visible:outline-offset-2 text-shadow-media transition-[background-color,color] duration-media-fast ease-in-out media-anchored:duration-media-instant media-anchored:media-highlighted:duration-media-slow mb-0.5 w-full'\n            }\n          >\n            <MenuChevron back />\n            <TextPrimitive token={speedText.key}>{speedText.text}</TextPrimitive>\n          </Menu.Item>\n          <Menu.Separator\n            className={'my-1 block border-b border-media-border media-opaque:border-media-foreground/25'}\n          />\n          <PlaybackRateRadioGroup.Options\n            className={\n              'flex [max-height:inherit] flex-col gap-0.5 [anchor-scope:--media-menu-item-highlight-anchor] media-anchored:before:anchor-media-highlight media-anchored:has-data-[highlighted=]:before:duration-0'\n            }\n            renderItem={(props, item) => (\n              <RadioItem {...props}>\n                <span>{item.label}</span>\n              </RadioItem>\n            )}\n          ></PlaybackRateRadioGroup.Options>\n        </Menu.Content>\n      </PlaybackRateRadioGroup.Root>\n    </Menu.Root>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/ui/menus/playback-rate-submenu.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/ui/menus/quality-menu.tsx",
      "content": "/** @jsxImportSource react */\nimport { qualityText } from '@videojs/core/i18n/text/menu';\nimport { Menu } from '@videojs/react';\nimport { Text as TextPrimitive } from '@videojs/react';\nimport { SwitchesIcon as SwitchesIconPrimitive } from '@videojs/react/icons/minimal';\nimport { QualityRadioGroup } from '@videojs/react/ui/quality-radio-group';\n\nimport { MenuChevron } from './menu-chevron';\nimport { RadioItem } from './radio-item';\n\nexport type QualityMenuProps = Omit<Menu.RootProps, 'children'>;\n\nexport function QualityMenu({ ...props }: QualityMenuProps = {}) {\n  return (\n    <Menu.Root {...props}>\n      <QualityRadioGroup.Root>\n        <Menu.Trigger\n          className={\n            'group/menu-trigger-item relative flex cursor-pointer select-none items-center gap-1.5 rounded-media-menu-item px-2 py-1.5 text-start whitespace-nowrap focus-ring-media media-highlighted:highlight-media focus-visible:outline-media-ring focus-visible:outline-offset-2 text-shadow-media transition-[background-color,color] duration-media-fast ease-in-out media-anchored:duration-media-instant media-anchored:media-highlighted:duration-media-slow justify-between tabular-nums text-inherit data-[availability=unavailable]:hidden data-[availability=unsupported]:hidden aria-disabled:pointer-events-none aria-disabled:cursor-not-allowed aria-disabled:opacity-50 media-anchored:data-highlighted:[anchor-name:--media-menu-item-highlight-anchor] media-anchored:media-highlighted:bg-transparent'\n          }\n        >\n          <SwitchesIconPrimitive\n            className={\n              'shrink-0 drop-shadow-media-icon text-media-muted-foreground size-media-icon group-media-highlighted/menu-trigger-item:text-inherit'\n            }\n          />\n          <TextPrimitive token={qualityText.key}>{qualityText.text}</TextPrimitive>\n          <span className={'ms-auto inline-flex min-w-0 items-center gap-1 ps-2 text-current/65'}>\n            <QualityRadioGroup.Value className={'max-w-24 truncate'} />\n            <MenuChevron />\n          </span>\n        </Menu.Trigger>\n        <Menu.Content\n          className={\n            '[anchor-scope:--media-menu-item-highlight-anchor] media-anchored:before:anchor-media-highlight media-anchored:has-data-[highlighted=]:before:duration-0 absolute max-h-[inherit] overflow-auto overscroll-none outline-hidden not-data-submenu:flex not-data-submenu:flex-col not-data-submenu:gap-0.5 transition-[translate,filter] duration-media-menu ease-out not-data-submenu:inset-x-1 not-data-submenu:top-1 not-data-submenu:data-[child-open]:-translate-x-full not-data-submenu:data-[child-open]:[&:dir(rtl)]:translate-x-full not-data-submenu:data-[child-open]:blur-media-hidden not-data-submenu:data-[child-open]:before:hidden data-submenu:inset-x-0 data-submenu:top-0 data-submenu:z-10 data-submenu:[max-height:inherit] data-submenu:p-1 data-submenu:media-transitioning:pointer-events-none data-submenu:media-transitioning:overflow-hidden data-submenu:media-transitioning:translate-x-full data-submenu:media-transitioning:[&:dir(rtl)]:-translate-x-full data-submenu:media-transitioning:blur-media-hidden'\n          }\n        >\n          <Menu.Item\n            className={\n              'group/menu-back-item relative flex cursor-pointer select-none items-center gap-1.5 rounded-media-menu-item px-2 py-1.5 text-start whitespace-nowrap focus-ring-media media-highlighted:highlight-media focus-visible:outline-media-ring focus-visible:outline-offset-2 text-shadow-media transition-[background-color,color] duration-media-fast ease-in-out media-anchored:duration-media-instant media-anchored:media-highlighted:duration-media-slow mb-0.5 w-full'\n            }\n          >\n            <MenuChevron back />\n            <TextPrimitive token={qualityText.key}>{qualityText.text}</TextPrimitive>\n          </Menu.Item>\n          <Menu.Separator\n            className={'my-1 block border-b border-media-border media-opaque:border-media-foreground/25'}\n          />\n          <QualityRadioGroup.Options\n            className={\n              'flex [max-height:inherit] flex-col gap-0.5 [anchor-scope:--media-menu-item-highlight-anchor] media-anchored:before:anchor-media-highlight media-anchored:has-data-[highlighted=]:before:duration-0'\n            }\n            renderItem={(props, item) => (\n              <RadioItem {...props}>\n                <span>\n                  <span>{item.label}</span>\n                  {item.tier ? (\n                    <sup className={'ps-0.5 pt-px text-media-xs font-semibold leading-none text-current/70'}>\n                      {item.tier}\n                    </sup>\n                  ) : null}\n                </span>\n                {item.badge ? (\n                  <span className={'rounded-media-control bg-media-accent px-1.5 text-media-xs font-semibold'}>\n                    {item.badge}\n                  </span>\n                ) : null}\n              </RadioItem>\n            )}\n          ></QualityRadioGroup.Options>\n        </Menu.Content>\n      </QualityRadioGroup.Root>\n    </Menu.Root>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/ui/menus/quality-menu.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/ui/menus/radio-item.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { Menu } from '@videojs/react';\nimport { CheckIcon as CheckIconPrimitive } from '@videojs/react/icons/minimal';\n\nimport { cn, resolveClassName } from '@/components/videojs/lib/resolve-class-name';\n\nexport type RadioItemProps = Menu.RadioItemProps;\n\nexport function RadioItem({ children, className, ...props }: RadioItemProps) {\n  return (\n    <Menu.RadioItem\n      className={(state) =>\n        cn(\n          'group/menu-radio-item',\n          'relative flex cursor-pointer select-none items-center gap-1.5 rounded-media-menu-item px-2 py-1.5 text-start whitespace-nowrap',\n          'focus-ring-media',\n          'media-highlighted:highlight-media',\n          'focus-visible:outline-media-ring focus-visible:outline-offset-2',\n          'text-shadow-media',\n          'transition-[background-color,color] duration-media-fast ease-in-out',\n          'media-anchored:duration-media-instant media-anchored:media-highlighted:duration-media-slow',\n          'justify-between tabular-nums text-inherit',\n          'data-[availability=unavailable]:hidden data-[availability=unsupported]:hidden',\n          'aria-disabled:pointer-events-none aria-disabled:cursor-not-allowed aria-disabled:opacity-50',\n          'media-anchored:data-highlighted:[anchor-name:--media-menu-item-highlight-anchor]',\n          'media-anchored:media-highlighted:bg-transparent',\n          resolveClassName(className, state)\n        )\n      }\n      {...props}\n    >\n      {children}\n      <Menu.ItemIndicator\n        forceMount\n        className={'ms-auto -me-1 shrink-0 opacity-0 group-aria-checked/menu-radio-item:opacity-100'}\n      >\n        <CheckIconPrimitive\n          className={\n            'shrink-0 drop-shadow-media-icon text-media-muted-foreground size-media-icon group-media-highlighted/menu-radio-item:text-inherit'\n          }\n        />\n      </Menu.ItemIndicator>\n    </Menu.RadioItem>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/ui/menus/radio-item.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/ui/menus/settings-menu.tsx",
      "content": "/** @jsxImportSource react */\n\nimport { settingsText } from '@videojs/core/i18n/text/menu';\nimport { Menu } from '@videojs/react';\nimport { Text as TextPrimitive } from '@videojs/react';\nimport { GearIcon as GearIconPrimitive } from '@videojs/react/icons/minimal';\nimport type { ClassValue } from 'cn';\n\nimport { cn, resolveClassName } from '@/components/videojs/lib/resolve-class-name';\n\nimport { Button } from '../buttons/button';\nimport { ButtonTooltip } from '../buttons/button-tooltip';\n\nexport interface SettingsMenuProps extends Menu.RootProps {\n  className?: ClassValue;\n}\n\nexport function SettingsMenu({ children, className, ...props }: SettingsMenuProps) {\n  return (\n    <Menu.Root side=\"top\" align=\"center\" {...props}>\n      <ButtonTooltip label={<TextPrimitive token={settingsText.key}>{settingsText.text}</TextPrimitive>} side=\"top\">\n        <Menu.Trigger\n          render={<Button />}\n          className={(state) => cn('group/settings', resolveClassName(className, state))}\n        >\n          <GearIconPrimitive\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              'transition-transform duration-media-base ease-in-out motion-reduce:transition-none!',\n              'group-aria-expanded/settings:rotate-90'\n            )}\n          />\n          <TextPrimitive className={'sr-only'} token={settingsText.key}>\n            {settingsText.text}\n          </TextPrimitive>\n        </Menu.Trigger>\n      </ButtonTooltip>\n      <Menu.Popup\n        keepMounted\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          'bg-media-popover text-media-popover-foreground surface-media after:surface-media-inset',\n          'after:hidden',\n          'm-0 min-w-44 max-w-(--media-menu-available-width) overflow-hidden! rounded-media-popup border-0 p-1 [--media-popup-side-offset:var(--media-popover-side-offset)]',\n          'max-h-[min(var(--media-menu-available-height,--spacing(56)),--spacing(56))] overscroll-none',\n          'h-(--media-menu-height) w-(--media-menu-width)',\n          'transition-media-popup media-transitioning:transition-media-popup',\n          'transition-media-menu-resize'\n        )}\n      >\n        <Menu.Content\n          className={\n            '[anchor-scope:--media-menu-item-highlight-anchor] media-anchored:before:anchor-media-highlight media-anchored:has-data-[highlighted=]:before:duration-0 absolute max-h-[inherit] overflow-auto overscroll-none outline-hidden not-data-submenu:flex not-data-submenu:flex-col not-data-submenu:gap-0.5 transition-[translate,filter] duration-media-menu ease-out not-data-submenu:inset-x-1 not-data-submenu:top-1 not-data-submenu:data-[child-open]:-translate-x-full not-data-submenu:data-[child-open]:[&:dir(rtl)]:translate-x-full not-data-submenu:data-[child-open]:blur-media-hidden not-data-submenu:data-[child-open]:before:hidden data-submenu:inset-x-0 data-submenu:top-0 data-submenu:z-10 data-submenu:[max-height:inherit] data-submenu:p-1 data-submenu:media-transitioning:pointer-events-none data-submenu:media-transitioning:overflow-hidden data-submenu:media-transitioning:translate-x-full data-submenu:media-transitioning:[&:dir(rtl)]:-translate-x-full data-submenu:media-transitioning:blur-media-hidden'\n          }\n        >\n          {children}\n        </Menu.Content>\n      </Menu.Popup>\n    </Menu.Root>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/ui/menus/settings-menu.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/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/video/minimal/ui/sliders/slider.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/minimal/ui/sliders/time-slider.tsx",
      "content": "/** @jsxImportSource react */\nimport type { SliderPreviewOverflow } from '@videojs/core';\nimport { TimeSlider as TimeSliderPrimitive } from '@videojs/react';\nimport { Slider } from '@videojs/react';\nimport { SpinnerIcon as SpinnerIconPrimitive } from '@videojs/react/icons/minimal';\n\nimport { cn, resolveClassName } from '@/components/videojs/lib/resolve-class-name';\n\nimport { SliderBuffer, SliderFill, SliderThumb, SliderTrack } from './slider';\n\nexport interface TimeSliderProps extends Omit<TimeSliderPrimitive.RootProps, 'children'> {\n  previewOverflow?: SliderPreviewOverflow | undefined;\n}\n\nexport function TimeSlider({ className, previewOverflow = 'visible', ...props }: TimeSliderProps = {}) {\n  return (\n    <TimeSliderPrimitive.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-time-slider',\n          resolveClassName(className, state)\n        )\n      }\n      {...props}\n    >\n      <TimeSliderPrimitive.Chapters\n        className={'relative flex size-full min-h-0 min-w-0 flex-1 items-center rounded-[inherit]'}\n        renderChapter={(props) => (\n          <div\n            className={\n              'group/chapter absolute inset-0 flex min-h-0 min-w-0 items-center justify-center [--media-chapter-inset-start:0.5] [--media-chapter-inset-end:0.5] first:[--media-chapter-inset-start:0] last:[--media-chapter-inset-end:0] data-[orientation=horizontal]:clip-media-chapter-x data-[orientation=vertical]:clip-media-chapter-y'\n            }\n            {...props}\n          >\n            <TimeSliderPrimitive.Track\n              render={<SliderTrack />}\n              className={\n                'transition-[height,width] duration-media-slow ease-out data-[orientation=horizontal]:clip-media-chapter-track-x data-[orientation=vertical]:clip-media-chapter-track-y group-data-highlighted/chapter:data-[orientation=horizontal]:h-1.75 group-data-highlighted/chapter:data-[orientation=vertical]:w-1.75'\n              }\n            >\n              <TimeSliderPrimitive.Buffer render={<SliderBuffer />} />\n              <TimeSliderPrimitive.Fill render={<SliderFill />} />\n            </TimeSliderPrimitive.Track>\n          </div>\n        )}\n      ></TimeSliderPrimitive.Chapters>\n      <TimeSliderPrimitive.Thumb\n        render={<SliderThumb />}\n        className={\n          'opacity-0 data-interactive:opacity-100 focus-visible:opacity-100 pointer-fine:group-hover/slider:scale-100 pointer-fine:group-hover/slider:opacity-100 scale-70 data-interactive:scale-100'\n        }\n      />\n      <TimeSliderPrimitive.Preview\n        className={\n          'group/preview relative h-1 [--media-slider-preview-max-height:var(--media-slider-preview-max-width)] media-wide:[--media-slider-preview-max-width:min(--spacing(48),100cqi)] before:pointer-events-none before:absolute before:z-1 before:-translate-1/2 before:scale-50 before:opacity-0 before:transition-[opacity,scale] before:duration-media-slow before:ease-out data-pointing:not-data-dragging:before:scale-100 data-pointing:not-data-dragging:before:opacity-100 min-w-full [--media-slider-preview-max-width:min(--spacing(28),100cqi)] media-compact:[--media-slider-preview-max-width:min(--spacing(36),100cqi)] [--media-preview-end-inset:calc(100cqi-100%)] [--media-preview-left:clamp(calc(var(--media-slider-preview-max-width)/2),var(--media-slider-pointer),calc(100%-var(--media-slider-preview-max-width)/2+var(--media-preview-end-inset)))] media-wide:[--media-preview-left:var(--media-slider-pointer)] before:bg-current/35 data-[orientation=horizontal]:before:top-1/2 data-[orientation=horizontal]:before:left-(--media-slider-pointer) data-[orientation=horizontal]:before:h-5 data-[orientation=horizontal]:before:w-px data-[orientation=vertical]:before:top-[calc(100%-var(--media-slider-pointer))] data-[orientation=vertical]:before:left-1/2 data-[orientation=vertical]:before:h-px data-[orientation=vertical]:before:w-5'\n        }\n        overflow={previewOverflow}\n      >\n        <div\n          className={cn(\n            'absolute max-w-(--media-slider-preview-max-width) -translate-x-1/2 translate-y-media-hidden-preview-offset scale-media-hidden-preview opacity-0',\n            'origin-bottom blur-media-hidden',\n            'transition-[filter,opacity,scale] duration-media-base ease-out',\n            'group-data-pointing/preview:scale-100 group-data-pointing/preview:opacity-100 group-data-pointing/preview:filter-none',\n            'group-has-focus-visible/slider:scale-100 group-has-focus-visible/slider:opacity-100 group-has-focus-visible/slider:filter-none',\n            'bg-media-popover text-media-popover-foreground surface-media after:surface-media-inset',\n            'after:hidden',\n            'group/thumbnail pointer-events-none overflow-hidden rounded-media-popup bg-media-backdrop/90',\n            'bottom-[calc(100%+var(--media-slider-preview-offset))]',\n            'has-[[data-loading]]:aspect-video has-[[data-loading]]:w-(--media-slider-preview-max-width)',\n            '[left:var(--media-preview-left,var(--media-slider-pointer))]'\n          )}\n        >\n          <Slider.Thumbnail\n            className={\n              'relative block max-h-(--media-slider-preview-max-height) max-w-(--media-slider-preview-max-width) overflow-clip rounded-[inherit] transition-opacity duration-media-base ease-out data-loading:opacity-0'\n            }\n          />\n          <SpinnerIconPrimitive\n            className={\n              'absolute top-1/2 left-1/2 size-media-icon -translate-x-1/2 -translate-y-1/2 opacity-0 transition-opacity duration-media-base ease-out group-not-has-[[role=img][data-loading]]/thumbnail:[--media-spinner-animation:none] group-has-[[role=img][data-loading]]/thumbnail:opacity-100 drop-shadow-media-icon'\n            }\n          />\n        </div>\n        <div\n          className={cn(\n            'absolute max-w-(--media-slider-preview-max-width) -translate-x-1/2 translate-y-media-hidden-preview-offset scale-media-hidden-preview opacity-0',\n            'origin-bottom blur-media-hidden',\n            'transition-[filter,opacity,scale] duration-media-base ease-out',\n            'group-data-pointing/preview:scale-100 group-data-pointing/preview:opacity-100 group-data-pointing/preview:filter-none',\n            'group-has-focus-visible/slider:scale-100 group-has-focus-visible/slider:opacity-100 group-has-focus-visible/slider:filter-none',\n            'flex bottom-[calc(100%+var(--media-slider-preview-label-offset))] tabular-nums',\n            '[left:var(--media-preview-left,var(--media-slider-pointer))] flex-row-reverse justify-center gap-2'\n          )}\n        >\n          <TimeSliderPrimitive.ChapterTitle\n            className={'max-w-(--media-slider-preview-max-width) min-w-0 truncate empty:hidden'}\n          />\n          <TimeSliderPrimitive.Value className={'tabular-nums'} type=\"pointer\" />\n        </div>\n      </TimeSliderPrimitive.Preview>\n    </TimeSliderPrimitive.Root>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/skins/video/minimal/ui/sliders/time-slider.tsx"
    },
    {
      "path": "skins/files/video-minimal/skins/video/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/video/minimal/ui/sliders/volume-slider.tsx"
    }
  ],
  "meta": {
    "framework": "react",
    "style": "tailwind",
    "role": "skin",
    "styling": "tailwind",
    "preset": "video",
    "media": "video",
    "theme": "minimal",
    "public": true
  },
  "docs": "Requires `@videojs/react@10.0.0-beta.32`, which is installed with this item.\n\n```tsx\nimport { HlsJsVideo } from '@videojs/react/media/hlsjs-video';\nimport { VideoPlayer } from '@videojs/react/video';\n\nimport { MinimalVideoSkin } from '@/components/videojs/skins/video/minimal/skin';\n\nexport function Player({ src }: { src: string }) {\n  return (\n    <VideoPlayer>\n      <MinimalVideoSkin className=\"aspect-video w-full\">\n        <HlsJsVideo src={src} />\n      </MinimalVideoSkin>\n    </VideoPlayer>\n  );\n}\n```",
  "categories": [
    "media",
    "skins",
    "video"
  ],
  "type": "registry:block"
}