{"version":3,"file":"index.development.cjs","names":[],"sources":["../src/use-audio-player.ts","../src/VueAudioNative.vue","../src/VueAudioNative.vue","../src/index.ts"],"sourcesContent":["import {\n  onScopeDispose,\n  shallowRef,\n  toValue,\n  watch,\n} from 'vue'\n\nimport {\n  createAudioController,\n  type AudioControllerOptions,\n  type AudioInput,\n  type AudioSnapshot,\n} from '@trsoliu/audio-core'\n\nimport type {\n  UseAudioPlayerOptions,\n  UseAudioPlayerResult,\n} from './types'\n\nfunction runtimeOptions(options: AudioControllerOptions): AudioControllerOptions {\n  const nextOptions: AudioControllerOptions = {\n    autoplay: options.autoplay ?? false,\n    bridge: options.bridge ?? null,\n    exclusive: options.exclusive ?? false,\n    group: options.group ?? 'default',\n    mediaSession: options.mediaSession ?? false,\n    muted: options.muted ?? false,\n    playbackRate: options.playbackRate ?? 1,\n    preload: options.preload ?? 'metadata',\n    repeatMode: options.repeatMode ?? 'off',\n    volume: options.volume ?? 1,\n    waitBuffer: options.waitBuffer ?? true,\n  }\n  return nextOptions\n}\n\nfunction audioInput(options: AudioControllerOptions): AudioInput {\n  const input: AudioInput = {}\n  if (options.src !== undefined) input.src = options.src\n  if (options.tracks !== undefined) input.tracks = options.tracks\n  return input\n}\n\nexport function useAudioPlayer(\n  options: UseAudioPlayerOptions = {},\n): UseAudioPlayerResult {\n  const getOptions = (): AudioControllerOptions => toValue(options)\n  const controller = createAudioController(getOptions())\n  const audioRef = shallowRef<HTMLAudioElement | null>(null)\n  const snapshot = shallowRef<AudioSnapshot>(controller.getSnapshot())\n  const unsubscribe = controller.subscribe((nextSnapshot) => {\n    snapshot.value = nextSnapshot\n  })\n\n  watch(\n    audioRef,\n    (element) => controller.attach(element),\n    { flush: 'sync' },\n  )\n  watch(\n    () => runtimeOptions(getOptions()),\n    (nextOptions) => controller.updateOptions(nextOptions),\n    { deep: true, flush: 'sync' },\n  )\n  const updateInput = (): void => controller.setInput(audioInput(getOptions()))\n  watch(\n    () => JSON.stringify(audioInput(getOptions())),\n    () => updateInput(),\n    { flush: 'sync' },\n  )\n\n  onScopeDispose(() => {\n    unsubscribe()\n    controller.destroy()\n  })\n\n  return {\n    audioRef,\n    controls: controller,\n    snapshot,\n  }\n}\n","<script setup lang=\"ts\">\nimport {\n  Download,\n  Pause,\n  Play,\n  SkipBack,\n  SkipForward,\n  Volume2,\n  VolumeX,\n} from '@lucide/vue'\nimport {\n  formatMediaTime,\n  detectAudioCapabilities,\n  normalizeSources,\n  type AudioInput,\n  type AudioPlayerError,\n  type AudioPlayerHandle,\n  type AudioSnapshot,\n  type AudioTrack,\n} from '@trsoliu/audio-core'\nimport {\n  computed,\n  getCurrentInstance,\n  onMounted,\n  ref,\n  watch,\n} from 'vue'\n\nimport type { VueAudioNativeProps } from './types'\nimport { useAudioPlayer } from './use-audio-player'\n\n// eslint-disable-next-line vue/component-definition-name-casing -- Public Vue 2-era component name.\ndefineOptions({ name: 'vue-audio-native' })\n\nconst props = withDefaults(defineProps<VueAudioNativeProps>(), {\n  autoplay: false,\n  downloadName: '',\n  exclusive: false,\n  group: 'default',\n  hint: '暂无有效音频...',\n  mediaSession: false,\n  muted: false,\n  playbackRate: 1,\n  preload: 'metadata',\n  repeatMode: 'off',\n  showControls: false,\n  showCurrentTime: true,\n  showDownload: true,\n  showVolume: true,\n  size: 'default',\n  url: '',\n  volume: 1,\n  waitBuffer: true,\n})\n\nconst emit = defineEmits<{\n  ended: [snapshot: AudioSnapshot]\n  error: [error: AudioPlayerError]\n  'on-audioId': [id: string]\n  'on-change': [playing: boolean]\n  'on-metadata': [event: Event]\n  'on-timeupdate': [currentTime: number]\n  pause: [snapshot: AudioSnapshot]\n  play: [snapshot: AudioSnapshot]\n  ready: [snapshot: AudioSnapshot]\n  statechange: [snapshot: AudioSnapshot]\n  timeupdate: [currentTime: number, snapshot: AudioSnapshot]\n  trackchange: [track: AudioTrack | null, trackIndex: number]\n}>()\n\nlet mountedPlayerCount = 0\nconst audioId = ref('')\nconst customControlsSupported = ref(true)\nconst instance = getCurrentInstance()\n\nfunction hasSource(input: VueAudioNativeProps['src']): boolean {\n  if (typeof input === 'string') return input.trim().length > 0\n  if (!input) return false\n  if ('src' in input) return input.src.trim().length > 0\n  return input.some((source) => hasSource(source))\n}\n\nconst selectedInput = computed<AudioInput>(() => {\n  if (props.tracks && props.tracks.length > 0) return { tracks: props.tracks }\n  if (props.src !== undefined && hasSource(props.src)) return { src: props.src }\n  if (props.url.trim()) return { src: props.url }\n  return {}\n})\n\nwatch(\n  () => [props.tracks?.length ?? 0, hasSource(props.src), props.url.trim()],\n  ([trackCount, modernSource, legacySource]) => {\n    const inputCount =\n      Number(Number(trackCount) > 0) +\n      Number(Boolean(modernSource)) +\n      Number(Boolean(legacySource))\n    if (import.meta.env.DEV && inputCount > 1) {\n      console.warn(\n        '[vue-audio-native] Multiple audio inputs were provided. Using tracks, then src, then url.',\n      )\n    }\n  },\n  { immediate: true },\n)\n\nconst playerOptions = computed(() => ({\n  ...selectedInput.value,\n  autoplay: props.autoplay,\n  exclusive: props.exclusive,\n  group: props.group,\n  mediaSession: props.mediaSession,\n  muted: props.muted,\n  playbackRate: props.playbackRate,\n  preload: props.preload,\n  repeatMode: props.repeatMode,\n  volume: props.volume,\n  waitBuffer: props.waitBuffer,\n}))\n\nconst { audioRef, controls, snapshot } = useAudioPlayer(playerOptions)\n\nfunction hasRawProp(camelName: string, kebabName: string): boolean {\n  const rawProps = instance?.vnode.props\n  return Boolean(\n    rawProps &&\n      (Object.hasOwn(rawProps, camelName) || Object.hasOwn(rawProps, kebabName)),\n  )\n}\n\nconst useNativeControls = computed(() => {\n  if (!customControlsSupported.value) return true\n  const modernValue = props.nativeControls\n  return hasRawProp('nativeControls', 'native-controls')\n    ? modernValue === true\n    : props.showControls\n})\n\nconst duration = computed(() => snapshot.value.duration)\nconst currentTime = computed(() => snapshot.value.currentTime)\nconst isPlaying = computed(\n  () =>\n    snapshot.value.state === 'playing' ||\n    snapshot.value.state === 'buffering',\n)\nconst currentSources = computed(() =>\n  snapshot.value.track ? normalizeSources(snapshot.value.track.sources) : [],\n)\nconst downloadSource = computed(() => {\n  const element = controls.getElement()\n  return element?.src || element?.currentSrc || currentSources.value[0]?.src || ''\n})\nconst effectiveDownloadName = computed(\n  () => snapshot.value.track?.downloadName ?? props.downloadName,\n)\nconst progressMaximum = computed(() => duration.value ?? 0)\nconst progressRatio = computed(() => {\n  const total = duration.value\n  return total && total > 0 ? Math.min(1, currentTime.value / total) : 0\n})\nconst waveform = computed(() => {\n  const peaks = snapshot.value.track?.peaks ?? []\n  if (peaks.length <= 96) return peaks\n  const step = peaks.length / 96\n  return Array.from({ length: 96 }, (_, index) => peaks[Math.floor(index * step)] ?? 0)\n})\n\nfunction togglePlayback(): void {\n  void controls.toggle().catch(() => undefined)\n}\n\nfunction seekFromInput(event: Event): void {\n  controls.seekTo(Number((event.currentTarget as HTMLInputElement).value))\n}\n\nfunction volumeFromInput(event: Event): void {\n  controls.setVolume(Number((event.currentTarget as HTMLInputElement).value))\n}\n\nfunction onLoadedMetadata(event: Event): void {\n  emit('on-metadata', event)\n}\n\nwatch(\n  snapshot,\n  (nextSnapshot, previousSnapshot) => {\n    if (nextSnapshot.state !== previousSnapshot.state) {\n      emit('statechange', nextSnapshot)\n      if (nextSnapshot.state === 'ready') emit('ready', nextSnapshot)\n      if (nextSnapshot.state === 'playing') {\n        emit('play', nextSnapshot)\n        emit('on-change', true)\n      }\n      if (nextSnapshot.state === 'paused') {\n        emit('pause', nextSnapshot)\n        emit('on-change', false)\n      }\n      if (nextSnapshot.state === 'ended') {\n        emit('ended', nextSnapshot)\n        emit('on-change', false)\n      }\n    }\n\n    if (nextSnapshot.currentTime !== previousSnapshot.currentTime) {\n      emit('timeupdate', nextSnapshot.currentTime, nextSnapshot)\n      emit('on-timeupdate', nextSnapshot.currentTime)\n    }\n    if (\n      nextSnapshot.trackIndex !== previousSnapshot.trackIndex ||\n      nextSnapshot.track !== previousSnapshot.track\n    ) {\n      emit('trackchange', nextSnapshot.track, nextSnapshot.trackIndex)\n    }\n    if (nextSnapshot.error && nextSnapshot.error !== previousSnapshot.error) {\n      emit('error', nextSnapshot.error)\n    }\n  },\n  { flush: 'sync' },\n)\n\nonMounted(() => {\n  mountedPlayerCount += 1\n  audioId.value = `vue-audio-native-${mountedPlayerCount}`\n  customControlsSupported.value = detectAudioCapabilities(\n    controls.getElement(),\n  ).customControls\n  emit('on-audioId', audioId.value)\n})\n\ndefineExpose<AudioPlayerHandle>(controls)\n</script>\n\n<template>\n  <section\n    class=\"audio-native\"\n    :data-size=\"size\"\n    :data-state=\"snapshot.state\"\n    :aria-busy=\"snapshot.state === 'loading' || snapshot.state === 'buffering'\"\n  >\n    <audio\n      :id=\"audioId || undefined\"\n      ref=\"audioRef\"\n      class=\"audio-native__element\"\n      :controls=\"useNativeControls\"\n      @durationchange=\"onLoadedMetadata\"\n      @loadedmetadata=\"onLoadedMetadata\"\n    />\n\n    <template v-if=\"snapshot.track\">\n      <div class=\"audio-native__track\">\n        <slot\n          name=\"artwork\"\n          :track=\"snapshot.track\"\n        >\n          <img\n            v-if=\"snapshot.track.artwork?.[0]?.src\"\n            class=\"audio-native__artwork\"\n            :src=\"snapshot.track.artwork[0].src\"\n            :alt=\"snapshot.track.title ? `${snapshot.track.title} artwork` : 'Audio artwork'\"\n          >\n        </slot>\n        <div class=\"audio-native__track-copy\">\n          <p\n            v-if=\"snapshot.track.title\"\n            class=\"audio-native__title\"\n          >\n            {{ snapshot.track.title }}\n          </p>\n          <p\n            v-if=\"snapshot.track.artist\"\n            class=\"audio-native__artist\"\n          >\n            {{ snapshot.track.artist }}\n          </p>\n        </div>\n      </div>\n\n      <div\n        v-if=\"!useNativeControls\"\n        class=\"audio-native__custom-controls\"\n      >\n        <slot\n          name=\"before-controls\"\n          :controls=\"controls\"\n          :snapshot=\"snapshot\"\n        />\n\n        <div\n          v-if=\"waveform.length\"\n          class=\"audio-native__waveform\"\n          aria-hidden=\"true\"\n        >\n          <span\n            v-for=\"(peak, index) in waveform\"\n            :key=\"index\"\n            class=\"audio-native__peak\"\n            :class=\"index / waveform.length <= progressRatio ? 'is-active' : ''\"\n            :style=\"{ height: `${Math.max(8, Math.min(100, Math.abs(peak) * 100))}%` }\"\n          />\n        </div>\n\n        <input\n          class=\"audio-native__range audio-native__progress\"\n          type=\"range\"\n          min=\"0\"\n          :max=\"progressMaximum\"\n          step=\"0.01\"\n          :value=\"currentTime\"\n          :disabled=\"duration === null\"\n          aria-label=\"Audio progress\"\n          @input=\"seekFromInput\"\n        >\n\n        <div class=\"audio-native__toolbar\">\n          <button\n            v-if=\"tracks && tracks.length > 1\"\n            class=\"audio-native__icon-button\"\n            type=\"button\"\n            aria-label=\"Previous track\"\n            title=\"Previous track\"\n            @click=\"void controls.previous()\"\n          >\n            <SkipBack aria-hidden=\"true\" />\n          </button>\n          <button\n            class=\"audio-native__play-button\"\n            type=\"button\"\n            :aria-label=\"isPlaying ? 'Pause audio' : 'Play audio'\"\n            :title=\"isPlaying ? 'Pause audio' : 'Play audio'\"\n            @click=\"togglePlayback\"\n          >\n            <Pause\n              v-if=\"isPlaying\"\n              aria-hidden=\"true\"\n            />\n            <Play\n              v-else\n              aria-hidden=\"true\"\n            />\n          </button>\n          <button\n            v-if=\"tracks && tracks.length > 1\"\n            class=\"audio-native__icon-button\"\n            type=\"button\"\n            aria-label=\"Next track\"\n            title=\"Next track\"\n            @click=\"void controls.next()\"\n          >\n            <SkipForward aria-hidden=\"true\" />\n          </button>\n\n          <span\n            v-if=\"showCurrentTime\"\n            class=\"audio-native__time\"\n          >\n            {{ formatMediaTime(currentTime) }} / {{ formatMediaTime(duration) }}\n          </span>\n\n          <div\n            v-if=\"showVolume\"\n            class=\"audio-native__volume-control\"\n          >\n            <button\n              class=\"audio-native__icon-button\"\n              type=\"button\"\n              :aria-label=\"snapshot.muted ? 'Unmute audio' : 'Mute audio'\"\n              :title=\"snapshot.muted ? 'Unmute audio' : 'Mute audio'\"\n              @click=\"controls.setMuted(!snapshot.muted)\"\n            >\n              <VolumeX\n                v-if=\"snapshot.muted\"\n                aria-hidden=\"true\"\n              />\n              <Volume2\n                v-else\n                aria-hidden=\"true\"\n              />\n            </button>\n            <input\n              class=\"audio-native__range audio-native__volume\"\n              type=\"range\"\n              min=\"0\"\n              max=\"1\"\n              step=\"0.01\"\n              :value=\"snapshot.volume\"\n              aria-label=\"Audio volume\"\n              @input=\"volumeFromInput\"\n            >\n          </div>\n\n          <a\n            v-if=\"showDownload && downloadSource\"\n            class=\"audio-native__icon-button\"\n            :href=\"downloadSource\"\n            :download=\"effectiveDownloadName\"\n            aria-label=\"Download audio\"\n            title=\"Download audio\"\n          >\n            <Download aria-hidden=\"true\" />\n          </a>\n        </div>\n\n        <slot\n          name=\"after-controls\"\n          :controls=\"controls\"\n          :snapshot=\"snapshot\"\n        />\n      </div>\n    </template>\n\n    <div\n      v-else\n      class=\"audio-native__hint\"\n      role=\"status\"\n    >\n      <slot name=\"tip\">\n        <slot name=\"slotTip\">\n          {{ hint }}\n        </slot>\n      </slot>\n    </div>\n  </section>\n</template>\n","<script setup lang=\"ts\">\nimport {\n  Download,\n  Pause,\n  Play,\n  SkipBack,\n  SkipForward,\n  Volume2,\n  VolumeX,\n} from '@lucide/vue'\nimport {\n  formatMediaTime,\n  detectAudioCapabilities,\n  normalizeSources,\n  type AudioInput,\n  type AudioPlayerError,\n  type AudioPlayerHandle,\n  type AudioSnapshot,\n  type AudioTrack,\n} from '@trsoliu/audio-core'\nimport {\n  computed,\n  getCurrentInstance,\n  onMounted,\n  ref,\n  watch,\n} from 'vue'\n\nimport type { VueAudioNativeProps } from './types'\nimport { useAudioPlayer } from './use-audio-player'\n\n// eslint-disable-next-line vue/component-definition-name-casing -- Public Vue 2-era component name.\ndefineOptions({ name: 'vue-audio-native' })\n\nconst props = withDefaults(defineProps<VueAudioNativeProps>(), {\n  autoplay: false,\n  downloadName: '',\n  exclusive: false,\n  group: 'default',\n  hint: '暂无有效音频...',\n  mediaSession: false,\n  muted: false,\n  playbackRate: 1,\n  preload: 'metadata',\n  repeatMode: 'off',\n  showControls: false,\n  showCurrentTime: true,\n  showDownload: true,\n  showVolume: true,\n  size: 'default',\n  url: '',\n  volume: 1,\n  waitBuffer: true,\n})\n\nconst emit = defineEmits<{\n  ended: [snapshot: AudioSnapshot]\n  error: [error: AudioPlayerError]\n  'on-audioId': [id: string]\n  'on-change': [playing: boolean]\n  'on-metadata': [event: Event]\n  'on-timeupdate': [currentTime: number]\n  pause: [snapshot: AudioSnapshot]\n  play: [snapshot: AudioSnapshot]\n  ready: [snapshot: AudioSnapshot]\n  statechange: [snapshot: AudioSnapshot]\n  timeupdate: [currentTime: number, snapshot: AudioSnapshot]\n  trackchange: [track: AudioTrack | null, trackIndex: number]\n}>()\n\nlet mountedPlayerCount = 0\nconst audioId = ref('')\nconst customControlsSupported = ref(true)\nconst instance = getCurrentInstance()\n\nfunction hasSource(input: VueAudioNativeProps['src']): boolean {\n  if (typeof input === 'string') return input.trim().length > 0\n  if (!input) return false\n  if ('src' in input) return input.src.trim().length > 0\n  return input.some((source) => hasSource(source))\n}\n\nconst selectedInput = computed<AudioInput>(() => {\n  if (props.tracks && props.tracks.length > 0) return { tracks: props.tracks }\n  if (props.src !== undefined && hasSource(props.src)) return { src: props.src }\n  if (props.url.trim()) return { src: props.url }\n  return {}\n})\n\nwatch(\n  () => [props.tracks?.length ?? 0, hasSource(props.src), props.url.trim()],\n  ([trackCount, modernSource, legacySource]) => {\n    const inputCount =\n      Number(Number(trackCount) > 0) +\n      Number(Boolean(modernSource)) +\n      Number(Boolean(legacySource))\n    if (import.meta.env.DEV && inputCount > 1) {\n      console.warn(\n        '[vue-audio-native] Multiple audio inputs were provided. Using tracks, then src, then url.',\n      )\n    }\n  },\n  { immediate: true },\n)\n\nconst playerOptions = computed(() => ({\n  ...selectedInput.value,\n  autoplay: props.autoplay,\n  exclusive: props.exclusive,\n  group: props.group,\n  mediaSession: props.mediaSession,\n  muted: props.muted,\n  playbackRate: props.playbackRate,\n  preload: props.preload,\n  repeatMode: props.repeatMode,\n  volume: props.volume,\n  waitBuffer: props.waitBuffer,\n}))\n\nconst { audioRef, controls, snapshot } = useAudioPlayer(playerOptions)\n\nfunction hasRawProp(camelName: string, kebabName: string): boolean {\n  const rawProps = instance?.vnode.props\n  return Boolean(\n    rawProps &&\n      (Object.hasOwn(rawProps, camelName) || Object.hasOwn(rawProps, kebabName)),\n  )\n}\n\nconst useNativeControls = computed(() => {\n  if (!customControlsSupported.value) return true\n  const modernValue = props.nativeControls\n  return hasRawProp('nativeControls', 'native-controls')\n    ? modernValue === true\n    : props.showControls\n})\n\nconst duration = computed(() => snapshot.value.duration)\nconst currentTime = computed(() => snapshot.value.currentTime)\nconst isPlaying = computed(\n  () =>\n    snapshot.value.state === 'playing' ||\n    snapshot.value.state === 'buffering',\n)\nconst currentSources = computed(() =>\n  snapshot.value.track ? normalizeSources(snapshot.value.track.sources) : [],\n)\nconst downloadSource = computed(() => {\n  const element = controls.getElement()\n  return element?.src || element?.currentSrc || currentSources.value[0]?.src || ''\n})\nconst effectiveDownloadName = computed(\n  () => snapshot.value.track?.downloadName ?? props.downloadName,\n)\nconst progressMaximum = computed(() => duration.value ?? 0)\nconst progressRatio = computed(() => {\n  const total = duration.value\n  return total && total > 0 ? Math.min(1, currentTime.value / total) : 0\n})\nconst waveform = computed(() => {\n  const peaks = snapshot.value.track?.peaks ?? []\n  if (peaks.length <= 96) return peaks\n  const step = peaks.length / 96\n  return Array.from({ length: 96 }, (_, index) => peaks[Math.floor(index * step)] ?? 0)\n})\n\nfunction togglePlayback(): void {\n  void controls.toggle().catch(() => undefined)\n}\n\nfunction seekFromInput(event: Event): void {\n  controls.seekTo(Number((event.currentTarget as HTMLInputElement).value))\n}\n\nfunction volumeFromInput(event: Event): void {\n  controls.setVolume(Number((event.currentTarget as HTMLInputElement).value))\n}\n\nfunction onLoadedMetadata(event: Event): void {\n  emit('on-metadata', event)\n}\n\nwatch(\n  snapshot,\n  (nextSnapshot, previousSnapshot) => {\n    if (nextSnapshot.state !== previousSnapshot.state) {\n      emit('statechange', nextSnapshot)\n      if (nextSnapshot.state === 'ready') emit('ready', nextSnapshot)\n      if (nextSnapshot.state === 'playing') {\n        emit('play', nextSnapshot)\n        emit('on-change', true)\n      }\n      if (nextSnapshot.state === 'paused') {\n        emit('pause', nextSnapshot)\n        emit('on-change', false)\n      }\n      if (nextSnapshot.state === 'ended') {\n        emit('ended', nextSnapshot)\n        emit('on-change', false)\n      }\n    }\n\n    if (nextSnapshot.currentTime !== previousSnapshot.currentTime) {\n      emit('timeupdate', nextSnapshot.currentTime, nextSnapshot)\n      emit('on-timeupdate', nextSnapshot.currentTime)\n    }\n    if (\n      nextSnapshot.trackIndex !== previousSnapshot.trackIndex ||\n      nextSnapshot.track !== previousSnapshot.track\n    ) {\n      emit('trackchange', nextSnapshot.track, nextSnapshot.trackIndex)\n    }\n    if (nextSnapshot.error && nextSnapshot.error !== previousSnapshot.error) {\n      emit('error', nextSnapshot.error)\n    }\n  },\n  { flush: 'sync' },\n)\n\nonMounted(() => {\n  mountedPlayerCount += 1\n  audioId.value = `vue-audio-native-${mountedPlayerCount}`\n  customControlsSupported.value = detectAudioCapabilities(\n    controls.getElement(),\n  ).customControls\n  emit('on-audioId', audioId.value)\n})\n\ndefineExpose<AudioPlayerHandle>(controls)\n</script>\n\n<template>\n  <section\n    class=\"audio-native\"\n    :data-size=\"size\"\n    :data-state=\"snapshot.state\"\n    :aria-busy=\"snapshot.state === 'loading' || snapshot.state === 'buffering'\"\n  >\n    <audio\n      :id=\"audioId || undefined\"\n      ref=\"audioRef\"\n      class=\"audio-native__element\"\n      :controls=\"useNativeControls\"\n      @durationchange=\"onLoadedMetadata\"\n      @loadedmetadata=\"onLoadedMetadata\"\n    />\n\n    <template v-if=\"snapshot.track\">\n      <div class=\"audio-native__track\">\n        <slot\n          name=\"artwork\"\n          :track=\"snapshot.track\"\n        >\n          <img\n            v-if=\"snapshot.track.artwork?.[0]?.src\"\n            class=\"audio-native__artwork\"\n            :src=\"snapshot.track.artwork[0].src\"\n            :alt=\"snapshot.track.title ? `${snapshot.track.title} artwork` : 'Audio artwork'\"\n          >\n        </slot>\n        <div class=\"audio-native__track-copy\">\n          <p\n            v-if=\"snapshot.track.title\"\n            class=\"audio-native__title\"\n          >\n            {{ snapshot.track.title }}\n          </p>\n          <p\n            v-if=\"snapshot.track.artist\"\n            class=\"audio-native__artist\"\n          >\n            {{ snapshot.track.artist }}\n          </p>\n        </div>\n      </div>\n\n      <div\n        v-if=\"!useNativeControls\"\n        class=\"audio-native__custom-controls\"\n      >\n        <slot\n          name=\"before-controls\"\n          :controls=\"controls\"\n          :snapshot=\"snapshot\"\n        />\n\n        <div\n          v-if=\"waveform.length\"\n          class=\"audio-native__waveform\"\n          aria-hidden=\"true\"\n        >\n          <span\n            v-for=\"(peak, index) in waveform\"\n            :key=\"index\"\n            class=\"audio-native__peak\"\n            :class=\"index / waveform.length <= progressRatio ? 'is-active' : ''\"\n            :style=\"{ height: `${Math.max(8, Math.min(100, Math.abs(peak) * 100))}%` }\"\n          />\n        </div>\n\n        <input\n          class=\"audio-native__range audio-native__progress\"\n          type=\"range\"\n          min=\"0\"\n          :max=\"progressMaximum\"\n          step=\"0.01\"\n          :value=\"currentTime\"\n          :disabled=\"duration === null\"\n          aria-label=\"Audio progress\"\n          @input=\"seekFromInput\"\n        >\n\n        <div class=\"audio-native__toolbar\">\n          <button\n            v-if=\"tracks && tracks.length > 1\"\n            class=\"audio-native__icon-button\"\n            type=\"button\"\n            aria-label=\"Previous track\"\n            title=\"Previous track\"\n            @click=\"void controls.previous()\"\n          >\n            <SkipBack aria-hidden=\"true\" />\n          </button>\n          <button\n            class=\"audio-native__play-button\"\n            type=\"button\"\n            :aria-label=\"isPlaying ? 'Pause audio' : 'Play audio'\"\n            :title=\"isPlaying ? 'Pause audio' : 'Play audio'\"\n            @click=\"togglePlayback\"\n          >\n            <Pause\n              v-if=\"isPlaying\"\n              aria-hidden=\"true\"\n            />\n            <Play\n              v-else\n              aria-hidden=\"true\"\n            />\n          </button>\n          <button\n            v-if=\"tracks && tracks.length > 1\"\n            class=\"audio-native__icon-button\"\n            type=\"button\"\n            aria-label=\"Next track\"\n            title=\"Next track\"\n            @click=\"void controls.next()\"\n          >\n            <SkipForward aria-hidden=\"true\" />\n          </button>\n\n          <span\n            v-if=\"showCurrentTime\"\n            class=\"audio-native__time\"\n          >\n            {{ formatMediaTime(currentTime) }} / {{ formatMediaTime(duration) }}\n          </span>\n\n          <div\n            v-if=\"showVolume\"\n            class=\"audio-native__volume-control\"\n          >\n            <button\n              class=\"audio-native__icon-button\"\n              type=\"button\"\n              :aria-label=\"snapshot.muted ? 'Unmute audio' : 'Mute audio'\"\n              :title=\"snapshot.muted ? 'Unmute audio' : 'Mute audio'\"\n              @click=\"controls.setMuted(!snapshot.muted)\"\n            >\n              <VolumeX\n                v-if=\"snapshot.muted\"\n                aria-hidden=\"true\"\n              />\n              <Volume2\n                v-else\n                aria-hidden=\"true\"\n              />\n            </button>\n            <input\n              class=\"audio-native__range audio-native__volume\"\n              type=\"range\"\n              min=\"0\"\n              max=\"1\"\n              step=\"0.01\"\n              :value=\"snapshot.volume\"\n              aria-label=\"Audio volume\"\n              @input=\"volumeFromInput\"\n            >\n          </div>\n\n          <a\n            v-if=\"showDownload && downloadSource\"\n            class=\"audio-native__icon-button\"\n            :href=\"downloadSource\"\n            :download=\"effectiveDownloadName\"\n            aria-label=\"Download audio\"\n            title=\"Download audio\"\n          >\n            <Download aria-hidden=\"true\" />\n          </a>\n        </div>\n\n        <slot\n          name=\"after-controls\"\n          :controls=\"controls\"\n          :snapshot=\"snapshot\"\n        />\n      </div>\n    </template>\n\n    <div\n      v-else\n      class=\"audio-native__hint\"\n      role=\"status\"\n    >\n      <slot name=\"tip\">\n        <slot name=\"slotTip\">\n          {{ hint }}\n        </slot>\n      </slot>\n    </div>\n  </section>\n</template>\n","import './styles.css'\n\nimport type {\n  AudioPlayerError,\n  AudioPlayerHandle,\n  AudioSnapshot,\n  AudioTrack,\n} from '@trsoliu/audio-core'\nimport type {\n  App,\n  ComponentOptionsMixin,\n  DefineComponent,\n  Plugin,\n} from 'vue'\n\nimport VueAudioNativeSfc from './VueAudioNative.vue'\nimport type { VueAudioNativeProps } from './types'\n\ntype EmptyRecord = Record<string, never>\n\ntype VueAudioNativeEmits = {\n  ended: (snapshot: AudioSnapshot) => void\n  error: (error: AudioPlayerError) => void\n  'on-audioId': (id: string) => void\n  'on-change': (playing: boolean) => void\n  'on-metadata': (event: Event) => void\n  'on-timeupdate': (currentTime: number) => void\n  pause: (snapshot: AudioSnapshot) => void\n  play: (snapshot: AudioSnapshot) => void\n  ready: (snapshot: AudioSnapshot) => void\n  statechange: (snapshot: AudioSnapshot) => void\n  timeupdate: (currentTime: number, snapshot: AudioSnapshot) => void\n  trackchange: (track: AudioTrack | null, trackIndex: number) => void\n}\n\ninterface VueAudioNativeSlots {\n  'after-controls'?: (props: {\n    controls: AudioPlayerHandle\n    snapshot: AudioSnapshot\n  }) => unknown\n  artwork?: (props: { track: AudioTrack }) => unknown\n  'before-controls'?: (props: {\n    controls: AudioPlayerHandle\n    snapshot: AudioSnapshot\n  }) => unknown\n  slotTip?: (props: EmptyRecord) => unknown\n  tip?: (props: EmptyRecord) => unknown\n}\n\ntype VueAudioNativeComponent = DefineComponent<\n  VueAudioNativeProps,\n  AudioPlayerHandle,\n  EmptyRecord,\n  EmptyRecord,\n  EmptyRecord,\n  ComponentOptionsMixin,\n  ComponentOptionsMixin,\n  VueAudioNativeEmits,\n  keyof VueAudioNativeEmits & string\n> &\n  (new () => { $slots: VueAudioNativeSlots })\n\nexport const VueAudioNative =\n  VueAudioNativeSfc as unknown as VueAudioNativeComponent\nexport const AudioPlayer = VueAudioNative\nexport { useAudioPlayer } from './use-audio-player'\nexport type {\n  AudioPlayerSize,\n  UseAudioPlayerOptions,\n  UseAudioPlayerResult,\n  VueAudioNativeProps,\n} from './types'\nexport {\n  detectAudioCapabilities,\n  formatMediaTime,\n  type AudioBridgeEvent,\n  type AudioArtwork,\n  type AudioControllerOptions,\n  type AudioInput,\n  type AudioPlayerError,\n  type AudioPlayerErrorCode,\n  type AudioPlayerHandle,\n  type AudioPlayerBridge,\n  type AudioRuntimeCapabilities,\n  type AudioSnapshot,\n  type AudioSource,\n  type AudioSourceInput,\n  type AudioTrack,\n  type BufferedRange,\n  type PlaybackState,\n  type PreloadMode,\n  type RepeatMode,\n} from '@trsoliu/audio-core'\n\nconst plugin: Plugin = {\n  install(app: App): void {\n    app.component('VueAudioNative', VueAudioNative)\n    app.component('AudioPlayer', VueAudioNative)\n  },\n}\n\nexport default plugin\n"],"mappings":"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"}