{
  "version": 3,
  "sources": ["../../../src/index.ts", "../../../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": ["export * from './components/AudioRenderer';\nexport * from './components/AudioSelectButton';\nexport * from './components/ControlButton';\nexport * from './components/ControlsView';\nexport * from './components/DisplayContext';\nexport * from './components/ParticipantView';\nexport * from './components/ScreenShareView';\nexport * from './components/StageProps';\nexport * from './components/StageView';\nexport * from './components/VideoRenderer';\nexport * from './components/VideoSelectButton';\nexport * from './LiveKitRoom';\nexport * from './signals/createRoom';\nexport * from './signals/createParticipant';\nexport * from './utils/sortParticipants';\n", "// 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": []
}
