{"version":3,"file":"index.cjs","sources":["../src/components/LiveKitRoomProvider.ts","../src/components/LiveKitRoom.vue","../src/composables/useMediaTrackBySourceOrName.ts","../src/components/participant/AudioTrack.vue","../src/components/RoomAudioRenderer.vue","../src/components/controls/MediaDeviceSelect.vue","../src/components/MediaDeviceMenu.vue","../src/composables/useTrackRefContext.ts","../src/components/participant/VideoTrack.vue","../src/composables/useBarAnimator.ts","../src/components/participant/BarVisualizer.vue"],"sourcesContent":["import { defineComponent, toRef, type PropType } from 'vue';\nimport { Room } from 'livekit-client';\nimport { useProvideRoomContext } from '../composables/useRoomContext';\n\nexport default defineComponent({\n  name: 'LiveKitRoomProvider',\n  props: {\n    room: {\n      type: Object as PropType<Room>,\n      required: true,\n    },\n  },\n  setup(props, { slots }) {\n    const room = toRef(props, 'room');\n    useProvideRoomContext(room);\n    return () => slots.default?.();\n  },\n});\n","<template>\n  <div v-bind=\"$attrs\">\n    <LiveKitRoomProvider v-if=\"room\" :room=\"room\">\n      <slot />\n    </LiveKitRoomProvider>\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport LiveKitRoomProvider from './LiveKitRoomProvider';\nimport type { DisconnectReason, MediaDeviceFailure } from 'livekit-client';\nimport { useLiveKitRoom, type LiveKitRoomProps } from '../composables/useLiveKitRoom';\n\nconst props = withDefaults(defineProps<LiveKitRoomProps>(), {\n  audio: false,\n  video: false,\n  screen: false,\n  connect: true,\n});\n\nconst emit = defineEmits<{\n  connected: [];\n  disconnected: [reason?: DisconnectReason];\n  error: [error: Error];\n  mediaDeviceFailure: [failure?: MediaDeviceFailure, kind?: MediaDeviceKind];\n  encryptionError: [error: Error];\n}>();\n\nconst { room } = useLiveKitRoom({\n  ...props,\n  onConnected: () => emit('connected'),\n  onDisconnected: (reason?: DisconnectReason) => emit('disconnected', reason),\n  onError: (error: Error) => emit('error', error),\n  onMediaDeviceFailure: (failure?: MediaDeviceFailure, kind?: MediaDeviceKind) =>\n    emit('mediaDeviceFailure', failure, kind),\n  onEncryptionError: (error: Error) => emit('encryptionError', error),\n});\n</script>\n","import { shallowRef, computed, watch, toValue, mergeProps, type MaybeRef } from 'vue';\nimport type { TrackIdentifier } from '@livekit/components-core';\nimport { getTrackByIdentifier, setupMediaTrack, log } from '@livekit/components-core';\n\nexport interface UseMediaTrackOptions {\n  element?: MaybeRef<HTMLMediaElement | null> | null;\n  props?: MaybeRef<Record<string, any>>;\n}\n\nexport function useMediaTrackBySourceOrName(\n  observerOptions: MaybeRef<TrackIdentifier>,\n  options: UseMediaTrackOptions = {},\n) {\n  const publication = shallowRef(getTrackByIdentifier(toValue(observerOptions)));\n\n  const isMuted = computed(() => publication.value?.isMuted);\n  const isSubscribed = computed(() => publication.value?.isSubscribed);\n  const track = computed(() => publication.value?.track);\n  const orientation = computed<'landscape' | 'portrait'>(() => {\n    const pub = publication.value;\n    if (pub?.dimensions?.width && pub.dimensions.height) {\n      return pub.dimensions.width > pub.dimensions.height ? 'landscape' : 'portrait';\n    }\n    return 'landscape';\n  });\n\n  const mediaTrackSetup = computed(() => setupMediaTrack(toValue(observerOptions)));\n\n  const className = computed(() => mediaTrackSetup.value.className);\n  const trackObserver = computed(() => mediaTrackSetup.value.trackObserver);\n\n  watch(\n    trackObserver,\n    (obs, _oldObs, onCleanup) => {\n      if (!obs) return;\n      const subscription = obs.subscribe((pub: any) => {\n        log.debug('update track from observable', pub);\n        publication.value = pub;\n      });\n      onCleanup(() => {\n        subscription.unsubscribe();\n      });\n    },\n    { immediate: true },\n  );\n\n  watch(\n    [track, () => toValue(options.element)],\n    ([newTrack, newEl]: [any, any], [oldTrack, oldEl]: [any, any], onCleanup) => {\n      if (oldTrack && oldEl) {\n        oldTrack.detach(oldEl);\n      }\n      if (\n        newTrack &&\n        newEl &&\n        !(toValue(observerOptions).participant.isLocal && newTrack?.kind === 'audio')\n      ) {\n        newTrack.attach(newEl);\n      }\n      onCleanup(() => {\n        if (newTrack && newEl) {\n          newTrack.detach(newEl);\n        }\n      });\n    },\n    { immediate: true },\n  );\n\n  const elementProps = computed(() => {\n    const pub = publication.value;\n    return mergeProps(toValue(options.props) ?? {}, {\n      className: className.value,\n      'data-lk-local-participant': toValue(observerOptions).participant.isLocal,\n      'data-lk-source': pub?.source,\n      ...(pub?.kind === 'video' && {\n        'data-lk-orientation': orientation.value,\n      }),\n    });\n  });\n\n  return {\n    publication,\n    isMuted,\n    isSubscribed,\n    track,\n    elementProps,\n  };\n}\n","<template>\n  <audio ref=\"mediaEl\" v-bind=\"elementProps\" autoplay />\n</template>\n\n<script lang=\"ts\" setup>\nimport { RemoteAudioTrack, RemoteTrackPublication } from 'livekit-client';\nimport { log } from '@livekit/components-core';\nimport { useMediaTrackBySourceOrName } from '../../composables/useMediaTrackBySourceOrName';\nimport { PropType, ref, toRef, watch } from 'vue';\nimport type { TrackReference } from '@livekit/components-core';\n\nconst props = defineProps({\n  trackRef: {\n    type: Object as PropType<TrackReference>,\n    required: true,\n  },\n  volume: {\n    type: Number,\n    required: false,\n    default: 1,\n  },\n  muted: {\n    type: Boolean,\n    required: false,\n    default: undefined,\n  },\n});\n\nconst emit = defineEmits(['subscriptionStatusChanged']);\n\nconst mediaEl = ref(null);\nconst trackRef = toRef(props, 'trackRef');\n\nconst {\n  elementProps,\n  isSubscribed,\n  track,\n  publication: pub,\n} = useMediaTrackBySourceOrName(trackRef, {\n  element: mediaEl,\n  props,\n});\n\nwatch(isSubscribed, () => {\n  emit('subscriptionStatusChanged', !!isSubscribed);\n});\n\nwatch(\n  [() => props.volume, track],\n  ([volume, track]) => {\n    if (track === undefined || volume === undefined) {\n      return;\n    }\n    if (track instanceof RemoteAudioTrack) {\n      track.setVolume(volume);\n    } else {\n      log.warn('Volume can only be set on remote audio tracks.');\n    }\n  },\n  { immediate: true },\n);\n\nwatch(\n  [() => props.muted, pub, track],\n  ([muted, pub]) => {\n    if (pub === undefined || muted === undefined) {\n      return;\n    }\n    if (pub instanceof RemoteTrackPublication) {\n      pub.setEnabled(!muted);\n    } else {\n      log.warn('Can only call setEnabled on remote track publications.');\n    }\n  },\n  { immediate: true },\n);\n</script>\n","<template>\n  <div :style=\"{ display: 'none' }\">\n    <AudioTrack\n      v-for=\"trackRef in filteredTracks\"\n      :key=\"getTrackReferenceId(trackRef)\"\n      :trackRef=\"trackRef\"\n      :volume=\"volume\"\n      :muted=\"muted\"\n    />\n  </div>\n</template>\n\n<script lang=\"ts\" setup>\nimport { computed } from 'vue';\nimport { Track } from 'livekit-client';\nimport { getTrackReferenceId } from '@livekit/components-core';\nimport AudioTrack from './participant/AudioTrack.vue';\nimport { useTracks } from '../composables/useTracks';\n\ndefineProps({\n  volume: {\n    type: Number,\n    required: false,\n    default: 1,\n  },\n  muted: {\n    type: Boolean,\n    required: false,\n    default: false,\n  },\n});\n\nconst tracks = useTracks(\n  [Track.Source.Microphone, Track.Source.ScreenShareAudio, Track.Source.Unknown],\n  {\n    updateOnlyOn: [],\n    onlySubscribed: true,\n  },\n);\n\nconst filteredTracks = computed(() =>\n  tracks.value.filter(\n    (ref: any) => !ref.participant.isLocal && ref.publication?.kind === Track.Kind.Audio,\n  ),\n);\n</script>\n\n<style></style>\n","<template>\n  <v-list ref=\"listRef\" :class=\"className\" slim density=\"comfortable\">\n    <v-list-item\n      v-for=\"(device, index) in devices\"\n      :key=\"device.deviceId\"\n      :id=\"device.deviceId\"\n      :active=\"isActive(device.deviceId, activeDeviceId, index)\"\n      :aria-selected=\"isActive(device.deviceId, activeDeviceId, index)\"\n      role=\"option\"\n      @click=\"handleActiveDeviceChange(device.deviceId)\"\n    >\n      <template #prepend>\n        <v-icon\n          v-if=\"isActive(device.deviceId, activeDeviceId, index)\"\n          color=\"primary\"\n          icon=\"mdi-check\"\n        />\n        <v-icon v-else color=\"transparent\" icon=\"mdi-check\" />\n      </template>\n      <v-list-item-title\n        class=\"text-subtitle-2\"\n        :class=\"{\n          'text-primary': isActive(device.deviceId, activeDeviceId, index),\n        }\"\n      >\n        {{ device.label }}\n      </v-list-item-title>\n      <v-list-item-subtitle v-if=\"device.deviceId === 'default'\" class=\"text-caption\">\n        Sistem varsayılanı\n      </v-list-item-subtitle>\n    </v-list-item>\n    <slot />\n  </v-list>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, watch } from 'vue';\nimport { RoomEvent, type LocalAudioTrack, type LocalVideoTrack } from 'livekit-client';\nimport { useMaybeRoomContext } from '../../composables/useRoomContext';\nimport { useMediaDeviceSelect } from '../../composables/useMediaDeviceSelect';\n\nexport interface MediaDeviceSelectProps {\n  kind: MediaDeviceKind;\n  initialSelection?: string;\n  /** will force the browser to only return the specified device\n   * will call `onDeviceSelectError` with the error in case this fails\n   */\n  exactMatch?: boolean;\n  track?: LocalAudioTrack | LocalVideoTrack;\n  /**\n   * this will call getUserMedia if the permissions are not yet given to enumerate the devices with device labels.\n   * in some browsers multiple calls to getUserMedia result in multiple permission prompts.\n   * It's generally advised only flip this to true, once a (preview) track has been acquired successfully with the\n   * appropriate permissions.\n   *\n   * @see {@link MediaDeviceMenu}\n   * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/enumerateDevices | MDN enumerateDevices}\n   */\n  requestPermissions?: boolean;\n}\n\nconst props = withDefaults(defineProps<MediaDeviceSelectProps>(), {\n  exactMatch: true,\n  requestPermissions: false,\n});\n\nconst emit = defineEmits<{\n  activeDeviceChange: [deviceId: string];\n  deviceListChange: [devices: MediaDeviceInfo[]];\n  deviceSelectError: [error: Error];\n  error: [error: Error];\n}>();\n\n// Template ref\nconst listRef = ref<HTMLUListElement>();\n\n// Get room context\nconst room = useMaybeRoomContext();\n\n// Previous active device ID tracking\nconst previousActiveDeviceId = ref<string>('default');\n\n// Error handler\nconst handleError = (e: Error) => {\n  if (room?.value) {\n    // awkwardly emit the event from outside of the room, as we don't have other means to raise a MediaDeviceError\n    room.value.emit(RoomEvent.MediaDevicesError, e);\n  }\n  emit('error', e);\n};\n\n// Use media device select hook\nconst { devices, activeDeviceId, setActiveMediaDevice, className } = useMediaDeviceSelect({\n  kind: props.kind,\n  room,\n  track: props.track,\n  requestPermissions: props.requestPermissions,\n  onError: handleError,\n});\n\n// Computed properties\nconst hasDefault = computed(\n  () => !!devices.value.find((info) => info.label.toLowerCase().startsWith('default')),\n);\n\n// Methods\nconst isActive = (deviceId: string, activeDeviceId: string, index: number) => {\n  return (\n    deviceId === activeDeviceId ||\n    (!hasDefault.value && index === 0 && activeDeviceId === 'default')\n  );\n};\n\nconst handleActiveDeviceChange = async (deviceId: string) => {\n  try {\n    await setActiveMediaDevice(deviceId, { exact: props.exactMatch });\n  } catch (e) {\n    if (e instanceof Error) {\n      emit('deviceSelectError', e);\n    } else {\n      throw e;\n    }\n  }\n};\n\nonMounted(() => {\n  if (props.initialSelection !== undefined) {\n    setActiveMediaDevice(props.initialSelection);\n  }\n});\n\n// Watchers\nwatch(\n  devices,\n  (newDevices) => {\n    emit('deviceListChange', newDevices);\n  },\n  { immediate: true },\n);\n\nwatch(\n  activeDeviceId,\n  (newActiveDeviceId) => {\n    if (newActiveDeviceId !== previousActiveDeviceId.value) {\n      emit('activeDeviceChange', newActiveDeviceId);\n    }\n    previousActiveDeviceId.value = newActiveDeviceId;\n  },\n  { immediate: true },\n);\n</script>\n\n<style scoped>\n.lk-list {\n  list-style: none;\n  padding: 0;\n  margin: 0;\n}\n\n.lk-list li {\n  padding: 4px 0;\n}\n\n.lk-list li[data-lk-active='true'] {\n  font-weight: bold;\n  background-color: rgba(0, 0, 0, 0.05);\n}\n\n.lk-button {\n  width: 100%;\n  text-align: left;\n  background: none;\n  border: none;\n  cursor: pointer;\n  padding: 8px 12px;\n}\n\n.lk-button:hover {\n  background-color: rgba(0, 0, 0, 0.05);\n}\n</style>\n","<template>\n  <v-menu>\n    <template v-slot:activator=\"{ props }\">\n      <slot name=\"activator\" :props=\"props\">\n        <v-btn v-bind=\"props\">Device Change</v-btn>\n      </slot>\n    </template>\n    <v-list>\n      <template v-if=\"kind\">\n        <MediaDeviceSelect\n          :initial-selection=\"initialSelection\"\n          :kind=\"kind\"\n          :track=\"tracks?.[kind]\"\n          :request-permissions=\"needPermissions\"\n          @active-device-change=\"(deviceId: string) => handleActiveDeviceChange(kind!, deviceId)\"\n          @device-list-change=\"setDevices\"\n        />\n      </template>\n\n      <template v-else>\n        <v-list-subheader>Audio inputs</v-list-subheader>\n        <MediaDeviceSelect\n          kind=\"audioinput\"\n          :track=\"tracks?.audioinput\"\n          :request-permissions=\"needPermissions\"\n          @active-device-change=\"\n            (deviceId: string) => handleActiveDeviceChange('audioinput', deviceId)\n          \"\n          @device-list-change=\"setDevices\"\n        />\n\n        <v-list-subheader>Video inputs</v-list-subheader>\n        <MediaDeviceSelect\n          kind=\"videoinput\"\n          :track=\"tracks?.videoinput\"\n          :request-permissions=\"needPermissions\"\n          @active-device-change=\"\n            (deviceId: string) => handleActiveDeviceChange('videoinput', deviceId)\n          \"\n          @device-list-change=\"setDevices\"\n        />\n      </template>\n    </v-list>\n  </v-menu>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref } from 'vue';\nimport { log } from '@livekit/components-core';\nimport MediaDeviceSelect from './controls/MediaDeviceSelect.vue';\nimport type { LocalAudioTrack, LocalVideoTrack } from 'livekit-client';\n\nexport interface MediaDeviceMenuProps {\n  kind?: MediaDeviceKind;\n  initialSelection?: string;\n  tracks?: Partial<Record<MediaDeviceKind, LocalAudioTrack | LocalVideoTrack | undefined>>;\n  /**\n   * this will call getUserMedia if the permissions are not yet given to enumerate the devices with device labels.\n   * in some browsers multiple calls to getUserMedia result in multiple permission prompts.\n   * It's generally advised only flip this to true, once a (preview) track has been acquired successfully with the\n   * appropriate permissions.\n   *\n   * @see {@link PreJoin}\n   * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/enumerateDevices | MDN enumerateDevices}\n   */\n  requestPermissions?: boolean;\n  disabled?: boolean;\n}\n\nconst props = withDefaults(defineProps<MediaDeviceMenuProps>(), {\n  requestPermissions: false,\n  disabled: false,\n});\n\nconst emit = defineEmits<{\n  activeDeviceChange: [kind: MediaDeviceKind, deviceId: string];\n}>();\n\n// Reactive state\nconst devices = ref<MediaDeviceInfo[]>([]);\nconst needPermissions = ref(props.requestPermissions);\n\n// Methods\nconst handleActiveDeviceChange = (kind: MediaDeviceKind, deviceId: string) => {\n  log.debug('handle device change');\n  emit('activeDeviceChange', kind, deviceId);\n};\n\nconst setDevices = (newDevices: MediaDeviceInfo[]) => {\n  devices.value = newDevices;\n};\n</script>\n\n<style scoped></style>\n","import type { TrackReference, TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport {\n  inject,\n  MaybeRef,\n  provide,\n  computed,\n  shallowRef,\n  toValue,\n  type InjectionKey,\n  type ShallowRef,\n} from 'vue';\n\nexport type TrackRefContext = ShallowRef<TrackReferenceOrPlaceholder | undefined>;\n\nconst TrackRefContextKey: InjectionKey<TrackRefContext> = Symbol('livekit-track-ref-context');\n\nfunction useProvideTrackRefContext(\n  ref: TrackReference | TrackReferenceOrPlaceholder,\n): TrackRefContext {\n  const context = shallowRef<TrackReferenceOrPlaceholder | undefined>(ref);\n  provide(TrackRefContextKey, context);\n  return context;\n}\n\nfunction useTrackRefContextRaw(): TrackRefContext | undefined {\n  return inject(TrackRefContextKey, undefined);\n}\n\nexport { useProvideTrackRefContext, useTrackRefContextRaw };\n\nexport function useMaybeTrackRefContext(): TrackRefContext | undefined {\n  try {\n    return useTrackRefContextRaw();\n  } catch {\n    return undefined;\n  }\n}\n\nexport function useTrackRefContext(): TrackRefContext {\n  const context = useMaybeTrackRefContext();\n\n  if (!context) {\n    throw new Error('Please call `useProvideTrackRefContext` on the appropriate parent component');\n  }\n\n  return context;\n}\n\nexport function useEnsureTrackRef(trackRef?: MaybeRef<TrackReferenceOrPlaceholder>) {\n  const ctx = useMaybeTrackRefContext();\n  const ref = computed(() => toValue(trackRef) ?? toValue(ctx));\n  if (!ref.value) {\n    throw new Error(\n      'No TrackRef, make sure you are inside a TrackRefContext or pass the TrackRef explicitly',\n    );\n  }\n  return ref as ShallowRef<TrackReferenceOrPlaceholder>;\n}\n","<template>\n  <video ref=\"mediaEl\" v-bind=\"elementProps\" muted @click=\"clickHandler\"></video>\n</template>\n\n<script lang=\"ts\" setup>\nimport { ref, watch, toValue, PropType } from 'vue';\nimport { useEnsureTrackRef } from '../../composables/useTrackRefContext';\nimport { useDebounce } from '../../composables/useDebounce';\nimport { useElementVisibility } from '../../composables/useElementVisibility';\nimport { RemoteTrackPublication } from 'livekit-client';\nimport { useMediaTrackBySourceOrName } from '../../composables/useMediaTrackBySourceOrName';\nimport type { TrackReference } from '@livekit/components-core';\n\nconst props = defineProps({\n  trackRef: {\n    type: Object as PropType<TrackReference>,\n    required: false,\n  },\n  manageSubscription: {\n    type: Boolean,\n    required: false,\n    default: true,\n  },\n});\n\nconst emit = defineEmits(['subscriptionStatusChanged', 'click', 'trackClick']);\n\nconst mediaEl = ref(null);\n\nconst trackRef = useEnsureTrackRef(props.trackRef);\nconst isVisible = useElementVisibility(mediaEl);\nconst debouncedIsVisible = useDebounce(isVisible, 3000);\n\nwatch(\n  [debouncedIsVisible, isVisible, () => toValue(trackRef), () => props.manageSubscription],\n  ([debounced, visible, trackRef, manage]) => {\n    if (manage && trackRef?.publication instanceof RemoteTrackPublication) {\n      if (debounced === false && visible === false) {\n        trackRef.publication.setSubscribed(false);\n      } else if (visible === true) {\n        trackRef.publication.setSubscribed(true);\n      }\n    }\n  },\n);\n\nconst {\n  elementProps,\n  publication: pub,\n  isSubscribed,\n} = useMediaTrackBySourceOrName(trackRef, {\n  element: mediaEl,\n  props,\n});\n\nwatch(isSubscribed, (subscribed) => {\n  emit('subscriptionStatusChanged', !!subscribed);\n});\n\nconst clickHandler = (evt: any) => {\n  emit('click', evt);\n  emit('trackClick', {\n    participant: trackRef.value?.participant,\n    track: pub.value,\n  });\n};\n</script>\n","import { ref, computed, watchEffect, toValue, type Ref, type MaybeRef } from 'vue';\nimport type { AgentState } from './useVoiceAssistant';\n\nexport const generateListeningSequenceBar = (columns: number): number[][] => {\n  const center = Math.floor(columns / 2);\n  const noIndex = -1;\n\n  return [[center], [noIndex]];\n};\n\nexport const generateConnectingSequenceBar = (columns: number): number[][] => {\n  const seq = [];\n\n  for (let x = 0; x < columns; x++) {\n    seq.push([x, columns - 1 - x]);\n  }\n\n  return seq;\n};\n\nexport const useBarAnimator = (\n  state: MaybeRef<AgentState | undefined>,\n  columns: MaybeRef<number>,\n  interval: MaybeRef<number>,\n): Ref<number[]> => {\n  const index = ref(0);\n  const sequence = ref<number[][]>([[]]);\n\n  watchEffect(() => {\n    const currentState = toValue(state);\n    const currentColumns = toValue(columns);\n\n    if (currentState === 'thinking') {\n      sequence.value = generateListeningSequenceBar(currentColumns);\n    } else if (currentState === 'connecting' || currentState === 'initializing') {\n      const s = [...generateConnectingSequenceBar(currentColumns)];\n      sequence.value = s;\n    } else if (currentState === 'listening') {\n      sequence.value = generateListeningSequenceBar(currentColumns);\n    } else if (currentState === undefined || currentState === 'speaking') {\n      sequence.value = [new Array(currentColumns).fill(0).map((_, idx) => idx)];\n    } else {\n      sequence.value = [[]];\n    }\n    index.value = 0;\n  });\n\n  watchEffect((onCleanup) => {\n    const currentInterval = toValue(interval);\n\n    let startTime = performance.now();\n\n    const animate = (time: DOMHighResTimeStamp) => {\n      const timeElapsed = time - startTime;\n\n      if (timeElapsed >= currentInterval) {\n        index.value = index.value + 1;\n        startTime = time;\n      }\n\n      animationFrame = requestAnimationFrame(animate);\n    };\n\n    let animationFrame = requestAnimationFrame(animate);\n\n    onCleanup(() => {\n      cancelAnimationFrame(animationFrame);\n    });\n  });\n\n  const currentSequence = computed(() => {\n    const seq = sequence.value;\n    if (seq.length > 0) {\n      return seq[index.value % seq.length] || [];\n    }\n    return [];\n  });\n\n  return currentSequence;\n};\n","<script lang=\"ts\" setup>\nimport { toRef, computed, reactive } from 'vue';\nimport type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { useMaybeTrackRefContext } from '../../composables/useTrackRefContext';\nimport { useBarAnimator } from '../../composables/useBarAnimator';\nimport { useMultibandTrackVolume } from '../../composables/useTrackVolume';\nimport type { AgentState } from '../../composables/useVoiceAssistant';\n\nexport interface BarVisualizerOptions {\n  maxHeight?: number;\n  minHeight?: number;\n}\n\nexport interface BarVisualizerProps {\n  state?: AgentState;\n  barCount?: number;\n  trackRef?: TrackReferenceOrPlaceholder;\n  options?: BarVisualizerOptions;\n}\n\nconst sequencerIntervals = new Map<AgentState, number>([\n  ['connecting', 2000],\n  ['initializing', 2000],\n  ['listening', 500],\n  ['thinking', 150],\n]);\n\nconst props = withDefaults(defineProps<BarVisualizerProps>(), {\n  barCount: 15,\n  options: () => ({ minHeight: 20, maxHeight: 100 }),\n});\n\nconst getSequencerInterval = (\n  state: AgentState | undefined,\n  barCount: number,\n): number | undefined => {\n  if (state === undefined) {\n    return 1000;\n  }\n  let interval = sequencerIntervals.get(state);\n  if (interval) {\n    switch (state) {\n      case 'connecting':\n        // case 'thinking':\n        interval /= barCount;\n        break;\n\n      default:\n        break;\n    }\n  }\n  return interval;\n};\n\nconst trackRef = toRef(() => props.trackRef);\nconst state = toRef(() => props.state);\nconst barCount = toRef(() => props.barCount);\nconst minHeight = toRef(() => props.options?.minHeight ?? 20);\nconst maxHeight = toRef(() => props.options?.maxHeight ?? 100);\n\nconst trackReference = computed(() => trackRef.value ?? useMaybeTrackRefContext()?.value);\n\nconst trackVolumeOptions = reactive({\n  bands: barCount,\n  loPass: 100,\n  hiPass: 200,\n});\n\nconst volumeBands = useMultibandTrackVolume(trackReference, trackVolumeOptions);\n\nconst animatorInterval = computed(() => getSequencerInterval(state.value, barCount.value) ?? 100);\n\nconst highlightedIndices = useBarAnimator(state, barCount, animatorInterval);\n</script>\n\n<template>\n  <div :data-lk-va-state=\"state\" class=\"lk-audio-bar-visualizer\">\n    <template v-for=\"(volume, idx) in volumeBands\" :key=\"idx\">\n      <slot\n        v-if=\"$slots.default\"\n        :data-lk-highlighted=\"highlightedIndices.includes(idx)\"\n        :data-lk-bar-index=\"idx\"\n        :style=\"{\n          height: `${Math.min(maxHeight, Math.max(minHeight, volume * 100 + 5))}%`,\n        }\"\n        :class=\"'lk-audio-bar'\"\n      />\n      <span\n        v-else\n        :data-lk-highlighted=\"highlightedIndices.includes(idx)\"\n        :data-lk-bar-index=\"idx\"\n        :class=\"['lk-audio-bar', { 'lk-highlighted': highlightedIndices.includes(idx) }]\"\n        :style=\"{\n          // TODO transform animations would be more performant, however the border-radius gets distorted when using scale transforms. a 9-slice approach (or 3 in this case) could work\n          // transform: `scale(1, ${Math.min(maxHeight, Math.max(minHeight, volume))}`,\n          height: `${Math.min(maxHeight, Math.max(minHeight, volume * 100 + 5))}%`,\n        }\"\n      />\n    </template>\n  </div>\n</template>\n\n<style>\n:root {\n  --lk-theme-color: #06b6d4;\n  --lk-va-bar-gap: 20px;\n  --lk-va-bar-width: 30px;\n  --lk-va-bar-border-radius: 32px;\n  --lk-fg: var(--lk-theme-color);\n  --lk-drop-shadow: var(--lk-theme-color) 0px 0px 18px;\n  --lk-va-bar-bg: hsla(0, 0%, 53%, 0.2);\n  --lk-bg: transparent;\n  --lk-bg-control: transparent;\n  --lk-accent-bg: var(--lk-theme-color);\n}\n\n.lk-audio-visualizer {\n  width: 100%;\n  height: 100%;\n  min-height: 160px;\n  background: var(--lk-bg-control);\n  aspect-ratio: 16/9;\n  border-radius: 0.5rem;\n  display: flex;\n  justify-content: space-around;\n  align-items: center;\n}\n\n.lk-audio-visualizer > rect {\n  fill: var(--lk-accent-bg);\n  transition: transform 0.1s cubic-bezier(0.19, 0.02, 0.09, 1);\n}\n\n.lk-audio-visualizer > path {\n  stroke: var(--lk-accent-bg);\n  transition: 0.1s cubic-bezier(0.19, 0.02, 0.09, 1);\n}\n\n.lk-audio-bar-visualizer {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  width: 100%;\n  height: 100%;\n  background: var(--lk-bg);\n  gap: var(--lk-va-bar-gap, 24px);\n}\n\n.lk-audio-bar-visualizer > .lk-audio-bar {\n  transform-origin: 'center';\n  height: 100%;\n  width: var(--lk-va-bar-width, 12px);\n  border-radius: var(--lk-va-bar-border-radius, 32px);\n  background-color: var(--lk-va-bar-bg, hsla(0, 0%, 53%, 0.2));\n  transition: background-color 0.25s ease-out;\n}\n\n.lk-audio-bar-visualizer > .lk-audio-bar.lk-highlighted,\n.lk-audio-bar-visualizer > [data-lk-highlighted='true'],\n.lk-audio-bar-visualizer[data-lk-va-state='speaking'] > .lk-audio-bar {\n  background-color: var(--lk-fg, #888);\n  transition: none;\n}\n\n.lk-audio-bar-visualizer[data-lk-va-state='thinking'] {\n  transition: background-color 0.15s ease-out;\n}\n</style>\n"],"names":["LiveKitRoomProvider","defineComponent","props","slots","room","toRef","useProvideRoomContext","_a","__props","emit","__emit","useLiveKitRoom","reason","error","failure","kind","_openBlock","_createElementBlock","$attrs","_unref","_createBlock","_renderSlot","_ctx","useMediaTrackBySourceOrName","observerOptions","options","publication","shallowRef","getTrackByIdentifier","toValue","isMuted","computed","isSubscribed","track","orientation","pub","mediaTrackSetup","setupMediaTrack","className","trackObserver","watch","obs","_oldObs","onCleanup","subscription","log","newTrack","newEl","oldTrack","oldEl","elementProps","mergeProps","mediaEl","ref","trackRef","volume","RemoteAudioTrack","muted","RemoteTrackPublication","_mergeProps","tracks","useTracks","Track","filteredTracks","_hoisted_1","_Fragment","_renderList","AudioTrack","getTrackReferenceId","listRef","useMaybeRoomContext","previousActiveDeviceId","handleError","e","RoomEvent","devices","activeDeviceId","setActiveMediaDevice","useMediaDeviceSelect","hasDefault","info","isActive","deviceId","index","handleActiveDeviceChange","onMounted","newDevices","newActiveDeviceId","_component_v_list","device","_component_v_list_item","$event","_component_v_icon","_createVNode","_component_v_list_item_title","_createTextVNode","_toDisplayString","_component_v_list_item_subtitle","_cache","needPermissions","setDevices","_component_v_menu","_withCtx","_component_v_btn","MediaDeviceSelect","_component_v_list_subheader","_b","_c","TrackRefContextKey","useTrackRefContextRaw","inject","useMaybeTrackRefContext","useEnsureTrackRef","ctx","isVisible","useElementVisibility","debouncedIsVisible","useDebounce","debounced","visible","manage","subscribed","clickHandler","evt","generateListeningSequenceBar","columns","generateConnectingSequenceBar","seq","x","useBarAnimator","state","interval","sequence","watchEffect","currentState","currentColumns","s","_","idx","currentInterval","startTime","animate","time","animationFrame","sequencerIntervals","getSequencerInterval","barCount","minHeight","maxHeight","trackReference","trackVolumeOptions","reactive","volumeBands","useMultibandTrackVolume","animatorInterval","highlightedIndices","$slots","_normalizeStyle","_normalizeClass"],"mappings":"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"}