{
  "version": 3,
  "sources": ["../../src/components/AudioRenderer.tsx", "../../src/components/AudioSelectButton.tsx", "../../src/components/ControlButton.tsx", "../../src/components/Popover.tsx", "../../src/components/ControlsView.tsx", "../../src/signals/createParticipant.ts", "../../src/components/VideoSelectButton.tsx", "../../src/components/DisplayContext.tsx", "../../src/components/ParticipantView.tsx", "../../src/components/ConnectionQualityLow.tsx", "../../src/components/ConnectionQualityMid.tsx", "../../src/components/ConnectionQualityHigh.tsx", "../../src/components/VideoRenderer.tsx", "../../src/components/ScreenShareView.tsx", "../../src/components/StageView.tsx", "../../src/components/desktop/GridStage.tsx", "../../src/components/desktop/SpeakerStage.tsx", "../../src/components/mobile/MobileStage.tsx", "../../src/LiveKitRoom.tsx", "../../src/signals/createRoom.ts", "../../src/utils/sortParticipants.ts"],
  "sourcesContent": ["// ANCHOR Solid\nimport {\n  JSX,\n  createEffect,\n  onCleanup,\n} from 'solid-js';\n\n// ANCHOR LiveKit\nimport { Track } from 'livekit-client';\n\nexport interface AudioTrackProps {\n  track: Track;\n  isLocal: boolean;\n}\n\nexport const AudioRenderer = (\n  props: AudioTrackProps,\n): JSX.Element => {\n  let audioElement: HTMLAudioElement;\n\n  createEffect(() => {\n    // don't play own audio\n    if (!props.isLocal) {\n      audioElement = props.track.attach();\n\n      if (props.track.sid) {\n        audioElement.setAttribute('data-audio-track-id', props.track.sid);\n      }\n    }\n\n    onCleanup(() => {\n      props.track.detach().forEach((element) => element.remove());\n    });\n  });\n\n  // TODO: allow set sink id\n  return null;\n};\n", "// ANCHOR Solid\nimport {\n  createEffect,\n  createSignal,\n  JSX,\n  mergeProps,\n  onCleanup,\n  Show,\n} from 'solid-js';\n\n// ANCHOR Icons\nimport {\n  FaSolidMicrophone,\n  FaSolidMicrophoneSlash,\n} from 'solid-icons/fa';\n\n// ANCHOR LiveKit\nimport { Room } from 'livekit-client';\n\n// ANCHOR Components\nimport { ControlButton, MenuItem } from './ControlButton';\n\n// ANCHOR Styles\nimport './styles.module.css';\n\nexport interface AudioSelectButtonProps {\n  isMuted: boolean;\n  onClick?: () => void;\n  onSourceSelected?: (device: MediaDeviceInfo) => void;\n  muteText?: string;\n  unmuteText?: string;\n  className?: string;\n  popoverContainerClassName?: string;\n  popoverTriggerBtnClassName?: string;\n  popoverTriggerBtnSeparatorClassName?: string;\n}\n\nexport const AudioSelectButton = (\n  props: AudioSelectButtonProps,\n): JSX.Element => {\n  const mergedProps = mergeProps({\n    muteText: 'Mute',\n    unmuteText: 'Unmute',\n  }, props);\n\n  const [sources, setSources] = createSignal<MediaDeviceInfo[]>([]);\n  const [menuItems, setMenuItems] = createSignal<MenuItem[]>([]);\n\n  const listAudioDevices = () => {\n    Room.getLocalDevices('audioinput')\n      .then((devices) => {\n        setSources(devices);\n        setMenuItems(\n          devices.map((item) => ({ label: item.label })),\n        );\n        // eslint-disable-next-line no-console\n      }, console.error);\n  };\n\n  createEffect(() => {\n    listAudioDevices();\n    navigator.mediaDevices.addEventListener('devicechange', listAudioDevices);\n\n    onCleanup(() => {\n      navigator.mediaDevices.removeEventListener(\n        'devicechange',\n        listAudioDevices,\n      );\n    });\n  });\n\n  const handleMenuItem = (item: MenuItem) => {\n    const device = sources().find((source) => (\n      source.label === item.label\n    ));\n\n    if (device && props.onSourceSelected) {\n      props.onSourceSelected(device);\n    }\n  };\n\n  const AudioSelectIcon = (): JSX.Element => (\n    <Show\n      when={props.isMuted}\n      fallback={<FaSolidMicrophone className=\"icon\" height={32} />}\n    >\n      <FaSolidMicrophoneSlash className=\"icon\" height={32} />\n    </Show>\n  );\n\n  return (\n    <ControlButton\n      label={props.isMuted\n        ? mergedProps.unmuteText\n        : mergedProps.muteText}\n      icon={<AudioSelectIcon />}\n      onClick={props.onClick}\n      menuItems={menuItems()}\n      onMenuItemClick={handleMenuItem}\n      className={props.className}\n      popoverContainerClassName={props.popoverContainerClassName}\n      popoverTriggerBtnClassName={props.popoverTriggerBtnClassName}\n      popoverTriggerBtnSeparatorClassName={props.popoverTriggerBtnSeparatorClassName}\n    />\n  );\n};\n", "// ANCHOR Solid\nimport {\n  JSX,\n  createSignal,\n  createEffect,\n  Show,\n  For,\n} from 'solid-js';\n\n// ANCHOR Icons\nimport { FaSolidChevronDown } from 'solid-icons/fa';\n\n// ANCHOR Components\nimport { Popover } from './Popover';\n\n// ANCHOR Styles\nimport './styles.module.css';\n\ninterface ButtonProps {\n  label: string;\n  disabled?: boolean;\n  onClick?: () => void;\n  icon?: JSX.Element;\n  className?: string;\n  popoverContainerClassName?: string;\n  popoverTriggerBtnClassName?: string;\n  popoverTriggerBtnSeparatorClassName?: string;\n  menuItems?: MenuItem[];\n  onMenuItemClick?: (item: MenuItem) => void;\n}\n\nexport interface MenuItem {\n  label: string;\n}\n\nexport const ControlButton = (\n  props: ButtonProps,\n): JSX.Element => {\n  const [menuVisible, setMenuVisible] = createSignal(false);\n  const [classes, setClasses] = createSignal('button');\n\n  createEffect(() => {\n    if (props.className) {\n      setClasses((current) => {\n        if (props.className) {\n          return `${current} ${props.className}`;\n        }\n\n        return current;\n      });\n    }\n\n    if (props.menuItems && props.menuItems.length > 0) {\n      setClasses((current) => `${current} hasDropdown`);\n    }\n  });\n\n  const handleMenuClick = (item: MenuItem) => {\n    setMenuVisible(false);\n\n    if (props.onMenuItemClick) {\n      props.onMenuItemClick(item);\n    }\n  };\n\n  const MenuTrigger = (): JSX.Element => (\n    <Show when={props.menuItems}>\n      {(menuItems) => (\n        <Show when={menuItems.length > 0}>\n          <button\n            disabled={props.disabled}\n            classList={{\n              'button dropdown': true,\n              [props.popoverTriggerBtnClassName ?? '']: !!props.popoverTriggerBtnClassName,\n            }}\n          >\n            <div\n              classList={{\n                separator: true,\n                [props.popoverTriggerBtnSeparatorClassName ?? '']: !!props.popoverTriggerBtnSeparatorClassName,\n              }}\n            />\n            <FaSolidChevronDown height={32} />\n          </button>\n        </Show>\n      )}\n    </Show>\n  );\n\n  const Menu = (): JSX.Element => (\n    <Show when={props.menuItems}>\n      {(menuItems) => (\n        <Show when={menuItems.length > 0}>\n          <div\n            classList={{\n              popoverMenu: true,\n              [props.popoverContainerClassName ?? '']: !!props.popoverContainerClassName,\n            }}\n          >\n            <ul className=\"list\">\n              <For each={menuItems}>\n                {(item) => (\n                  <li onClick={() => handleMenuClick(item)}>\n                    {item.label}\n                  </li>\n                )}\n              </For>\n            </ul>\n          </div>\n        </Show>\n      )}\n    </Show>\n  );\n\n  return (\n    <Popover\n      isOpen={menuVisible()}\n      placement={'top'}\n      content={<Menu />}\n    >\n      <div className=\"buttonWrapper\">\n        <button\n          disabled={props.disabled}\n          className={classes()}\n          onClick={() => {\n            if (props.onClick) {\n              props.onClick();\n            }\n          }}\n        >\n          <Show when={props.icon}>\n            {(icon) => icon}\n          </Show>\n          {props.label}\n        </button>\n        {<MenuTrigger />}\n      </div>\n    </Popover>\n  );\n};\n", "/* eslint-disable @typescript-eslint/no-unsafe-call */\n// ANCHOR Solid\nimport {\n  createSignal,\n  JSX,\n} from 'solid-js';\n\n// ANCHOR Headless\nimport {\n  Popover as HeadlessPopover,\n  PopoverButton,\n  PopoverPanel,\n  Transition,\n} from 'solid-headless';\n\n// ANCHOR Popper\nimport usePopper from 'solid-popper';\n\nexport declare type AutoPlacement = 'auto' | 'auto-start' | 'auto-end';\nexport declare type VariationPlacement = 'top-start' | 'top-end' | 'bottom-start' | 'bottom-end' | 'right-start' | 'right-end' | 'left-start' | 'left-end';\nexport declare type BasePlacement = 'top' | 'bottom' | 'left' | 'right';\nexport declare type Placement = AutoPlacement | BasePlacement | VariationPlacement;\n\nexport interface PopoverProps {\n  children: JSX.Element;\n  isOpen?: boolean;\n  placement?: Placement;\n  content: JSX.Element;\n}\n\nexport const Popover = (\n  props: PopoverProps,\n): JSX.Element => {\n  const [anchor, setAnchor] = createSignal<HTMLElement>();\n  const [popper, setPopper] = createSignal<HTMLElement>();\n\n  usePopper(anchor, popper, {\n    placement: props.placement ?? 'auto',\n  });\n\n  return (\n    <HeadlessPopover isOpen={props.isOpen}>\n      {({ isOpen }) => (\n        <>\n          <PopoverButton ref={setAnchor} type=\"button\">\n            {props.children}\n          </PopoverButton>\n          <Transition show={isOpen() as boolean}>\n            <PopoverPanel ref={setPopper}>\n              {props.content}\n            </PopoverPanel>\n          </Transition>\n        </>\n      )}\n    </HeadlessPopover>\n  );\n};\n", "/* eslint-disable no-console */\n// ANCHOR Solid\nimport {\n  JSX, mergeProps, Show,\n} from 'solid-js';\n\n// ANCHOR Icons\nimport {\n  FaSolidDesktop,\n  FaSolidStop,\n} from 'solid-icons/fa';\n\n// ANCHOR LiveKit\nimport { Room } from 'livekit-client';\n\n// ANCHOR Signals\nimport { createParticipant } from '../signals/createParticipant';\n\n// ANCHOR Components\nimport { AudioSelectButton } from './AudioSelectButton';\nimport { VideoSelectButton } from './VideoSelectButton';\nimport { ControlButton } from './ControlButton';\n\n// ANCHOR Styles\nimport './styles.module.css';\n\nexport interface ControlsProps {\n  room: Room;\n  enableScreenShare?: boolean;\n  enableAudio?: boolean;\n  enableVideo?: boolean;\n  onLeave?: (room: Room) => void;\n}\n\nexport const ControlsView = (\n  props: ControlsProps,\n): JSX.Element => {\n  const mergedProps = mergeProps({\n    enableScreenShare: true,\n    enableVideo: true,\n    enableAudio: true,\n  }, props);\n\n  const participant = createParticipant(props.room.localParticipant);\n\n  const cameraPublication = () => participant().cameraPublication;\n\n  const MuteButton = (): JSX.Element => {\n    const enabled = props.room.localParticipant.isMicrophoneEnabled;\n\n    return (\n      <Show when={mergedProps.enableAudio}>\n        <AudioSelectButton\n          isMuted={!enabled}\n          onClick={() => props.room.localParticipant.setMicrophoneEnabled(!enabled)}\n          onSourceSelected={(device) => props.room.switchActiveDevice('audioinput', device.deviceId)\n          }\n        />\n      </Show>\n    );\n  };\n\n  const VideoButton = (): JSX.Element => {\n    const enabled = !(cameraPublication()?.isMuted ?? true);\n\n    return (\n      <Show when={mergedProps.enableVideo}>\n        <VideoSelectButton\n          isEnabled={enabled}\n          onClick={() => props.room.localParticipant.setCameraEnabled(!enabled)}\n          onSourceSelected={(device) => {\n            props.room.switchActiveDevice('videoinput', device.deviceId)\n              .catch(console.error);\n          }}\n        />\n      </Show>\n    );\n  };\n\n  const ScreenButton = (): JSX.Element => {\n    const enabled = props.room.localParticipant.isScreenShareEnabled;\n\n    const ScreenButtonIcon = (): JSX.Element => (\n      <Show\n        when={enabled}\n        fallback={<FaSolidDesktop className=\"icon\" height={32} />}\n      >\n        <FaSolidStop className=\"icon\" height={32} />\n      </Show>\n    );\n\n    return (\n      <Show when={mergedProps.enableScreenShare}>\n        <ControlButton\n          label={enabled ? 'Stop sharing' : 'Share screen'}\n          icon={<ScreenButtonIcon />}\n          onClick={() => {\n            if (enabled) {\n              props.room.localParticipant.setScreenShareEnabled(false)\n                .catch(console.error);\n            } else {\n              props.room.localParticipant.setScreenShareEnabled(true)\n                .catch(console.error);\n            }\n          }}\n        />\n      </Show>\n    );\n  };\n\n  return (\n    <div className=\"controlsWrapper\">\n      <MuteButton />\n      <VideoButton />\n      <ScreenButton />\n      <Show when={props.onLeave}>\n        {(onLeave) => (\n          <ControlButton\n            label=\"End\"\n            className=\"dangerButton\"\n            onClick={() => {\n              props.room.disconnect();\n              onLeave(props.room);\n            }}\n          />\n        )}\n      </Show>\n    </div>\n  );\n};\n", "// ANCHOR Solid\nimport {\n  createEffect,\n  createSignal,\n  Accessor,\n  onCleanup,\n} from 'solid-js';\n\n// ANCHOR LiveKit\nimport {\n  ConnectionQuality,\n  LocalParticipant,\n  Participant,\n  ParticipantEvent,\n  Track,\n  TrackPublication,\n} from 'livekit-client';\n\n// ANCHOR Types\nexport interface ParticipantState {\n  isSpeaking: boolean;\n  isAudioMuted: boolean;\n  isVideoMuted: boolean;\n  connectionQuality: ConnectionQuality;\n  isLocal: boolean;\n  metadata: string | undefined;\n  publications: TrackPublication[];\n  subscribedTracks: TrackPublication[];\n  cameraPublication?: TrackPublication;\n  microphonePublication?: TrackPublication;\n  screenSharePublication?: TrackPublication;\n}\n\nexport function createParticipant(\n  participant: Participant,\n): Accessor<ParticipantState> {\n  const [isAudioMuted, setIsAudioMuted] = createSignal(false);\n  const [isVideoMuted, setIsVideoMuted] = createSignal(false);\n  const [connectionQuality, setConnectionQuality] = createSignal<ConnectionQuality>(\n    participant.connectionQuality,\n  );\n  const [isSpeaking, setSpeaking] = createSignal(false);\n  const [metadata, setMetadata] = createSignal<string>();\n  const [publications, setPublications] = createSignal<TrackPublication[]>([]);\n  const [subscribedTracks, setSubscribedTracks] = createSignal<TrackPublication[]>(\n    [],\n  );\n\n  const onPublicationsChanged = () => {\n    const participantTracks = Array.from(participant.tracks.values());\n    setPublications(participantTracks);\n    setSubscribedTracks(participantTracks.filter((pub) => (\n      pub.isSubscribed && pub.track !== undefined\n    )));\n  };\n\n  const onMuted = (publication: TrackPublication) => {\n    if (publication.kind === Track.Kind.Audio) {\n      setIsAudioMuted(true);\n    } else if (publication.kind === Track.Kind.Video) {\n      setIsVideoMuted(true);\n    }\n  };\n\n  const onUnmuted = (publication: TrackPublication) => {\n    if (publication.kind === Track.Kind.Audio) {\n      setIsAudioMuted(false);\n    } else if (publication.kind === Track.Kind.Video) {\n      setIsVideoMuted(false);\n    }\n  };\n\n  const onMetadataChanged = () => {\n    if (participant.metadata) {\n      setMetadata(participant.metadata);\n    }\n  };\n\n  const onIsSpeakingChanged = () => {\n    setSpeaking(participant.isSpeaking);\n  };\n\n  const onConnectionQualityUpdate = () => {\n    setConnectionQuality(participant.connectionQuality);\n  };\n\n  createEffect(() => {\n    participant\n      .on(ParticipantEvent.TrackMuted, onMuted)\n      .on(ParticipantEvent.TrackUnmuted, onUnmuted)\n      .on(ParticipantEvent.ParticipantMetadataChanged, onMetadataChanged)\n      .on(ParticipantEvent.IsSpeakingChanged, onIsSpeakingChanged)\n      .on(ParticipantEvent.TrackPublished, onPublicationsChanged)\n      .on(ParticipantEvent.TrackUnpublished, onPublicationsChanged)\n      .on(ParticipantEvent.TrackSubscribed, onPublicationsChanged)\n      .on(ParticipantEvent.TrackUnsubscribed, onPublicationsChanged)\n      .on(ParticipantEvent.LocalTrackPublished, onPublicationsChanged)\n      .on(ParticipantEvent.LocalTrackUnpublished, onPublicationsChanged)\n      .on(ParticipantEvent.ConnectionQualityChanged, onConnectionQualityUpdate);\n\n    // set initial state\n    onMetadataChanged();\n    onIsSpeakingChanged();\n    onPublicationsChanged();\n  });\n\n  onCleanup(() => {\n    participant\n      .off(ParticipantEvent.TrackMuted, onMuted)\n      .off(ParticipantEvent.TrackUnmuted, onUnmuted)\n      .off(ParticipantEvent.ParticipantMetadataChanged, onMetadataChanged)\n      .off(ParticipantEvent.IsSpeakingChanged, onIsSpeakingChanged)\n      .off(ParticipantEvent.TrackPublished, onPublicationsChanged)\n      .off(ParticipantEvent.TrackUnpublished, onPublicationsChanged)\n      .off(ParticipantEvent.TrackSubscribed, onPublicationsChanged)\n      .off(ParticipantEvent.TrackUnsubscribed, onPublicationsChanged)\n      .off(ParticipantEvent.LocalTrackPublished, onPublicationsChanged)\n      .off(ParticipantEvent.LocalTrackUnpublished, onPublicationsChanged)\n      .off(\n        ParticipantEvent.ConnectionQualityChanged,\n        onConnectionQualityUpdate,\n      );\n  });\n\n  createEffect(() => {\n    let muted: boolean | undefined;\n\n    participant.audioTracks.forEach((publication) => {\n      muted = publication.isMuted;\n    });\n\n    if (typeof muted === 'undefined') {\n      muted = true;\n    }\n\n    setIsAudioMuted((currentValue) => {\n      if (currentValue !== muted) {\n        return !!muted;\n      }\n\n      return currentValue;\n    });\n\n    setIsVideoMuted((currentValue) => {\n      if (currentValue !== muted) {\n        return !!muted;\n      }\n\n      return currentValue;\n    });\n  });\n\n  return () => ({\n    isLocal: participant instanceof LocalParticipant,\n    isSpeaking: isSpeaking(),\n    isAudioMuted: isAudioMuted(),\n    isVideoMuted: isVideoMuted(),\n    connectionQuality: connectionQuality(),\n    publications: publications(),\n    subscribedTracks: subscribedTracks(),\n    cameraPublication: participant.getTrack(Track.Source.Camera),\n    microphonePublication: participant.getTrack(Track.Source.Microphone),\n    screenSharePublication: participant.getTrack(Track.Source.ScreenShare),\n    metadata: metadata(),\n    tracks: participant.tracks,\n  });\n}\n", "// ANCHOR Solid\nimport {\n  JSX,\n  mergeProps,\n  createSignal,\n  createEffect,\n  Show,\n  onCleanup,\n} from 'solid-js';\n\n// ANCHOR Icons\nimport {\n  FaSolidVideo,\n  FaSolidVideoSlash,\n} from 'solid-icons/fa';\n\n// ANCHOR LiveKit\nimport { Room } from 'livekit-client';\n\n// ANCHOR Components\nimport { ControlButton, MenuItem } from './ControlButton';\n\nexport interface VideoSelectButtonProps {\n  isEnabled: boolean;\n  onClick?: () => void;\n  onSourceSelected?: (device: MediaDeviceInfo) => void;\n  disableText?: string;\n  enableText?: string;\n  className?: string;\n  popoverContainerClassName?: string;\n  popoverTriggerBtnClassName?: string;\n  popoverTriggerBtnSeparatorClassName?: string;\n}\n\nexport const VideoSelectButton = (\n  props: VideoSelectButtonProps,\n): JSX.Element => {\n  const mergedProps = mergeProps({\n    disableText: 'Disable Video',\n    enableText: 'Enable Video',\n  }, props);\n\n  const [sources, setSources] = createSignal<MediaDeviceInfo[]>([]);\n  const [menuItems, setMenuItems] = createSignal<MenuItem[]>([]);\n\n  const listVideoDevices = () => {\n    Room.getLocalDevices('videoinput')\n      .then((devices) => {\n        setSources(devices);\n        setMenuItems(\n          devices.map((item) => ({ label: item.label })),\n        );\n        // eslint-disable-next-line no-console\n      }, console.error);\n  };\n\n  createEffect(() => {\n    listVideoDevices();\n    navigator.mediaDevices.addEventListener('devicechange', listVideoDevices);\n\n    onCleanup(() => {\n      navigator.mediaDevices.removeEventListener(\n        'devicechange',\n        listVideoDevices,\n      );\n    });\n  });\n\n  const handleMenuItem = (item: MenuItem) => {\n    const device = sources().find((source) => (\n      source.label === item.label\n    ));\n\n    if (device && props.onSourceSelected) {\n      props.onSourceSelected(device);\n    }\n  };\n\n  const VideoSelectedIcon = (): JSX.Element => (\n    <Show\n      when={props.isEnabled}\n      fallback={<FaSolidVideoSlash className=\"icon\" height={32} />}\n    >\n      <FaSolidVideo className=\"icon\" height={32} />\n    </Show>\n  );\n\n  return (\n    <ControlButton\n      label={props.isEnabled\n        ? mergedProps.disableText\n        : mergedProps.enableText}\n      icon={<VideoSelectedIcon />}\n      onClick={props.onClick}\n      menuItems={menuItems()}\n      onMenuItemClick={handleMenuItem}\n      className={props.className}\n      popoverContainerClassName={props.popoverContainerClassName}\n      popoverTriggerBtnClassName={props.popoverTriggerBtnClassName}\n      popoverTriggerBtnSeparatorClassName={props.popoverTriggerBtnSeparatorClassName}\n    />\n  );\n};\n", "import { useContext, createContext } from 'solid-js';\n\nexport interface DisplayOptions {\n  stageLayout?: string;\n  /** display debugging stats */\n  showStats?: boolean;\n}\n\nexport const DisplayContext = createContext<DisplayOptions>({\n  stageLayout: 'grid',\n  showStats: false,\n});\n\nexport const useDisplay = (): DisplayOptions => (\n  useContext(DisplayContext)\n);\n", "// ANCHOR Solid\nimport {\n  JSX,\n  createEffect,\n  createSignal,\n  onCleanup,\n  Show,\n  Switch,\n  Match,\n} from 'solid-js';\nimport AspectRatio from 'solid-aspect-ratio';\n\n// ANCHOR Icons\nimport {\n  FaSolidMicrophone,\n  FaSolidMicrophoneSlash,\n} from 'solid-icons/fa';\n\n// ANCHOR LiveKit\nimport {\n  ConnectionQuality,\n  LocalTrack,\n  Participant,\n  RemoteTrack,\n} from 'livekit-client';\n\n// ANCHOR Types\nimport { Property } from 'csstype';\n\n// ANCHOR Components\nimport { ConnectionQualityLow } from './ConnectionQualityLow';\nimport { ConnectionQualityMid } from './ConnectionQualityMid';\nimport { ConnectionQualityHigh } from './ConnectionQualityHigh';\nimport { useDisplay } from './DisplayContext';\nimport { VideoRenderer } from './VideoRenderer';\n\n// ANCHOR Signals\nimport { createParticipant } from '../signals/createParticipant';\n\n// ANCHOR Styles\nimport './styles.module.css';\n\nexport interface ParticipantProps {\n  participant: Participant;\n  displayName?: string;\n  // width in CSS\n  width?: Property.Width;\n  // height in CSS\n  height?: Property.Height;\n  className?: string;\n  // aspect ratio width, if set, maintains aspect ratio\n  aspectWidth?: number;\n  // aspect ratio height\n  aspectHeight?: number;\n  // determine whether to contain or cover video.\n  // cover mode is used when layout orientation matches video orientation\n  orientation?: 'landscape' | 'portrait';\n  // true if overlay with participant info should be shown\n  showOverlay?: boolean;\n  // true if connection quality should be shown\n  showConnectionQuality?: boolean;\n  // additional classname when participant is currently speaking\n  speakerClassName?: string;\n  onMouseEnter?: () => void;\n  onMouseLeave?: () => void;\n  onClick?: () => void;\n}\n\nexport const ParticipantView = (props: ParticipantProps): JSX.Element => {\n  const participant = createParticipant(props.participant);\n\n  const [videoSize, setVideoSize] = createSignal<string>();\n  const [currentBitrate, setCurrentBitrate] = createSignal<number>();\n  const [objectFit, setObjectFit] = createSignal<Property.ObjectFit>('contain');\n  const [videoOrientation, setVideoOrientation] = createSignal<'landscape' | 'portrait'>();\n  const [displayName, setDisplayName] = createSignal(props.displayName);\n\n  const display = useDisplay();\n\n  const handleResize = (width: number, height: number) => {\n    setVideoSize(`${width}x${height}`);\n  };\n\n  createEffect(() => {\n    const interval = setInterval(() => {\n      let total = 0;\n\n      props.participant.tracks.forEach((pub) => {\n        if (\n          pub.track instanceof LocalTrack\n          || pub.track instanceof RemoteTrack\n        ) {\n          total += pub.track.currentBitrate;\n        }\n      });\n\n      setCurrentBitrate(total);\n    }, 1000);\n\n    onCleanup(() => clearInterval(interval));\n  });\n\n  const containerStyles: JSX.CSSProperties = {\n    width: props.width,\n    height: props.height,\n  };\n\n  let { orientation } = props;\n\n  if (!props.orientation && props.aspectWidth && props.aspectHeight) {\n    orientation = props.aspectWidth > props.aspectHeight\n      ? 'landscape'\n      : 'portrait';\n  }\n\n  createEffect(() => {\n    const dimensions = participant().cameraPublication?.dimensions;\n\n    if (dimensions) {\n      const orientationValue = dimensions.width > dimensions.height\n        ? 'landscape'\n        : 'portrait';\n\n      setVideoOrientation(orientationValue);\n    }\n  });\n\n  createEffect(() => {\n    if (videoOrientation() === orientation) {\n      setObjectFit('cover');\n    }\n  });\n\n  createEffect(() => {\n    setDisplayName((current) => {\n      if (!current) {\n        const suffix = participant().isLocal ? ' (You)' : '';\n\n        return `${props.participant.name || props.participant.identity}${suffix}`;\n      }\n\n      return current;\n    });\n  });\n\n  const MainElement = (): JSX.Element => {\n    const publication = () => participant().cameraPublication;\n\n    return (\n      <Show\n        when={publication()?.isSubscribed\n          && !publication()?.isMuted\n          && publication()?.track}\n        fallback={<div className=\"placeholder\" />}\n      >\n        {(track) => (\n          <VideoRenderer\n            track={track}\n            isLocal={participant().isLocal}\n            objectFit={objectFit()}\n            width=\"100%\"\n            height=\"100%\"\n            onSizeChanged={handleResize}\n          />\n        )}\n      </Show>\n    );\n  };\n\n  const speakerClassName = props.speakerClassName || 'speaker';\n\n  return (\n    <div\n      classList={{\n        participant: true,\n        [props.className ?? '']: !!props.className,\n        [speakerClassName]: participant().isSpeaking,\n      }}\n      style={containerStyles}\n      onMouseEnter={props.onMouseEnter}\n      onMouseLeave={props.onMouseLeave}\n      onClick={props.onClick}\n    >\n      <Show\n        when={props.aspectWidth}\n        fallback={<MainElement />}\n      >\n        {(aspectWidth) => (\n          <Show\n            when={props.aspectHeight}\n            fallback={<MainElement />}\n          >\n            {(aspectHeight) => (\n              <AspectRatio ratio={aspectWidth / aspectHeight}>\n                <MainElement />\n              </AspectRatio>\n            )}\n          </Show>\n        )}\n      </Show>\n\n      <Show when={props.showOverlay || display.showStats}>\n        <div className=\"participantBar\">\n          <div className=\"name\">{displayName}</div>\n          <div className=\"center\">\n            <Show when={display.showStats}>\n              <div className=\"stats\">\n                <div>{videoSize}</div>\n                <Show when={currentBitrate()}>\n                  {(bitrate) => (\n                    <Show when={bitrate > 0}>\n                      <div>{Math.round(bitrate / 1024)} kbps</div>\n                    </Show>\n                  )}\n                </Show>\n              </div>\n            </Show>\n          </div>\n          <div>\n            <Show when={props.showConnectionQuality}>\n              <Switch>\n                <Match when={participant().connectionQuality === ConnectionQuality.Excellent}>\n                  <ConnectionQualityHigh />\n                </Match>\n                <Match when={participant().connectionQuality === ConnectionQuality.Good}>\n                  <ConnectionQualityMid />\n                </Match>\n                <Match when={participant().connectionQuality === ConnectionQuality.Poor}>\n                  <ConnectionQualityLow />\n                </Match>\n              </Switch>\n            </Show>\n          </div>\n          <div>\n            <Show\n              when={props.participant.isMicrophoneEnabled}\n              fallback={(\n                <FaSolidMicrophoneSlash height={24} className=\"iconRed\" />\n              )}\n            >\n              <FaSolidMicrophone height={24} className=\"iconGreen\" />\n            </Show>\n          </div>\n        </div>\n      </Show>\n    </div>\n  );\n};\n", "// ANCHOR Solid\nimport { JSX } from 'solid-js';\n\nexport function ConnectionQualityLow(): JSX.Element {\n  return (\n    <svg width=\"9\" height=\"9\" viewBox=\"0 0 9 9\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n      <path d=\"M0 6H2V9H0V6Z\" fill=\"#981010\" />\n      <path d=\"M3.5 3H5.5V9H3.5V3Z\" fill=\"#1A1B1D\" />\n      <path d=\"M7 0H9V9H7V0Z\" fill=\"#1A1B1D\" />\n    </svg>\n  );\n}\n", "// ANCHOR Solid\nimport { JSX } from 'solid-js';\n\nexport function ConnectionQualityMid(): JSX.Element {\n  return (\n    <svg width=\"9\" height=\"9\" viewBox=\"0 0 9 9\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n      <path d=\"M0 6H2V9H0V6Z\" fill=\"#F89C13\" />\n      <path d=\"M3.5 3H5.5V9H3.5V3Z\" fill=\"#F89C13\" />\n      <path d=\"M7 0H9V9H7V0Z\" fill=\"#1A1B1D\" />\n    </svg>\n  );\n}\n", "// ANCHOR Solid\nimport { JSX } from 'solid-js';\n\nexport function ConnectionQualityHigh(): JSX.Element {\n  return (\n    <svg width=\"9\" height=\"9\" viewBox=\"0 0 9 9\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">\n      <path d=\"M0 6H2V9H0V6Z\" fill=\"#28994E\" />\n      <path d=\"M3.5 3H5.5V9H3.5V3Z\" fill=\"#28994E\" />\n      <path d=\"M7 0H9V9H7V0Z\" fill=\"#28994E\" />\n    </svg>\n  );\n}\n", "// ANCHOR Solid\nimport {\n  createSignal,\n  createEffect,\n  onCleanup,\n  JSX,\n} from 'solid-js';\n\n// ANCHOR LiveKit\nimport { Track } from 'livekit-client';\n\n// ANCHOR Styles\nimport './styles.module.css';\n\n// ANCHOR Types\nimport { Property } from 'csstype';\n\nexport interface VideoRendererProps {\n  track: Track;\n  isLocal: boolean;\n  objectFit?: Property.ObjectFit;\n  className?: string;\n  width?: Property.Width;\n  height?: Property.Height;\n  onSizeChanged?: (width: number, height: number) => void;\n}\n\nexport const VideoRenderer = (\n  props: VideoRendererProps,\n): JSX.Element => {\n  const [ref, setRef] = createSignal<HTMLVideoElement | null>(null);\n\n  createEffect(() => {\n    const videoElement = ref();\n    if (videoElement) {\n      videoElement.muted = true;\n      props.track.attach(videoElement);\n    }\n\n    onCleanup(() => {\n      if (videoElement) {\n        props.track.detach(videoElement);\n      }\n    });\n  });\n\n  const handleResize = (event: UIEvent) => {\n    if (event.target instanceof HTMLVideoElement) {\n      if (props.onSizeChanged) {\n        props.onSizeChanged(\n          event.target.videoWidth,\n          event.target.videoHeight,\n        );\n      }\n    }\n  };\n\n  createEffect(() => {\n    const videoElement = ref();\n\n    if (videoElement) {\n      videoElement.addEventListener('resize', handleResize);\n    }\n\n    onCleanup(() => {\n      videoElement?.removeEventListener('resize', handleResize);\n    });\n  });\n\n  const isFrontFacing = props.track.mediaStreamTrack?.getSettings().facingMode !== 'environment';\n\n  const style = () => {\n    const currentStyle: JSX.CSSProperties = {\n      transform: props.isLocal && isFrontFacing\n        ? 'rotateY(180deg)'\n        : '',\n      width: props.width,\n      height: props.height,\n    };\n\n    if (props.objectFit) {\n      currentStyle['object-fit'] = props.objectFit;\n    }\n\n    return currentStyle;\n  };\n\n  return (\n    <video\n      ref={setRef}\n      className={props.className ?? 'video'}\n      style={style()}\n    />\n  );\n};\n", "// ANCHOR Solid\nimport { JSX } from 'solid-js';\n\n// ANCHOR LiveKit\nimport { Track } from 'livekit-client';\n\n// ANCHOR Types\nimport { Property } from 'csstype';\n\n// ANCHOR Styles\nimport './styles.module.css';\n\n// ANCHOR Components\nimport { VideoRenderer } from './VideoRenderer';\n\ninterface ScreenShareProps {\n  track: Track;\n  width?: Property.Width;\n  height?: Property.Height;\n}\n\nexport const ScreenShareView = (\n  props: ScreenShareProps,\n): JSX.Element => (\n  <div className=\"screenShare\">\n    <VideoRenderer\n      track={props.track}\n      isLocal={false}\n      width={props.width}\n      height={props.height}\n    />\n  </div>\n);\n", "// ANCHOR Solid\nimport {\n  JSX,\n  Show,\n  createSignal,\n  createEffect,\n  For,\n} from 'solid-js';\n\n// ANCHOR Icons\nimport { FaSolidVolumeMute } from 'solid-icons/fa';\n\n// ANCHOR LiveKit\nimport { Track, VideoTrack } from 'livekit-client';\n\n// ANCHOR Signals\nimport createMediaQuery from '@solid-primitives/media';\n\n// ANCHOR Components\nimport { AudioRenderer } from './AudioRenderer';\nimport { GridStage } from './desktop/GridStage';\nimport { SpeakerStage } from './desktop/SpeakerStage';\nimport { MobileStage } from './mobile/MobileStage';\nimport { useDisplay } from './DisplayContext';\n\n// ANCHOR Types\nimport { StageProps } from './StageProps';\n\n// ANCHOR Styles\nimport './styles.module.css';\n\nexport const StageView = (\n  props: StageProps,\n): JSX.Element => {\n  const isDesktop = createMediaQuery('(min-width: 800px)');\n  const display = useDisplay();\n\n  const MainElement = (): JSX.Element => (\n    <Show\n      when={isDesktop()}\n      fallback={<MobileStage {...props} />}\n    >\n      {() => {\n        // find first participant with screen shared\n        const [screenTrack, setScreenTrack] = createSignal<VideoTrack>();\n\n        createEffect(() => {\n          props.roomState.participants().forEach((participant) => {\n            setScreenTrack((current) => {\n              if (!current) {\n                const track = participant.getTrack(Track.Source.ScreenShare);\n\n                if (track?.isSubscribed && track.videoTrack) {\n                  return track.videoTrack;\n                }\n              }\n\n              return current;\n            });\n          });\n        });\n\n        return (\n          <Show\n            when={display.stageLayout === 'grid'\n              && screenTrack === undefined}\n            fallback={<SpeakerStage {...props} />}\n          >\n            <GridStage {...props} />\n          </Show>\n        );\n      }}\n    </Show>\n  );\n\n  return (\n    <div className=\"container\">\n      <MainElement />\n      <For each={props.roomState.audioTracks()}>\n        {(track) => (\n          <AudioRenderer track={track} isLocal={false} />\n        )}\n      </For>\n\n      <Show when={props.roomState.room()?.canPlaybackAudio === false}>\n        <div className=\"overlay\">\n          <button\n            className=\"unmuteButton\"\n            onClick={() => {\n              props.roomState.room()?.startAudio()\n                // eslint-disable-next-line no-console\n                .catch(console.error);\n            }}\n          >\n            <FaSolidVolumeMute\n              className=\"icon\"\n              size=\"1x\"\n            />\n            Click to Unmute\n          </button>\n        </div>\n      </Show>\n    </div>\n  );\n};\n", "// ANCHOR Solid\nimport {\n  JSX,\n  createEffect,\n  createSignal,\n  Switch,\n  Match,\n  Show,\n  For,\n} from 'solid-js';\n\n// ANCHOR LiveKit\nimport { Participant } from 'livekit-client';\n\n// ANCHOR Components\nimport { ControlsView } from '../ControlsView';\nimport { ParticipantView } from '../ParticipantView';\nimport { StageProps } from '../StageProps';\n\n// ANCHOR Styles\nimport './styles.module.css';\n\nexport const GridStage = (\n  props: StageProps,\n): JSX.Element => {\n  const [visibleParticipants, setVisibleParticipants] = createSignal<Participant[]>(\n    [],\n  );\n  const [showOverlay, setShowOverlay] = createSignal(false);\n  const [gridClass, setGridClass] = createSignal('grid1x1');\n\n  // compute visible participants and sort.\n  createEffect(() => {\n    // determine grid size\n    let numVisible = 1;\n    const participantCount = props.roomState.participants.length;\n\n    if (participantCount === 1) {\n      setGridClass('grid1x1');\n    } else if (participantCount === 2) {\n      setGridClass('grid2x1');\n      numVisible = 2;\n    } else if (participantCount <= 4) {\n      setGridClass('grid2x2');\n      numVisible = Math.min(participantCount, 4);\n    } else if (participantCount <= 9) {\n      setGridClass('grid3x3');\n      numVisible = Math.min(participantCount, 9);\n    } else if (participantCount <= 16) {\n      setGridClass('grid4x4');\n      numVisible = Math.min(participantCount, 16);\n    } else {\n      setGridClass('grid5x5');\n      numVisible = Math.min(participantCount, 25);\n    }\n\n    setVisibleParticipants((current) => {\n      // remove any participants that are no longer connected\n      const newParticipants: Participant[] = [];\n\n      const currentRoom = props.roomState.room();\n\n      current.forEach((p) => {\n        if (currentRoom?.participants.has(p.sid)\n          || currentRoom?.localParticipant.sid === p.sid\n        ) {\n          newParticipants.push(p);\n        }\n      });\n\n      // ensure active speakers are all visible\n      currentRoom?.activeSpeakers?.forEach((speaker) => {\n        if (newParticipants.includes(speaker)\n          || (speaker !== currentRoom?.localParticipant\n            && !currentRoom?.participants.has(speaker.sid))\n        ) {\n          return;\n        }\n\n        // find a non-active speaker and switch\n        const idx = newParticipants.findIndex((participant) => (\n          !participant.isSpeaking\n        ));\n        if (idx >= 0) {\n          newParticipants[idx] = speaker;\n        } else {\n          newParticipants.push(speaker);\n        }\n      });\n\n      // add other non speakers\n      props.roomState.participants().forEach((participant) => {\n        const isFull = newParticipants.length >= numVisible;\n        const isVisible = newParticipants.includes(participant) || participant.isSpeaking;\n\n        if (!isFull && !isVisible) {\n          newParticipants.push(participant);\n        }\n      });\n\n      if (newParticipants.length > numVisible) {\n        newParticipants.splice(numVisible, newParticipants.length - numVisible);\n      }\n\n      return newParticipants;\n    });\n  });\n\n  return (\n    <Switch\n      fallback={() => {\n        const ParticipantRenderer = props.participantRenderer ?? ParticipantView;\n        const ControlRenderer = props.controlRenderer ?? ControlsView;\n\n        return (\n          // global container\n          <div className=\"container\">\n            <div className={`gridStage ${gridClass()}`}>\n              <For each={visibleParticipants()}>\n                {(participant) => (\n                  <ParticipantRenderer\n                    participant={participant}\n                    orientation=\"landscape\"\n                    width=\"100%\"\n                    height=\"100%\"\n                    showOverlay={showOverlay()}\n                    showConnectionQuality\n                    onMouseEnter={() => setShowOverlay(true)}\n                    onMouseLeave={() => setShowOverlay(false)}\n                  />\n                )}\n              </For>\n            </div>\n            <div className=\"controlsArea\">\n              <Show when={props.roomState.room()}>\n                {(room) => (\n                  <ControlRenderer room={room} onLeave={props.onLeave} />\n                )}\n              </Show>\n            </div>\n          </div>\n        );\n      }}\n    >\n      <Match when={props.roomState.error()}>\n        {(error) => (\n          <div>\n            error:\n            {' '}\n            {error?.message}\n          </div>\n        )}\n      </Match>\n      <Match when={props.roomState.isConnecting()}>\n        {() => <div>connecting</div>}\n      </Match>\n      <Match when={!props.roomState.room()}>\n        {() => <div>room closed</div>}\n      </Match>\n      <Match when={!props.roomState.participants().length}>\n        {() => <div>no one is in the room</div>}\n      </Match>\n    </Switch>\n  );\n};\n", "// ANCHOR Solid\nimport {\n  JSX,\n  createEffect,\n  createSignal,\n  Switch,\n  Match,\n  Show,\n  For,\n} from 'solid-js';\n\n// ANCHOR LiveKit\nimport { Track, VideoTrack } from 'livekit-client';\n\n// ANCHOR Components\nimport { ControlsView } from '../ControlsView';\nimport { ParticipantView } from '../ParticipantView';\nimport { ScreenShareView } from '../ScreenShareView';\nimport { StageProps } from '../StageProps';\n\n// ANCHOR Styles\nimport './styles.module.css';\n\nexport const SpeakerStage = (\n  props: StageProps,\n): JSX.Element => {\n  const [showOverlay, setShowOverlay] = createSignal(false);\n\n  return (\n    <Switch\n      fallback={() => {\n        const ParticipantRenderer = props.participantRenderer ?? ParticipantView;\n        const ControlRenderer = props.controlRenderer ?? ControlsView;\n\n        // find first participant with screen shared\n        const [screenTrack, setScreenTrack] = createSignal<VideoTrack>();\n\n        createEffect(() => {\n          props.roomState.participants().forEach((participant) => {\n            setScreenTrack((current) => {\n              if (!current) {\n                const track = participant.getTrack(Track.Source.ScreenShare);\n\n                if (track?.isSubscribed && track.videoTrack) {\n                  return track.videoTrack;\n                }\n              }\n\n              return current;\n            });\n          });\n        });\n\n        const otherParticipants = props.roomState.participants;\n\n        const MainView = (): JSX.Element => (\n          <Show\n            when={screenTrack()}\n            fallback={(\n              <Show when={props.roomState.participants()[0]}>\n                {(participant) => (\n                  <ParticipantRenderer\n                    participant={participant}\n                    width=\"100%\"\n                    height=\"100%\"\n                    orientation=\"landscape\"\n                    showOverlay={showOverlay()}\n                    showConnectionQuality\n                    onMouseEnter={() => setShowOverlay(true)}\n                    onMouseLeave={() => setShowOverlay(false)}\n                  />\n                )}\n              </Show>\n            )}\n          >\n            {(track) => (\n              <ScreenShareView\n                track={track}\n                height=\"100%\"\n                width=\"100%\"\n              />\n            )}\n          </Show>\n        );\n\n        return (\n          // global container\n          <div className=\"container\">\n            <div className=\"stage\">\n              <div className=\"stageCenter\">\n                <MainView />\n              </div>\n              <div className=\"sidebar\">\n                <For each={otherParticipants()}>\n                  {(participant) => (\n                    <ParticipantRenderer\n                      participant={participant}\n                      width=\"100%\"\n                      aspectWidth={16}\n                      aspectHeight={9}\n                      showOverlay={showOverlay()}\n                      onMouseEnter={() => setShowOverlay(true)}\n                      onMouseLeave={() => setShowOverlay(false)}\n                    />\n                  )}\n                </For>\n              </div>\n            </div>\n            <div className=\"controlsArea\">\n              <Show when={props.roomState.room()}>\n                {(room) => (\n                  <ControlRenderer\n                    room={room}\n                    enableScreenShare={false}\n                    onLeave={props.onLeave}\n                  />\n                )}\n              </Show>\n            </div>\n          </div>\n        );\n      }}\n    >\n      <Match when={props.roomState.error()}>\n        {(error) => (\n          <div>\n            error:\n            {' '}\n            {error?.message}\n          </div>\n        )}\n      </Match>\n      <Match when={props.roomState.isConnecting()}>\n        {() => <div>connecting</div>}\n      </Match>\n      <Match when={!props.roomState.room()}>\n        {() => <div>room closed</div>}\n      </Match>\n      <Match when={!props.roomState.participants().length}>\n        {() => <div>no one is in the room</div>}\n      </Match>\n    </Switch>\n  );\n};\n", "// ANCHOR Solid\nimport {\n  JSX,\n  createSignal,\n  createEffect,\n  Switch,\n  Match,\n  Show,\n  For,\n} from 'solid-js';\n\n// ANCHOR LiveKit\nimport { Track, VideoTrack } from 'livekit-client';\n\n// ANCHOR Components\nimport { ControlsView } from '../ControlsView';\nimport { ParticipantView } from '../ParticipantView';\nimport { ScreenShareView } from '../ScreenShareView';\n\n// ANCHOR Styles\nimport './styles.module.css';\n\n// ANCHOR Types\nimport { StageProps } from '../StageProps';\n\nexport const MobileStage = (\n  props: StageProps,\n): JSX.Element => {\n  const [showOverlay, setShowOverlay] = createSignal(false);\n\n  return (\n    <Switch\n      fallback={() => {\n        const ParticipantRenderer = props.participantRenderer ?? ParticipantView;\n        const ControlRenderer = props.controlRenderer ?? ControlsView;\n\n        // find first participant with screen shared\n        const [screenTrack, setScreenTrack] = createSignal<VideoTrack>();\n\n        createEffect(() => {\n          props.roomState.participants().forEach((participant) => {\n            setScreenTrack((current) => {\n              if (!current) {\n                const track = participant.getTrack(Track.Source.ScreenShare);\n\n                if (track?.isSubscribed && track.videoTrack) {\n                  return track.videoTrack;\n                }\n              }\n\n              return current;\n            });\n          });\n        });\n\n        const otherParticipants = props.roomState.participants;\n\n        const MainView = (): JSX.Element => (\n          <Show\n            when={screenTrack()}\n            fallback={(\n              <Show when={props.roomState.participants()[0]}>\n                {(participant) => (\n                  <ParticipantRenderer\n                    participant={participant}\n                    showOverlay={showOverlay()}\n                    width=\"100%\"\n                    height=\"100%\"\n                    orientation=\"portrait\"\n                    showConnectionQuality\n                    onMouseEnter={() => setShowOverlay(true)}\n                    onMouseLeave={() => setShowOverlay(false)}\n                  />\n                )}\n              </Show>\n            )}\n          >\n            {(track) => (\n              <ScreenShareView\n                track={track}\n                height=\"100%\"\n                width=\"100%\"\n              />\n            )}\n          </Show>\n        );\n\n        return (\n          // global container\n          <div className=\"container\">\n            <div className=\"stage\">\n              <MainView />\n            </div>\n            <div className=\"participantsArea\">\n              <For each={otherParticipants()}>\n                {(participant) => (\n                  <ParticipantRenderer\n                    participant={participant}\n                    className=\"participant\"\n                    aspectWidth={4}\n                    aspectHeight={3}\n                    showOverlay={showOverlay()}\n                    onMouseEnter={() => setShowOverlay(true)}\n                    onMouseLeave={() => setShowOverlay(false)}\n                  />\n                )}\n              </For>\n            </div>\n            <div className=\"controlsArea\">\n              <Show when={props.roomState.room()}>\n                {(room) => (\n                  <ControlRenderer\n                    room={room}\n                    enableScreenShare={false}\n                    onLeave={props.onLeave}\n                  />\n                )}\n              </Show>\n            </div>\n          </div>\n        );\n      }}\n    >\n      <Match when={props.roomState.error()}>\n        {(error) => (\n          <div>\n            error:\n            {' '}\n            {error?.message}\n          </div>\n        )}\n      </Match>\n      <Match when={props.roomState.isConnecting()}>\n        {() => <div>connecting</div>}\n      </Match>\n      <Match when={!props.roomState.room()}>\n        {() => <div>room closed</div>}\n      </Match>\n      <Match when={!props.roomState.participants().length}>\n        {() => <div>no one is in the room</div>}\n      </Match>\n    </Switch>\n  );\n};\n", "/* eslint-disable no-console */\n// ANCHOR Solid\nimport {\n  createEffect,\n  JSX,\n  mergeProps,\n  onCleanup,\n} from 'solid-js';\n\n// ANCHOR LiveKit\nimport {\n  ConnectOptions,\n  Participant,\n  Room,\n} from 'livekit-client';\n\n// ANCHOR Signals\nimport { createRoom } from './signals/createRoom';\n\n// ANCHOR Components\nimport { ControlsProps } from './components/ControlsView';\nimport { ParticipantProps } from './components/ParticipantView';\nimport { StageProps } from './components/StageProps';\nimport { StageView } from './components/StageView';\n\nexport interface RoomProps {\n  url: string;\n  token: string;\n  connectOptions?: ConnectOptions;\n  // override default participant sort\n  sortParticipants?: (participants: Participant[]) => void;\n  // when first connected to room\n  onConnected?: (room: Room) => void;\n  // when user leaves the room\n  onLeave?: (room: Room) => void;\n  stageRenderer?: (props: StageProps) => JSX.Element;\n  participantRenderer?: (props: ParticipantProps) => JSX.Element;\n  controlRenderer?: (props: ControlsProps) => JSX.Element;\n}\n\nexport const LiveKitRoom = (props: RoomProps): JSX.Element => {\n  const mergedProps = mergeProps({ connectOptions: {} }, props);\n  const roomState = createRoom({ sortParticipants: props.sortParticipants });\n\n  createEffect(async () => {\n    try {\n      const room = await roomState.connect(\n        props.url,\n        props.token,\n        mergedProps.connectOptions,\n      );\n\n      if (!room) {\n        return;\n      }\n\n      if (props.onConnected) {\n        props.onConnected(room);\n      }\n\n      onCleanup(() => {\n        room.disconnect();\n      });\n    } catch (error) {\n      console.error(error);\n    }\n  });\n\n  const selectedStageRenderer = props.stageRenderer ?? StageView;\n\n  return selectedStageRenderer({\n    roomState,\n    participantRenderer: props.participantRenderer,\n    controlRenderer: props.controlRenderer,\n    onLeave: props.onLeave,\n  });\n};\n", "// ANCHOR Solid\nimport {\n  createSignal,\n  Accessor,\n  onCleanup,\n} from 'solid-js';\n\n// ANCHOR LiveKit\nimport {\n  AudioTrack,\n  connect,\n  ConnectOptions,\n  Participant,\n  RemoteTrack,\n  Room,\n  Track,\n} from 'livekit-client';\n\n// ANCHOR Utils\nimport { sortParticipants } from '../utils/sortParticipants';\n\n// ANCHOR Types\nexport interface RoomState {\n  connect: (\n    url: string,\n    token: string,\n    options?: ConnectOptions\n  ) => Promise<Room | undefined>;\n  isConnecting: Accessor<boolean>;\n  room: Accessor<Room | undefined>;\n  /* all participants in the room, including the local participant. */\n  participants: Accessor<Participant[]>;\n  /* all subscribed audio tracks in the room, not including local participant. */\n  audioTracks: Accessor<AudioTrack[]>;\n  error: Accessor<Error | undefined>;\n}\n\nexport interface RoomOptions {\n  sortParticipants?: (participants: Participant[]) => void;\n}\n\nexport function createRoom(\n  options?: RoomOptions,\n): RoomState {\n  const [room, setRoom] = createSignal<Room>();\n  const [isConnecting, setIsConnecting] = createSignal(false);\n  const [error, setError] = createSignal<Error>();\n  const [participants, setParticipants] = createSignal<Participant[]>([]);\n  const [audioTracks, setAudioTracks] = createSignal<AudioTrack[]>([]);\n\n  const sortFunction = options?.sortParticipants ?? sortParticipants;\n\n  const connectFunction = async (\n    url: string,\n    token: string,\n    connectOptions?: ConnectOptions,\n  ) => {\n    setIsConnecting(true);\n\n    try {\n      const newRoom = await connect(url, token, connectOptions);\n      setRoom(newRoom);\n\n      const onParticipantsChanged = () => {\n        const remotes: Participant[] = Array.from(newRoom.participants.values());\n        const localParticipants = [newRoom.localParticipant, ...remotes];\n        sortFunction(localParticipants, newRoom.localParticipant);\n        setParticipants(localParticipants);\n      };\n\n      const onSubscribedTrackChanged = (track?: RemoteTrack) => {\n        // ordering may have changed, re-sort\n        onParticipantsChanged();\n\n        if (!track || track.kind === Track.Kind.Audio) {\n          const tracks: AudioTrack[] = [];\n          newRoom.participants.forEach((participant) => {\n            participant.audioTracks.forEach(({ audioTrack }) => {\n              if (audioTrack) {\n                tracks.push(audioTrack);\n              }\n            });\n          });\n          setAudioTracks(tracks);\n        }\n      };\n\n      newRoom.once('disconnected', () => {\n        const timeoutId = setTimeout(() => setRoom(undefined));\n\n        newRoom\n          .off('participantConnected', onParticipantsChanged)\n          .off('participantDisconnected', onParticipantsChanged)\n          .off('activeSpeakersChanged', onParticipantsChanged)\n          .off('trackSubscribed', onSubscribedTrackChanged)\n          .off('trackUnsubscribed', onSubscribedTrackChanged)\n          .off('localTrackPublished', onParticipantsChanged)\n          .off('localTrackUnpublished', onParticipantsChanged)\n          .off('audioPlaybackChanged', onParticipantsChanged);\n\n        onCleanup(() => clearTimeout(timeoutId));\n      });\n\n      newRoom\n        .on('participantConnected', onParticipantsChanged)\n        .on('participantDisconnected', onParticipantsChanged)\n        .on('activeSpeakersChanged', onParticipantsChanged)\n        .on('trackSubscribed', onSubscribedTrackChanged)\n        .on('trackUnsubscribed', onSubscribedTrackChanged)\n        .on('localTrackPublished', onParticipantsChanged)\n        .on('localTrackUnpublished', onParticipantsChanged)\n      // trigger a state change by re-sorting participants\n        .on('audioPlaybackChanged', onParticipantsChanged);\n\n      setIsConnecting(false);\n      onSubscribedTrackChanged();\n\n      return newRoom;\n    } catch (err) {\n      setIsConnecting(false);\n\n      if (err instanceof Error) {\n        setError(err);\n      } else {\n        setError(new Error('an error has occured'));\n      }\n\n      return undefined;\n    }\n  };\n\n  return {\n    connect: connectFunction,\n    isConnecting,\n    room,\n    error,\n    participants,\n    audioTracks,\n  };\n}\n", "// ANCHOR LiveKit\nimport {\n  LocalParticipant,\n  Participant,\n} from 'livekit-client';\n\n/**\n * Default sort for participants, it'll order participants by:\n * 1. dominant speaker (speaker with the loudest audio level)\n * 2. local participant\n * 3. other speakers that are recently active\n * 4. participants with video on\n * 5. by joinedAt\n */\nexport function sortParticipants(\n  participants: Participant[],\n  localParticipant?: LocalParticipant,\n): void {\n  participants.sort((a, b) => {\n    // loudest speaker first\n    if (a.isSpeaking && b.isSpeaking) {\n      return b.audioLevel - a.audioLevel;\n    }\n\n    // speaker goes first\n    if (a.isSpeaking !== b.isSpeaking) {\n      if (a.isSpeaking) {\n        return -1;\n      }\n      return 1;\n    }\n\n    // last active speaker first\n    if (a.lastSpokeAt !== b.lastSpokeAt) {\n      const aLast = a.lastSpokeAt?.getTime() ?? 0;\n      const bLast = b.lastSpokeAt?.getTime() ?? 0;\n      return bLast - aLast;\n    }\n\n    // video on\n    const aVideo = a.videoTracks.size > 0;\n    const bVideo = b.videoTracks.size > 0;\n    if (aVideo !== bVideo) {\n      if (aVideo) {\n        return -1;\n      }\n      return 1;\n    }\n\n    // joinedAt\n    return (a.joinedAt?.getTime() ?? 0) - (b.joinedAt?.getTime() ?? 0);\n  });\n\n  if (localParticipant) {\n    const localIdx = participants.indexOf(localParticipant);\n    if (localIdx >= 0) {\n      participants.splice(localIdx, 1);\n      if (participants.length > 0) {\n        participants.splice(1, 0, localParticipant);\n      } else {\n        participants.push(localParticipant);\n      }\n    }\n  }\n}\n"],
  "mappings": "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",
  "names": []
}
