{"version":3,"file":"video.mjs","sources":["../../../components/video/video.tsx"],"sourcesContent":["import { FullScreen } from '@/components/full-screen'\r\nimport { Icon } from '@/components/icon'\r\nimport { Progress } from '@/components/progress'\r\nimport { Renderer } from '@/components/renderer'\r\n\r\nimport {\r\n  Transition,\r\n  computed,\r\n  defineComponent,\r\n  nextTick,\r\n  onMounted,\r\n  provide,\r\n  reactive,\r\n  ref,\r\n  renderSlot,\r\n  shallowReadonly,\r\n  watch,\r\n} from 'vue'\r\n\r\nimport { emitEvent, useIcons, useLocale, useNameHelper, useProps } from '@vexip-ui/config'\r\nimport VideoControl from './video-control.vue'\r\nimport VideoProgress from './video-progress.vue'\r\nimport VideoTimer from './video-timer.vue'\r\nimport VideoVolume from './video-volume.vue'\r\nimport { createSlotRender, useListener, useModifier, useSetTimeout } from '@vexip-ui/hooks'\r\nimport { decide, decimalLength, isClient, noop, toCapitalCase, toNumber } from '@vexip-ui/utils'\r\nimport { videoProps } from './props'\r\nimport { VIDEO_STATE, videoDefaultControlLayout, videoDefaultShortcuts } from './symbol'\r\n\r\nimport type { FullScreenExposed, FullScreenType } from '@/components/full-screen'\r\nimport type { VideoControlConfig, VideoPlaybackRate } from './symbol'\r\n\r\nexport default defineComponent({\r\n  name: 'Video',\r\n  props: videoProps,\r\n  emits: ['update:src', 'update:time', 'update:volume', 'update:playback-rate'],\r\n  setup(_props, { slots, emit, expose }) {\r\n    const props = useProps('video', _props, {\r\n      src: {\r\n        static: true,\r\n        default: '',\r\n      },\r\n      srcList: {\r\n        static: true,\r\n        default: null,\r\n      },\r\n      noControls: false,\r\n      videoAttrs: null,\r\n      time: {\r\n        static: true,\r\n        default: 0,\r\n      },\r\n      volume: 1,\r\n      playbackRate: 1,\r\n      playbackRates: () => [0.5, 1, 1.25, 1.5, 2],\r\n      // kernel: null,\r\n      controlLayout: () => videoDefaultControlLayout,\r\n      poster: '',\r\n      video: {\r\n        static: true,\r\n        default: null,\r\n      },\r\n      segments: () => [],\r\n      loading: false,\r\n      loadingIcon: null,\r\n      loadingEffect: null,\r\n      shortcuts: () => ({}),\r\n      slots: () => ({}),\r\n    })\r\n\r\n    const nh = useNameHelper('video')\r\n    const locale = useLocale('video')\r\n    const icons = useIcons()\r\n\r\n    const { timer } = useSetTimeout()\r\n\r\n    const pipEnabled = isClient && document.pictureInPictureEnabled\r\n\r\n    const currentSrc = ref(\r\n      props.src || props.srcList?.[0] || (props.videoAttrs?.src as string) || '',\r\n    )\r\n    const playing = ref(false)\r\n    const currentTime = ref(props.time)\r\n    const canPlay = ref(false)\r\n    const duration = ref(0)\r\n    const currentVolume = ref(props.volume) // 0 ~ 1\r\n    const pip = ref(false)\r\n    const stateShow = ref(true)\r\n    // record the state is invisible (whether finish transition)\r\n    const stateHidden = ref(false)\r\n    const currentRate = ref(props.playbackRate)\r\n    // const loadedData = ref(false)\r\n    const interacting = ref(false)\r\n    const hasPlayed = ref(false)\r\n    const flipped = ref(false)\r\n    const iconScale = ref(1.3)\r\n\r\n    const screen = ref<FullScreenExposed>()\r\n    const wrapper = computed(() => screen.value?.wrapper as HTMLElement | undefined)\r\n    const video = ref<HTMLVideoElement>()\r\n    const volumeRef = ref<InstanceType<typeof VideoVolume>>()\r\n\r\n    const placeId = computed(() => screen.value?.placeId)\r\n    const full = computed<false | FullScreenType>(() => screen.value?.full ?? false)\r\n    const videoRef = computed<HTMLVideoElement | undefined>(() => video.value || props.video)\r\n\r\n    const shortcutRecord = reactive({} as Record<string, () => void>)\r\n    const shortcuts = computed(() => ({ ...videoDefaultShortcuts, ...props.shortcuts }))\r\n\r\n    function addShortcut(key: string, cb: () => void) {\r\n      if (shortcutRecord[key]) {\r\n        console.warn(`[vexip-ui:Video] duplicate shortcut key '${key}' and it will be ignored`)\r\n\r\n        return noop\r\n      }\r\n\r\n      shortcutRecord[key] = cb\r\n\r\n      return () => {\r\n        delete shortcutRecord[key]\r\n      }\r\n    }\r\n\r\n    useModifier({\r\n      target: wrapper,\r\n      passive: false,\r\n      onKeyDown: (event, modifier) => {\r\n        if (event.ctrlKey || event.shiftKey || event.altKey || event.metaKey) return\r\n\r\n        decide(\r\n          [\r\n            [\r\n              () => modifier.up,\r\n              () => {\r\n                currentVolume.value = Math.min(1, currentVolume.value + 0.05)\r\n              },\r\n            ],\r\n            [\r\n              () => modifier.down,\r\n              () => (currentVolume.value = Math.max(0, currentVolume.value - 0.05)),\r\n            ],\r\n            [\r\n              () => modifier.right,\r\n              () => (currentTime.value = Math.min(duration.value, currentTime.value + 5)),\r\n            ],\r\n            [() => modifier.left, () => (currentTime.value = Math.max(0, currentTime.value - 5))],\r\n            [() => modifier[shortcuts.value.volume || 'M'], () => volumeRef.value?.toggleMute()],\r\n            ...Object.keys(shortcutRecord).map(key => {\r\n              return [() => modifier[key], shortcutRecord[key]] as [() => boolean, () => void]\r\n            }),\r\n          ],\r\n          { afterMatchAny: modifier.resetAll },\r\n        )\r\n      },\r\n    })\r\n\r\n    const className = computed(() => {\r\n      return [\r\n        nh.b(),\r\n        nh.bs('vars'),\r\n        {\r\n          [nh.bm('loading')]: props.loading,\r\n        },\r\n      ]\r\n    })\r\n    const playIcon = computed(() => (playing.value ? icons.value.pause : icons.value.play))\r\n    const stateIcon = computed(() => {\r\n      return playing.value ? icons.value.pauseState : icons.value.playState\r\n    })\r\n    const rateOptions = computed(() => {\r\n      const rates = props.playbackRates\r\n        .map(raw => {\r\n          const rate = typeof raw === 'number' ? { value: raw } : raw\r\n\r\n          rate.value = toNumber(rate.value)\r\n          rate.label =\r\n            rate.label || `${decimalLength(rate.value) ? rate.value : rate.value.toFixed(1)}x`\r\n\r\n          return rate\r\n        })\r\n        .filter(rate => rate.value > 0)\r\n        .sort((prev, next) => next.value - prev.value)\r\n\r\n      if (!rates.find(rate => rate.value === 1)) {\r\n        const index = rates.findIndex(rate => rate.value < 1)\r\n\r\n        rates.splice((index + rates.length) % rates.length, 0, { value: 1, label: '1.0x' })\r\n      }\r\n\r\n      return rates\r\n    })\r\n    const segments = computed(() => {\r\n      return props.segments\r\n        .map(segment => (typeof segment === 'number' ? { time: segment } : segment))\r\n        .filter(segment => segment.time >= 0 && segment.time <= duration.value)\r\n        .sort((prev, next) => prev.time - next.time)\r\n    })\r\n    const percent = computed(() => {\r\n      return duration.value ? (currentTime.value / duration.value) * 100 : 0\r\n    })\r\n    const srcFullList = computed(() => {\r\n      const src = props.src || (props.videoAttrs?.src as string) || ''\r\n\r\n      if (src && props.srcList && !props.srcList.includes(src)) {\r\n        return [src].concat(props.srcList)\r\n      }\r\n\r\n      return props.srcList || [src]\r\n    })\r\n    const srcIndex = computed(() => {\r\n      return srcFullList.value ? srcFullList.value.indexOf(currentSrc.value) : -1\r\n    })\r\n\r\n    const slotParams = shallowReadonly(\r\n      reactive({\r\n        playing,\r\n        currentTime,\r\n        currentVolume,\r\n        currentRate,\r\n        interacting,\r\n        flipped,\r\n        canPlay,\r\n        duration,\r\n        pip,\r\n        hasPlayed,\r\n        togglePlaying,\r\n        togglePip,\r\n        changeRate,\r\n        changeTime,\r\n        changeVolume,\r\n        toggleFull,\r\n      }),\r\n    )\r\n\r\n    watch(\r\n      () => props.src,\r\n      value => {\r\n        resetMetaState()\r\n        currentSrc.value = value\r\n      },\r\n      { flush: 'pre' },\r\n    )\r\n    watch(\r\n      () => props.time,\r\n      value => {\r\n        changeTime(value, false)\r\n      },\r\n    )\r\n    watch(\r\n      () => props.volume,\r\n      value => {\r\n        changeVolume(value, false)\r\n      },\r\n    )\r\n    watch(\r\n      () => props.playbackRate,\r\n      value => {\r\n        changeRate(value, false)\r\n      },\r\n    )\r\n    watch(playing, value => {\r\n      if (value) {\r\n        requestAnimationFrame(() => {\r\n          stateShow.value = false\r\n        })\r\n      } else {\r\n        stateShow.value = true\r\n      }\r\n    })\r\n    watch(canPlay, value => {\r\n      if (!value) {\r\n        playing.value = false\r\n      }\r\n    })\r\n    watch(stateShow, value => {\r\n      if (value) {\r\n        stateHidden.value = false\r\n      }\r\n    })\r\n\r\n    onMounted(() => {\r\n      nextTick(() => {\r\n        if (isClient && !videoRef.value && screen.value?.wrapper) {\r\n          video.value = (screen.value.wrapper as HTMLElement).querySelector('video') ?? undefined\r\n        }\r\n\r\n        if (videoRef.value && currentTime.value > 0) {\r\n          videoRef.value.currentTime = currentTime.value\r\n        }\r\n      })\r\n    })\r\n\r\n    provide(VIDEO_STATE, reactive({ placeId, iconScale, addShortcut }))\r\n\r\n    useListener(videoRef, 'canplay', () => {\r\n      canPlay.value = true\r\n      duration.value = videoRef.value?.duration ?? 0\r\n    })\r\n    useListener(videoRef, 'timeupdate', () => {\r\n      currentTime.value = videoRef.value?.currentTime ?? 0\r\n\r\n      emit('update:time', currentTime.value)\r\n      emitEvent(props.onTimeChange, currentTime.value)\r\n    })\r\n    useListener(videoRef, 'ended', handleEnded)\r\n    // useListener(videoRef, 'loadeddata', () => {\r\n    //   loadedData.value = true\r\n    // })\r\n    useListener(videoRef, 'enterpictureinpicture', () => {\r\n      pip.value = true\r\n      emitEvent(props.onTogglePip, true)\r\n    })\r\n    useListener(videoRef, 'leavepictureinpicture', () => {\r\n      pip.value = false\r\n      emitEvent(props.onTogglePip, false)\r\n    })\r\n\r\n    expose({\r\n      currentSrc,\r\n      playing,\r\n      currentTime,\r\n      duration,\r\n      pip,\r\n      interacting,\r\n      stateHidden,\r\n      wrapper,\r\n      video,\r\n      resetMetaState,\r\n    })\r\n\r\n    function togglePlaying(value = !playing.value) {\r\n      if (!canPlay.value) {\r\n        playing.value = false\r\n\r\n        return\r\n      }\r\n\r\n      playing.value = value\r\n\r\n      if (playing.value) {\r\n        hasPlayed.value = true\r\n        videoRef.value?.play()\r\n      } else {\r\n        videoRef.value?.pause()\r\n      }\r\n\r\n      wrapper.value?.focus()\r\n      emitEvent(playing.value ? props.onPlay : props.onPause)\r\n    }\r\n\r\n    function handleEnded() {\r\n      playing.value = false\r\n\r\n      videoRef.value?.pause()\r\n      emitEvent(props.onEnded)\r\n    }\r\n\r\n    async function togglePip() {\r\n      if (!pipEnabled || !videoRef.value) return\r\n\r\n      if (pip.value) {\r\n        await document.exitPictureInPicture()\r\n      } else {\r\n        await videoRef.value.requestPictureInPicture()\r\n      }\r\n    }\r\n\r\n    function changeRate(rate: number, dispatch = true) {\r\n      currentRate.value = rate\r\n\r\n      if (videoRef.value) {\r\n        videoRef.value.playbackRate = rate\r\n      }\r\n\r\n      if (dispatch) {\r\n        emit('update:playback-rate', rate)\r\n        emitEvent(props.onRateChange, rate)\r\n      }\r\n    }\r\n\r\n    function changeTime(time: number, dispatch = true) {\r\n      currentTime.value = time\r\n\r\n      if (videoRef.value && time !== videoRef.value.currentTime) {\r\n        videoRef.value.currentTime = time\r\n        time = videoRef.value.currentTime\r\n      }\r\n\r\n      if (dispatch) {\r\n        emit('update:time', time)\r\n        emitEvent(props.onTimeChange, time)\r\n      }\r\n    }\r\n\r\n    function changeVolume(volume: number, dispatch = true) {\r\n      currentVolume.value = volume\r\n\r\n      if (videoRef.value) {\r\n        videoRef.value.volume = volume\r\n      }\r\n\r\n      if (dispatch) {\r\n        emit('update:volume', volume)\r\n        emitEvent(props.onVolumeChange, volume)\r\n      }\r\n    }\r\n\r\n    function toggleFlip(value = !flipped.value, dispatch = true) {\r\n      flipped.value = value\r\n\r\n      if (dispatch) {\r\n        emitEvent(props.onToggleFlip, flipped.value)\r\n      }\r\n    }\r\n\r\n    function onFullChange(full: false | FullScreenType) {\r\n      nextTick(() => {\r\n        wrapper.value?.focus()\r\n        emitEvent(props.onToggleFull, full)\r\n      })\r\n    }\r\n\r\n    function resetMetaState() {\r\n      playing.value = false\r\n      currentTime.value = 0\r\n      canPlay.value = false\r\n      duration.value = 0\r\n      // loadedData.value = false\r\n      pip.value = false\r\n      hasPlayed.value = false\r\n\r\n      videoRef.value?.pause()\r\n    }\r\n\r\n    function handleInteract() {\r\n      clearTimeout(timer.interact)\r\n\r\n      interacting.value = true\r\n      timer.interact = setTimeout(() => {\r\n        interacting.value = false\r\n      }, 3000)\r\n    }\r\n\r\n    function handlePointerLeave() {\r\n      clearTimeout(timer.interact)\r\n      timer.interact = setTimeout(() => {\r\n        interacting.value = false\r\n      }, 500)\r\n    }\r\n\r\n    function adjustSrc(amount: number) {\r\n      const list = srcFullList.value\r\n\r\n      if (props.srcList) {\r\n        currentSrc.value = list[(srcIndex.value + amount + list.length) % list.length]\r\n        emit('update:src', currentSrc.value)\r\n      }\r\n    }\r\n\r\n    function playPrev() {\r\n      adjustSrc(-1)\r\n      emitEvent(props.onPrev)\r\n    }\r\n\r\n    function playNext() {\r\n      adjustSrc(1)\r\n      emitEvent(props.onNext)\r\n    }\r\n\r\n    function toggleFull(type: FullScreenType) {\r\n      screen.value?.toggle(type)\r\n    }\r\n\r\n    function handleRefresh() {\r\n      emitEvent(props.onRefresh)\r\n    }\r\n\r\n    function renderPlayPrev() {\r\n      return (\r\n        <VideoControl\r\n          class={nh.be('play-prev')}\r\n          label={locale.value.playPrev}\r\n          shortcut={shortcuts.value['play-prev']}\r\n          disabled={!!props.srcList && !srcIndex.value}\r\n          onClick={playPrev}\r\n        >\r\n          <Icon\r\n            {...icons.value.playPrev}\r\n            scale={+(icons.value.playPrev.scale || 1) * iconScale.value}\r\n          ></Icon>\r\n        </VideoControl>\r\n      )\r\n    }\r\n\r\n    function renderPlay() {\r\n      return (\r\n        <VideoControl\r\n          class={nh.be('play')}\r\n          label={playing.value ? locale.value.pause : locale.value.play}\r\n          shortcut={shortcuts.value.play}\r\n          disabled={!canPlay.value}\r\n          onClick={togglePlaying}\r\n        >\r\n          <Icon\r\n            {...playIcon.value}\r\n            scale={+(playIcon.value.scale || 1) * iconScale.value * 1.16}\r\n          ></Icon>\r\n        </VideoControl>\r\n      )\r\n    }\r\n\r\n    function renderPlayNext() {\r\n      return (\r\n        <VideoControl\r\n          class={nh.be('play-next')}\r\n          label={locale.value.playNext}\r\n          shortcut={shortcuts.value['play-next']}\r\n          disabled={!!props.srcList && srcIndex.value === srcFullList.value.length - 1}\r\n          onClick={playNext}\r\n        >\r\n          <Icon\r\n            {...icons.value.playNext}\r\n            scale={+(icons.value.playNext.scale || 1) * iconScale.value}\r\n          ></Icon>\r\n        </VideoControl>\r\n      )\r\n    }\r\n\r\n    function renderRefresh() {\r\n      return (\r\n        <VideoControl\r\n          class={nh.be('play-refresh')}\r\n          label={locale.value.refresh}\r\n          shortcut={shortcuts.value.refresh}\r\n          onClick={handleRefresh}\r\n        >\r\n          <Icon\r\n            {...icons.value.refresh}\r\n            scale={+(icons.value.refresh.scale || 1) * iconScale.value}\r\n          ></Icon>\r\n        </VideoControl>\r\n      )\r\n    }\r\n\r\n    function renderTimer() {\r\n      return (\r\n        <VideoTimer\r\n          time={currentTime.value}\r\n          duration={duration.value}\r\n          disabled={!canPlay.value}\r\n          onChange={changeTime}\r\n        ></VideoTimer>\r\n      )\r\n    }\r\n\r\n    function renderPlaybackRate() {\r\n      return (\r\n        <VideoControl\r\n          class={nh.be('playback-rate')}\r\n          type={'select'}\r\n          value={currentRate.value}\r\n          options={rateOptions.value}\r\n          onSelect={(rate: VideoPlaybackRate) => changeRate(rate.value)}\r\n        ></VideoControl>\r\n      )\r\n    }\r\n\r\n    function renderVolume() {\r\n      return (\r\n        <VideoVolume\r\n          ref={volumeRef}\r\n          volume={currentVolume.value}\r\n          onChange={changeVolume}\r\n        ></VideoVolume>\r\n      )\r\n    }\r\n\r\n    function renderFlip() {\r\n      return (\r\n        <VideoControl\r\n          class={nh.be('flip')}\r\n          label={locale.value.flip}\r\n          shortcut={shortcuts.value.flip}\r\n          onClick={toggleFlip}\r\n        >\r\n          <Icon\r\n            {...icons.value.flipX}\r\n            scale={+(icons.value.flipX.scale || 1) * iconScale.value}\r\n          ></Icon>\r\n        </VideoControl>\r\n      )\r\n    }\r\n\r\n    function renderPip() {\r\n      if (!pipEnabled || !video.value) return null\r\n\r\n      return (\r\n        <VideoControl\r\n          class={nh.be('pip')}\r\n          label={pip.value ? locale.value.exitPip : locale.value.requestPip}\r\n          shortcut={shortcuts.value.pip}\r\n          disabled={!canPlay.value}\r\n          onClick={togglePip}\r\n        >\r\n          <Icon {...icons.value.pip} scale={+(icons.value.pip.scale || 1) * iconScale.value}></Icon>\r\n        </VideoControl>\r\n      )\r\n    }\r\n\r\n    function renderFullWindow() {\r\n      return (\r\n        <VideoControl\r\n          class={nh.be('full-window')}\r\n          label={full.value === 'window' ? locale.value.fullWindowExit : locale.value.fullWindow}\r\n          shortcut={shortcuts.value['full-window']}\r\n          onClick={() => toggleFull('window')}\r\n        >\r\n          <Icon\r\n            {...icons.value.fullWindow}\r\n            scale={+(icons.value.fullWindow.scale || 1) * iconScale.value}\r\n          ></Icon>\r\n        </VideoControl>\r\n      )\r\n    }\r\n\r\n    function renderFullBrowser() {\r\n      return (\r\n        <VideoControl\r\n          class={nh.be('full-browser')}\r\n          label={full.value === 'browser' ? locale.value.fullScreenExit : locale.value.fullScreen}\r\n          shortcut={shortcuts.value['full-browser']}\r\n          onClick={() => toggleFull('browser')}\r\n        >\r\n          <Icon\r\n            {...icons.value.fullScreen}\r\n            scale={+(icons.value.fullScreen.scale || 1) * iconScale.value}\r\n          ></Icon>\r\n        </VideoControl>\r\n      )\r\n    }\r\n\r\n    function renderControl(name: VideoControlConfig) {\r\n      switch (name) {\r\n        case 'play-prev':\r\n          return renderPlayPrev()\r\n        case 'play':\r\n          return renderPlay()\r\n        case 'play-next':\r\n          return renderPlayNext()\r\n        case 'refresh':\r\n          return renderRefresh()\r\n        case 'timer':\r\n          return renderTimer()\r\n        case 'playback-rate':\r\n          return renderPlaybackRate()\r\n        case 'volume':\r\n          return renderVolume()\r\n        case 'flip':\r\n          return renderFlip()\r\n        case 'pip':\r\n          return renderPip()\r\n        case 'full-window':\r\n          return renderFullWindow()\r\n        case 'full-browser':\r\n          return renderFullBrowser()\r\n        default:\r\n          return createSlotRender(slots, [\r\n            `control-${name}`,\r\n            `control${toCapitalCase(name as string)}`,\r\n          ])?.(slotParams)\r\n      }\r\n    }\r\n\r\n    function renderControls() {\r\n      if (props.noControls) {\r\n        return (\r\n          <Progress\r\n            class={nh.be('progress-line')}\r\n            percentage={percent.value}\r\n            stroke-width={1}\r\n            info-type={'none'}\r\n          ></Progress>\r\n        )\r\n      }\r\n\r\n      return (\r\n        <div\r\n          class={{\r\n            [nh.be('controls')]: true,\r\n            [nh.bem('controls', 'collapsed')]: hasPlayed.value && !interacting.value,\r\n          }}\r\n        >\r\n          <section class={nh.be('controls-top')}>\r\n            <VideoProgress\r\n              time={currentTime.value}\r\n              duration={duration.value}\r\n              segments={segments.value}\r\n              onChange={changeTime}\r\n            ></VideoProgress>\r\n          </section>\r\n          <section class={nh.be('controls-bottom')}>\r\n            <div class={nh.be('controls-left')}>\r\n              {(props.controlLayout.left ?? videoDefaultControlLayout.left).map(renderControl)}\r\n            </div>\r\n            <div class={nh.be('controls-center')}>\r\n              {(props.controlLayout.center ?? videoDefaultControlLayout.center).map(renderControl)}\r\n            </div>\r\n            <div class={nh.be('controls-right')}>\r\n              {(props.controlLayout.right ?? videoDefaultControlLayout.right).map(renderControl)}\r\n            </div>\r\n          </section>\r\n        </div>\r\n      )\r\n    }\r\n\r\n    function renderMain() {\r\n      return (\r\n        <div class={nh.be('main')}>\r\n          <div\r\n            class={[nh.be('player'), flipped.value && nh.bem('player', 'flipped')]}\r\n            onClick={() => togglePlaying()}\r\n          >\r\n            {renderSlot(slots, 'player', {}, () => [\r\n              <video\r\n                {...props.videoAttrs}\r\n                ref={video}\r\n                class={nh.be('video')}\r\n                src={currentSrc.value || props.videoAttrs?.src}\r\n              >\r\n                {renderSlot(slots, 'default')}\r\n              </video>,\r\n            ])}\r\n          </div>\r\n          {!hasPlayed.value && (props.poster || slots.poster || props.slots.poster) && (\r\n            <div class={nh.be('poster')}>\r\n              {renderSlot(slots, 'poster', undefined, () => [\r\n                <Renderer renderer={props.slots.poster}>\r\n                  <img src={props.poster} />\r\n                </Renderer>,\r\n              ])}\r\n            </div>\r\n          )}\r\n          <Transition name={nh.bs('state-effect')} onAfterLeave={() => (stateHidden.value = true)}>\r\n            {canPlay.value && stateShow.value && (\r\n              <div class={nh.be('state')}>\r\n                {renderSlot(slots, 'state', { active: stateShow.value }, () => [\r\n                  <Icon {...stateIcon.value} scale={+(stateIcon.value.scale || 1) * 5}></Icon>,\r\n                ])}\r\n              </div>\r\n            )}\r\n          </Transition>\r\n          <Transition name={nh.ns('fade')}>\r\n            {((!canPlay.value && !stateShow.value) || (props.loading && stateHidden.value)) && (\r\n              <div class={nh.be('loading')}>\r\n                {renderSlot(slots, 'loading', {}, () => [\r\n                  <Icon\r\n                    {...icons.value.loading}\r\n                    icon={props.loadingIcon || icons.value.loading.icon}\r\n                    label={'loading'}\r\n                    effect={props.loadingEffect || icons.value.loading.effect}\r\n                    scale={+(stateIcon.value.scale || 1) * 5}\r\n                  ></Icon>,\r\n                ])}\r\n              </div>\r\n            )}\r\n          </Transition>\r\n          {renderControls()}\r\n          {renderSlot(slots, 'extra')}\r\n        </div>\r\n      )\r\n    }\r\n\r\n    return () => {\r\n      return (\r\n        <FullScreen\r\n          ref={screen}\r\n          class={className.value}\r\n          tabindex={'-1'}\r\n          onToggle={onFullChange}\r\n          onPointermove={handleInteract}\r\n          onPointerleave={handlePointerLeave}\r\n        >\r\n          {{ default: renderMain }}\r\n        </FullScreen>\r\n      )\r\n    }\r\n  },\r\n})\r\n"],"names":["defineComponent","name","props","videoProps","emits","setup","_props","slots","emit","expose","useProps","src","static","default","srcList","noControls","videoAttrs","time","volume","playbackRate","playbackRates","controlLayout","videoDefaultControlLayout","poster","video","segments","loading","loadingIcon","loadingEffect","shortcuts","nh","useNameHelper","locale","useLocale","icons","useIcons","timer","useSetTimeout","pipEnabled","isClient","document","pictureInPictureEnabled","currentSrc","ref","playing","currentTime","canPlay","duration","currentVolume","pip","stateShow","stateHidden","currentRate","interacting","hasPlayed","flipped","iconScale","screen","wrapper","computed","value","volumeRef","placeId","full","videoRef","shortcutRecord","reactive","videoDefaultShortcuts","addShortcut","key","cb","console","warn","noop","useModifier","target","passive","onKeyDown","event","modifier","ctrlKey","shiftKey","altKey","metaKey","decide","up","Math","min","down","max","right","left","toggleMute","Object","keys","map","afterMatchAny","resetAll","className","b","bs","bm","playIcon","pause","play","stateIcon","pauseState","playState","rateOptions","rates","raw","rate","toNumber","label","decimalLength","toFixed","filter","sort","prev","next","find","index","findIndex","splice","length","segment","percent","srcFullList","includes","concat","srcIndex","indexOf","slotParams","shallowReadonly","togglePlaying","togglePip","changeRate","changeTime","changeVolume","toggleFull","watch","resetMetaState","flush","requestAnimationFrame","onMounted","nextTick","querySelector","undefined","provide","VIDEO_STATE","useListener","emitEvent","onTimeChange","handleEnded","onTogglePip","focus","onPlay","onPause","onEnded","exitPictureInPicture","requestPictureInPicture","dispatch","onRateChange","onVolumeChange","toggleFlip","onToggleFlip","onFullChange","onToggleFull","handleInteract","clearTimeout","interact","setTimeout","handlePointerLeave","adjustSrc","amount","list","playPrev","onPrev","playNext","onNext","type","toggle","handleRefresh","onRefresh","renderPlayPrev","_createVNode","VideoControl","be","Icon","_mergeProps","scale","renderPlay","renderPlayNext","renderRefresh","refresh","renderTimer","VideoTimer","renderPlaybackRate","renderVolume","VideoVolume","renderFlip","flip","flipX","renderPip","exitPip","requestPip","renderFullWindow","fullWindowExit","fullWindow","onClick","renderFullBrowser","fullScreenExit","fullScreen","renderControl","createSlotRender","toCapitalCase","renderControls","Progress","bem","VideoProgress","center","renderMain","renderSlot","Renderer","Transition","onAfterLeave","active","ns","icon","effect","FullScreen"],"mappings":"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"}