{"version":3,"file":"prefabs.mjs","sources":["../src/prefabs/Chat.tsx","../src/prefabs/MediaDeviceMenu.tsx","../src/hooks/useWarnAboutMissingStyles.ts","../src/prefabs/PreJoin.tsx","../src/hooks/useSettingsToggle.ts","../src/components/controls/SettingsMenuToggle.tsx","../src/prefabs/ControlBar.tsx","../src/prefabs/VideoConference.tsx","../src/prefabs/AudioConference.tsx","../src/prefabs/VoiceAssistantControlBar.tsx"],"sourcesContent":["import { type ChatMessage, type ChatOptions } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useMaybeLayoutContext } from '../context';\nimport { cloneSingleChild } from '../utils';\nimport type { MessageFormatter } from '../components/ChatEntry';\nimport { ChatEntry } from '../components/ChatEntry';\nimport { useChat } from '../hooks/useChat';\nimport { ChatToggle } from '../components';\nimport ChatCloseIcon from '../assets/icons/ChatCloseIcon';\n\n/** @public */\nexport interface ChatProps extends React.HTMLAttributes<HTMLDivElement>, ChatOptions {\n  messageFormatter?: MessageFormatter;\n}\n\n/**\n * The Chat component provides ready-to-use chat functionality in a LiveKit room.\n * Messages are distributed to all participants in the room in real-time.\n *\n * @remarks\n * - Only users who are in the room at the time of dispatch will receive messages\n * - Message history is not persisted between sessions\n * - Requires `@livekit/components-styles` to be imported for styling\n *\n * @example\n * ```tsx\n * import '@livekit/components-styles';\n *\n * function Room() {\n *   return (\n *     <LiveKitRoom data-lk-theme=\"default\">\n *       <Chat />\n *     </LiveKitRoom>\n *   );\n * }\n * ```\n *\n * For custom styling, refer to: https://docs.livekit.io/reference/components/react/concepts/style-components/\n *\n * @public\n */\nexport function Chat({\n  messageFormatter,\n  messageDecoder,\n  messageEncoder,\n  channelTopic,\n  ...props\n}: ChatProps) {\n  const ulRef = React.useRef<HTMLUListElement>(null);\n  const inputRef = React.useRef<HTMLInputElement>(null);\n\n  const chatOptions: ChatOptions = React.useMemo(() => {\n    return { messageDecoder, messageEncoder, channelTopic };\n  }, [messageDecoder, messageEncoder, channelTopic]);\n\n  const { chatMessages, send, isSending } = useChat(chatOptions);\n\n  const layoutContext = useMaybeLayoutContext();\n  const lastReadMsgAt = React.useRef<ChatMessage['timestamp']>(0);\n\n  async function handleSubmit(event: React.FormEvent) {\n    event.preventDefault();\n    if (inputRef.current && inputRef.current.value.trim() !== '') {\n      await send(inputRef.current.value);\n      inputRef.current.value = '';\n      inputRef.current.focus();\n    }\n  }\n\n  React.useEffect(() => {\n    if (ulRef) {\n      ulRef.current?.scrollTo({ top: ulRef.current.scrollHeight });\n    }\n  }, [ulRef, chatMessages]);\n\n  React.useEffect(() => {\n    if (!layoutContext || chatMessages.length === 0) {\n      return;\n    }\n\n    if (\n      layoutContext.widget.state?.showChat &&\n      chatMessages.length > 0 &&\n      lastReadMsgAt.current !== chatMessages[chatMessages.length - 1]?.timestamp\n    ) {\n      lastReadMsgAt.current = chatMessages[chatMessages.length - 1]?.timestamp;\n      return;\n    }\n\n    const unreadMessageCount = chatMessages.filter(\n      (msg) => !lastReadMsgAt.current || msg.timestamp > lastReadMsgAt.current,\n    ).length;\n\n    const { widget } = layoutContext;\n    if (unreadMessageCount > 0 && widget.state?.unreadMessages !== unreadMessageCount) {\n      widget.dispatch?.({ msg: 'unread_msg', count: unreadMessageCount });\n    }\n  }, [chatMessages, layoutContext?.widget]);\n\n  return (\n    <div {...props} className=\"lk-chat\">\n      <div className=\"lk-chat-header\">\n        Messages\n        {layoutContext && (\n          <ChatToggle className=\"lk-close-button\">\n            <ChatCloseIcon />\n          </ChatToggle>\n        )}\n      </div>\n\n      <ul className=\"lk-list lk-chat-messages\" ref={ulRef}>\n        {props.children\n          ? chatMessages.map((msg, idx) =>\n              cloneSingleChild(props.children, {\n                entry: msg,\n                key: msg.id ?? idx,\n                messageFormatter,\n              }),\n            )\n          : chatMessages.map((msg, idx, allMsg) => {\n              const hideName = idx >= 1 && allMsg[idx - 1].from === msg.from;\n              // If the time delta between two messages is bigger than 60s show timestamp.\n              const hideTimestamp = idx >= 1 && msg.timestamp - allMsg[idx - 1].timestamp < 60_000;\n\n              return (\n                <ChatEntry\n                  key={msg.id ?? idx}\n                  hideName={hideName}\n                  hideTimestamp={hideName === false ? false : hideTimestamp} // If we show the name always show the timestamp as well.\n                  entry={msg}\n                  messageFormatter={messageFormatter}\n                />\n              );\n            })}\n      </ul>\n      <form className=\"lk-chat-form\" onSubmit={handleSubmit}>\n        <input\n          className=\"lk-form-control lk-chat-form-input\"\n          disabled={isSending}\n          ref={inputRef}\n          type=\"text\"\n          placeholder=\"Enter a message...\"\n          onInput={(ev) => ev.stopPropagation()}\n          onKeyDown={(ev) => ev.stopPropagation()}\n          onKeyUp={(ev) => ev.stopPropagation()}\n        />\n        <button type=\"submit\" className=\"lk-button lk-chat-form-button\" disabled={isSending}>\n          Send\n        </button>\n      </form>\n    </div>\n  );\n}\n","import { computeMenuPosition, wasClickOutside, log } from '@livekit/components-core';\nimport * as React from 'react';\nimport { MediaDeviceSelect } from '../components/controls/MediaDeviceSelect';\nimport type { LocalAudioTrack, LocalVideoTrack } from 'livekit-client';\n\n/** @public */\nexport interface MediaDeviceMenuProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n  kind?: MediaDeviceKind;\n  initialSelection?: string;\n  onActiveDeviceChange?: (kind: MediaDeviceKind, deviceId: string) => void;\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}\n\n/**\n * The `MediaDeviceMenu` component is a button that opens a menu that lists\n * all media devices and allows the user to select them.\n *\n * @remarks\n * This component is implemented with the `MediaDeviceSelect` LiveKit components.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n *   <MediaDeviceMenu />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport function MediaDeviceMenu({\n  kind,\n  initialSelection,\n  onActiveDeviceChange,\n  tracks,\n  requestPermissions = false,\n  ...props\n}: MediaDeviceMenuProps) {\n  const [isOpen, setIsOpen] = React.useState(false);\n  const [devices, setDevices] = React.useState<MediaDeviceInfo[]>([]);\n  const [updateRequired, setUpdateRequired] = React.useState<boolean>(true);\n  const [needPermissions, setNeedPermissions] = React.useState(requestPermissions);\n\n  const handleActiveDeviceChange = (kind: MediaDeviceKind, deviceId: string) => {\n    log.debug('handle device change');\n    setIsOpen(false);\n    onActiveDeviceChange?.(kind, deviceId);\n  };\n\n  const button = React.useRef<HTMLButtonElement>(null);\n  const tooltip = React.useRef<HTMLDivElement>(null);\n\n  React.useLayoutEffect(() => {\n    if (isOpen) {\n      setNeedPermissions(true);\n    }\n  }, [isOpen]);\n\n  React.useLayoutEffect(() => {\n    let cleanup: ReturnType<typeof computeMenuPosition> | undefined;\n    if (button.current && tooltip.current && (devices || updateRequired)) {\n      cleanup = computeMenuPosition(button.current, tooltip.current, (x, y) => {\n        if (tooltip.current) {\n          Object.assign(tooltip.current.style, { left: `${x}px`, top: `${y}px` });\n        }\n      });\n    }\n    setUpdateRequired(false);\n    return () => {\n      cleanup?.();\n    };\n  }, [button, tooltip, devices, updateRequired]);\n\n  const handleClickOutside = React.useCallback(\n    (event: MouseEvent) => {\n      if (!tooltip.current) {\n        return;\n      }\n      if (event.target === button.current) {\n        return;\n      }\n      if (isOpen && wasClickOutside(tooltip.current, event)) {\n        setIsOpen(false);\n      }\n    },\n    [isOpen, tooltip, button],\n  );\n\n  React.useEffect(() => {\n    document.addEventListener<'click'>('click', handleClickOutside);\n    return () => {\n      document.removeEventListener<'click'>('click', handleClickOutside);\n    };\n  }, [handleClickOutside]);\n\n  return (\n    <>\n      <button\n        className=\"lk-button lk-button-menu\"\n        aria-pressed={isOpen}\n        {...props}\n        onClick={() => setIsOpen(!isOpen)}\n        ref={button}\n      >\n        {props.children}\n      </button>\n      {/** only render when enabled in order to make sure that the permissions are requested only if the menu is enabled */}\n      {!props.disabled && (\n        <div\n          className=\"lk-device-menu\"\n          ref={tooltip}\n          style={{ visibility: isOpen ? 'visible' : 'hidden' }}\n        >\n          {kind ? (\n            <MediaDeviceSelect\n              initialSelection={initialSelection}\n              onActiveDeviceChange={(deviceId) => handleActiveDeviceChange(kind, deviceId)}\n              onDeviceListChange={setDevices}\n              kind={kind}\n              track={tracks?.[kind]}\n              requestPermissions={needPermissions}\n            />\n          ) : (\n            <>\n              <div className=\"lk-device-menu-heading\">Audio inputs</div>\n              <MediaDeviceSelect\n                kind=\"audioinput\"\n                onActiveDeviceChange={(deviceId) =>\n                  handleActiveDeviceChange('audioinput', deviceId)\n                }\n                onDeviceListChange={setDevices}\n                track={tracks?.audioinput}\n                requestPermissions={needPermissions}\n              />\n              <div className=\"lk-device-menu-heading\">Video inputs</div>\n              <MediaDeviceSelect\n                kind=\"videoinput\"\n                onActiveDeviceChange={(deviceId) =>\n                  handleActiveDeviceChange('videoinput', deviceId)\n                }\n                onDeviceListChange={setDevices}\n                track={tracks?.videoinput}\n                requestPermissions={needPermissions}\n              />\n            </>\n          )}\n        </div>\n      )}\n    </>\n  );\n}\n","import * as React from 'react';\nimport { warnAboutMissingStyles } from '../utils';\n\n/**\n * @internal\n */\nexport function useWarnAboutMissingStyles() {\n  React.useEffect(() => {\n    warnAboutMissingStyles();\n  }, []);\n}\n","import type {\n  CreateLocalTracksOptions,\n  LocalAudioTrack,\n  LocalVideoTrack,\n  TrackProcessor,\n} from 'livekit-client';\nimport {\n  createLocalAudioTrack,\n  createLocalTracks,\n  createLocalVideoTrack,\n  facingModeFromLocalTrack,\n  Track,\n  VideoPresets,\n  Mutex,\n} from 'livekit-client';\nimport * as React from 'react';\nimport { MediaDeviceMenu } from './MediaDeviceMenu';\nimport { TrackToggle } from '../components/controls/TrackToggle';\nimport type { LocalUserChoices } from '@livekit/components-core';\nimport { log } from '@livekit/components-core';\nimport { ParticipantPlaceholder } from '../assets/images';\nimport { useMediaDevices, usePersistentUserChoices } from '../hooks';\nimport { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';\nimport { roomOptionsStringifyReplacer } from '../utils';\n\n/**\n * Props for the PreJoin component.\n * @public\n */\nexport interface PreJoinProps\n  extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSubmit' | 'onError'> {\n  /** This function is called with the `LocalUserChoices` if validation is passed. */\n  onSubmit?: (values: LocalUserChoices) => void;\n  /**\n   * Provide your custom validation function. Only if validation is successful the user choices are past to the onSubmit callback.\n   */\n  onValidate?: (values: LocalUserChoices) => boolean;\n  onError?: (error: Error) => void;\n  /** Prefill the input form with initial values. */\n  defaults?: Partial<LocalUserChoices>;\n  /** Display a debug window for your convenience. */\n  debug?: boolean;\n  joinLabel?: string;\n  micLabel?: string;\n  camLabel?: string;\n  userLabel?: string;\n  /**\n   * If true, user choices are persisted across sessions.\n   * @defaultValue true\n   * @alpha\n   */\n  persistUserChoices?: boolean;\n  videoProcessor?: TrackProcessor<Track.Kind.Video>;\n}\n\n/** @public */\nexport function usePreviewTracks(\n  options: CreateLocalTracksOptions,\n  onError?: (err: Error) => void,\n) {\n  const [tracks, setTracks] = React.useState<Array<LocalAudioTrack | LocalVideoTrack>>();\n\n  const trackLock = React.useMemo(() => new Mutex(), []);\n\n  React.useEffect(() => {\n    let needsCleanup = false;\n    let localTracks: Array<LocalAudioTrack | LocalVideoTrack> = [];\n    trackLock.lock().then(async (unlock) => {\n      try {\n        if (options.audio || options.video) {\n          localTracks = (await createLocalTracks(options)) as Array<\n            LocalAudioTrack | LocalVideoTrack\n          >;\n\n          if (needsCleanup) {\n            localTracks.forEach((tr) => tr.stop());\n          } else {\n            setTracks(localTracks);\n          }\n        }\n      } catch (e: unknown) {\n        if (onError && e instanceof Error) {\n          onError(e);\n        } else {\n          log.error(e);\n        }\n      } finally {\n        unlock();\n      }\n    });\n\n    return () => {\n      needsCleanup = true;\n      localTracks.forEach((track) => {\n        track.stop();\n      });\n    };\n  }, [JSON.stringify(options, roomOptionsStringifyReplacer), onError, trackLock]);\n\n  return tracks;\n}\n\n/**\n * @public\n * @deprecated use `usePreviewTracks` instead\n */\nexport function usePreviewDevice<T extends LocalVideoTrack | LocalAudioTrack>(\n  enabled: boolean,\n  deviceId: string,\n  kind: 'videoinput' | 'audioinput',\n) {\n  const [deviceError, setDeviceError] = React.useState<Error | null>(null);\n  const [isCreatingTrack, setIsCreatingTrack] = React.useState<boolean>(false);\n\n  const devices = useMediaDevices({ kind });\n  const [selectedDevice, setSelectedDevice] = React.useState<MediaDeviceInfo | undefined>(\n    undefined,\n  );\n\n  const [localTrack, setLocalTrack] = React.useState<T>();\n  const [localDeviceId, setLocalDeviceId] = React.useState<string>(deviceId);\n\n  React.useEffect(() => {\n    setLocalDeviceId(deviceId);\n  }, [deviceId]);\n\n  const createTrack = async (deviceId: string, kind: 'videoinput' | 'audioinput') => {\n    try {\n      const track =\n        kind === 'videoinput'\n          ? await createLocalVideoTrack({\n              deviceId,\n              resolution: VideoPresets.h720.resolution,\n            })\n          : await createLocalAudioTrack({ deviceId });\n\n      const newDeviceId = await track.getDeviceId(false);\n      if (newDeviceId && deviceId !== newDeviceId) {\n        prevDeviceId.current = newDeviceId;\n        setLocalDeviceId(newDeviceId);\n      }\n      setLocalTrack(track as T);\n    } catch (e) {\n      if (e instanceof Error) {\n        setDeviceError(e);\n      }\n    }\n  };\n\n  const switchDevice = async (track: LocalVideoTrack | LocalAudioTrack, id: string) => {\n    await track.setDeviceId(id);\n    prevDeviceId.current = id;\n  };\n\n  const prevDeviceId = React.useRef(localDeviceId);\n\n  React.useEffect(() => {\n    if (enabled && !localTrack && !deviceError && !isCreatingTrack) {\n      log.debug('creating track', kind);\n      setIsCreatingTrack(true);\n      createTrack(localDeviceId, kind).finally(() => {\n        setIsCreatingTrack(false);\n      });\n    }\n  }, [enabled, localTrack, deviceError, isCreatingTrack]);\n\n  // switch camera device\n  React.useEffect(() => {\n    if (!localTrack) {\n      return;\n    }\n    if (!enabled) {\n      log.debug(`muting ${kind} track`);\n      localTrack.mute().then(() => log.debug(localTrack.mediaStreamTrack));\n    } else if (selectedDevice?.deviceId && prevDeviceId.current !== selectedDevice?.deviceId) {\n      log.debug(`switching ${kind} device from`, prevDeviceId.current, selectedDevice.deviceId);\n      switchDevice(localTrack, selectedDevice.deviceId);\n    } else {\n      log.debug(`unmuting local ${kind} track`);\n      localTrack.unmute();\n    }\n  }, [localTrack, selectedDevice, enabled, kind]);\n\n  React.useEffect(() => {\n    return () => {\n      if (localTrack) {\n        log.debug(`stopping local ${kind} track`);\n        localTrack.stop();\n        localTrack.mute();\n      }\n    };\n  }, []);\n\n  React.useEffect(() => {\n    setSelectedDevice(devices?.find((dev) => dev.deviceId === localDeviceId));\n  }, [localDeviceId, devices]);\n\n  return {\n    selectedDevice,\n    localTrack,\n    deviceError,\n  };\n}\n\n/**\n * The `PreJoin` prefab component is normally presented to the user before he enters a room.\n * This component allows the user to check and select the preferred media device (camera und microphone).\n * On submit the user decisions are returned, which can then be passed on to the `LiveKitRoom` so that the user enters the room with the correct media devices.\n *\n * @remarks\n * This component is independent of the `LiveKitRoom` component and should not be nested within it.\n * Because it only accesses the local media tracks this component is self-contained and works without connection to the LiveKit server.\n *\n * @example\n * ```tsx\n * <PreJoin />\n * ```\n * @public\n */\nexport function PreJoin({\n  defaults = {},\n  onValidate,\n  onSubmit,\n  onError,\n  debug,\n  joinLabel = 'Join Room',\n  micLabel = 'Microphone',\n  camLabel = 'Camera',\n  userLabel = 'Username',\n  persistUserChoices = true,\n  videoProcessor,\n  ...htmlProps\n}: PreJoinProps) {\n  const {\n    userChoices: initialUserChoices,\n    saveAudioInputDeviceId,\n    saveAudioInputEnabled,\n    saveVideoInputDeviceId,\n    saveVideoInputEnabled,\n    saveUsername,\n  } = usePersistentUserChoices({\n    defaults,\n    preventSave: !persistUserChoices,\n    preventLoad: !persistUserChoices,\n  });\n\n  const [userChoices, setUserChoices] = React.useState(initialUserChoices);\n\n  // Initialize device settings\n  const [audioEnabled, setAudioEnabled] = React.useState<boolean>(userChoices.audioEnabled);\n  const [videoEnabled, setVideoEnabled] = React.useState<boolean>(userChoices.videoEnabled);\n  const [audioDeviceId, setAudioDeviceId] = React.useState<string>(userChoices.audioDeviceId);\n  const [videoDeviceId, setVideoDeviceId] = React.useState<string>(userChoices.videoDeviceId);\n  const [username, setUsername] = React.useState(userChoices.username);\n\n  // Save user choices to persistent storage.\n  React.useEffect(() => {\n    saveAudioInputEnabled(audioEnabled);\n  }, [audioEnabled, saveAudioInputEnabled]);\n  React.useEffect(() => {\n    saveVideoInputEnabled(videoEnabled);\n  }, [videoEnabled, saveVideoInputEnabled]);\n  React.useEffect(() => {\n    saveAudioInputDeviceId(audioDeviceId);\n  }, [audioDeviceId, saveAudioInputDeviceId]);\n  React.useEffect(() => {\n    saveVideoInputDeviceId(videoDeviceId);\n  }, [videoDeviceId, saveVideoInputDeviceId]);\n  React.useEffect(() => {\n    saveUsername(username);\n  }, [username, saveUsername]);\n\n  const tracks = usePreviewTracks(\n    {\n      audio: audioEnabled ? { deviceId: initialUserChoices.audioDeviceId } : false,\n      video: videoEnabled\n        ? { deviceId: initialUserChoices.videoDeviceId, processor: videoProcessor }\n        : false,\n    },\n    onError,\n  );\n\n  const videoEl = React.useRef(null);\n\n  const videoTrack = React.useMemo(\n    () => tracks?.filter((track) => track.kind === Track.Kind.Video)[0] as LocalVideoTrack,\n    [tracks],\n  );\n\n  const facingMode = React.useMemo(() => {\n    if (videoTrack) {\n      const { facingMode } = facingModeFromLocalTrack(videoTrack);\n      return facingMode;\n    } else {\n      return 'undefined';\n    }\n  }, [videoTrack]);\n\n  const audioTrack = React.useMemo(\n    () => tracks?.filter((track) => track.kind === Track.Kind.Audio)[0] as LocalAudioTrack,\n    [tracks],\n  );\n\n  React.useEffect(() => {\n    if (videoEl.current && videoTrack) {\n      videoTrack.unmute();\n      videoTrack.attach(videoEl.current);\n    }\n\n    return () => {\n      videoTrack?.detach();\n    };\n  }, [videoTrack]);\n\n  const [isValid, setIsValid] = React.useState<boolean>();\n\n  const handleValidation = React.useCallback(\n    (values: LocalUserChoices) => {\n      if (typeof onValidate === 'function') {\n        return onValidate(values);\n      } else {\n        return values.username !== '';\n      }\n    },\n    [onValidate],\n  );\n\n  React.useEffect(() => {\n    const newUserChoices = {\n      username,\n      videoEnabled,\n      videoDeviceId,\n      audioEnabled,\n      audioDeviceId,\n    };\n    setUserChoices(newUserChoices);\n    setIsValid(handleValidation(newUserChoices));\n  }, [username, videoEnabled, handleValidation, audioEnabled, audioDeviceId, videoDeviceId]);\n\n  function handleSubmit(event: React.FormEvent) {\n    event.preventDefault();\n    if (handleValidation(userChoices)) {\n      if (typeof onSubmit === 'function') {\n        onSubmit(userChoices);\n      }\n    } else {\n      log.warn('Validation failed with: ', userChoices);\n    }\n  }\n\n  useWarnAboutMissingStyles();\n\n  return (\n    <div className=\"lk-prejoin\" {...htmlProps}>\n      <div className=\"lk-video-container\">\n        {videoTrack && (\n          <video ref={videoEl} width=\"1280\" height=\"720\" data-lk-facing-mode={facingMode} />\n        )}\n        {(!videoTrack || !videoEnabled) && (\n          <div className=\"lk-camera-off-note\">\n            <ParticipantPlaceholder />\n          </div>\n        )}\n      </div>\n      <div className=\"lk-button-group-container\">\n        <div className=\"lk-button-group audio\">\n          <TrackToggle\n            initialState={audioEnabled}\n            source={Track.Source.Microphone}\n            onChange={(enabled) => setAudioEnabled(enabled)}\n          >\n            {micLabel}\n          </TrackToggle>\n          <div className=\"lk-button-group-menu\">\n            <MediaDeviceMenu\n              initialSelection={audioDeviceId}\n              kind=\"audioinput\"\n              disabled={!audioTrack}\n              tracks={{ audioinput: audioTrack }}\n              onActiveDeviceChange={(_, id) => setAudioDeviceId(id)}\n            />\n          </div>\n        </div>\n        <div className=\"lk-button-group video\">\n          <TrackToggle\n            initialState={videoEnabled}\n            source={Track.Source.Camera}\n            onChange={(enabled) => setVideoEnabled(enabled)}\n          >\n            {camLabel}\n          </TrackToggle>\n          <div className=\"lk-button-group-menu\">\n            <MediaDeviceMenu\n              initialSelection={videoDeviceId}\n              kind=\"videoinput\"\n              disabled={!videoTrack}\n              tracks={{ videoinput: videoTrack }}\n              onActiveDeviceChange={(_, id) => setVideoDeviceId(id)}\n            />\n          </div>\n        </div>\n      </div>\n\n      <form className=\"lk-username-container\">\n        <input\n          className=\"lk-form-control\"\n          id=\"username\"\n          name=\"username\"\n          type=\"text\"\n          defaultValue={username}\n          placeholder={userLabel}\n          onChange={(inputEl) => setUsername(inputEl.target.value)}\n          autoComplete=\"off\"\n        />\n        <button\n          className=\"lk-button lk-join-button\"\n          type=\"submit\"\n          onClick={handleSubmit}\n          disabled={!isValid}\n        >\n          {joinLabel}\n        </button>\n      </form>\n\n      {debug && (\n        <>\n          <strong>User Choices:</strong>\n          <ul className=\"lk-list\" style={{ overflow: 'hidden', maxWidth: '15rem' }}>\n            <li>Username: {`${userChoices.username}`}</li>\n            <li>Video Enabled: {`${userChoices.videoEnabled}`}</li>\n            <li>Audio Enabled: {`${userChoices.audioEnabled}`}</li>\n            <li>Video Device: {`${userChoices.videoDeviceId}`}</li>\n            <li>Audio Device: {`${userChoices.audioDeviceId}`}</li>\n          </ul>\n        </>\n      )}\n    </div>\n  );\n}\n","import { useLayoutContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport * as React from 'react';\n\n/** @alpha */\nexport interface UseSettingsToggleProps {\n  props: React.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\n/**\n * The `useSettingsToggle` hook provides state and functions for toggling the settings menu.\n * @remarks\n * Depends on the `LayoutContext` to work properly.\n * @see {@link SettingsMenu}\n * @alpha\n */\nexport function useSettingsToggle({ props }: UseSettingsToggleProps) {\n  const { dispatch, state } = useLayoutContext().widget;\n  const className = 'lk-button lk-settings-toggle';\n\n  const mergedProps = React.useMemo(() => {\n    return mergeProps(props, {\n      className,\n      onClick: () => {\n        if (dispatch) dispatch({ msg: 'toggle_settings' });\n      },\n      'aria-pressed': state?.showSettings ? 'true' : 'false',\n    });\n  }, [props, className, dispatch, state]);\n\n  return { mergedProps };\n}\n","import * as React from 'react';\nimport { useSettingsToggle } from '../../hooks/useSettingsToggle';\n\n/** @alpha */\nexport interface SettingsMenuToggleProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\n/**\n * The `SettingsMenuToggle` component is a button that toggles the visibility of the `SettingsMenu` component.\n * @remarks\n * For the component to have any effect it has to live inside a `LayoutContext` context.\n *\n * @alpha\n */\nexport const SettingsMenuToggle: (\n  props: SettingsMenuToggleProps & React.RefAttributes<HTMLButtonElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLButtonElement, SettingsMenuToggleProps>(\n  function SettingsMenuToggle(props: SettingsMenuToggleProps, ref) {\n    const { mergedProps } = useSettingsToggle({ props });\n\n    return (\n      <button ref={ref} {...mergedProps}>\n        {props.children}\n      </button>\n    );\n  },\n);\n","import { Track } from 'livekit-client';\nimport * as React from 'react';\nimport { MediaDeviceMenu } from './MediaDeviceMenu';\nimport { DisconnectButton } from '../components/controls/DisconnectButton';\nimport { TrackToggle } from '../components/controls/TrackToggle';\nimport { ChatIcon, GearIcon, LeaveIcon } from '../assets/icons';\nimport { ChatToggle } from '../components/controls/ChatToggle';\nimport { useLocalParticipantPermissions, usePersistentUserChoices } from '../hooks';\nimport { useMediaQuery } from '../hooks/internal';\nimport { useMaybeLayoutContext } from '../context';\nimport { supportsScreenSharing } from '@livekit/components-core';\nimport { mergeProps } from '../utils';\nimport { StartMediaButton } from '../components/controls/StartMediaButton';\nimport { SettingsMenuToggle } from '../components/controls/SettingsMenuToggle';\n\n/** @public */\nexport type ControlBarControls = {\n  microphone?: boolean;\n  camera?: boolean;\n  chat?: boolean;\n  screenShare?: boolean;\n  leave?: boolean;\n  settings?: boolean;\n};\n\nconst trackSourceToProtocol = (source: Track.Source) => {\n  // NOTE: this mapping avoids importing the protocol package as that leads to a significant bundle size increase\n  switch (source) {\n    case Track.Source.Camera:\n      return 1;\n    case Track.Source.Microphone:\n      return 2;\n    case Track.Source.ScreenShare:\n      return 3;\n    default:\n      return 0;\n  }\n};\n\n/** @public */\nexport interface ControlBarProps extends React.HTMLAttributes<HTMLDivElement> {\n  onDeviceError?: (error: { source: Track.Source; error: Error }) => void;\n  variation?: 'minimal' | 'verbose' | 'textOnly';\n  controls?: ControlBarControls;\n  /**\n   * If `true`, the user's device choices will be persisted.\n   * This will enable the user to have the same device choices when they rejoin the room.\n   * @defaultValue true\n   * @alpha\n   */\n  saveUserChoices?: boolean;\n}\n\n/**\n * The `ControlBar` prefab gives the user the basic user interface to control their\n * media devices (camera, microphone and screen share), open the `Chat` and leave the room.\n *\n * @remarks\n * This component is build with other LiveKit components like `TrackToggle`,\n * `DeviceSelectorButton`, `DisconnectButton` and `StartAudio`.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n *   <ControlBar />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport function ControlBar({\n  variation,\n  controls,\n  saveUserChoices = true,\n  onDeviceError,\n  ...props\n}: ControlBarProps) {\n  const [isChatOpen, setIsChatOpen] = React.useState(false);\n  const layoutContext = useMaybeLayoutContext();\n  React.useEffect(() => {\n    if (layoutContext?.widget.state?.showChat !== undefined) {\n      setIsChatOpen(layoutContext?.widget.state?.showChat);\n    }\n  }, [layoutContext?.widget.state?.showChat]);\n  const isTooLittleSpace = useMediaQuery(`(max-width: ${isChatOpen ? 1000 : 760}px)`);\n\n  const defaultVariation = isTooLittleSpace ? 'minimal' : 'verbose';\n  variation ??= defaultVariation;\n\n  const visibleControls = { leave: true, ...controls };\n\n  const localPermissions = useLocalParticipantPermissions();\n\n  if (!localPermissions) {\n    visibleControls.camera = false;\n    visibleControls.chat = false;\n    visibleControls.microphone = false;\n    visibleControls.screenShare = false;\n  } else {\n    const canPublishSource = (source: Track.Source) => {\n      return (\n        localPermissions.canPublish &&\n        (localPermissions.canPublishSources.length === 0 ||\n          localPermissions.canPublishSources.includes(trackSourceToProtocol(source)))\n      );\n    };\n    visibleControls.camera ??= canPublishSource(Track.Source.Camera);\n    visibleControls.microphone ??= canPublishSource(Track.Source.Microphone);\n    visibleControls.screenShare ??= canPublishSource(Track.Source.ScreenShare);\n    visibleControls.chat ??= localPermissions.canPublishData && controls?.chat;\n  }\n\n  const showIcon = React.useMemo(\n    () => variation === 'minimal' || variation === 'verbose',\n    [variation],\n  );\n  const showText = React.useMemo(\n    () => variation === 'textOnly' || variation === 'verbose',\n    [variation],\n  );\n\n  const browserSupportsScreenSharing = supportsScreenSharing();\n\n  const [isScreenShareEnabled, setIsScreenShareEnabled] = React.useState(false);\n\n  const onScreenShareChange = React.useCallback(\n    (enabled: boolean) => {\n      setIsScreenShareEnabled(enabled);\n    },\n    [setIsScreenShareEnabled],\n  );\n\n  const htmlProps = mergeProps({ className: 'lk-control-bar' }, props);\n\n  const {\n    saveAudioInputEnabled,\n    saveVideoInputEnabled,\n    saveAudioInputDeviceId,\n    saveVideoInputDeviceId,\n  } = usePersistentUserChoices({ preventSave: !saveUserChoices });\n\n  const microphoneOnChange = React.useCallback(\n    (enabled: boolean, isUserInitiated: boolean) =>\n      isUserInitiated ? saveAudioInputEnabled(enabled) : null,\n    [saveAudioInputEnabled],\n  );\n\n  const cameraOnChange = React.useCallback(\n    (enabled: boolean, isUserInitiated: boolean) =>\n      isUserInitiated ? saveVideoInputEnabled(enabled) : null,\n    [saveVideoInputEnabled],\n  );\n\n  return (\n    <div {...htmlProps}>\n      {visibleControls.microphone && (\n        <div className=\"lk-button-group\">\n          <TrackToggle\n            source={Track.Source.Microphone}\n            showIcon={showIcon}\n            onChange={microphoneOnChange}\n            onDeviceError={(error) => onDeviceError?.({ source: Track.Source.Microphone, error })}\n          >\n            {showText && 'Microphone'}\n          </TrackToggle>\n          <div className=\"lk-button-group-menu\">\n            <MediaDeviceMenu\n              kind=\"audioinput\"\n              onActiveDeviceChange={(_kind, deviceId) =>\n                saveAudioInputDeviceId(deviceId ?? 'default')\n              }\n            />\n          </div>\n        </div>\n      )}\n      {visibleControls.camera && (\n        <div className=\"lk-button-group\">\n          <TrackToggle\n            source={Track.Source.Camera}\n            showIcon={showIcon}\n            onChange={cameraOnChange}\n            onDeviceError={(error) => onDeviceError?.({ source: Track.Source.Camera, error })}\n          >\n            {showText && 'Camera'}\n          </TrackToggle>\n          <div className=\"lk-button-group-menu\">\n            <MediaDeviceMenu\n              kind=\"videoinput\"\n              onActiveDeviceChange={(_kind, deviceId) =>\n                saveVideoInputDeviceId(deviceId ?? 'default')\n              }\n            />\n          </div>\n        </div>\n      )}\n      {visibleControls.screenShare && browserSupportsScreenSharing && (\n        <TrackToggle\n          source={Track.Source.ScreenShare}\n          captureOptions={{ audio: true, selfBrowserSurface: 'include' }}\n          showIcon={showIcon}\n          onChange={onScreenShareChange}\n          onDeviceError={(error) => onDeviceError?.({ source: Track.Source.ScreenShare, error })}\n        >\n          {showText && (isScreenShareEnabled ? 'Stop screen share' : 'Share screen')}\n        </TrackToggle>\n      )}\n      {visibleControls.chat && (\n        <ChatToggle>\n          {showIcon && <ChatIcon />}\n          {showText && 'Chat'}\n        </ChatToggle>\n      )}\n      {visibleControls.settings && (\n        <SettingsMenuToggle>\n          {showIcon && <GearIcon />}\n          {showText && 'Settings'}\n        </SettingsMenuToggle>\n      )}\n      {visibleControls.leave && (\n        <DisconnectButton>\n          {showIcon && <LeaveIcon />}\n          {showText && 'Leave'}\n        </DisconnectButton>\n      )}\n      <StartMediaButton />\n    </div>\n  );\n}\n","import type {\n  MessageDecoder,\n  MessageEncoder,\n  TrackReferenceOrPlaceholder,\n  WidgetState,\n} from '@livekit/components-core';\nimport { isEqualTrackRef, isTrackReference, isWeb, log } from '@livekit/components-core';\nimport { RoomEvent, Track } from 'livekit-client';\nimport * as React from 'react';\nimport type { MessageFormatter } from '../components';\nimport {\n  CarouselLayout,\n  ConnectionStateToast,\n  FocusLayout,\n  FocusLayoutContainer,\n  GridLayout,\n  LayoutContextProvider,\n  ParticipantTile,\n  RoomAudioRenderer,\n} from '../components';\nimport { useCreateLayoutContext } from '../context';\nimport { usePinnedTracks, useTracks } from '../hooks';\nimport { Chat } from './Chat';\nimport { ControlBar } from './ControlBar';\nimport { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';\n\n/**\n * @public\n */\nexport interface VideoConferenceProps extends React.HTMLAttributes<HTMLDivElement> {\n  chatMessageFormatter?: MessageFormatter;\n  chatMessageEncoder?: MessageEncoder;\n  chatMessageDecoder?: MessageDecoder;\n  /** @alpha */\n  SettingsComponent?: React.ComponentType;\n}\n\n/**\n * The `VideoConference` ready-made component is your drop-in solution for a classic video conferencing application.\n * It provides functionality such as focusing on one participant, grid view with pagination to handle large numbers\n * of participants, basic non-persistent chat, screen sharing, and more.\n *\n * @remarks\n * The component is implemented with other LiveKit components like `FocusContextProvider`,\n * `GridLayout`, `ControlBar`, `FocusLayoutContainer` and `FocusLayout`.\n * You can use these components as a starting point for your own custom video conferencing application.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n *   <VideoConference />\n * <LiveKitRoom>\n * ```\n * @public\n */\nexport function VideoConference({\n  chatMessageFormatter,\n  chatMessageDecoder,\n  chatMessageEncoder,\n  SettingsComponent,\n  ...props\n}: VideoConferenceProps) {\n  const [widgetState, setWidgetState] = React.useState<WidgetState>({\n    showChat: false,\n    unreadMessages: 0,\n    showSettings: false,\n  });\n  const lastAutoFocusedScreenShareTrack = React.useRef<TrackReferenceOrPlaceholder | null>(null);\n\n  const tracks = useTracks(\n    [\n      { source: Track.Source.Camera, withPlaceholder: true },\n      { source: Track.Source.ScreenShare, withPlaceholder: false },\n    ],\n    { updateOnlyOn: [RoomEvent.ActiveSpeakersChanged], onlySubscribed: false },\n  );\n\n  const widgetUpdate = (state: WidgetState) => {\n    log.debug('updating widget state', state);\n    setWidgetState(state);\n  };\n\n  const layoutContext = useCreateLayoutContext();\n\n  const screenShareTracks = tracks\n    .filter(isTrackReference)\n    .filter((track) => track.publication.source === Track.Source.ScreenShare);\n\n  const focusTrack = usePinnedTracks(layoutContext)?.[0];\n  const carouselTracks = tracks.filter((track) => !isEqualTrackRef(track, focusTrack));\n\n  React.useEffect(() => {\n    // If screen share tracks are published, and no pin is set explicitly, auto set the screen share.\n    if (\n      screenShareTracks.some((track) => track.publication.isSubscribed) &&\n      lastAutoFocusedScreenShareTrack.current === null\n    ) {\n      log.debug('Auto set screen share focus:', { newScreenShareTrack: screenShareTracks[0] });\n      layoutContext.pin.dispatch?.({ msg: 'set_pin', trackReference: screenShareTracks[0] });\n      lastAutoFocusedScreenShareTrack.current = screenShareTracks[0];\n    } else if (\n      lastAutoFocusedScreenShareTrack.current &&\n      !screenShareTracks.some(\n        (track) =>\n          track.publication.trackSid ===\n          lastAutoFocusedScreenShareTrack.current?.publication?.trackSid,\n      )\n    ) {\n      log.debug('Auto clearing screen share focus.');\n      layoutContext.pin.dispatch?.({ msg: 'clear_pin' });\n      lastAutoFocusedScreenShareTrack.current = null;\n    }\n    if (focusTrack && !isTrackReference(focusTrack)) {\n      const updatedFocusTrack = tracks.find(\n        (tr) =>\n          tr.participant.identity === focusTrack.participant.identity &&\n          tr.source === focusTrack.source,\n      );\n      if (updatedFocusTrack !== focusTrack && isTrackReference(updatedFocusTrack)) {\n        layoutContext.pin.dispatch?.({ msg: 'set_pin', trackReference: updatedFocusTrack });\n      }\n    }\n  }, [\n    screenShareTracks\n      .map((ref) => `${ref.publication.trackSid}_${ref.publication.isSubscribed}`)\n      .join(),\n    focusTrack?.publication?.trackSid,\n    tracks,\n  ]);\n\n  useWarnAboutMissingStyles();\n\n  return (\n    <div className=\"lk-video-conference\" {...props}>\n      {isWeb() && (\n        <LayoutContextProvider\n          value={layoutContext}\n          // onPinChange={handleFocusStateChange}\n          onWidgetChange={widgetUpdate}\n        >\n          <div className=\"lk-video-conference-inner\">\n            {!focusTrack ? (\n              <div className=\"lk-grid-layout-wrapper\">\n                <GridLayout tracks={tracks}>\n                  <ParticipantTile />\n                </GridLayout>\n              </div>\n            ) : (\n              <div className=\"lk-focus-layout-wrapper\">\n                <FocusLayoutContainer>\n                  <CarouselLayout tracks={carouselTracks}>\n                    <ParticipantTile />\n                  </CarouselLayout>\n                  {focusTrack && <FocusLayout trackRef={focusTrack} />}\n                </FocusLayoutContainer>\n              </div>\n            )}\n            <ControlBar controls={{ chat: true, settings: !!SettingsComponent }} />\n          </div>\n          <Chat\n            style={{ display: widgetState.showChat ? 'grid' : 'none' }}\n            messageFormatter={chatMessageFormatter}\n            messageEncoder={chatMessageEncoder}\n            messageDecoder={chatMessageDecoder}\n          />\n          {SettingsComponent && (\n            <div\n              className=\"lk-settings-menu-modal\"\n              style={{ display: widgetState.showSettings ? 'block' : 'none' }}\n            >\n              <SettingsComponent />\n            </div>\n          )}\n        </LayoutContextProvider>\n      )}\n      <RoomAudioRenderer />\n      <ConnectionStateToast />\n    </div>\n  );\n}\n","import * as React from 'react';\nimport { ControlBar } from './ControlBar';\n\nimport { ParticipantAudioTile } from '../components/participant/ParticipantAudioTile';\nimport { LayoutContextProvider } from '../components/layout/LayoutContextProvider';\nimport type { WidgetState } from '@livekit/components-core';\nimport { Chat } from './Chat';\nimport { TrackLoop } from '../components';\nimport { useTracks } from '../hooks';\nimport { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';\nimport { Track } from 'livekit-client';\n\n/** @public */\nexport interface AudioConferenceProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * This component is the default setup of a classic LiveKit audio conferencing app.\n * It provides functionality like switching between participant grid view and focus view.\n *\n * @remarks\n * The component is implemented with other LiveKit components like `FocusContextProvider`,\n * `GridLayout`, `ControlBar`, `FocusLayoutContainer` and `FocusLayout`.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n *   <AudioConference />\n * <LiveKitRoom>\n * ```\n * @public\n */\nexport function AudioConference({ ...props }: AudioConferenceProps) {\n  const [widgetState, setWidgetState] = React.useState<WidgetState>({\n    showChat: false,\n    unreadMessages: 0,\n  });\n\n  const audioTracks = useTracks([Track.Source.Microphone]);\n\n  useWarnAboutMissingStyles();\n\n  return (\n    <LayoutContextProvider onWidgetChange={setWidgetState}>\n      <div className=\"lk-audio-conference\" {...props}>\n        <div className=\"lk-audio-conference-stage\">\n          <TrackLoop tracks={audioTracks}>\n            <ParticipantAudioTile />\n          </TrackLoop>\n        </div>\n        <ControlBar\n          controls={{ microphone: true, screenShare: false, camera: false, chat: true }}\n        />\n        {widgetState.showChat && <Chat />}\n      </div>\n    </LayoutContextProvider>\n  );\n}\n","import { Track } from 'livekit-client';\nimport * as React from 'react';\nimport { MediaDeviceMenu } from './MediaDeviceMenu';\nimport { TrackToggle } from '../components/controls/TrackToggle';\nimport {\n  useLocalParticipant,\n  useLocalParticipantPermissions,\n  usePersistentUserChoices,\n} from '../hooks';\nimport { mergeProps } from '../utils';\nimport { StartMediaButton } from '../components/controls/StartMediaButton';\nimport { BarVisualizer, DisconnectButton } from '../components';\nimport type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\n\n/** @beta */\nexport type VoiceAssistantControlBarControls = {\n  microphone?: boolean;\n  leave?: boolean;\n};\n\n/** @beta */\nexport interface VoiceAssistantControlBarProps extends React.HTMLAttributes<HTMLDivElement> {\n  onDeviceError?: (error: { source: Track.Source; error: Error }) => void;\n  controls?: VoiceAssistantControlBarControls;\n  /**\n   * If `true`, the user's device choices will be persisted.\n   * This will enables the user to have the same device choices when they rejoin the room.\n   * @defaultValue true\n   */\n  saveUserChoices?: boolean;\n}\n\n/**\n * @example\n * ```tsx\n * <LiveKitRoom ... >\n *   <VoiceAssistantControlBar />\n * </LiveKitRoom>\n * ```\n * @beta\n */\nexport function VoiceAssistantControlBar({\n  controls,\n  saveUserChoices = true,\n  onDeviceError,\n  ...props\n}: VoiceAssistantControlBarProps) {\n  const visibleControls = { leave: true, microphone: true, ...controls };\n\n  const localPermissions = useLocalParticipantPermissions();\n  const { microphoneTrack, localParticipant } = useLocalParticipant();\n\n  const micTrackRef: TrackReferenceOrPlaceholder = React.useMemo(() => {\n    return {\n      participant: localParticipant,\n      source: Track.Source.Microphone,\n      publication: microphoneTrack,\n    };\n  }, [localParticipant, microphoneTrack]);\n\n  if (!localPermissions) {\n    visibleControls.microphone = false;\n  } else {\n    visibleControls.microphone ??= localPermissions.canPublish;\n  }\n\n  const htmlProps = mergeProps({ className: 'lk-agent-control-bar' }, props);\n\n  const { saveAudioInputEnabled, saveAudioInputDeviceId } = usePersistentUserChoices({\n    preventSave: !saveUserChoices,\n  });\n\n  const microphoneOnChange = React.useCallback(\n    (enabled: boolean, isUserInitiated: boolean) => {\n      if (isUserInitiated) {\n        saveAudioInputEnabled(enabled);\n      }\n    },\n    [saveAudioInputEnabled],\n  );\n\n  return (\n    <div {...htmlProps}>\n      {visibleControls.microphone && (\n        <div className=\"lk-button-group\">\n          <TrackToggle\n            source={Track.Source.Microphone}\n            showIcon={true}\n            onChange={microphoneOnChange}\n            onDeviceError={(error) => onDeviceError?.({ source: Track.Source.Microphone, error })}\n          >\n            <BarVisualizer trackRef={micTrackRef} barCount={7} options={{ minHeight: 5 }} />\n          </TrackToggle>\n          <div className=\"lk-button-group-menu\">\n            <MediaDeviceMenu\n              kind=\"audioinput\"\n              onActiveDeviceChange={(_kind, deviceId) =>\n                saveAudioInputDeviceId(deviceId ?? 'default')\n              }\n            />\n          </div>\n        </div>\n      )}\n\n      {visibleControls.leave && <DisconnectButton>{'Disconnect'}</DisconnectButton>}\n      <StartMediaButton />\n    </div>\n  );\n}\n"],"names":["Chat","messageFormatter","messageDecoder","messageEncoder","channelTopic","props","ulRef","React","inputRef","chatOptions","chatMessages","send","isSending","useChat","layoutContext","useMaybeLayoutContext","lastReadMsgAt","handleSubmit","event","_a","_b","_c","unreadMessageCount","msg","widget","_d","_e","ChatToggle","ChatCloseIcon","idx","cloneSingleChild","allMsg","hideName","hideTimestamp","ChatEntry","ev","MediaDeviceMenu","kind","initialSelection","onActiveDeviceChange","tracks","requestPermissions","isOpen","setIsOpen","devices","setDevices","updateRequired","setUpdateRequired","needPermissions","setNeedPermissions","handleActiveDeviceChange","deviceId","log","button","tooltip","cleanup","computeMenuPosition","x","y","handleClickOutside","wasClickOutside","MediaDeviceSelect","useWarnAboutMissingStyles","warnAboutMissingStyles","usePreviewTracks","options","onError","setTracks","trackLock","Mutex","needsCleanup","localTracks","unlock","createLocalTracks","tr","e","track","roomOptionsStringifyReplacer","usePreviewDevice","enabled","deviceError","setDeviceError","isCreatingTrack","setIsCreatingTrack","useMediaDevices","selectedDevice","setSelectedDevice","localTrack","setLocalTrack","localDeviceId","setLocalDeviceId","createTrack","createLocalVideoTrack","VideoPresets","createLocalAudioTrack","newDeviceId","prevDeviceId","switchDevice","id","dev","PreJoin","defaults","onValidate","onSubmit","debug","joinLabel","micLabel","camLabel","userLabel","persistUserChoices","videoProcessor","htmlProps","initialUserChoices","saveAudioInputDeviceId","saveAudioInputEnabled","saveVideoInputDeviceId","saveVideoInputEnabled","saveUsername","usePersistentUserChoices","userChoices","setUserChoices","audioEnabled","setAudioEnabled","videoEnabled","setVideoEnabled","audioDeviceId","setAudioDeviceId","videoDeviceId","setVideoDeviceId","username","setUsername","videoEl","videoTrack","Track","facingMode","facingModeFromLocalTrack","audioTrack","isValid","setIsValid","handleValidation","values","newUserChoices","ParticipantPlaceholder","TrackToggle","_","inputEl","useSettingsToggle","dispatch","state","useLayoutContext","className","mergeProps","SettingsMenuToggle","ref","mergedProps","trackSourceToProtocol","source","ControlBar","variation","controls","saveUserChoices","onDeviceError","isChatOpen","setIsChatOpen","defaultVariation","useMediaQuery","visibleControls","localPermissions","useLocalParticipantPermissions","canPublishSource","showIcon","showText","browserSupportsScreenSharing","supportsScreenSharing","isScreenShareEnabled","setIsScreenShareEnabled","onScreenShareChange","microphoneOnChange","isUserInitiated","cameraOnChange","error","_kind","ChatIcon","GearIcon","DisconnectButton","LeaveIcon","StartMediaButton","VideoConference","chatMessageFormatter","chatMessageDecoder","chatMessageEncoder","SettingsComponent","widgetState","setWidgetState","lastAutoFocusedScreenShareTrack","useTracks","RoomEvent","widgetUpdate","useCreateLayoutContext","screenShareTracks","isTrackReference","focusTrack","usePinnedTracks","carouselTracks","isEqualTrackRef","updatedFocusTrack","_f","isWeb","LayoutContextProvider","FocusLayoutContainer","CarouselLayout","ParticipantTile","FocusLayout","GridLayout","RoomAudioRenderer","ConnectionStateToast","AudioConference","audioTracks","TrackLoop","ParticipantAudioTile","VoiceAssistantControlBar","microphoneTrack","localParticipant","useLocalParticipant","micTrackRef","BarVisualizer"],"mappings":"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"}