{
  "$schema": "https://ui.shadcn.com/schema/registry-item.json",
  "name": "status-indicator",
  "title": "Status Indicator",
  "description": "Visual feedback for captions, fullscreen, picture-in-picture, and playback actions.",
  "dependencies": [
    "@videojs/react@10.0.0-beta.32",
    "react"
  ],
  "registryDependencies": [
    "@videojs/_resolve-class-name",
    "@videojs/_style-theme"
  ],
  "files": [
    {
      "path": "ui/files/status-indicator/status-indicator.tsx",
      "content": "/** @jsxImportSource react */\n\nimport '../styles/theme.css';\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';\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',\n          'duration-media-fast ease-out',\n          'media-transitioning:opacity-0 media-transitioning:duration-media-indicator media-transitioning:ease-in',\n          'top-3 rounded-media-control font-medium',\n          'bg-media-backdrop/25 text-media-popover-foreground surface-media after:surface-media-inset',\n          'media-opaque:bg-media-background',\n          'pointer-coarse:motion-media-[scale,translate,opacity]',\n          'pointer-fine:motion-media-[scale,translate,filter,opacity]',\n          'pointer-fine:media-transitioning:scale-media-hidden-indicator 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 className={cn('items-center justify-between gap-2 px-2.5 py-1', 'flex', 'w-full')}>\n        <CaptionsOnIconPrimitive\n          className={'hidden shrink-0 group-data-[status=captions-on]/input-status:block mix-blend-difference'}\n        />\n        <CaptionsOffIconPrimitive\n          className={'hidden shrink-0 group-data-[status=captions-off]/input-status:block mix-blend-difference'}\n        />\n        <FullscreenEnterIconPrimitive\n          className={'hidden shrink-0 group-data-[status=fullscreen]/input-status:block mix-blend-difference'}\n        />\n        <FullscreenExitIconPrimitive\n          className={'hidden shrink-0 group-data-[status=exit-fullscreen]/input-status:block mix-blend-difference'}\n        />\n        <PipEnterIconPrimitive\n          className={'hidden shrink-0 group-data-[status=pip]/input-status:block mix-blend-difference'}\n        />\n        <PipExitIconPrimitive\n          className={'hidden shrink-0 group-data-[status=exit-pip]/input-status:block mix-blend-difference'}\n        />\n        <StatusIndicatorPrimitive.Value className={'ml-auto mix-blend-difference'} />\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          'rounded-media-pill bg-media-backdrop/35 backdrop-filter-media-indicator',\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-lg group-data-[status=play]/playback-status:translate-x-px'\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-lg'\n        }\n      />\n    </StatusIndicatorPrimitive.Root>\n  );\n}\n",
      "type": "registry:component",
      "target": "@components/videojs/ui/status-indicator.tsx"
    }
  ],
  "meta": {
    "framework": "react",
    "style": "tailwind",
    "role": "component",
    "styling": "tailwind",
    "public": true
  },
  "docs": "Installs `@/components/videojs/ui/status-indicator.tsx` for use inside a compatible Video.js Player or Skin.\n\n```tsx\nimport { StatusIndicator } from '@/components/videojs/ui/status-indicator';\n\nexport function Controls() {\n  return <StatusIndicator />;\n}\n```",
  "categories": [
    "media",
    "feedback"
  ],
  "type": "registry:ui"
}