@werxt/livekit-components-react 2.9.20 → 2.9.21-werxt.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +1 -1
- package/dist/prefabs/VideoConference.d.ts +2 -2
- package/dist/prefabs/VideoConference.d.ts.map +1 -1
- package/dist/prefabs.js +1 -1
- package/dist/prefabs.mjs +3 -2
- package/dist/prefabs.mjs.map +1 -1
- package/dist/{shared-DTHOl3uJ.js → shared-D2Tkgmsq.js} +2 -2
- package/dist/{shared-DTHOl3uJ.js.map → shared-D2Tkgmsq.js.map} +1 -1
- package/package.json +1 -1
- package/src/prefabs/VideoConference.tsx +4 -3
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shared-DTHOl3uJ.js","sources":["../src/hooks/internal/useMediaQuery.ts","../src/context/feature-context.ts","../src/components/controls/ChatToggle.tsx","../src/components/controls/DisconnectButton.tsx","../src/assets/icons/CameraDisabledIcon.tsx","../src/assets/icons/CameraIcon.tsx","../src/assets/icons/ChatCloseIcon.tsx","../src/assets/icons/ChatIcon.tsx","../src/assets/icons/Chevron.tsx","../src/assets/icons/FocusToggleIcon.tsx","../src/assets/icons/GearIcon.tsx","../src/assets/icons/LeaveIcon.tsx","../src/assets/icons/LockLockedIcon.tsx","../src/assets/icons/MicDisabledIcon.tsx","../src/assets/icons/MicIcon.tsx","../src/assets/icons/QualityExcellentIcon.tsx","../src/assets/icons/QualityGoodIcon.tsx","../src/assets/icons/QualityPoorIcon.tsx","../src/assets/icons/QualityUnknownIcon.tsx","../src/assets/icons/ScreenShareIcon.tsx","../src/assets/icons/ScreenShareStopIcon.tsx","../src/assets/icons/SpinnerIcon.tsx","../src/assets/icons/UnfocusToggleIcon.tsx","../src/components/controls/FocusToggle.tsx","../src/components/controls/MediaDeviceSelect.tsx","../src/components/controls/StartMediaButton.tsx","../src/assets/icons/util.tsx","../src/components/controls/TrackToggle.tsx","../src/components/participant/ConnectionQualityIndicator.tsx","../src/components/participant/ParticipantName.tsx","../src/components/participant/TrackMutedIndicator.tsx","../src/assets/images/ParticipantPlaceholder.tsx","../src/hooks/useMediaTrackBySourceOrName.ts","../../../node_modules/.pnpm/lodash.debounce@4.0.8/node_modules/lodash.debounce/index.js","../../../node_modules/.pnpm/usehooks-ts@3.1.1_react@18.3.1/node_modules/usehooks-ts/dist/index.js","../src/components/participant/VideoTrack.tsx","../src/components/participant/AudioTrack.tsx","../src/components/participant/ParticipantTile.tsx","../src/components/layout/FocusLayout.tsx","../src/components/TrackLoop.tsx","../src/components/controls/PaginationControl.tsx","../src/components/controls/PaginationIndicator.tsx","../src/components/layout/GridLayout.tsx","../src/components/layout/CarouselLayout.tsx","../src/components/layout/LayoutContextProvider.tsx","../src/components/RoomAudioRenderer.tsx","../src/components/Toast.tsx","../src/components/participant/animationSequences/connectingSequence.ts","../src/components/participant/animationSequences/listeningSequence.ts","../src/components/participant/animators/useBarAnimator.ts","../src/components/participant/BarVisualizer.tsx","../src/components/participant/ParticipantAudioTile.tsx","../src/components/ConnectionStateToast.tsx","../src/components/ChatEntry.tsx","../src/prefabs/Chat.tsx","../src/prefabs/MediaDeviceMenu.tsx","../src/hooks/useWarnAboutMissingStyles.ts","../src/prefabs/PreJoin.tsx","../src/hooks/useSettingsToggle.ts","../src/components/controls/SettingsMenuToggle.tsx","../src/prefabs/ControlBar.tsx","../src/prefabs/VideoConference.tsx","../src/prefabs/AudioConference.tsx","../src/prefabs/VoiceAssistantControlBar.tsx"],"sourcesContent":["import * as React from 'react';\n/**\n * Implementation used from https://github.com/juliencrn/usehooks-ts\n *\n * @internal\n */\nexport function useMediaQuery(query: string): boolean {\n const getMatches = (query: string): boolean => {\n // Prevents SSR issues\n if (typeof window !== 'undefined') {\n return window.matchMedia(query).matches;\n }\n return false;\n };\n\n const [matches, setMatches] = React.useState<boolean>(getMatches(query));\n\n function handleChange() {\n setMatches(getMatches(query));\n }\n\n React.useEffect(() => {\n const matchMedia = window.matchMedia(query);\n\n // Triggered at the first client-side load and if query changes\n handleChange();\n\n // Listen matchMedia\n if (matchMedia.addListener) {\n matchMedia.addListener(handleChange);\n } else {\n matchMedia.addEventListener('change', handleChange);\n }\n\n return () => {\n if (matchMedia.removeListener) {\n matchMedia.removeListener(handleChange);\n } else {\n matchMedia.removeEventListener('change', handleChange);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query]);\n\n return matches;\n}\n","import * as React from 'react';\n\n/** @internal */\nexport interface FeatureFlags {\n autoSubscription?: boolean;\n}\n\ntype FeatureContext<T extends boolean = false> = T extends true\n ? FeatureFlags\n : FeatureFlags | undefined;\n\n/** @internal */\nexport const LKFeatureContext = React.createContext<FeatureFlags | undefined>(undefined);\n\n/**\n * @internal\n */\nexport function useFeatureContext<T extends boolean>(require?: T): FeatureContext<T> {\n const ctx = React.useContext(LKFeatureContext) as FeatureContext<T>;\n if (require === true) {\n if (ctx) {\n return ctx;\n } else {\n throw Error('tried to access feature context, but none is present');\n }\n }\n return ctx;\n}\n","import * as React from 'react';\nimport { useChatToggle } from '../../hooks';\n\n/** @public */\nexport interface ChatToggleProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\n/**\n * The `ChatToggle` component is a button that toggles the visibility of the `Chat` component.\n * @remarks\n * For the component to have any effect it has to live inside a `LayoutContext` context.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <ToggleChat />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport const ChatToggle: (\n props: ChatToggleProps & React.RefAttributes<HTMLButtonElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLButtonElement, ChatToggleProps>(\n function ChatToggle(props: ChatToggleProps, ref) {\n const { mergedProps } = useChatToggle({ props });\n\n return (\n <button ref={ref} {...mergedProps}>\n {props.children}\n </button>\n );\n },\n);\n","import * as React from 'react';\nimport { useDisconnectButton } from '../../hooks';\n\n/** @public */\nexport interface DisconnectButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n stopTracks?: boolean;\n}\n\n/**\n * The `DisconnectButton` is a basic html button with the added ability to disconnect from a LiveKit room.\n * Normally this is the big red button that allows end users to leave the video or audio call.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <DisconnectButton>Leave room</DisconnectButton>\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport const DisconnectButton: (\n props: DisconnectButtonProps & React.RefAttributes<HTMLButtonElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLButtonElement, DisconnectButtonProps>(\n function DisconnectButton(props: DisconnectButtonProps, ref) {\n const { buttonProps } = useDisconnectButton(props);\n return (\n <button ref={ref} {...buttonProps}>\n {props.children}\n </button>\n );\n },\n);\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgCameraDisabledIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"currentColor\" {...props}>\n <path d=\"M1.354.646a.5.5 0 1 0-.708.708l14 14a.5.5 0 0 0 .708-.708L11 10.293V4.5A1.5 1.5 0 0 0 9.5 3H3.707zM0 4.5a1.5 1.5 0 0 1 .943-1.393l9.532 9.533c-.262.224-.603.36-.975.36h-8A1.5 1.5 0 0 1 0 11.5z\" />\n <path d=\"m15.2 3.6-2.8 2.1a1 1 0 0 0-.4.8v3a1 1 0 0 0 .4.8l2.8 2.1a.5.5 0 0 0 .8-.4V4a.5.5 0 0 0-.8-.4z\" />\n </svg>\n);\nexport default SvgCameraDisabledIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgCameraIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"currentColor\" {...props}>\n <path d=\"M0 4.5A1.5 1.5 0 0 1 1.5 3h8A1.5 1.5 0 0 1 11 4.5v7A1.5 1.5 0 0 1 9.5 13h-8A1.5 1.5 0 0 1 0 11.5zM15.2 3.6l-2.8 2.1a1 1 0 0 0-.4.8v3a1 1 0 0 0 .4.8l2.8 2.1a.5.5 0 0 0 .8-.4V4a.5.5 0 0 0-.8-.4z\" />\n </svg>\n);\nexport default SvgCameraIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgChatCloseIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"#FFF\"\n d=\"M4.99 3.99a1 1 0 0 0-.697 1.717L10.586 12l-6.293 6.293a1 1 0 1 0 1.414 1.414L12 13.414l6.293 6.293a1 1 0 1 0 1.414-1.414L13.414 12l6.293-6.293a1 1 0 0 0-.727-1.717 1 1 0 0 0-.687.303L12 10.586 5.707 4.293a1 1 0 0 0-.717-.303z\"\n />\n </svg>\n);\nexport default SvgChatCloseIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgChatIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={18} fill=\"none\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M0 2.75A2.75 2.75 0 0 1 2.75 0h10.5A2.75 2.75 0 0 1 16 2.75v13.594a.75.75 0 0 1-1.234.572l-3.691-3.12a1.25 1.25 0 0 0-.807-.296H2.75A2.75 2.75 0 0 1 0 10.75v-8ZM2.75 1.5c-.69 0-1.25.56-1.25 1.25v8c0 .69.56 1.25 1.25 1.25h7.518c.65 0 1.279.23 1.775.65l2.457 2.077V2.75c0-.69-.56-1.25-1.25-1.25H2.75Z\"\n clipRule=\"evenodd\"\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M3 4.5a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5Zm0 2a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5Zm0 2a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\nexport default SvgChatIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgChevron = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" {...props}>\n <path\n fill=\"currentcolor\"\n fillRule=\"evenodd\"\n d=\"M5.293 2.293a1 1 0 0 1 1.414 0l4.823 4.823a1.25 1.25 0 0 1 0 1.768l-4.823 4.823a1 1 0 0 1-1.414-1.414L9.586 8 5.293 3.707a1 1 0 0 1 0-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\nexport default SvgChevron;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgFocusToggleIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" {...props}>\n <g stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5}>\n <path d=\"M10 1.75h4.25m0 0V6m0-4.25L9 7M6 14.25H1.75m0 0V10m0 4.25L7 9\" />\n </g>\n </svg>\n);\nexport default SvgFocusToggleIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgGearIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" {...props}>\n <path\n fill=\"currentcolor\"\n fillRule=\"evenodd\"\n d=\"M8.961.894C8.875-.298 7.125-.298 7.04.894c-.066.912-1.246 1.228-1.76.472-.67-.99-2.186-.115-1.664.96.399.824-.465 1.688-1.288 1.289-1.076-.522-1.95.994-.961 1.665.756.513.44 1.693-.472 1.759-1.192.086-1.192 1.836 0 1.922.912.066 1.228 1.246.472 1.76-.99.67-.115 2.186.96 1.664.824-.399 1.688.465 1.289 1.288-.522 1.076.994 1.95 1.665.961.513-.756 1.693-.44 1.759.472.086 1.192 1.836 1.192 1.922 0 .066-.912 1.246-1.228 1.76-.472.67.99 2.186.115 1.664-.96-.399-.824.465-1.688 1.288-1.289 1.076.522 1.95-.994.961-1.665-.756-.513-.44-1.693.472-1.759 1.192-.086 1.192-1.836 0-1.922-.912-.066-1.228-1.246-.472-1.76.99-.67.115-2.186-.96-1.664-.824.399-1.688-.465-1.289-1.288.522-1.076-.994-1.95-1.665-.961-.513.756-1.693.44-1.759-.472ZM8 13A5 5 0 1 0 8 3a5 5 0 0 0 0 10Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\nexport default SvgGearIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgLeaveIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M2 2.75A2.75 2.75 0 0 1 4.75 0h6.5A2.75 2.75 0 0 1 14 2.75v10.5A2.75 2.75 0 0 1 11.25 16h-6.5A2.75 2.75 0 0 1 2 13.25v-.5a.75.75 0 0 1 1.5 0v.5c0 .69.56 1.25 1.25 1.25h6.5c.69 0 1.25-.56 1.25-1.25V2.75c0-.69-.56-1.25-1.25-1.25h-6.5c-.69 0-1.25.56-1.25 1.25v.5a.75.75 0 0 1-1.5 0v-.5Z\"\n clipRule=\"evenodd\"\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M8.78 7.47a.75.75 0 0 1 0 1.06l-2.25 2.25a.75.75 0 1 1-1.06-1.06l.97-.97H1.75a.75.75 0 0 1 0-1.5h4.69l-.97-.97a.75.75 0 0 1 1.06-1.06l2.25 2.25Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\nexport default SvgLeaveIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgLockLockedIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" {...props}>\n <path\n fill=\"currentcolor\"\n fillRule=\"evenodd\"\n d=\"M4 6.104V4a4 4 0 1 1 8 0v2.104c1.154.326 2 1.387 2 2.646v4.5A2.75 2.75 0 0 1 11.25 16h-6.5A2.75 2.75 0 0 1 2 13.25v-4.5c0-1.259.846-2.32 2-2.646ZM5.5 4a2.5 2.5 0 0 1 5 0v2h-5V4Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\nexport default SvgLockLockedIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgMicDisabledIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"currentColor\" {...props}>\n <path d=\"M12.227 11.52a5.477 5.477 0 0 0 1.246-2.97.5.5 0 0 0-.995-.1 4.478 4.478 0 0 1-.962 2.359l-1.07-1.07C10.794 9.247 11 8.647 11 8V3a3 3 0 0 0-6 0v1.293L1.354.646a.5.5 0 1 0-.708.708l14 14a.5.5 0 0 0 .708-.708zM8 12.5c.683 0 1.33-.152 1.911-.425l.743.743c-.649.359-1.378.59-2.154.66V15h2a.5.5 0 0 1 0 1h-5a.5.5 0 0 1 0-1h2v-1.522a5.502 5.502 0 0 1-4.973-4.929.5.5 0 0 1 .995-.098A4.5 4.5 0 0 0 8 12.5z\" />\n <path d=\"M8.743 10.907 5 7.164V8a3 3 0 0 0 3.743 2.907z\" />\n </svg>\n);\nexport default SvgMicDisabledIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgMicIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"currentColor\" {...props}>\n <path\n fillRule=\"evenodd\"\n d=\"M2.975 8.002a.5.5 0 0 1 .547.449 4.5 4.5 0 0 0 8.956 0 .5.5 0 1 1 .995.098A5.502 5.502 0 0 1 8.5 13.478V15h2a.5.5 0 0 1 0 1h-5a.5.5 0 0 1 0-1h2v-1.522a5.502 5.502 0 0 1-4.973-4.929.5.5 0 0 1 .448-.547z\"\n clipRule=\"evenodd\"\n />\n <path d=\"M5 3a3 3 0 1 1 6 0v5a3 3 0 0 1-6 0z\" />\n </svg>\n);\nexport default SvgMicIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgQualityExcellentIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"currentcolor\" {...props}>\n <path d=\"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n <path d=\"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n </svg>\n);\nexport default SvgQualityExcellentIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgQualityGoodIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"currentcolor\" {...props}>\n <path d=\"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n <path d=\"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n <g opacity={0.25}>\n <path d=\"M12 .5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n <path d=\"M12 .5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n </g>\n </svg>\n);\nexport default SvgQualityGoodIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgQualityPoorIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"currentcolor\" {...props}>\n <path d=\"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n <path d=\"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n <g opacity={0.25}>\n <path d=\"M6 6.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n <path d=\"M6 6.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n <path d=\"M12 .5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n </g>\n </svg>\n);\nexport default SvgQualityPoorIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgQualityUnknownIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"currentColor\" {...props}>\n <g opacity={0.25}>\n <path d=\"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-4Zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-9Zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5V.5Z\" />\n <path d=\"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-4Zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-9Zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5V.5Z\" />\n </g>\n </svg>\n);\nexport default SvgQualityUnknownIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgScreenShareIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={20} height={16} fill=\"none\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M0 2.75A2.75 2.75 0 0 1 2.75 0h14.5A2.75 2.75 0 0 1 20 2.75v10.5A2.75 2.75 0 0 1 17.25 16H2.75A2.75 2.75 0 0 1 0 13.25V2.75ZM2.75 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h14.5c.69 0 1.25-.56 1.25-1.25V2.75c0-.69-.56-1.25-1.25-1.25H2.75Z\"\n clipRule=\"evenodd\"\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M9.47 4.22a.75.75 0 0 1 1.06 0l2.25 2.25a.75.75 0 0 1-1.06 1.06l-.97-.97v4.69a.75.75 0 0 1-1.5 0V6.56l-.97.97a.75.75 0 0 1-1.06-1.06l2.25-2.25Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\nexport default SvgScreenShareIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgScreenShareStopIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={20} height={16} fill=\"none\" {...props}>\n <g fill=\"currentColor\">\n <path d=\"M7.28 4.22a.75.75 0 0 0-1.06 1.06L8.94 8l-2.72 2.72a.75.75 0 1 0 1.06 1.06L10 9.06l2.72 2.72a.75.75 0 1 0 1.06-1.06L11.06 8l2.72-2.72a.75.75 0 0 0-1.06-1.06L10 6.94z\" />\n <path\n fillRule=\"evenodd\"\n d=\"M2.75 0A2.75 2.75 0 0 0 0 2.75v10.5A2.75 2.75 0 0 0 2.75 16h14.5A2.75 2.75 0 0 0 20 13.25V2.75A2.75 2.75 0 0 0 17.25 0zM1.5 2.75c0-.69.56-1.25 1.25-1.25h14.5c.69 0 1.25.56 1.25 1.25v10.5c0 .69-.56 1.25-1.25 1.25H2.75c-.69 0-1.25-.56-1.25-1.25z\"\n clipRule=\"evenodd\"\n />\n </g>\n </svg>\n);\nexport default SvgScreenShareStopIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgSpinnerIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M8 0a.75.75 0 0 1 .75.75v2.5a.75.75 0 0 1-1.5 0V.75A.75.75 0 0 1 8 0Z\"\n clipRule=\"evenodd\"\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M8 12a.75.75 0 0 1 .75.75v2.5a.75.75 0 0 1-1.5 0v-2.5A.75.75 0 0 1 8 12Z\"\n clipRule=\"evenodd\"\n opacity={0.7}\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M12 1.072a.75.75 0 0 1 .274 1.024l-1.25 2.165a.75.75 0 0 1-1.299-.75l1.25-2.165A.75.75 0 0 1 12 1.072Z\"\n clipRule=\"evenodd\"\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M6 11.464a.75.75 0 0 1 .274 1.025l-1.25 2.165a.75.75 0 0 1-1.299-.75l1.25-2.165A.75.75 0 0 1 6 11.464Z\"\n clipRule=\"evenodd\"\n opacity={0.6}\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M14.928 4a.75.75 0 0 1-.274 1.025l-2.165 1.25a.75.75 0 1 1-.75-1.3l2.165-1.25A.75.75 0 0 1 14.928 4Z\"\n clipRule=\"evenodd\"\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M4.536 10a.75.75 0 0 1-.275 1.024l-2.165 1.25a.75.75 0 0 1-.75-1.298l2.165-1.25A.75.75 0 0 1 4.536 10Z\"\n clipRule=\"evenodd\"\n opacity={0.5}\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M16 8a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h2.5A.75.75 0 0 1 16 8Z\"\n clipRule=\"evenodd\"\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M4 8a.75.75 0 0 1-.75.75H.75a.75.75 0 0 1 0-1.5h2.5A.75.75 0 0 1 4 8Z\"\n clipRule=\"evenodd\"\n opacity={0.4}\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M14.928 12a.75.75 0 0 1-1.024.274l-2.165-1.25a.75.75 0 0 1 .75-1.299l2.165 1.25A.75.75 0 0 1 14.928 12Z\"\n clipRule=\"evenodd\"\n opacity={0.9}\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M4.536 6a.75.75 0 0 1-1.025.275l-2.165-1.25a.75.75 0 1 1 .75-1.3l2.165 1.25A.75.75 0 0 1 4.536 6Z\"\n clipRule=\"evenodd\"\n opacity={0.3}\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M12 14.928a.75.75 0 0 1-1.024-.274l-1.25-2.165a.75.75 0 0 1 1.298-.75l1.25 2.165A.75.75 0 0 1 12 14.928Z\"\n clipRule=\"evenodd\"\n opacity={0.8}\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M6 4.536a.75.75 0 0 1-1.024-.275l-1.25-2.165a.75.75 0 1 1 1.299-.75l1.25 2.165A.75.75 0 0 1 6 4.536Z\"\n clipRule=\"evenodd\"\n opacity={0.2}\n />\n </svg>\n);\nexport default SvgSpinnerIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgUnfocusToggleIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" {...props}>\n <g stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5}>\n <path d=\"M13.25 7H9m0 0V2.75M9 7l5.25-5.25M2.75 9H7m0 0v4.25M7 9l-5.25 5.25\" />\n </g>\n </svg>\n);\nexport default SvgUnfocusToggleIcon;\n","import * as React from 'react';\nimport { LayoutContext, useMaybeTrackRefContext } from '../../context';\nimport { FocusToggleIcon, UnfocusToggleIcon } from '../../assets/icons';\nimport { useFocusToggle } from '../../hooks';\nimport type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\n\n/** @public */\nexport interface FocusToggleProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n trackRef?: TrackReferenceOrPlaceholder;\n}\n\n/**\n * The `FocusToggle` puts the `ParticipantTile` in focus or removes it from focus.\n * @remarks\n * This component needs to live inside `LayoutContext` to work properly.\n *\n * @example\n * ```tsx\n * <ParticipantTile>\n * <FocusToggle />\n * </ParticipantTile>\n * ```\n * @public\n */\nexport const FocusToggle: (\n props: FocusToggleProps & React.RefAttributes<HTMLButtonElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLButtonElement, FocusToggleProps>(\n function FocusToggle({ trackRef, ...props }: FocusToggleProps, ref) {\n const trackRefFromContext = useMaybeTrackRefContext();\n\n const { mergedProps, inFocus } = useFocusToggle({\n trackRef: trackRef ?? trackRefFromContext,\n props,\n });\n\n return (\n <LayoutContext.Consumer>\n {(layoutContext) =>\n layoutContext !== undefined && (\n <button ref={ref} {...mergedProps}>\n {props.children ? (\n props.children\n ) : inFocus ? (\n <UnfocusToggleIcon />\n ) : (\n <FocusToggleIcon />\n )}\n </button>\n )\n }\n </LayoutContext.Consumer>\n );\n },\n);\n","import * as React from 'react';\nimport { useMaybeRoomContext } from '../../context';\nimport { mergeProps } from '../../utils';\nimport { RoomEvent, type LocalAudioTrack, type LocalVideoTrack } from 'livekit-client';\nimport { useMediaDeviceSelect } from '../../hooks';\n\n/** @public */\nexport interface MediaDeviceSelectProps\n extends Omit<React.HTMLAttributes<HTMLUListElement>, 'onError'> {\n kind: MediaDeviceKind;\n onActiveDeviceChange?: (deviceId: string) => void;\n onDeviceListChange?: (devices: MediaDeviceInfo[]) => void;\n onDeviceSelectError?: (e: Error) => void;\n initialSelection?: string;\n /** will force the browser to only return the specified device\n * will call `onDeviceSelectError` with the error in case this fails\n */\n exactMatch?: boolean;\n track?: LocalAudioTrack | LocalVideoTrack;\n /**\n * this will call getUserMedia if the permissions are not yet given to enumerate the devices with device labels.\n * in some browsers multiple calls to getUserMedia result in multiple permission prompts.\n * It's generally advised only flip this to true, once a (preview) track has been acquired successfully with the\n * appropriate permissions.\n *\n * @see {@link MediaDeviceMenu}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/enumerateDevices | MDN enumerateDevices}\n */\n requestPermissions?: boolean;\n onError?: (e: Error) => void;\n}\n\n/**\n * The `MediaDeviceSelect` list all media devices of one kind.\n * Clicking on one of the listed devices make it the active media device.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <MediaDeviceSelect kind='audioinput' />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport const MediaDeviceSelect: (\n props: MediaDeviceSelectProps & React.RefAttributes<HTMLUListElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLUListElement, MediaDeviceSelectProps>(\n function MediaDeviceSelect(\n {\n kind,\n initialSelection,\n onActiveDeviceChange,\n onDeviceListChange,\n onDeviceSelectError,\n exactMatch,\n track,\n requestPermissions,\n onError,\n ...props\n }: MediaDeviceSelectProps,\n ref,\n ) {\n const room = useMaybeRoomContext();\n const previousActiveDeviceId = React.useRef<string>('default');\n const handleError = React.useCallback(\n (e: Error) => {\n if (room) {\n // awkwardly emit the event from outside of the room, as we don't have other means to raise a MediaDeviceError\n room.emit(RoomEvent.MediaDevicesError, e);\n }\n onError?.(e);\n },\n [room, onError],\n );\n const { devices, activeDeviceId, setActiveMediaDevice, className } = useMediaDeviceSelect({\n kind,\n room,\n track,\n requestPermissions,\n onError: handleError,\n });\n React.useEffect(() => {\n if (initialSelection !== undefined) {\n setActiveMediaDevice(initialSelection);\n }\n }, [setActiveMediaDevice]);\n\n React.useEffect(() => {\n if (typeof onDeviceListChange === 'function') {\n onDeviceListChange(devices);\n }\n }, [onDeviceListChange, devices]);\n\n React.useEffect(() => {\n if (activeDeviceId !== previousActiveDeviceId.current) {\n onActiveDeviceChange?.(activeDeviceId);\n }\n previousActiveDeviceId.current = activeDeviceId;\n }, [activeDeviceId]);\n\n const handleActiveDeviceChange = async (deviceId: string) => {\n try {\n await setActiveMediaDevice(deviceId, { exact: exactMatch ?? true });\n } catch (e) {\n if (e instanceof Error) {\n onDeviceSelectError?.(e);\n } else {\n throw e;\n }\n }\n };\n // Merge Props\n const mergedProps = React.useMemo(\n () => mergeProps(props, { className }, { className: 'lk-list' }),\n [className, props],\n );\n\n const hasDefault = !!devices.find((info) => info.label.toLowerCase().startsWith('default'));\n\n function isActive(deviceId: string, activeDeviceId: string, index: number) {\n return (\n deviceId === activeDeviceId || (!hasDefault && index === 0 && activeDeviceId === 'default')\n );\n }\n\n return (\n <ul ref={ref} {...mergedProps}>\n {devices.map((device, index) => (\n <li\n key={device.deviceId}\n id={device.deviceId}\n data-lk-active={isActive(device.deviceId, activeDeviceId, index)}\n aria-selected={isActive(device.deviceId, activeDeviceId, index)}\n role=\"option\"\n >\n <button className=\"lk-button\" onClick={() => handleActiveDeviceChange(device.deviceId)}>\n {device.label}\n </button>\n </li>\n ))}\n </ul>\n );\n },\n);\n","import * as React from 'react';\nimport { useRoomContext } from '../../context';\nimport { useStartAudio, useStartVideo } from '../../hooks';\n\n/** @public */\nexport interface AllowMediaPlaybackProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n label?: string;\n}\n\n/**\n * The `StartMediaButton` component is only visible when the browser blocks media playback. This is due to some browser implemented autoplay policies.\n * To start media playback, the user must perform a user-initiated event such as clicking this button.\n * As soon as media playback starts, the button hides itself again.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <StartMediaButton label=\"Click to allow media playback\" />\n * </LiveKitRoom>\n * ```\n *\n * @see Autoplay policy on MDN web docs: {@link https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Best_practices#autoplay_policy}\n * @public\n */\nexport const StartMediaButton: (\n props: AllowMediaPlaybackProps & React.RefAttributes<HTMLButtonElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLButtonElement, AllowMediaPlaybackProps>(\n function StartMediaButton({ label, ...props }: AllowMediaPlaybackProps, ref) {\n const room = useRoomContext();\n const { mergedProps: audioProps, canPlayAudio } = useStartAudio({ room, props });\n const { mergedProps, canPlayVideo } = useStartVideo({ room, props: audioProps });\n const { style, ...restProps } = mergedProps;\n style.display = canPlayAudio && canPlayVideo ? 'none' : 'block';\n\n return (\n <button ref={ref} style={style} {...restProps}>\n {label ?? `Start ${!canPlayAudio ? 'Audio' : 'Video'}`}\n </button>\n );\n },\n);\n","import * as React from 'react';\nimport { ConnectionQuality, Track } from 'livekit-client';\n\nimport {\n MicIcon,\n MicDisabledIcon,\n CameraIcon,\n CameraDisabledIcon,\n QualityUnknownIcon,\n QualityExcellentIcon,\n QualityGoodIcon,\n QualityPoorIcon,\n ScreenShareIcon,\n ScreenShareStopIcon,\n} from './index';\n\n/**\n * @internal\n */\nexport function getSourceIcon(source: Track.Source, enabled: boolean) {\n switch (source) {\n case Track.Source.Microphone:\n return enabled ? <MicIcon /> : <MicDisabledIcon />;\n case Track.Source.Camera:\n return enabled ? <CameraIcon /> : <CameraDisabledIcon />;\n case Track.Source.ScreenShare:\n return enabled ? <ScreenShareStopIcon /> : <ScreenShareIcon />;\n default:\n return undefined;\n }\n}\n\n/**\n * @internal\n */\nexport function getConnectionQualityIcon(quality: ConnectionQuality) {\n switch (quality) {\n case ConnectionQuality.Excellent:\n return <QualityExcellentIcon />;\n case ConnectionQuality.Good:\n return <QualityGoodIcon />;\n case ConnectionQuality.Poor:\n return <QualityPoorIcon />;\n default:\n return <QualityUnknownIcon />;\n }\n}\n","import type { CaptureOptionsBySource, ToggleSource } from '@livekit/components-core';\nimport * as React from 'react';\nimport { getSourceIcon } from '../../assets/icons/util';\nimport { useTrackToggle } from '../../hooks';\nimport { TrackPublishOptions } from 'livekit-client';\n\n/** @public */\nexport interface TrackToggleProps<T extends ToggleSource>\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n source: T;\n showIcon?: boolean;\n initialState?: boolean;\n /**\n * Function that is called when the enabled state of the toggle changes.\n * The second function argument `isUserInitiated` is `true` if the change was initiated by a user interaction, such as a click.\n */\n onChange?: (enabled: boolean, isUserInitiated: boolean) => void;\n captureOptions?: CaptureOptionsBySource<T>;\n publishOptions?: TrackPublishOptions;\n onDeviceError?: (error: Error) => void;\n}\n\n/**\n * With the `TrackToggle` component it is possible to mute and unmute your camera and microphone.\n * The component uses an html button element under the hood so you can treat it like a button.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <TrackToggle source={Track.Source.Microphone} />\n * <TrackToggle source={Track.Source.Camera} />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport const TrackToggle: <T extends ToggleSource>(\n props: TrackToggleProps<T> & React.RefAttributes<HTMLButtonElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef(function TrackToggle<\n T extends ToggleSource,\n>({ showIcon, ...props }: TrackToggleProps<T>, ref: React.ForwardedRef<HTMLButtonElement>) {\n const { buttonProps, enabled } = useTrackToggle(props);\n const [isClient, setIsClient] = React.useState(false);\n React.useEffect(() => {\n setIsClient(true);\n }, []);\n return (\n isClient && (\n <button ref={ref} {...buttonProps}>\n {(showIcon ?? true) && getSourceIcon(props.source, enabled)}\n {props.children}\n </button>\n )\n );\n});\n","import * as React from 'react';\nimport { mergeProps } from '../../utils';\nimport { getConnectionQualityIcon } from '../../assets/icons/util';\nimport type { ConnectionQualityIndicatorOptions } from '../../hooks';\nimport { useConnectionQualityIndicator } from '../../hooks';\n\n/** @public */\nexport interface ConnectionQualityIndicatorProps\n extends React.HTMLAttributes<HTMLDivElement>,\n ConnectionQualityIndicatorOptions {}\n\n/**\n * The `ConnectionQualityIndicator` shows the individual connection quality of a participant.\n *\n * @example\n * ```tsx\n * <ConnectionQualityIndicator />\n * ```\n * @public\n */\nexport const ConnectionQualityIndicator: (\n props: ConnectionQualityIndicatorProps & React.RefAttributes<HTMLDivElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<\n HTMLDivElement,\n ConnectionQualityIndicatorProps\n>(function ConnectionQualityIndicator(props: ConnectionQualityIndicatorProps, ref) {\n const { className, quality } = useConnectionQualityIndicator(props);\n const elementProps = React.useMemo(() => {\n return { ...mergeProps(props, { className: className as string }), 'data-lk-quality': quality };\n }, [quality, props, className]);\n return (\n <div ref={ref} {...elementProps}>\n {props.children ?? getConnectionQualityIcon(quality)}\n </div>\n );\n});\n","import { setupParticipantName } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useEnsureParticipant } from '../../context';\nimport { useObservableState } from '../../hooks/internal/useObservableState';\nimport { mergeProps } from '../../utils';\nimport type { UseParticipantInfoOptions } from '../../hooks';\n\n/** @public */\nexport interface ParticipantNameProps\n extends React.HTMLAttributes<HTMLSpanElement>,\n UseParticipantInfoOptions {}\n\n/**\n * The `ParticipantName` component displays the name of the participant as a string within an HTML span element.\n * If no participant name is undefined the participant identity string is displayed.\n *\n * @example\n * ```tsx\n * <ParticipantName />\n * ```\n * @public\n */\nexport const ParticipantName: (\n props: ParticipantNameProps & React.RefAttributes<HTMLSpanElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLSpanElement, ParticipantNameProps>(\n function ParticipantName({ participant, ...props }: ParticipantNameProps, ref) {\n const p = useEnsureParticipant(participant);\n\n const { className, infoObserver } = React.useMemo(() => {\n return setupParticipantName(p);\n }, [p]);\n\n const { identity, name } = useObservableState(infoObserver, {\n name: p.name,\n identity: p.identity,\n metadata: p.metadata,\n });\n\n const mergedProps = React.useMemo(() => {\n return mergeProps(props, { className, 'data-lk-participant-name': name });\n }, [props, className, name]);\n\n return (\n <span ref={ref} {...mergedProps}>\n {name !== '' ? name : identity}\n {props.children}\n </span>\n );\n },\n);\n","import * as React from 'react';\nimport { mergeProps } from '../../utils';\nimport { getSourceIcon } from '../../assets/icons/util';\nimport { useTrackMutedIndicator } from '../../hooks';\nimport type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\n\n/** @public */\nexport interface TrackMutedIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {\n trackRef: TrackReferenceOrPlaceholder;\n show?: 'always' | 'muted' | 'unmuted';\n}\n\n/**\n * The `TrackMutedIndicator` shows whether the participant's camera or microphone is muted or not.\n * By default, a muted/unmuted icon is displayed for a camera, microphone, and screen sharing track.\n *\n * @example\n * ```tsx\n * <TrackMutedIndicator trackRef={trackRef} />\n * ```\n * @public\n */\nexport const TrackMutedIndicator: (\n props: TrackMutedIndicatorProps & React.RefAttributes<HTMLDivElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLDivElement, TrackMutedIndicatorProps>(\n function TrackMutedIndicator(\n { trackRef, show = 'always', ...props }: TrackMutedIndicatorProps,\n ref,\n ) {\n const { className, isMuted } = useTrackMutedIndicator(trackRef);\n\n const showIndicator =\n show === 'always' || (show === 'muted' && isMuted) || (show === 'unmuted' && !isMuted);\n\n const htmlProps = React.useMemo(\n () =>\n mergeProps(props, {\n className,\n }),\n [className, props],\n );\n\n if (!showIndicator) {\n return null;\n }\n\n return (\n <div ref={ref} {...htmlProps} data-lk-muted={isMuted}>\n {props.children ?? getSourceIcon(trackRef.source, !isMuted)}\n </div>\n );\n },\n);\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgParticipantPlaceholder = (props: SVGProps<SVGSVGElement>) => (\n <svg\n width={320}\n height={320}\n viewBox=\"0 0 320 320\"\n preserveAspectRatio=\"xMidYMid meet\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M160 180C204.182 180 240 144.183 240 100C240 55.8172 204.182 20 160 20C115.817 20 79.9997 55.8172 79.9997 100C79.9997 144.183 115.817 180 160 180Z\"\n fill=\"white\"\n fillOpacity={0.25}\n />\n <path\n d=\"M97.6542 194.614C103.267 191.818 109.841 192.481 115.519 195.141C129.025 201.466 144.1 205 159.999 205C175.899 205 190.973 201.466 204.48 195.141C210.158 192.481 216.732 191.818 222.345 194.614C262.703 214.719 291.985 253.736 298.591 300.062C300.15 310.997 291.045 320 280 320H39.9997C28.954 320 19.8495 310.997 21.4087 300.062C28.014 253.736 57.2966 214.72 97.6542 194.614Z\"\n fill=\"white\"\n fillOpacity={0.25}\n />\n </svg>\n);\nexport default SvgParticipantPlaceholder;\n","import type { TrackIdentifier } from '@livekit/components-core';\nimport {\n getTrackByIdentifier,\n isTrackReference,\n log,\n setupMediaTrack,\n} from '@livekit/components-core';\nimport * as React from 'react';\nimport { mergeProps } from '../utils';\n\n/** @public */\nexport interface UseMediaTrackOptions {\n element?: React.RefObject<HTMLMediaElement> | null;\n props?: React.HTMLAttributes<HTMLVideoElement | HTMLAudioElement>;\n}\n\n/**\n * @internal\n */\nexport function useMediaTrackBySourceOrName(\n observerOptions: TrackIdentifier,\n options: UseMediaTrackOptions = {},\n) {\n const [publication, setPublication] = React.useState(getTrackByIdentifier(observerOptions));\n\n const [isMuted, setMuted] = React.useState(publication?.isMuted);\n const [isSubscribed, setSubscribed] = React.useState(publication?.isSubscribed);\n\n const [track, setTrack] = React.useState(publication?.track);\n const [orientation, setOrientation] = React.useState<'landscape' | 'portrait'>('landscape');\n const previousElement = React.useRef<HTMLMediaElement | undefined | null>();\n\n const { className, trackObserver } = React.useMemo(() => {\n return setupMediaTrack(observerOptions);\n }, [\n observerOptions.participant.sid ?? observerOptions.participant.identity,\n observerOptions.source,\n isTrackReference(observerOptions) && observerOptions.publication.trackSid,\n ]);\n\n React.useEffect(() => {\n const subscription = trackObserver.subscribe((publication) => {\n log.debug('update track', publication);\n setPublication(publication);\n setMuted(publication?.isMuted);\n setSubscribed(publication?.isSubscribed);\n setTrack(publication?.track);\n });\n return () => subscription?.unsubscribe();\n }, [trackObserver]);\n\n React.useEffect(() => {\n if (track) {\n if (previousElement.current) {\n track.detach(previousElement.current);\n }\n if (\n options.element?.current &&\n !(observerOptions.participant.isLocal && track?.kind === 'audio')\n ) {\n track.attach(options.element.current);\n }\n }\n previousElement.current = options.element?.current;\n return () => {\n if (previousElement.current) {\n track?.detach(previousElement.current);\n }\n };\n }, [track, options.element]);\n\n React.useEffect(() => {\n // Set the orientation of the video track.\n // TODO: This does not handle changes in orientation after a track got published (e.g when rotating a phone camera from portrait to landscape).\n if (\n typeof publication?.dimensions?.width === 'number' &&\n typeof publication?.dimensions?.height === 'number'\n ) {\n const orientation_ =\n publication.dimensions.width > publication.dimensions.height ? 'landscape' : 'portrait';\n setOrientation(orientation_);\n }\n }, [publication]);\n\n return {\n publication,\n isMuted,\n isSubscribed,\n track,\n elementProps: mergeProps(options.props, {\n className,\n 'data-lk-local-participant': observerOptions.participant.isLocal,\n 'data-lk-source': publication?.source,\n ...(publication?.kind === 'video' && { 'data-lk-orientation': orientation }),\n }),\n };\n}\n","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n","import { useState, useCallback, useLayoutEffect, useEffect, useRef, useMemo } from 'react';\nimport debounce from 'lodash.debounce';\n\n// src/useBoolean/useBoolean.ts\nfunction useBoolean(defaultValue = false) {\n if (typeof defaultValue !== \"boolean\") {\n throw new Error(\"defaultValue must be `true` or `false`\");\n }\n const [value, setValue] = useState(defaultValue);\n const setTrue = useCallback(() => {\n setValue(true);\n }, []);\n const setFalse = useCallback(() => {\n setValue(false);\n }, []);\n const toggle = useCallback(() => {\n setValue((x) => !x);\n }, []);\n return { value, setValue, setTrue, setFalse, toggle };\n}\nvar useIsomorphicLayoutEffect = typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\n// src/useEventListener/useEventListener.ts\nfunction useEventListener(eventName, handler, element, options) {\n const savedHandler = useRef(handler);\n useIsomorphicLayoutEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n useEffect(() => {\n const targetElement = (element == null ? void 0 : element.current) ?? window;\n if (!(targetElement && targetElement.addEventListener))\n return;\n const listener = (event) => {\n savedHandler.current(event);\n };\n targetElement.addEventListener(eventName, listener, options);\n return () => {\n targetElement.removeEventListener(eventName, listener, options);\n };\n }, [eventName, element, options]);\n}\n\n// src/useClickAnyWhere/useClickAnyWhere.ts\nfunction useClickAnyWhere(handler) {\n useEventListener(\"click\", (event) => {\n handler(event);\n });\n}\nfunction useCopyToClipboard() {\n const [copiedText, setCopiedText] = useState(null);\n const copy = useCallback(async (text) => {\n if (!(navigator == null ? void 0 : navigator.clipboard)) {\n console.warn(\"Clipboard not supported\");\n return false;\n }\n try {\n await navigator.clipboard.writeText(text);\n setCopiedText(text);\n return true;\n } catch (error) {\n console.warn(\"Copy failed\", error);\n setCopiedText(null);\n return false;\n }\n }, []);\n return [copiedText, copy];\n}\nfunction useCounter(initialValue) {\n const [count, setCount] = useState(initialValue ?? 0);\n const increment = useCallback(() => {\n setCount((x) => x + 1);\n }, []);\n const decrement = useCallback(() => {\n setCount((x) => x - 1);\n }, []);\n const reset = useCallback(() => {\n setCount(initialValue ?? 0);\n }, [initialValue]);\n return {\n count,\n increment,\n decrement,\n reset,\n setCount\n };\n}\nfunction useInterval(callback, delay) {\n const savedCallback = useRef(callback);\n useIsomorphicLayoutEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n useEffect(() => {\n if (delay === null) {\n return;\n }\n const id = setInterval(() => {\n savedCallback.current();\n }, delay);\n return () => {\n clearInterval(id);\n };\n }, [delay]);\n}\n\n// src/useCountdown/useCountdown.ts\nfunction useCountdown({\n countStart,\n countStop = 0,\n intervalMs = 1e3,\n isIncrement = false\n}) {\n const {\n count,\n increment,\n decrement,\n reset: resetCounter\n } = useCounter(countStart);\n const {\n value: isCountdownRunning,\n setTrue: startCountdown,\n setFalse: stopCountdown\n } = useBoolean(false);\n const resetCountdown = useCallback(() => {\n stopCountdown();\n resetCounter();\n }, [stopCountdown, resetCounter]);\n const countdownCallback = useCallback(() => {\n if (count === countStop) {\n stopCountdown();\n return;\n }\n if (isIncrement) {\n increment();\n } else {\n decrement();\n }\n }, [count, countStop, decrement, increment, isIncrement, stopCountdown]);\n useInterval(countdownCallback, isCountdownRunning ? intervalMs : null);\n return [count, { startCountdown, stopCountdown, resetCountdown }];\n}\nfunction useEventCallback(fn) {\n const ref = useRef(() => {\n throw new Error(\"Cannot call an event handler while rendering.\");\n });\n useIsomorphicLayoutEffect(() => {\n ref.current = fn;\n }, [fn]);\n return useCallback((...args) => {\n var _a;\n return (_a = ref.current) == null ? void 0 : _a.call(ref, ...args);\n }, [ref]);\n}\n\n// src/useLocalStorage/useLocalStorage.ts\nvar IS_SERVER = typeof window === \"undefined\";\nfunction useLocalStorage(key, initialValue, options = {}) {\n const { initializeWithValue = true } = options;\n const serializer = useCallback(\n (value) => {\n if (options.serializer) {\n return options.serializer(value);\n }\n return JSON.stringify(value);\n },\n [options]\n );\n const deserializer = useCallback(\n (value) => {\n if (options.deserializer) {\n return options.deserializer(value);\n }\n if (value === \"undefined\") {\n return void 0;\n }\n const defaultValue = initialValue instanceof Function ? initialValue() : initialValue;\n let parsed;\n try {\n parsed = JSON.parse(value);\n } catch (error) {\n console.error(\"Error parsing JSON:\", error);\n return defaultValue;\n }\n return parsed;\n },\n [options, initialValue]\n );\n const readValue = useCallback(() => {\n const initialValueToUse = initialValue instanceof Function ? initialValue() : initialValue;\n if (IS_SERVER) {\n return initialValueToUse;\n }\n try {\n const raw = window.localStorage.getItem(key);\n return raw ? deserializer(raw) : initialValueToUse;\n } catch (error) {\n console.warn(`Error reading localStorage key \\u201C${key}\\u201D:`, error);\n return initialValueToUse;\n }\n }, [initialValue, key, deserializer]);\n const [storedValue, setStoredValue] = useState(() => {\n if (initializeWithValue) {\n return readValue();\n }\n return initialValue instanceof Function ? initialValue() : initialValue;\n });\n const setValue = useEventCallback((value) => {\n if (IS_SERVER) {\n console.warn(\n `Tried setting localStorage key \\u201C${key}\\u201D even though environment is not a client`\n );\n }\n try {\n const newValue = value instanceof Function ? value(readValue()) : value;\n window.localStorage.setItem(key, serializer(newValue));\n setStoredValue(newValue);\n window.dispatchEvent(new StorageEvent(\"local-storage\", { key }));\n } catch (error) {\n console.warn(`Error setting localStorage key \\u201C${key}\\u201D:`, error);\n }\n });\n const removeValue = useEventCallback(() => {\n if (IS_SERVER) {\n console.warn(\n `Tried removing localStorage key \\u201C${key}\\u201D even though environment is not a client`\n );\n }\n const defaultValue = initialValue instanceof Function ? initialValue() : initialValue;\n window.localStorage.removeItem(key);\n setStoredValue(defaultValue);\n window.dispatchEvent(new StorageEvent(\"local-storage\", { key }));\n });\n useEffect(() => {\n setStoredValue(readValue());\n }, [key]);\n const handleStorageChange = useCallback(\n (event) => {\n if (event.key && event.key !== key) {\n return;\n }\n setStoredValue(readValue());\n },\n [key, readValue]\n );\n useEventListener(\"storage\", handleStorageChange);\n useEventListener(\"local-storage\", handleStorageChange);\n return [storedValue, setValue, removeValue];\n}\nvar IS_SERVER2 = typeof window === \"undefined\";\nfunction useMediaQuery(query, {\n defaultValue = false,\n initializeWithValue = true\n} = {}) {\n const getMatches = (query2) => {\n if (IS_SERVER2) {\n return defaultValue;\n }\n return window.matchMedia(query2).matches;\n };\n const [matches, setMatches] = useState(() => {\n if (initializeWithValue) {\n return getMatches(query);\n }\n return defaultValue;\n });\n function handleChange() {\n setMatches(getMatches(query));\n }\n useIsomorphicLayoutEffect(() => {\n const matchMedia = window.matchMedia(query);\n handleChange();\n if (matchMedia.addListener) {\n matchMedia.addListener(handleChange);\n } else {\n matchMedia.addEventListener(\"change\", handleChange);\n }\n return () => {\n if (matchMedia.removeListener) {\n matchMedia.removeListener(handleChange);\n } else {\n matchMedia.removeEventListener(\"change\", handleChange);\n }\n };\n }, [query]);\n return matches;\n}\n\n// src/useDarkMode/useDarkMode.ts\nvar COLOR_SCHEME_QUERY = \"(prefers-color-scheme: dark)\";\nvar LOCAL_STORAGE_KEY = \"usehooks-ts-dark-mode\";\nfunction useDarkMode(options = {}) {\n const {\n defaultValue,\n localStorageKey = LOCAL_STORAGE_KEY,\n initializeWithValue = true\n } = options;\n const isDarkOS = useMediaQuery(COLOR_SCHEME_QUERY, {\n initializeWithValue,\n defaultValue\n });\n const [isDarkMode, setDarkMode] = useLocalStorage(\n localStorageKey,\n defaultValue ?? isDarkOS ?? false,\n { initializeWithValue }\n );\n useIsomorphicLayoutEffect(() => {\n if (isDarkOS !== isDarkMode) {\n setDarkMode(isDarkOS);\n }\n }, [isDarkOS]);\n return {\n isDarkMode,\n toggle: () => {\n setDarkMode((prev) => !prev);\n },\n enable: () => {\n setDarkMode(true);\n },\n disable: () => {\n setDarkMode(false);\n },\n set: (value) => {\n setDarkMode(value);\n }\n };\n}\nfunction useUnmount(func) {\n const funcRef = useRef(func);\n funcRef.current = func;\n useEffect(\n () => () => {\n funcRef.current();\n },\n []\n );\n}\n\n// src/useDebounceCallback/useDebounceCallback.ts\nfunction useDebounceCallback(func, delay = 500, options) {\n const debouncedFunc = useRef();\n useUnmount(() => {\n if (debouncedFunc.current) {\n debouncedFunc.current.cancel();\n }\n });\n const debounced = useMemo(() => {\n const debouncedFuncInstance = debounce(func, delay, options);\n const wrappedFunc = (...args) => {\n return debouncedFuncInstance(...args);\n };\n wrappedFunc.cancel = () => {\n debouncedFuncInstance.cancel();\n };\n wrappedFunc.isPending = () => {\n return !!debouncedFunc.current;\n };\n wrappedFunc.flush = () => {\n return debouncedFuncInstance.flush();\n };\n return wrappedFunc;\n }, [func, delay, options]);\n useEffect(() => {\n debouncedFunc.current = debounce(func, delay, options);\n }, [func, delay, options]);\n return debounced;\n}\nfunction useDebounceValue(initialValue, delay, options) {\n const eq = (options == null ? void 0 : options.equalityFn) ?? ((left, right) => left === right);\n const unwrappedInitialValue = initialValue instanceof Function ? initialValue() : initialValue;\n const [debouncedValue, setDebouncedValue] = useState(unwrappedInitialValue);\n const previousValueRef = useRef(unwrappedInitialValue);\n const updateDebouncedValue = useDebounceCallback(\n setDebouncedValue,\n delay,\n options\n );\n if (!eq(previousValueRef.current, unwrappedInitialValue)) {\n updateDebouncedValue(unwrappedInitialValue);\n previousValueRef.current = unwrappedInitialValue;\n }\n return [debouncedValue, updateDebouncedValue];\n}\nfunction useDocumentTitle(title, options = {}) {\n const { preserveTitleOnUnmount = true } = options;\n const defaultTitle = useRef(null);\n useIsomorphicLayoutEffect(() => {\n defaultTitle.current = window.document.title;\n }, []);\n useIsomorphicLayoutEffect(() => {\n window.document.title = title;\n }, [title]);\n useUnmount(() => {\n if (!preserveTitleOnUnmount && defaultTitle.current) {\n window.document.title = defaultTitle.current;\n }\n });\n}\nfunction useHover(elementRef) {\n const [value, setValue] = useState(false);\n const handleMouseEnter = () => {\n setValue(true);\n };\n const handleMouseLeave = () => {\n setValue(false);\n };\n useEventListener(\"mouseenter\", handleMouseEnter, elementRef);\n useEventListener(\"mouseleave\", handleMouseLeave, elementRef);\n return value;\n}\nfunction useIntersectionObserver({\n threshold = 0,\n root = null,\n rootMargin = \"0%\",\n freezeOnceVisible = false,\n initialIsIntersecting = false,\n onChange\n} = {}) {\n var _a;\n const [ref, setRef] = useState(null);\n const [state, setState] = useState(() => ({\n isIntersecting: initialIsIntersecting,\n entry: void 0\n }));\n const callbackRef = useRef();\n callbackRef.current = onChange;\n const frozen = ((_a = state.entry) == null ? void 0 : _a.isIntersecting) && freezeOnceVisible;\n useEffect(() => {\n if (!ref)\n return;\n if (!(\"IntersectionObserver\" in window))\n return;\n if (frozen)\n return;\n let unobserve;\n const observer = new IntersectionObserver(\n (entries) => {\n const thresholds = Array.isArray(observer.thresholds) ? observer.thresholds : [observer.thresholds];\n entries.forEach((entry) => {\n const isIntersecting = entry.isIntersecting && thresholds.some((threshold2) => entry.intersectionRatio >= threshold2);\n setState({ isIntersecting, entry });\n if (callbackRef.current) {\n callbackRef.current(isIntersecting, entry);\n }\n if (isIntersecting && freezeOnceVisible && unobserve) {\n unobserve();\n unobserve = void 0;\n }\n });\n },\n { threshold, root, rootMargin }\n );\n observer.observe(ref);\n return () => {\n observer.disconnect();\n };\n }, [\n ref,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(threshold),\n root,\n rootMargin,\n frozen,\n freezeOnceVisible\n ]);\n const prevRef = useRef(null);\n useEffect(() => {\n var _a2;\n if (!ref && ((_a2 = state.entry) == null ? void 0 : _a2.target) && !freezeOnceVisible && !frozen && prevRef.current !== state.entry.target) {\n prevRef.current = state.entry.target;\n setState({ isIntersecting: initialIsIntersecting, entry: void 0 });\n }\n }, [ref, state.entry, freezeOnceVisible, frozen, initialIsIntersecting]);\n const result = [\n setRef,\n !!state.isIntersecting,\n state.entry\n ];\n result.ref = result[0];\n result.isIntersecting = result[1];\n result.entry = result[2];\n return result;\n}\nfunction useIsClient() {\n const [isClient, setClient] = useState(false);\n useEffect(() => {\n setClient(true);\n }, []);\n return isClient;\n}\nfunction useIsMounted() {\n const isMounted = useRef(false);\n useEffect(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n }, []);\n return useCallback(() => isMounted.current, []);\n}\nfunction useMap(initialState = /* @__PURE__ */ new Map()) {\n const [map, setMap] = useState(new Map(initialState));\n const actions = {\n set: useCallback((key, value) => {\n setMap((prev) => {\n const copy = new Map(prev);\n copy.set(key, value);\n return copy;\n });\n }, []),\n setAll: useCallback((entries) => {\n setMap(() => new Map(entries));\n }, []),\n remove: useCallback((key) => {\n setMap((prev) => {\n const copy = new Map(prev);\n copy.delete(key);\n return copy;\n });\n }, []),\n reset: useCallback(() => {\n setMap(() => /* @__PURE__ */ new Map());\n }, [])\n };\n return [map, actions];\n}\n\n// src/useOnClickOutside/useOnClickOutside.ts\nfunction useOnClickOutside(ref, handler, eventType = \"mousedown\", eventListenerOptions = {}) {\n useEventListener(\n eventType,\n (event) => {\n const target = event.target;\n if (!target || !target.isConnected) {\n return;\n }\n const isOutside = Array.isArray(ref) ? ref.filter((r) => Boolean(r.current)).every((r) => r.current && !r.current.contains(target)) : ref.current && !ref.current.contains(target);\n if (isOutside) {\n handler(event);\n }\n },\n void 0,\n eventListenerOptions\n );\n}\nvar IS_SERVER3 = typeof window === \"undefined\";\nfunction useReadLocalStorage(key, options = {}) {\n let { initializeWithValue = true } = options;\n if (IS_SERVER3) {\n initializeWithValue = false;\n }\n const deserializer = useCallback(\n (value) => {\n if (options.deserializer) {\n return options.deserializer(value);\n }\n if (value === \"undefined\") {\n return void 0;\n }\n let parsed;\n try {\n parsed = JSON.parse(value);\n } catch (error) {\n console.error(\"Error parsing JSON:\", error);\n return null;\n }\n return parsed;\n },\n [options]\n );\n const readValue = useCallback(() => {\n if (IS_SERVER3) {\n return null;\n }\n try {\n const raw = window.localStorage.getItem(key);\n return raw ? deserializer(raw) : null;\n } catch (error) {\n console.warn(`Error reading localStorage key \\u201C${key}\\u201D:`, error);\n return null;\n }\n }, [key, deserializer]);\n const [storedValue, setStoredValue] = useState(() => {\n if (initializeWithValue) {\n return readValue();\n }\n return void 0;\n });\n useEffect(() => {\n setStoredValue(readValue());\n }, [key]);\n const handleStorageChange = useCallback(\n (event) => {\n if (event.key && event.key !== key) {\n return;\n }\n setStoredValue(readValue());\n },\n [key, readValue]\n );\n useEventListener(\"storage\", handleStorageChange);\n useEventListener(\"local-storage\", handleStorageChange);\n return storedValue;\n}\nvar initialSize = {\n width: void 0,\n height: void 0\n};\nfunction useResizeObserver(options) {\n const { ref, box = \"content-box\" } = options;\n const [{ width, height }, setSize] = useState(initialSize);\n const isMounted = useIsMounted();\n const previousSize = useRef({ ...initialSize });\n const onResize = useRef(void 0);\n onResize.current = options.onResize;\n useEffect(() => {\n if (!ref.current)\n return;\n if (typeof window === \"undefined\" || !(\"ResizeObserver\" in window))\n return;\n const observer = new ResizeObserver(([entry]) => {\n const boxProp = box === \"border-box\" ? \"borderBoxSize\" : box === \"device-pixel-content-box\" ? \"devicePixelContentBoxSize\" : \"contentBoxSize\";\n const newWidth = extractSize(entry, boxProp, \"inlineSize\");\n const newHeight = extractSize(entry, boxProp, \"blockSize\");\n const hasChanged = previousSize.current.width !== newWidth || previousSize.current.height !== newHeight;\n if (hasChanged) {\n const newSize = { width: newWidth, height: newHeight };\n previousSize.current.width = newWidth;\n previousSize.current.height = newHeight;\n if (onResize.current) {\n onResize.current(newSize);\n } else {\n if (isMounted()) {\n setSize(newSize);\n }\n }\n }\n });\n observer.observe(ref.current, { box });\n return () => {\n observer.disconnect();\n };\n }, [box, ref, isMounted]);\n return { width, height };\n}\nfunction extractSize(entry, box, sizeType) {\n if (!entry[box]) {\n if (box === \"contentBoxSize\") {\n return entry.contentRect[sizeType === \"inlineSize\" ? \"width\" : \"height\"];\n }\n return void 0;\n }\n return Array.isArray(entry[box]) ? entry[box][0][sizeType] : (\n // @ts-ignore Support Firefox's non-standard behavior\n entry[box][sizeType]\n );\n}\nvar IS_SERVER4 = typeof window === \"undefined\";\nfunction useScreen(options = {}) {\n let { initializeWithValue = true } = options;\n if (IS_SERVER4) {\n initializeWithValue = false;\n }\n const readScreen = () => {\n if (IS_SERVER4) {\n return void 0;\n }\n return window.screen;\n };\n const [screen, setScreen] = useState(() => {\n if (initializeWithValue) {\n return readScreen();\n }\n return void 0;\n });\n const debouncedSetScreen = useDebounceCallback(\n setScreen,\n options.debounceDelay\n );\n function handleSize() {\n const newScreen = readScreen();\n const setSize = options.debounceDelay ? debouncedSetScreen : setScreen;\n if (newScreen) {\n const {\n width,\n height,\n availHeight,\n availWidth,\n colorDepth,\n orientation,\n pixelDepth\n } = newScreen;\n setSize({\n width,\n height,\n availHeight,\n availWidth,\n colorDepth,\n orientation,\n pixelDepth\n });\n }\n }\n useEventListener(\"resize\", handleSize);\n useIsomorphicLayoutEffect(() => {\n handleSize();\n }, []);\n return screen;\n}\nvar cachedScriptStatuses = /* @__PURE__ */ new Map();\nfunction getScriptNode(src) {\n const node = document.querySelector(\n `script[src=\"${src}\"]`\n );\n const status = node == null ? void 0 : node.getAttribute(\"data-status\");\n return {\n node,\n status\n };\n}\nfunction useScript(src, options) {\n const [status, setStatus] = useState(() => {\n if (!src || (options == null ? void 0 : options.shouldPreventLoad)) {\n return \"idle\";\n }\n if (typeof window === \"undefined\") {\n return \"loading\";\n }\n return cachedScriptStatuses.get(src) ?? \"loading\";\n });\n useEffect(() => {\n if (!src || (options == null ? void 0 : options.shouldPreventLoad)) {\n return;\n }\n const cachedScriptStatus = cachedScriptStatuses.get(src);\n if (cachedScriptStatus === \"ready\" || cachedScriptStatus === \"error\") {\n setStatus(cachedScriptStatus);\n return;\n }\n const script = getScriptNode(src);\n let scriptNode = script.node;\n if (!scriptNode) {\n scriptNode = document.createElement(\"script\");\n scriptNode.src = src;\n scriptNode.async = true;\n if (options == null ? void 0 : options.id) {\n scriptNode.id = options.id;\n }\n scriptNode.setAttribute(\"data-status\", \"loading\");\n document.body.appendChild(scriptNode);\n const setAttributeFromEvent = (event) => {\n const scriptStatus = event.type === \"load\" ? \"ready\" : \"error\";\n scriptNode == null ? void 0 : scriptNode.setAttribute(\"data-status\", scriptStatus);\n };\n scriptNode.addEventListener(\"load\", setAttributeFromEvent);\n scriptNode.addEventListener(\"error\", setAttributeFromEvent);\n } else {\n setStatus(script.status ?? cachedScriptStatus ?? \"loading\");\n }\n const setStateFromEvent = (event) => {\n const newStatus = event.type === \"load\" ? \"ready\" : \"error\";\n setStatus(newStatus);\n cachedScriptStatuses.set(src, newStatus);\n };\n scriptNode.addEventListener(\"load\", setStateFromEvent);\n scriptNode.addEventListener(\"error\", setStateFromEvent);\n return () => {\n if (scriptNode) {\n scriptNode.removeEventListener(\"load\", setStateFromEvent);\n scriptNode.removeEventListener(\"error\", setStateFromEvent);\n }\n if (scriptNode && (options == null ? void 0 : options.removeOnUnmount)) {\n scriptNode.remove();\n cachedScriptStatuses.delete(src);\n }\n };\n }, [src, options == null ? void 0 : options.shouldPreventLoad, options == null ? void 0 : options.removeOnUnmount, options == null ? void 0 : options.id]);\n return status;\n}\nvar IS_SERVER5 = typeof window === \"undefined\";\nfunction useScrollLock(options = {}) {\n const { autoLock = true, lockTarget, widthReflow = true } = options;\n const [isLocked, setIsLocked] = useState(false);\n const target = useRef(null);\n const originalStyle = useRef(null);\n const lock = () => {\n if (target.current) {\n const { overflow, paddingRight } = target.current.style;\n originalStyle.current = { overflow, paddingRight };\n if (widthReflow) {\n const offsetWidth = target.current === document.body ? window.innerWidth : target.current.offsetWidth;\n const currentPaddingRight = parseInt(window.getComputedStyle(target.current).paddingRight, 10) || 0;\n const scrollbarWidth = offsetWidth - target.current.scrollWidth;\n target.current.style.paddingRight = `${scrollbarWidth + currentPaddingRight}px`;\n }\n target.current.style.overflow = \"hidden\";\n setIsLocked(true);\n }\n };\n const unlock = () => {\n if (target.current && originalStyle.current) {\n target.current.style.overflow = originalStyle.current.overflow;\n if (widthReflow) {\n target.current.style.paddingRight = originalStyle.current.paddingRight;\n }\n }\n setIsLocked(false);\n };\n useIsomorphicLayoutEffect(() => {\n if (IS_SERVER5)\n return;\n if (lockTarget) {\n target.current = typeof lockTarget === \"string\" ? document.querySelector(lockTarget) : lockTarget;\n }\n if (!target.current) {\n target.current = document.body;\n }\n if (autoLock) {\n lock();\n }\n return () => {\n unlock();\n };\n }, [autoLock, lockTarget, widthReflow]);\n return { isLocked, lock, unlock };\n}\nvar IS_SERVER6 = typeof window === \"undefined\";\nfunction useSessionStorage(key, initialValue, options = {}) {\n const { initializeWithValue = true } = options;\n const serializer = useCallback(\n (value) => {\n if (options.serializer) {\n return options.serializer(value);\n }\n return JSON.stringify(value);\n },\n [options]\n );\n const deserializer = useCallback(\n (value) => {\n if (options.deserializer) {\n return options.deserializer(value);\n }\n if (value === \"undefined\") {\n return void 0;\n }\n const defaultValue = initialValue instanceof Function ? initialValue() : initialValue;\n let parsed;\n try {\n parsed = JSON.parse(value);\n } catch (error) {\n console.error(\"Error parsing JSON:\", error);\n return defaultValue;\n }\n return parsed;\n },\n [options, initialValue]\n );\n const readValue = useCallback(() => {\n const initialValueToUse = initialValue instanceof Function ? initialValue() : initialValue;\n if (IS_SERVER6) {\n return initialValueToUse;\n }\n try {\n const raw = window.sessionStorage.getItem(key);\n return raw ? deserializer(raw) : initialValueToUse;\n } catch (error) {\n console.warn(`Error reading sessionStorage key \\u201C${key}\\u201D:`, error);\n return initialValueToUse;\n }\n }, [initialValue, key, deserializer]);\n const [storedValue, setStoredValue] = useState(() => {\n if (initializeWithValue) {\n return readValue();\n }\n return initialValue instanceof Function ? initialValue() : initialValue;\n });\n const setValue = useEventCallback((value) => {\n if (IS_SERVER6) {\n console.warn(\n `Tried setting sessionStorage key \\u201C${key}\\u201D even though environment is not a client`\n );\n }\n try {\n const newValue = value instanceof Function ? value(readValue()) : value;\n window.sessionStorage.setItem(key, serializer(newValue));\n setStoredValue(newValue);\n window.dispatchEvent(new StorageEvent(\"session-storage\", { key }));\n } catch (error) {\n console.warn(`Error setting sessionStorage key \\u201C${key}\\u201D:`, error);\n }\n });\n const removeValue = useEventCallback(() => {\n if (IS_SERVER6) {\n console.warn(\n `Tried removing sessionStorage key \\u201C${key}\\u201D even though environment is not a client`\n );\n }\n const defaultValue = initialValue instanceof Function ? initialValue() : initialValue;\n window.sessionStorage.removeItem(key);\n setStoredValue(defaultValue);\n window.dispatchEvent(new StorageEvent(\"session-storage\", { key }));\n });\n useEffect(() => {\n setStoredValue(readValue());\n }, [key]);\n const handleStorageChange = useCallback(\n (event) => {\n if (event.key && event.key !== key) {\n return;\n }\n setStoredValue(readValue());\n },\n [key, readValue]\n );\n useEventListener(\"storage\", handleStorageChange);\n useEventListener(\"session-storage\", handleStorageChange);\n return [storedValue, setValue, removeValue];\n}\nfunction useStep(maxStep) {\n const [currentStep, setCurrentStep] = useState(1);\n const canGoToNextStep = currentStep + 1 <= maxStep;\n const canGoToPrevStep = currentStep - 1 > 0;\n const setStep = useCallback(\n (step) => {\n const newStep = step instanceof Function ? step(currentStep) : step;\n if (newStep >= 1 && newStep <= maxStep) {\n setCurrentStep(newStep);\n return;\n }\n throw new Error(\"Step not valid\");\n },\n [maxStep, currentStep]\n );\n const goToNextStep = useCallback(() => {\n if (canGoToNextStep) {\n setCurrentStep((step) => step + 1);\n }\n }, [canGoToNextStep]);\n const goToPrevStep = useCallback(() => {\n if (canGoToPrevStep) {\n setCurrentStep((step) => step - 1);\n }\n }, [canGoToPrevStep]);\n const reset = useCallback(() => {\n setCurrentStep(1);\n }, []);\n return [\n currentStep,\n {\n goToNextStep,\n goToPrevStep,\n canGoToNextStep,\n canGoToPrevStep,\n setStep,\n reset\n }\n ];\n}\n\n// src/useTernaryDarkMode/useTernaryDarkMode.ts\nvar COLOR_SCHEME_QUERY2 = \"(prefers-color-scheme: dark)\";\nvar LOCAL_STORAGE_KEY2 = \"usehooks-ts-ternary-dark-mode\";\nfunction useTernaryDarkMode({\n defaultValue = \"system\",\n localStorageKey = LOCAL_STORAGE_KEY2,\n initializeWithValue = true\n} = {}) {\n const isDarkOS = useMediaQuery(COLOR_SCHEME_QUERY2, { initializeWithValue });\n const [mode, setMode] = useLocalStorage(localStorageKey, defaultValue, {\n initializeWithValue\n });\n const isDarkMode = mode === \"dark\" || mode === \"system\" && isDarkOS;\n const toggleTernaryDarkMode = () => {\n const modes = [\"light\", \"system\", \"dark\"];\n setMode((prevMode) => {\n const nextIndex = (modes.indexOf(prevMode) + 1) % modes.length;\n return modes[nextIndex];\n });\n };\n return {\n isDarkMode,\n ternaryDarkMode: mode,\n setTernaryDarkMode: setMode,\n toggleTernaryDarkMode\n };\n}\nfunction useTimeout(callback, delay) {\n const savedCallback = useRef(callback);\n useIsomorphicLayoutEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n useEffect(() => {\n if (!delay && delay !== 0) {\n return;\n }\n const id = setTimeout(() => {\n savedCallback.current();\n }, delay);\n return () => {\n clearTimeout(id);\n };\n }, [delay]);\n}\nfunction useToggle(defaultValue) {\n const [value, setValue] = useState(!!defaultValue);\n const toggle = useCallback(() => {\n setValue((x) => !x);\n }, []);\n return [value, toggle, setValue];\n}\nvar IS_SERVER7 = typeof window === \"undefined\";\nfunction useWindowSize(options = {}) {\n let { initializeWithValue = true } = options;\n if (IS_SERVER7) {\n initializeWithValue = false;\n }\n const [windowSize, setWindowSize] = useState(() => {\n if (initializeWithValue) {\n return {\n width: window.innerWidth,\n height: window.innerHeight\n };\n }\n return {\n width: void 0,\n height: void 0\n };\n });\n const debouncedSetWindowSize = useDebounceCallback(\n setWindowSize,\n options.debounceDelay\n );\n function handleSize() {\n const setSize = options.debounceDelay ? debouncedSetWindowSize : setWindowSize;\n setSize({\n width: window.innerWidth,\n height: window.innerHeight\n });\n }\n useEventListener(\"resize\", handleSize);\n useIsomorphicLayoutEffect(() => {\n handleSize();\n }, []);\n return windowSize;\n}\n\nexport { useBoolean, useClickAnyWhere, useCopyToClipboard, useCountdown, useCounter, useDarkMode, useDebounceCallback, useDebounceValue, useDocumentTitle, useEventCallback, useEventListener, useHover, useIntersectionObserver, useInterval, useIsClient, useIsMounted, useIsomorphicLayoutEffect, useLocalStorage, useMap, useMediaQuery, useOnClickOutside, useReadLocalStorage, useResizeObserver, useScreen, useScript, useScrollLock, useSessionStorage, useStep, useTernaryDarkMode, useTimeout, useToggle, useUnmount, useWindowSize };\n","import { RemoteTrackPublication } from 'livekit-client';\nimport * as React from 'react';\nimport { useMediaTrackBySourceOrName } from '../../hooks/useMediaTrackBySourceOrName';\nimport type { ParticipantClickEvent, TrackReference } from '@livekit/components-core';\nimport { useEnsureTrackRef } from '../../context';\nimport * as useHooks from 'usehooks-ts';\n\n/** @public */\nexport interface VideoTrackProps extends React.VideoHTMLAttributes<HTMLVideoElement> {\n /** The track reference of the track to render. */\n trackRef?: TrackReference;\n onTrackClick?: (evt: ParticipantClickEvent) => void;\n onSubscriptionStatusChanged?: (subscribed: boolean) => void;\n manageSubscription?: boolean;\n}\n\n/**\n * The `VideoTrack` component is responsible for rendering participant video tracks like `camera` and `screen_share`.\n * This component must have access to the participant's context, or alternatively pass it a `Participant` as a property.\n *\n * @example\n * ```tsx\n * <VideoTrack trackRef={trackRef} />\n * ```\n * @see {@link @livekit/components-react#ParticipantTile | ParticipantTile}\n * @public\n */\nexport const VideoTrack: (\n props: VideoTrackProps & React.RefAttributes<HTMLVideoElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLVideoElement, VideoTrackProps>(\n function VideoTrack(\n {\n onTrackClick,\n onClick,\n onSubscriptionStatusChanged,\n trackRef,\n manageSubscription,\n ...props\n }: VideoTrackProps,\n ref,\n ) {\n const trackReference = useEnsureTrackRef(trackRef);\n\n const mediaEl = React.useRef<HTMLVideoElement>(null);\n React.useImperativeHandle(ref, () => mediaEl.current as HTMLVideoElement);\n\n const intersectionEntry = useHooks.useIntersectionObserver({ root: mediaEl.current });\n\n const [debouncedIntersectionEntry] = useHooks.useDebounceValue(intersectionEntry, 3000);\n\n React.useEffect(() => {\n if (\n manageSubscription &&\n trackReference.publication instanceof RemoteTrackPublication &&\n debouncedIntersectionEntry?.isIntersecting === false &&\n intersectionEntry?.isIntersecting === false\n ) {\n trackReference.publication.setSubscribed(false);\n }\n }, [debouncedIntersectionEntry, trackReference, manageSubscription]);\n\n React.useEffect(() => {\n if (\n manageSubscription &&\n trackReference.publication instanceof RemoteTrackPublication &&\n intersectionEntry?.isIntersecting === true\n ) {\n trackReference.publication.setSubscribed(true);\n }\n }, [intersectionEntry, trackReference, manageSubscription]);\n\n const {\n elementProps,\n publication: pub,\n isSubscribed,\n } = useMediaTrackBySourceOrName(trackReference, {\n element: mediaEl,\n props,\n });\n\n React.useEffect(() => {\n onSubscriptionStatusChanged?.(!!isSubscribed);\n }, [isSubscribed, onSubscriptionStatusChanged]);\n\n const clickHandler = (evt: React.MouseEvent<HTMLVideoElement, MouseEvent>) => {\n onClick?.(evt);\n onTrackClick?.({ participant: trackReference?.participant, track: pub });\n };\n\n return <video ref={mediaEl} {...elementProps} muted={true} onClick={clickHandler}></video>;\n },\n);\n","import * as React from 'react';\nimport { useMediaTrackBySourceOrName } from '../../hooks/useMediaTrackBySourceOrName';\nimport type { TrackReference } from '@livekit/components-core';\nimport { log } from '@livekit/components-core';\nimport { RemoteAudioTrack, RemoteTrackPublication } from 'livekit-client';\nimport { useEnsureTrackRef } from '../../context';\n\n/** @public */\nexport interface AudioTrackProps extends React.AudioHTMLAttributes<HTMLAudioElement> {\n /** The track reference of the track from which the audio is to be rendered. */\n trackRef?: TrackReference;\n\n onSubscriptionStatusChanged?: (subscribed: boolean) => void;\n /** Sets the volume of the audio track. By default, the range is between `0.0` and `1.0`. */\n volume?: number;\n /**\n * Mutes the audio track if set to `true`.\n * @remarks\n * If set to `true`, the server will stop sending audio track data to the client.\n * @alpha\n */\n muted?: boolean;\n}\n\n/**\n * The AudioTrack component is responsible for rendering participant audio tracks.\n * This component must have access to the participant's context, or alternatively pass it a `Participant` as a property.\n *\n * @example\n * ```tsx\n * <ParticipantTile>\n * <AudioTrack trackRef={trackRef} />\n * </ParticipantTile>\n * ```\n *\n * @see `ParticipantTile` component\n * @public\n */\nexport const AudioTrack: (\n props: AudioTrackProps & React.RefAttributes<HTMLAudioElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLAudioElement, AudioTrackProps>(\n function AudioTrack(\n { trackRef, onSubscriptionStatusChanged, volume, ...props }: AudioTrackProps,\n ref,\n ) {\n const trackReference = useEnsureTrackRef(trackRef);\n\n const mediaEl = React.useRef<HTMLAudioElement>(null);\n React.useImperativeHandle(ref, () => mediaEl.current as HTMLAudioElement);\n\n const {\n elementProps,\n isSubscribed,\n track,\n publication: pub,\n } = useMediaTrackBySourceOrName(trackReference, {\n element: mediaEl,\n props,\n });\n\n React.useEffect(() => {\n onSubscriptionStatusChanged?.(!!isSubscribed);\n }, [isSubscribed, onSubscriptionStatusChanged]);\n\n React.useEffect(() => {\n if (track === undefined || volume === undefined) {\n return;\n }\n if (track instanceof RemoteAudioTrack) {\n track.setVolume(volume);\n } else {\n log.warn('Volume can only be set on remote audio tracks.');\n }\n }, [volume, track]);\n\n React.useEffect(() => {\n if (pub === undefined || props.muted === undefined) {\n return;\n }\n if (pub instanceof RemoteTrackPublication) {\n pub.setEnabled(!props.muted);\n } else {\n log.warn('Can only call setEnabled on remote track publications.');\n }\n }, [props.muted, pub, track]);\n\n return <audio ref={mediaEl} {...elementProps} />;\n },\n);\n","import * as React from 'react';\nimport type { Participant } from 'livekit-client';\nimport { Track } from 'livekit-client';\nimport type { ParticipantClickEvent, TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { isTrackReference, isTrackReferencePinned } from '@livekit/components-core';\nimport { ConnectionQualityIndicator } from './ConnectionQualityIndicator';\nimport { ParticipantName } from './ParticipantName';\nimport { TrackMutedIndicator } from './TrackMutedIndicator';\nimport {\n ParticipantContext,\n TrackRefContext,\n useEnsureTrackRef,\n useFeatureContext,\n useMaybeLayoutContext,\n useMaybeParticipantContext,\n useMaybeTrackRefContext,\n} from '../../context';\nimport { FocusToggle } from '../controls/FocusToggle';\nimport { ParticipantPlaceholder } from '../../assets/images';\nimport { LockLockedIcon, ScreenShareIcon } from '../../assets/icons';\nimport { VideoTrack } from './VideoTrack';\nimport { AudioTrack } from './AudioTrack';\nimport { useParticipantTile } from '../../hooks';\nimport { useIsEncrypted } from '../../hooks/useIsEncrypted';\n\n/**\n * The `ParticipantContextIfNeeded` component only creates a `ParticipantContext`\n * if there is no `ParticipantContext` already.\n * @example\n * ```tsx\n * <ParticipantContextIfNeeded participant={trackReference.participant}>\n * ...\n * </ParticipantContextIfNeeded>\n * ```\n * @public\n */\nexport function ParticipantContextIfNeeded(\n props: React.PropsWithChildren<{\n participant?: Participant;\n }>,\n) {\n const hasContext = !!useMaybeParticipantContext();\n return props.participant && !hasContext ? (\n <ParticipantContext.Provider value={props.participant}>\n {props.children}\n </ParticipantContext.Provider>\n ) : (\n <>{props.children}</>\n );\n}\n\n/**\n * Only create a `TrackRefContext` if there is no `TrackRefContext` already.\n * @internal\n */\nexport function TrackRefContextIfNeeded(\n props: React.PropsWithChildren<{\n trackRef?: TrackReferenceOrPlaceholder;\n }>,\n) {\n const hasContext = !!useMaybeTrackRefContext();\n return props.trackRef && !hasContext ? (\n <TrackRefContext.Provider value={props.trackRef}>{props.children}</TrackRefContext.Provider>\n ) : (\n <>{props.children}</>\n );\n}\n\n/** @public */\nexport interface ParticipantTileProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The track reference to display. */\n trackRef?: TrackReferenceOrPlaceholder;\n disableSpeakingIndicator?: boolean;\n\n onParticipantClick?: (event: ParticipantClickEvent) => void;\n}\n\n/**\n * The `ParticipantTile` component is the base utility wrapper for displaying a visual representation of a participant.\n * This component can be used as a child of the `TrackLoop` component or by passing a track reference as property.\n *\n * @example Using the `ParticipantTile` component with a track reference:\n * ```tsx\n * <ParticipantTile trackRef={trackRef} />\n * ```\n * @example Using the `ParticipantTile` component as a child of the `TrackLoop` component:\n * ```tsx\n * <TrackLoop>\n * <ParticipantTile />\n * </TrackLoop>\n * ```\n * @public\n */\nexport const ParticipantTile: (\n props: ParticipantTileProps & React.RefAttributes<HTMLDivElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLDivElement, ParticipantTileProps>(\n function ParticipantTile(\n {\n trackRef,\n children,\n onParticipantClick,\n disableSpeakingIndicator,\n ...htmlProps\n }: ParticipantTileProps,\n ref,\n ) {\n const trackReference = useEnsureTrackRef(trackRef);\n\n const { elementProps } = useParticipantTile<HTMLDivElement>({\n htmlProps,\n disableSpeakingIndicator,\n onParticipantClick,\n trackRef: trackReference,\n });\n const isEncrypted = useIsEncrypted(trackReference.participant);\n const layoutContext = useMaybeLayoutContext();\n\n const autoManageSubscription = useFeatureContext()?.autoSubscription;\n\n const handleSubscribe = React.useCallback(\n (subscribed: boolean) => {\n if (\n trackReference.source &&\n !subscribed &&\n layoutContext &&\n layoutContext.pin.dispatch &&\n isTrackReferencePinned(trackReference, layoutContext.pin.state)\n ) {\n layoutContext.pin.dispatch({ msg: 'clear_pin' });\n }\n },\n [trackReference, layoutContext],\n );\n\n return (\n <div ref={ref} style={{ position: 'relative' }} {...elementProps}>\n <TrackRefContextIfNeeded trackRef={trackReference}>\n <ParticipantContextIfNeeded participant={trackReference.participant}>\n {children ?? (\n <>\n {isTrackReference(trackReference) &&\n (trackReference.publication?.kind === 'video' ||\n trackReference.source === Track.Source.Camera ||\n trackReference.source === Track.Source.ScreenShare) ? (\n <VideoTrack\n trackRef={trackReference}\n onSubscriptionStatusChanged={handleSubscribe}\n manageSubscription={autoManageSubscription}\n />\n ) : (\n isTrackReference(trackReference) && (\n <AudioTrack\n trackRef={trackReference}\n onSubscriptionStatusChanged={handleSubscribe}\n />\n )\n )}\n <div className=\"lk-participant-placeholder\">\n <ParticipantPlaceholder />\n </div>\n <div className=\"lk-participant-metadata\">\n <div className=\"lk-participant-metadata-item\">\n {trackReference.source === Track.Source.Camera ? (\n <>\n {isEncrypted && <LockLockedIcon style={{ marginRight: '0.25rem' }} />}\n <TrackMutedIndicator\n trackRef={{\n participant: trackReference.participant,\n source: Track.Source.Microphone,\n }}\n show={'muted'}\n ></TrackMutedIndicator>\n <ParticipantName />\n </>\n ) : (\n <>\n <ScreenShareIcon style={{ marginRight: '0.25rem' }} />\n <ParticipantName>'s screen</ParticipantName>\n </>\n )}\n </div>\n <ConnectionQualityIndicator className=\"lk-participant-metadata-item\" />\n </div>\n </>\n )}\n <FocusToggle trackRef={trackReference} />\n </ParticipantContextIfNeeded>\n </TrackRefContextIfNeeded>\n </div>\n );\n },\n);\n","import * as React from 'react';\nimport { mergeProps } from '../../utils';\nimport type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { ParticipantTile } from '../participant/ParticipantTile';\nimport type { ParticipantClickEvent } from '@livekit/components-core';\n\n/** @public */\nexport interface FocusLayoutContainerProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * The `FocusLayoutContainer` is a layout component that expects two children:\n * A small side component: In a video conference, this is usually a carousel of participants\n * who are not in focus. And a larger main component to display the focused participant.\n * For example, with the `FocusLayout` component.\n * @public\n */\nexport function FocusLayoutContainer(props: FocusLayoutContainerProps) {\n const elementProps = mergeProps(props, { className: 'lk-focus-layout' });\n\n return <div {...elementProps}>{props.children}</div>;\n}\n\n/** @public */\nexport interface FocusLayoutProps extends React.HTMLAttributes<HTMLElement> {\n /** The track to display in the focus layout. */\n trackRef?: TrackReferenceOrPlaceholder;\n\n onParticipantClick?: (evt: ParticipantClickEvent) => void;\n}\n\n/**\n * The `FocusLayout` component is just a light wrapper around the `ParticipantTile` to display a single participant.\n * @public\n */\nexport function FocusLayout({ trackRef, ...htmlProps }: FocusLayoutProps) {\n return <ParticipantTile trackRef={trackRef} {...htmlProps} />;\n}\n","import type { TrackReference, TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport * as React from 'react';\nimport { TrackRefContext } from '../context/track-reference-context';\nimport { cloneSingleChild } from '../utils';\nimport { getTrackReferenceId } from '@livekit/components-core';\n\n/** @public */\nexport interface TrackLoopProps {\n /** Track references to loop over. You can the use `useTracks()` hook to get TrackReferences. */\n tracks: TrackReference[] | TrackReferenceOrPlaceholder[];\n /** The template component to be used in the loop. */\n children: React.ReactNode;\n}\n\n/**\n * The `TrackLoop` component loops over tracks. It is for example a easy way to loop over all participant camera and screen share tracks.\n * `TrackLoop` creates a `TrackRefContext` for each track that you can use to e.g. render the track.\n *\n * @example\n * ```tsx\n * const trackRefs = useTracks([Track.Source.Camera]);\n * <TrackLoop tracks={trackRefs} >\n * <TrackRefContext.Consumer>\n * {(trackRef) => trackRef && <VideoTrack trackRef={trackRef}/>}\n * </TrackRefContext.Consumer>\n * </TrackLoop>\n * ```\n * @public\n */\nexport function TrackLoop({ tracks, ...props }: TrackLoopProps) {\n return (\n <>\n {tracks.map((trackReference) => {\n return (\n <TrackRefContext.Provider\n value={trackReference}\n key={getTrackReferenceId(trackReference)}\n >\n {cloneSingleChild(props.children)}\n </TrackRefContext.Provider>\n );\n })}\n </>\n );\n}\n","import * as React from 'react';\nimport SvgChevron from '../../assets/icons/Chevron';\nimport type { usePagination } from '../../hooks';\nimport { createInteractingObservable } from '@livekit/components-core';\n\nexport interface PaginationControlProps\n extends Pick<\n ReturnType<typeof usePagination>,\n 'totalPageCount' | 'nextPage' | 'prevPage' | 'currentPage'\n > {\n /** Reference to an HTML element that holds the pages, while interacting (`mouseover`)\n * with it, the pagination controls will appear for a while. */\n pagesContainer?: React.RefObject<HTMLElement>;\n}\n\nexport function PaginationControl({\n totalPageCount,\n nextPage,\n prevPage,\n currentPage,\n pagesContainer: connectedElement,\n}: PaginationControlProps) {\n const [interactive, setInteractive] = React.useState(false);\n React.useEffect(() => {\n let subscription:\n | ReturnType<ReturnType<typeof createInteractingObservable>['subscribe']>\n | undefined;\n if (connectedElement) {\n subscription = createInteractingObservable(connectedElement.current, 2000).subscribe(\n setInteractive,\n );\n }\n return () => {\n if (subscription) {\n subscription.unsubscribe();\n }\n };\n }, [connectedElement]);\n\n return (\n <div className=\"lk-pagination-control\" data-lk-user-interaction={interactive}>\n <button className=\"lk-button\" onClick={prevPage}>\n <SvgChevron />\n </button>\n <span className=\"lk-pagination-count\">{`${currentPage} of ${totalPageCount}`}</span>\n <button className=\"lk-button\" onClick={nextPage}>\n <SvgChevron />\n </button>\n </div>\n );\n}\n","import * as React from 'react';\n\nexport interface PaginationIndicatorProps {\n totalPageCount: number;\n currentPage: number;\n}\n\nexport const PaginationIndicator: (\n props: PaginationIndicatorProps & React.RefAttributes<HTMLDivElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLDivElement, PaginationIndicatorProps>(\n function PaginationIndicator({ totalPageCount, currentPage }: PaginationIndicatorProps, ref) {\n const bubbles = new Array(totalPageCount).fill('').map((_, index) => {\n if (index + 1 === currentPage) {\n return <span data-lk-active key={index} />;\n } else {\n return <span key={index} />;\n }\n });\n\n return (\n <div ref={ref} className=\"lk-pagination-indicator\">\n {bubbles}\n </div>\n );\n },\n);\n","import * as React from 'react';\nimport type { UseParticipantsOptions } from '../../hooks';\nimport { useGridLayout, usePagination, useSwipe } from '../../hooks';\nimport { mergeProps } from '../../utils';\nimport type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { TrackLoop } from '../TrackLoop';\nimport { PaginationControl } from '../controls/PaginationControl';\nimport { PaginationIndicator } from '../controls/PaginationIndicator';\n\n/** @public */\nexport interface GridLayoutProps\n extends React.HTMLAttributes<HTMLDivElement>,\n Pick<UseParticipantsOptions, 'updateOnlyOn'> {\n children: React.ReactNode;\n tracks: TrackReferenceOrPlaceholder[];\n}\n\n/**\n * The `GridLayout` component displays the nested participants in a grid where every participants has the same size.\n * It also supports pagination if there are more participants than the grid can display.\n * @remarks\n * To ensure visual stability when tiles are reordered due to track updates,\n * the component uses the `useVisualStableUpdate` hook.\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <GridLayout tracks={tracks}>\n * <ParticipantTile />\n * </GridLayout>\n * <LiveKitRoom>\n * ```\n * @public\n */\nexport function GridLayout({ tracks, ...props }: GridLayoutProps) {\n const gridEl = React.createRef<HTMLDivElement>();\n\n const elementProps = React.useMemo(\n () => mergeProps(props, { className: 'lk-grid-layout' }),\n [props],\n );\n const { layout } = useGridLayout(gridEl, tracks.length);\n const pagination = usePagination(layout.maxTiles, tracks);\n\n useSwipe(gridEl, {\n onLeftSwipe: pagination.nextPage,\n onRightSwipe: pagination.prevPage,\n });\n\n return (\n <div ref={gridEl} data-lk-pagination={pagination.totalPageCount > 1} {...elementProps}>\n <TrackLoop tracks={pagination.tracks}>{props.children}</TrackLoop>\n {tracks.length > layout.maxTiles && (\n <>\n <PaginationIndicator\n totalPageCount={pagination.totalPageCount}\n currentPage={pagination.currentPage}\n />\n <PaginationControl pagesContainer={gridEl} {...pagination} />\n </>\n )}\n </div>\n );\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { getScrollBarWidth } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useSize } from '../../hooks/internal';\nimport { useVisualStableUpdate } from '../../hooks';\nimport { TrackLoop } from '../TrackLoop';\n\nconst MIN_HEIGHT = 130;\nconst MIN_WIDTH = 140;\nconst MIN_VISIBLE_TILES = 1;\nconst ASPECT_RATIO = 16 / 10;\nconst ASPECT_RATIO_INVERT = (1 - ASPECT_RATIO) * -1;\n\n/** @public */\nexport interface CarouselLayoutProps extends React.HTMLAttributes<HTMLMediaElement> {\n tracks: TrackReferenceOrPlaceholder[];\n children: React.ReactNode;\n /** Place the tiles vertically or horizontally next to each other.\n * If undefined orientation is guessed by the dimensions of the container. */\n orientation?: 'vertical' | 'horizontal';\n}\n\n/**\n * The `CarouselLayout` component displays a list of tracks in a scroll container.\n * It will display as many tiles as possible and overflow the rest.\n * @remarks\n * To ensure visual stability when tiles are reordered due to track updates,\n * the component uses the `useVisualStableUpdate` hook.\n * @example\n * ```tsx\n * const tracks = useTracks([Track.Source.Camera]);\n * <CarouselLayout tracks={tracks}>\n * <ParticipantTile />\n * </CarouselLayout>\n * ```\n * @public\n */\nexport function CarouselLayout({ tracks, orientation, ...props }: CarouselLayoutProps) {\n const asideEl = React.useRef<HTMLDivElement>(null);\n const [prevTiles, setPrevTiles] = React.useState(0);\n const { width, height } = useSize(asideEl);\n const carouselOrientation = orientation\n ? orientation\n : height >= width\n ? 'vertical'\n : 'horizontal';\n\n const tileSpan =\n carouselOrientation === 'vertical'\n ? Math.max(width * ASPECT_RATIO_INVERT, MIN_HEIGHT)\n : Math.max(height * ASPECT_RATIO, MIN_WIDTH);\n const scrollBarWidth = getScrollBarWidth();\n\n const tilesThatFit =\n carouselOrientation === 'vertical'\n ? Math.max((height - scrollBarWidth) / tileSpan, MIN_VISIBLE_TILES)\n : Math.max((width - scrollBarWidth) / tileSpan, MIN_VISIBLE_TILES);\n\n let maxVisibleTiles = Math.round(tilesThatFit);\n if (Math.abs(tilesThatFit - prevTiles) < 0.5) {\n maxVisibleTiles = Math.round(prevTiles);\n } else if (prevTiles !== tilesThatFit) {\n setPrevTiles(tilesThatFit);\n }\n\n const sortedTiles = useVisualStableUpdate(tracks, maxVisibleTiles);\n\n React.useLayoutEffect(() => {\n if (asideEl.current) {\n asideEl.current.dataset.lkOrientation = carouselOrientation;\n asideEl.current.style.setProperty('--lk-max-visible-tiles', maxVisibleTiles.toString());\n }\n }, [maxVisibleTiles, carouselOrientation]);\n\n return (\n <aside key={carouselOrientation} className=\"lk-carousel\" ref={asideEl} {...props}>\n <TrackLoop tracks={sortedTiles}>{props.children}</TrackLoop>\n </aside>\n );\n}\n","import type { PinState, WidgetState } from '@livekit/components-core';\nimport { log } from '@livekit/components-core';\nimport * as React from 'react';\nimport type { LayoutContextType } from '../../context';\nimport { LayoutContext, useEnsureCreateLayoutContext } from '../../context';\n\n/** @alpha */\nexport interface LayoutContextProviderProps {\n value?: LayoutContextType;\n onPinChange?: (state: PinState) => void;\n onWidgetChange?: (state: WidgetState) => void;\n}\n\n/** @alpha */\nexport function LayoutContextProvider({\n value,\n onPinChange,\n onWidgetChange,\n children,\n}: React.PropsWithChildren<LayoutContextProviderProps>) {\n const layoutContextValue = useEnsureCreateLayoutContext(value);\n\n React.useEffect(() => {\n log.debug('PinState Updated', { state: layoutContextValue.pin.state });\n if (onPinChange && layoutContextValue.pin.state) onPinChange(layoutContextValue.pin.state);\n }, [layoutContextValue.pin.state, onPinChange]);\n\n React.useEffect(() => {\n log.debug('Widget Updated', { widgetState: layoutContextValue.widget.state });\n if (onWidgetChange && layoutContextValue.widget.state) {\n onWidgetChange(layoutContextValue.widget.state);\n }\n }, [onWidgetChange, layoutContextValue.widget.state]);\n\n return <LayoutContext.Provider value={layoutContextValue}>{children}</LayoutContext.Provider>;\n}\n","import { getTrackReferenceId } from '@livekit/components-core';\nimport { Room, Track } from 'livekit-client';\nimport * as React from 'react';\nimport { useTracks } from '../hooks';\nimport { AudioTrack } from './participant/AudioTrack';\n\n/** @public */\nexport interface RoomAudioRendererProps {\n room?: Room;\n\n /** Sets the volume for all audio tracks rendered by this component. By default, the range is between `0.0` and `1.0`. */\n volume?: number;\n\n /**\n * If set to `true`, mutes all audio tracks rendered by the component.\n * @remarks\n * If set to `true`, the server will stop sending audio track data to the client.\n * @alpha\n */\n muted?: boolean;\n}\n\n/**\n * The `RoomAudioRenderer` component is a drop-in solution for adding audio to your LiveKit app.\n * It takes care of handling remote participants’ audio tracks and makes sure that microphones and screen share are audible.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <RoomAudioRenderer />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport function RoomAudioRenderer({ room, volume, muted }: RoomAudioRendererProps) {\n const tracks = useTracks(\n [Track.Source.Microphone, Track.Source.ScreenShareAudio, Track.Source.Unknown],\n {\n updateOnlyOn: [],\n onlySubscribed: true,\n room,\n },\n ).filter((ref) => !ref.participant.isLocal && ref.publication.kind === Track.Kind.Audio);\n\n return (\n <div style={{ display: 'none' }}>\n {tracks.map((trackRef) => (\n <AudioTrack\n key={getTrackReferenceId(trackRef)}\n trackRef={trackRef}\n volume={volume}\n muted={muted}\n />\n ))}\n </div>\n );\n}\n","import * as React from 'react';\nimport { mergeProps } from '../utils';\n\n/**\n * The `Toast` component is a rudimentary way to display a message to the user.\n * This message should be short lived and not require user interaction.\n * For example, displaying the current connection state like `ConnectionStateToast` does.\n *\n * @example\n * ```tsx\n * <Toast>Connecting...</Toast>\n * ```\n * @public\n */\nexport function Toast(props: React.HTMLAttributes<HTMLDivElement>) {\n const htmlProps = React.useMemo(() => mergeProps(props, { className: 'lk-toast' }), [props]);\n return <div {...htmlProps}>{props.children}</div>;\n}\n","export const generateConnectingSequenceBar = (columns: number): number[][] => {\n const seq = [];\n\n for (let x = 0; x < columns; x++) {\n seq.push([x, columns - 1 - x]);\n }\n\n return seq;\n};\n","export const generateListeningSequenceBar = (columns: number): number[][] => {\n const center = Math.floor(columns / 2);\n const noIndex = -1;\n\n return [[center], [noIndex]];\n};\n","import { useEffect, useRef, useState } from 'react';\nimport { generateConnectingSequenceBar } from '../animationSequences/connectingSequence';\nimport { generateListeningSequenceBar } from '../animationSequences/listeningSequence';\nimport type { AgentState } from '../../../hooks';\n\nexport const useBarAnimator = (\n state: AgentState | undefined,\n columns: number,\n interval: number,\n): number[] => {\n const [index, setIndex] = useState(0);\n const [sequence, setSequence] = useState<number[][]>([[]]);\n\n useEffect(() => {\n if (state === 'thinking') {\n setSequence(generateListeningSequenceBar(columns));\n } else if (state === 'connecting' || state === 'initializing') {\n const sequence = [...generateConnectingSequenceBar(columns)];\n setSequence(sequence);\n } else if (state === 'listening') {\n setSequence(generateListeningSequenceBar(columns));\n } else if (state === undefined || state === 'speaking') {\n setSequence([new Array(columns).fill(0).map((_, idx) => idx)]);\n } else {\n setSequence([[]]);\n }\n setIndex(0);\n }, [state, columns]);\n\n const animationFrameId = useRef<number | null>(null);\n useEffect(() => {\n let startTime = performance.now();\n\n const animate = (time: DOMHighResTimeStamp) => {\n const timeElapsed = time - startTime;\n\n if (timeElapsed >= interval) {\n setIndex((prev) => prev + 1);\n startTime = time;\n }\n\n animationFrameId.current = requestAnimationFrame(animate);\n };\n\n animationFrameId.current = requestAnimationFrame(animate);\n\n return () => {\n if (animationFrameId.current !== null) {\n cancelAnimationFrame(animationFrameId.current);\n }\n };\n }, [interval, columns, state, sequence.length]);\n\n return sequence[index % sequence.length];\n};\n","import * as React from 'react';\nimport { useBarAnimator } from './animators/useBarAnimator';\nimport { useMultibandTrackVolume, type AgentState } from '../../hooks';\nimport { type TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { useMaybeTrackRefContext } from '../../context';\nimport { cloneSingleChild, mergeProps } from '../../utils';\nimport { LocalAudioTrack, RemoteAudioTrack } from 'livekit-client';\n\n/**\n * @beta\n */\nexport type BarVisualizerOptions = {\n /** in percentage */\n maxHeight?: number;\n /** in percentage */\n minHeight?: number;\n};\n\n/**\n * @beta\n */\nexport interface BarVisualizerProps extends React.HTMLProps<HTMLDivElement> {\n /** If set, the visualizer will transition between different voice assistant states */\n state?: AgentState;\n /** Number of bars that show up in the visualizer */\n barCount?: number;\n /** @deprecated use `track` field instead */\n trackRef?: TrackReferenceOrPlaceholder;\n track?: TrackReferenceOrPlaceholder | LocalAudioTrack | RemoteAudioTrack;\n options?: BarVisualizerOptions;\n /** The template component to be used in the visualizer. */\n children?: React.ReactNode;\n}\n\nconst sequencerIntervals = new Map<AgentState, number>([\n ['connecting', 2000],\n ['initializing', 2000],\n ['listening', 500],\n ['thinking', 150],\n]);\n\nconst getSequencerInterval = (\n state: AgentState | undefined,\n barCount: number,\n): number | undefined => {\n if (state === undefined) {\n return 1000;\n }\n let interval = sequencerIntervals.get(state);\n if (interval) {\n switch (state) {\n case 'connecting':\n // case 'thinking':\n interval /= barCount;\n break;\n\n default:\n break;\n }\n }\n return interval;\n};\n/**\n * Visualizes audio signals from a TrackReference as bars.\n * If the `state` prop is set, it automatically transitions between VoiceAssistant states.\n * @beta\n *\n * @remarks For VoiceAssistant state transitions this component requires a voice assistant agent running with livekit-agents \\>= 0.9.0\n *\n * @example\n * ```tsx\n * function SimpleVoiceAssistant() {\n * const { state, audioTrack } = useVoiceAssistant();\n * return (\n * <BarVisualizer\n * state={state}\n * trackRef={audioTrack}\n * />\n * );\n * }\n * ```\n *\n * @example\n * Styling the BarVisualizer using CSS classes\n * ```css\n * .lk-audio-bar {\n * // Styles for \"idle\" bars\n * }\n * .lk-audio-bar.lk-highlighted {\n * // Styles for \"active\" bars\n * }\n * ```\n *\n * @example\n * Styling the BarVisualizer using CSS custom properties\n * ```css\n * --lk-fg // for the \"active\" colour, note that this defines the main foreground colour for the whole \"theme\"\n * --lk-va-bg // for \"idle\" colour\n * ```\n *\n * @example\n * Using a custom bar template for the BarVisualizer\n * ```tsx\n * <BarVisualizer>\n * <div className=\"all the classes\" />\n * </BarVisualizer>\n * ```\n * the highlighted children will get a data prop of data-lk-highlighted for them to switch between active and idle bars in their own template bar\n */\nexport const BarVisualizer = /* @__PURE__ */ React.forwardRef<HTMLDivElement, BarVisualizerProps>(\n function BarVisualizer(\n { state, options, barCount = 15, trackRef, track, children, ...props }: BarVisualizerProps,\n ref,\n ) {\n const elementProps = mergeProps(props, { className: 'lk-audio-bar-visualizer' });\n let targetTrack: TrackReferenceOrPlaceholder | LocalAudioTrack | RemoteAudioTrack | undefined =\n useMaybeTrackRefContext();\n\n if (trackRef || track) {\n targetTrack = trackRef || track;\n }\n\n const volumeBands = useMultibandTrackVolume(targetTrack, {\n bands: barCount,\n loPass: 100,\n hiPass: 200,\n });\n const minHeight = options?.minHeight ?? 20;\n const maxHeight = options?.maxHeight ?? 100;\n\n const highlightedIndices = useBarAnimator(\n state,\n barCount,\n getSequencerInterval(state, barCount) ?? 100,\n );\n\n return (\n <div ref={ref} {...elementProps} data-lk-va-state={state}>\n {volumeBands.map((volume, idx) =>\n children ? (\n cloneSingleChild(children, {\n 'data-lk-highlighted': highlightedIndices.includes(idx),\n 'data-lk-bar-index': idx,\n className: 'lk-audio-bar',\n style: { height: `${Math.min(maxHeight, Math.max(minHeight, volume * 100 + 5))}%` },\n })\n ) : (\n <span\n key={idx}\n data-lk-highlighted={highlightedIndices.includes(idx)}\n data-lk-bar-index={idx}\n className={`lk-audio-bar ${highlightedIndices.includes(idx) && 'lk-highlighted'}`}\n style={{\n // TODO transform animations would be more performant, however the border-radius gets distorted when using scale transforms. a 9-slice approach (or 3 in this case) could work\n // transform: `scale(1, ${Math.min(maxHeight, Math.max(minHeight, volume))}`,\n height: `${Math.min(maxHeight, Math.max(minHeight, volume * 100 + 5))}%`,\n }}\n ></span>\n ),\n )}\n </div>\n );\n },\n);\n","import * as React from 'react';\n\nimport { ConnectionQualityIndicator } from './ConnectionQualityIndicator';\nimport { ParticipantName } from './ParticipantName';\nimport { TrackMutedIndicator } from './TrackMutedIndicator';\nimport { TrackRefContext, useEnsureTrackRef } from '../../context';\n\nimport type { ParticipantTileProps } from './ParticipantTile';\nimport { AudioTrack } from './AudioTrack';\nimport { useParticipantTile } from '../../hooks';\nimport { isTrackReference } from '@livekit/components-core';\nimport { BarVisualizer } from './BarVisualizer';\n\n/**\n * The `ParticipantAudioTile` component is the base utility wrapper for displaying a visual representation of a participant.\n * This component can be used as a child of the `TileLoop` or independently if a participant is passed as a property.\n *\n * @example\n * ```tsx\n * <ParticipantAudioTile />\n * ```\n * @public\n */\nexport const ParticipantAudioTile: (\n props: ParticipantTileProps & React.RefAttributes<HTMLDivElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLDivElement, ParticipantTileProps>(\n function ParticipantAudioTile(\n {\n children,\n disableSpeakingIndicator,\n onParticipantClick,\n trackRef,\n ...htmlProps\n }: ParticipantTileProps,\n ref,\n ) {\n const trackReference = useEnsureTrackRef(trackRef);\n const { elementProps } = useParticipantTile({\n trackRef: trackReference,\n htmlProps,\n disableSpeakingIndicator,\n onParticipantClick,\n });\n\n return (\n <div ref={ref} style={{ position: 'relative', minHeight: '160px' }} {...elementProps}>\n <TrackRefContext.Provider value={trackReference}>\n {children ?? (\n <>\n {isTrackReference(trackReference) && (\n <AudioTrack trackRef={trackReference}></AudioTrack>\n )}\n <BarVisualizer barCount={7} options={{ minHeight: 8 }} />\n <div className=\"lk-participant-metadata\">\n <div className=\"lk-participant-metadata-item\">\n <TrackMutedIndicator trackRef={trackReference}></TrackMutedIndicator>\n <ParticipantName />\n </div>\n <ConnectionQualityIndicator className=\"lk-participant-metadata-item\" />\n </div>\n </>\n )}\n </TrackRefContext.Provider>\n </div>\n );\n },\n);\n","import type { Room } from 'livekit-client';\nimport { ConnectionState } from 'livekit-client';\nimport * as React from 'react';\nimport { SpinnerIcon } from '../assets/icons';\nimport { useConnectionState } from '../hooks';\nimport { Toast } from './Toast';\n\n/** @public */\nexport interface ConnectionStateToastProps extends React.HTMLAttributes<HTMLDivElement> {\n room?: Room;\n}\n\n/**\n * The `ConnectionStateToast` component displays a toast\n * notification indicating the current connection state of the room.\n * @public\n */\nexport function ConnectionStateToast(props: ConnectionStateToastProps) {\n const [notification, setNotification] = React.useState<React.ReactElement | undefined>(undefined);\n const state = useConnectionState(props.room);\n\n React.useEffect(() => {\n switch (state) {\n case ConnectionState.Reconnecting:\n setNotification(\n <>\n <SpinnerIcon className=\"lk-spinner\" /> Reconnecting\n </>,\n );\n break;\n case ConnectionState.Connecting:\n setNotification(\n <>\n <SpinnerIcon className=\"lk-spinner\" /> Connecting\n </>,\n );\n break;\n case ConnectionState.Disconnected:\n setNotification(<>Disconnected</>);\n break;\n default:\n setNotification(undefined);\n break;\n }\n }, [state]);\n return notification ? <Toast className=\"lk-toast-connection-state\">{notification}</Toast> : <></>;\n}\n","import type { ReceivedChatMessage } from '@livekit/components-core';\nimport { tokenize, createDefaultGrammar } from '@livekit/components-core';\nimport * as React from 'react';\n\n/** @public */\nexport type MessageFormatter = (message: string) => React.ReactNode;\n\n/**\n * ChatEntry composes the HTML div element under the hood, so you can pass all its props.\n * These are the props specific to the ChatEntry component:\n * @public\n */\nexport interface ChatEntryProps extends React.HTMLAttributes<HTMLLIElement> {\n /** The chat massage object to display. */\n entry: ReceivedChatMessage;\n /** Hide sender name. Useful when displaying multiple consecutive chat messages from the same person. */\n hideName?: boolean;\n /** Hide message timestamp. */\n hideTimestamp?: boolean;\n /** An optional formatter for the message body. */\n messageFormatter?: MessageFormatter;\n}\n\n/**\n * The `ChatEntry` component holds and displays one chat message.\n *\n * @example\n * ```tsx\n * <Chat>\n * <ChatEntry />\n * </Chat>\n * ```\n * @see `Chat`\n * @public\n */\nexport const ChatEntry: (\n props: ChatEntryProps & React.RefAttributes<HTMLLIElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLLIElement, ChatEntryProps>(\n function ChatEntry(\n { entry, hideName = false, hideTimestamp = false, messageFormatter, ...props }: ChatEntryProps,\n ref,\n ) {\n const formattedMessage = React.useMemo(() => {\n return messageFormatter ? messageFormatter(entry.message) : entry.message;\n }, [entry.message, messageFormatter]);\n const hasBeenEdited = !!entry.editTimestamp;\n const time = new Date(entry.timestamp);\n const locale = typeof navigator !== 'undefined' ? navigator.language : 'en-US';\n\n const name = entry.from?.name ?? entry.from?.identity;\n\n return (\n <li\n ref={ref}\n className=\"lk-chat-entry\"\n title={time.toLocaleTimeString(locale, { timeStyle: 'full' })}\n data-lk-message-origin={entry.from?.isLocal ? 'local' : 'remote'}\n {...props}\n >\n {(!hideTimestamp || !hideName || hasBeenEdited) && (\n <span className=\"lk-meta-data\">\n {!hideName && <strong className=\"lk-participant-name\">{name}</strong>}\n\n {(!hideTimestamp || hasBeenEdited) && (\n <span className=\"lk-timestamp\">\n {hasBeenEdited && 'edited '}\n {time.toLocaleTimeString(locale, { timeStyle: 'short' })}\n </span>\n )}\n </span>\n )}\n\n <span className=\"lk-message-body\">{formattedMessage}</span>\n <span className=\"lk-message-attachements\">\n {entry.attachedFiles?.map(\n (file) =>\n file.type.startsWith('image/') && (\n <img\n style={{ maxWidth: '300px', maxHeight: '300px' }}\n key={file.name}\n src={URL.createObjectURL(file)}\n alt={file.name}\n />\n ),\n )}\n </span>\n </li>\n );\n },\n);\n\n/** @public */\nexport function formatChatMessageLinks(message: string): React.ReactNode {\n return tokenize(message, createDefaultGrammar()).map((tok, i) => {\n if (typeof tok === `string`) {\n return tok;\n } else {\n const content = tok.content.toString();\n const href =\n tok.type === `url`\n ? /^http(s?):\\/\\//.test(content)\n ? content\n : `https://${content}`\n : `mailto:${content}`;\n return (\n <a className=\"lk-chat-link\" key={i} href={href} target=\"_blank\" rel=\"noreferrer\">\n {content}\n </a>\n );\n }\n });\n}\n","import { type ChatMessage, type ChatOptions } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useMaybeLayoutContext } from '../context';\nimport { cloneSingleChild } from '../utils';\nimport type { MessageFormatter } from '../components/ChatEntry';\nimport { ChatEntry } from '../components/ChatEntry';\nimport { useChat } from '../hooks/useChat';\nimport { ChatToggle } from '../components';\nimport ChatCloseIcon from '../assets/icons/ChatCloseIcon';\n\n/** @public */\nexport interface ChatProps extends React.HTMLAttributes<HTMLDivElement>, ChatOptions {\n messageFormatter?: MessageFormatter;\n}\n\n/**\n * The Chat component provides ready-to-use chat functionality in a LiveKit room.\n * Messages are distributed to all participants in the room in real-time.\n *\n * @remarks\n * - Only users who are in the room at the time of dispatch will receive messages\n * - Message history is not persisted between sessions\n * - Requires `@livekit/components-styles` to be imported for styling\n *\n * @example\n * ```tsx\n * import '@livekit/components-styles';\n *\n * function Room() {\n * return (\n * <LiveKitRoom data-lk-theme=\"default\">\n * <Chat />\n * </LiveKitRoom>\n * );\n * }\n * ```\n *\n * For custom styling, refer to: https://docs.livekit.io/reference/components/react/concepts/style-components/\n *\n * @public\n */\nexport function Chat({\n messageFormatter,\n messageDecoder,\n messageEncoder,\n channelTopic,\n ...props\n}: ChatProps) {\n const ulRef = React.useRef<HTMLUListElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const chatOptions: ChatOptions = React.useMemo(() => {\n return { messageDecoder, messageEncoder, channelTopic };\n }, [messageDecoder, messageEncoder, channelTopic]);\n\n const { chatMessages, send, isSending } = useChat(chatOptions);\n\n const layoutContext = useMaybeLayoutContext();\n const lastReadMsgAt = React.useRef<ChatMessage['timestamp']>(0);\n\n async function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n if (inputRef.current && inputRef.current.value.trim() !== '') {\n await send(inputRef.current.value);\n inputRef.current.value = '';\n inputRef.current.focus();\n }\n }\n\n React.useEffect(() => {\n if (ulRef) {\n ulRef.current?.scrollTo({ top: ulRef.current.scrollHeight });\n }\n }, [ulRef, chatMessages]);\n\n React.useEffect(() => {\n if (!layoutContext || chatMessages.length === 0) {\n return;\n }\n\n if (\n layoutContext.widget.state?.showChat &&\n chatMessages.length > 0 &&\n lastReadMsgAt.current !== chatMessages[chatMessages.length - 1]?.timestamp\n ) {\n lastReadMsgAt.current = chatMessages[chatMessages.length - 1]?.timestamp;\n return;\n }\n\n const unreadMessageCount = chatMessages.filter(\n (msg) => !lastReadMsgAt.current || msg.timestamp > lastReadMsgAt.current,\n ).length;\n\n const { widget } = layoutContext;\n if (unreadMessageCount > 0 && widget.state?.unreadMessages !== unreadMessageCount) {\n widget.dispatch?.({ msg: 'unread_msg', count: unreadMessageCount });\n }\n }, [chatMessages, layoutContext?.widget]);\n\n return (\n <div {...props} className=\"lk-chat\">\n <div className=\"lk-chat-header\">\n Messages\n {layoutContext && (\n <ChatToggle className=\"lk-close-button\">\n <ChatCloseIcon />\n </ChatToggle>\n )}\n </div>\n\n <ul className=\"lk-list lk-chat-messages\" ref={ulRef}>\n {props.children\n ? chatMessages.map((msg, idx) =>\n cloneSingleChild(props.children, {\n entry: msg,\n key: msg.id ?? idx,\n messageFormatter,\n }),\n )\n : chatMessages.map((msg, idx, allMsg) => {\n const hideName = idx >= 1 && allMsg[idx - 1].from === msg.from;\n // If the time delta between two messages is bigger than 60s show timestamp.\n const hideTimestamp = idx >= 1 && msg.timestamp - allMsg[idx - 1].timestamp < 60_000;\n\n return (\n <ChatEntry\n key={msg.id ?? idx}\n hideName={hideName}\n hideTimestamp={hideName === false ? false : hideTimestamp} // If we show the name always show the timestamp as well.\n entry={msg}\n messageFormatter={messageFormatter}\n />\n );\n })}\n </ul>\n <form className=\"lk-chat-form\" onSubmit={handleSubmit}>\n <input\n className=\"lk-form-control lk-chat-form-input\"\n disabled={isSending}\n ref={inputRef}\n type=\"text\"\n placeholder=\"Enter a message...\"\n onInput={(ev) => ev.stopPropagation()}\n onKeyDown={(ev) => ev.stopPropagation()}\n onKeyUp={(ev) => ev.stopPropagation()}\n />\n <button type=\"submit\" className=\"lk-button lk-chat-form-button\" disabled={isSending}>\n Send\n </button>\n </form>\n </div>\n );\n}\n","import { computeMenuPosition, wasClickOutside, log } from '@livekit/components-core';\nimport * as React from 'react';\nimport { MediaDeviceSelect } from '../components/controls/MediaDeviceSelect';\nimport type { LocalAudioTrack, LocalVideoTrack } from 'livekit-client';\n\n/** @public */\nexport interface MediaDeviceMenuProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n kind?: MediaDeviceKind;\n initialSelection?: string;\n onActiveDeviceChange?: (kind: MediaDeviceKind, deviceId: string) => void;\n tracks?: Partial<Record<MediaDeviceKind, LocalAudioTrack | LocalVideoTrack | undefined>>;\n /**\n * this will call getUserMedia if the permissions are not yet given to enumerate the devices with device labels.\n * in some browsers multiple calls to getUserMedia result in multiple permission prompts.\n * It's generally advised only flip this to true, once a (preview) track has been acquired successfully with the\n * appropriate permissions.\n *\n * @see {@link PreJoin}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/enumerateDevices | MDN enumerateDevices}\n */\n requestPermissions?: boolean;\n}\n\n/**\n * The `MediaDeviceMenu` component is a button that opens a menu that lists\n * all media devices and allows the user to select them.\n *\n * @remarks\n * This component is implemented with the `MediaDeviceSelect` LiveKit components.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <MediaDeviceMenu />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport function MediaDeviceMenu({\n kind,\n initialSelection,\n onActiveDeviceChange,\n tracks,\n requestPermissions = false,\n ...props\n}: MediaDeviceMenuProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [devices, setDevices] = React.useState<MediaDeviceInfo[]>([]);\n const [updateRequired, setUpdateRequired] = React.useState<boolean>(true);\n const [needPermissions, setNeedPermissions] = React.useState(requestPermissions);\n\n const handleActiveDeviceChange = (kind: MediaDeviceKind, deviceId: string) => {\n log.debug('handle device change');\n setIsOpen(false);\n onActiveDeviceChange?.(kind, deviceId);\n };\n\n const button = React.useRef<HTMLButtonElement>(null);\n const tooltip = React.useRef<HTMLDivElement>(null);\n\n React.useLayoutEffect(() => {\n if (isOpen) {\n setNeedPermissions(true);\n }\n }, [isOpen]);\n\n React.useLayoutEffect(() => {\n let cleanup: ReturnType<typeof computeMenuPosition> | undefined;\n if (button.current && tooltip.current && (devices || updateRequired)) {\n cleanup = computeMenuPosition(button.current, tooltip.current, (x, y) => {\n if (tooltip.current) {\n Object.assign(tooltip.current.style, { left: `${x}px`, top: `${y}px` });\n }\n });\n }\n setUpdateRequired(false);\n return () => {\n cleanup?.();\n };\n }, [button, tooltip, devices, updateRequired]);\n\n const handleClickOutside = React.useCallback(\n (event: MouseEvent) => {\n if (!tooltip.current) {\n return;\n }\n if (event.target === button.current) {\n return;\n }\n if (isOpen && wasClickOutside(tooltip.current, event)) {\n setIsOpen(false);\n }\n },\n [isOpen, tooltip, button],\n );\n\n React.useEffect(() => {\n document.addEventListener<'click'>('click', handleClickOutside);\n return () => {\n document.removeEventListener<'click'>('click', handleClickOutside);\n };\n }, [handleClickOutside]);\n\n return (\n <>\n <button\n className=\"lk-button lk-button-menu\"\n aria-pressed={isOpen}\n {...props}\n onClick={() => setIsOpen(!isOpen)}\n ref={button}\n >\n {props.children}\n </button>\n {/** only render when enabled in order to make sure that the permissions are requested only if the menu is enabled */}\n {!props.disabled && (\n <div\n className=\"lk-device-menu\"\n ref={tooltip}\n style={{ visibility: isOpen ? 'visible' : 'hidden' }}\n >\n {kind ? (\n <MediaDeviceSelect\n initialSelection={initialSelection}\n onActiveDeviceChange={(deviceId) => handleActiveDeviceChange(kind, deviceId)}\n onDeviceListChange={setDevices}\n kind={kind}\n track={tracks?.[kind]}\n requestPermissions={needPermissions}\n />\n ) : (\n <>\n <div className=\"lk-device-menu-heading\">Audio inputs</div>\n <MediaDeviceSelect\n kind=\"audioinput\"\n onActiveDeviceChange={(deviceId) =>\n handleActiveDeviceChange('audioinput', deviceId)\n }\n onDeviceListChange={setDevices}\n track={tracks?.audioinput}\n requestPermissions={needPermissions}\n />\n <div className=\"lk-device-menu-heading\">Video inputs</div>\n <MediaDeviceSelect\n kind=\"videoinput\"\n onActiveDeviceChange={(deviceId) =>\n handleActiveDeviceChange('videoinput', deviceId)\n }\n onDeviceListChange={setDevices}\n track={tracks?.videoinput}\n requestPermissions={needPermissions}\n />\n </>\n )}\n </div>\n )}\n </>\n );\n}\n","import * as React from 'react';\nimport { warnAboutMissingStyles } from '../utils';\n\n/**\n * @internal\n */\nexport function useWarnAboutMissingStyles() {\n React.useEffect(() => {\n warnAboutMissingStyles();\n }, []);\n}\n","import type {\n CreateLocalTracksOptions,\n LocalAudioTrack,\n LocalVideoTrack,\n TrackProcessor,\n} from 'livekit-client';\nimport {\n createLocalAudioTrack,\n createLocalTracks,\n createLocalVideoTrack,\n facingModeFromLocalTrack,\n Track,\n VideoPresets,\n Mutex,\n} from 'livekit-client';\nimport * as React from 'react';\nimport { MediaDeviceMenu } from './MediaDeviceMenu';\nimport { TrackToggle } from '../components/controls/TrackToggle';\nimport type { LocalUserChoices } from '@livekit/components-core';\nimport { log } from '@livekit/components-core';\nimport { ParticipantPlaceholder } from '../assets/images';\nimport { useMediaDevices, usePersistentUserChoices } from '../hooks';\nimport { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';\nimport { roomOptionsStringifyReplacer } from '../utils';\n\n/**\n * Props for the PreJoin component.\n * @public\n */\nexport interface PreJoinProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSubmit' | 'onError'> {\n /** This function is called with the `LocalUserChoices` if validation is passed. */\n onSubmit?: (values: LocalUserChoices) => void;\n /**\n * Provide your custom validation function. Only if validation is successful the user choices are past to the onSubmit callback.\n */\n onValidate?: (values: LocalUserChoices) => boolean;\n onError?: (error: Error) => void;\n /** Prefill the input form with initial values. */\n defaults?: Partial<LocalUserChoices>;\n /** Display a debug window for your convenience. */\n debug?: boolean;\n joinLabel?: string;\n micLabel?: string;\n camLabel?: string;\n userLabel?: string;\n /**\n * If true, user choices are persisted across sessions.\n * @defaultValue true\n * @alpha\n */\n persistUserChoices?: boolean;\n videoProcessor?: TrackProcessor<Track.Kind.Video>;\n}\n\n/** @public */\nexport function usePreviewTracks(\n options: CreateLocalTracksOptions,\n onError?: (err: Error) => void,\n) {\n const [tracks, setTracks] = React.useState<Array<LocalAudioTrack | LocalVideoTrack>>();\n\n const trackLock = React.useMemo(() => new Mutex(), []);\n\n React.useEffect(() => {\n let needsCleanup = false;\n let localTracks: Array<LocalAudioTrack | LocalVideoTrack> = [];\n trackLock.lock().then(async (unlock) => {\n try {\n if (options.audio || options.video) {\n localTracks = (await createLocalTracks(options)) as Array<\n LocalAudioTrack | LocalVideoTrack\n >;\n\n if (needsCleanup) {\n localTracks.forEach((tr) => tr.stop());\n } else {\n setTracks(localTracks);\n }\n }\n } catch (e: unknown) {\n if (onError && e instanceof Error) {\n onError(e);\n } else {\n log.error(e);\n }\n } finally {\n unlock();\n }\n });\n\n return () => {\n needsCleanup = true;\n localTracks.forEach((track) => {\n track.stop();\n });\n };\n }, [JSON.stringify(options, roomOptionsStringifyReplacer), onError, trackLock]);\n\n return tracks;\n}\n\n/**\n * @public\n * @deprecated use `usePreviewTracks` instead\n */\nexport function usePreviewDevice<T extends LocalVideoTrack | LocalAudioTrack>(\n enabled: boolean,\n deviceId: string,\n kind: 'videoinput' | 'audioinput',\n) {\n const [deviceError, setDeviceError] = React.useState<Error | null>(null);\n const [isCreatingTrack, setIsCreatingTrack] = React.useState<boolean>(false);\n\n const devices = useMediaDevices({ kind });\n const [selectedDevice, setSelectedDevice] = React.useState<MediaDeviceInfo | undefined>(\n undefined,\n );\n\n const [localTrack, setLocalTrack] = React.useState<T>();\n const [localDeviceId, setLocalDeviceId] = React.useState<string>(deviceId);\n\n React.useEffect(() => {\n setLocalDeviceId(deviceId);\n }, [deviceId]);\n\n const createTrack = async (deviceId: string, kind: 'videoinput' | 'audioinput') => {\n try {\n const track =\n kind === 'videoinput'\n ? await createLocalVideoTrack({\n deviceId,\n resolution: VideoPresets.h720.resolution,\n })\n : await createLocalAudioTrack({ deviceId });\n\n const newDeviceId = await track.getDeviceId(false);\n if (newDeviceId && deviceId !== newDeviceId) {\n prevDeviceId.current = newDeviceId;\n setLocalDeviceId(newDeviceId);\n }\n setLocalTrack(track as T);\n } catch (e) {\n if (e instanceof Error) {\n setDeviceError(e);\n }\n }\n };\n\n const switchDevice = async (track: LocalVideoTrack | LocalAudioTrack, id: string) => {\n await track.setDeviceId(id);\n prevDeviceId.current = id;\n };\n\n const prevDeviceId = React.useRef(localDeviceId);\n\n React.useEffect(() => {\n if (enabled && !localTrack && !deviceError && !isCreatingTrack) {\n log.debug('creating track', kind);\n setIsCreatingTrack(true);\n createTrack(localDeviceId, kind).finally(() => {\n setIsCreatingTrack(false);\n });\n }\n }, [enabled, localTrack, deviceError, isCreatingTrack]);\n\n // switch camera device\n React.useEffect(() => {\n if (!localTrack) {\n return;\n }\n if (!enabled) {\n log.debug(`muting ${kind} track`);\n localTrack.mute().then(() => log.debug(localTrack.mediaStreamTrack));\n } else if (selectedDevice?.deviceId && prevDeviceId.current !== selectedDevice?.deviceId) {\n log.debug(`switching ${kind} device from`, prevDeviceId.current, selectedDevice.deviceId);\n switchDevice(localTrack, selectedDevice.deviceId);\n } else {\n log.debug(`unmuting local ${kind} track`);\n localTrack.unmute();\n }\n }, [localTrack, selectedDevice, enabled, kind]);\n\n React.useEffect(() => {\n return () => {\n if (localTrack) {\n log.debug(`stopping local ${kind} track`);\n localTrack.stop();\n localTrack.mute();\n }\n };\n }, []);\n\n React.useEffect(() => {\n setSelectedDevice(devices?.find((dev) => dev.deviceId === localDeviceId));\n }, [localDeviceId, devices]);\n\n return {\n selectedDevice,\n localTrack,\n deviceError,\n };\n}\n\n/**\n * The `PreJoin` prefab component is normally presented to the user before he enters a room.\n * This component allows the user to check and select the preferred media device (camera und microphone).\n * On submit the user decisions are returned, which can then be passed on to the `LiveKitRoom` so that the user enters the room with the correct media devices.\n *\n * @remarks\n * This component is independent of the `LiveKitRoom` component and should not be nested within it.\n * Because it only accesses the local media tracks this component is self-contained and works without connection to the LiveKit server.\n *\n * @example\n * ```tsx\n * <PreJoin />\n * ```\n * @public\n */\nexport function PreJoin({\n defaults = {},\n onValidate,\n onSubmit,\n onError,\n debug,\n joinLabel = 'Join Room',\n micLabel = 'Microphone',\n camLabel = 'Camera',\n userLabel = 'Username',\n persistUserChoices = true,\n videoProcessor,\n ...htmlProps\n}: PreJoinProps) {\n const {\n userChoices: initialUserChoices,\n saveAudioInputDeviceId,\n saveAudioInputEnabled,\n saveVideoInputDeviceId,\n saveVideoInputEnabled,\n saveUsername,\n } = usePersistentUserChoices({\n defaults,\n preventSave: !persistUserChoices,\n preventLoad: !persistUserChoices,\n });\n\n const [userChoices, setUserChoices] = React.useState(initialUserChoices);\n\n // Initialize device settings\n const [audioEnabled, setAudioEnabled] = React.useState<boolean>(userChoices.audioEnabled);\n const [videoEnabled, setVideoEnabled] = React.useState<boolean>(userChoices.videoEnabled);\n const [audioDeviceId, setAudioDeviceId] = React.useState<string>(userChoices.audioDeviceId);\n const [videoDeviceId, setVideoDeviceId] = React.useState<string>(userChoices.videoDeviceId);\n const [username, setUsername] = React.useState(userChoices.username);\n\n // Save user choices to persistent storage.\n React.useEffect(() => {\n saveAudioInputEnabled(audioEnabled);\n }, [audioEnabled, saveAudioInputEnabled]);\n React.useEffect(() => {\n saveVideoInputEnabled(videoEnabled);\n }, [videoEnabled, saveVideoInputEnabled]);\n React.useEffect(() => {\n saveAudioInputDeviceId(audioDeviceId);\n }, [audioDeviceId, saveAudioInputDeviceId]);\n React.useEffect(() => {\n saveVideoInputDeviceId(videoDeviceId);\n }, [videoDeviceId, saveVideoInputDeviceId]);\n React.useEffect(() => {\n saveUsername(username);\n }, [username, saveUsername]);\n\n const tracks = usePreviewTracks(\n {\n audio: audioEnabled ? { deviceId: initialUserChoices.audioDeviceId } : false,\n video: videoEnabled\n ? { deviceId: initialUserChoices.videoDeviceId, processor: videoProcessor }\n : false,\n },\n onError,\n );\n\n const videoEl = React.useRef(null);\n\n const videoTrack = React.useMemo(\n () => tracks?.filter((track) => track.kind === Track.Kind.Video)[0] as LocalVideoTrack,\n [tracks],\n );\n\n const facingMode = React.useMemo(() => {\n if (videoTrack) {\n const { facingMode } = facingModeFromLocalTrack(videoTrack);\n return facingMode;\n } else {\n return 'undefined';\n }\n }, [videoTrack]);\n\n const audioTrack = React.useMemo(\n () => tracks?.filter((track) => track.kind === Track.Kind.Audio)[0] as LocalAudioTrack,\n [tracks],\n );\n\n React.useEffect(() => {\n if (videoEl.current && videoTrack) {\n videoTrack.unmute();\n videoTrack.attach(videoEl.current);\n }\n\n return () => {\n videoTrack?.detach();\n };\n }, [videoTrack]);\n\n const [isValid, setIsValid] = React.useState<boolean>();\n\n const handleValidation = React.useCallback(\n (values: LocalUserChoices) => {\n if (typeof onValidate === 'function') {\n return onValidate(values);\n } else {\n return values.username !== '';\n }\n },\n [onValidate],\n );\n\n React.useEffect(() => {\n const newUserChoices = {\n username,\n videoEnabled,\n videoDeviceId,\n audioEnabled,\n audioDeviceId,\n };\n setUserChoices(newUserChoices);\n setIsValid(handleValidation(newUserChoices));\n }, [username, videoEnabled, handleValidation, audioEnabled, audioDeviceId, videoDeviceId]);\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n if (handleValidation(userChoices)) {\n if (typeof onSubmit === 'function') {\n onSubmit(userChoices);\n }\n } else {\n log.warn('Validation failed with: ', userChoices);\n }\n }\n\n useWarnAboutMissingStyles();\n\n return (\n <div className=\"lk-prejoin\" {...htmlProps}>\n <div className=\"lk-video-container\">\n {videoTrack && (\n <video ref={videoEl} width=\"1280\" height=\"720\" data-lk-facing-mode={facingMode} />\n )}\n {(!videoTrack || !videoEnabled) && (\n <div className=\"lk-camera-off-note\">\n <ParticipantPlaceholder />\n </div>\n )}\n </div>\n <div className=\"lk-button-group-container\">\n <div className=\"lk-button-group audio\">\n <TrackToggle\n initialState={audioEnabled}\n source={Track.Source.Microphone}\n onChange={(enabled) => setAudioEnabled(enabled)}\n >\n {micLabel}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n initialSelection={audioDeviceId}\n kind=\"audioinput\"\n disabled={!audioTrack}\n tracks={{ audioinput: audioTrack }}\n onActiveDeviceChange={(_, id) => setAudioDeviceId(id)}\n />\n </div>\n </div>\n <div className=\"lk-button-group video\">\n <TrackToggle\n initialState={videoEnabled}\n source={Track.Source.Camera}\n onChange={(enabled) => setVideoEnabled(enabled)}\n >\n {camLabel}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n initialSelection={videoDeviceId}\n kind=\"videoinput\"\n disabled={!videoTrack}\n tracks={{ videoinput: videoTrack }}\n onActiveDeviceChange={(_, id) => setVideoDeviceId(id)}\n />\n </div>\n </div>\n </div>\n\n <form className=\"lk-username-container\">\n <input\n className=\"lk-form-control\"\n id=\"username\"\n name=\"username\"\n type=\"text\"\n defaultValue={username}\n placeholder={userLabel}\n onChange={(inputEl) => setUsername(inputEl.target.value)}\n autoComplete=\"off\"\n />\n <button\n className=\"lk-button lk-join-button\"\n type=\"submit\"\n onClick={handleSubmit}\n disabled={!isValid}\n >\n {joinLabel}\n </button>\n </form>\n\n {debug && (\n <>\n <strong>User Choices:</strong>\n <ul className=\"lk-list\" style={{ overflow: 'hidden', maxWidth: '15rem' }}>\n <li>Username: {`${userChoices.username}`}</li>\n <li>Video Enabled: {`${userChoices.videoEnabled}`}</li>\n <li>Audio Enabled: {`${userChoices.audioEnabled}`}</li>\n <li>Video Device: {`${userChoices.videoDeviceId}`}</li>\n <li>Audio Device: {`${userChoices.audioDeviceId}`}</li>\n </ul>\n </>\n )}\n </div>\n );\n}\n","import { useLayoutContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport * as React from 'react';\n\n/** @alpha */\nexport interface UseSettingsToggleProps {\n props: React.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\n/**\n * The `useSettingsToggle` hook provides state and functions for toggling the settings menu.\n * @remarks\n * Depends on the `LayoutContext` to work properly.\n * @see {@link SettingsMenu}\n * @alpha\n */\nexport function useSettingsToggle({ props }: UseSettingsToggleProps) {\n const { dispatch, state } = useLayoutContext().widget;\n const className = 'lk-button lk-settings-toggle';\n\n const mergedProps = React.useMemo(() => {\n return mergeProps(props, {\n className,\n onClick: () => {\n if (dispatch) dispatch({ msg: 'toggle_settings' });\n },\n 'aria-pressed': state?.showSettings ? 'true' : 'false',\n });\n }, [props, className, dispatch, state]);\n\n return { mergedProps };\n}\n","import * as React from 'react';\nimport { useSettingsToggle } from '../../hooks/useSettingsToggle';\n\n/** @alpha */\nexport interface SettingsMenuToggleProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\n/**\n * The `SettingsMenuToggle` component is a button that toggles the visibility of the `SettingsMenu` component.\n * @remarks\n * For the component to have any effect it has to live inside a `LayoutContext` context.\n *\n * @alpha\n */\nexport const SettingsMenuToggle: (\n props: SettingsMenuToggleProps & React.RefAttributes<HTMLButtonElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLButtonElement, SettingsMenuToggleProps>(\n function SettingsMenuToggle(props: SettingsMenuToggleProps, ref) {\n const { mergedProps } = useSettingsToggle({ props });\n\n return (\n <button ref={ref} {...mergedProps}>\n {props.children}\n </button>\n );\n },\n);\n","import { Track } from 'livekit-client';\nimport * as React from 'react';\nimport { MediaDeviceMenu } from './MediaDeviceMenu';\nimport { DisconnectButton } from '../components/controls/DisconnectButton';\nimport { TrackToggle } from '../components/controls/TrackToggle';\nimport { ChatIcon, GearIcon, LeaveIcon } from '../assets/icons';\nimport { ChatToggle } from '../components/controls/ChatToggle';\nimport { useLocalParticipantPermissions, usePersistentUserChoices } from '../hooks';\nimport { useMediaQuery } from '../hooks/internal';\nimport { useMaybeLayoutContext } from '../context';\nimport { supportsScreenSharing } from '@livekit/components-core';\nimport { mergeProps } from '../utils';\nimport { StartMediaButton } from '../components/controls/StartMediaButton';\nimport { SettingsMenuToggle } from '../components/controls/SettingsMenuToggle';\n\n/** @public */\nexport type ControlBarControls = {\n microphone?: boolean;\n camera?: boolean;\n chat?: boolean;\n screenShare?: boolean;\n leave?: boolean;\n settings?: boolean;\n};\n\nconst trackSourceToProtocol = (source: Track.Source) => {\n // NOTE: this mapping avoids importing the protocol package as that leads to a significant bundle size increase\n switch (source) {\n case Track.Source.Camera:\n return 1;\n case Track.Source.Microphone:\n return 2;\n case Track.Source.ScreenShare:\n return 3;\n default:\n return 0;\n }\n};\n\n/** @public */\nexport interface ControlBarProps extends React.HTMLAttributes<HTMLDivElement> {\n onDeviceError?: (error: { source: Track.Source; error: Error }) => void;\n variation?: 'minimal' | 'verbose' | 'textOnly';\n controls?: ControlBarControls;\n /**\n * If `true`, the user's device choices will be persisted.\n * This will enable the user to have the same device choices when they rejoin the room.\n * @defaultValue true\n * @alpha\n */\n saveUserChoices?: boolean;\n}\n\n/**\n * The `ControlBar` prefab gives the user the basic user interface to control their\n * media devices (camera, microphone and screen share), open the `Chat` and leave the room.\n *\n * @remarks\n * This component is build with other LiveKit components like `TrackToggle`,\n * `DeviceSelectorButton`, `DisconnectButton` and `StartAudio`.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <ControlBar />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport function ControlBar({\n variation,\n controls,\n saveUserChoices = true,\n onDeviceError,\n ...props\n}: ControlBarProps) {\n const [isChatOpen, setIsChatOpen] = React.useState(false);\n const layoutContext = useMaybeLayoutContext();\n React.useEffect(() => {\n if (layoutContext?.widget.state?.showChat !== undefined) {\n setIsChatOpen(layoutContext?.widget.state?.showChat);\n }\n }, [layoutContext?.widget.state?.showChat]);\n const isTooLittleSpace = useMediaQuery(`(max-width: ${isChatOpen ? 1000 : 760}px)`);\n\n const defaultVariation = isTooLittleSpace ? 'minimal' : 'verbose';\n variation ??= defaultVariation;\n\n const visibleControls = { leave: true, ...controls };\n\n const localPermissions = useLocalParticipantPermissions();\n\n if (!localPermissions) {\n visibleControls.camera = false;\n visibleControls.chat = false;\n visibleControls.microphone = false;\n visibleControls.screenShare = false;\n } else {\n const canPublishSource = (source: Track.Source) => {\n return (\n localPermissions.canPublish &&\n (localPermissions.canPublishSources.length === 0 ||\n localPermissions.canPublishSources.includes(trackSourceToProtocol(source)))\n );\n };\n visibleControls.camera ??= canPublishSource(Track.Source.Camera);\n visibleControls.microphone ??= canPublishSource(Track.Source.Microphone);\n visibleControls.screenShare ??= canPublishSource(Track.Source.ScreenShare);\n visibleControls.chat ??= localPermissions.canPublishData && controls?.chat;\n }\n\n const showIcon = React.useMemo(\n () => variation === 'minimal' || variation === 'verbose',\n [variation],\n );\n const showText = React.useMemo(\n () => variation === 'textOnly' || variation === 'verbose',\n [variation],\n );\n\n const browserSupportsScreenSharing = supportsScreenSharing();\n\n const [isScreenShareEnabled, setIsScreenShareEnabled] = React.useState(false);\n\n const onScreenShareChange = React.useCallback(\n (enabled: boolean) => {\n setIsScreenShareEnabled(enabled);\n },\n [setIsScreenShareEnabled],\n );\n\n const htmlProps = mergeProps({ className: 'lk-control-bar' }, props);\n\n const {\n saveAudioInputEnabled,\n saveVideoInputEnabled,\n saveAudioInputDeviceId,\n saveVideoInputDeviceId,\n } = usePersistentUserChoices({ preventSave: !saveUserChoices });\n\n const microphoneOnChange = React.useCallback(\n (enabled: boolean, isUserInitiated: boolean) =>\n isUserInitiated ? saveAudioInputEnabled(enabled) : null,\n [saveAudioInputEnabled],\n );\n\n const cameraOnChange = React.useCallback(\n (enabled: boolean, isUserInitiated: boolean) =>\n isUserInitiated ? saveVideoInputEnabled(enabled) : null,\n [saveVideoInputEnabled],\n );\n\n return (\n <div {...htmlProps}>\n {visibleControls.microphone && (\n <div className=\"lk-button-group\">\n <TrackToggle\n source={Track.Source.Microphone}\n showIcon={showIcon}\n onChange={microphoneOnChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.Microphone, error })}\n >\n {showText && 'Microphone'}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n kind=\"audioinput\"\n onActiveDeviceChange={(_kind, deviceId) =>\n saveAudioInputDeviceId(deviceId ?? 'default')\n }\n />\n </div>\n </div>\n )}\n {visibleControls.camera && (\n <div className=\"lk-button-group\">\n <TrackToggle\n source={Track.Source.Camera}\n showIcon={showIcon}\n onChange={cameraOnChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.Camera, error })}\n >\n {showText && 'Camera'}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n kind=\"videoinput\"\n onActiveDeviceChange={(_kind, deviceId) =>\n saveVideoInputDeviceId(deviceId ?? 'default')\n }\n />\n </div>\n </div>\n )}\n {visibleControls.screenShare && browserSupportsScreenSharing && (\n <TrackToggle\n source={Track.Source.ScreenShare}\n captureOptions={{ audio: true, selfBrowserSurface: 'include' }}\n showIcon={showIcon}\n onChange={onScreenShareChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.ScreenShare, error })}\n >\n {showText && (isScreenShareEnabled ? 'Stop screen share' : 'Share screen')}\n </TrackToggle>\n )}\n {visibleControls.chat && (\n <ChatToggle>\n {showIcon && <ChatIcon />}\n {showText && 'Chat'}\n </ChatToggle>\n )}\n {visibleControls.settings && (\n <SettingsMenuToggle>\n {showIcon && <GearIcon />}\n {showText && 'Settings'}\n </SettingsMenuToggle>\n )}\n {visibleControls.leave && (\n <DisconnectButton>\n {showIcon && <LeaveIcon />}\n {showText && 'Leave'}\n </DisconnectButton>\n )}\n <StartMediaButton />\n </div>\n );\n}\n","import type {\n MessageDecoder,\n MessageEncoder,\n TrackReferenceOrPlaceholder,\n WidgetState,\n} from '@livekit/components-core';\nimport { isEqualTrackRef, isTrackReference, isWeb, log } from '@livekit/components-core';\nimport { RoomEvent, Track } from 'livekit-client';\nimport * as React from 'react';\nimport type { MessageFormatter } from '../components';\nimport {\n CarouselLayout,\n ConnectionStateToast,\n FocusLayout,\n FocusLayoutContainer,\n GridLayout,\n LayoutContextProvider,\n ParticipantTile,\n RoomAudioRenderer,\n} from '../components';\nimport { useCreateLayoutContext } from '../context';\nimport { usePinnedTracks, useTracks } from '../hooks';\nimport { Chat } from './Chat';\nimport { ControlBar, type ControlBarProps } from './ControlBar';\nimport { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';\n\n/**\n * @public\n */\nexport interface VideoConferenceProps extends React.HTMLAttributes<HTMLDivElement> {\n chatMessageFormatter?: MessageFormatter;\n chatMessageEncoder?: MessageEncoder;\n chatMessageDecoder?: MessageDecoder;\n /** @alpha */\n SettingsComponent?: React.ComponentType;\n controlBarProops?: Partial<ControlBarProps>;\n}\n\n/**\n * The `VideoConference` ready-made component is your drop-in solution for a classic video conferencing application.\n * It provides functionality such as focusing on one participant, grid view with pagination to handle large numbers\n * of participants, basic non-persistent chat, screen sharing, and more.\n *\n * @remarks\n * The component is implemented with other LiveKit components like `FocusContextProvider`,\n * `GridLayout`, `ControlBar`, `FocusLayoutContainer` and `FocusLayout`.\n * You can use these components as a starting point for your own custom video conferencing application.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <VideoConference />\n * <LiveKitRoom>\n * ```\n * @public\n */\nexport function VideoConference({\n chatMessageFormatter,\n chatMessageDecoder,\n chatMessageEncoder,\n SettingsComponent,\n controlBarProops = {},\n ...props\n}: VideoConferenceProps) {\n const [widgetState, setWidgetState] = React.useState<WidgetState>({\n showChat: false,\n unreadMessages: 0,\n showSettings: false,\n });\n const lastAutoFocusedScreenShareTrack = React.useRef<TrackReferenceOrPlaceholder | null>(null);\n\n const tracks = useTracks(\n [\n { source: Track.Source.Camera, withPlaceholder: true },\n { source: Track.Source.ScreenShare, withPlaceholder: false },\n ],\n { updateOnlyOn: [RoomEvent.ActiveSpeakersChanged], onlySubscribed: false },\n );\n\n const widgetUpdate = (state: WidgetState) => {\n log.debug('updating widget state', state);\n setWidgetState(state);\n };\n\n const layoutContext = useCreateLayoutContext();\n\n const screenShareTracks = tracks\n .filter(isTrackReference)\n .filter((track) => track.publication.source === Track.Source.ScreenShare);\n\n const focusTrack = usePinnedTracks(layoutContext)?.[0];\n const carouselTracks = tracks.filter((track) => !isEqualTrackRef(track, focusTrack));\n\n React.useEffect(() => {\n // If screen share tracks are published, and no pin is set explicitly, auto set the screen share.\n if (\n screenShareTracks.some((track) => track.publication.isSubscribed) &&\n lastAutoFocusedScreenShareTrack.current === null\n ) {\n log.debug('Auto set screen share focus:', { newScreenShareTrack: screenShareTracks[0] });\n layoutContext.pin.dispatch?.({ msg: 'set_pin', trackReference: screenShareTracks[0] });\n lastAutoFocusedScreenShareTrack.current = screenShareTracks[0];\n } else if (\n lastAutoFocusedScreenShareTrack.current &&\n !screenShareTracks.some(\n (track) =>\n track.publication.trackSid ===\n lastAutoFocusedScreenShareTrack.current?.publication?.trackSid,\n )\n ) {\n log.debug('Auto clearing screen share focus.');\n layoutContext.pin.dispatch?.({ msg: 'clear_pin' });\n lastAutoFocusedScreenShareTrack.current = null;\n }\n if (focusTrack && !isTrackReference(focusTrack)) {\n const updatedFocusTrack = tracks.find(\n (tr) =>\n tr.participant.identity === focusTrack.participant.identity &&\n tr.source === focusTrack.source,\n );\n if (updatedFocusTrack !== focusTrack && isTrackReference(updatedFocusTrack)) {\n layoutContext.pin.dispatch?.({ msg: 'set_pin', trackReference: updatedFocusTrack });\n }\n }\n }, [\n screenShareTracks\n .map((ref) => `${ref.publication.trackSid}_${ref.publication.isSubscribed}`)\n .join(),\n focusTrack?.publication?.trackSid,\n tracks,\n ]);\n\n useWarnAboutMissingStyles();\n\n return (\n <div className=\"lk-video-conference\" {...props}>\n {isWeb() && (\n <LayoutContextProvider\n value={layoutContext}\n // onPinChange={handleFocusStateChange}\n onWidgetChange={widgetUpdate}\n >\n <div className=\"lk-video-conference-inner\">\n {!focusTrack ? (\n <div className=\"lk-grid-layout-wrapper\">\n <GridLayout tracks={tracks}>\n <ParticipantTile />\n </GridLayout>\n </div>\n ) : (\n <div className=\"lk-focus-layout-wrapper\">\n <FocusLayoutContainer>\n <CarouselLayout tracks={carouselTracks}>\n <ParticipantTile />\n </CarouselLayout>\n {focusTrack && <FocusLayout trackRef={focusTrack} />}\n </FocusLayoutContainer>\n </div>\n )}\n <ControlBar\n controls={{ chat: true, settings: !!SettingsComponent, ...controlBarProops }}\n />\n </div>\n <Chat\n style={{ display: widgetState.showChat ? 'grid' : 'none' }}\n messageFormatter={chatMessageFormatter}\n messageEncoder={chatMessageEncoder}\n messageDecoder={chatMessageDecoder}\n />\n {SettingsComponent && (\n <div\n className=\"lk-settings-menu-modal\"\n style={{ display: widgetState.showSettings ? 'block' : 'none' }}\n >\n <SettingsComponent />\n </div>\n )}\n </LayoutContextProvider>\n )}\n <RoomAudioRenderer />\n <ConnectionStateToast />\n </div>\n );\n}\n","import * as React from 'react';\nimport { ControlBar } from './ControlBar';\n\nimport { ParticipantAudioTile } from '../components/participant/ParticipantAudioTile';\nimport { LayoutContextProvider } from '../components/layout/LayoutContextProvider';\nimport type { WidgetState } from '@livekit/components-core';\nimport { Chat } from './Chat';\nimport { TrackLoop } from '../components';\nimport { useTracks } from '../hooks';\nimport { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';\nimport { Track } from 'livekit-client';\n\n/** @public */\nexport interface AudioConferenceProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * This component is the default setup of a classic LiveKit audio conferencing app.\n * It provides functionality like switching between participant grid view and focus view.\n *\n * @remarks\n * The component is implemented with other LiveKit components like `FocusContextProvider`,\n * `GridLayout`, `ControlBar`, `FocusLayoutContainer` and `FocusLayout`.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <AudioConference />\n * <LiveKitRoom>\n * ```\n * @public\n */\nexport function AudioConference({ ...props }: AudioConferenceProps) {\n const [widgetState, setWidgetState] = React.useState<WidgetState>({\n showChat: false,\n unreadMessages: 0,\n });\n\n const audioTracks = useTracks([Track.Source.Microphone]);\n\n useWarnAboutMissingStyles();\n\n return (\n <LayoutContextProvider onWidgetChange={setWidgetState}>\n <div className=\"lk-audio-conference\" {...props}>\n <div className=\"lk-audio-conference-stage\">\n <TrackLoop tracks={audioTracks}>\n <ParticipantAudioTile />\n </TrackLoop>\n </div>\n <ControlBar\n controls={{ microphone: true, screenShare: false, camera: false, chat: true }}\n />\n {widgetState.showChat && <Chat />}\n </div>\n </LayoutContextProvider>\n );\n}\n","import { Track } from 'livekit-client';\nimport * as React from 'react';\nimport { MediaDeviceMenu } from './MediaDeviceMenu';\nimport { TrackToggle } from '../components/controls/TrackToggle';\nimport {\n useLocalParticipant,\n useLocalParticipantPermissions,\n usePersistentUserChoices,\n} from '../hooks';\nimport { mergeProps } from '../utils';\nimport { StartMediaButton } from '../components/controls/StartMediaButton';\nimport { BarVisualizer, DisconnectButton } from '../components';\nimport type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\n\n/** @beta */\nexport type VoiceAssistantControlBarControls = {\n microphone?: boolean;\n leave?: boolean;\n};\n\n/** @beta */\nexport interface VoiceAssistantControlBarProps extends React.HTMLAttributes<HTMLDivElement> {\n onDeviceError?: (error: { source: Track.Source; error: Error }) => void;\n controls?: VoiceAssistantControlBarControls;\n /**\n * If `true`, the user's device choices will be persisted.\n * This will enables the user to have the same device choices when they rejoin the room.\n * @defaultValue true\n */\n saveUserChoices?: boolean;\n}\n\n/**\n * @example\n * ```tsx\n * <LiveKitRoom ... >\n * <VoiceAssistantControlBar />\n * </LiveKitRoom>\n * ```\n * @beta\n */\nexport function VoiceAssistantControlBar({\n controls,\n saveUserChoices = true,\n onDeviceError,\n ...props\n}: VoiceAssistantControlBarProps) {\n const visibleControls = { leave: true, microphone: true, ...controls };\n\n const localPermissions = useLocalParticipantPermissions();\n const { microphoneTrack, localParticipant } = useLocalParticipant();\n\n const micTrackRef: TrackReferenceOrPlaceholder = React.useMemo(() => {\n return {\n participant: localParticipant,\n source: Track.Source.Microphone,\n publication: microphoneTrack,\n };\n }, [localParticipant, microphoneTrack]);\n\n if (!localPermissions) {\n visibleControls.microphone = false;\n } else {\n visibleControls.microphone ??= localPermissions.canPublish;\n }\n\n const htmlProps = mergeProps({ className: 'lk-agent-control-bar' }, props);\n\n const { saveAudioInputEnabled, saveAudioInputDeviceId } = usePersistentUserChoices({\n preventSave: !saveUserChoices,\n });\n\n const microphoneOnChange = React.useCallback(\n (enabled: boolean, isUserInitiated: boolean) => {\n if (isUserInitiated) {\n saveAudioInputEnabled(enabled);\n }\n },\n [saveAudioInputEnabled],\n );\n\n return (\n <div {...htmlProps}>\n {visibleControls.microphone && (\n <div className=\"lk-button-group\">\n <TrackToggle\n source={Track.Source.Microphone}\n showIcon={true}\n onChange={microphoneOnChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.Microphone, error })}\n >\n <BarVisualizer trackRef={micTrackRef} barCount={7} options={{ minHeight: 5 }} />\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n kind=\"audioinput\"\n onActiveDeviceChange={(_kind, deviceId) =>\n saveAudioInputDeviceId(deviceId ?? 'default')\n }\n />\n </div>\n </div>\n )}\n\n {visibleControls.leave && <DisconnectButton>{'Disconnect'}</DisconnectButton>}\n <StartMediaButton />\n </div>\n );\n}\n"],"names":["useMediaQuery","query","getMatches","matches","setMatches","React","handleChange","matchMedia","LKFeatureContext","useFeatureContext","require","ctx","ChatToggle","props","ref","mergedProps","useChatToggle","DisconnectButton","buttonProps","useDisconnectButton","SvgCameraDisabledIcon","SvgCameraIcon","SvgChatCloseIcon","SvgChatIcon","SvgChevron","SvgFocusToggleIcon","SvgGearIcon","SvgLeaveIcon","SvgLockLockedIcon","SvgMicDisabledIcon","SvgMicIcon","SvgQualityExcellentIcon","SvgQualityGoodIcon","SvgQualityPoorIcon","SvgQualityUnknownIcon","SvgScreenShareIcon","SvgScreenShareStopIcon","SvgSpinnerIcon","SvgUnfocusToggleIcon","FocusToggle","trackRef","trackRefFromContext","useMaybeTrackRefContext","inFocus","useFocusToggle","LayoutContext","layoutContext","UnfocusToggleIcon","FocusToggleIcon","MediaDeviceSelect","kind","initialSelection","onActiveDeviceChange","onDeviceListChange","onDeviceSelectError","exactMatch","track","requestPermissions","onError","room","useMaybeRoomContext","previousActiveDeviceId","handleError","e","RoomEvent","devices","activeDeviceId","setActiveMediaDevice","className","useMediaDeviceSelect","handleActiveDeviceChange","deviceId","mergeProps","hasDefault","info","isActive","index","device","StartMediaButton","label","useRoomContext","audioProps","canPlayAudio","useStartAudio","canPlayVideo","useStartVideo","style","restProps","getSourceIcon","source","enabled","Track","MicIcon","MicDisabledIcon","CameraIcon","CameraDisabledIcon","ScreenShareStopIcon","ScreenShareIcon","getConnectionQualityIcon","quality","ConnectionQuality","QualityExcellentIcon","QualityGoodIcon","QualityPoorIcon","QualityUnknownIcon","TrackToggle","showIcon","useTrackToggle","isClient","setIsClient","ConnectionQualityIndicator","useConnectionQualityIndicator","elementProps","ParticipantName","participant","p","useEnsureParticipant","infoObserver","setupParticipantName","identity","name","useObservableState","TrackMutedIndicator","show","isMuted","useTrackMutedIndicator","showIndicator","htmlProps","SvgParticipantPlaceholder","useMediaTrackBySourceOrName","observerOptions","options","publication","setPublication","getTrackByIdentifier","setMuted","isSubscribed","setSubscribed","setTrack","orientation","setOrientation","previousElement","trackObserver","setupMediaTrack","isTrackReference","subscription","log","_a","_b","orientation_","FUNC_ERROR_TEXT","NAN","symbolTag","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","freeGlobal","global","freeSelf","root","objectProto","objectToString","nativeMax","nativeMin","now","debounce","func","wait","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","toNumber","isObject","invokeFunc","time","args","thisArg","leadingEdge","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","shouldInvoke","trailingEdge","cancel","flush","debounced","isInvoking","value","type","isObjectLike","isSymbol","other","isBinary","lodash_debounce","useUnmount","funcRef","useRef","useEffect","useDebounceCallback","delay","debouncedFunc","useMemo","debouncedFuncInstance","wrappedFunc","useDebounceValue","initialValue","eq","left","right","unwrappedInitialValue","debouncedValue","setDebouncedValue","useState","previousValueRef","updateDebouncedValue","useIntersectionObserver","threshold","rootMargin","freezeOnceVisible","initialIsIntersecting","onChange","setRef","state","setState","callbackRef","frozen","observer","entries","thresholds","entry","isIntersecting","threshold2","prevRef","_a2","VideoTrack","onTrackClick","onClick","onSubscriptionStatusChanged","manageSubscription","trackReference","useEnsureTrackRef","mediaEl","intersectionEntry","useHooks.useIntersectionObserver","debouncedIntersectionEntry","useHooks.useDebounceValue","RemoteTrackPublication","pub","clickHandler","evt","AudioTrack","volume","RemoteAudioTrack","ParticipantContextIfNeeded","hasContext","useMaybeParticipantContext","ParticipantContext","TrackRefContextIfNeeded","TrackRefContext","ParticipantTile","children","onParticipantClick","disableSpeakingIndicator","useParticipantTile","isEncrypted","useIsEncrypted","useMaybeLayoutContext","autoManageSubscription","handleSubscribe","subscribed","isTrackReferencePinned","ParticipantPlaceholder","LockLockedIcon","FocusLayoutContainer","FocusLayout","TrackLoop","tracks","getTrackReferenceId","cloneSingleChild","PaginationControl","totalPageCount","nextPage","prevPage","currentPage","connectedElement","interactive","setInteractive","createInteractingObservable","PaginationIndicator","bubbles","_","GridLayout","gridEl","layout","useGridLayout","pagination","usePagination","useSwipe","MIN_HEIGHT","MIN_WIDTH","MIN_VISIBLE_TILES","ASPECT_RATIO","ASPECT_RATIO_INVERT","CarouselLayout","asideEl","prevTiles","setPrevTiles","width","height","useSize","carouselOrientation","tileSpan","scrollBarWidth","getScrollBarWidth","tilesThatFit","maxVisibleTiles","sortedTiles","useVisualStableUpdate","LayoutContextProvider","onPinChange","onWidgetChange","layoutContextValue","useEnsureCreateLayoutContext","RoomAudioRenderer","muted","useTracks","Toast","generateConnectingSequenceBar","columns","seq","x","generateListeningSequenceBar","useBarAnimator","interval","setIndex","sequence","setSequence","idx","animationFrameId","startTime","animate","prev","sequencerIntervals","getSequencerInterval","barCount","BarVisualizer","targetTrack","volumeBands","useMultibandTrackVolume","minHeight","maxHeight","highlightedIndices","ParticipantAudioTile","ConnectionStateToast","notification","setNotification","useConnectionState","ConnectionState","SpinnerIcon","ChatEntry","hideName","hideTimestamp","messageFormatter","formattedMessage","hasBeenEdited","locale","_c","_d","file","formatChatMessageLinks","message","tokenize","createDefaultGrammar","tok","i","content","href","Chat","messageDecoder","messageEncoder","channelTopic","ulRef","inputRef","chatOptions","chatMessages","send","isSending","useChat","lastReadMsgAt","handleSubmit","event","unreadMessageCount","msg","widget","_e","ChatCloseIcon","allMsg","ev","MediaDeviceMenu","isOpen","setIsOpen","setDevices","updateRequired","setUpdateRequired","needPermissions","setNeedPermissions","button","tooltip","cleanup","computeMenuPosition","y","handleClickOutside","wasClickOutside","useWarnAboutMissingStyles","warnAboutMissingStyles","usePreviewTracks","setTracks","trackLock","Mutex","needsCleanup","localTracks","unlock","createLocalTracks","tr","roomOptionsStringifyReplacer","usePreviewDevice","deviceError","setDeviceError","isCreatingTrack","setIsCreatingTrack","useMediaDevices","selectedDevice","setSelectedDevice","localTrack","setLocalTrack","localDeviceId","setLocalDeviceId","createTrack","createLocalVideoTrack","VideoPresets","createLocalAudioTrack","newDeviceId","prevDeviceId","switchDevice","id","dev","PreJoin","defaults","onValidate","onSubmit","debug","joinLabel","micLabel","camLabel","userLabel","persistUserChoices","videoProcessor","initialUserChoices","saveAudioInputDeviceId","saveAudioInputEnabled","saveVideoInputDeviceId","saveVideoInputEnabled","saveUsername","usePersistentUserChoices","userChoices","setUserChoices","audioEnabled","setAudioEnabled","videoEnabled","setVideoEnabled","audioDeviceId","setAudioDeviceId","videoDeviceId","setVideoDeviceId","username","setUsername","videoEl","videoTrack","facingMode","facingModeFromLocalTrack","audioTrack","isValid","setIsValid","handleValidation","values","newUserChoices","inputEl","useSettingsToggle","dispatch","useLayoutContext","SettingsMenuToggle","trackSourceToProtocol","ControlBar","variation","controls","saveUserChoices","onDeviceError","isChatOpen","setIsChatOpen","defaultVariation","visibleControls","localPermissions","useLocalParticipantPermissions","canPublishSource","showText","browserSupportsScreenSharing","supportsScreenSharing","isScreenShareEnabled","setIsScreenShareEnabled","onScreenShareChange","microphoneOnChange","isUserInitiated","cameraOnChange","error","_kind","ChatIcon","GearIcon","LeaveIcon","VideoConference","chatMessageFormatter","chatMessageDecoder","chatMessageEncoder","SettingsComponent","controlBarProops","widgetState","setWidgetState","lastAutoFocusedScreenShareTrack","widgetUpdate","useCreateLayoutContext","screenShareTracks","focusTrack","usePinnedTracks","carouselTracks","isEqualTrackRef","updatedFocusTrack","_f","isWeb","AudioConference","audioTracks","VoiceAssistantControlBar","microphoneTrack","localParticipant","useLocalParticipant","micTrackRef"],"mappings":"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","x_google_ignoreList":[33,34]}
|
|
1
|
+
{"version":3,"file":"shared-D2Tkgmsq.js","sources":["../src/hooks/internal/useMediaQuery.ts","../src/context/feature-context.ts","../src/components/controls/ChatToggle.tsx","../src/components/controls/DisconnectButton.tsx","../src/assets/icons/CameraDisabledIcon.tsx","../src/assets/icons/CameraIcon.tsx","../src/assets/icons/ChatCloseIcon.tsx","../src/assets/icons/ChatIcon.tsx","../src/assets/icons/Chevron.tsx","../src/assets/icons/FocusToggleIcon.tsx","../src/assets/icons/GearIcon.tsx","../src/assets/icons/LeaveIcon.tsx","../src/assets/icons/LockLockedIcon.tsx","../src/assets/icons/MicDisabledIcon.tsx","../src/assets/icons/MicIcon.tsx","../src/assets/icons/QualityExcellentIcon.tsx","../src/assets/icons/QualityGoodIcon.tsx","../src/assets/icons/QualityPoorIcon.tsx","../src/assets/icons/QualityUnknownIcon.tsx","../src/assets/icons/ScreenShareIcon.tsx","../src/assets/icons/ScreenShareStopIcon.tsx","../src/assets/icons/SpinnerIcon.tsx","../src/assets/icons/UnfocusToggleIcon.tsx","../src/components/controls/FocusToggle.tsx","../src/components/controls/MediaDeviceSelect.tsx","../src/components/controls/StartMediaButton.tsx","../src/assets/icons/util.tsx","../src/components/controls/TrackToggle.tsx","../src/components/participant/ConnectionQualityIndicator.tsx","../src/components/participant/ParticipantName.tsx","../src/components/participant/TrackMutedIndicator.tsx","../src/assets/images/ParticipantPlaceholder.tsx","../src/hooks/useMediaTrackBySourceOrName.ts","../../../node_modules/.pnpm/lodash.debounce@4.0.8/node_modules/lodash.debounce/index.js","../../../node_modules/.pnpm/usehooks-ts@3.1.1_react@18.3.1/node_modules/usehooks-ts/dist/index.js","../src/components/participant/VideoTrack.tsx","../src/components/participant/AudioTrack.tsx","../src/components/participant/ParticipantTile.tsx","../src/components/layout/FocusLayout.tsx","../src/components/TrackLoop.tsx","../src/components/controls/PaginationControl.tsx","../src/components/controls/PaginationIndicator.tsx","../src/components/layout/GridLayout.tsx","../src/components/layout/CarouselLayout.tsx","../src/components/layout/LayoutContextProvider.tsx","../src/components/RoomAudioRenderer.tsx","../src/components/Toast.tsx","../src/components/participant/animationSequences/connectingSequence.ts","../src/components/participant/animationSequences/listeningSequence.ts","../src/components/participant/animators/useBarAnimator.ts","../src/components/participant/BarVisualizer.tsx","../src/components/participant/ParticipantAudioTile.tsx","../src/components/ConnectionStateToast.tsx","../src/components/ChatEntry.tsx","../src/prefabs/Chat.tsx","../src/prefabs/MediaDeviceMenu.tsx","../src/hooks/useWarnAboutMissingStyles.ts","../src/prefabs/PreJoin.tsx","../src/hooks/useSettingsToggle.ts","../src/components/controls/SettingsMenuToggle.tsx","../src/prefabs/ControlBar.tsx","../src/prefabs/VideoConference.tsx","../src/prefabs/AudioConference.tsx","../src/prefabs/VoiceAssistantControlBar.tsx"],"sourcesContent":["import * as React from 'react';\n/**\n * Implementation used from https://github.com/juliencrn/usehooks-ts\n *\n * @internal\n */\nexport function useMediaQuery(query: string): boolean {\n const getMatches = (query: string): boolean => {\n // Prevents SSR issues\n if (typeof window !== 'undefined') {\n return window.matchMedia(query).matches;\n }\n return false;\n };\n\n const [matches, setMatches] = React.useState<boolean>(getMatches(query));\n\n function handleChange() {\n setMatches(getMatches(query));\n }\n\n React.useEffect(() => {\n const matchMedia = window.matchMedia(query);\n\n // Triggered at the first client-side load and if query changes\n handleChange();\n\n // Listen matchMedia\n if (matchMedia.addListener) {\n matchMedia.addListener(handleChange);\n } else {\n matchMedia.addEventListener('change', handleChange);\n }\n\n return () => {\n if (matchMedia.removeListener) {\n matchMedia.removeListener(handleChange);\n } else {\n matchMedia.removeEventListener('change', handleChange);\n }\n };\n // eslint-disable-next-line react-hooks/exhaustive-deps\n }, [query]);\n\n return matches;\n}\n","import * as React from 'react';\n\n/** @internal */\nexport interface FeatureFlags {\n autoSubscription?: boolean;\n}\n\ntype FeatureContext<T extends boolean = false> = T extends true\n ? FeatureFlags\n : FeatureFlags | undefined;\n\n/** @internal */\nexport const LKFeatureContext = React.createContext<FeatureFlags | undefined>(undefined);\n\n/**\n * @internal\n */\nexport function useFeatureContext<T extends boolean>(require?: T): FeatureContext<T> {\n const ctx = React.useContext(LKFeatureContext) as FeatureContext<T>;\n if (require === true) {\n if (ctx) {\n return ctx;\n } else {\n throw Error('tried to access feature context, but none is present');\n }\n }\n return ctx;\n}\n","import * as React from 'react';\nimport { useChatToggle } from '../../hooks';\n\n/** @public */\nexport interface ChatToggleProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\n/**\n * The `ChatToggle` component is a button that toggles the visibility of the `Chat` component.\n * @remarks\n * For the component to have any effect it has to live inside a `LayoutContext` context.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <ToggleChat />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport const ChatToggle: (\n props: ChatToggleProps & React.RefAttributes<HTMLButtonElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLButtonElement, ChatToggleProps>(\n function ChatToggle(props: ChatToggleProps, ref) {\n const { mergedProps } = useChatToggle({ props });\n\n return (\n <button ref={ref} {...mergedProps}>\n {props.children}\n </button>\n );\n },\n);\n","import * as React from 'react';\nimport { useDisconnectButton } from '../../hooks';\n\n/** @public */\nexport interface DisconnectButtonProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n stopTracks?: boolean;\n}\n\n/**\n * The `DisconnectButton` is a basic html button with the added ability to disconnect from a LiveKit room.\n * Normally this is the big red button that allows end users to leave the video or audio call.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <DisconnectButton>Leave room</DisconnectButton>\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport const DisconnectButton: (\n props: DisconnectButtonProps & React.RefAttributes<HTMLButtonElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLButtonElement, DisconnectButtonProps>(\n function DisconnectButton(props: DisconnectButtonProps, ref) {\n const { buttonProps } = useDisconnectButton(props);\n return (\n <button ref={ref} {...buttonProps}>\n {props.children}\n </button>\n );\n },\n);\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgCameraDisabledIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"currentColor\" {...props}>\n <path d=\"M1.354.646a.5.5 0 1 0-.708.708l14 14a.5.5 0 0 0 .708-.708L11 10.293V4.5A1.5 1.5 0 0 0 9.5 3H3.707zM0 4.5a1.5 1.5 0 0 1 .943-1.393l9.532 9.533c-.262.224-.603.36-.975.36h-8A1.5 1.5 0 0 1 0 11.5z\" />\n <path d=\"m15.2 3.6-2.8 2.1a1 1 0 0 0-.4.8v3a1 1 0 0 0 .4.8l2.8 2.1a.5.5 0 0 0 .8-.4V4a.5.5 0 0 0-.8-.4z\" />\n </svg>\n);\nexport default SvgCameraDisabledIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgCameraIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"currentColor\" {...props}>\n <path d=\"M0 4.5A1.5 1.5 0 0 1 1.5 3h8A1.5 1.5 0 0 1 11 4.5v7A1.5 1.5 0 0 1 9.5 13h-8A1.5 1.5 0 0 1 0 11.5zM15.2 3.6l-2.8 2.1a1 1 0 0 0-.4.8v3a1 1 0 0 0 .4.8l2.8 2.1a.5.5 0 0 0 .8-.4V4a.5.5 0 0 0-.8-.4z\" />\n </svg>\n);\nexport default SvgCameraIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgChatCloseIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} viewBox=\"0 0 24 24\" {...props}>\n <path\n fill=\"#FFF\"\n d=\"M4.99 3.99a1 1 0 0 0-.697 1.717L10.586 12l-6.293 6.293a1 1 0 1 0 1.414 1.414L12 13.414l6.293 6.293a1 1 0 1 0 1.414-1.414L13.414 12l6.293-6.293a1 1 0 0 0-.727-1.717 1 1 0 0 0-.687.303L12 10.586 5.707 4.293a1 1 0 0 0-.717-.303z\"\n />\n </svg>\n);\nexport default SvgChatCloseIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgChatIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={18} fill=\"none\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M0 2.75A2.75 2.75 0 0 1 2.75 0h10.5A2.75 2.75 0 0 1 16 2.75v13.594a.75.75 0 0 1-1.234.572l-3.691-3.12a1.25 1.25 0 0 0-.807-.296H2.75A2.75 2.75 0 0 1 0 10.75v-8ZM2.75 1.5c-.69 0-1.25.56-1.25 1.25v8c0 .69.56 1.25 1.25 1.25h7.518c.65 0 1.279.23 1.775.65l2.457 2.077V2.75c0-.69-.56-1.25-1.25-1.25H2.75Z\"\n clipRule=\"evenodd\"\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M3 4.5a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5Zm0 2a.5.5 0 0 1 .5-.5h9a.5.5 0 0 1 0 1h-9a.5.5 0 0 1-.5-.5Zm0 2a.5.5 0 0 1 .5-.5h5a.5.5 0 0 1 0 1h-5a.5.5 0 0 1-.5-.5Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\nexport default SvgChatIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgChevron = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" {...props}>\n <path\n fill=\"currentcolor\"\n fillRule=\"evenodd\"\n d=\"M5.293 2.293a1 1 0 0 1 1.414 0l4.823 4.823a1.25 1.25 0 0 1 0 1.768l-4.823 4.823a1 1 0 0 1-1.414-1.414L9.586 8 5.293 3.707a1 1 0 0 1 0-1.414z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\nexport default SvgChevron;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgFocusToggleIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" {...props}>\n <g stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5}>\n <path d=\"M10 1.75h4.25m0 0V6m0-4.25L9 7M6 14.25H1.75m0 0V10m0 4.25L7 9\" />\n </g>\n </svg>\n);\nexport default SvgFocusToggleIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgGearIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" {...props}>\n <path\n fill=\"currentcolor\"\n fillRule=\"evenodd\"\n d=\"M8.961.894C8.875-.298 7.125-.298 7.04.894c-.066.912-1.246 1.228-1.76.472-.67-.99-2.186-.115-1.664.96.399.824-.465 1.688-1.288 1.289-1.076-.522-1.95.994-.961 1.665.756.513.44 1.693-.472 1.759-1.192.086-1.192 1.836 0 1.922.912.066 1.228 1.246.472 1.76-.99.67-.115 2.186.96 1.664.824-.399 1.688.465 1.289 1.288-.522 1.076.994 1.95 1.665.961.513-.756 1.693-.44 1.759.472.086 1.192 1.836 1.192 1.922 0 .066-.912 1.246-1.228 1.76-.472.67.99 2.186.115 1.664-.96-.399-.824.465-1.688 1.288-1.289 1.076.522 1.95-.994.961-1.665-.756-.513-.44-1.693.472-1.759 1.192-.086 1.192-1.836 0-1.922-.912-.066-1.228-1.246-.472-1.76.99-.67.115-2.186-.96-1.664-.824.399-1.688-.465-1.289-1.288.522-1.076-.994-1.95-1.665-.961-.513.756-1.693.44-1.759-.472ZM8 13A5 5 0 1 0 8 3a5 5 0 0 0 0 10Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\nexport default SvgGearIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgLeaveIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M2 2.75A2.75 2.75 0 0 1 4.75 0h6.5A2.75 2.75 0 0 1 14 2.75v10.5A2.75 2.75 0 0 1 11.25 16h-6.5A2.75 2.75 0 0 1 2 13.25v-.5a.75.75 0 0 1 1.5 0v.5c0 .69.56 1.25 1.25 1.25h6.5c.69 0 1.25-.56 1.25-1.25V2.75c0-.69-.56-1.25-1.25-1.25h-6.5c-.69 0-1.25.56-1.25 1.25v.5a.75.75 0 0 1-1.5 0v-.5Z\"\n clipRule=\"evenodd\"\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M8.78 7.47a.75.75 0 0 1 0 1.06l-2.25 2.25a.75.75 0 1 1-1.06-1.06l.97-.97H1.75a.75.75 0 0 1 0-1.5h4.69l-.97-.97a.75.75 0 0 1 1.06-1.06l2.25 2.25Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\nexport default SvgLeaveIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgLockLockedIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" {...props}>\n <path\n fill=\"currentcolor\"\n fillRule=\"evenodd\"\n d=\"M4 6.104V4a4 4 0 1 1 8 0v2.104c1.154.326 2 1.387 2 2.646v4.5A2.75 2.75 0 0 1 11.25 16h-6.5A2.75 2.75 0 0 1 2 13.25v-4.5c0-1.259.846-2.32 2-2.646ZM5.5 4a2.5 2.5 0 0 1 5 0v2h-5V4Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\nexport default SvgLockLockedIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgMicDisabledIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"currentColor\" {...props}>\n <path d=\"M12.227 11.52a5.477 5.477 0 0 0 1.246-2.97.5.5 0 0 0-.995-.1 4.478 4.478 0 0 1-.962 2.359l-1.07-1.07C10.794 9.247 11 8.647 11 8V3a3 3 0 0 0-6 0v1.293L1.354.646a.5.5 0 1 0-.708.708l14 14a.5.5 0 0 0 .708-.708zM8 12.5c.683 0 1.33-.152 1.911-.425l.743.743c-.649.359-1.378.59-2.154.66V15h2a.5.5 0 0 1 0 1h-5a.5.5 0 0 1 0-1h2v-1.522a5.502 5.502 0 0 1-4.973-4.929.5.5 0 0 1 .995-.098A4.5 4.5 0 0 0 8 12.5z\" />\n <path d=\"M8.743 10.907 5 7.164V8a3 3 0 0 0 3.743 2.907z\" />\n </svg>\n);\nexport default SvgMicDisabledIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgMicIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"currentColor\" {...props}>\n <path\n fillRule=\"evenodd\"\n d=\"M2.975 8.002a.5.5 0 0 1 .547.449 4.5 4.5 0 0 0 8.956 0 .5.5 0 1 1 .995.098A5.502 5.502 0 0 1 8.5 13.478V15h2a.5.5 0 0 1 0 1h-5a.5.5 0 0 1 0-1h2v-1.522a5.502 5.502 0 0 1-4.973-4.929.5.5 0 0 1 .448-.547z\"\n clipRule=\"evenodd\"\n />\n <path d=\"M5 3a3 3 0 1 1 6 0v5a3 3 0 0 1-6 0z\" />\n </svg>\n);\nexport default SvgMicIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgQualityExcellentIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"currentcolor\" {...props}>\n <path d=\"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n <path d=\"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n </svg>\n);\nexport default SvgQualityExcellentIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgQualityGoodIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"currentcolor\" {...props}>\n <path d=\"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n <path d=\"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n <g opacity={0.25}>\n <path d=\"M12 .5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n <path d=\"M12 .5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n </g>\n </svg>\n);\nexport default SvgQualityGoodIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgQualityPoorIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"currentcolor\" {...props}>\n <path d=\"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n <path d=\"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n <g opacity={0.25}>\n <path d=\"M6 6.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n <path d=\"M6 6.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n <path d=\"M12 .5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5z\" />\n </g>\n </svg>\n);\nexport default SvgQualityPoorIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgQualityUnknownIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"currentColor\" {...props}>\n <g opacity={0.25}>\n <path d=\"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-4Zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-9Zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5V.5Z\" />\n <path d=\"M0 11.5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v4a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-4Zm6-5a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v9a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5v-9Zm6-6a.5.5 0 0 1 .5-.5h3a.5.5 0 0 1 .5.5v15a.5.5 0 0 1-.5.5h-3a.5.5 0 0 1-.5-.5V.5Z\" />\n </g>\n </svg>\n);\nexport default SvgQualityUnknownIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgScreenShareIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={20} height={16} fill=\"none\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M0 2.75A2.75 2.75 0 0 1 2.75 0h14.5A2.75 2.75 0 0 1 20 2.75v10.5A2.75 2.75 0 0 1 17.25 16H2.75A2.75 2.75 0 0 1 0 13.25V2.75ZM2.75 1.5c-.69 0-1.25.56-1.25 1.25v10.5c0 .69.56 1.25 1.25 1.25h14.5c.69 0 1.25-.56 1.25-1.25V2.75c0-.69-.56-1.25-1.25-1.25H2.75Z\"\n clipRule=\"evenodd\"\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M9.47 4.22a.75.75 0 0 1 1.06 0l2.25 2.25a.75.75 0 0 1-1.06 1.06l-.97-.97v4.69a.75.75 0 0 1-1.5 0V6.56l-.97.97a.75.75 0 0 1-1.06-1.06l2.25-2.25Z\"\n clipRule=\"evenodd\"\n />\n </svg>\n);\nexport default SvgScreenShareIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgScreenShareStopIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={20} height={16} fill=\"none\" {...props}>\n <g fill=\"currentColor\">\n <path d=\"M7.28 4.22a.75.75 0 0 0-1.06 1.06L8.94 8l-2.72 2.72a.75.75 0 1 0 1.06 1.06L10 9.06l2.72 2.72a.75.75 0 1 0 1.06-1.06L11.06 8l2.72-2.72a.75.75 0 0 0-1.06-1.06L10 6.94z\" />\n <path\n fillRule=\"evenodd\"\n d=\"M2.75 0A2.75 2.75 0 0 0 0 2.75v10.5A2.75 2.75 0 0 0 2.75 16h14.5A2.75 2.75 0 0 0 20 13.25V2.75A2.75 2.75 0 0 0 17.25 0zM1.5 2.75c0-.69.56-1.25 1.25-1.25h14.5c.69 0 1.25.56 1.25 1.25v10.5c0 .69-.56 1.25-1.25 1.25H2.75c-.69 0-1.25-.56-1.25-1.25z\"\n clipRule=\"evenodd\"\n />\n </g>\n </svg>\n);\nexport default SvgScreenShareStopIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgSpinnerIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" {...props}>\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M8 0a.75.75 0 0 1 .75.75v2.5a.75.75 0 0 1-1.5 0V.75A.75.75 0 0 1 8 0Z\"\n clipRule=\"evenodd\"\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M8 12a.75.75 0 0 1 .75.75v2.5a.75.75 0 0 1-1.5 0v-2.5A.75.75 0 0 1 8 12Z\"\n clipRule=\"evenodd\"\n opacity={0.7}\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M12 1.072a.75.75 0 0 1 .274 1.024l-1.25 2.165a.75.75 0 0 1-1.299-.75l1.25-2.165A.75.75 0 0 1 12 1.072Z\"\n clipRule=\"evenodd\"\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M6 11.464a.75.75 0 0 1 .274 1.025l-1.25 2.165a.75.75 0 0 1-1.299-.75l1.25-2.165A.75.75 0 0 1 6 11.464Z\"\n clipRule=\"evenodd\"\n opacity={0.6}\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M14.928 4a.75.75 0 0 1-.274 1.025l-2.165 1.25a.75.75 0 1 1-.75-1.3l2.165-1.25A.75.75 0 0 1 14.928 4Z\"\n clipRule=\"evenodd\"\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M4.536 10a.75.75 0 0 1-.275 1.024l-2.165 1.25a.75.75 0 0 1-.75-1.298l2.165-1.25A.75.75 0 0 1 4.536 10Z\"\n clipRule=\"evenodd\"\n opacity={0.5}\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M16 8a.75.75 0 0 1-.75.75h-2.5a.75.75 0 0 1 0-1.5h2.5A.75.75 0 0 1 16 8Z\"\n clipRule=\"evenodd\"\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M4 8a.75.75 0 0 1-.75.75H.75a.75.75 0 0 1 0-1.5h2.5A.75.75 0 0 1 4 8Z\"\n clipRule=\"evenodd\"\n opacity={0.4}\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M14.928 12a.75.75 0 0 1-1.024.274l-2.165-1.25a.75.75 0 0 1 .75-1.299l2.165 1.25A.75.75 0 0 1 14.928 12Z\"\n clipRule=\"evenodd\"\n opacity={0.9}\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M4.536 6a.75.75 0 0 1-1.025.275l-2.165-1.25a.75.75 0 1 1 .75-1.3l2.165 1.25A.75.75 0 0 1 4.536 6Z\"\n clipRule=\"evenodd\"\n opacity={0.3}\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M12 14.928a.75.75 0 0 1-1.024-.274l-1.25-2.165a.75.75 0 0 1 1.298-.75l1.25 2.165A.75.75 0 0 1 12 14.928Z\"\n clipRule=\"evenodd\"\n opacity={0.8}\n />\n <path\n fill=\"currentColor\"\n fillRule=\"evenodd\"\n d=\"M6 4.536a.75.75 0 0 1-1.024-.275l-1.25-2.165a.75.75 0 1 1 1.299-.75l1.25 2.165A.75.75 0 0 1 6 4.536Z\"\n clipRule=\"evenodd\"\n opacity={0.2}\n />\n </svg>\n);\nexport default SvgSpinnerIcon;\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgUnfocusToggleIcon = (props: SVGProps<SVGSVGElement>) => (\n <svg xmlns=\"http://www.w3.org/2000/svg\" width={16} height={16} fill=\"none\" {...props}>\n <g stroke=\"currentColor\" strokeLinecap=\"round\" strokeLinejoin=\"round\" strokeWidth={1.5}>\n <path d=\"M13.25 7H9m0 0V2.75M9 7l5.25-5.25M2.75 9H7m0 0v4.25M7 9l-5.25 5.25\" />\n </g>\n </svg>\n);\nexport default SvgUnfocusToggleIcon;\n","import * as React from 'react';\nimport { LayoutContext, useMaybeTrackRefContext } from '../../context';\nimport { FocusToggleIcon, UnfocusToggleIcon } from '../../assets/icons';\nimport { useFocusToggle } from '../../hooks';\nimport type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\n\n/** @public */\nexport interface FocusToggleProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n trackRef?: TrackReferenceOrPlaceholder;\n}\n\n/**\n * The `FocusToggle` puts the `ParticipantTile` in focus or removes it from focus.\n * @remarks\n * This component needs to live inside `LayoutContext` to work properly.\n *\n * @example\n * ```tsx\n * <ParticipantTile>\n * <FocusToggle />\n * </ParticipantTile>\n * ```\n * @public\n */\nexport const FocusToggle: (\n props: FocusToggleProps & React.RefAttributes<HTMLButtonElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLButtonElement, FocusToggleProps>(\n function FocusToggle({ trackRef, ...props }: FocusToggleProps, ref) {\n const trackRefFromContext = useMaybeTrackRefContext();\n\n const { mergedProps, inFocus } = useFocusToggle({\n trackRef: trackRef ?? trackRefFromContext,\n props,\n });\n\n return (\n <LayoutContext.Consumer>\n {(layoutContext) =>\n layoutContext !== undefined && (\n <button ref={ref} {...mergedProps}>\n {props.children ? (\n props.children\n ) : inFocus ? (\n <UnfocusToggleIcon />\n ) : (\n <FocusToggleIcon />\n )}\n </button>\n )\n }\n </LayoutContext.Consumer>\n );\n },\n);\n","import * as React from 'react';\nimport { useMaybeRoomContext } from '../../context';\nimport { mergeProps } from '../../utils';\nimport { RoomEvent, type LocalAudioTrack, type LocalVideoTrack } from 'livekit-client';\nimport { useMediaDeviceSelect } from '../../hooks';\n\n/** @public */\nexport interface MediaDeviceSelectProps\n extends Omit<React.HTMLAttributes<HTMLUListElement>, 'onError'> {\n kind: MediaDeviceKind;\n onActiveDeviceChange?: (deviceId: string) => void;\n onDeviceListChange?: (devices: MediaDeviceInfo[]) => void;\n onDeviceSelectError?: (e: Error) => void;\n initialSelection?: string;\n /** will force the browser to only return the specified device\n * will call `onDeviceSelectError` with the error in case this fails\n */\n exactMatch?: boolean;\n track?: LocalAudioTrack | LocalVideoTrack;\n /**\n * this will call getUserMedia if the permissions are not yet given to enumerate the devices with device labels.\n * in some browsers multiple calls to getUserMedia result in multiple permission prompts.\n * It's generally advised only flip this to true, once a (preview) track has been acquired successfully with the\n * appropriate permissions.\n *\n * @see {@link MediaDeviceMenu}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/enumerateDevices | MDN enumerateDevices}\n */\n requestPermissions?: boolean;\n onError?: (e: Error) => void;\n}\n\n/**\n * The `MediaDeviceSelect` list all media devices of one kind.\n * Clicking on one of the listed devices make it the active media device.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <MediaDeviceSelect kind='audioinput' />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport const MediaDeviceSelect: (\n props: MediaDeviceSelectProps & React.RefAttributes<HTMLUListElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLUListElement, MediaDeviceSelectProps>(\n function MediaDeviceSelect(\n {\n kind,\n initialSelection,\n onActiveDeviceChange,\n onDeviceListChange,\n onDeviceSelectError,\n exactMatch,\n track,\n requestPermissions,\n onError,\n ...props\n }: MediaDeviceSelectProps,\n ref,\n ) {\n const room = useMaybeRoomContext();\n const previousActiveDeviceId = React.useRef<string>('default');\n const handleError = React.useCallback(\n (e: Error) => {\n if (room) {\n // awkwardly emit the event from outside of the room, as we don't have other means to raise a MediaDeviceError\n room.emit(RoomEvent.MediaDevicesError, e);\n }\n onError?.(e);\n },\n [room, onError],\n );\n const { devices, activeDeviceId, setActiveMediaDevice, className } = useMediaDeviceSelect({\n kind,\n room,\n track,\n requestPermissions,\n onError: handleError,\n });\n React.useEffect(() => {\n if (initialSelection !== undefined) {\n setActiveMediaDevice(initialSelection);\n }\n }, [setActiveMediaDevice]);\n\n React.useEffect(() => {\n if (typeof onDeviceListChange === 'function') {\n onDeviceListChange(devices);\n }\n }, [onDeviceListChange, devices]);\n\n React.useEffect(() => {\n if (activeDeviceId !== previousActiveDeviceId.current) {\n onActiveDeviceChange?.(activeDeviceId);\n }\n previousActiveDeviceId.current = activeDeviceId;\n }, [activeDeviceId]);\n\n const handleActiveDeviceChange = async (deviceId: string) => {\n try {\n await setActiveMediaDevice(deviceId, { exact: exactMatch ?? true });\n } catch (e) {\n if (e instanceof Error) {\n onDeviceSelectError?.(e);\n } else {\n throw e;\n }\n }\n };\n // Merge Props\n const mergedProps = React.useMemo(\n () => mergeProps(props, { className }, { className: 'lk-list' }),\n [className, props],\n );\n\n const hasDefault = !!devices.find((info) => info.label.toLowerCase().startsWith('default'));\n\n function isActive(deviceId: string, activeDeviceId: string, index: number) {\n return (\n deviceId === activeDeviceId || (!hasDefault && index === 0 && activeDeviceId === 'default')\n );\n }\n\n return (\n <ul ref={ref} {...mergedProps}>\n {devices.map((device, index) => (\n <li\n key={device.deviceId}\n id={device.deviceId}\n data-lk-active={isActive(device.deviceId, activeDeviceId, index)}\n aria-selected={isActive(device.deviceId, activeDeviceId, index)}\n role=\"option\"\n >\n <button className=\"lk-button\" onClick={() => handleActiveDeviceChange(device.deviceId)}>\n {device.label}\n </button>\n </li>\n ))}\n </ul>\n );\n },\n);\n","import * as React from 'react';\nimport { useRoomContext } from '../../context';\nimport { useStartAudio, useStartVideo } from '../../hooks';\n\n/** @public */\nexport interface AllowMediaPlaybackProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n label?: string;\n}\n\n/**\n * The `StartMediaButton` component is only visible when the browser blocks media playback. This is due to some browser implemented autoplay policies.\n * To start media playback, the user must perform a user-initiated event such as clicking this button.\n * As soon as media playback starts, the button hides itself again.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <StartMediaButton label=\"Click to allow media playback\" />\n * </LiveKitRoom>\n * ```\n *\n * @see Autoplay policy on MDN web docs: {@link https://developer.mozilla.org/en-US/docs/Web/API/Web_Audio_API/Best_practices#autoplay_policy}\n * @public\n */\nexport const StartMediaButton: (\n props: AllowMediaPlaybackProps & React.RefAttributes<HTMLButtonElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLButtonElement, AllowMediaPlaybackProps>(\n function StartMediaButton({ label, ...props }: AllowMediaPlaybackProps, ref) {\n const room = useRoomContext();\n const { mergedProps: audioProps, canPlayAudio } = useStartAudio({ room, props });\n const { mergedProps, canPlayVideo } = useStartVideo({ room, props: audioProps });\n const { style, ...restProps } = mergedProps;\n style.display = canPlayAudio && canPlayVideo ? 'none' : 'block';\n\n return (\n <button ref={ref} style={style} {...restProps}>\n {label ?? `Start ${!canPlayAudio ? 'Audio' : 'Video'}`}\n </button>\n );\n },\n);\n","import * as React from 'react';\nimport { ConnectionQuality, Track } from 'livekit-client';\n\nimport {\n MicIcon,\n MicDisabledIcon,\n CameraIcon,\n CameraDisabledIcon,\n QualityUnknownIcon,\n QualityExcellentIcon,\n QualityGoodIcon,\n QualityPoorIcon,\n ScreenShareIcon,\n ScreenShareStopIcon,\n} from './index';\n\n/**\n * @internal\n */\nexport function getSourceIcon(source: Track.Source, enabled: boolean) {\n switch (source) {\n case Track.Source.Microphone:\n return enabled ? <MicIcon /> : <MicDisabledIcon />;\n case Track.Source.Camera:\n return enabled ? <CameraIcon /> : <CameraDisabledIcon />;\n case Track.Source.ScreenShare:\n return enabled ? <ScreenShareStopIcon /> : <ScreenShareIcon />;\n default:\n return undefined;\n }\n}\n\n/**\n * @internal\n */\nexport function getConnectionQualityIcon(quality: ConnectionQuality) {\n switch (quality) {\n case ConnectionQuality.Excellent:\n return <QualityExcellentIcon />;\n case ConnectionQuality.Good:\n return <QualityGoodIcon />;\n case ConnectionQuality.Poor:\n return <QualityPoorIcon />;\n default:\n return <QualityUnknownIcon />;\n }\n}\n","import type { CaptureOptionsBySource, ToggleSource } from '@livekit/components-core';\nimport * as React from 'react';\nimport { getSourceIcon } from '../../assets/icons/util';\nimport { useTrackToggle } from '../../hooks';\nimport { TrackPublishOptions } from 'livekit-client';\n\n/** @public */\nexport interface TrackToggleProps<T extends ToggleSource>\n extends Omit<React.ButtonHTMLAttributes<HTMLButtonElement>, 'onChange'> {\n source: T;\n showIcon?: boolean;\n initialState?: boolean;\n /**\n * Function that is called when the enabled state of the toggle changes.\n * The second function argument `isUserInitiated` is `true` if the change was initiated by a user interaction, such as a click.\n */\n onChange?: (enabled: boolean, isUserInitiated: boolean) => void;\n captureOptions?: CaptureOptionsBySource<T>;\n publishOptions?: TrackPublishOptions;\n onDeviceError?: (error: Error) => void;\n}\n\n/**\n * With the `TrackToggle` component it is possible to mute and unmute your camera and microphone.\n * The component uses an html button element under the hood so you can treat it like a button.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <TrackToggle source={Track.Source.Microphone} />\n * <TrackToggle source={Track.Source.Camera} />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport const TrackToggle: <T extends ToggleSource>(\n props: TrackToggleProps<T> & React.RefAttributes<HTMLButtonElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef(function TrackToggle<\n T extends ToggleSource,\n>({ showIcon, ...props }: TrackToggleProps<T>, ref: React.ForwardedRef<HTMLButtonElement>) {\n const { buttonProps, enabled } = useTrackToggle(props);\n const [isClient, setIsClient] = React.useState(false);\n React.useEffect(() => {\n setIsClient(true);\n }, []);\n return (\n isClient && (\n <button ref={ref} {...buttonProps}>\n {(showIcon ?? true) && getSourceIcon(props.source, enabled)}\n {props.children}\n </button>\n )\n );\n});\n","import * as React from 'react';\nimport { mergeProps } from '../../utils';\nimport { getConnectionQualityIcon } from '../../assets/icons/util';\nimport type { ConnectionQualityIndicatorOptions } from '../../hooks';\nimport { useConnectionQualityIndicator } from '../../hooks';\n\n/** @public */\nexport interface ConnectionQualityIndicatorProps\n extends React.HTMLAttributes<HTMLDivElement>,\n ConnectionQualityIndicatorOptions {}\n\n/**\n * The `ConnectionQualityIndicator` shows the individual connection quality of a participant.\n *\n * @example\n * ```tsx\n * <ConnectionQualityIndicator />\n * ```\n * @public\n */\nexport const ConnectionQualityIndicator: (\n props: ConnectionQualityIndicatorProps & React.RefAttributes<HTMLDivElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<\n HTMLDivElement,\n ConnectionQualityIndicatorProps\n>(function ConnectionQualityIndicator(props: ConnectionQualityIndicatorProps, ref) {\n const { className, quality } = useConnectionQualityIndicator(props);\n const elementProps = React.useMemo(() => {\n return { ...mergeProps(props, { className: className as string }), 'data-lk-quality': quality };\n }, [quality, props, className]);\n return (\n <div ref={ref} {...elementProps}>\n {props.children ?? getConnectionQualityIcon(quality)}\n </div>\n );\n});\n","import { setupParticipantName } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useEnsureParticipant } from '../../context';\nimport { useObservableState } from '../../hooks/internal/useObservableState';\nimport { mergeProps } from '../../utils';\nimport type { UseParticipantInfoOptions } from '../../hooks';\n\n/** @public */\nexport interface ParticipantNameProps\n extends React.HTMLAttributes<HTMLSpanElement>,\n UseParticipantInfoOptions {}\n\n/**\n * The `ParticipantName` component displays the name of the participant as a string within an HTML span element.\n * If no participant name is undefined the participant identity string is displayed.\n *\n * @example\n * ```tsx\n * <ParticipantName />\n * ```\n * @public\n */\nexport const ParticipantName: (\n props: ParticipantNameProps & React.RefAttributes<HTMLSpanElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLSpanElement, ParticipantNameProps>(\n function ParticipantName({ participant, ...props }: ParticipantNameProps, ref) {\n const p = useEnsureParticipant(participant);\n\n const { className, infoObserver } = React.useMemo(() => {\n return setupParticipantName(p);\n }, [p]);\n\n const { identity, name } = useObservableState(infoObserver, {\n name: p.name,\n identity: p.identity,\n metadata: p.metadata,\n });\n\n const mergedProps = React.useMemo(() => {\n return mergeProps(props, { className, 'data-lk-participant-name': name });\n }, [props, className, name]);\n\n return (\n <span ref={ref} {...mergedProps}>\n {name !== '' ? name : identity}\n {props.children}\n </span>\n );\n },\n);\n","import * as React from 'react';\nimport { mergeProps } from '../../utils';\nimport { getSourceIcon } from '../../assets/icons/util';\nimport { useTrackMutedIndicator } from '../../hooks';\nimport type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\n\n/** @public */\nexport interface TrackMutedIndicatorProps extends React.HTMLAttributes<HTMLDivElement> {\n trackRef: TrackReferenceOrPlaceholder;\n show?: 'always' | 'muted' | 'unmuted';\n}\n\n/**\n * The `TrackMutedIndicator` shows whether the participant's camera or microphone is muted or not.\n * By default, a muted/unmuted icon is displayed for a camera, microphone, and screen sharing track.\n *\n * @example\n * ```tsx\n * <TrackMutedIndicator trackRef={trackRef} />\n * ```\n * @public\n */\nexport const TrackMutedIndicator: (\n props: TrackMutedIndicatorProps & React.RefAttributes<HTMLDivElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLDivElement, TrackMutedIndicatorProps>(\n function TrackMutedIndicator(\n { trackRef, show = 'always', ...props }: TrackMutedIndicatorProps,\n ref,\n ) {\n const { className, isMuted } = useTrackMutedIndicator(trackRef);\n\n const showIndicator =\n show === 'always' || (show === 'muted' && isMuted) || (show === 'unmuted' && !isMuted);\n\n const htmlProps = React.useMemo(\n () =>\n mergeProps(props, {\n className,\n }),\n [className, props],\n );\n\n if (!showIndicator) {\n return null;\n }\n\n return (\n <div ref={ref} {...htmlProps} data-lk-muted={isMuted}>\n {props.children ?? getSourceIcon(trackRef.source, !isMuted)}\n </div>\n );\n },\n);\n","/**\n * WARNING: This file was auto-generated by svgr. Do not edit.\n */\nimport * as React from 'react';\nimport type { SVGProps } from 'react';\n/**\n * @internal\n */\nconst SvgParticipantPlaceholder = (props: SVGProps<SVGSVGElement>) => (\n <svg\n width={320}\n height={320}\n viewBox=\"0 0 320 320\"\n preserveAspectRatio=\"xMidYMid meet\"\n fill=\"none\"\n xmlns=\"http://www.w3.org/2000/svg\"\n {...props}\n >\n <path\n d=\"M160 180C204.182 180 240 144.183 240 100C240 55.8172 204.182 20 160 20C115.817 20 79.9997 55.8172 79.9997 100C79.9997 144.183 115.817 180 160 180Z\"\n fill=\"white\"\n fillOpacity={0.25}\n />\n <path\n d=\"M97.6542 194.614C103.267 191.818 109.841 192.481 115.519 195.141C129.025 201.466 144.1 205 159.999 205C175.899 205 190.973 201.466 204.48 195.141C210.158 192.481 216.732 191.818 222.345 194.614C262.703 214.719 291.985 253.736 298.591 300.062C300.15 310.997 291.045 320 280 320H39.9997C28.954 320 19.8495 310.997 21.4087 300.062C28.014 253.736 57.2966 214.72 97.6542 194.614Z\"\n fill=\"white\"\n fillOpacity={0.25}\n />\n </svg>\n);\nexport default SvgParticipantPlaceholder;\n","import type { TrackIdentifier } from '@livekit/components-core';\nimport {\n getTrackByIdentifier,\n isTrackReference,\n log,\n setupMediaTrack,\n} from '@livekit/components-core';\nimport * as React from 'react';\nimport { mergeProps } from '../utils';\n\n/** @public */\nexport interface UseMediaTrackOptions {\n element?: React.RefObject<HTMLMediaElement> | null;\n props?: React.HTMLAttributes<HTMLVideoElement | HTMLAudioElement>;\n}\n\n/**\n * @internal\n */\nexport function useMediaTrackBySourceOrName(\n observerOptions: TrackIdentifier,\n options: UseMediaTrackOptions = {},\n) {\n const [publication, setPublication] = React.useState(getTrackByIdentifier(observerOptions));\n\n const [isMuted, setMuted] = React.useState(publication?.isMuted);\n const [isSubscribed, setSubscribed] = React.useState(publication?.isSubscribed);\n\n const [track, setTrack] = React.useState(publication?.track);\n const [orientation, setOrientation] = React.useState<'landscape' | 'portrait'>('landscape');\n const previousElement = React.useRef<HTMLMediaElement | undefined | null>();\n\n const { className, trackObserver } = React.useMemo(() => {\n return setupMediaTrack(observerOptions);\n }, [\n observerOptions.participant.sid ?? observerOptions.participant.identity,\n observerOptions.source,\n isTrackReference(observerOptions) && observerOptions.publication.trackSid,\n ]);\n\n React.useEffect(() => {\n const subscription = trackObserver.subscribe((publication) => {\n log.debug('update track', publication);\n setPublication(publication);\n setMuted(publication?.isMuted);\n setSubscribed(publication?.isSubscribed);\n setTrack(publication?.track);\n });\n return () => subscription?.unsubscribe();\n }, [trackObserver]);\n\n React.useEffect(() => {\n if (track) {\n if (previousElement.current) {\n track.detach(previousElement.current);\n }\n if (\n options.element?.current &&\n !(observerOptions.participant.isLocal && track?.kind === 'audio')\n ) {\n track.attach(options.element.current);\n }\n }\n previousElement.current = options.element?.current;\n return () => {\n if (previousElement.current) {\n track?.detach(previousElement.current);\n }\n };\n }, [track, options.element]);\n\n React.useEffect(() => {\n // Set the orientation of the video track.\n // TODO: This does not handle changes in orientation after a track got published (e.g when rotating a phone camera from portrait to landscape).\n if (\n typeof publication?.dimensions?.width === 'number' &&\n typeof publication?.dimensions?.height === 'number'\n ) {\n const orientation_ =\n publication.dimensions.width > publication.dimensions.height ? 'landscape' : 'portrait';\n setOrientation(orientation_);\n }\n }, [publication]);\n\n return {\n publication,\n isMuted,\n isSubscribed,\n track,\n elementProps: mergeProps(options.props, {\n className,\n 'data-lk-local-participant': observerOptions.participant.isLocal,\n 'data-lk-source': publication?.source,\n ...(publication?.kind === 'video' && { 'data-lk-orientation': orientation }),\n }),\n };\n}\n","/**\n * lodash (Custom Build) <https://lodash.com/>\n * Build: `lodash modularize exports=\"npm\" -o ./`\n * Copyright jQuery Foundation and other contributors <https://jquery.org/>\n * Released under MIT license <https://lodash.com/license>\n * Based on Underscore.js 1.8.3 <http://underscorejs.org/LICENSE>\n * Copyright Jeremy Ashkenas, DocumentCloud and Investigative Reporters & Editors\n */\n\n/** Used as the `TypeError` message for \"Functions\" methods. */\nvar FUNC_ERROR_TEXT = 'Expected a function';\n\n/** Used as references for various `Number` constants. */\nvar NAN = 0 / 0;\n\n/** `Object#toString` result references. */\nvar symbolTag = '[object Symbol]';\n\n/** Used to match leading and trailing whitespace. */\nvar reTrim = /^\\s+|\\s+$/g;\n\n/** Used to detect bad signed hexadecimal string values. */\nvar reIsBadHex = /^[-+]0x[0-9a-f]+$/i;\n\n/** Used to detect binary string values. */\nvar reIsBinary = /^0b[01]+$/i;\n\n/** Used to detect octal string values. */\nvar reIsOctal = /^0o[0-7]+$/i;\n\n/** Built-in method references without a dependency on `root`. */\nvar freeParseInt = parseInt;\n\n/** Detect free variable `global` from Node.js. */\nvar freeGlobal = typeof global == 'object' && global && global.Object === Object && global;\n\n/** Detect free variable `self`. */\nvar freeSelf = typeof self == 'object' && self && self.Object === Object && self;\n\n/** Used as a reference to the global object. */\nvar root = freeGlobal || freeSelf || Function('return this')();\n\n/** Used for built-in method references. */\nvar objectProto = Object.prototype;\n\n/**\n * Used to resolve the\n * [`toStringTag`](http://ecma-international.org/ecma-262/7.0/#sec-object.prototype.tostring)\n * of values.\n */\nvar objectToString = objectProto.toString;\n\n/* Built-in method references for those with the same name as other `lodash` methods. */\nvar nativeMax = Math.max,\n nativeMin = Math.min;\n\n/**\n * Gets the timestamp of the number of milliseconds that have elapsed since\n * the Unix epoch (1 January 1970 00:00:00 UTC).\n *\n * @static\n * @memberOf _\n * @since 2.4.0\n * @category Date\n * @returns {number} Returns the timestamp.\n * @example\n *\n * _.defer(function(stamp) {\n * console.log(_.now() - stamp);\n * }, _.now());\n * // => Logs the number of milliseconds it took for the deferred invocation.\n */\nvar now = function() {\n return root.Date.now();\n};\n\n/**\n * Creates a debounced function that delays invoking `func` until after `wait`\n * milliseconds have elapsed since the last time the debounced function was\n * invoked. The debounced function comes with a `cancel` method to cancel\n * delayed `func` invocations and a `flush` method to immediately invoke them.\n * Provide `options` to indicate whether `func` should be invoked on the\n * leading and/or trailing edge of the `wait` timeout. The `func` is invoked\n * with the last arguments provided to the debounced function. Subsequent\n * calls to the debounced function return the result of the last `func`\n * invocation.\n *\n * **Note:** If `leading` and `trailing` options are `true`, `func` is\n * invoked on the trailing edge of the timeout only if the debounced function\n * is invoked more than once during the `wait` timeout.\n *\n * If `wait` is `0` and `leading` is `false`, `func` invocation is deferred\n * until to the next tick, similar to `setTimeout` with a timeout of `0`.\n *\n * See [David Corbacho's article](https://css-tricks.com/debouncing-throttling-explained-examples/)\n * for details over the differences between `_.debounce` and `_.throttle`.\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Function\n * @param {Function} func The function to debounce.\n * @param {number} [wait=0] The number of milliseconds to delay.\n * @param {Object} [options={}] The options object.\n * @param {boolean} [options.leading=false]\n * Specify invoking on the leading edge of the timeout.\n * @param {number} [options.maxWait]\n * The maximum time `func` is allowed to be delayed before it's invoked.\n * @param {boolean} [options.trailing=true]\n * Specify invoking on the trailing edge of the timeout.\n * @returns {Function} Returns the new debounced function.\n * @example\n *\n * // Avoid costly calculations while the window size is in flux.\n * jQuery(window).on('resize', _.debounce(calculateLayout, 150));\n *\n * // Invoke `sendMail` when clicked, debouncing subsequent calls.\n * jQuery(element).on('click', _.debounce(sendMail, 300, {\n * 'leading': true,\n * 'trailing': false\n * }));\n *\n * // Ensure `batchLog` is invoked once after 1 second of debounced calls.\n * var debounced = _.debounce(batchLog, 250, { 'maxWait': 1000 });\n * var source = new EventSource('/stream');\n * jQuery(source).on('message', debounced);\n *\n * // Cancel the trailing debounced invocation.\n * jQuery(window).on('popstate', debounced.cancel);\n */\nfunction debounce(func, wait, options) {\n var lastArgs,\n lastThis,\n maxWait,\n result,\n timerId,\n lastCallTime,\n lastInvokeTime = 0,\n leading = false,\n maxing = false,\n trailing = true;\n\n if (typeof func != 'function') {\n throw new TypeError(FUNC_ERROR_TEXT);\n }\n wait = toNumber(wait) || 0;\n if (isObject(options)) {\n leading = !!options.leading;\n maxing = 'maxWait' in options;\n maxWait = maxing ? nativeMax(toNumber(options.maxWait) || 0, wait) : maxWait;\n trailing = 'trailing' in options ? !!options.trailing : trailing;\n }\n\n function invokeFunc(time) {\n var args = lastArgs,\n thisArg = lastThis;\n\n lastArgs = lastThis = undefined;\n lastInvokeTime = time;\n result = func.apply(thisArg, args);\n return result;\n }\n\n function leadingEdge(time) {\n // Reset any `maxWait` timer.\n lastInvokeTime = time;\n // Start the timer for the trailing edge.\n timerId = setTimeout(timerExpired, wait);\n // Invoke the leading edge.\n return leading ? invokeFunc(time) : result;\n }\n\n function remainingWait(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime,\n result = wait - timeSinceLastCall;\n\n return maxing ? nativeMin(result, maxWait - timeSinceLastInvoke) : result;\n }\n\n function shouldInvoke(time) {\n var timeSinceLastCall = time - lastCallTime,\n timeSinceLastInvoke = time - lastInvokeTime;\n\n // Either this is the first call, activity has stopped and we're at the\n // trailing edge, the system time has gone backwards and we're treating\n // it as the trailing edge, or we've hit the `maxWait` limit.\n return (lastCallTime === undefined || (timeSinceLastCall >= wait) ||\n (timeSinceLastCall < 0) || (maxing && timeSinceLastInvoke >= maxWait));\n }\n\n function timerExpired() {\n var time = now();\n if (shouldInvoke(time)) {\n return trailingEdge(time);\n }\n // Restart the timer.\n timerId = setTimeout(timerExpired, remainingWait(time));\n }\n\n function trailingEdge(time) {\n timerId = undefined;\n\n // Only invoke if we have `lastArgs` which means `func` has been\n // debounced at least once.\n if (trailing && lastArgs) {\n return invokeFunc(time);\n }\n lastArgs = lastThis = undefined;\n return result;\n }\n\n function cancel() {\n if (timerId !== undefined) {\n clearTimeout(timerId);\n }\n lastInvokeTime = 0;\n lastArgs = lastCallTime = lastThis = timerId = undefined;\n }\n\n function flush() {\n return timerId === undefined ? result : trailingEdge(now());\n }\n\n function debounced() {\n var time = now(),\n isInvoking = shouldInvoke(time);\n\n lastArgs = arguments;\n lastThis = this;\n lastCallTime = time;\n\n if (isInvoking) {\n if (timerId === undefined) {\n return leadingEdge(lastCallTime);\n }\n if (maxing) {\n // Handle invocations in a tight loop.\n timerId = setTimeout(timerExpired, wait);\n return invokeFunc(lastCallTime);\n }\n }\n if (timerId === undefined) {\n timerId = setTimeout(timerExpired, wait);\n }\n return result;\n }\n debounced.cancel = cancel;\n debounced.flush = flush;\n return debounced;\n}\n\n/**\n * Checks if `value` is the\n * [language type](http://www.ecma-international.org/ecma-262/7.0/#sec-ecmascript-language-types)\n * of `Object`. (e.g. arrays, functions, objects, regexes, `new Number(0)`, and `new String('')`)\n *\n * @static\n * @memberOf _\n * @since 0.1.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is an object, else `false`.\n * @example\n *\n * _.isObject({});\n * // => true\n *\n * _.isObject([1, 2, 3]);\n * // => true\n *\n * _.isObject(_.noop);\n * // => true\n *\n * _.isObject(null);\n * // => false\n */\nfunction isObject(value) {\n var type = typeof value;\n return !!value && (type == 'object' || type == 'function');\n}\n\n/**\n * Checks if `value` is object-like. A value is object-like if it's not `null`\n * and has a `typeof` result of \"object\".\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is object-like, else `false`.\n * @example\n *\n * _.isObjectLike({});\n * // => true\n *\n * _.isObjectLike([1, 2, 3]);\n * // => true\n *\n * _.isObjectLike(_.noop);\n * // => false\n *\n * _.isObjectLike(null);\n * // => false\n */\nfunction isObjectLike(value) {\n return !!value && typeof value == 'object';\n}\n\n/**\n * Checks if `value` is classified as a `Symbol` primitive or object.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to check.\n * @returns {boolean} Returns `true` if `value` is a symbol, else `false`.\n * @example\n *\n * _.isSymbol(Symbol.iterator);\n * // => true\n *\n * _.isSymbol('abc');\n * // => false\n */\nfunction isSymbol(value) {\n return typeof value == 'symbol' ||\n (isObjectLike(value) && objectToString.call(value) == symbolTag);\n}\n\n/**\n * Converts `value` to a number.\n *\n * @static\n * @memberOf _\n * @since 4.0.0\n * @category Lang\n * @param {*} value The value to process.\n * @returns {number} Returns the number.\n * @example\n *\n * _.toNumber(3.2);\n * // => 3.2\n *\n * _.toNumber(Number.MIN_VALUE);\n * // => 5e-324\n *\n * _.toNumber(Infinity);\n * // => Infinity\n *\n * _.toNumber('3.2');\n * // => 3.2\n */\nfunction toNumber(value) {\n if (typeof value == 'number') {\n return value;\n }\n if (isSymbol(value)) {\n return NAN;\n }\n if (isObject(value)) {\n var other = typeof value.valueOf == 'function' ? value.valueOf() : value;\n value = isObject(other) ? (other + '') : other;\n }\n if (typeof value != 'string') {\n return value === 0 ? value : +value;\n }\n value = value.replace(reTrim, '');\n var isBinary = reIsBinary.test(value);\n return (isBinary || reIsOctal.test(value))\n ? freeParseInt(value.slice(2), isBinary ? 2 : 8)\n : (reIsBadHex.test(value) ? NAN : +value);\n}\n\nmodule.exports = debounce;\n","import { useState, useCallback, useLayoutEffect, useEffect, useRef, useMemo } from 'react';\nimport debounce from 'lodash.debounce';\n\n// src/useBoolean/useBoolean.ts\nfunction useBoolean(defaultValue = false) {\n if (typeof defaultValue !== \"boolean\") {\n throw new Error(\"defaultValue must be `true` or `false`\");\n }\n const [value, setValue] = useState(defaultValue);\n const setTrue = useCallback(() => {\n setValue(true);\n }, []);\n const setFalse = useCallback(() => {\n setValue(false);\n }, []);\n const toggle = useCallback(() => {\n setValue((x) => !x);\n }, []);\n return { value, setValue, setTrue, setFalse, toggle };\n}\nvar useIsomorphicLayoutEffect = typeof window !== \"undefined\" ? useLayoutEffect : useEffect;\n\n// src/useEventListener/useEventListener.ts\nfunction useEventListener(eventName, handler, element, options) {\n const savedHandler = useRef(handler);\n useIsomorphicLayoutEffect(() => {\n savedHandler.current = handler;\n }, [handler]);\n useEffect(() => {\n const targetElement = (element == null ? void 0 : element.current) ?? window;\n if (!(targetElement && targetElement.addEventListener))\n return;\n const listener = (event) => {\n savedHandler.current(event);\n };\n targetElement.addEventListener(eventName, listener, options);\n return () => {\n targetElement.removeEventListener(eventName, listener, options);\n };\n }, [eventName, element, options]);\n}\n\n// src/useClickAnyWhere/useClickAnyWhere.ts\nfunction useClickAnyWhere(handler) {\n useEventListener(\"click\", (event) => {\n handler(event);\n });\n}\nfunction useCopyToClipboard() {\n const [copiedText, setCopiedText] = useState(null);\n const copy = useCallback(async (text) => {\n if (!(navigator == null ? void 0 : navigator.clipboard)) {\n console.warn(\"Clipboard not supported\");\n return false;\n }\n try {\n await navigator.clipboard.writeText(text);\n setCopiedText(text);\n return true;\n } catch (error) {\n console.warn(\"Copy failed\", error);\n setCopiedText(null);\n return false;\n }\n }, []);\n return [copiedText, copy];\n}\nfunction useCounter(initialValue) {\n const [count, setCount] = useState(initialValue ?? 0);\n const increment = useCallback(() => {\n setCount((x) => x + 1);\n }, []);\n const decrement = useCallback(() => {\n setCount((x) => x - 1);\n }, []);\n const reset = useCallback(() => {\n setCount(initialValue ?? 0);\n }, [initialValue]);\n return {\n count,\n increment,\n decrement,\n reset,\n setCount\n };\n}\nfunction useInterval(callback, delay) {\n const savedCallback = useRef(callback);\n useIsomorphicLayoutEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n useEffect(() => {\n if (delay === null) {\n return;\n }\n const id = setInterval(() => {\n savedCallback.current();\n }, delay);\n return () => {\n clearInterval(id);\n };\n }, [delay]);\n}\n\n// src/useCountdown/useCountdown.ts\nfunction useCountdown({\n countStart,\n countStop = 0,\n intervalMs = 1e3,\n isIncrement = false\n}) {\n const {\n count,\n increment,\n decrement,\n reset: resetCounter\n } = useCounter(countStart);\n const {\n value: isCountdownRunning,\n setTrue: startCountdown,\n setFalse: stopCountdown\n } = useBoolean(false);\n const resetCountdown = useCallback(() => {\n stopCountdown();\n resetCounter();\n }, [stopCountdown, resetCounter]);\n const countdownCallback = useCallback(() => {\n if (count === countStop) {\n stopCountdown();\n return;\n }\n if (isIncrement) {\n increment();\n } else {\n decrement();\n }\n }, [count, countStop, decrement, increment, isIncrement, stopCountdown]);\n useInterval(countdownCallback, isCountdownRunning ? intervalMs : null);\n return [count, { startCountdown, stopCountdown, resetCountdown }];\n}\nfunction useEventCallback(fn) {\n const ref = useRef(() => {\n throw new Error(\"Cannot call an event handler while rendering.\");\n });\n useIsomorphicLayoutEffect(() => {\n ref.current = fn;\n }, [fn]);\n return useCallback((...args) => {\n var _a;\n return (_a = ref.current) == null ? void 0 : _a.call(ref, ...args);\n }, [ref]);\n}\n\n// src/useLocalStorage/useLocalStorage.ts\nvar IS_SERVER = typeof window === \"undefined\";\nfunction useLocalStorage(key, initialValue, options = {}) {\n const { initializeWithValue = true } = options;\n const serializer = useCallback(\n (value) => {\n if (options.serializer) {\n return options.serializer(value);\n }\n return JSON.stringify(value);\n },\n [options]\n );\n const deserializer = useCallback(\n (value) => {\n if (options.deserializer) {\n return options.deserializer(value);\n }\n if (value === \"undefined\") {\n return void 0;\n }\n const defaultValue = initialValue instanceof Function ? initialValue() : initialValue;\n let parsed;\n try {\n parsed = JSON.parse(value);\n } catch (error) {\n console.error(\"Error parsing JSON:\", error);\n return defaultValue;\n }\n return parsed;\n },\n [options, initialValue]\n );\n const readValue = useCallback(() => {\n const initialValueToUse = initialValue instanceof Function ? initialValue() : initialValue;\n if (IS_SERVER) {\n return initialValueToUse;\n }\n try {\n const raw = window.localStorage.getItem(key);\n return raw ? deserializer(raw) : initialValueToUse;\n } catch (error) {\n console.warn(`Error reading localStorage key \\u201C${key}\\u201D:`, error);\n return initialValueToUse;\n }\n }, [initialValue, key, deserializer]);\n const [storedValue, setStoredValue] = useState(() => {\n if (initializeWithValue) {\n return readValue();\n }\n return initialValue instanceof Function ? initialValue() : initialValue;\n });\n const setValue = useEventCallback((value) => {\n if (IS_SERVER) {\n console.warn(\n `Tried setting localStorage key \\u201C${key}\\u201D even though environment is not a client`\n );\n }\n try {\n const newValue = value instanceof Function ? value(readValue()) : value;\n window.localStorage.setItem(key, serializer(newValue));\n setStoredValue(newValue);\n window.dispatchEvent(new StorageEvent(\"local-storage\", { key }));\n } catch (error) {\n console.warn(`Error setting localStorage key \\u201C${key}\\u201D:`, error);\n }\n });\n const removeValue = useEventCallback(() => {\n if (IS_SERVER) {\n console.warn(\n `Tried removing localStorage key \\u201C${key}\\u201D even though environment is not a client`\n );\n }\n const defaultValue = initialValue instanceof Function ? initialValue() : initialValue;\n window.localStorage.removeItem(key);\n setStoredValue(defaultValue);\n window.dispatchEvent(new StorageEvent(\"local-storage\", { key }));\n });\n useEffect(() => {\n setStoredValue(readValue());\n }, [key]);\n const handleStorageChange = useCallback(\n (event) => {\n if (event.key && event.key !== key) {\n return;\n }\n setStoredValue(readValue());\n },\n [key, readValue]\n );\n useEventListener(\"storage\", handleStorageChange);\n useEventListener(\"local-storage\", handleStorageChange);\n return [storedValue, setValue, removeValue];\n}\nvar IS_SERVER2 = typeof window === \"undefined\";\nfunction useMediaQuery(query, {\n defaultValue = false,\n initializeWithValue = true\n} = {}) {\n const getMatches = (query2) => {\n if (IS_SERVER2) {\n return defaultValue;\n }\n return window.matchMedia(query2).matches;\n };\n const [matches, setMatches] = useState(() => {\n if (initializeWithValue) {\n return getMatches(query);\n }\n return defaultValue;\n });\n function handleChange() {\n setMatches(getMatches(query));\n }\n useIsomorphicLayoutEffect(() => {\n const matchMedia = window.matchMedia(query);\n handleChange();\n if (matchMedia.addListener) {\n matchMedia.addListener(handleChange);\n } else {\n matchMedia.addEventListener(\"change\", handleChange);\n }\n return () => {\n if (matchMedia.removeListener) {\n matchMedia.removeListener(handleChange);\n } else {\n matchMedia.removeEventListener(\"change\", handleChange);\n }\n };\n }, [query]);\n return matches;\n}\n\n// src/useDarkMode/useDarkMode.ts\nvar COLOR_SCHEME_QUERY = \"(prefers-color-scheme: dark)\";\nvar LOCAL_STORAGE_KEY = \"usehooks-ts-dark-mode\";\nfunction useDarkMode(options = {}) {\n const {\n defaultValue,\n localStorageKey = LOCAL_STORAGE_KEY,\n initializeWithValue = true\n } = options;\n const isDarkOS = useMediaQuery(COLOR_SCHEME_QUERY, {\n initializeWithValue,\n defaultValue\n });\n const [isDarkMode, setDarkMode] = useLocalStorage(\n localStorageKey,\n defaultValue ?? isDarkOS ?? false,\n { initializeWithValue }\n );\n useIsomorphicLayoutEffect(() => {\n if (isDarkOS !== isDarkMode) {\n setDarkMode(isDarkOS);\n }\n }, [isDarkOS]);\n return {\n isDarkMode,\n toggle: () => {\n setDarkMode((prev) => !prev);\n },\n enable: () => {\n setDarkMode(true);\n },\n disable: () => {\n setDarkMode(false);\n },\n set: (value) => {\n setDarkMode(value);\n }\n };\n}\nfunction useUnmount(func) {\n const funcRef = useRef(func);\n funcRef.current = func;\n useEffect(\n () => () => {\n funcRef.current();\n },\n []\n );\n}\n\n// src/useDebounceCallback/useDebounceCallback.ts\nfunction useDebounceCallback(func, delay = 500, options) {\n const debouncedFunc = useRef();\n useUnmount(() => {\n if (debouncedFunc.current) {\n debouncedFunc.current.cancel();\n }\n });\n const debounced = useMemo(() => {\n const debouncedFuncInstance = debounce(func, delay, options);\n const wrappedFunc = (...args) => {\n return debouncedFuncInstance(...args);\n };\n wrappedFunc.cancel = () => {\n debouncedFuncInstance.cancel();\n };\n wrappedFunc.isPending = () => {\n return !!debouncedFunc.current;\n };\n wrappedFunc.flush = () => {\n return debouncedFuncInstance.flush();\n };\n return wrappedFunc;\n }, [func, delay, options]);\n useEffect(() => {\n debouncedFunc.current = debounce(func, delay, options);\n }, [func, delay, options]);\n return debounced;\n}\nfunction useDebounceValue(initialValue, delay, options) {\n const eq = (options == null ? void 0 : options.equalityFn) ?? ((left, right) => left === right);\n const unwrappedInitialValue = initialValue instanceof Function ? initialValue() : initialValue;\n const [debouncedValue, setDebouncedValue] = useState(unwrappedInitialValue);\n const previousValueRef = useRef(unwrappedInitialValue);\n const updateDebouncedValue = useDebounceCallback(\n setDebouncedValue,\n delay,\n options\n );\n if (!eq(previousValueRef.current, unwrappedInitialValue)) {\n updateDebouncedValue(unwrappedInitialValue);\n previousValueRef.current = unwrappedInitialValue;\n }\n return [debouncedValue, updateDebouncedValue];\n}\nfunction useDocumentTitle(title, options = {}) {\n const { preserveTitleOnUnmount = true } = options;\n const defaultTitle = useRef(null);\n useIsomorphicLayoutEffect(() => {\n defaultTitle.current = window.document.title;\n }, []);\n useIsomorphicLayoutEffect(() => {\n window.document.title = title;\n }, [title]);\n useUnmount(() => {\n if (!preserveTitleOnUnmount && defaultTitle.current) {\n window.document.title = defaultTitle.current;\n }\n });\n}\nfunction useHover(elementRef) {\n const [value, setValue] = useState(false);\n const handleMouseEnter = () => {\n setValue(true);\n };\n const handleMouseLeave = () => {\n setValue(false);\n };\n useEventListener(\"mouseenter\", handleMouseEnter, elementRef);\n useEventListener(\"mouseleave\", handleMouseLeave, elementRef);\n return value;\n}\nfunction useIntersectionObserver({\n threshold = 0,\n root = null,\n rootMargin = \"0%\",\n freezeOnceVisible = false,\n initialIsIntersecting = false,\n onChange\n} = {}) {\n var _a;\n const [ref, setRef] = useState(null);\n const [state, setState] = useState(() => ({\n isIntersecting: initialIsIntersecting,\n entry: void 0\n }));\n const callbackRef = useRef();\n callbackRef.current = onChange;\n const frozen = ((_a = state.entry) == null ? void 0 : _a.isIntersecting) && freezeOnceVisible;\n useEffect(() => {\n if (!ref)\n return;\n if (!(\"IntersectionObserver\" in window))\n return;\n if (frozen)\n return;\n let unobserve;\n const observer = new IntersectionObserver(\n (entries) => {\n const thresholds = Array.isArray(observer.thresholds) ? observer.thresholds : [observer.thresholds];\n entries.forEach((entry) => {\n const isIntersecting = entry.isIntersecting && thresholds.some((threshold2) => entry.intersectionRatio >= threshold2);\n setState({ isIntersecting, entry });\n if (callbackRef.current) {\n callbackRef.current(isIntersecting, entry);\n }\n if (isIntersecting && freezeOnceVisible && unobserve) {\n unobserve();\n unobserve = void 0;\n }\n });\n },\n { threshold, root, rootMargin }\n );\n observer.observe(ref);\n return () => {\n observer.disconnect();\n };\n }, [\n ref,\n // eslint-disable-next-line react-hooks/exhaustive-deps\n JSON.stringify(threshold),\n root,\n rootMargin,\n frozen,\n freezeOnceVisible\n ]);\n const prevRef = useRef(null);\n useEffect(() => {\n var _a2;\n if (!ref && ((_a2 = state.entry) == null ? void 0 : _a2.target) && !freezeOnceVisible && !frozen && prevRef.current !== state.entry.target) {\n prevRef.current = state.entry.target;\n setState({ isIntersecting: initialIsIntersecting, entry: void 0 });\n }\n }, [ref, state.entry, freezeOnceVisible, frozen, initialIsIntersecting]);\n const result = [\n setRef,\n !!state.isIntersecting,\n state.entry\n ];\n result.ref = result[0];\n result.isIntersecting = result[1];\n result.entry = result[2];\n return result;\n}\nfunction useIsClient() {\n const [isClient, setClient] = useState(false);\n useEffect(() => {\n setClient(true);\n }, []);\n return isClient;\n}\nfunction useIsMounted() {\n const isMounted = useRef(false);\n useEffect(() => {\n isMounted.current = true;\n return () => {\n isMounted.current = false;\n };\n }, []);\n return useCallback(() => isMounted.current, []);\n}\nfunction useMap(initialState = /* @__PURE__ */ new Map()) {\n const [map, setMap] = useState(new Map(initialState));\n const actions = {\n set: useCallback((key, value) => {\n setMap((prev) => {\n const copy = new Map(prev);\n copy.set(key, value);\n return copy;\n });\n }, []),\n setAll: useCallback((entries) => {\n setMap(() => new Map(entries));\n }, []),\n remove: useCallback((key) => {\n setMap((prev) => {\n const copy = new Map(prev);\n copy.delete(key);\n return copy;\n });\n }, []),\n reset: useCallback(() => {\n setMap(() => /* @__PURE__ */ new Map());\n }, [])\n };\n return [map, actions];\n}\n\n// src/useOnClickOutside/useOnClickOutside.ts\nfunction useOnClickOutside(ref, handler, eventType = \"mousedown\", eventListenerOptions = {}) {\n useEventListener(\n eventType,\n (event) => {\n const target = event.target;\n if (!target || !target.isConnected) {\n return;\n }\n const isOutside = Array.isArray(ref) ? ref.filter((r) => Boolean(r.current)).every((r) => r.current && !r.current.contains(target)) : ref.current && !ref.current.contains(target);\n if (isOutside) {\n handler(event);\n }\n },\n void 0,\n eventListenerOptions\n );\n}\nvar IS_SERVER3 = typeof window === \"undefined\";\nfunction useReadLocalStorage(key, options = {}) {\n let { initializeWithValue = true } = options;\n if (IS_SERVER3) {\n initializeWithValue = false;\n }\n const deserializer = useCallback(\n (value) => {\n if (options.deserializer) {\n return options.deserializer(value);\n }\n if (value === \"undefined\") {\n return void 0;\n }\n let parsed;\n try {\n parsed = JSON.parse(value);\n } catch (error) {\n console.error(\"Error parsing JSON:\", error);\n return null;\n }\n return parsed;\n },\n [options]\n );\n const readValue = useCallback(() => {\n if (IS_SERVER3) {\n return null;\n }\n try {\n const raw = window.localStorage.getItem(key);\n return raw ? deserializer(raw) : null;\n } catch (error) {\n console.warn(`Error reading localStorage key \\u201C${key}\\u201D:`, error);\n return null;\n }\n }, [key, deserializer]);\n const [storedValue, setStoredValue] = useState(() => {\n if (initializeWithValue) {\n return readValue();\n }\n return void 0;\n });\n useEffect(() => {\n setStoredValue(readValue());\n }, [key]);\n const handleStorageChange = useCallback(\n (event) => {\n if (event.key && event.key !== key) {\n return;\n }\n setStoredValue(readValue());\n },\n [key, readValue]\n );\n useEventListener(\"storage\", handleStorageChange);\n useEventListener(\"local-storage\", handleStorageChange);\n return storedValue;\n}\nvar initialSize = {\n width: void 0,\n height: void 0\n};\nfunction useResizeObserver(options) {\n const { ref, box = \"content-box\" } = options;\n const [{ width, height }, setSize] = useState(initialSize);\n const isMounted = useIsMounted();\n const previousSize = useRef({ ...initialSize });\n const onResize = useRef(void 0);\n onResize.current = options.onResize;\n useEffect(() => {\n if (!ref.current)\n return;\n if (typeof window === \"undefined\" || !(\"ResizeObserver\" in window))\n return;\n const observer = new ResizeObserver(([entry]) => {\n const boxProp = box === \"border-box\" ? \"borderBoxSize\" : box === \"device-pixel-content-box\" ? \"devicePixelContentBoxSize\" : \"contentBoxSize\";\n const newWidth = extractSize(entry, boxProp, \"inlineSize\");\n const newHeight = extractSize(entry, boxProp, \"blockSize\");\n const hasChanged = previousSize.current.width !== newWidth || previousSize.current.height !== newHeight;\n if (hasChanged) {\n const newSize = { width: newWidth, height: newHeight };\n previousSize.current.width = newWidth;\n previousSize.current.height = newHeight;\n if (onResize.current) {\n onResize.current(newSize);\n } else {\n if (isMounted()) {\n setSize(newSize);\n }\n }\n }\n });\n observer.observe(ref.current, { box });\n return () => {\n observer.disconnect();\n };\n }, [box, ref, isMounted]);\n return { width, height };\n}\nfunction extractSize(entry, box, sizeType) {\n if (!entry[box]) {\n if (box === \"contentBoxSize\") {\n return entry.contentRect[sizeType === \"inlineSize\" ? \"width\" : \"height\"];\n }\n return void 0;\n }\n return Array.isArray(entry[box]) ? entry[box][0][sizeType] : (\n // @ts-ignore Support Firefox's non-standard behavior\n entry[box][sizeType]\n );\n}\nvar IS_SERVER4 = typeof window === \"undefined\";\nfunction useScreen(options = {}) {\n let { initializeWithValue = true } = options;\n if (IS_SERVER4) {\n initializeWithValue = false;\n }\n const readScreen = () => {\n if (IS_SERVER4) {\n return void 0;\n }\n return window.screen;\n };\n const [screen, setScreen] = useState(() => {\n if (initializeWithValue) {\n return readScreen();\n }\n return void 0;\n });\n const debouncedSetScreen = useDebounceCallback(\n setScreen,\n options.debounceDelay\n );\n function handleSize() {\n const newScreen = readScreen();\n const setSize = options.debounceDelay ? debouncedSetScreen : setScreen;\n if (newScreen) {\n const {\n width,\n height,\n availHeight,\n availWidth,\n colorDepth,\n orientation,\n pixelDepth\n } = newScreen;\n setSize({\n width,\n height,\n availHeight,\n availWidth,\n colorDepth,\n orientation,\n pixelDepth\n });\n }\n }\n useEventListener(\"resize\", handleSize);\n useIsomorphicLayoutEffect(() => {\n handleSize();\n }, []);\n return screen;\n}\nvar cachedScriptStatuses = /* @__PURE__ */ new Map();\nfunction getScriptNode(src) {\n const node = document.querySelector(\n `script[src=\"${src}\"]`\n );\n const status = node == null ? void 0 : node.getAttribute(\"data-status\");\n return {\n node,\n status\n };\n}\nfunction useScript(src, options) {\n const [status, setStatus] = useState(() => {\n if (!src || (options == null ? void 0 : options.shouldPreventLoad)) {\n return \"idle\";\n }\n if (typeof window === \"undefined\") {\n return \"loading\";\n }\n return cachedScriptStatuses.get(src) ?? \"loading\";\n });\n useEffect(() => {\n if (!src || (options == null ? void 0 : options.shouldPreventLoad)) {\n return;\n }\n const cachedScriptStatus = cachedScriptStatuses.get(src);\n if (cachedScriptStatus === \"ready\" || cachedScriptStatus === \"error\") {\n setStatus(cachedScriptStatus);\n return;\n }\n const script = getScriptNode(src);\n let scriptNode = script.node;\n if (!scriptNode) {\n scriptNode = document.createElement(\"script\");\n scriptNode.src = src;\n scriptNode.async = true;\n if (options == null ? void 0 : options.id) {\n scriptNode.id = options.id;\n }\n scriptNode.setAttribute(\"data-status\", \"loading\");\n document.body.appendChild(scriptNode);\n const setAttributeFromEvent = (event) => {\n const scriptStatus = event.type === \"load\" ? \"ready\" : \"error\";\n scriptNode == null ? void 0 : scriptNode.setAttribute(\"data-status\", scriptStatus);\n };\n scriptNode.addEventListener(\"load\", setAttributeFromEvent);\n scriptNode.addEventListener(\"error\", setAttributeFromEvent);\n } else {\n setStatus(script.status ?? cachedScriptStatus ?? \"loading\");\n }\n const setStateFromEvent = (event) => {\n const newStatus = event.type === \"load\" ? \"ready\" : \"error\";\n setStatus(newStatus);\n cachedScriptStatuses.set(src, newStatus);\n };\n scriptNode.addEventListener(\"load\", setStateFromEvent);\n scriptNode.addEventListener(\"error\", setStateFromEvent);\n return () => {\n if (scriptNode) {\n scriptNode.removeEventListener(\"load\", setStateFromEvent);\n scriptNode.removeEventListener(\"error\", setStateFromEvent);\n }\n if (scriptNode && (options == null ? void 0 : options.removeOnUnmount)) {\n scriptNode.remove();\n cachedScriptStatuses.delete(src);\n }\n };\n }, [src, options == null ? void 0 : options.shouldPreventLoad, options == null ? void 0 : options.removeOnUnmount, options == null ? void 0 : options.id]);\n return status;\n}\nvar IS_SERVER5 = typeof window === \"undefined\";\nfunction useScrollLock(options = {}) {\n const { autoLock = true, lockTarget, widthReflow = true } = options;\n const [isLocked, setIsLocked] = useState(false);\n const target = useRef(null);\n const originalStyle = useRef(null);\n const lock = () => {\n if (target.current) {\n const { overflow, paddingRight } = target.current.style;\n originalStyle.current = { overflow, paddingRight };\n if (widthReflow) {\n const offsetWidth = target.current === document.body ? window.innerWidth : target.current.offsetWidth;\n const currentPaddingRight = parseInt(window.getComputedStyle(target.current).paddingRight, 10) || 0;\n const scrollbarWidth = offsetWidth - target.current.scrollWidth;\n target.current.style.paddingRight = `${scrollbarWidth + currentPaddingRight}px`;\n }\n target.current.style.overflow = \"hidden\";\n setIsLocked(true);\n }\n };\n const unlock = () => {\n if (target.current && originalStyle.current) {\n target.current.style.overflow = originalStyle.current.overflow;\n if (widthReflow) {\n target.current.style.paddingRight = originalStyle.current.paddingRight;\n }\n }\n setIsLocked(false);\n };\n useIsomorphicLayoutEffect(() => {\n if (IS_SERVER5)\n return;\n if (lockTarget) {\n target.current = typeof lockTarget === \"string\" ? document.querySelector(lockTarget) : lockTarget;\n }\n if (!target.current) {\n target.current = document.body;\n }\n if (autoLock) {\n lock();\n }\n return () => {\n unlock();\n };\n }, [autoLock, lockTarget, widthReflow]);\n return { isLocked, lock, unlock };\n}\nvar IS_SERVER6 = typeof window === \"undefined\";\nfunction useSessionStorage(key, initialValue, options = {}) {\n const { initializeWithValue = true } = options;\n const serializer = useCallback(\n (value) => {\n if (options.serializer) {\n return options.serializer(value);\n }\n return JSON.stringify(value);\n },\n [options]\n );\n const deserializer = useCallback(\n (value) => {\n if (options.deserializer) {\n return options.deserializer(value);\n }\n if (value === \"undefined\") {\n return void 0;\n }\n const defaultValue = initialValue instanceof Function ? initialValue() : initialValue;\n let parsed;\n try {\n parsed = JSON.parse(value);\n } catch (error) {\n console.error(\"Error parsing JSON:\", error);\n return defaultValue;\n }\n return parsed;\n },\n [options, initialValue]\n );\n const readValue = useCallback(() => {\n const initialValueToUse = initialValue instanceof Function ? initialValue() : initialValue;\n if (IS_SERVER6) {\n return initialValueToUse;\n }\n try {\n const raw = window.sessionStorage.getItem(key);\n return raw ? deserializer(raw) : initialValueToUse;\n } catch (error) {\n console.warn(`Error reading sessionStorage key \\u201C${key}\\u201D:`, error);\n return initialValueToUse;\n }\n }, [initialValue, key, deserializer]);\n const [storedValue, setStoredValue] = useState(() => {\n if (initializeWithValue) {\n return readValue();\n }\n return initialValue instanceof Function ? initialValue() : initialValue;\n });\n const setValue = useEventCallback((value) => {\n if (IS_SERVER6) {\n console.warn(\n `Tried setting sessionStorage key \\u201C${key}\\u201D even though environment is not a client`\n );\n }\n try {\n const newValue = value instanceof Function ? value(readValue()) : value;\n window.sessionStorage.setItem(key, serializer(newValue));\n setStoredValue(newValue);\n window.dispatchEvent(new StorageEvent(\"session-storage\", { key }));\n } catch (error) {\n console.warn(`Error setting sessionStorage key \\u201C${key}\\u201D:`, error);\n }\n });\n const removeValue = useEventCallback(() => {\n if (IS_SERVER6) {\n console.warn(\n `Tried removing sessionStorage key \\u201C${key}\\u201D even though environment is not a client`\n );\n }\n const defaultValue = initialValue instanceof Function ? initialValue() : initialValue;\n window.sessionStorage.removeItem(key);\n setStoredValue(defaultValue);\n window.dispatchEvent(new StorageEvent(\"session-storage\", { key }));\n });\n useEffect(() => {\n setStoredValue(readValue());\n }, [key]);\n const handleStorageChange = useCallback(\n (event) => {\n if (event.key && event.key !== key) {\n return;\n }\n setStoredValue(readValue());\n },\n [key, readValue]\n );\n useEventListener(\"storage\", handleStorageChange);\n useEventListener(\"session-storage\", handleStorageChange);\n return [storedValue, setValue, removeValue];\n}\nfunction useStep(maxStep) {\n const [currentStep, setCurrentStep] = useState(1);\n const canGoToNextStep = currentStep + 1 <= maxStep;\n const canGoToPrevStep = currentStep - 1 > 0;\n const setStep = useCallback(\n (step) => {\n const newStep = step instanceof Function ? step(currentStep) : step;\n if (newStep >= 1 && newStep <= maxStep) {\n setCurrentStep(newStep);\n return;\n }\n throw new Error(\"Step not valid\");\n },\n [maxStep, currentStep]\n );\n const goToNextStep = useCallback(() => {\n if (canGoToNextStep) {\n setCurrentStep((step) => step + 1);\n }\n }, [canGoToNextStep]);\n const goToPrevStep = useCallback(() => {\n if (canGoToPrevStep) {\n setCurrentStep((step) => step - 1);\n }\n }, [canGoToPrevStep]);\n const reset = useCallback(() => {\n setCurrentStep(1);\n }, []);\n return [\n currentStep,\n {\n goToNextStep,\n goToPrevStep,\n canGoToNextStep,\n canGoToPrevStep,\n setStep,\n reset\n }\n ];\n}\n\n// src/useTernaryDarkMode/useTernaryDarkMode.ts\nvar COLOR_SCHEME_QUERY2 = \"(prefers-color-scheme: dark)\";\nvar LOCAL_STORAGE_KEY2 = \"usehooks-ts-ternary-dark-mode\";\nfunction useTernaryDarkMode({\n defaultValue = \"system\",\n localStorageKey = LOCAL_STORAGE_KEY2,\n initializeWithValue = true\n} = {}) {\n const isDarkOS = useMediaQuery(COLOR_SCHEME_QUERY2, { initializeWithValue });\n const [mode, setMode] = useLocalStorage(localStorageKey, defaultValue, {\n initializeWithValue\n });\n const isDarkMode = mode === \"dark\" || mode === \"system\" && isDarkOS;\n const toggleTernaryDarkMode = () => {\n const modes = [\"light\", \"system\", \"dark\"];\n setMode((prevMode) => {\n const nextIndex = (modes.indexOf(prevMode) + 1) % modes.length;\n return modes[nextIndex];\n });\n };\n return {\n isDarkMode,\n ternaryDarkMode: mode,\n setTernaryDarkMode: setMode,\n toggleTernaryDarkMode\n };\n}\nfunction useTimeout(callback, delay) {\n const savedCallback = useRef(callback);\n useIsomorphicLayoutEffect(() => {\n savedCallback.current = callback;\n }, [callback]);\n useEffect(() => {\n if (!delay && delay !== 0) {\n return;\n }\n const id = setTimeout(() => {\n savedCallback.current();\n }, delay);\n return () => {\n clearTimeout(id);\n };\n }, [delay]);\n}\nfunction useToggle(defaultValue) {\n const [value, setValue] = useState(!!defaultValue);\n const toggle = useCallback(() => {\n setValue((x) => !x);\n }, []);\n return [value, toggle, setValue];\n}\nvar IS_SERVER7 = typeof window === \"undefined\";\nfunction useWindowSize(options = {}) {\n let { initializeWithValue = true } = options;\n if (IS_SERVER7) {\n initializeWithValue = false;\n }\n const [windowSize, setWindowSize] = useState(() => {\n if (initializeWithValue) {\n return {\n width: window.innerWidth,\n height: window.innerHeight\n };\n }\n return {\n width: void 0,\n height: void 0\n };\n });\n const debouncedSetWindowSize = useDebounceCallback(\n setWindowSize,\n options.debounceDelay\n );\n function handleSize() {\n const setSize = options.debounceDelay ? debouncedSetWindowSize : setWindowSize;\n setSize({\n width: window.innerWidth,\n height: window.innerHeight\n });\n }\n useEventListener(\"resize\", handleSize);\n useIsomorphicLayoutEffect(() => {\n handleSize();\n }, []);\n return windowSize;\n}\n\nexport { useBoolean, useClickAnyWhere, useCopyToClipboard, useCountdown, useCounter, useDarkMode, useDebounceCallback, useDebounceValue, useDocumentTitle, useEventCallback, useEventListener, useHover, useIntersectionObserver, useInterval, useIsClient, useIsMounted, useIsomorphicLayoutEffect, useLocalStorage, useMap, useMediaQuery, useOnClickOutside, useReadLocalStorage, useResizeObserver, useScreen, useScript, useScrollLock, useSessionStorage, useStep, useTernaryDarkMode, useTimeout, useToggle, useUnmount, useWindowSize };\n","import { RemoteTrackPublication } from 'livekit-client';\nimport * as React from 'react';\nimport { useMediaTrackBySourceOrName } from '../../hooks/useMediaTrackBySourceOrName';\nimport type { ParticipantClickEvent, TrackReference } from '@livekit/components-core';\nimport { useEnsureTrackRef } from '../../context';\nimport * as useHooks from 'usehooks-ts';\n\n/** @public */\nexport interface VideoTrackProps extends React.VideoHTMLAttributes<HTMLVideoElement> {\n /** The track reference of the track to render. */\n trackRef?: TrackReference;\n onTrackClick?: (evt: ParticipantClickEvent) => void;\n onSubscriptionStatusChanged?: (subscribed: boolean) => void;\n manageSubscription?: boolean;\n}\n\n/**\n * The `VideoTrack` component is responsible for rendering participant video tracks like `camera` and `screen_share`.\n * This component must have access to the participant's context, or alternatively pass it a `Participant` as a property.\n *\n * @example\n * ```tsx\n * <VideoTrack trackRef={trackRef} />\n * ```\n * @see {@link @livekit/components-react#ParticipantTile | ParticipantTile}\n * @public\n */\nexport const VideoTrack: (\n props: VideoTrackProps & React.RefAttributes<HTMLVideoElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLVideoElement, VideoTrackProps>(\n function VideoTrack(\n {\n onTrackClick,\n onClick,\n onSubscriptionStatusChanged,\n trackRef,\n manageSubscription,\n ...props\n }: VideoTrackProps,\n ref,\n ) {\n const trackReference = useEnsureTrackRef(trackRef);\n\n const mediaEl = React.useRef<HTMLVideoElement>(null);\n React.useImperativeHandle(ref, () => mediaEl.current as HTMLVideoElement);\n\n const intersectionEntry = useHooks.useIntersectionObserver({ root: mediaEl.current });\n\n const [debouncedIntersectionEntry] = useHooks.useDebounceValue(intersectionEntry, 3000);\n\n React.useEffect(() => {\n if (\n manageSubscription &&\n trackReference.publication instanceof RemoteTrackPublication &&\n debouncedIntersectionEntry?.isIntersecting === false &&\n intersectionEntry?.isIntersecting === false\n ) {\n trackReference.publication.setSubscribed(false);\n }\n }, [debouncedIntersectionEntry, trackReference, manageSubscription]);\n\n React.useEffect(() => {\n if (\n manageSubscription &&\n trackReference.publication instanceof RemoteTrackPublication &&\n intersectionEntry?.isIntersecting === true\n ) {\n trackReference.publication.setSubscribed(true);\n }\n }, [intersectionEntry, trackReference, manageSubscription]);\n\n const {\n elementProps,\n publication: pub,\n isSubscribed,\n } = useMediaTrackBySourceOrName(trackReference, {\n element: mediaEl,\n props,\n });\n\n React.useEffect(() => {\n onSubscriptionStatusChanged?.(!!isSubscribed);\n }, [isSubscribed, onSubscriptionStatusChanged]);\n\n const clickHandler = (evt: React.MouseEvent<HTMLVideoElement, MouseEvent>) => {\n onClick?.(evt);\n onTrackClick?.({ participant: trackReference?.participant, track: pub });\n };\n\n return <video ref={mediaEl} {...elementProps} muted={true} onClick={clickHandler}></video>;\n },\n);\n","import * as React from 'react';\nimport { useMediaTrackBySourceOrName } from '../../hooks/useMediaTrackBySourceOrName';\nimport type { TrackReference } from '@livekit/components-core';\nimport { log } from '@livekit/components-core';\nimport { RemoteAudioTrack, RemoteTrackPublication } from 'livekit-client';\nimport { useEnsureTrackRef } from '../../context';\n\n/** @public */\nexport interface AudioTrackProps extends React.AudioHTMLAttributes<HTMLAudioElement> {\n /** The track reference of the track from which the audio is to be rendered. */\n trackRef?: TrackReference;\n\n onSubscriptionStatusChanged?: (subscribed: boolean) => void;\n /** Sets the volume of the audio track. By default, the range is between `0.0` and `1.0`. */\n volume?: number;\n /**\n * Mutes the audio track if set to `true`.\n * @remarks\n * If set to `true`, the server will stop sending audio track data to the client.\n * @alpha\n */\n muted?: boolean;\n}\n\n/**\n * The AudioTrack component is responsible for rendering participant audio tracks.\n * This component must have access to the participant's context, or alternatively pass it a `Participant` as a property.\n *\n * @example\n * ```tsx\n * <ParticipantTile>\n * <AudioTrack trackRef={trackRef} />\n * </ParticipantTile>\n * ```\n *\n * @see `ParticipantTile` component\n * @public\n */\nexport const AudioTrack: (\n props: AudioTrackProps & React.RefAttributes<HTMLAudioElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLAudioElement, AudioTrackProps>(\n function AudioTrack(\n { trackRef, onSubscriptionStatusChanged, volume, ...props }: AudioTrackProps,\n ref,\n ) {\n const trackReference = useEnsureTrackRef(trackRef);\n\n const mediaEl = React.useRef<HTMLAudioElement>(null);\n React.useImperativeHandle(ref, () => mediaEl.current as HTMLAudioElement);\n\n const {\n elementProps,\n isSubscribed,\n track,\n publication: pub,\n } = useMediaTrackBySourceOrName(trackReference, {\n element: mediaEl,\n props,\n });\n\n React.useEffect(() => {\n onSubscriptionStatusChanged?.(!!isSubscribed);\n }, [isSubscribed, onSubscriptionStatusChanged]);\n\n React.useEffect(() => {\n if (track === undefined || volume === undefined) {\n return;\n }\n if (track instanceof RemoteAudioTrack) {\n track.setVolume(volume);\n } else {\n log.warn('Volume can only be set on remote audio tracks.');\n }\n }, [volume, track]);\n\n React.useEffect(() => {\n if (pub === undefined || props.muted === undefined) {\n return;\n }\n if (pub instanceof RemoteTrackPublication) {\n pub.setEnabled(!props.muted);\n } else {\n log.warn('Can only call setEnabled on remote track publications.');\n }\n }, [props.muted, pub, track]);\n\n return <audio ref={mediaEl} {...elementProps} />;\n },\n);\n","import * as React from 'react';\nimport type { Participant } from 'livekit-client';\nimport { Track } from 'livekit-client';\nimport type { ParticipantClickEvent, TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { isTrackReference, isTrackReferencePinned } from '@livekit/components-core';\nimport { ConnectionQualityIndicator } from './ConnectionQualityIndicator';\nimport { ParticipantName } from './ParticipantName';\nimport { TrackMutedIndicator } from './TrackMutedIndicator';\nimport {\n ParticipantContext,\n TrackRefContext,\n useEnsureTrackRef,\n useFeatureContext,\n useMaybeLayoutContext,\n useMaybeParticipantContext,\n useMaybeTrackRefContext,\n} from '../../context';\nimport { FocusToggle } from '../controls/FocusToggle';\nimport { ParticipantPlaceholder } from '../../assets/images';\nimport { LockLockedIcon, ScreenShareIcon } from '../../assets/icons';\nimport { VideoTrack } from './VideoTrack';\nimport { AudioTrack } from './AudioTrack';\nimport { useParticipantTile } from '../../hooks';\nimport { useIsEncrypted } from '../../hooks/useIsEncrypted';\n\n/**\n * The `ParticipantContextIfNeeded` component only creates a `ParticipantContext`\n * if there is no `ParticipantContext` already.\n * @example\n * ```tsx\n * <ParticipantContextIfNeeded participant={trackReference.participant}>\n * ...\n * </ParticipantContextIfNeeded>\n * ```\n * @public\n */\nexport function ParticipantContextIfNeeded(\n props: React.PropsWithChildren<{\n participant?: Participant;\n }>,\n) {\n const hasContext = !!useMaybeParticipantContext();\n return props.participant && !hasContext ? (\n <ParticipantContext.Provider value={props.participant}>\n {props.children}\n </ParticipantContext.Provider>\n ) : (\n <>{props.children}</>\n );\n}\n\n/**\n * Only create a `TrackRefContext` if there is no `TrackRefContext` already.\n * @internal\n */\nexport function TrackRefContextIfNeeded(\n props: React.PropsWithChildren<{\n trackRef?: TrackReferenceOrPlaceholder;\n }>,\n) {\n const hasContext = !!useMaybeTrackRefContext();\n return props.trackRef && !hasContext ? (\n <TrackRefContext.Provider value={props.trackRef}>{props.children}</TrackRefContext.Provider>\n ) : (\n <>{props.children}</>\n );\n}\n\n/** @public */\nexport interface ParticipantTileProps extends React.HTMLAttributes<HTMLDivElement> {\n /** The track reference to display. */\n trackRef?: TrackReferenceOrPlaceholder;\n disableSpeakingIndicator?: boolean;\n\n onParticipantClick?: (event: ParticipantClickEvent) => void;\n}\n\n/**\n * The `ParticipantTile` component is the base utility wrapper for displaying a visual representation of a participant.\n * This component can be used as a child of the `TrackLoop` component or by passing a track reference as property.\n *\n * @example Using the `ParticipantTile` component with a track reference:\n * ```tsx\n * <ParticipantTile trackRef={trackRef} />\n * ```\n * @example Using the `ParticipantTile` component as a child of the `TrackLoop` component:\n * ```tsx\n * <TrackLoop>\n * <ParticipantTile />\n * </TrackLoop>\n * ```\n * @public\n */\nexport const ParticipantTile: (\n props: ParticipantTileProps & React.RefAttributes<HTMLDivElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLDivElement, ParticipantTileProps>(\n function ParticipantTile(\n {\n trackRef,\n children,\n onParticipantClick,\n disableSpeakingIndicator,\n ...htmlProps\n }: ParticipantTileProps,\n ref,\n ) {\n const trackReference = useEnsureTrackRef(trackRef);\n\n const { elementProps } = useParticipantTile<HTMLDivElement>({\n htmlProps,\n disableSpeakingIndicator,\n onParticipantClick,\n trackRef: trackReference,\n });\n const isEncrypted = useIsEncrypted(trackReference.participant);\n const layoutContext = useMaybeLayoutContext();\n\n const autoManageSubscription = useFeatureContext()?.autoSubscription;\n\n const handleSubscribe = React.useCallback(\n (subscribed: boolean) => {\n if (\n trackReference.source &&\n !subscribed &&\n layoutContext &&\n layoutContext.pin.dispatch &&\n isTrackReferencePinned(trackReference, layoutContext.pin.state)\n ) {\n layoutContext.pin.dispatch({ msg: 'clear_pin' });\n }\n },\n [trackReference, layoutContext],\n );\n\n return (\n <div ref={ref} style={{ position: 'relative' }} {...elementProps}>\n <TrackRefContextIfNeeded trackRef={trackReference}>\n <ParticipantContextIfNeeded participant={trackReference.participant}>\n {children ?? (\n <>\n {isTrackReference(trackReference) &&\n (trackReference.publication?.kind === 'video' ||\n trackReference.source === Track.Source.Camera ||\n trackReference.source === Track.Source.ScreenShare) ? (\n <VideoTrack\n trackRef={trackReference}\n onSubscriptionStatusChanged={handleSubscribe}\n manageSubscription={autoManageSubscription}\n />\n ) : (\n isTrackReference(trackReference) && (\n <AudioTrack\n trackRef={trackReference}\n onSubscriptionStatusChanged={handleSubscribe}\n />\n )\n )}\n <div className=\"lk-participant-placeholder\">\n <ParticipantPlaceholder />\n </div>\n <div className=\"lk-participant-metadata\">\n <div className=\"lk-participant-metadata-item\">\n {trackReference.source === Track.Source.Camera ? (\n <>\n {isEncrypted && <LockLockedIcon style={{ marginRight: '0.25rem' }} />}\n <TrackMutedIndicator\n trackRef={{\n participant: trackReference.participant,\n source: Track.Source.Microphone,\n }}\n show={'muted'}\n ></TrackMutedIndicator>\n <ParticipantName />\n </>\n ) : (\n <>\n <ScreenShareIcon style={{ marginRight: '0.25rem' }} />\n <ParticipantName>'s screen</ParticipantName>\n </>\n )}\n </div>\n <ConnectionQualityIndicator className=\"lk-participant-metadata-item\" />\n </div>\n </>\n )}\n <FocusToggle trackRef={trackReference} />\n </ParticipantContextIfNeeded>\n </TrackRefContextIfNeeded>\n </div>\n );\n },\n);\n","import * as React from 'react';\nimport { mergeProps } from '../../utils';\nimport type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { ParticipantTile } from '../participant/ParticipantTile';\nimport type { ParticipantClickEvent } from '@livekit/components-core';\n\n/** @public */\nexport interface FocusLayoutContainerProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * The `FocusLayoutContainer` is a layout component that expects two children:\n * A small side component: In a video conference, this is usually a carousel of participants\n * who are not in focus. And a larger main component to display the focused participant.\n * For example, with the `FocusLayout` component.\n * @public\n */\nexport function FocusLayoutContainer(props: FocusLayoutContainerProps) {\n const elementProps = mergeProps(props, { className: 'lk-focus-layout' });\n\n return <div {...elementProps}>{props.children}</div>;\n}\n\n/** @public */\nexport interface FocusLayoutProps extends React.HTMLAttributes<HTMLElement> {\n /** The track to display in the focus layout. */\n trackRef?: TrackReferenceOrPlaceholder;\n\n onParticipantClick?: (evt: ParticipantClickEvent) => void;\n}\n\n/**\n * The `FocusLayout` component is just a light wrapper around the `ParticipantTile` to display a single participant.\n * @public\n */\nexport function FocusLayout({ trackRef, ...htmlProps }: FocusLayoutProps) {\n return <ParticipantTile trackRef={trackRef} {...htmlProps} />;\n}\n","import type { TrackReference, TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport * as React from 'react';\nimport { TrackRefContext } from '../context/track-reference-context';\nimport { cloneSingleChild } from '../utils';\nimport { getTrackReferenceId } from '@livekit/components-core';\n\n/** @public */\nexport interface TrackLoopProps {\n /** Track references to loop over. You can the use `useTracks()` hook to get TrackReferences. */\n tracks: TrackReference[] | TrackReferenceOrPlaceholder[];\n /** The template component to be used in the loop. */\n children: React.ReactNode;\n}\n\n/**\n * The `TrackLoop` component loops over tracks. It is for example a easy way to loop over all participant camera and screen share tracks.\n * `TrackLoop` creates a `TrackRefContext` for each track that you can use to e.g. render the track.\n *\n * @example\n * ```tsx\n * const trackRefs = useTracks([Track.Source.Camera]);\n * <TrackLoop tracks={trackRefs} >\n * <TrackRefContext.Consumer>\n * {(trackRef) => trackRef && <VideoTrack trackRef={trackRef}/>}\n * </TrackRefContext.Consumer>\n * </TrackLoop>\n * ```\n * @public\n */\nexport function TrackLoop({ tracks, ...props }: TrackLoopProps) {\n return (\n <>\n {tracks.map((trackReference) => {\n return (\n <TrackRefContext.Provider\n value={trackReference}\n key={getTrackReferenceId(trackReference)}\n >\n {cloneSingleChild(props.children)}\n </TrackRefContext.Provider>\n );\n })}\n </>\n );\n}\n","import * as React from 'react';\nimport SvgChevron from '../../assets/icons/Chevron';\nimport type { usePagination } from '../../hooks';\nimport { createInteractingObservable } from '@livekit/components-core';\n\nexport interface PaginationControlProps\n extends Pick<\n ReturnType<typeof usePagination>,\n 'totalPageCount' | 'nextPage' | 'prevPage' | 'currentPage'\n > {\n /** Reference to an HTML element that holds the pages, while interacting (`mouseover`)\n * with it, the pagination controls will appear for a while. */\n pagesContainer?: React.RefObject<HTMLElement>;\n}\n\nexport function PaginationControl({\n totalPageCount,\n nextPage,\n prevPage,\n currentPage,\n pagesContainer: connectedElement,\n}: PaginationControlProps) {\n const [interactive, setInteractive] = React.useState(false);\n React.useEffect(() => {\n let subscription:\n | ReturnType<ReturnType<typeof createInteractingObservable>['subscribe']>\n | undefined;\n if (connectedElement) {\n subscription = createInteractingObservable(connectedElement.current, 2000).subscribe(\n setInteractive,\n );\n }\n return () => {\n if (subscription) {\n subscription.unsubscribe();\n }\n };\n }, [connectedElement]);\n\n return (\n <div className=\"lk-pagination-control\" data-lk-user-interaction={interactive}>\n <button className=\"lk-button\" onClick={prevPage}>\n <SvgChevron />\n </button>\n <span className=\"lk-pagination-count\">{`${currentPage} of ${totalPageCount}`}</span>\n <button className=\"lk-button\" onClick={nextPage}>\n <SvgChevron />\n </button>\n </div>\n );\n}\n","import * as React from 'react';\n\nexport interface PaginationIndicatorProps {\n totalPageCount: number;\n currentPage: number;\n}\n\nexport const PaginationIndicator: (\n props: PaginationIndicatorProps & React.RefAttributes<HTMLDivElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLDivElement, PaginationIndicatorProps>(\n function PaginationIndicator({ totalPageCount, currentPage }: PaginationIndicatorProps, ref) {\n const bubbles = new Array(totalPageCount).fill('').map((_, index) => {\n if (index + 1 === currentPage) {\n return <span data-lk-active key={index} />;\n } else {\n return <span key={index} />;\n }\n });\n\n return (\n <div ref={ref} className=\"lk-pagination-indicator\">\n {bubbles}\n </div>\n );\n },\n);\n","import * as React from 'react';\nimport type { UseParticipantsOptions } from '../../hooks';\nimport { useGridLayout, usePagination, useSwipe } from '../../hooks';\nimport { mergeProps } from '../../utils';\nimport type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { TrackLoop } from '../TrackLoop';\nimport { PaginationControl } from '../controls/PaginationControl';\nimport { PaginationIndicator } from '../controls/PaginationIndicator';\n\n/** @public */\nexport interface GridLayoutProps\n extends React.HTMLAttributes<HTMLDivElement>,\n Pick<UseParticipantsOptions, 'updateOnlyOn'> {\n children: React.ReactNode;\n tracks: TrackReferenceOrPlaceholder[];\n}\n\n/**\n * The `GridLayout` component displays the nested participants in a grid where every participants has the same size.\n * It also supports pagination if there are more participants than the grid can display.\n * @remarks\n * To ensure visual stability when tiles are reordered due to track updates,\n * the component uses the `useVisualStableUpdate` hook.\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <GridLayout tracks={tracks}>\n * <ParticipantTile />\n * </GridLayout>\n * <LiveKitRoom>\n * ```\n * @public\n */\nexport function GridLayout({ tracks, ...props }: GridLayoutProps) {\n const gridEl = React.createRef<HTMLDivElement>();\n\n const elementProps = React.useMemo(\n () => mergeProps(props, { className: 'lk-grid-layout' }),\n [props],\n );\n const { layout } = useGridLayout(gridEl, tracks.length);\n const pagination = usePagination(layout.maxTiles, tracks);\n\n useSwipe(gridEl, {\n onLeftSwipe: pagination.nextPage,\n onRightSwipe: pagination.prevPage,\n });\n\n return (\n <div ref={gridEl} data-lk-pagination={pagination.totalPageCount > 1} {...elementProps}>\n <TrackLoop tracks={pagination.tracks}>{props.children}</TrackLoop>\n {tracks.length > layout.maxTiles && (\n <>\n <PaginationIndicator\n totalPageCount={pagination.totalPageCount}\n currentPage={pagination.currentPage}\n />\n <PaginationControl pagesContainer={gridEl} {...pagination} />\n </>\n )}\n </div>\n );\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { getScrollBarWidth } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useSize } from '../../hooks/internal';\nimport { useVisualStableUpdate } from '../../hooks';\nimport { TrackLoop } from '../TrackLoop';\n\nconst MIN_HEIGHT = 130;\nconst MIN_WIDTH = 140;\nconst MIN_VISIBLE_TILES = 1;\nconst ASPECT_RATIO = 16 / 10;\nconst ASPECT_RATIO_INVERT = (1 - ASPECT_RATIO) * -1;\n\n/** @public */\nexport interface CarouselLayoutProps extends React.HTMLAttributes<HTMLMediaElement> {\n tracks: TrackReferenceOrPlaceholder[];\n children: React.ReactNode;\n /** Place the tiles vertically or horizontally next to each other.\n * If undefined orientation is guessed by the dimensions of the container. */\n orientation?: 'vertical' | 'horizontal';\n}\n\n/**\n * The `CarouselLayout` component displays a list of tracks in a scroll container.\n * It will display as many tiles as possible and overflow the rest.\n * @remarks\n * To ensure visual stability when tiles are reordered due to track updates,\n * the component uses the `useVisualStableUpdate` hook.\n * @example\n * ```tsx\n * const tracks = useTracks([Track.Source.Camera]);\n * <CarouselLayout tracks={tracks}>\n * <ParticipantTile />\n * </CarouselLayout>\n * ```\n * @public\n */\nexport function CarouselLayout({ tracks, orientation, ...props }: CarouselLayoutProps) {\n const asideEl = React.useRef<HTMLDivElement>(null);\n const [prevTiles, setPrevTiles] = React.useState(0);\n const { width, height } = useSize(asideEl);\n const carouselOrientation = orientation\n ? orientation\n : height >= width\n ? 'vertical'\n : 'horizontal';\n\n const tileSpan =\n carouselOrientation === 'vertical'\n ? Math.max(width * ASPECT_RATIO_INVERT, MIN_HEIGHT)\n : Math.max(height * ASPECT_RATIO, MIN_WIDTH);\n const scrollBarWidth = getScrollBarWidth();\n\n const tilesThatFit =\n carouselOrientation === 'vertical'\n ? Math.max((height - scrollBarWidth) / tileSpan, MIN_VISIBLE_TILES)\n : Math.max((width - scrollBarWidth) / tileSpan, MIN_VISIBLE_TILES);\n\n let maxVisibleTiles = Math.round(tilesThatFit);\n if (Math.abs(tilesThatFit - prevTiles) < 0.5) {\n maxVisibleTiles = Math.round(prevTiles);\n } else if (prevTiles !== tilesThatFit) {\n setPrevTiles(tilesThatFit);\n }\n\n const sortedTiles = useVisualStableUpdate(tracks, maxVisibleTiles);\n\n React.useLayoutEffect(() => {\n if (asideEl.current) {\n asideEl.current.dataset.lkOrientation = carouselOrientation;\n asideEl.current.style.setProperty('--lk-max-visible-tiles', maxVisibleTiles.toString());\n }\n }, [maxVisibleTiles, carouselOrientation]);\n\n return (\n <aside key={carouselOrientation} className=\"lk-carousel\" ref={asideEl} {...props}>\n <TrackLoop tracks={sortedTiles}>{props.children}</TrackLoop>\n </aside>\n );\n}\n","import type { PinState, WidgetState } from '@livekit/components-core';\nimport { log } from '@livekit/components-core';\nimport * as React from 'react';\nimport type { LayoutContextType } from '../../context';\nimport { LayoutContext, useEnsureCreateLayoutContext } from '../../context';\n\n/** @alpha */\nexport interface LayoutContextProviderProps {\n value?: LayoutContextType;\n onPinChange?: (state: PinState) => void;\n onWidgetChange?: (state: WidgetState) => void;\n}\n\n/** @alpha */\nexport function LayoutContextProvider({\n value,\n onPinChange,\n onWidgetChange,\n children,\n}: React.PropsWithChildren<LayoutContextProviderProps>) {\n const layoutContextValue = useEnsureCreateLayoutContext(value);\n\n React.useEffect(() => {\n log.debug('PinState Updated', { state: layoutContextValue.pin.state });\n if (onPinChange && layoutContextValue.pin.state) onPinChange(layoutContextValue.pin.state);\n }, [layoutContextValue.pin.state, onPinChange]);\n\n React.useEffect(() => {\n log.debug('Widget Updated', { widgetState: layoutContextValue.widget.state });\n if (onWidgetChange && layoutContextValue.widget.state) {\n onWidgetChange(layoutContextValue.widget.state);\n }\n }, [onWidgetChange, layoutContextValue.widget.state]);\n\n return <LayoutContext.Provider value={layoutContextValue}>{children}</LayoutContext.Provider>;\n}\n","import { getTrackReferenceId } from '@livekit/components-core';\nimport { Room, Track } from 'livekit-client';\nimport * as React from 'react';\nimport { useTracks } from '../hooks';\nimport { AudioTrack } from './participant/AudioTrack';\n\n/** @public */\nexport interface RoomAudioRendererProps {\n room?: Room;\n\n /** Sets the volume for all audio tracks rendered by this component. By default, the range is between `0.0` and `1.0`. */\n volume?: number;\n\n /**\n * If set to `true`, mutes all audio tracks rendered by the component.\n * @remarks\n * If set to `true`, the server will stop sending audio track data to the client.\n * @alpha\n */\n muted?: boolean;\n}\n\n/**\n * The `RoomAudioRenderer` component is a drop-in solution for adding audio to your LiveKit app.\n * It takes care of handling remote participants’ audio tracks and makes sure that microphones and screen share are audible.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <RoomAudioRenderer />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport function RoomAudioRenderer({ room, volume, muted }: RoomAudioRendererProps) {\n const tracks = useTracks(\n [Track.Source.Microphone, Track.Source.ScreenShareAudio, Track.Source.Unknown],\n {\n updateOnlyOn: [],\n onlySubscribed: true,\n room,\n },\n ).filter((ref) => !ref.participant.isLocal && ref.publication.kind === Track.Kind.Audio);\n\n return (\n <div style={{ display: 'none' }}>\n {tracks.map((trackRef) => (\n <AudioTrack\n key={getTrackReferenceId(trackRef)}\n trackRef={trackRef}\n volume={volume}\n muted={muted}\n />\n ))}\n </div>\n );\n}\n","import * as React from 'react';\nimport { mergeProps } from '../utils';\n\n/**\n * The `Toast` component is a rudimentary way to display a message to the user.\n * This message should be short lived and not require user interaction.\n * For example, displaying the current connection state like `ConnectionStateToast` does.\n *\n * @example\n * ```tsx\n * <Toast>Connecting...</Toast>\n * ```\n * @public\n */\nexport function Toast(props: React.HTMLAttributes<HTMLDivElement>) {\n const htmlProps = React.useMemo(() => mergeProps(props, { className: 'lk-toast' }), [props]);\n return <div {...htmlProps}>{props.children}</div>;\n}\n","export const generateConnectingSequenceBar = (columns: number): number[][] => {\n const seq = [];\n\n for (let x = 0; x < columns; x++) {\n seq.push([x, columns - 1 - x]);\n }\n\n return seq;\n};\n","export const generateListeningSequenceBar = (columns: number): number[][] => {\n const center = Math.floor(columns / 2);\n const noIndex = -1;\n\n return [[center], [noIndex]];\n};\n","import { useEffect, useRef, useState } from 'react';\nimport { generateConnectingSequenceBar } from '../animationSequences/connectingSequence';\nimport { generateListeningSequenceBar } from '../animationSequences/listeningSequence';\nimport type { AgentState } from '../../../hooks';\n\nexport const useBarAnimator = (\n state: AgentState | undefined,\n columns: number,\n interval: number,\n): number[] => {\n const [index, setIndex] = useState(0);\n const [sequence, setSequence] = useState<number[][]>([[]]);\n\n useEffect(() => {\n if (state === 'thinking') {\n setSequence(generateListeningSequenceBar(columns));\n } else if (state === 'connecting' || state === 'initializing') {\n const sequence = [...generateConnectingSequenceBar(columns)];\n setSequence(sequence);\n } else if (state === 'listening') {\n setSequence(generateListeningSequenceBar(columns));\n } else if (state === undefined || state === 'speaking') {\n setSequence([new Array(columns).fill(0).map((_, idx) => idx)]);\n } else {\n setSequence([[]]);\n }\n setIndex(0);\n }, [state, columns]);\n\n const animationFrameId = useRef<number | null>(null);\n useEffect(() => {\n let startTime = performance.now();\n\n const animate = (time: DOMHighResTimeStamp) => {\n const timeElapsed = time - startTime;\n\n if (timeElapsed >= interval) {\n setIndex((prev) => prev + 1);\n startTime = time;\n }\n\n animationFrameId.current = requestAnimationFrame(animate);\n };\n\n animationFrameId.current = requestAnimationFrame(animate);\n\n return () => {\n if (animationFrameId.current !== null) {\n cancelAnimationFrame(animationFrameId.current);\n }\n };\n }, [interval, columns, state, sequence.length]);\n\n return sequence[index % sequence.length];\n};\n","import * as React from 'react';\nimport { useBarAnimator } from './animators/useBarAnimator';\nimport { useMultibandTrackVolume, type AgentState } from '../../hooks';\nimport { type TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { useMaybeTrackRefContext } from '../../context';\nimport { cloneSingleChild, mergeProps } from '../../utils';\nimport { LocalAudioTrack, RemoteAudioTrack } from 'livekit-client';\n\n/**\n * @beta\n */\nexport type BarVisualizerOptions = {\n /** in percentage */\n maxHeight?: number;\n /** in percentage */\n minHeight?: number;\n};\n\n/**\n * @beta\n */\nexport interface BarVisualizerProps extends React.HTMLProps<HTMLDivElement> {\n /** If set, the visualizer will transition between different voice assistant states */\n state?: AgentState;\n /** Number of bars that show up in the visualizer */\n barCount?: number;\n /** @deprecated use `track` field instead */\n trackRef?: TrackReferenceOrPlaceholder;\n track?: TrackReferenceOrPlaceholder | LocalAudioTrack | RemoteAudioTrack;\n options?: BarVisualizerOptions;\n /** The template component to be used in the visualizer. */\n children?: React.ReactNode;\n}\n\nconst sequencerIntervals = new Map<AgentState, number>([\n ['connecting', 2000],\n ['initializing', 2000],\n ['listening', 500],\n ['thinking', 150],\n]);\n\nconst getSequencerInterval = (\n state: AgentState | undefined,\n barCount: number,\n): number | undefined => {\n if (state === undefined) {\n return 1000;\n }\n let interval = sequencerIntervals.get(state);\n if (interval) {\n switch (state) {\n case 'connecting':\n // case 'thinking':\n interval /= barCount;\n break;\n\n default:\n break;\n }\n }\n return interval;\n};\n/**\n * Visualizes audio signals from a TrackReference as bars.\n * If the `state` prop is set, it automatically transitions between VoiceAssistant states.\n * @beta\n *\n * @remarks For VoiceAssistant state transitions this component requires a voice assistant agent running with livekit-agents \\>= 0.9.0\n *\n * @example\n * ```tsx\n * function SimpleVoiceAssistant() {\n * const { state, audioTrack } = useVoiceAssistant();\n * return (\n * <BarVisualizer\n * state={state}\n * trackRef={audioTrack}\n * />\n * );\n * }\n * ```\n *\n * @example\n * Styling the BarVisualizer using CSS classes\n * ```css\n * .lk-audio-bar {\n * // Styles for \"idle\" bars\n * }\n * .lk-audio-bar.lk-highlighted {\n * // Styles for \"active\" bars\n * }\n * ```\n *\n * @example\n * Styling the BarVisualizer using CSS custom properties\n * ```css\n * --lk-fg // for the \"active\" colour, note that this defines the main foreground colour for the whole \"theme\"\n * --lk-va-bg // for \"idle\" colour\n * ```\n *\n * @example\n * Using a custom bar template for the BarVisualizer\n * ```tsx\n * <BarVisualizer>\n * <div className=\"all the classes\" />\n * </BarVisualizer>\n * ```\n * the highlighted children will get a data prop of data-lk-highlighted for them to switch between active and idle bars in their own template bar\n */\nexport const BarVisualizer = /* @__PURE__ */ React.forwardRef<HTMLDivElement, BarVisualizerProps>(\n function BarVisualizer(\n { state, options, barCount = 15, trackRef, track, children, ...props }: BarVisualizerProps,\n ref,\n ) {\n const elementProps = mergeProps(props, { className: 'lk-audio-bar-visualizer' });\n let targetTrack: TrackReferenceOrPlaceholder | LocalAudioTrack | RemoteAudioTrack | undefined =\n useMaybeTrackRefContext();\n\n if (trackRef || track) {\n targetTrack = trackRef || track;\n }\n\n const volumeBands = useMultibandTrackVolume(targetTrack, {\n bands: barCount,\n loPass: 100,\n hiPass: 200,\n });\n const minHeight = options?.minHeight ?? 20;\n const maxHeight = options?.maxHeight ?? 100;\n\n const highlightedIndices = useBarAnimator(\n state,\n barCount,\n getSequencerInterval(state, barCount) ?? 100,\n );\n\n return (\n <div ref={ref} {...elementProps} data-lk-va-state={state}>\n {volumeBands.map((volume, idx) =>\n children ? (\n cloneSingleChild(children, {\n 'data-lk-highlighted': highlightedIndices.includes(idx),\n 'data-lk-bar-index': idx,\n className: 'lk-audio-bar',\n style: { height: `${Math.min(maxHeight, Math.max(minHeight, volume * 100 + 5))}%` },\n })\n ) : (\n <span\n key={idx}\n data-lk-highlighted={highlightedIndices.includes(idx)}\n data-lk-bar-index={idx}\n className={`lk-audio-bar ${highlightedIndices.includes(idx) && 'lk-highlighted'}`}\n style={{\n // TODO transform animations would be more performant, however the border-radius gets distorted when using scale transforms. a 9-slice approach (or 3 in this case) could work\n // transform: `scale(1, ${Math.min(maxHeight, Math.max(minHeight, volume))}`,\n height: `${Math.min(maxHeight, Math.max(minHeight, volume * 100 + 5))}%`,\n }}\n ></span>\n ),\n )}\n </div>\n );\n },\n);\n","import * as React from 'react';\n\nimport { ConnectionQualityIndicator } from './ConnectionQualityIndicator';\nimport { ParticipantName } from './ParticipantName';\nimport { TrackMutedIndicator } from './TrackMutedIndicator';\nimport { TrackRefContext, useEnsureTrackRef } from '../../context';\n\nimport type { ParticipantTileProps } from './ParticipantTile';\nimport { AudioTrack } from './AudioTrack';\nimport { useParticipantTile } from '../../hooks';\nimport { isTrackReference } from '@livekit/components-core';\nimport { BarVisualizer } from './BarVisualizer';\n\n/**\n * The `ParticipantAudioTile` component is the base utility wrapper for displaying a visual representation of a participant.\n * This component can be used as a child of the `TileLoop` or independently if a participant is passed as a property.\n *\n * @example\n * ```tsx\n * <ParticipantAudioTile />\n * ```\n * @public\n */\nexport const ParticipantAudioTile: (\n props: ParticipantTileProps & React.RefAttributes<HTMLDivElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLDivElement, ParticipantTileProps>(\n function ParticipantAudioTile(\n {\n children,\n disableSpeakingIndicator,\n onParticipantClick,\n trackRef,\n ...htmlProps\n }: ParticipantTileProps,\n ref,\n ) {\n const trackReference = useEnsureTrackRef(trackRef);\n const { elementProps } = useParticipantTile({\n trackRef: trackReference,\n htmlProps,\n disableSpeakingIndicator,\n onParticipantClick,\n });\n\n return (\n <div ref={ref} style={{ position: 'relative', minHeight: '160px' }} {...elementProps}>\n <TrackRefContext.Provider value={trackReference}>\n {children ?? (\n <>\n {isTrackReference(trackReference) && (\n <AudioTrack trackRef={trackReference}></AudioTrack>\n )}\n <BarVisualizer barCount={7} options={{ minHeight: 8 }} />\n <div className=\"lk-participant-metadata\">\n <div className=\"lk-participant-metadata-item\">\n <TrackMutedIndicator trackRef={trackReference}></TrackMutedIndicator>\n <ParticipantName />\n </div>\n <ConnectionQualityIndicator className=\"lk-participant-metadata-item\" />\n </div>\n </>\n )}\n </TrackRefContext.Provider>\n </div>\n );\n },\n);\n","import type { Room } from 'livekit-client';\nimport { ConnectionState } from 'livekit-client';\nimport * as React from 'react';\nimport { SpinnerIcon } from '../assets/icons';\nimport { useConnectionState } from '../hooks';\nimport { Toast } from './Toast';\n\n/** @public */\nexport interface ConnectionStateToastProps extends React.HTMLAttributes<HTMLDivElement> {\n room?: Room;\n}\n\n/**\n * The `ConnectionStateToast` component displays a toast\n * notification indicating the current connection state of the room.\n * @public\n */\nexport function ConnectionStateToast(props: ConnectionStateToastProps) {\n const [notification, setNotification] = React.useState<React.ReactElement | undefined>(undefined);\n const state = useConnectionState(props.room);\n\n React.useEffect(() => {\n switch (state) {\n case ConnectionState.Reconnecting:\n setNotification(\n <>\n <SpinnerIcon className=\"lk-spinner\" /> Reconnecting\n </>,\n );\n break;\n case ConnectionState.Connecting:\n setNotification(\n <>\n <SpinnerIcon className=\"lk-spinner\" /> Connecting\n </>,\n );\n break;\n case ConnectionState.Disconnected:\n setNotification(<>Disconnected</>);\n break;\n default:\n setNotification(undefined);\n break;\n }\n }, [state]);\n return notification ? <Toast className=\"lk-toast-connection-state\">{notification}</Toast> : <></>;\n}\n","import type { ReceivedChatMessage } from '@livekit/components-core';\nimport { tokenize, createDefaultGrammar } from '@livekit/components-core';\nimport * as React from 'react';\n\n/** @public */\nexport type MessageFormatter = (message: string) => React.ReactNode;\n\n/**\n * ChatEntry composes the HTML div element under the hood, so you can pass all its props.\n * These are the props specific to the ChatEntry component:\n * @public\n */\nexport interface ChatEntryProps extends React.HTMLAttributes<HTMLLIElement> {\n /** The chat massage object to display. */\n entry: ReceivedChatMessage;\n /** Hide sender name. Useful when displaying multiple consecutive chat messages from the same person. */\n hideName?: boolean;\n /** Hide message timestamp. */\n hideTimestamp?: boolean;\n /** An optional formatter for the message body. */\n messageFormatter?: MessageFormatter;\n}\n\n/**\n * The `ChatEntry` component holds and displays one chat message.\n *\n * @example\n * ```tsx\n * <Chat>\n * <ChatEntry />\n * </Chat>\n * ```\n * @see `Chat`\n * @public\n */\nexport const ChatEntry: (\n props: ChatEntryProps & React.RefAttributes<HTMLLIElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLLIElement, ChatEntryProps>(\n function ChatEntry(\n { entry, hideName = false, hideTimestamp = false, messageFormatter, ...props }: ChatEntryProps,\n ref,\n ) {\n const formattedMessage = React.useMemo(() => {\n return messageFormatter ? messageFormatter(entry.message) : entry.message;\n }, [entry.message, messageFormatter]);\n const hasBeenEdited = !!entry.editTimestamp;\n const time = new Date(entry.timestamp);\n const locale = typeof navigator !== 'undefined' ? navigator.language : 'en-US';\n\n const name = entry.from?.name ?? entry.from?.identity;\n\n return (\n <li\n ref={ref}\n className=\"lk-chat-entry\"\n title={time.toLocaleTimeString(locale, { timeStyle: 'full' })}\n data-lk-message-origin={entry.from?.isLocal ? 'local' : 'remote'}\n {...props}\n >\n {(!hideTimestamp || !hideName || hasBeenEdited) && (\n <span className=\"lk-meta-data\">\n {!hideName && <strong className=\"lk-participant-name\">{name}</strong>}\n\n {(!hideTimestamp || hasBeenEdited) && (\n <span className=\"lk-timestamp\">\n {hasBeenEdited && 'edited '}\n {time.toLocaleTimeString(locale, { timeStyle: 'short' })}\n </span>\n )}\n </span>\n )}\n\n <span className=\"lk-message-body\">{formattedMessage}</span>\n <span className=\"lk-message-attachements\">\n {entry.attachedFiles?.map(\n (file) =>\n file.type.startsWith('image/') && (\n <img\n style={{ maxWidth: '300px', maxHeight: '300px' }}\n key={file.name}\n src={URL.createObjectURL(file)}\n alt={file.name}\n />\n ),\n )}\n </span>\n </li>\n );\n },\n);\n\n/** @public */\nexport function formatChatMessageLinks(message: string): React.ReactNode {\n return tokenize(message, createDefaultGrammar()).map((tok, i) => {\n if (typeof tok === `string`) {\n return tok;\n } else {\n const content = tok.content.toString();\n const href =\n tok.type === `url`\n ? /^http(s?):\\/\\//.test(content)\n ? content\n : `https://${content}`\n : `mailto:${content}`;\n return (\n <a className=\"lk-chat-link\" key={i} href={href} target=\"_blank\" rel=\"noreferrer\">\n {content}\n </a>\n );\n }\n });\n}\n","import { type ChatMessage, type ChatOptions } from '@livekit/components-core';\nimport * as React from 'react';\nimport { useMaybeLayoutContext } from '../context';\nimport { cloneSingleChild } from '../utils';\nimport type { MessageFormatter } from '../components/ChatEntry';\nimport { ChatEntry } from '../components/ChatEntry';\nimport { useChat } from '../hooks/useChat';\nimport { ChatToggle } from '../components';\nimport ChatCloseIcon from '../assets/icons/ChatCloseIcon';\n\n/** @public */\nexport interface ChatProps extends React.HTMLAttributes<HTMLDivElement>, ChatOptions {\n messageFormatter?: MessageFormatter;\n}\n\n/**\n * The Chat component provides ready-to-use chat functionality in a LiveKit room.\n * Messages are distributed to all participants in the room in real-time.\n *\n * @remarks\n * - Only users who are in the room at the time of dispatch will receive messages\n * - Message history is not persisted between sessions\n * - Requires `@livekit/components-styles` to be imported for styling\n *\n * @example\n * ```tsx\n * import '@livekit/components-styles';\n *\n * function Room() {\n * return (\n * <LiveKitRoom data-lk-theme=\"default\">\n * <Chat />\n * </LiveKitRoom>\n * );\n * }\n * ```\n *\n * For custom styling, refer to: https://docs.livekit.io/reference/components/react/concepts/style-components/\n *\n * @public\n */\nexport function Chat({\n messageFormatter,\n messageDecoder,\n messageEncoder,\n channelTopic,\n ...props\n}: ChatProps) {\n const ulRef = React.useRef<HTMLUListElement>(null);\n const inputRef = React.useRef<HTMLInputElement>(null);\n\n const chatOptions: ChatOptions = React.useMemo(() => {\n return { messageDecoder, messageEncoder, channelTopic };\n }, [messageDecoder, messageEncoder, channelTopic]);\n\n const { chatMessages, send, isSending } = useChat(chatOptions);\n\n const layoutContext = useMaybeLayoutContext();\n const lastReadMsgAt = React.useRef<ChatMessage['timestamp']>(0);\n\n async function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n if (inputRef.current && inputRef.current.value.trim() !== '') {\n await send(inputRef.current.value);\n inputRef.current.value = '';\n inputRef.current.focus();\n }\n }\n\n React.useEffect(() => {\n if (ulRef) {\n ulRef.current?.scrollTo({ top: ulRef.current.scrollHeight });\n }\n }, [ulRef, chatMessages]);\n\n React.useEffect(() => {\n if (!layoutContext || chatMessages.length === 0) {\n return;\n }\n\n if (\n layoutContext.widget.state?.showChat &&\n chatMessages.length > 0 &&\n lastReadMsgAt.current !== chatMessages[chatMessages.length - 1]?.timestamp\n ) {\n lastReadMsgAt.current = chatMessages[chatMessages.length - 1]?.timestamp;\n return;\n }\n\n const unreadMessageCount = chatMessages.filter(\n (msg) => !lastReadMsgAt.current || msg.timestamp > lastReadMsgAt.current,\n ).length;\n\n const { widget } = layoutContext;\n if (unreadMessageCount > 0 && widget.state?.unreadMessages !== unreadMessageCount) {\n widget.dispatch?.({ msg: 'unread_msg', count: unreadMessageCount });\n }\n }, [chatMessages, layoutContext?.widget]);\n\n return (\n <div {...props} className=\"lk-chat\">\n <div className=\"lk-chat-header\">\n Messages\n {layoutContext && (\n <ChatToggle className=\"lk-close-button\">\n <ChatCloseIcon />\n </ChatToggle>\n )}\n </div>\n\n <ul className=\"lk-list lk-chat-messages\" ref={ulRef}>\n {props.children\n ? chatMessages.map((msg, idx) =>\n cloneSingleChild(props.children, {\n entry: msg,\n key: msg.id ?? idx,\n messageFormatter,\n }),\n )\n : chatMessages.map((msg, idx, allMsg) => {\n const hideName = idx >= 1 && allMsg[idx - 1].from === msg.from;\n // If the time delta between two messages is bigger than 60s show timestamp.\n const hideTimestamp = idx >= 1 && msg.timestamp - allMsg[idx - 1].timestamp < 60_000;\n\n return (\n <ChatEntry\n key={msg.id ?? idx}\n hideName={hideName}\n hideTimestamp={hideName === false ? false : hideTimestamp} // If we show the name always show the timestamp as well.\n entry={msg}\n messageFormatter={messageFormatter}\n />\n );\n })}\n </ul>\n <form className=\"lk-chat-form\" onSubmit={handleSubmit}>\n <input\n className=\"lk-form-control lk-chat-form-input\"\n disabled={isSending}\n ref={inputRef}\n type=\"text\"\n placeholder=\"Enter a message...\"\n onInput={(ev) => ev.stopPropagation()}\n onKeyDown={(ev) => ev.stopPropagation()}\n onKeyUp={(ev) => ev.stopPropagation()}\n />\n <button type=\"submit\" className=\"lk-button lk-chat-form-button\" disabled={isSending}>\n Send\n </button>\n </form>\n </div>\n );\n}\n","import { computeMenuPosition, wasClickOutside, log } from '@livekit/components-core';\nimport * as React from 'react';\nimport { MediaDeviceSelect } from '../components/controls/MediaDeviceSelect';\nimport type { LocalAudioTrack, LocalVideoTrack } from 'livekit-client';\n\n/** @public */\nexport interface MediaDeviceMenuProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {\n kind?: MediaDeviceKind;\n initialSelection?: string;\n onActiveDeviceChange?: (kind: MediaDeviceKind, deviceId: string) => void;\n tracks?: Partial<Record<MediaDeviceKind, LocalAudioTrack | LocalVideoTrack | undefined>>;\n /**\n * this will call getUserMedia if the permissions are not yet given to enumerate the devices with device labels.\n * in some browsers multiple calls to getUserMedia result in multiple permission prompts.\n * It's generally advised only flip this to true, once a (preview) track has been acquired successfully with the\n * appropriate permissions.\n *\n * @see {@link PreJoin}\n * @see {@link https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/enumerateDevices | MDN enumerateDevices}\n */\n requestPermissions?: boolean;\n}\n\n/**\n * The `MediaDeviceMenu` component is a button that opens a menu that lists\n * all media devices and allows the user to select them.\n *\n * @remarks\n * This component is implemented with the `MediaDeviceSelect` LiveKit components.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <MediaDeviceMenu />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport function MediaDeviceMenu({\n kind,\n initialSelection,\n onActiveDeviceChange,\n tracks,\n requestPermissions = false,\n ...props\n}: MediaDeviceMenuProps) {\n const [isOpen, setIsOpen] = React.useState(false);\n const [devices, setDevices] = React.useState<MediaDeviceInfo[]>([]);\n const [updateRequired, setUpdateRequired] = React.useState<boolean>(true);\n const [needPermissions, setNeedPermissions] = React.useState(requestPermissions);\n\n const handleActiveDeviceChange = (kind: MediaDeviceKind, deviceId: string) => {\n log.debug('handle device change');\n setIsOpen(false);\n onActiveDeviceChange?.(kind, deviceId);\n };\n\n const button = React.useRef<HTMLButtonElement>(null);\n const tooltip = React.useRef<HTMLDivElement>(null);\n\n React.useLayoutEffect(() => {\n if (isOpen) {\n setNeedPermissions(true);\n }\n }, [isOpen]);\n\n React.useLayoutEffect(() => {\n let cleanup: ReturnType<typeof computeMenuPosition> | undefined;\n if (button.current && tooltip.current && (devices || updateRequired)) {\n cleanup = computeMenuPosition(button.current, tooltip.current, (x, y) => {\n if (tooltip.current) {\n Object.assign(tooltip.current.style, { left: `${x}px`, top: `${y}px` });\n }\n });\n }\n setUpdateRequired(false);\n return () => {\n cleanup?.();\n };\n }, [button, tooltip, devices, updateRequired]);\n\n const handleClickOutside = React.useCallback(\n (event: MouseEvent) => {\n if (!tooltip.current) {\n return;\n }\n if (event.target === button.current) {\n return;\n }\n if (isOpen && wasClickOutside(tooltip.current, event)) {\n setIsOpen(false);\n }\n },\n [isOpen, tooltip, button],\n );\n\n React.useEffect(() => {\n document.addEventListener<'click'>('click', handleClickOutside);\n return () => {\n document.removeEventListener<'click'>('click', handleClickOutside);\n };\n }, [handleClickOutside]);\n\n return (\n <>\n <button\n className=\"lk-button lk-button-menu\"\n aria-pressed={isOpen}\n {...props}\n onClick={() => setIsOpen(!isOpen)}\n ref={button}\n >\n {props.children}\n </button>\n {/** only render when enabled in order to make sure that the permissions are requested only if the menu is enabled */}\n {!props.disabled && (\n <div\n className=\"lk-device-menu\"\n ref={tooltip}\n style={{ visibility: isOpen ? 'visible' : 'hidden' }}\n >\n {kind ? (\n <MediaDeviceSelect\n initialSelection={initialSelection}\n onActiveDeviceChange={(deviceId) => handleActiveDeviceChange(kind, deviceId)}\n onDeviceListChange={setDevices}\n kind={kind}\n track={tracks?.[kind]}\n requestPermissions={needPermissions}\n />\n ) : (\n <>\n <div className=\"lk-device-menu-heading\">Audio inputs</div>\n <MediaDeviceSelect\n kind=\"audioinput\"\n onActiveDeviceChange={(deviceId) =>\n handleActiveDeviceChange('audioinput', deviceId)\n }\n onDeviceListChange={setDevices}\n track={tracks?.audioinput}\n requestPermissions={needPermissions}\n />\n <div className=\"lk-device-menu-heading\">Video inputs</div>\n <MediaDeviceSelect\n kind=\"videoinput\"\n onActiveDeviceChange={(deviceId) =>\n handleActiveDeviceChange('videoinput', deviceId)\n }\n onDeviceListChange={setDevices}\n track={tracks?.videoinput}\n requestPermissions={needPermissions}\n />\n </>\n )}\n </div>\n )}\n </>\n );\n}\n","import * as React from 'react';\nimport { warnAboutMissingStyles } from '../utils';\n\n/**\n * @internal\n */\nexport function useWarnAboutMissingStyles() {\n React.useEffect(() => {\n warnAboutMissingStyles();\n }, []);\n}\n","import type {\n CreateLocalTracksOptions,\n LocalAudioTrack,\n LocalVideoTrack,\n TrackProcessor,\n} from 'livekit-client';\nimport {\n createLocalAudioTrack,\n createLocalTracks,\n createLocalVideoTrack,\n facingModeFromLocalTrack,\n Track,\n VideoPresets,\n Mutex,\n} from 'livekit-client';\nimport * as React from 'react';\nimport { MediaDeviceMenu } from './MediaDeviceMenu';\nimport { TrackToggle } from '../components/controls/TrackToggle';\nimport type { LocalUserChoices } from '@livekit/components-core';\nimport { log } from '@livekit/components-core';\nimport { ParticipantPlaceholder } from '../assets/images';\nimport { useMediaDevices, usePersistentUserChoices } from '../hooks';\nimport { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';\nimport { roomOptionsStringifyReplacer } from '../utils';\n\n/**\n * Props for the PreJoin component.\n * @public\n */\nexport interface PreJoinProps\n extends Omit<React.HTMLAttributes<HTMLDivElement>, 'onSubmit' | 'onError'> {\n /** This function is called with the `LocalUserChoices` if validation is passed. */\n onSubmit?: (values: LocalUserChoices) => void;\n /**\n * Provide your custom validation function. Only if validation is successful the user choices are past to the onSubmit callback.\n */\n onValidate?: (values: LocalUserChoices) => boolean;\n onError?: (error: Error) => void;\n /** Prefill the input form with initial values. */\n defaults?: Partial<LocalUserChoices>;\n /** Display a debug window for your convenience. */\n debug?: boolean;\n joinLabel?: string;\n micLabel?: string;\n camLabel?: string;\n userLabel?: string;\n /**\n * If true, user choices are persisted across sessions.\n * @defaultValue true\n * @alpha\n */\n persistUserChoices?: boolean;\n videoProcessor?: TrackProcessor<Track.Kind.Video>;\n}\n\n/** @public */\nexport function usePreviewTracks(\n options: CreateLocalTracksOptions,\n onError?: (err: Error) => void,\n) {\n const [tracks, setTracks] = React.useState<Array<LocalAudioTrack | LocalVideoTrack>>();\n\n const trackLock = React.useMemo(() => new Mutex(), []);\n\n React.useEffect(() => {\n let needsCleanup = false;\n let localTracks: Array<LocalAudioTrack | LocalVideoTrack> = [];\n trackLock.lock().then(async (unlock) => {\n try {\n if (options.audio || options.video) {\n localTracks = (await createLocalTracks(options)) as Array<\n LocalAudioTrack | LocalVideoTrack\n >;\n\n if (needsCleanup) {\n localTracks.forEach((tr) => tr.stop());\n } else {\n setTracks(localTracks);\n }\n }\n } catch (e: unknown) {\n if (onError && e instanceof Error) {\n onError(e);\n } else {\n log.error(e);\n }\n } finally {\n unlock();\n }\n });\n\n return () => {\n needsCleanup = true;\n localTracks.forEach((track) => {\n track.stop();\n });\n };\n }, [JSON.stringify(options, roomOptionsStringifyReplacer), onError, trackLock]);\n\n return tracks;\n}\n\n/**\n * @public\n * @deprecated use `usePreviewTracks` instead\n */\nexport function usePreviewDevice<T extends LocalVideoTrack | LocalAudioTrack>(\n enabled: boolean,\n deviceId: string,\n kind: 'videoinput' | 'audioinput',\n) {\n const [deviceError, setDeviceError] = React.useState<Error | null>(null);\n const [isCreatingTrack, setIsCreatingTrack] = React.useState<boolean>(false);\n\n const devices = useMediaDevices({ kind });\n const [selectedDevice, setSelectedDevice] = React.useState<MediaDeviceInfo | undefined>(\n undefined,\n );\n\n const [localTrack, setLocalTrack] = React.useState<T>();\n const [localDeviceId, setLocalDeviceId] = React.useState<string>(deviceId);\n\n React.useEffect(() => {\n setLocalDeviceId(deviceId);\n }, [deviceId]);\n\n const createTrack = async (deviceId: string, kind: 'videoinput' | 'audioinput') => {\n try {\n const track =\n kind === 'videoinput'\n ? await createLocalVideoTrack({\n deviceId,\n resolution: VideoPresets.h720.resolution,\n })\n : await createLocalAudioTrack({ deviceId });\n\n const newDeviceId = await track.getDeviceId(false);\n if (newDeviceId && deviceId !== newDeviceId) {\n prevDeviceId.current = newDeviceId;\n setLocalDeviceId(newDeviceId);\n }\n setLocalTrack(track as T);\n } catch (e) {\n if (e instanceof Error) {\n setDeviceError(e);\n }\n }\n };\n\n const switchDevice = async (track: LocalVideoTrack | LocalAudioTrack, id: string) => {\n await track.setDeviceId(id);\n prevDeviceId.current = id;\n };\n\n const prevDeviceId = React.useRef(localDeviceId);\n\n React.useEffect(() => {\n if (enabled && !localTrack && !deviceError && !isCreatingTrack) {\n log.debug('creating track', kind);\n setIsCreatingTrack(true);\n createTrack(localDeviceId, kind).finally(() => {\n setIsCreatingTrack(false);\n });\n }\n }, [enabled, localTrack, deviceError, isCreatingTrack]);\n\n // switch camera device\n React.useEffect(() => {\n if (!localTrack) {\n return;\n }\n if (!enabled) {\n log.debug(`muting ${kind} track`);\n localTrack.mute().then(() => log.debug(localTrack.mediaStreamTrack));\n } else if (selectedDevice?.deviceId && prevDeviceId.current !== selectedDevice?.deviceId) {\n log.debug(`switching ${kind} device from`, prevDeviceId.current, selectedDevice.deviceId);\n switchDevice(localTrack, selectedDevice.deviceId);\n } else {\n log.debug(`unmuting local ${kind} track`);\n localTrack.unmute();\n }\n }, [localTrack, selectedDevice, enabled, kind]);\n\n React.useEffect(() => {\n return () => {\n if (localTrack) {\n log.debug(`stopping local ${kind} track`);\n localTrack.stop();\n localTrack.mute();\n }\n };\n }, []);\n\n React.useEffect(() => {\n setSelectedDevice(devices?.find((dev) => dev.deviceId === localDeviceId));\n }, [localDeviceId, devices]);\n\n return {\n selectedDevice,\n localTrack,\n deviceError,\n };\n}\n\n/**\n * The `PreJoin` prefab component is normally presented to the user before he enters a room.\n * This component allows the user to check and select the preferred media device (camera und microphone).\n * On submit the user decisions are returned, which can then be passed on to the `LiveKitRoom` so that the user enters the room with the correct media devices.\n *\n * @remarks\n * This component is independent of the `LiveKitRoom` component and should not be nested within it.\n * Because it only accesses the local media tracks this component is self-contained and works without connection to the LiveKit server.\n *\n * @example\n * ```tsx\n * <PreJoin />\n * ```\n * @public\n */\nexport function PreJoin({\n defaults = {},\n onValidate,\n onSubmit,\n onError,\n debug,\n joinLabel = 'Join Room',\n micLabel = 'Microphone',\n camLabel = 'Camera',\n userLabel = 'Username',\n persistUserChoices = true,\n videoProcessor,\n ...htmlProps\n}: PreJoinProps) {\n const {\n userChoices: initialUserChoices,\n saveAudioInputDeviceId,\n saveAudioInputEnabled,\n saveVideoInputDeviceId,\n saveVideoInputEnabled,\n saveUsername,\n } = usePersistentUserChoices({\n defaults,\n preventSave: !persistUserChoices,\n preventLoad: !persistUserChoices,\n });\n\n const [userChoices, setUserChoices] = React.useState(initialUserChoices);\n\n // Initialize device settings\n const [audioEnabled, setAudioEnabled] = React.useState<boolean>(userChoices.audioEnabled);\n const [videoEnabled, setVideoEnabled] = React.useState<boolean>(userChoices.videoEnabled);\n const [audioDeviceId, setAudioDeviceId] = React.useState<string>(userChoices.audioDeviceId);\n const [videoDeviceId, setVideoDeviceId] = React.useState<string>(userChoices.videoDeviceId);\n const [username, setUsername] = React.useState(userChoices.username);\n\n // Save user choices to persistent storage.\n React.useEffect(() => {\n saveAudioInputEnabled(audioEnabled);\n }, [audioEnabled, saveAudioInputEnabled]);\n React.useEffect(() => {\n saveVideoInputEnabled(videoEnabled);\n }, [videoEnabled, saveVideoInputEnabled]);\n React.useEffect(() => {\n saveAudioInputDeviceId(audioDeviceId);\n }, [audioDeviceId, saveAudioInputDeviceId]);\n React.useEffect(() => {\n saveVideoInputDeviceId(videoDeviceId);\n }, [videoDeviceId, saveVideoInputDeviceId]);\n React.useEffect(() => {\n saveUsername(username);\n }, [username, saveUsername]);\n\n const tracks = usePreviewTracks(\n {\n audio: audioEnabled ? { deviceId: initialUserChoices.audioDeviceId } : false,\n video: videoEnabled\n ? { deviceId: initialUserChoices.videoDeviceId, processor: videoProcessor }\n : false,\n },\n onError,\n );\n\n const videoEl = React.useRef(null);\n\n const videoTrack = React.useMemo(\n () => tracks?.filter((track) => track.kind === Track.Kind.Video)[0] as LocalVideoTrack,\n [tracks],\n );\n\n const facingMode = React.useMemo(() => {\n if (videoTrack) {\n const { facingMode } = facingModeFromLocalTrack(videoTrack);\n return facingMode;\n } else {\n return 'undefined';\n }\n }, [videoTrack]);\n\n const audioTrack = React.useMemo(\n () => tracks?.filter((track) => track.kind === Track.Kind.Audio)[0] as LocalAudioTrack,\n [tracks],\n );\n\n React.useEffect(() => {\n if (videoEl.current && videoTrack) {\n videoTrack.unmute();\n videoTrack.attach(videoEl.current);\n }\n\n return () => {\n videoTrack?.detach();\n };\n }, [videoTrack]);\n\n const [isValid, setIsValid] = React.useState<boolean>();\n\n const handleValidation = React.useCallback(\n (values: LocalUserChoices) => {\n if (typeof onValidate === 'function') {\n return onValidate(values);\n } else {\n return values.username !== '';\n }\n },\n [onValidate],\n );\n\n React.useEffect(() => {\n const newUserChoices = {\n username,\n videoEnabled,\n videoDeviceId,\n audioEnabled,\n audioDeviceId,\n };\n setUserChoices(newUserChoices);\n setIsValid(handleValidation(newUserChoices));\n }, [username, videoEnabled, handleValidation, audioEnabled, audioDeviceId, videoDeviceId]);\n\n function handleSubmit(event: React.FormEvent) {\n event.preventDefault();\n if (handleValidation(userChoices)) {\n if (typeof onSubmit === 'function') {\n onSubmit(userChoices);\n }\n } else {\n log.warn('Validation failed with: ', userChoices);\n }\n }\n\n useWarnAboutMissingStyles();\n\n return (\n <div className=\"lk-prejoin\" {...htmlProps}>\n <div className=\"lk-video-container\">\n {videoTrack && (\n <video ref={videoEl} width=\"1280\" height=\"720\" data-lk-facing-mode={facingMode} />\n )}\n {(!videoTrack || !videoEnabled) && (\n <div className=\"lk-camera-off-note\">\n <ParticipantPlaceholder />\n </div>\n )}\n </div>\n <div className=\"lk-button-group-container\">\n <div className=\"lk-button-group audio\">\n <TrackToggle\n initialState={audioEnabled}\n source={Track.Source.Microphone}\n onChange={(enabled) => setAudioEnabled(enabled)}\n >\n {micLabel}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n initialSelection={audioDeviceId}\n kind=\"audioinput\"\n disabled={!audioTrack}\n tracks={{ audioinput: audioTrack }}\n onActiveDeviceChange={(_, id) => setAudioDeviceId(id)}\n />\n </div>\n </div>\n <div className=\"lk-button-group video\">\n <TrackToggle\n initialState={videoEnabled}\n source={Track.Source.Camera}\n onChange={(enabled) => setVideoEnabled(enabled)}\n >\n {camLabel}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n initialSelection={videoDeviceId}\n kind=\"videoinput\"\n disabled={!videoTrack}\n tracks={{ videoinput: videoTrack }}\n onActiveDeviceChange={(_, id) => setVideoDeviceId(id)}\n />\n </div>\n </div>\n </div>\n\n <form className=\"lk-username-container\">\n <input\n className=\"lk-form-control\"\n id=\"username\"\n name=\"username\"\n type=\"text\"\n defaultValue={username}\n placeholder={userLabel}\n onChange={(inputEl) => setUsername(inputEl.target.value)}\n autoComplete=\"off\"\n />\n <button\n className=\"lk-button lk-join-button\"\n type=\"submit\"\n onClick={handleSubmit}\n disabled={!isValid}\n >\n {joinLabel}\n </button>\n </form>\n\n {debug && (\n <>\n <strong>User Choices:</strong>\n <ul className=\"lk-list\" style={{ overflow: 'hidden', maxWidth: '15rem' }}>\n <li>Username: {`${userChoices.username}`}</li>\n <li>Video Enabled: {`${userChoices.videoEnabled}`}</li>\n <li>Audio Enabled: {`${userChoices.audioEnabled}`}</li>\n <li>Video Device: {`${userChoices.videoDeviceId}`}</li>\n <li>Audio Device: {`${userChoices.audioDeviceId}`}</li>\n </ul>\n </>\n )}\n </div>\n );\n}\n","import { useLayoutContext } from '../context';\nimport { mergeProps } from '../mergeProps';\nimport * as React from 'react';\n\n/** @alpha */\nexport interface UseSettingsToggleProps {\n props: React.ButtonHTMLAttributes<HTMLButtonElement>;\n}\n\n/**\n * The `useSettingsToggle` hook provides state and functions for toggling the settings menu.\n * @remarks\n * Depends on the `LayoutContext` to work properly.\n * @see {@link SettingsMenu}\n * @alpha\n */\nexport function useSettingsToggle({ props }: UseSettingsToggleProps) {\n const { dispatch, state } = useLayoutContext().widget;\n const className = 'lk-button lk-settings-toggle';\n\n const mergedProps = React.useMemo(() => {\n return mergeProps(props, {\n className,\n onClick: () => {\n if (dispatch) dispatch({ msg: 'toggle_settings' });\n },\n 'aria-pressed': state?.showSettings ? 'true' : 'false',\n });\n }, [props, className, dispatch, state]);\n\n return { mergedProps };\n}\n","import * as React from 'react';\nimport { useSettingsToggle } from '../../hooks/useSettingsToggle';\n\n/** @alpha */\nexport interface SettingsMenuToggleProps extends React.ButtonHTMLAttributes<HTMLButtonElement> {}\n\n/**\n * The `SettingsMenuToggle` component is a button that toggles the visibility of the `SettingsMenu` component.\n * @remarks\n * For the component to have any effect it has to live inside a `LayoutContext` context.\n *\n * @alpha\n */\nexport const SettingsMenuToggle: (\n props: SettingsMenuToggleProps & React.RefAttributes<HTMLButtonElement>,\n) => React.ReactNode = /* @__PURE__ */ React.forwardRef<HTMLButtonElement, SettingsMenuToggleProps>(\n function SettingsMenuToggle(props: SettingsMenuToggleProps, ref) {\n const { mergedProps } = useSettingsToggle({ props });\n\n return (\n <button ref={ref} {...mergedProps}>\n {props.children}\n </button>\n );\n },\n);\n","import { Track } from 'livekit-client';\nimport * as React from 'react';\nimport { MediaDeviceMenu } from './MediaDeviceMenu';\nimport { DisconnectButton } from '../components/controls/DisconnectButton';\nimport { TrackToggle } from '../components/controls/TrackToggle';\nimport { ChatIcon, GearIcon, LeaveIcon } from '../assets/icons';\nimport { ChatToggle } from '../components/controls/ChatToggle';\nimport { useLocalParticipantPermissions, usePersistentUserChoices } from '../hooks';\nimport { useMediaQuery } from '../hooks/internal';\nimport { useMaybeLayoutContext } from '../context';\nimport { supportsScreenSharing } from '@livekit/components-core';\nimport { mergeProps } from '../utils';\nimport { StartMediaButton } from '../components/controls/StartMediaButton';\nimport { SettingsMenuToggle } from '../components/controls/SettingsMenuToggle';\n\n/** @public */\nexport type ControlBarControls = {\n microphone?: boolean;\n camera?: boolean;\n chat?: boolean;\n screenShare?: boolean;\n leave?: boolean;\n settings?: boolean;\n};\n\nconst trackSourceToProtocol = (source: Track.Source) => {\n // NOTE: this mapping avoids importing the protocol package as that leads to a significant bundle size increase\n switch (source) {\n case Track.Source.Camera:\n return 1;\n case Track.Source.Microphone:\n return 2;\n case Track.Source.ScreenShare:\n return 3;\n default:\n return 0;\n }\n};\n\n/** @public */\nexport interface ControlBarProps extends React.HTMLAttributes<HTMLDivElement> {\n onDeviceError?: (error: { source: Track.Source; error: Error }) => void;\n variation?: 'minimal' | 'verbose' | 'textOnly';\n controls?: ControlBarControls;\n /**\n * If `true`, the user's device choices will be persisted.\n * This will enable the user to have the same device choices when they rejoin the room.\n * @defaultValue true\n * @alpha\n */\n saveUserChoices?: boolean;\n}\n\n/**\n * The `ControlBar` prefab gives the user the basic user interface to control their\n * media devices (camera, microphone and screen share), open the `Chat` and leave the room.\n *\n * @remarks\n * This component is build with other LiveKit components like `TrackToggle`,\n * `DeviceSelectorButton`, `DisconnectButton` and `StartAudio`.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <ControlBar />\n * </LiveKitRoom>\n * ```\n * @public\n */\nexport function ControlBar({\n variation,\n controls,\n saveUserChoices = true,\n onDeviceError,\n ...props\n}: ControlBarProps) {\n const [isChatOpen, setIsChatOpen] = React.useState(false);\n const layoutContext = useMaybeLayoutContext();\n React.useEffect(() => {\n if (layoutContext?.widget.state?.showChat !== undefined) {\n setIsChatOpen(layoutContext?.widget.state?.showChat);\n }\n }, [layoutContext?.widget.state?.showChat]);\n const isTooLittleSpace = useMediaQuery(`(max-width: ${isChatOpen ? 1000 : 760}px)`);\n\n const defaultVariation = isTooLittleSpace ? 'minimal' : 'verbose';\n variation ??= defaultVariation;\n\n const visibleControls = { leave: true, ...controls };\n\n const localPermissions = useLocalParticipantPermissions();\n\n if (!localPermissions) {\n visibleControls.camera = false;\n visibleControls.chat = false;\n visibleControls.microphone = false;\n visibleControls.screenShare = false;\n } else {\n const canPublishSource = (source: Track.Source) => {\n return (\n localPermissions.canPublish &&\n (localPermissions.canPublishSources.length === 0 ||\n localPermissions.canPublishSources.includes(trackSourceToProtocol(source)))\n );\n };\n visibleControls.camera ??= canPublishSource(Track.Source.Camera);\n visibleControls.microphone ??= canPublishSource(Track.Source.Microphone);\n visibleControls.screenShare ??= canPublishSource(Track.Source.ScreenShare);\n visibleControls.chat ??= localPermissions.canPublishData && controls?.chat;\n }\n\n const showIcon = React.useMemo(\n () => variation === 'minimal' || variation === 'verbose',\n [variation],\n );\n const showText = React.useMemo(\n () => variation === 'textOnly' || variation === 'verbose',\n [variation],\n );\n\n const browserSupportsScreenSharing = supportsScreenSharing();\n\n const [isScreenShareEnabled, setIsScreenShareEnabled] = React.useState(false);\n\n const onScreenShareChange = React.useCallback(\n (enabled: boolean) => {\n setIsScreenShareEnabled(enabled);\n },\n [setIsScreenShareEnabled],\n );\n\n const htmlProps = mergeProps({ className: 'lk-control-bar' }, props);\n\n const {\n saveAudioInputEnabled,\n saveVideoInputEnabled,\n saveAudioInputDeviceId,\n saveVideoInputDeviceId,\n } = usePersistentUserChoices({ preventSave: !saveUserChoices });\n\n const microphoneOnChange = React.useCallback(\n (enabled: boolean, isUserInitiated: boolean) =>\n isUserInitiated ? saveAudioInputEnabled(enabled) : null,\n [saveAudioInputEnabled],\n );\n\n const cameraOnChange = React.useCallback(\n (enabled: boolean, isUserInitiated: boolean) =>\n isUserInitiated ? saveVideoInputEnabled(enabled) : null,\n [saveVideoInputEnabled],\n );\n\n return (\n <div {...htmlProps}>\n {visibleControls.microphone && (\n <div className=\"lk-button-group\">\n <TrackToggle\n source={Track.Source.Microphone}\n showIcon={showIcon}\n onChange={microphoneOnChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.Microphone, error })}\n >\n {showText && 'Microphone'}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n kind=\"audioinput\"\n onActiveDeviceChange={(_kind, deviceId) =>\n saveAudioInputDeviceId(deviceId ?? 'default')\n }\n />\n </div>\n </div>\n )}\n {visibleControls.camera && (\n <div className=\"lk-button-group\">\n <TrackToggle\n source={Track.Source.Camera}\n showIcon={showIcon}\n onChange={cameraOnChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.Camera, error })}\n >\n {showText && 'Camera'}\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n kind=\"videoinput\"\n onActiveDeviceChange={(_kind, deviceId) =>\n saveVideoInputDeviceId(deviceId ?? 'default')\n }\n />\n </div>\n </div>\n )}\n {visibleControls.screenShare && browserSupportsScreenSharing && (\n <TrackToggle\n source={Track.Source.ScreenShare}\n captureOptions={{ audio: true, selfBrowserSurface: 'include' }}\n showIcon={showIcon}\n onChange={onScreenShareChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.ScreenShare, error })}\n >\n {showText && (isScreenShareEnabled ? 'Stop screen share' : 'Share screen')}\n </TrackToggle>\n )}\n {visibleControls.chat && (\n <ChatToggle>\n {showIcon && <ChatIcon />}\n {showText && 'Chat'}\n </ChatToggle>\n )}\n {visibleControls.settings && (\n <SettingsMenuToggle>\n {showIcon && <GearIcon />}\n {showText && 'Settings'}\n </SettingsMenuToggle>\n )}\n {visibleControls.leave && (\n <DisconnectButton>\n {showIcon && <LeaveIcon />}\n {showText && 'Leave'}\n </DisconnectButton>\n )}\n <StartMediaButton />\n </div>\n );\n}\n","import type {\n MessageDecoder,\n MessageEncoder,\n TrackReferenceOrPlaceholder,\n WidgetState,\n} from '@livekit/components-core';\nimport { isEqualTrackRef, isTrackReference, isWeb, log } from '@livekit/components-core';\nimport { RoomEvent, Track } from 'livekit-client';\nimport * as React from 'react';\nimport type { MessageFormatter } from '../components';\nimport {\n CarouselLayout,\n ConnectionStateToast,\n FocusLayout,\n FocusLayoutContainer,\n GridLayout,\n LayoutContextProvider,\n ParticipantTile,\n RoomAudioRenderer,\n} from '../components';\nimport { useCreateLayoutContext } from '../context';\nimport { usePinnedTracks, useTracks } from '../hooks';\nimport { Chat } from './Chat';\nimport { ControlBar, type ControlBarProps } from './ControlBar';\nimport { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';\n\n/**\n * @public\n */\nexport interface VideoConferenceProps extends React.HTMLAttributes<HTMLDivElement> {\n chatMessageFormatter?: MessageFormatter;\n chatMessageEncoder?: MessageEncoder;\n chatMessageDecoder?: MessageDecoder;\n /** @alpha */\n SettingsComponent?: React.ComponentType;\n controlBarProps?: Partial<ControlBarProps>;\n}\n\n/**\n * The `VideoConference` ready-made component is your drop-in solution for a classic video conferencing application.\n * It provides functionality such as focusing on one participant, grid view with pagination to handle large numbers\n * of participants, basic non-persistent chat, screen sharing, and more.\n *\n * @remarks\n * The component is implemented with other LiveKit components like `FocusContextProvider`,\n * `GridLayout`, `ControlBar`, `FocusLayoutContainer` and `FocusLayout`.\n * You can use these components as a starting point for your own custom video conferencing application.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <VideoConference />\n * <LiveKitRoom>\n * ```\n * @public\n */\nexport function VideoConference({\n chatMessageFormatter,\n chatMessageDecoder,\n chatMessageEncoder,\n SettingsComponent,\n controlBarProps = {},\n ...props\n}: VideoConferenceProps) {\n const [widgetState, setWidgetState] = React.useState<WidgetState>({\n showChat: false,\n unreadMessages: 0,\n showSettings: false,\n });\n const lastAutoFocusedScreenShareTrack = React.useRef<TrackReferenceOrPlaceholder | null>(null);\n\n const tracks = useTracks(\n [\n { source: Track.Source.Camera, withPlaceholder: true },\n { source: Track.Source.ScreenShare, withPlaceholder: false },\n ],\n { updateOnlyOn: [RoomEvent.ActiveSpeakersChanged], onlySubscribed: false },\n );\n\n const widgetUpdate = (state: WidgetState) => {\n log.debug('updating widget state', state);\n setWidgetState(state);\n };\n\n const layoutContext = useCreateLayoutContext();\n\n const screenShareTracks = tracks\n .filter(isTrackReference)\n .filter((track) => track.publication.source === Track.Source.ScreenShare);\n\n const focusTrack = usePinnedTracks(layoutContext)?.[0];\n const carouselTracks = tracks.filter((track) => !isEqualTrackRef(track, focusTrack));\n\n React.useEffect(() => {\n // If screen share tracks are published, and no pin is set explicitly, auto set the screen share.\n if (\n screenShareTracks.some((track) => track.publication.isSubscribed) &&\n lastAutoFocusedScreenShareTrack.current === null\n ) {\n log.debug('Auto set screen share focus:', { newScreenShareTrack: screenShareTracks[0] });\n layoutContext.pin.dispatch?.({ msg: 'set_pin', trackReference: screenShareTracks[0] });\n lastAutoFocusedScreenShareTrack.current = screenShareTracks[0];\n } else if (\n lastAutoFocusedScreenShareTrack.current &&\n !screenShareTracks.some(\n (track) =>\n track.publication.trackSid ===\n lastAutoFocusedScreenShareTrack.current?.publication?.trackSid,\n )\n ) {\n log.debug('Auto clearing screen share focus.');\n layoutContext.pin.dispatch?.({ msg: 'clear_pin' });\n lastAutoFocusedScreenShareTrack.current = null;\n }\n if (focusTrack && !isTrackReference(focusTrack)) {\n const updatedFocusTrack = tracks.find(\n (tr) =>\n tr.participant.identity === focusTrack.participant.identity &&\n tr.source === focusTrack.source,\n );\n if (updatedFocusTrack !== focusTrack && isTrackReference(updatedFocusTrack)) {\n layoutContext.pin.dispatch?.({ msg: 'set_pin', trackReference: updatedFocusTrack });\n }\n }\n }, [\n screenShareTracks\n .map((ref) => `${ref.publication.trackSid}_${ref.publication.isSubscribed}`)\n .join(),\n focusTrack?.publication?.trackSid,\n tracks,\n ]);\n\n useWarnAboutMissingStyles();\n\n return (\n <div className=\"lk-video-conference\" {...props}>\n {isWeb() && (\n <LayoutContextProvider\n value={layoutContext}\n // onPinChange={handleFocusStateChange}\n onWidgetChange={widgetUpdate}\n >\n <div className=\"lk-video-conference-inner\">\n {!focusTrack ? (\n <div className=\"lk-grid-layout-wrapper\">\n <GridLayout tracks={tracks}>\n <ParticipantTile />\n </GridLayout>\n </div>\n ) : (\n <div className=\"lk-focus-layout-wrapper\">\n <FocusLayoutContainer>\n <CarouselLayout tracks={carouselTracks}>\n <ParticipantTile />\n </CarouselLayout>\n {focusTrack && <FocusLayout trackRef={focusTrack} />}\n </FocusLayoutContainer>\n </div>\n )}\n <ControlBar\n controls={{ chat: true, settings: !!SettingsComponent }}\n {...controlBarProps}\n />\n </div>\n <Chat\n style={{ display: widgetState.showChat ? 'grid' : 'none' }}\n messageFormatter={chatMessageFormatter}\n messageEncoder={chatMessageEncoder}\n messageDecoder={chatMessageDecoder}\n />\n {SettingsComponent && (\n <div\n className=\"lk-settings-menu-modal\"\n style={{ display: widgetState.showSettings ? 'block' : 'none' }}\n >\n <SettingsComponent />\n </div>\n )}\n </LayoutContextProvider>\n )}\n <RoomAudioRenderer />\n <ConnectionStateToast />\n </div>\n );\n}\n","import * as React from 'react';\nimport { ControlBar } from './ControlBar';\n\nimport { ParticipantAudioTile } from '../components/participant/ParticipantAudioTile';\nimport { LayoutContextProvider } from '../components/layout/LayoutContextProvider';\nimport type { WidgetState } from '@livekit/components-core';\nimport { Chat } from './Chat';\nimport { TrackLoop } from '../components';\nimport { useTracks } from '../hooks';\nimport { useWarnAboutMissingStyles } from '../hooks/useWarnAboutMissingStyles';\nimport { Track } from 'livekit-client';\n\n/** @public */\nexport interface AudioConferenceProps extends React.HTMLAttributes<HTMLDivElement> {}\n\n/**\n * This component is the default setup of a classic LiveKit audio conferencing app.\n * It provides functionality like switching between participant grid view and focus view.\n *\n * @remarks\n * The component is implemented with other LiveKit components like `FocusContextProvider`,\n * `GridLayout`, `ControlBar`, `FocusLayoutContainer` and `FocusLayout`.\n *\n * @example\n * ```tsx\n * <LiveKitRoom>\n * <AudioConference />\n * <LiveKitRoom>\n * ```\n * @public\n */\nexport function AudioConference({ ...props }: AudioConferenceProps) {\n const [widgetState, setWidgetState] = React.useState<WidgetState>({\n showChat: false,\n unreadMessages: 0,\n });\n\n const audioTracks = useTracks([Track.Source.Microphone]);\n\n useWarnAboutMissingStyles();\n\n return (\n <LayoutContextProvider onWidgetChange={setWidgetState}>\n <div className=\"lk-audio-conference\" {...props}>\n <div className=\"lk-audio-conference-stage\">\n <TrackLoop tracks={audioTracks}>\n <ParticipantAudioTile />\n </TrackLoop>\n </div>\n <ControlBar\n controls={{ microphone: true, screenShare: false, camera: false, chat: true }}\n />\n {widgetState.showChat && <Chat />}\n </div>\n </LayoutContextProvider>\n );\n}\n","import { Track } from 'livekit-client';\nimport * as React from 'react';\nimport { MediaDeviceMenu } from './MediaDeviceMenu';\nimport { TrackToggle } from '../components/controls/TrackToggle';\nimport {\n useLocalParticipant,\n useLocalParticipantPermissions,\n usePersistentUserChoices,\n} from '../hooks';\nimport { mergeProps } from '../utils';\nimport { StartMediaButton } from '../components/controls/StartMediaButton';\nimport { BarVisualizer, DisconnectButton } from '../components';\nimport type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\n\n/** @beta */\nexport type VoiceAssistantControlBarControls = {\n microphone?: boolean;\n leave?: boolean;\n};\n\n/** @beta */\nexport interface VoiceAssistantControlBarProps extends React.HTMLAttributes<HTMLDivElement> {\n onDeviceError?: (error: { source: Track.Source; error: Error }) => void;\n controls?: VoiceAssistantControlBarControls;\n /**\n * If `true`, the user's device choices will be persisted.\n * This will enables the user to have the same device choices when they rejoin the room.\n * @defaultValue true\n */\n saveUserChoices?: boolean;\n}\n\n/**\n * @example\n * ```tsx\n * <LiveKitRoom ... >\n * <VoiceAssistantControlBar />\n * </LiveKitRoom>\n * ```\n * @beta\n */\nexport function VoiceAssistantControlBar({\n controls,\n saveUserChoices = true,\n onDeviceError,\n ...props\n}: VoiceAssistantControlBarProps) {\n const visibleControls = { leave: true, microphone: true, ...controls };\n\n const localPermissions = useLocalParticipantPermissions();\n const { microphoneTrack, localParticipant } = useLocalParticipant();\n\n const micTrackRef: TrackReferenceOrPlaceholder = React.useMemo(() => {\n return {\n participant: localParticipant,\n source: Track.Source.Microphone,\n publication: microphoneTrack,\n };\n }, [localParticipant, microphoneTrack]);\n\n if (!localPermissions) {\n visibleControls.microphone = false;\n } else {\n visibleControls.microphone ??= localPermissions.canPublish;\n }\n\n const htmlProps = mergeProps({ className: 'lk-agent-control-bar' }, props);\n\n const { saveAudioInputEnabled, saveAudioInputDeviceId } = usePersistentUserChoices({\n preventSave: !saveUserChoices,\n });\n\n const microphoneOnChange = React.useCallback(\n (enabled: boolean, isUserInitiated: boolean) => {\n if (isUserInitiated) {\n saveAudioInputEnabled(enabled);\n }\n },\n [saveAudioInputEnabled],\n );\n\n return (\n <div {...htmlProps}>\n {visibleControls.microphone && (\n <div className=\"lk-button-group\">\n <TrackToggle\n source={Track.Source.Microphone}\n showIcon={true}\n onChange={microphoneOnChange}\n onDeviceError={(error) => onDeviceError?.({ source: Track.Source.Microphone, error })}\n >\n <BarVisualizer trackRef={micTrackRef} barCount={7} options={{ minHeight: 5 }} />\n </TrackToggle>\n <div className=\"lk-button-group-menu\">\n <MediaDeviceMenu\n kind=\"audioinput\"\n onActiveDeviceChange={(_kind, deviceId) =>\n saveAudioInputDeviceId(deviceId ?? 'default')\n }\n />\n </div>\n </div>\n )}\n\n {visibleControls.leave && <DisconnectButton>{'Disconnect'}</DisconnectButton>}\n <StartMediaButton />\n </div>\n );\n}\n"],"names":["useMediaQuery","query","getMatches","matches","setMatches","React","handleChange","matchMedia","LKFeatureContext","useFeatureContext","require","ctx","ChatToggle","props","ref","mergedProps","useChatToggle","DisconnectButton","buttonProps","useDisconnectButton","SvgCameraDisabledIcon","SvgCameraIcon","SvgChatCloseIcon","SvgChatIcon","SvgChevron","SvgFocusToggleIcon","SvgGearIcon","SvgLeaveIcon","SvgLockLockedIcon","SvgMicDisabledIcon","SvgMicIcon","SvgQualityExcellentIcon","SvgQualityGoodIcon","SvgQualityPoorIcon","SvgQualityUnknownIcon","SvgScreenShareIcon","SvgScreenShareStopIcon","SvgSpinnerIcon","SvgUnfocusToggleIcon","FocusToggle","trackRef","trackRefFromContext","useMaybeTrackRefContext","inFocus","useFocusToggle","LayoutContext","layoutContext","UnfocusToggleIcon","FocusToggleIcon","MediaDeviceSelect","kind","initialSelection","onActiveDeviceChange","onDeviceListChange","onDeviceSelectError","exactMatch","track","requestPermissions","onError","room","useMaybeRoomContext","previousActiveDeviceId","handleError","e","RoomEvent","devices","activeDeviceId","setActiveMediaDevice","className","useMediaDeviceSelect","handleActiveDeviceChange","deviceId","mergeProps","hasDefault","info","isActive","index","device","StartMediaButton","label","useRoomContext","audioProps","canPlayAudio","useStartAudio","canPlayVideo","useStartVideo","style","restProps","getSourceIcon","source","enabled","Track","MicIcon","MicDisabledIcon","CameraIcon","CameraDisabledIcon","ScreenShareStopIcon","ScreenShareIcon","getConnectionQualityIcon","quality","ConnectionQuality","QualityExcellentIcon","QualityGoodIcon","QualityPoorIcon","QualityUnknownIcon","TrackToggle","showIcon","useTrackToggle","isClient","setIsClient","ConnectionQualityIndicator","useConnectionQualityIndicator","elementProps","ParticipantName","participant","p","useEnsureParticipant","infoObserver","setupParticipantName","identity","name","useObservableState","TrackMutedIndicator","show","isMuted","useTrackMutedIndicator","showIndicator","htmlProps","SvgParticipantPlaceholder","useMediaTrackBySourceOrName","observerOptions","options","publication","setPublication","getTrackByIdentifier","setMuted","isSubscribed","setSubscribed","setTrack","orientation","setOrientation","previousElement","trackObserver","setupMediaTrack","isTrackReference","subscription","log","_a","_b","orientation_","FUNC_ERROR_TEXT","NAN","symbolTag","reTrim","reIsBadHex","reIsBinary","reIsOctal","freeParseInt","freeGlobal","global","freeSelf","root","objectProto","objectToString","nativeMax","nativeMin","now","debounce","func","wait","lastArgs","lastThis","maxWait","result","timerId","lastCallTime","lastInvokeTime","leading","maxing","trailing","toNumber","isObject","invokeFunc","time","args","thisArg","leadingEdge","timerExpired","remainingWait","timeSinceLastCall","timeSinceLastInvoke","shouldInvoke","trailingEdge","cancel","flush","debounced","isInvoking","value","type","isObjectLike","isSymbol","other","isBinary","lodash_debounce","useUnmount","funcRef","useRef","useEffect","useDebounceCallback","delay","debouncedFunc","useMemo","debouncedFuncInstance","wrappedFunc","useDebounceValue","initialValue","eq","left","right","unwrappedInitialValue","debouncedValue","setDebouncedValue","useState","previousValueRef","updateDebouncedValue","useIntersectionObserver","threshold","rootMargin","freezeOnceVisible","initialIsIntersecting","onChange","setRef","state","setState","callbackRef","frozen","observer","entries","thresholds","entry","isIntersecting","threshold2","prevRef","_a2","VideoTrack","onTrackClick","onClick","onSubscriptionStatusChanged","manageSubscription","trackReference","useEnsureTrackRef","mediaEl","intersectionEntry","useHooks.useIntersectionObserver","debouncedIntersectionEntry","useHooks.useDebounceValue","RemoteTrackPublication","pub","clickHandler","evt","AudioTrack","volume","RemoteAudioTrack","ParticipantContextIfNeeded","hasContext","useMaybeParticipantContext","ParticipantContext","TrackRefContextIfNeeded","TrackRefContext","ParticipantTile","children","onParticipantClick","disableSpeakingIndicator","useParticipantTile","isEncrypted","useIsEncrypted","useMaybeLayoutContext","autoManageSubscription","handleSubscribe","subscribed","isTrackReferencePinned","ParticipantPlaceholder","LockLockedIcon","FocusLayoutContainer","FocusLayout","TrackLoop","tracks","getTrackReferenceId","cloneSingleChild","PaginationControl","totalPageCount","nextPage","prevPage","currentPage","connectedElement","interactive","setInteractive","createInteractingObservable","PaginationIndicator","bubbles","_","GridLayout","gridEl","layout","useGridLayout","pagination","usePagination","useSwipe","MIN_HEIGHT","MIN_WIDTH","MIN_VISIBLE_TILES","ASPECT_RATIO","ASPECT_RATIO_INVERT","CarouselLayout","asideEl","prevTiles","setPrevTiles","width","height","useSize","carouselOrientation","tileSpan","scrollBarWidth","getScrollBarWidth","tilesThatFit","maxVisibleTiles","sortedTiles","useVisualStableUpdate","LayoutContextProvider","onPinChange","onWidgetChange","layoutContextValue","useEnsureCreateLayoutContext","RoomAudioRenderer","muted","useTracks","Toast","generateConnectingSequenceBar","columns","seq","x","generateListeningSequenceBar","useBarAnimator","interval","setIndex","sequence","setSequence","idx","animationFrameId","startTime","animate","prev","sequencerIntervals","getSequencerInterval","barCount","BarVisualizer","targetTrack","volumeBands","useMultibandTrackVolume","minHeight","maxHeight","highlightedIndices","ParticipantAudioTile","ConnectionStateToast","notification","setNotification","useConnectionState","ConnectionState","SpinnerIcon","ChatEntry","hideName","hideTimestamp","messageFormatter","formattedMessage","hasBeenEdited","locale","_c","_d","file","formatChatMessageLinks","message","tokenize","createDefaultGrammar","tok","i","content","href","Chat","messageDecoder","messageEncoder","channelTopic","ulRef","inputRef","chatOptions","chatMessages","send","isSending","useChat","lastReadMsgAt","handleSubmit","event","unreadMessageCount","msg","widget","_e","ChatCloseIcon","allMsg","ev","MediaDeviceMenu","isOpen","setIsOpen","setDevices","updateRequired","setUpdateRequired","needPermissions","setNeedPermissions","button","tooltip","cleanup","computeMenuPosition","y","handleClickOutside","wasClickOutside","useWarnAboutMissingStyles","warnAboutMissingStyles","usePreviewTracks","setTracks","trackLock","Mutex","needsCleanup","localTracks","unlock","createLocalTracks","tr","roomOptionsStringifyReplacer","usePreviewDevice","deviceError","setDeviceError","isCreatingTrack","setIsCreatingTrack","useMediaDevices","selectedDevice","setSelectedDevice","localTrack","setLocalTrack","localDeviceId","setLocalDeviceId","createTrack","createLocalVideoTrack","VideoPresets","createLocalAudioTrack","newDeviceId","prevDeviceId","switchDevice","id","dev","PreJoin","defaults","onValidate","onSubmit","debug","joinLabel","micLabel","camLabel","userLabel","persistUserChoices","videoProcessor","initialUserChoices","saveAudioInputDeviceId","saveAudioInputEnabled","saveVideoInputDeviceId","saveVideoInputEnabled","saveUsername","usePersistentUserChoices","userChoices","setUserChoices","audioEnabled","setAudioEnabled","videoEnabled","setVideoEnabled","audioDeviceId","setAudioDeviceId","videoDeviceId","setVideoDeviceId","username","setUsername","videoEl","videoTrack","facingMode","facingModeFromLocalTrack","audioTrack","isValid","setIsValid","handleValidation","values","newUserChoices","inputEl","useSettingsToggle","dispatch","useLayoutContext","SettingsMenuToggle","trackSourceToProtocol","ControlBar","variation","controls","saveUserChoices","onDeviceError","isChatOpen","setIsChatOpen","defaultVariation","visibleControls","localPermissions","useLocalParticipantPermissions","canPublishSource","showText","browserSupportsScreenSharing","supportsScreenSharing","isScreenShareEnabled","setIsScreenShareEnabled","onScreenShareChange","microphoneOnChange","isUserInitiated","cameraOnChange","error","_kind","ChatIcon","GearIcon","LeaveIcon","VideoConference","chatMessageFormatter","chatMessageDecoder","chatMessageEncoder","SettingsComponent","controlBarProps","widgetState","setWidgetState","lastAutoFocusedScreenShareTrack","widgetUpdate","useCreateLayoutContext","screenShareTracks","focusTrack","usePinnedTracks","carouselTracks","isEqualTrackRef","updatedFocusTrack","_f","isWeb","AudioConference","audioTracks","VoiceAssistantControlBar","microphoneTrack","localParticipant","useLocalParticipant","micTrackRef"],"mappings":"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","x_google_ignoreList":[33,34]}
|