{"version":3,"file":"index.cjs","sources":["../src/utils/mediasfuRooms.ts","../src/react-legacy/src/methods/utils/validateAlphanumeric.ts","../src/react-legacy/src/producers/producerEmits/joinConRoom.ts","../src/react-legacy/src/methods/utils/getOverlayPosition.ts","../src/react-legacy/src/sockets/SocketManager.ts","../src/react-legacy/src/consumers/generatePageContent.ts","../src/react-legacy/src/methods/streamMethods/clickVideo.ts","../src/react-legacy/src/methods/utils/producer/aParams.ts","../src/react-legacy/src/methods/utils/producer/hParams.ts","../src/react-legacy/src/methods/utils/producer/screenParams.ts","../src/react-legacy/src/methods/utils/producer/vParams.ts","../src/react-legacy/src/methods/utils/joinRoomOnMediaSFU.ts","../src/react-legacy/src/methods/utils/meetingTimer/startMeetingProgressTimer.ts","../src/react-legacy/src/methods/utils/formatNumber.ts","../src/react-legacy/src/methods/utils/sleep.ts","../src/react-legacy/src/methods/pollsMethods/pollUpdated.ts","../src/react-legacy/src/methods/streamMethods/clickAudio.ts","../src/react-legacy/src/methods/streamMethods/clickScreenShare.ts","../src/react-legacy/src/methods/whiteboardMethods/captureCanvasStream.ts","../src/react-legacy/src/ProducerClient/producerClientEmits/createDeviceClient.ts","../src/react-legacy/src/producers/producerEmits/joinRoom.ts","../src/react-legacy/src/ProducerClient/producerClientEmits/joinRoomClient.ts","../src/react-legacy/src/methods/utils/producer/videoCaptureConstraints.ts","../src/react-legacy/src/ProducerClient/producerClientEmits/updateRoomParametersClient.ts","../src/react-legacy/src/methods/utils/checkLimitsAndMakeRequest.ts","../src/react-legacy/src/producers/producerEmits/joinLocalRoom.ts","../src/react-legacy/src/producers/socketReceiveMethods/allMembers.ts","../src/react-legacy/src/producers/socketReceiveMethods/allMembersRest.ts","../src/react-legacy/src/producers/socketReceiveMethods/allWaitingRoomMembers.ts","../src/react-legacy/src/producers/socketReceiveMethods/banParticipant.ts","../src/react-legacy/src/producers/socketReceiveMethods/controlMediaHost.ts","../src/react-legacy/src/producers/socketReceiveMethods/disconnect.ts","../src/react-legacy/src/producers/socketReceiveMethods/disconnectUserSelf.ts","../src/react-legacy/src/producers/socketReceiveMethods/getDomains.ts","../src/react-legacy/src/producers/socketReceiveMethods/hostRequestResponse.ts","../src/react-legacy/src/producers/socketReceiveMethods/meetingEnded.ts","../src/react-legacy/src/producers/socketReceiveMethods/meetingStillThere.ts","../src/react-legacy/src/producers/socketReceiveMethods/meetingTimeRemaining.ts","../src/react-legacy/src/producers/socketReceiveMethods/participantRequested.ts","../src/react-legacy/src/producers/socketReceiveMethods/personJoined.ts","../src/react-legacy/src/producers/socketReceiveMethods/producerMediaClosed.ts","../src/react-legacy/src/producers/socketReceiveMethods/producerMediaPaused.ts","../src/react-legacy/src/producers/socketReceiveMethods/producerMediaResumed.ts","../src/react-legacy/src/producers/socketReceiveMethods/reInitiateRecording.ts","../src/react-legacy/src/producers/socketReceiveMethods/receiveMessage.ts","../src/react-legacy/src/methods/utils/SoundPlayer.ts","../src/react-legacy/src/producers/socketReceiveMethods/recordingNotice.ts","../src/react-legacy/src/producers/socketReceiveMethods/roomRecordParams.ts","../src/react-legacy/src/producers/socketReceiveMethods/screenProducerId.ts","../src/react-legacy/src/producers/socketReceiveMethods/startRecords.ts","../src/react-legacy/src/producers/socketReceiveMethods/stoppedRecording.ts","../src/react-legacy/src/producers/socketReceiveMethods/timeLeftRecording.ts","../src/react-legacy/src/producers/socketReceiveMethods/updateConsumingDomains.ts","../src/react-legacy/src/producers/socketReceiveMethods/updateMediaSettings.ts","../src/react-legacy/src/producers/socketReceiveMethods/updatedCoHost.ts","../src/react-legacy/src/producers/socketReceiveMethods/userWaiting.ts","../src/react-legacy/src/methods/utils/createRoomOnMediaSFU.ts","../src/react-legacy/src/components/miscComponents/WelcomePage.tsx","../src/react-legacy/src/consumers/controlMedia.ts","../src/components/displayComponents/CardVideoDisplay.vue","../src/components/displayComponents/VideoCard.vue","../src/components/displayComponents/MiniCard.vue","../src/components/displayComponents/AudioCard.vue","../src/consumers/addVideosGrid.ts","../src/components/displayComponents/MiniAudio.vue","../src/methods/utils/MiniAudioPlayer/MiniAudioPlayer.vue","../src/consumers/consumerResume.ts","../src/consumers/prepopulateUserMedia.ts","../src/react-legacy/src/methods/utils/initialValuesState.ts","../src/components/displayComponents/MainAspectComponent.vue","../src/components/displayComponents/LoadingModal.vue","../src/components/displayComponents/ControlButtonsComponent.vue","../src/components/displayComponents/ControlButtonsAltComponent.vue","../src/components/displayComponents/ControlButtonsComponentTouch.vue","../src/components/displayComponents/MeetingProgressTimer.vue","../src/components/displayComponents/OtherGridComponent.vue","../src/components/displayComponents/MainScreenComponent.vue","../src/components/displayComponents/MainGridComponent.vue","../src/components/displayComponents/SubAspectComponent.vue","../src/components/displayComponents/MainContainerComponent.vue","../src/components/displayComponents/AlertComponent.vue","../src/components/menuComponents/MeetingIDComponent.vue","../src/components/menuComponents/MeetingPasscodeComponent.vue","../src/components/menuComponents/ShareButtonsComponent.vue","../src/components/menuComponents/CustomButtons.vue","../src/components/menuComponents/MenuModal.vue","../src/components/recordingComponents/StandardPanelComponent.vue","../src/components/recordingComponents/AdvancedPanelComponent.vue","../src/components/recordingComponents/RecordingModal.vue","../src/components/requestsComponents/RenderRequestComponent.vue","../src/components/requestsComponents/RequestsModal.vue","../src/components/waitingComponents/WaitingModal.vue","../src/components/displaySettingsComponents/DisplaySettingsModal.vue","../src/components/eventSettingsComponents/EventSettingsModal.vue","../src/components/coHostComponents/CoHostModal.vue","../src/components/participantsComponents/ParticipantListItem.vue","../src/components/participantsComponents/ParticipantList.vue","../src/components/participantsComponents/ParticipantListOthersItem.vue","../src/components/participantsComponents/ParticipantListOthers.vue","../src/components/participantsComponents/ParticipantsModal.vue","../src/components/messageComponents/MessagePanel.vue","../src/components/messageComponents/MessagesModal.vue","../src/components/mediaSettingsComponents/MediaSettingsModal.vue","../src/components/exitComponents/ConfirmExitModal.vue","../src/components/miscComponents/ConfirmHereModal.vue","../src/components/miscComponents/ShareEventModal.vue","../src/components/miscComponents/WelcomePage.vue","../src/components/miscComponents/PreJoinPage.vue","../src/components/pollsComponents/PollModal.vue","../src/components/backgroundComponents/BackgroundModal.vue","../src/components/breakoutComponents/RoomList.vue","../src/components/breakoutComponents/EditRoomModal.vue","../src/components/breakoutComponents/BreakoutRoomsModal.vue","../src/components/whiteboardComponents/ConfigureWhiteboardModal.vue","../src/components/whiteboardComponents/Whiteboard.vue","../src/components/screenboardComponents/Screenboard.vue","../src/components/screenboardComponents/ScreenboardModal.vue","../src/components/displayComponents/Pagination.vue","../src/components/displayComponents/FlexibleGrid.vue","../src/components/displayComponents/FlexibleVideo.vue","../src/components/displayComponents/AudioGrid.vue","../src/components/displayComponents/MiniCardAudio.vue","../src/composables/useUIOverrides.ts","../src/react-legacy/src/methods/utils/webrtc/webrtc.ts","../src/react-legacy/src/methods/utils/createResponseJoinRoom.ts","../src/components/mediasfuComponents/MediasfuGeneric.vue","../src/components/mediasfuComponents/MediasfuBroadcast.vue","../src/components/mediasfuComponents/MediasfuChat.vue","../src/components/mediasfuComponents/MediasfuConference.vue","../src/components/mediasfuComponents/MediasfuWebinar.vue","../src/components/menuComponents/MenuItemComponent.vue","../src/composables/useBackgroundModal.ts","../src/composables/useMenuModal.ts","../src/composables/useMediasfu.ts","../src/composables/useMediasfuDemo.ts"],"sourcesContent":["import type {\n  CreateJoinRoomError,\n  CreateJoinRoomResponse,\n  CreateJoinRoomType,\n  CreateMediaSFURoomOptions,\n  JoinMediaSFURoomOptions,\n  JoinRoomOnMediaSFUType,\n} from 'mediasfu-shared'\n\n/**\n * Shared utility that wraps MediaSFU room API requests for both create and join flows.\n * The functions mirror the React SDK helpers so the Vue guides can reference the same behaviour.\n */\n\nconst isCredentialInvalid = (apiUserName: string, apiKey: string) => {\n  return (\n    !apiUserName ||\n    !apiKey ||\n    apiUserName === 'yourAPIUSERNAME' ||\n    apiKey === 'yourAPIKEY' ||\n    apiKey.length !== 64 ||\n    apiUserName.length < 6\n  )\n}\n\nconst normaliseLocalLink = (link: string) => link.replace(/\\/$/, '')\n\nconst getStorage = () => {\n  if (typeof window === 'undefined' || !('localStorage' in window)) {\n    return undefined\n  }\n  return window.localStorage\n}\n\nconst withPendingGuard = async <T>(\n  key: string,\n  task: () => Promise<T>,\n  timeoutMs = 30 * 1000,\n): Promise<T> => {\n  const storage = getStorage()\n  if (!storage) {\n    return task()\n  }\n\n  const storageKey = `mediasfu_pending_${key}`\n  try {\n    const existing = storage.getItem(storageKey)\n    if (existing) {\n      const parsed = JSON.parse(existing) as { timestamp: number }\n      if (Date.now() - parsed.timestamp < timeoutMs) {\n        throw Object.assign(new Error('Room creation already in progress'), {\n          mediasfuPending: true,\n        })\n      }\n      storage.removeItem(storageKey)\n    }\n\n    storage.setItem(storageKey, JSON.stringify({ timestamp: Date.now() }))\n\n    const result = await task()\n\n    storage.removeItem(storageKey)\n    return result\n  } catch (error) {\n    if (error instanceof Error && (error as any).mediasfuPending) {\n      throw error\n    }\n\n    storage.removeItem(storageKey)\n    throw error\n  }\n}\n\nexport const createRoomOnMediaSFU: CreateJoinRoomType = async ({\n  payload,\n  apiUserName,\n  apiKey,\n  localLink = '',\n}: {\n  payload: CreateMediaSFURoomOptions | JoinMediaSFURoomOptions\n  apiUserName: string\n  apiKey: string\n  localLink?: string\n}) => {\n  const roomIdentifier =\n    payload.action === 'create'\n      ? `create_${payload.userName}_${(payload as CreateMediaSFURoomOptions).duration}_${(payload as CreateMediaSFURoomOptions).capacity}`\n      : `join_${(payload as JoinMediaSFURoomOptions).meetingID ?? 'unknown'}_${payload.userName}`\n\n  const execute = async (): Promise<{ data: CreateJoinRoomResponse | CreateJoinRoomError | null; success: boolean }> => {\n    try {\n      if (isCredentialInvalid(apiUserName, apiKey)) {\n        return { data: { error: 'Invalid credentials' }, success: false }\n      }\n\n      let finalLink = 'https://mediasfu.com/v1/rooms/'\n      if (localLink && localLink.trim() !== '' && !localLink.includes('mediasfu.com')) {\n        finalLink = `${normaliseLocalLink(localLink)}/createRoom`\n      }\n\n      const response = await fetch(finalLink, {\n        method: 'POST',\n        headers: {\n          'Content-Type': 'application/json',\n          Authorization: `Bearer ${apiUserName}:${apiKey}`,\n        },\n        body: JSON.stringify(payload),\n      })\n\n      if (!response.ok) {\n        throw new Error(`HTTP error! Status: ${response.status}`)\n      }\n\n      const data: CreateJoinRoomResponse = await response.json()\n      return { data, success: true }\n    } catch (error) {\n      const message = (error as Error).message ?? 'unknown error'\n      return {\n        data: { error: `Unable to create room, ${message}` },\n        success: false,\n      }\n    }\n  }\n\n  try {\n    return await withPendingGuard(roomIdentifier, execute)\n  } catch (error) {\n    if (error instanceof Error && (error as any).mediasfuPending) {\n      return {\n        data: { error: 'Room creation already in progress' },\n        success: false,\n      }\n    }\n\n    const message = (error as Error).message ?? 'unknown error'\n    return {\n      data: { error: `Unable to create room, ${message}` },\n      success: false,\n    }\n  }\n}\n\nexport const joinRoomOnMediaSFU: JoinRoomOnMediaSFUType = async ({\n  payload,\n  apiUserName,\n  apiKey,\n  localLink = '',\n}: {\n  payload: JoinMediaSFURoomOptions\n  apiUserName: string\n  apiKey: string\n  localLink?: string\n}) => {\n  try {\n    if (isCredentialInvalid(apiUserName, apiKey)) {\n      return { data: { error: 'Invalid credentials' }, success: false }\n    }\n\n    let finalLink = 'https://mediasfu.com/v1/rooms/'\n    if (localLink && localLink.trim() !== '' && !localLink.includes('mediasfu.com')) {\n      finalLink = `${normaliseLocalLink(localLink)}/joinRoom`\n    }\n\n    const response = await fetch(finalLink, {\n      method: 'POST',\n      headers: {\n        'Content-Type': 'application/json',\n        Authorization: `Bearer ${apiUserName}:${apiKey}`,\n      },\n      body: JSON.stringify(payload),\n    })\n\n    if (!response.ok) {\n      throw new Error(`HTTP error! Status: ${response.status}`)\n    }\n\n    const data: CreateJoinRoomResponse = await response.json()\n    return { data, success: true }\n  } catch (error) {\n    const reason = (error as Error).message ?? 'unknown error'\n    return {\n      data: { error: `Unable to join room, ${reason}` },\n      success: false,\n    }\n  }\n}\n","\nexport interface ValidateAlphanumericOptions {\n  str: string;\n}\n\n// Export the type definition for the function\nexport type ValidateAlphanumericType = (options: ValidateAlphanumericOptions) => Promise<boolean>;\n\n/**\n * Validates if the given string contains only alphanumeric characters.\n *\n * @param {ValidateAlphanumericOptions} options - The options containing the string to validate.\n * @param {string} options.str - The string to be validated.\n * @returns {Promise<boolean>} - A promise that resolves to `true` if the string is alphanumeric, otherwise `false`.\n * \n * @example\n * ```typescript \n * const isValid = await validateAlphanumeric({ str: \"abc123\" });\n * console.log(isValid);\n * // Output: true\n * ```\n */\n\n\nconst validateAlphanumeric = async ({ str }: ValidateAlphanumericOptions): Promise<boolean> => {\n  let code: number, i: number, len: number;\n\n  for (i = 0, len = str.length; i < len; i++) {\n    code = str.charCodeAt(i);\n    if (\n      !(code > 47 && code < 58) && // numeric (0-9)\n      !(code > 64 && code < 91) && // upper alpha (A-Z)\n      !(code > 96 && code < 123)   // lower alpha (a-z)\n    ) {\n      return false;\n    }\n  }\n  return true;\n};\n\nexport { validateAlphanumeric };\n","import type { Socket } from \"socket.io-client\";\nimport { validateAlphanumeric } from \"../../methods/utils/validateAlphanumeric\"; // Import the validateAlphanumeric function from the validateAlphanumeric file\nimport type { RtpCapabilities } from \"mediasoup-client\";\n\nexport interface JoinConRoomOptions {\n  socket: Socket;\n  roomName: string;\n  islevel: string;\n  member: string;\n  sec: string;\n  apiUserName: string;\n}\n\nexport interface JoinConRoomResponse {\n  success: boolean;\n  rtpCapabilities: RtpCapabilities | null;\n  reason?: string;\n  banned?: boolean;\n  suspended?: boolean;\n  noAdmin?: boolean;\n  [key: string]: any;\n}\n\n\n// Export the type definition for the function\nexport type JoinConRoomType = (options: JoinConRoomOptions) => Promise<JoinConRoomResponse>;\n\n/**\n * Joins a conference room using the provided options.\n *\n * @param {JoinConRoomOptions} options - The options for joining the conference room.\n * @param {Socket} options.socket - The socket instance to use for communication.\n * @param {string} options.roomName - The name of the room to join.\n * @param {string} options.islevel - The level of the user.\n * @param {string} options.member - The member identifier.\n * @param {string} options.sec - The security token.\n * @param {string} options.apiUserName - The API username.\n * \n * @returns {Promise<JoinConRoomResponse>} A promise that resolves with the response of the join operation.\n *\n * @example\n * ```typescript\n * const options = {\n *   socket: socketInstance,\n *   roomName: \"s12345678\",\n *   islevel: \"1\",\n *   member: \"user123\",\n *   sec: \"64CharacterLongSecretHere\",\n *   apiUserName: \"user123\",\n * };\n *\n * try {\n *   const response = await joinConRoom(options);\n *   console.log(\"Room joined:\", response);\n * } catch (error) {\n *   console.error(\"Failed to join room:\", error);\n * }\n * ```\n */\n\nexport async function joinConRoom(\n  { socket, roomName, islevel, member, sec, apiUserName }: JoinConRoomOptions\n): Promise<JoinConRoomResponse> {\n  return new Promise((resolve, reject) => {\n    // Validate inputs\n    if (!(sec && roomName && islevel && apiUserName && member)) {\n      const validationError: JoinConRoomResponse = {\n        success: false,\n        rtpCapabilities: null,\n        reason: \"Missing required parameters\",\n      };\n      reject(validationError);\n      return;\n    }\n\n    // Validate alphanumeric for roomName, apiUserName, and member\n    try {\n      validateAlphanumeric({ str: roomName });\n      validateAlphanumeric({ str: apiUserName });\n      validateAlphanumeric({ str: member });\n    } catch {\n      const validationError: JoinConRoomResponse = {\n        success: false,\n        rtpCapabilities: null,\n        reason: \"Invalid roomName or apiUserName or member\",\n      };\n      reject(validationError);\n      return;\n    }\n\n    // Validate roomName starts with 's' or 'p'\n    if (!(roomName.startsWith(\"s\") || roomName.startsWith(\"p\"))) {\n      const validationError: JoinConRoomResponse = {\n        success: false,\n        rtpCapabilities: null,\n        reason: \"Invalid roomName, must start with s or p\",\n      };\n      reject(validationError);\n      return;\n    }\n\n    // Validate other conditions for sec, roomName, islevel, apiUserName\n    if (\n      !(\n        sec.length === 64 &&\n        roomName.length >= 8 &&\n        islevel.length === 1 &&\n        apiUserName.length >= 6 &&\n        (islevel == \"0\" || islevel == \"1\" || islevel == \"2\")\n      )\n    ) {\n      const validationError: JoinConRoomResponse = {\n        success: false,\n        rtpCapabilities: null,\n        reason: \"Invalid roomName or islevel or apiUserName or secret\",\n      };\n      reject(validationError);\n      return;\n    }\n\n    socket.emit(\n      \"joinConRoom\",\n      { roomName, islevel, member, sec, apiUserName },\n      async (data: JoinConRoomResponse) => {\n        try {\n          // Check if rtpCapabilities is null\n          if (data.rtpCapabilities == null) {\n            // Check if banned, suspended, or noAdmin\n            if (data.banned) {\n              throw new Error(\"User is banned.\");\n            }\n            if (data.suspended) {\n              throw new Error(\"User is suspended.\");\n            }\n            if (data.noAdmin) {\n              throw new Error(\"Host has not joined the room yet.\");\n            }\n\n            // Resolve with the data received from the 'joinConRoom' event\n            resolve(data);\n          } else {\n            // Handle other cases or perform additional actions\n            resolve(data);\n          }\n        } catch (error) {\n          // Handle errors during the joinConRoom process\n          console.log(\"Error joining room:\", error);\n          reject(error);\n        }\n      }\n    );\n  });\n}\n","import type { OverlayPositionStyle } from \"../../@types/types\";\nexport interface GetOverlayPositionOptions {\n  position: string;\n}\n\n// Export the type definition for the function\nexport type GetOverlayPositionType = (options: GetOverlayPositionOptions) => OverlayPositionStyle;\n\n/**\n * Gets the style for positioning an overlay based on the specified position.\n * \n * @param {GetOverlayPositionOptions} options - Configuration specifying the overlay position.\n * @returns {OverlayPositionStyle} - The style object for positioning the overlay.\n *\n * @example\n * ```typescript\n * const topLeftStyle = getOverlayPosition({ position: \"topLeft\" });\n * console.log(topLeftStyle);\n * // Output: { top: 0, left: 0 }\n *\n * const bottomRightStyle = getOverlayPosition({ position: \"bottomRight\" });\n * console.log(bottomRightStyle);\n * // Output: { bottom: 0, right: 0 }\n * ```\n */\n\nexport const getOverlayPosition = ({ position }: GetOverlayPositionOptions): OverlayPositionStyle => {\n  switch (position) {\n    case \"topLeft\":\n      return { top: 0, left: 0 };\n    case \"topRight\":\n      return { top: 0, right: 0 };\n    case \"bottomLeft\":\n      return { bottom: 0, left: 0 };\n    case \"bottomRight\":\n      return { bottom: 0, right: 0 };\n    default:\n      return {};\n  }\n};\n","\n// Socket manager for media socket.\nimport { MeetingRoomParams, RecordingParams } from '../@types/types';\nimport io, { Socket } from 'socket.io-client'; // Importing socket type\n\n/**\n * Validates the provided API key or token.\n * @param {string} value - The API key or token to validate.\n * @returns {Promise<Boolean>} - True if the API key or token is valid, false otherwise.\n */\nasync function validateApiKeyToken(value: string): Promise<boolean> {\n  // API key or token must be alphanumeric and length 64\n  if (!/^[a-z0-9]{64}$/i.test(value)) {\n    throw new Error('Invalid API key or token.');\n  }\n  return true;\n}\n\nexport interface ResponseLocalConnection {\n  socket?: Socket;\n  data?: ResponseLocalConnectionData;\n}\n\nexport interface ResponseLocalConnectionData {\n  socketId: string;\n  mode: string;\n  apiUserName?: string;\n  apiKey?: string;\n  allowRecord: boolean;\n  meetingRoomParams_: MeetingRoomParams;\n  recordingParams_: RecordingParams;\n}\n\nexport interface ConnectLocalSocketOptions {\n  link: string;\n}\n\nexport interface ConnectSocketOptions {\n  apiUserName: string;\n  apiKey?: string;\n  apiToken?: string;\n  link: string;\n}\n\nexport interface DisconnectSocketOptions {\n  socket: Socket;\n}\n\n// Export the type definition for the function\nexport type ConnectSocketType = (options: ConnectSocketOptions) => Promise<Socket>;\nexport type DisconnectSocketType = (options: DisconnectSocketOptions) => Promise<boolean>;\nexport type ConnectLocalSocketType = (options: ConnectLocalSocketOptions) => Promise<ResponseLocalConnection>;\n\n\n/**\n * Connects to a media socket using the provided connection options.\n *\n * @param {ConnectSocketOptions} options - The connection options.\n * @param {string} options.apiUserName - The API username.\n * @param {string} [options.apiKey] - The API key (optional if apiToken is provided).\n * @param {string} [options.apiToken] - The API token (optional if apiKey is provided).\n * @param {string} options.link - The socket link.\n *\n * @returns {Promise<Socket>} A promise that resolves to the connected socket.\n *\n * @example\n * ```typescript\n * const options = {\n *   apiUserName: 'user123',\n *   apiKey: 'yourApiKeyHere',\n *   link: 'https://socketlink.com',\n * };\n *\n * try {\n *   const socket = await connectSocket(options);\n *   console.log('Connected to socket:', socket);\n * } catch (error) {\n *   console.error('Failed to connect to socket:', error);\n * }\n * ```\n */\n\nasync function connectSocket(\n  { apiUserName, apiKey, apiToken, link }: ConnectSocketOptions,\n): Promise<Socket> {\n  // Validate inputs\n  if (!apiUserName) {\n    throw new Error('API username required.');\n  }\n  if (!(apiKey || apiToken)) {\n    throw new Error('API key or token required.');\n  }\n  if (!link) {\n    throw new Error('Socket link required.');\n  }\n\n  // Validate the API key or token\n  let useKey = false;\n  try {\n    if (apiKey && apiKey.length === 64) {\n      await validateApiKeyToken(apiKey);\n      useKey = true;\n    } else if (apiToken && apiToken.length === 64) {\n      await validateApiKeyToken(apiToken);\n      useKey = false;\n    } else {\n      throw new Error('Invalid API key or token format.');\n    }\n  } catch {\n    throw new Error('Invalid API key or token.');\n  }\n\n  let socket: Socket;\n\n  return new Promise((resolve, reject) => {\n    // Connect to socket using the link provided\n    if (useKey) {\n      socket = io(`${link}/media`, {\n        transports: ['websocket'],\n        query: {\n          apiUserName: apiUserName,\n          apiKey: apiKey!,\n        },\n      });\n    } else {\n      socket = io(`${link}/media`, {\n        transports: ['websocket'],\n        query: {\n          apiUserName: apiUserName,\n          apiToken: apiToken!,\n        },\n      });\n    }\n\n    // Handle socket connection events\n    socket.on('connection-success', ({ socketId }: { socketId: string }) => {\n      //check if link contains mediasfu.com and contains more than one c\n      let conn = 'media';\n      try {\n        if (link.includes('mediasfu.com') && (link.match(/c/g)?.length ?? 0) > 1) {\n          conn = 'consume';\n        }\n      } catch {\n        // do nothing\n      }\n\n      console.log(`Connected to ${conn} socket with ID: ${socketId}`);\n      resolve(socket);\n    });\n\n    socket.on('connect_error', (error: Error) => {\n      reject(new Error('Error connecting to media socket: ' + error.message));\n    });\n  });\n}\n\n\n/**\n * Connects to a local media socket using the provided connection options.\n *\n * @param {ConnectLocalSocketOptions} options - The connection options.\n * @param {string} options.link - The socket link.\n *\n * @returns {Promise<ResponseLocalConnection>} A promise that resolves to the connected socket and data.\n *\n * @example\n * ```typescript\n * const options = {\n *   link: 'http://localhost:3000',\n * };\n *\n * try {\n *   const { socket, data } = await connectLocalSocket(options);\n *   console.log('Connected to socket:', socket, data);\n * } catch (error) {\n *   console.error('Failed to connect to socket:', error);\n * }\n * ```\n */\n\nasync function connectLocalSocket({ link }: ConnectLocalSocketOptions): Promise<ResponseLocalConnection> {\n  if (!link) {\n    throw new Error('Socket link required.');\n  }\n\n  let socket: Socket;\n\n  return new Promise((resolve, reject) => {\n    // Connect to socket using the link provided\n    socket = io(`${link}/media`, {\n      transports: ['websocket'],\n    });\n\n\n    // Handle socket connection events\n    socket.on('connection-success', (data: ResponseLocalConnectionData) => {\n      resolve({ socket, data });\n    });\n\n    socket.on('connect_error', (error: Error) => {\n      reject(new Error('Error connecting to media socket: ' + error.message));\n    });\n  });\n}\n\n/**\n * Disconnects from the socket.\n *\n * @param {Socket} socket - The socket instance to disconnect.\n * @returns {Promise<boolean>} - A promise that resolves once the socket is disconnected.\n *\n * @example\n * ```typescript\n * const options = { socket: socketInstance };\n *\n * try {\n *   const isDisconnected = await disconnectSocket(options);\n *   console.log('Disconnected:', isDisconnected);\n * } catch (error) {\n *   console.error('Failed to disconnect:', error);\n * }\n * ```\n */\n\nasync function disconnectSocket({ socket }: DisconnectSocketOptions): Promise<boolean> {\n  if (socket) {\n    socket.disconnect();\n  }\n  return true;\n}\n\nexport { connectSocket, disconnectSocket, connectLocalSocket };\n","import { Participant, Stream, DispStreamsType, DispStreamsParameters } from '../@types/types';\n\nexport interface GeneratePageContentParameters extends DispStreamsParameters {\n  paginatedStreams: (Participant | Stream)[][];\n  currentUserPage: number;\n  updateMainWindow: boolean;\n  updateCurrentUserPage: (page: number) => void;\n  updateUpdateMainWindow: (flag: boolean) => void;\n\n  // mediasfu functions\n  dispStreams: DispStreamsType;\n  getUpdatedAllParams: () => GeneratePageContentParameters;\n  [key: string]: any;\n}\n\nexport interface GeneratePageContentOptions {\n  page: number | string;\n  parameters: GeneratePageContentParameters;\n  breakRoom?: number;\n  inBreakRoom?: boolean;\n}\n\n// Export the type definition for the function\nexport type GeneratePageContentType = (options: GeneratePageContentOptions) => Promise<void>;\n\n/**\n * Generates the content for a specific page.\n *\n * @param {GeneratePageContentOptions} options - The options for generating page content.\n * @param {number | string} options.page - The page number to generate content for.\n * @param {GeneratePageContentParameters} options.parameters - The parameters required for generating content.\n * @param {Array} options.parameters.paginatedStreams - The streams to be paginated.\n * @param {number} options.parameters.currentUserPage - The current page of the user.\n * @param {Function} options.parameters.updateMainWindow - Function to update the main window flag.\n * @param {Function} options.parameters.updateCurrentUserPage - Function to update the current user page.\n * @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window update flag.\n * @param {Function} options.parameters.dispStreams - Function to display streams for the specified page.\n * @param {number} [options.breakRoom=-1] - The break room identifier.\n * @param {boolean} [options.inBreakRoom=false] - Flag indicating if the user is in a break room.\n * \n * @returns {Promise<void>} A promise that resolves when the content generation is complete.\n * \n * @throws {Error} Throws an error if content generation fails.\n * \n * @example\n * const options = {\n *   page: 1,\n *   parameters: {\n *     paginatedStreams: [[stream1, stream2], [stream3, stream4]], // Example paginated streams\n *     currentUserPage: 0,\n *     updateMainWindow: true,\n *     updateCurrentUserPage: (page) => console.log('Current user page updated to:', page),\n *     updateUpdateMainWindow: (flag) => console.log('Main window update flag:', flag),\n *     dispStreams: async ({ lStreams, ind }) => {\n *       console.log(`Displaying streams for page ${ind}:`, lStreams);\n *     },\n *   },\n *   breakRoom: 1,\n *   inBreakRoom: false,\n * };\n * \n * generatePageContent(options)\n *   .then(() => {\n *     console.log('Page content generated successfully');\n *   })\n *   .catch((error) => {\n *     console.error('Error generating page content:', error);\n *   });\n */\n\nexport async function generatePageContent({\n  page,\n  parameters,\n  breakRoom = -1,\n  inBreakRoom = false,\n}: GeneratePageContentOptions): Promise<void> {\n  try {\n    // Destructure parameters\n    let {\n      paginatedStreams,\n      currentUserPage,\n      updateMainWindow,\n\n      updateCurrentUserPage,\n      updateUpdateMainWindow,\n\n      //mediasfu functions\n      dispStreams,\n    } = parameters;\n\n    // Convert page to an integer\n    page = typeof page === \"string\" ? parseInt(page) : page;\n\n    // Update current user page\n    currentUserPage = page;\n    updateCurrentUserPage(currentUserPage);\n\n    // Update main window flag\n    updateMainWindow = true;\n    updateUpdateMainWindow(updateMainWindow);\n\n    // Display streams for the specified page\n    await dispStreams({\n      lStreams: paginatedStreams[page],\n      ind: page,\n      parameters,\n      breakRoom,\n      inBreakRoom,\n    });\n  } catch (error) {\n    // Handle errors during content generation\n    if (error instanceof Error) {\n      console.log(\"Error generating page content:\", error.message);\n    } else {\n      console.log(\"Error generating page content:\", error);\n    }\n  }\n}\n","import { Socket } from \"socket.io-client\";\nimport type { CheckPermissionType, DisconnectSendTransportVideoParameters, DisconnectSendTransportVideoType, RequestPermissionCameraType, ShowAlert, StreamSuccessVideoParameters, StreamSuccessVideoType, VidCons } from \"../../@types/types\";\n\nexport interface ClickVideoParameters extends DisconnectSendTransportVideoParameters, StreamSuccessVideoParameters {\n  checkMediaPermission: boolean;\n  hasCameraPermission: boolean;\n  videoAlreadyOn: boolean;\n  audioOnlyRoom: boolean;\n  recordStarted: boolean;\n  recordResumed: boolean;\n  recordPaused: boolean;\n  recordStopped: boolean;\n  recordingMediaOptions: string;\n  islevel: string;\n  youAreCoHost: boolean;\n  adminRestrictSetting: boolean;\n  videoRequestState: string | null;\n  videoRequestTime: number;\n  member: string;\n  socket: Socket;\n  roomName: string;\n  userDefaultVideoInputDevice: string;\n  currentFacingMode: string;\n  vidCons: VidCons;\n  frameRate: number;\n  videoAction: boolean;\n  localStream: MediaStream | null;\n  audioSetting: string;\n  videoSetting: string;\n  screenshareSetting: string;\n  chatSetting: string;\n  updateRequestIntervalSeconds: number;\n\n  showAlert?: ShowAlert;\n  updateVideoAlreadyOn: (value: boolean) => void;\n  updateVideoRequestState: (state: string) => void;\n  updateLocalStream: (stream: MediaStream | null) => void;\n  mediaDevices: MediaDevices;\n\n  streamSuccessVideo: StreamSuccessVideoType;\n  disconnectSendTransportVideo: DisconnectSendTransportVideoType;\n  requestPermissionCamera: RequestPermissionCameraType;\n  checkPermission: CheckPermissionType;\n\n  getUpdatedAllParams: () => ClickVideoParameters;\n  [key: string]: any;\n\n}\n\nexport interface ClickVideoOptions {\n  parameters: ClickVideoParameters;\n}\n\n// Export the type definition for the function\nexport type ClickVideoType = (options: ClickVideoOptions) => Promise<void>;\n\n/**\n * Handles the click event to toggle the participant's video on/off and manages video permission requests.\n *\n * @param {ClickVideoOptions} options - The function parameters.\n * @returns {Promise<void>}\n *\n * @example\n * ```typescript\n * clickVideo({\n *   parameters: {\n *     checkMediaPermission: true,\n *     hasCameraPermission: false,\n *     videoAlreadyOn: false,\n *     audioOnlyRoom: false,\n *     recordStarted: true,\n *     recordResumed: false,\n *     recordPaused: true,\n *     recordStopped: false,\n *     recordingMediaOptions: \"video\",\n *     islevel: \"1\",\n *     youAreCoHost: false,\n *     adminRestrictSetting: false,\n *     videoRequestState: null,\n *     videoRequestTime: Date.now(),\n *     member: \"John Doe\",\n *     socket: socketInstance,\n *     roomName: \"room123\",\n *     userDefaultVideoInputDevice: \"default\",\n *     currentFacingMode: \"user\",\n *     vidCons: { width: 1280, height: 720 },\n *     frameRate: 30,\n *     videoAction: false,\n *     localStream: null,\n *     audioSetting: \"allow\",\n *     videoSetting: \"allow\",\n *     screenshareSetting: \"allow\",\n *     chatSetting: \"allow\",\n *     updateRequestIntervalSeconds: 60,\n *     showAlert: showAlertFunction,\n *     updateVideoAlreadyOn: setVideoAlreadyOn,\n *     updateVideoRequestState: setVideoRequestState,\n *     updateLocalStream: setLocalStream,\n *     mediaDevices: navigator.mediaDevices,\n *     streamSuccessVideo: streamSuccessVideoFunction,\n *     disconnectSendTransportVideo: disconnectVideoTransportFunction,\n *     requestPermissionCamera: requestCameraPermissionFunction,\n *     checkPermission: checkPermissionFunction,\n *     getUpdatedAllParams: getUpdatedParamsFunction\n *   }\n * });\n * ```\n */\n\nexport const clickVideo = async ({ parameters }: ClickVideoOptions): Promise<void> => {\n  let {\n    checkMediaPermission,\n    hasCameraPermission,\n    videoAlreadyOn,\n    audioOnlyRoom,\n    recordStarted,\n    recordResumed,\n    recordPaused,\n    recordStopped,\n    recordingMediaOptions,\n    islevel,\n    youAreCoHost,\n    adminRestrictSetting,\n    videoRequestState,\n    videoRequestTime,\n    member,\n    socket,\n    roomName,\n    userDefaultVideoInputDevice,\n    currentFacingMode,\n    vidCons,\n    frameRate,\n    videoAction,\n    localStream,\n    audioSetting,\n    videoSetting,\n    screenshareSetting,\n    chatSetting,\n    updateRequestIntervalSeconds,\n    streamSuccessVideo,\n    showAlert,\n    updateVideoAlreadyOn,\n    updateVideoRequestState,\n    updateLocalStream,\n    mediaDevices,\n    disconnectSendTransportVideo,\n    requestPermissionCamera,\n    checkPermission,\n  } = parameters;\n\n  if (audioOnlyRoom) {\n    showAlert?.({\n      message: \"You cannot turn on your camera in an audio-only event.\",\n      type: \"danger\",\n      duration: 3000,\n    });\n    return;\n  }\n\n  if (videoAlreadyOn) {\n    if (islevel === \"2\" && (recordStarted || recordResumed)) {\n      if (!(recordPaused || recordStopped)) {\n        if (recordingMediaOptions === \"video\") {\n          showAlert?.({\n            message: \"You cannot turn off your camera while recording video, please pause or stop recording first.\",\n            type: \"danger\",\n            duration: 3000,\n          });\n          return;\n        }\n      }\n    }\n\n    videoAlreadyOn = false;\n    updateVideoAlreadyOn(videoAlreadyOn);\n    const videoTrack = localStream?.getVideoTracks()?.[0];\n    if (videoTrack) {\n      videoTrack.enabled = false;\n    }\n    updateLocalStream(localStream ?? null);\n    await disconnectSendTransportVideo({ parameters });\n  } else {\n    if (adminRestrictSetting) {\n      showAlert?.({\n        message: \"You cannot turn on your camera. Access denied by host.\",\n        duration: 3000,\n        type: \"danger\",\n      });\n      return;\n    }\n\n    let response = 2;\n\n    if (!videoAction && islevel !== \"2\" && !youAreCoHost) {\n      response = await checkPermission({\n        permissionType: \"videoSetting\",\n        audioSetting, videoSetting, screenshareSetting, chatSetting,\n      });\n    } else {\n      response = 0;\n    }\n\n    if (response == 1) {\n      //approval\n      //check if request is pending or not\n      if (videoRequestState === \"pending\") {\n        showAlert?.({\n          message: \"A request is pending. Please wait for the host to respond.\",\n          type: \"danger\",\n          duration: 3000,\n        });\n        return;\n      }\n      // check if rejected and current time is less than videoRequestTime\n      if (videoRequestState === \"rejected\" && Date.now() - videoRequestTime < updateRequestIntervalSeconds) {\n        showAlert?.({\n          message: `A request was rejected. Please wait for ${updateRequestIntervalSeconds} seconds before sending another request.`,\n          type: \"danger\",\n          duration: 3000,\n        });\n        return;\n      }\n\n      // send request to host\n      showAlert?.({\n        message: \"Request sent to host.\",\n        type: \"success\",\n        duration: 3000,\n      });\n      videoRequestState = \"pending\";\n      updateVideoRequestState(videoRequestState);\n\n      const userRequest = { id: socket.id, name: member, icon: \"fa-video\" };\n      await socket.emit(\"participantRequest\", { userRequest, roomName });\n    } else if (response === 2) {\n      //if video permission is set to deny then show alert\n      showAlert?.({\n        message: \"You cannot turn on your camera. Access denied by host.\",\n        type: \"danger\",\n        duration: 3000,\n      });\n    } else {\n      //if video permission is set to allow then turn on video\n\n      //first check if permission is granted\n      if (!hasCameraPermission) {\n        if (checkMediaPermission) {\n          const statusCamera = await requestPermissionCamera();\n          if (statusCamera !== \"granted\") {\n            showAlert?.({\n              message: \"Allow access to your camera or check if your camera is not being used by another application.\",\n              type: \"danger\",\n              duration: 3000,\n            });\n            return;\n          }\n        }\n      }\n\n      let mediaConstraints = {};\n      let altMediaConstraints = {};\n      if (userDefaultVideoInputDevice) {\n        if (vidCons && vidCons.width && vidCons.height) {\n          mediaConstraints = {\n            video: {\n              deviceId: userDefaultVideoInputDevice,\n              facingMode: currentFacingMode,\n              ...vidCons,\n              frameRate: { ideal: frameRate },\n            },\n            audio: false,\n          };\n          altMediaConstraints = {\n            video: { ...vidCons, frameRate: { ideal: frameRate } },\n            audio: false,\n          };\n        } else {\n          mediaConstraints = {\n            video: { ...vidCons, frameRate: { ideal: frameRate } },\n            audio: false,\n          };\n          altMediaConstraints = {\n            video: { frameRate: { ideal: frameRate } },\n            audio: false,\n          };\n        }\n      } else {\n        if (vidCons && vidCons.width && vidCons.height) {\n          mediaConstraints = {\n            video: { ...vidCons, frameRate: { ideal: frameRate } },\n            audio: false,\n          };\n          altMediaConstraints = {\n            video: { ...vidCons, frameRate: { ideal: frameRate } },\n            audio: false,\n          };\n        } else {\n          mediaConstraints = {\n            video: { frameRate: { ideal: frameRate } },\n            audio: false,\n          };\n        }\n      }\n\n      await mediaDevices\n        .getUserMedia(mediaConstraints)\n        .then(async (stream) => {\n          await streamSuccessVideo({ stream, parameters });\n        })\n        .catch(async () => {\n          await mediaDevices\n            .getUserMedia(altMediaConstraints)\n            .then(async (stream) => {\n              await streamSuccessVideo({ stream, parameters });\n            })\n            .catch(async() => {\n              //remove frameRate from constraints\n              altMediaConstraints = {\n                video: { ...vidCons },\n                audio: false,\n              };\n              await mediaDevices\n              .getUserMedia(altMediaConstraints)\n              .then(async (stream) => {\n                await streamSuccessVideo({ stream, parameters });\n              }).catch(() => {\n\n              showAlert?.({\n                message:\n                  \"Allow access to your camera or check if your camera is not being used by another application.\",\n                type: \"danger\",\n                duration: 3000,\n              });\n\n            });\n          });\n        });\n    }\n  }\n};\n","import type { RtpEncodingParameters } from \"mediasoup-client\";\nimport type { ProducerCodecOptions } from \"mediasoup-client\";\n\n// Export the type definition for the function\nexport type AParamsType = {\n  encodings: RtpEncodingParameters[];\n  codecOptions?: ProducerCodecOptions;\n};\n/**\n * AParamsType object containing encoding parameters.\n * \n * @constant\n * @type {AParamsType}\n * @property {Array<Object>} encodings - Array of encoding configurations.\n * @property {string} encodings[].rid - The RTP stream identifier.\n * @property {number} encodings[].maxBitrate - The maximum bitrate for the encoding.\n */\nexport const aParams: AParamsType = {\n\n  encodings: [\n    {\n      rid: \"r0\",\n      maxBitrate: 64000,\n    },\n  ],\n};\n","import type { ProducerCodecOptions, RtpEncodingParameters } from \"mediasoup-client\";\n\nexport type HParamsType = {\n  encodings: RtpEncodingParameters[];\n  codecOptions?: ProducerCodecOptions;\n};\n/**\n * hParams configuration object for encoding and codec options.\n * \n * @type {HParamsType}\n * @property {Array<Object>} encodings - Array of encoding settings.\n * @property {string} encodings[].rid - The RTP stream identifier.\n * @property {number} encodings[].maxBitrate - Maximum bitrate for the encoding.\n * @property {string} encodings[].scalabilityMode - Scalability mode for the encoding.\n * @property {string} encodings[].priority - Priority of the encoding.\n * @property {string} encodings[].networkPriority - Network priority of the encoding.\n * @property {number} [encodings[].scaleResolutionDownBy] - Factor by which to scale down the resolution.\n * @property {Object} codecOptions - Codec options for the encoding.\n * @property {number} codecOptions.videoGoogleStartBitrate - Initial bitrate for Google video codec.\n */\nexport const hParams: HParamsType = {\n  encodings: [\n    {\n      rid: \"r8\",\n      maxBitrate: 240000,\n      scalabilityMode: \"L1T3\",\n      scaleResolutionDownBy: 4.0,\n    },\n    {\n      rid: \"r9\",\n      maxBitrate: 480000,\n      scalabilityMode: \"L1T3\",\n      scaleResolutionDownBy: 2.0,\n    },\n    {\n      rid: \"r10\",\n      maxBitrate: 960000,\n      scalabilityMode: \"L1T3\",\n    },\n  ],\n\n  codecOptions: {\n    videoGoogleStartBitrate: 384,\n  },\n};\n","import type { ProducerCodecOptions, RtpEncodingParameters } from \"mediasoup-client\";\n\nexport type ScreenParamsType = {\n  encodings: RtpEncodingParameters[];\n  codecOptions?: ProducerCodecOptions;\n};\n/**\n * Screen parameters configuration object.\n * \n * @constant\n * @type {ScreenParamsType}\n * \n * @property {Array<Object>} encodings - Array of encoding settings.\n * @property {string} encodings[].rid - The RTP stream identifier.\n * @property {number} encodings[].maxBitrate - Maximum bitrate for the encoding.\n * @property {string} encodings[].priority - Priority of the encoding.\n * @property {string} encodings[].networkPriority - Network priority of the encoding.\n * \n * @property {Object} codecOptions - Codec options for the screen parameters.\n * @property {number} codecOptions.videoGoogleStartBitrate - Initial bitrate for the video codec.\n */\nexport const screenParams: ScreenParamsType = {\n  encodings: [\n    {\n      rid: \"r7\",\n      maxBitrate: 3000000,\n    },\n  ],\n  codecOptions: {\n    videoGoogleStartBitrate: 1000,\n  },\n};\n","import type { ProducerCodecOptions, RtpEncodingParameters } from \"mediasoup-client\";\n\nexport type VParamsType = {\n  encodings: RtpEncodingParameters[];\n  codecOptions?: ProducerCodecOptions;\n};\n/**\n * Video parameters configuration object.\n * \n * @type {VParamsType}\n * @property {Array<Object>} encodings - Array of encoding settings.\n * @property {string} encodings[].rid - The RTP stream identifier.\n * @property {number} encodings[].maxBitrate - Maximum bitrate for the encoding.\n * @property {string} encodings[].scalabilityMode - Scalability mode for the encoding.\n * @property {string} encodings[].networkPriority - Network priority for the encoding.\n * @property {string} encodings[].priority - Priority for the encoding.\n * @property {number} [encodings[].scaleResolutionDownBy] - Factor by which to scale down the resolution.\n * @property {Object} codecOptions - Codec options for the video.\n * @property {number} codecOptions.videoGoogleStartBitrate - Initial bitrate for the video codec.\n */\nexport const vParams: VParamsType = {\n  encodings: [\n    {\n      rid: \"r3\",\n      maxBitrate: 200000,\n      scalabilityMode: \"L1T3\",\n      scaleResolutionDownBy: 4.0,\n    },\n    {\n      rid: \"r4\",\n      maxBitrate: 400000,\n      scalabilityMode: \"L1T3\",\n      scaleResolutionDownBy: 2.0,\n    },\n    {\n      rid: \"r5\",\n      maxBitrate: 800000,\n      scalabilityMode: \"L1T3\",\n    },\n  ],\n\n  codecOptions: {\n    videoGoogleStartBitrate: 320,\n  },\n};\n","\nimport type {\n  CreateMediaSFURoomOptions,\n  JoinMediaSFURoomOptions\n} from '../../@types/types';\n\nexport type CreateJoinRoomType = (options: {\n  payload: CreateMediaSFURoomOptions | JoinMediaSFURoomOptions;\n  apiUserName: string;\n  apiKey: string;\n  localLink?: string;\n}) => Promise<{\n  data: CreateJoinRoomResponse | CreateJoinRoomError | null;\n  success: boolean;\n}>;\n\nexport type CreateRoomOnMediaSFUType = (options: {\n  payload: CreateMediaSFURoomOptions;\n  apiUserName: string;\n  apiKey: string;\n  localLink?: string;\n}) => Promise<{\n  data: CreateJoinRoomResponse | CreateJoinRoomError | null;\n  success: boolean;\n}>;\n\n\nexport interface CreateJoinRoomResponse {\n  message: string;\n  roomName: string;\n  secureCode?: string;\n  publicURL: string;\n  link: string;\n  secret: string;\n  success: boolean;\n}\n\nexport interface CreateJoinRoomError {\n  error: string;\n  success?: boolean;\n}\n\nexport type JoinRoomOnMediaSFUType = (options: {\n  payload: JoinMediaSFURoomOptions;\n  apiUserName: string;\n  apiKey: string;\n  localLink?: string;\n}) => Promise<{\n  data: CreateJoinRoomResponse | CreateJoinRoomError | null;\n  success: boolean;\n}>;\n\n/**\n * Asynchronously joins a room on MediaSFU.\n *\n * This function sends a POST request to the MediaSFU API to join an existing room. \n * It validates the provided credentials and constructs the appropriate API endpoint, \n * including support for the Community Edition via a custom `localLink`.\n *\n * @param {object} options - Configuration options for joining the room.\n * @param {JoinMediaSFURoomOptions | CreateMediaSFURoomOptions} options.payload - The payload containing the room details and action (`join` or `create`).\n * @param {string} options.apiUserName - The API username, used for authentication.\n * @param {string} options.apiKey - The API key, used for authentication.\n * @param {string} [options.localLink=\"\"] - The local link for Community Edition users. If provided, it overrides the default API URL.\n * \n * @returns {Promise<{ \n*   data: CreateJoinRoomResponse | CreateJoinRoomError | null; \n*   success: boolean; \n* }>} A promise resolving to an object containing the API response:\n* - `data`: The response object, either `CreateJoinRoomResponse` or `CreateJoinRoomError`.\n* - `success`: Boolean indicating whether the operation was successful.\n*\n* @throws {Error} Throws an error if the request fails or if the provided credentials are invalid.\n*\n* @example\n* ```ts\n* const response = await joinRoomOnMediaSFU({\n*   payload: {\n*     action: 'join',\n*     meetingID: '123456',\n*     userName: 'user123',\n*   },\n*   apiUserName: 'yourAPIUSERNAME',\n*   apiKey: 'yourAPIKEY',\n*   localLink: 'http://localhost:3000', // Optional for Community Edition\n* });\n*\n* if (response.success) {\n*   console.log('Joined room:', response.data);\n* } else {\n*   console.error('Failed to join room:', response.data?.error);\n* }\n* ```\n*/\n\n\nexport const joinRoomOnMediaSFU: CreateJoinRoomType = async ({\n  payload,\n  apiUserName,\n  apiKey,\n  localLink = \"\",\n}: {\n  payload: JoinMediaSFURoomOptions | CreateMediaSFURoomOptions;\n  apiUserName: string;\n  apiKey: string;\n  localLink?: string;\n}): Promise<{\n  data: CreateJoinRoomResponse | CreateJoinRoomError | null;\n  success: boolean;\n}> => {\n  try {\n    if (\n      !apiUserName ||\n      !apiKey ||\n      apiUserName === \"yourAPIUSERNAME\" ||\n      apiKey === \"yourAPIKEY\" ||\n      apiKey.length !== 64 ||\n      apiUserName.length < 6\n    ) {\n      return { data: { error: \"Invalid credentials\" }, success: false };\n    }\n\n    let finalLink = 'https://mediasfu.com/v1/rooms/';\n    if ( localLink && localLink.trim() !== ''  && !localLink.includes('mediasfu.com') ){\n      localLink = localLink.replace(/\\/$/, '');\n      finalLink = localLink + '/joinRoom';\n    }\n\n    const response = await fetch(finalLink,\n      {\n        method: \"POST\",\n        headers: {\n          \"Content-Type\": \"application/json\",\n          Authorization: `Bearer ${apiUserName}:${apiKey}`,\n        },\n        body: JSON.stringify(payload),\n      }\n    );\n\n    if (!response.ok) {\n      throw new Error(`HTTP error! Status: ${response.status}`);\n    }\n\n    const data = await response.json();\n    return { data, success: true };\n  } catch (error) {\n    const errorMessage = (error as any).reason ? (error as any).reason : 'unknown error';\n    return {\n      data: { error: `Unable to join room, ${errorMessage}` },\n      success: false,\n    };\n  }\n}","export interface StartMeetingProgressTimerParameters {\n  updateMeetingProgressTime: (formattedTime: string) => void;\n  validated: boolean;\n  roomName: string;\n\n  // mediasfu functions\n  getUpdatedAllParams: () => StartMeetingProgressTimerParameters;\n  [key: string]: any;\n\n}\n\nexport interface StartMeetingProgressTimerOptions {\n  startTime: number;\n  parameters: StartMeetingProgressTimerParameters;\n}\n\n// Export the type definition for the function\nexport type StartMeetingProgressTimerType = (options: StartMeetingProgressTimerOptions) => void;\n\n/**\n * Starts a timer to track the progress of a meeting.\n * \n * @param {StartMeetingProgressTimerOptions} options - The options for starting the meeting progress timer.\n * @param {number} options.startTime - The custom start time for the meeting progress timer.\n * @param {StartMeetingProgressTimerParameters} options.parameters - The parameters required for updating the meeting progress.\n * @param {Function} options.parameters.updateMeetingProgressTime - Function to update the meeting progress time.\n * @param {Function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n * \n * @example\n * ```typescript\n * startMeetingProgressTimer({\n *   startTime: 1609459200, // e.g., timestamp for the start of the meeting\n *   parameters: {\n *     updateMeetingProgressTime: (formattedTime) => console.log(\"Meeting time:\", formattedTime),\n *     validated: true,\n *     roomName: \"room1\",\n *     getUpdatedAllParams: () => ({ validated: true, roomName: \"room1\", updateMeetingProgressTime }),\n *   },\n * });\n * ```\n */\n\nexport function startMeetingProgressTimer({\n  startTime,\n  parameters,\n}: StartMeetingProgressTimerOptions): void {\n  let { updateMeetingProgressTime, getUpdatedAllParams } = parameters;\n\n  /**\n   * Calculate the elapsed time based on the start time.\n   * @param {number} startTime - The custom start time for the meeting progress timer.\n   * @returns {number} - The elapsed time in seconds.\n   */\n  function calculateElapsedTime(startTime: number): number {\n    const currentTime = Math.floor(new Date().getTime() / 1000);\n    return currentTime - startTime;\n  }\n\n  /**\n   * Utility function to pad single-digit numbers with leading zeros.\n   * @param {number} number - The number to pad.\n   * @returns {string} - The padded number as a string.\n   */\n  function padNumber(number: number): string {\n    return number.toString().padStart(2, \"0\");\n  }\n\n  /**\n   * Format the time in HH:MM:SS format.\n   * @param {number} time - The time in seconds.\n   * @returns {string} - The formatted time string.\n   */\n  function formatTime(time: number): string {\n    const hours = Math.floor(time / 3600);\n    const minutes = Math.floor((time % 3600) / 60);\n    const seconds = Math.floor(time % 60).toString().padStart(2, \"0\");\n    return `${padNumber(hours)}:${padNumber(minutes)}:${padNumber(Number(seconds))}`;\n  }\n\n  let elapsedTime = calculateElapsedTime(startTime);\n\n  // Update the timer and indicator every second\n  let timeProgress: NodeJS.Timeout | null = setInterval(async() => {\n    elapsedTime++;\n    const formattedTime = formatTime(elapsedTime);\n    updateMeetingProgressTime(formattedTime);\n\n    parameters = getUpdatedAllParams();\n\n    if (!parameters.validated || !parameters.roomName) {\n      clearInterval(timeProgress!);\n      timeProgress = null;\n    }\n  }, 1000);\n}\n","\nexport interface FormatNumberOptions {\n  number: number;\n}\n\n// Export the type definition for the function\nexport type FormatNumberType = (options: FormatNumberOptions) => Promise<string | undefined>;\n\n/**\n * Formats a number into a string representation with appropriate suffixes (K, M, B).\n * \n * @param number - The number to format.\n * @returns A promise that resolves to a formatted string or undefined if the input is falsy.\n * \n * @example\n * ```typescript\n * formatNumber({ number: 500 }); // \"500\"\n * formatNumber({ number: 1500 }); // \"1.5K\"\n * formatNumber({ number: 1500000 }); // \"1.5M\"\n * formatNumber({ number: 1500000000 }); // \"1.5B\"\n * ```\n */\n\nexport const formatNumber = async ( { number }: FormatNumberOptions ): Promise<string | undefined> => {\n  if (number) {\n    if (number < 1e3) {\n      return number.toString();\n    } else if (number < 1e6) {\n      return (number / 1e3).toFixed(1) + \"K\";\n    } else if (number < 1e9) {\n      return (number / 1e6).toFixed(1) + \"M\";\n    } else if (number < 1e12) {\n      return (number / 1e9).toFixed(1) + \"B\";\n    }\n  }\n  // Return undefined for falsy input values\n  return undefined;\n};\n","export interface SleepOptions {\n  ms: number;\n}\n\n// Export the type definition for the function\nexport type SleepType = (options: SleepOptions) => Promise<void>;\n\n/**\n * Pauses the execution for a specified number of milliseconds.\n *\n * @param {SleepOptions} options - An object containing the sleep duration.\n * @param {number} options.ms - The number of milliseconds to sleep.\n * @returns {Promise<void>} A promise that resolves after the specified duration.\n * \n * @example\n * ```typescript\n * await sleep({ ms: 2000 });\n * console.log(\"Waited for 2 seconds\");\n * ```\n */\n\nexport function sleep({ ms }: SleepOptions): Promise<void> {\n  return new Promise((resolve) => setTimeout(resolve, ms));\n}\n","import { Poll, ShowAlert, PollUpdatedData } from \"../../@types/types\";\n\nexport interface PollUpdatedOptions {\n  data: PollUpdatedData;\n  polls: Poll[];\n  poll: Poll;\n  member: string;\n  islevel: string;\n  showAlert?: ShowAlert;\n  updatePolls: (polls: Poll[]) => void;\n  updatePoll: (poll: Poll) => void;\n  updateIsPollModalVisible: (isVisible: boolean) => void;\n}\n\n// Export the type definition for the function\nexport type PollUpdatedType = (options: PollUpdatedOptions) => Promise<void>;\n\n\n/**\n * Updates the poll state based on the provided data.\n *\n * @param {Object} options - The options for updating the poll.\n * @param {any} options.data - The data containing poll information.\n * @param {any[]} options.polls - The current list of polls.\n * @param {any} options.poll - The current poll.\n * @param {string} options.member - The member identifier.\n * @param {string} options.islevel - The level of the member.\n * @param {Function} options.showAlert - Function to show alerts.\n * @param {Function} options.updatePolls - Function to update the list of polls.\n * @param {Function} options.updatePoll - Function to update the current poll.\n * @param {Function} options.updateIsPollModalVisible - Function to update the visibility of the poll modal.\n * @returns {Promise<void>} A promise that resolves when the poll update is complete.\n * \n * @example\n * ```typescript\n * await pollUpdated({\n *   data: { poll: updatedPoll, status: \"started\" },\n *   polls: currentPolls,\n *   poll: currentPoll,\n *   member: \"user123\",\n *   islevel: \"1\",\n *   showAlert: (alert) => console.log(alert.message),\n *   updatePolls: (polls) => setPolls(polls),\n *   updatePoll: (poll) => setCurrentPoll(poll),\n *   updateIsPollModalVisible: (visible) => setIsPollModalVisible(visible),\n * });\n * ```\n */\n\nexport const pollUpdated = async ({\n  data,\n  polls,\n  poll,\n  member,\n  islevel,\n  showAlert,\n  updatePolls,\n  updatePoll,\n  updateIsPollModalVisible,\n}: PollUpdatedOptions): Promise<void> => {\n  try {\n\n    if (data.polls) {\n      polls = data.polls;\n      updatePolls(data.polls);\n    } else {\n      polls = [data.poll];\n      updatePolls(polls);\n    }\n\n    let temp_poll: any = { id: \"\" };\n\n    if (poll) {\n      temp_poll = { ...poll };\n    }\n\n    if (data.status !== \"ended\") {\n      poll = data.poll;\n      updatePoll(data.poll);\n    }\n\n    if (data.status === \"started\" && islevel !== \"2\") {\n      if (!poll.voters || (poll.voters && !poll.voters[member])) {\n        showAlert?.({\n          message: \"New poll started\",\n          type: \"success\",\n          duration: 3000,\n        });\n        updateIsPollModalVisible(true);\n      }\n    } else if (data.status === \"ended\") {\n      if (temp_poll.id === data.poll.id) {\n        showAlert?.({ message: \"Poll ended\", type: \"danger\", duration: 3000 });\n        // update the poll\n        updatePoll(data.poll);\n      }\n    }\n  } catch  {\n    // console.log(error);\n  }\n};\n","import { Socket } from \"socket.io-client\";\nimport {\n  CheckPermissionType, DisconnectSendTransportAudioParameters, DisconnectSendTransportAudioType, Participant,\n  RequestPermissionAudioType, ResumeSendTransportAudioParameters, ResumeSendTransportAudioType, ShowAlert, StreamSuccessAudioParameters, StreamSuccessAudioType\n} from \"../../@types/types\";\n\n \nexport interface ClickAudioParameters extends DisconnectSendTransportAudioParameters, ResumeSendTransportAudioParameters, StreamSuccessAudioParameters {\n\n  checkMediaPermission: boolean;\n  hasAudioPermission: boolean;\n  audioPaused: boolean;\n  audioAlreadyOn: boolean;\n  audioOnlyRoom: boolean;\n  recordStarted: boolean;\n  recordResumed: boolean;\n  recordPaused: boolean;\n  recordStopped: boolean;\n  recordingMediaOptions: string;\n  islevel: string;\n  youAreCoHost: boolean;\n  adminRestrictSetting: boolean;\n  audioRequestState: string | null;\n  audioRequestTime: number;\n  member: string;\n  socket: Socket;\n  localSocket?: Socket;\n  roomName: string;\n  userDefaultAudioInputDevice: string;\n  micAction: boolean;\n  localStream: MediaStream | null;\n  audioSetting: string;\n  videoSetting: string;\n  screenshareSetting: string;\n  chatSetting: string;\n  updateRequestIntervalSeconds: number;\n  participants: Participant[];\n  mediaDevices: MediaDevices;\n  transportCreated: boolean;\n  transportCreatedAudio: boolean;\n\n  updateAudioAlreadyOn: (status: boolean) => void;\n  updateAudioRequestState: (state: string | null) => void;\n  updateAudioPaused: (status: boolean) => void;\n  updateLocalStream: (stream: MediaStream | null) => void;\n  updateParticipants: (participants: Participant[]) => void;\n  updateTransportCreated: (status: boolean) => void;\n  updateTransportCreatedAudio: (status: boolean) => void;\n  updateMicAction: (action: boolean) => void;\n  showAlert?: ShowAlert;\n\n  // mediasfu functions\n  checkPermission: CheckPermissionType;\n  streamSuccessAudio: StreamSuccessAudioType;\n  disconnectSendTransportAudio: DisconnectSendTransportAudioType;\n  requestPermissionAudio: RequestPermissionAudioType;\n  resumeSendTransportAudio: ResumeSendTransportAudioType;\n\n  getUpdatedAllParams: () => ClickAudioParameters;\n  [key: string]: any;\n\n}\n\nexport interface ClickAudioOptions {\n  parameters: ClickAudioParameters;\n}\n\n// Export the type definition for the function\nexport type ClickAudioType = (options: ClickAudioOptions) => Promise<void>;\n\n/**\n * Handles the click event for toggling audio in a media session.\n * \n * @param {ClickAudioOptions} parameters - The parameters required for handling the audio click event.\n * @returns {Promise<void>} A promise that resolves when the audio click event has been handled.\n * \n * The function performs the following actions:\n * - If the event is audio-only, it shows an alert and exits.\n * - If the audio is already on, it handles the logic for turning it off, including checking recording states and permissions.\n * - If the audio is off, it checks for admin restrictions, user permissions, and handles the logic for turning the audio on.\n * - It updates various states and emits socket events as necessary.\n * \n * @example\n * ```typescript\n * clickAudio({ parameters });\n * ```\n */\n\nexport const clickAudio = async ({ parameters }: ClickAudioOptions): Promise<void> => {\n  let {\n    checkMediaPermission,\n    hasAudioPermission,\n    audioPaused,\n    audioAlreadyOn,\n    audioOnlyRoom,\n    recordStarted,\n    recordResumed,\n    recordPaused,\n    recordStopped,\n    recordingMediaOptions,\n    islevel,\n    youAreCoHost,\n    adminRestrictSetting,\n    audioRequestState,\n    audioRequestTime,\n    member,\n    socket,\n    localSocket,\n    roomName,\n    userDefaultAudioInputDevice,\n    micAction,\n    localStream,\n    audioSetting,\n    videoSetting,\n    screenshareSetting,\n    chatSetting,\n    updateRequestIntervalSeconds,\n    participants,\n    mediaDevices,\n    showAlert,\n    transportCreated,\n    transportCreatedAudio,\n\n    updateAudioAlreadyOn,\n    updateAudioRequestState,\n    updateAudioPaused,\n    updateLocalStream,\n    updateParticipants,\n    updateTransportCreated,\n    updateTransportCreatedAudio,\n    updateMicAction,\n\n    checkPermission,\n    streamSuccessAudio,\n    requestPermissionAudio,\n    resumeSendTransportAudio,\n    disconnectSendTransportAudio,\n  } = parameters;\n\n  if (audioOnlyRoom) {\n    showAlert?.({\n      message: \"You cannot turn on your camera in an audio-only event.\",\n      type: \"danger\",\n      duration: 3000,\n    });\n    return;\n  }\n\n  if (audioAlreadyOn) {\n    if (islevel === \"2\" && (recordStarted || recordResumed)) {\n      if (!(recordPaused || recordStopped)) {\n        if (recordingMediaOptions === \"audio\") {\n           showAlert?.({\n            message: \"You cannot turn off your audio while recording, please pause or stop recording first.\",\n            type: \"danger\",\n            duration: 3000,\n          });\n          return;\n        }\n      }\n    }\n\n    audioAlreadyOn = false;\n    updateAudioAlreadyOn(audioAlreadyOn);\n    localStream!.getAudioTracks()[0].enabled = false;\n    updateLocalStream(localStream);\n    await disconnectSendTransportAudio({ parameters }); //disconnect function here actuall calls audioProducer.pause() instead of close() as in mediasfu\n    audioPaused = true;\n    updateAudioPaused(audioPaused);\n  } else {\n    if (adminRestrictSetting) {\n      showAlert?.({\n        message: \"You cannot turn on your microphone. Access denied by host.\",\n        type: \"danger\",\n        duration: 3000,\n      });\n      return;\n    }\n\n    let response = 2;\n    if (!micAction && islevel !== \"2\" && !youAreCoHost) {\n      response = await checkPermission({\n        permissionType: \"audioSetting\",\n        audioSetting, videoSetting, screenshareSetting, chatSetting \n      });\n    } else {\n      response = 0;\n    }\n\n    switch (response) {\n      case 1:\n        { if (audioRequestState === \"pending\") {\n          showAlert?.({\n            message: \"A request is pending. Please wait for the host to respond.\",\n            type: \"danger\",\n            duration: 3000,\n          });\n          return;\n        }\n\n        if (audioRequestState === \"rejected\" && Date.now() - audioRequestTime < updateRequestIntervalSeconds * 1000) {\n          showAlert?.({\n            message: `A request was rejected. Please wait for ${updateRequestIntervalSeconds} seconds before sending another request.`,\n            type: \"danger\",\n            duration: 3000,\n          });\n          return;\n        }\n\n        showAlert?.({\n          message: \"Request sent to host.\",\n          type: \"success\",\n          duration: 3000,\n        });\n\n        audioRequestState = \"pending\";\n        updateAudioRequestState(audioRequestState);\n        //create a request and add to the request list and send to host\n\n        const userRequest = {\n          id: socket.id,\n          name: member,\n          icon: \"fa-microphone\",\n        };\n        socket.emit(\"participantRequest\", { userRequest, roomName });\n        break; }\n\n      case 2:\n\n        showAlert?.({\n          message: \"You cannot turn on your microphone. Access denied by host.\",\n          type: \"danger\",\n          duration: 3000,\n        });\n       \n        break;\n\n      case 0:\n        //allow\n\n        if (audioPaused) {\n          localStream!.getAudioTracks()[0].enabled = true;\n          updateAudioAlreadyOn(true);\n          await resumeSendTransportAudio({ parameters });\n          socket.emit(\"resumeProducerAudio\", { mediaTag: \"audio\", roomName });\n          \n          try {\n            if (localSocket && localSocket.id){\n                localSocket.emit(\"resumeProducerAudio\", { mediaTag: \"audio\", roomName });\n            } \n          } catch (error) {\n            console.log(\"Error in resumeProducerAudio\", error);\n            \n          }\n\n          updateLocalStream(localStream);\n\n          if (micAction == true) {\n            micAction = false;\n            updateMicAction(micAction);\n          }\n\n\n          participants.forEach((participant) => {\n            if (participant.socketId === socket.id && participant.name === member) {\n              participant.muted = false;\n            }\n          });\n          updateParticipants(participants);\n\n          transportCreated = true;\n          updateTransportCreated(transportCreated);\n\n          transportCreatedAudio = true;\n          updateTransportCreatedAudio(transportCreatedAudio);\n        } else {\n          if (!hasAudioPermission && checkMediaPermission) {\n            const statusMic = await requestPermissionAudio();\n            if (statusMic !== \"granted\") {\n              showAlert?.({\n                message: \"Allow access to your microphone or check if your microphone is not being used by another application.\",\n                type: \"danger\",\n                duration: 3000,\n              });\n              return;\n            }\n          }\n\n          const mediaConstraints = userDefaultAudioInputDevice\n            ? { audio: { deviceId: userDefaultAudioInputDevice }, video: false }\n            : { audio: true, video: false };\n\n          try {\n            const stream = await mediaDevices.getUserMedia(mediaConstraints);\n            await streamSuccessAudio({ stream, parameters });\n          } catch (error) {\n            console.error(error);\n            showAlert?.({\n              message: \"Allow access to your microphone or check if your microphone is not being used by another application.\",\n              type: \"danger\",\n              duration: 3000,\n            });\n          }\n        }\n        break;\n\n      default:\n    }\n  }\n};\n","import { Socket } from \"socket.io-client\";\nimport type { CheckPermissionType, CheckScreenShareParameters, CheckScreenShareType, ShowAlert, StopShareScreenParameters, StopShareScreenType } from \"../../@types/types\";\n\nexport interface ClickScreenShareParameters extends CheckScreenShareParameters, StopShareScreenParameters {\n  showAlert?: ShowAlert;\n  roomName: string;\n  member: string;\n  socket: Socket;\n  islevel: string;\n  youAreCoHost: boolean;\n  adminRestrictSetting: boolean;\n  audioSetting: string;\n  videoSetting: string;\n  screenshareSetting: string;\n  chatSetting: string;\n  screenAction: boolean;\n  screenAlreadyOn: boolean;\n  screenRequestState: string | null;\n  screenRequestTime: number;\n  audioOnlyRoom: boolean;\n  updateRequestIntervalSeconds: number;\n  updateScreenRequestState: (state: string | null) => void\n  updateScreenAlreadyOn: (status: boolean) => void;\n\n  // mediasfu functions\n  checkPermission: CheckPermissionType;\n  checkScreenShare: CheckScreenShareType;\n  stopShareScreen: StopShareScreenType;\n\n  getUpdatedAllParams: () => ClickScreenShareParameters;\n  [key: string]: any;\n\n}\n\nexport interface ClickScreenShareOptions {\n  parameters: ClickScreenShareParameters;\n}\n\n// Export the type definition for the function\nexport type ClickScreenShareType = (options: ClickScreenShareOptions) => Promise<void>;\n\n/**\n * Handles the action for the screen button, including starting and stopping screen sharing.\n *\n * @param {ClickScreenShareOptions} options - Options for handling the screen button action.\n * @returns {Promise<void>}\n *\n * @example\n * ```typescript\n * clickScreenShare({\n *   parameters: {\n *     showAlert: showAlertFunction,\n *     roomName: \"room123\",\n *     member: \"John Doe\",\n *     socket: socketInstance,\n *     islevel: \"1\",\n *     youAreCoHost: false,\n *     adminRestrictSetting: false,\n *     audioSetting: \"allow\",\n *     videoSetting: \"allow\",\n *     screenshareSetting: \"allow\",\n *     chatSetting: \"allow\",\n *     screenAction: false,\n *     screenAlreadyOn: false,\n *     screenRequestState: null,\n *     screenRequestTime: Date.now(),\n *     audioOnlyRoom: false,\n *     updateRequestIntervalSeconds: 60,\n *     updateScreenRequestState: setScreenRequestState,\n *     updateScreenAlreadyOn: setScreenAlreadyOn,\n *     checkPermission: checkPermissionFunction,\n *     checkScreenShare: checkScreenShareFunction,\n *     stopShareScreen: stopShareScreenFunction,\n *     getUpdatedAllParams: getUpdatedParamsFunction\n *   }\n * });\n * ```\n */\n\nexport const clickScreenShare = async ({ parameters }: ClickScreenShareOptions): Promise<void> => {\n  let {\n    showAlert,\n    roomName,\n    member,\n    socket,\n    islevel,\n    youAreCoHost,\n    adminRestrictSetting,\n    audioSetting,\n    videoSetting,\n    screenshareSetting,\n    chatSetting,\n    screenAction,\n    screenAlreadyOn,\n    screenRequestState,\n    screenRequestTime,\n    audioOnlyRoom,\n    updateRequestIntervalSeconds,\n    updateScreenRequestState,\n    updateScreenAlreadyOn,\n\n    // mediasfu functions\n    checkPermission,\n    checkScreenShare,\n    stopShareScreen,\n  } = parameters;\n\n  // Check if the room is audio-only\n  if (audioOnlyRoom) {\n    showAlert?.({\n      message: \"You cannot turn on your camera in an audio-only event.\",\n      type: \"danger\",\n      duration: 3000,\n    });\n    return;\n  }\n\n  // Check if the room is a demo room\n  if (roomName.startsWith(\"d\")) {\n    showAlert?.({\n      message: \"You cannot start screen share in a demo room.\",\n      type: \"danger\",\n      duration: 3000,\n    });\n    return;\n  }\n\n  // Toggle screen sharing based on current status\n  if (screenAlreadyOn) {\n    screenAlreadyOn = false;\n    updateScreenAlreadyOn(screenAlreadyOn);\n    await stopShareScreen({ parameters });\n  } else {\n    // Check if screen sharing is restricted by the host\n    if (adminRestrictSetting) {\n      showAlert?.({\n        message: \"You cannot start screen share. Access denied by host.\",\n        type: \"danger\",\n        duration: 3000,\n      });\n      return;\n    }\n\n    let response = 2;\n    // Check and turn on screen sharing\n    if (!screenAction && islevel !== \"2\" && !youAreCoHost) {\n      response = await checkPermission({\n        permissionType: \"screenshareSetting\",\n          audioSetting,\n          videoSetting,\n          screenshareSetting,\n          chatSetting,\n      });\n    } else {\n      response = 0;\n    }\n\n    // Handle different responses\n    switch (response) {\n      case 0:\n        // Allow screen sharing\n        checkScreenShare({ parameters });\n        break;\n      case 1: {\n        // Approval required\n        // Check if a request is already pending\n        if (screenRequestState === \"pending\") {\n          showAlert?.({\n            message: \"A request is already pending. Please wait for the host to respond.\",\n            type: \"danger\",\n            duration: 3000,\n          });\n          return;\n        }\n\n        if (screenRequestState === \"rejected\" && Date.now() - screenRequestTime < updateRequestIntervalSeconds) {\n          showAlert?.({\n            message: \"You cannot send another request at this time.\",\n            type: \"danger\",\n            duration: 3000,\n          });\n          return;\n        }\n\n        showAlert?.({\n          message: \"Your request has been sent to the host.\",\n          type: \"success\",\n          duration: 3000,\n        });\n\n        screenRequestState = \"pending\";\n        updateScreenRequestState(screenRequestState);\n\n        const userRequest = { id: socket.id, name: member, icon: \"fa-desktop\" };\n        socket.emit(\"participantRequest\", { userRequest, roomName });\n        break;\n      }\n      case 2:\n        showAlert?.({\n          message: \"You are not allowed to start screen share.\",\n          type: \"danger\",\n          duration: 3000,\n        });\n        break;\n      default:\n        break;\n    }\n  }\n};\n","import type { Producer } from \"mediasoup-client\";\nimport type {\n  ConnectSendTransportScreenType,\n  CreateSendTransportType,\n  DisconnectSendTransportScreenType,\n  SleepType,\n  CreateSendTransportParameters,\n  DisconnectSendTransportScreenParameters,\n  ConnectSendTransportScreenParameters,\n} from \"../../@types/types\";\nimport type { Socket } from \"socket.io-client\";\nexport interface CaptureCanvasStreamParameters extends CreateSendTransportParameters, DisconnectSendTransportScreenParameters, ConnectSendTransportScreenParameters {\n  canvasWhiteboard: HTMLCanvasElement | null;\n  canvasStream: MediaStream | null;\n  updateCanvasStream: (stream: MediaStream | null) => void;\n  screenProducer: Producer | null;\n  localScreenProducer?: Producer | null;\n  transportCreated: boolean;\n  localTransportCreated?: boolean;\n  localSocket?: Socket;\n  updateScreenProducer: (producer:  Producer | null) => void;\n  updateLocalScreenProducer?: (localProducer: Producer | null) => void;\n\n  // mediasfu functions\n  sleep: SleepType;\n  createSendTransport: CreateSendTransportType;\n  connectSendTransportScreen: ConnectSendTransportScreenType;\n  disconnectSendTransportScreen: DisconnectSendTransportScreenType;\n\n  getUpdatedAllParams: () => CaptureCanvasStreamParameters;\n  [key: string]: any;\n}\n\nexport interface CaptureCanvasStreamOptions {\n  parameters: CaptureCanvasStreamParameters;\n  start?: boolean;\n}\n\n// Export the type definition for the function\nexport type CaptureCanvasStreamType = (options: CaptureCanvasStreamOptions) => Promise<void>;\n\n/**\n * Captures the canvas stream and handles the transport connection for screen sharing.\n *\n * @param {CaptureCanvasStreamOptions} options - The options for capturing the canvas stream.\n * @param {Object} options.parameters - The parameters required for capturing and managing the canvas stream.\n * @param {HTMLCanvasElement} options.parameters.canvasWhiteboard - The canvas element to capture the stream from.\n * @param {MediaStream} [options.parameters.canvasStream] - The current canvas stream, if any.\n * @param {Function} options.parameters.updateCanvasStream - Function to update the canvas stream state.\n * @param {Producer | null} [options.parameters.screenProducer] - The current screen producer, if any.\n * @param {Producer | null} [options.parameters.localScreenProducer] - The current local screen producer, if any.\n * @param {boolean} [options.parameters.transportCreated] - Flag indicating if the transport has been created.\n * @param {boolean} [options.parameters.localTransportCreated] - Flag indicating if the local transport has been created.\n * @param {Socket} [options.parameters.localSocket] - The local socket instance used for communication.\n * @param {Function} options.parameters.updateScreenProducer - Function to update the screen producer state.\n * @param {Function} options.parameters.updateLocalScreenProducer - Function to update the local screen producer state.\n * @param {Function} options.parameters.sleep - Function to pause execution for a specified duration.\n * @param {Function} options.parameters.createSendTransport - Function to create a send transport for the screen.\n * @param {Function} options.parameters.connectSendTransportScreen - Function to connect the send transport for the screen.\n * @param {Function} options.parameters.disconnectSendTransportScreen - Function to disconnect the send transport for the screen.\n * @param {boolean} [start=true] - Flag indicating whether to start or stop the canvas stream.\n * @returns {Promise<void>} A promise that resolves when the operation is complete.\n * \n * @example\n * ```typescript\n * const canvasElement = document.querySelector('#canvas') as HTMLCanvasElement;\n * const options = {\n *   parameters: {\n *     canvasWhiteboard: canvasElement,\n *     updateCanvasStream: (stream) => console.log(\"Canvas Stream Updated:\", stream),\n *     updateScreenProducer: (producer) => console.log(\"Screen Producer Updated:\", producer),\n *     updateLocalScreenProducer: (localProducer) => console.log(\"Local Screen Producer Updated:\", localProducer),\n *     createSendTransport: async (params) => console.log(\"Transport created with\", params),\n *     connectSendTransportScreen: async (options) => console.log(\"Transport connected with\", options),\n *     disconnectSendTransportScreen: async (params) => console.log(\"Transport disconnected with\", params),\n *     sleep: ({ ms }) => new Promise(resolve => setTimeout(resolve, ms)),\n *   },\n *   start: true,\n * };\n * await captureCanvasStream(options);\n * ```\n */\n\nexport const captureCanvasStream = async ({\n  parameters,\n  start = true,\n}: CaptureCanvasStreamOptions): Promise<void> => {\n  try {\n    let {\n      canvasWhiteboard,\n      canvasStream,\n      updateCanvasStream,\n      screenProducer,\n      localScreenProducer,\n      transportCreated,\n      localTransportCreated,\n      updateScreenProducer,\n      updateLocalScreenProducer,\n      localSocket,  \n\n      //mediasfu functions\n      sleep,\n      createSendTransport,\n      connectSendTransportScreen,\n      disconnectSendTransportScreen,\n    } = parameters;\n\n    if (start && !canvasStream) {\n      const stream = canvasWhiteboard!.captureStream(30);\n      canvasStream = stream;\n      updateCanvasStream(stream);\n\n      if (localSocket && !localSocket.id) {\n\n        try {\n          if (!localTransportCreated) {\n            await createSendTransport({ option: \"screen\", parameters });\n          }else {\n            try {\n              if (localScreenProducer) {\n                localScreenProducer.close();\n                if (updateLocalScreenProducer) {\n                  updateLocalScreenProducer(null);\n                }\n                await sleep({ ms: 500 });\n              }\n            } catch (error) {\n              console.error(error);\n            }\n            await connectSendTransportScreen({ stream, parameters });\n          }\n        } catch {\n          // do nothing\n        }\n\n        return;\n      }\n\n      if (!transportCreated) {\n        await createSendTransport({ option: \"screen\", parameters });\n      } else {\n        try {\n          if (screenProducer) {\n            screenProducer.close();\n            updateScreenProducer(null);\n            await sleep({ ms: 500 });\n          }\n        } catch (error) {\n          console.error(error);\n        }\n        await connectSendTransportScreen({ stream, parameters });\n      }\n    } else {\n      if (canvasStream && !start) {\n        canvasStream.getTracks().forEach((track) => track.stop());\n        canvasStream = null;\n        updateCanvasStream(null);\n        disconnectSendTransportScreen({ parameters });\n      }\n    }\n  } catch (error) {\n    console.error(error, \"error in captureCanvasStream\");\n  }\n};\n","import * as mediasoupClient from \"mediasoup-client\";\nimport type { RtpCapabilities, Device } from \"mediasoup-client\";\n\nexport interface CreateDeviceClientOptions {\n  rtpCapabilities: RtpCapabilities | null;\n}\n\n\n// Export the type definition for the function\nexport type CreateDeviceClientType = (options: CreateDeviceClientOptions) => Promise<Device | null>;\n\n\n/**\n * Creates a mediasoup client device with the provided RTP capabilities.\n *\n * @param {CreateDeviceClientOptions} options - The options for creating the device client.\n * @param {RTPCapabilities} options.rtpCapabilities - The RTP capabilities required for the device.\n * @returns {Promise<Device | null>} A promise that resolves to the created Device or null if creation fails.\n * @throws {Error} Throws an error if the required parameters are not provided or if device creation is not supported.\n *\n * @example\n * const device = await createDeviceClient({ rtpCapabilities });\n * if (device) {\n *   console.log(\"Device created successfully\");\n * } else {\n *   console.log(\"Failed to create device\");\n * }\n */\n\nexport const createDeviceClient = async ({\n  rtpCapabilities\n}: CreateDeviceClientOptions): Promise<Device | null> => {\n  try {\n    // Validate input parameters\n    if (!rtpCapabilities) {\n      throw new Error(\n        \"Both rtpCapabilities and mediasoupClient must be provided.\"\n      );\n    }\n\n    // Create a mediasoup client device\n    const device: (Device | null) = new mediasoupClient.Device();\n\n    // Remove orientation capabilities\n    rtpCapabilities.headerExtensions = rtpCapabilities!.headerExtensions!.filter(\n      (ext) => ext.uri !== \"urn:3gpp:video-orientation\"\n    );\n\n    // Load the provided RTP capabilities into the device\n    await device!.load({\n      routerRtpCapabilities: rtpCapabilities,\n    });\n\n    return device;\n  } catch ( error ) {\n    // Handle specific errors, e.g., UnsupportedError\n    if ( error as Error && (error as Error).name === \"UnsupportedError\" ) {\n      // Handle unsupported device creation\n      console.error(\"Device creation is not supported by this browser.\");\n    }\n\n    throw error; // Propagate other errors\n  }\n\n};\n\n\n\n","import type { ResponseJoinRoom } from \"../../@types/types\";\nimport { validateAlphanumeric } from \"../../methods/utils/validateAlphanumeric\";\nimport type { Socket } from \"socket.io-client\";\n\nexport interface JoinRoomOptions {\n  socket: Socket;\n  roomName: string;\n  islevel: string;\n  member: string;\n  sec: string;\n  apiUserName: string;\n}\n\n// Export the type definition for the function\nexport type JoinRoomType = (\n  socket: Socket,\n  roomName: string,\n  islevel: string,\n  member: string,\n  sec: string,\n  apiUserName: string\n) => Promise<object>;\n\n\n/**\n * Joins a user to a specified room via a socket connection.\n *\n * @param {JoinRoomOptions} options - The options for joining the room.\n * @param {Socket} options.socket - The socket instance to use for communication.\n * @param {string} options.roomName - The name of the room to join.\n * @param {string} options.islevel - The level of the user.\n * @param {string} options.member - The member identifier.\n * @param {string} options.sec - The security token.\n * @param {string} options.apiUserName - The API username of the user.\n * \n * @returns {Promise<object>} A promise that resolves with the data received from the 'joinRoom' event or rejects with a validation error.\n * \n * @example\n * ```typescript\n * const options = {\n *   socket: socketInstance,\n *   roomName: \"s12345678\",\n *   islevel: \"1\",\n *   member: \"user123\",\n *   sec: \"64CharacterLongSecretHere\",\n *   apiUserName: \"user123\",\n * };\n *\n * try {\n *   const response = await joinRoom(options);\n *   console.log(\"Room joined:\", response);\n * } catch (error) {\n *   console.error(\"Failed to join room:\", error);\n * }\n * ```\n */\n\nasync function joinRoom\n  ({\n    socket,\n    roomName,\n    islevel,\n    member,\n    sec,\n    apiUserName,\n  }: JoinRoomOptions): Promise<object> {\n  return new Promise((resolve, reject) => {\n    // Validate inputs\n    if (!(sec && roomName && islevel && apiUserName && member)) {\n      const validationError = {\n        success: false,\n        rtpCapabilities: null,\n        reason: \"Missing required parameters\",\n      };\n      reject(validationError);\n      return;\n    }\n\n    // Validate alphanumeric for roomName, apiUserName, and member\n    try {\n      validateAlphanumeric({ str: roomName });\n      validateAlphanumeric({ str: apiUserName });\n      validateAlphanumeric({ str: member });\n    } catch {\n      const validationError = {\n        success: false,\n        rtpCapabilities: null,\n        reason: \"Invalid roomName or apiUserName or member\",\n      };\n      reject(validationError);\n      return;\n    }\n\n    // Validate roomName starts with 's' or 'p'\n    if (!(roomName.startsWith(\"s\") || roomName.startsWith(\"p\"))) {\n      const validationError = {\n        success: false,\n        rtpCapabilities: null,\n        reason: \"Invalid roomName, must start with s or p\",\n      };\n      reject(validationError);\n      return;\n    }\n\n    // Validate other conditions for sec, roomName, islevel, apiUserName\n    if (\n      !(\n        sec.length === 64 &&\n        roomName.length >= 8 &&\n        islevel.length === 1 &&\n        apiUserName.length >= 6 &&\n        (islevel === \"0\" || islevel === \"1\" || islevel === \"2\")\n      )\n    ) {\n      const validationError = {\n        success: false,\n        rtpCapabilities: null,\n        reason: \"Invalid roomName or islevel or apiUserName or secret\",\n      };\n      reject(validationError);\n      return;\n    }\n\n    socket.emit(\n      \"joinRoom\",\n      { roomName, islevel, member, sec, apiUserName },\n      async (data: ResponseJoinRoom) => {\n        try {\n          // Check if rtpCapabilities is null\n          if (data.rtpCapabilities === null) {\n            // Check if banned, suspended, or noAdmin\n            if (data.banned) {\n              throw new Error(\"User is banned.\");\n            }\n            if (data.suspended) {\n              throw new Error(\"User is suspended.\");\n            }\n            if (data.noAdmin) {\n              throw new Error(\"Host has not joined the room yet.\");\n            }\n\n            // If not null, create device or perform other actions as needed\n            // ...\n\n            // Resolve with the data received from the 'joinRoom' event\n            resolve(data);\n          } else {\n            // Handle other cases or perform additional actions\n            // ...\n\n            // Resolve with the data received from the 'joinRoom' event\n            resolve(data);\n          }\n        } catch (error) {\n          // Handle errors during the joinRoom process\n          console.log(\"Error joining room:\", error);\n          reject(error);\n        }\n      }\n    );\n  });\n}\n\nexport { joinRoom };\n","import type { Socket } from \"socket.io-client\"; // Import the Socket type from the socket.io-client module\nimport { joinRoom } from \"../../producers/producerEmits/joinRoom\"; // Import the joinRoom function from the joinRoom file\nimport { joinConRoom } from \"../../producers/producerEmits/joinConRoom\"; // Import the joinConRoom function from the joinConRoom file\nimport type { ResponseJoinRoom } from \"../../@types/types\";\n\nexport interface JoinRoomClientOptions {\n  socket: Socket;\n  roomName: string;\n  islevel: string;\n  member: string;\n  sec: string;\n  apiUserName: string;\n  consume?: boolean;\n}\n\n// Export the type definition for the function\nexport type JoinRoomClientType = (params: JoinRoomClientOptions) => Promise<any>;\n\n/**\n * Joins a room by emitting the `joinRoom` event to the server using the provided socket.\n *\n * @param {JoinRoomClientOptions} options - The options for joining the room.\n * @param {Socket} options.socket - The socket instance to use for communication.\n * @param {string} options.roomName - The name of the room to join.\n * @param {string} options.islevel - The level indicator for the room.\n * @param {string} options.member - The member identifier.\n * @param {string} options.sec - The security token or identifier.\n * @param {string} options.apiUserName - The API username for authentication.\n * @param {boolean} [options.consume=false] - Flag to determine which join function to use.\n * @returns {Promise<ResponseJoinRoom | Partial<ResponseJoinRoom>>} A promise that resolves with the data returned from the server.\n * @throws {Error} Throws an error if the room joining process fails.\n *\n * @example\n * ```typescript\n * const options = {\n *   socket: socketInstance,\n *   roomName: \"room1\",\n *   islevel: \"2\",\n *   member: \"user123\",\n *   sec: \"secureToken\",\n *   apiUserName: \"apiUser\",\n *   consume: true\n * };\n *\n * try {\n *   const response = await joinRoomClient(options);\n *   console.log(\"Joined room successfully:\", response);\n * } catch (error) {\n *   console.error(\"Failed to join room:\", error);\n * }\n * ```\n */\n\nexport const joinRoomClient = async ({\n  socket,\n  roomName,\n  islevel,\n  member,\n  sec,\n  apiUserName,\n  consume = false,\n}: JoinRoomClientOptions): Promise<any> => {\n  try {\n    // Emit the joinRoom event to the server using the provided socket\n    let data: Partial<ResponseJoinRoom>;\n\n    if (consume) {\n      data = await joinConRoom({ socket, roomName, islevel, member, sec, apiUserName });\n    } else {\n      data = await joinRoom({socket, roomName, islevel, member, sec, apiUserName });\n    }\n\n    return data;\n  } catch (error) {\n    // Handle and log errors during the joinRoom process\n    console.log(error);\n    throw new Error(\"Failed to join the room. Please check your connection and try again.\");\n  }\n};\n\n","// Landscape display sizes\nlet QnHDCons = { width: { ideal: 320 }, height: { ideal: 180 } };\nlet sdCons = { width: { ideal: 640 }, height: { ideal: 360 } };\nlet hdCons = { width: { ideal: 1280 }, height: { ideal: 720 } };\nlet fhdCons = { width: { ideal: 1920 }, height: { ideal: 1080 } };\nlet qhdCons = { width: { ideal: 2560 }, height: { ideal: 1440 } };\n\n// Portrait display sizes\nlet QnHDConsPort = { width: { ideal: 180 }, height: { ideal: 320 } };\nlet sdConsPort = { width: { ideal: 360 }, height: { ideal: 640 } };\nlet hdConsPort = { width: { ideal: 720 }, height: { ideal: 1280 } };\nlet fhdConsPort = { width: { ideal: 1080 }, height: { ideal: 1920 } };\nlet qhdConsPort = { width: { ideal: 1440 }, height: { ideal: 2560 } };\n\n// Neutral (Square) display sizes\nlet QnHDConsNeu = { width: { ideal: 240 }, height: { ideal: 240 } };\nlet sdConsNeu = { width: { ideal: 480 }, height: { ideal: 480 } };\nlet hdConsNeu = { width: { ideal: 960 }, height: { ideal: 960 } };\nlet fhdConsNeu = { width: { ideal: 1440 }, height: { ideal: 1440 } };\nlet qhdConsNeu = { width: { ideal: 1920 }, height: { ideal: 1920 } };\n\n//frameRates for video capture\nlet QnHDFrameRate = 5;\nlet sdFrameRate = 10;\nlet hdFrameRate = 15;\nlet fhdFrameRate = 20;\nlet qhdFrameRate = 30;\nlet screenFrameRate = 30;\n\n/**\n * Exports various video capture constraints and frame rates.\n * \n * @exports\n * - `QnHDCons`: Constraints for Quarter HD resolution.\n * - `sdCons`: Constraints for Standard Definition resolution.\n * - `hdCons`: Constraints for High Definition resolution.\n * - `fhdCons`: Constraints for Full HD resolution.\n * - `qhdCons`: Constraints for Quad HD resolution.\n * - `QnHDConsPort`: Constraints for Quarter HD resolution (portrait mode).\n * - `sdConsPort`: Constraints for Standard Definition resolution (portrait mode).\n * - `hdConsPort`: Constraints for High Definition resolution (portrait mode).\n * - `fhdConsPort`: Constraints for Full HD resolution (portrait mode).\n * - `qhdConsPort`: Constraints for Quad HD resolution (portrait mode).\n * - `QnHDConsNeu`: Constraints for Quarter HD resolution (neutral mode).\n * - `sdConsNeu`: Constraints for Standard Definition resolution (neutral mode).\n * - `hdConsNeu`: Constraints for High Definition resolution (neutral mode).\n * - `fhdConsNeu`: Constraints for Full HD resolution (neutral mode).\n * - `qhdConsNeu`: Constraints for Quad HD resolution (neutral mode).\n * - `QnHDFrameRate`: Frame rate for Quarter HD resolution.\n * - `sdFrameRate`: Frame rate for Standard Definition resolution.\n * - `hdFrameRate`: Frame rate for High Definition resolution.\n * - `fhdFrameRate`: Frame rate for Full HD resolution.\n * - `qhdFrameRate`: Frame rate for Quad HD resolution.\n * - `screenFrameRate`: Frame rate for screen capture.\n * \n */\nexport {\n  QnHDCons,\n  sdCons,\n  hdCons,\n  fhdCons,\n  qhdCons,\n  QnHDConsPort,\n  sdConsPort,\n  hdConsPort,\n  fhdConsPort,\n  qhdConsPort,\n  QnHDConsNeu,\n  sdConsNeu,\n  hdConsNeu,\n  fhdConsNeu,\n  qhdConsNeu,\n  QnHDFrameRate,\n  sdFrameRate,\n  hdFrameRate,\n  fhdFrameRate,\n  qhdFrameRate,\n  screenFrameRate,\n};\n","import {\n  QnHDCons,\n  sdCons,\n  hdCons,\n  fhdCons,\n  qhdCons,\n  QnHDConsPort,\n  sdConsPort,\n  hdConsPort,\n  fhdConsPort,\n  qhdConsPort,\n  QnHDConsNeu,\n  sdConsNeu,\n  hdConsNeu,\n  fhdConsNeu,\n  qhdConsNeu,\n  QnHDFrameRate,\n  hdFrameRate,\n  fhdFrameRate,\n  qhdFrameRate,\n} from \"../../methods/utils/producer/videoCaptureConstraints\"; // Import the video capture constraints from the videoCaptureConstraints.js file\n\nimport { hParams as host_Params } from \"../../methods/utils/producer/hParams\";\nimport type { HParamsType } from \"../../methods/utils/producer/hParams\";\nimport { vParams as video_Params } from \"../../methods/utils/producer/vParams\";\nimport type { VParamsType } from \"../../methods/utils/producer/vParams\";\nimport { screenParams as screen_Params } from \"../../methods/utils/producer/screenParams\";\nimport type { ScreenParamsType } from \"../../methods/utils/producer/screenParams\";\nimport { aParams as audio_Params } from \"../../methods/utils/producer/aParams\";\nimport type { AParamsType } from \"../../methods/utils/producer/aParams\";\nimport type { RtpCapabilities } from \"mediasoup-client\";\nimport type { MeetingRoomParams, VidCons, ShowAlert, ResponseJoinRoom, EventType } from \"../../@types/types\";\n\nexport interface UpdateRoomParametersClientParameters {\n  rtpCapabilities: RtpCapabilities | null;\n  roomRecvIPs: string[];\n  meetingRoomParams: MeetingRoomParams | null;\n  itemPageLimit: number;\n  audioOnlyRoom: boolean;\n  addForBasic: boolean;\n  screenPageLimit: number;\n  shareScreenStarted: boolean;\n  shared: boolean;\n  targetOrientation: string;\n  vidCons: VidCons;\n  recordingVideoSupport: boolean;\n  frameRate: number;\n  adminPasscode: string;\n  eventType: EventType;\n  youAreCoHost: boolean;\n  autoWave: boolean;\n  forceFullDisplay: boolean;\n  chatSetting: string;\n  meetingDisplayType: string;\n  audioSetting: string;\n  videoSetting: string;\n  screenshareSetting: string;\n  hParams: HParamsType;\n  vParams: VParamsType;\n  screenParams: ScreenParamsType;\n  aParams: AParamsType;\n  islevel: string;\n  showAlert?: ShowAlert;\n  data: ResponseJoinRoom;\n  // update functions\n  updateRtpCapabilities: (rtpCapabilities: RtpCapabilities | null) => void;\n  updateRoomRecvIPs: (roomRecvIPs: string[]) => void;\n  updateMeetingRoomParams: (meetingRoomParams: MeetingRoomParams | null) => void;\n  updateItemPageLimit: (limit: number) => void;\n  updateAudioOnlyRoom: (isAudioOnly: boolean) => void;\n  updateAddForBasic: (addForBasic: boolean) => void;\n  updateScreenPageLimit: (limit: number) => void;\n  updateVidCons: (cons: VidCons) => void;\n  updateFrameRate: (frameRate: number) => void;\n  updateAdminPasscode: (passcode: string) => void;\n  updateEventType: (eventType: EventType) => void;\n  updateYouAreCoHost: (coHost: boolean) => void;\n  updateAutoWave: (autoWave: boolean) => void;\n  updateForceFullDisplay: (forceFull: boolean) => void;\n  updateChatSetting: (setting: string) => void;\n  updateMeetingDisplayType: (type: string) => void;\n  updateAudioSetting: (setting: string) => void;\n  updateVideoSetting: (setting: string) => void;\n  updateScreenshareSetting: (setting: string) => void;\n  updateHParams: (params: HParamsType) => void;\n  updateVParams: (params: VParamsType) => void;\n  updateScreenParams: (params: ScreenParamsType) => void;\n  updateAParams: (params: AParamsType) => void;\n  updateMainHeightWidth: (heightWidth: number) => void;\n  updateTargetResolution: (resolution: string) => void;\n  updateTargetResolutionHost: (resolution: string) => void;\n\n\n  // Recording-related update functions\n  updateRecordingAudioPausesLimit: (limit: number) => void;\n  updateRecordingAudioPausesCount: (count: number) => void;\n  updateRecordingAudioSupport: (support: boolean) => void;\n  updateRecordingAudioPeopleLimit: (limit: number) => void;\n  updateRecordingAudioParticipantsTimeLimit: (limit: number) => void;\n  updateRecordingVideoPausesCount: (count: number) => void;\n  updateRecordingVideoPausesLimit: (limit: number) => void;\n  updateRecordingVideoSupport: (support: boolean) => void;\n  updateRecordingVideoPeopleLimit: (limit: number) => void;\n  updateRecordingVideoParticipantsTimeLimit: (limit: number) => void;\n  updateRecordingAllParticipantsSupport: (support: boolean) => void;\n  updateRecordingVideoParticipantsSupport: (support: boolean) => void;\n  updateRecordingAllParticipantsFullRoomSupport: (support: boolean) => void;\n  updateRecordingVideoParticipantsFullRoomSupport: (support: boolean) => void;\n  updateRecordingPreferredOrientation: (orientation: string) => void;\n  updateRecordingSupportForOtherOrientation: (support: boolean) => void;\n  updateRecordingMultiFormatsSupport: (support: boolean) => void;\n  updateRecordingVideoOptions: (options: string) => void;\n  updateRecordingAudioOptions: (options: string) => void;\n}\n\nexport type UpdateRoomParametersClientOptions = {\n  parameters: UpdateRoomParametersClientParameters;\n};\n\n// Export type definition for the function\nexport type UpdateRoomParametersClientType = (options: UpdateRoomParametersClientOptions) => void;\n\n/**\n * Updates the room parameters for the client.\n *\n * @param {Object} params - The parameters object.\n * @param {UpdateRoomParametersClientParameters} params.parameters - The parameters to update the room with.\n *\n * @throws Will throw an error if the update process fails.\n *\n * @example\n * updateRoomParametersClient({\n *   parameters: {\n *     screenPageLimit: 10,\n *     shareScreenStarted: true,\n *     shared: false,\n *     hParams: host_Params,\n *     vParams: video_Params,\n *     frameRate: 30,\n *     islevel: \"1\",\n *     showAlert: (alert) => console.log(alert),\n *     data: {\n *       rtpCapabilities: {},\n *       reason: \"Some reason\",\n *       secureCode: \"1234\",\n *       roomRecvIPs: [\"192.168.1.1\"],\n *       meetingRoomParams: {\n *         itemPageLimit: 5,\n *         type: \"conference\",\n *         audioSetting: {},\n *         videoSetting: {},\n *         screenshareSetting: {},\n *         chatSetting: {},\n *         mediaType: \"video\",\n *         targetOrientationHost: \"landscape\",\n *         targetOrientation: \"portrait\",\n *         targetResolutionHost: \"hd\",\n *         targetResolution: \"sd\",\n *       },\n *       recordingParams: {\n *         recordingAudioPausesLimit: 3,\n *         recordingAudioPausesCount: 1,\n *         recordingAudioSupport: true,\n *         recordingAudioPeopleLimit: 10,\n *         recordingAudioParticipantsTimeLimit: 60,\n *         recordingVideoPausesCount: 2,\n *         recordingVideoPausesLimit: 3,\n *         recordingVideoSupport: true,\n *         recordingVideoPeopleLimit: 5,\n *         recordingVideoParticipantsTimeLimit: 30,\n *         recordingAllParticipantsSupport: true,\n *         recordingVideoParticipantsSupport: true,\n *         recordingAllParticipantsFullRoomSupport: true,\n *         recordingVideoParticipantsFullRoomSupport: true,\n *         recordingPreferredOrientation: \"landscape\",\n *         recordingSupportForOtherOrientation: true,\n *         recordingMultiFormatsSupport: true,\n *       },\n *     },\n *     updateRtpCapabilities: (capabilities) => {},\n *     updateRoomRecvIPs: (ips) => {},\n *     updateMeetingRoomParams: (params) => {},\n *     updateItemPageLimit: (limit) => {},\n *     updateAudioOnlyRoom: (isAudioOnly) => {},\n *     updateScreenPageLimit: (limit) => {},\n *     updateVidCons: (cons) => {},\n *     updateFrameRate: (rate) => {},\n *     updateAdminPasscode: (passcode) => {},\n *     updateEventType: (type) => {},\n *     updateYouAreCoHost: (isCoHost) => {},\n *     updateAutoWave: (autoWave) => {},\n *     updateForceFullDisplay: (forceFullDisplay) => {},\n *     updateChatSetting: (chatSetting) => {},\n *     updateMeetingDisplayType: (displayType) => {},\n *     updateAudioSetting: (audioSetting) => {},\n *     updateVideoSetting: (videoSetting) => {},\n *     updateScreenshareSetting: (screenshareSetting) => {},\n *     updateHParams: (hParams) => {},\n *     updateVParams: (vParams) => {},\n *     updateScreenParams: (screenParams) => {},\n *     updateAParams: (aParams) => {},\n *     updateRecordingAudioPausesLimit: (limit) => {},\n *     updateRecordingAudioPausesCount: (count) => {},\n *     updateRecordingAudioSupport: (support) => {},\n *     updateRecordingAudioPeopleLimit: (limit) => {},\n *     updateRecordingAudioParticipantsTimeLimit: (timeLimit) => {},\n *     updateRecordingVideoPausesCount: (count) => {},\n *     updateRecordingVideoPausesLimit: (limit) => {},\n *     updateRecordingVideoSupport: (support) => {},\n *     updateRecordingVideoPeopleLimit: (limit) => {},\n *     updateRecordingVideoParticipantsTimeLimit: (timeLimit) => {},\n *     updateRecordingAllParticipantsSupport: (support) => {},\n *     updateRecordingVideoParticipantsSupport: (support) => {},\n *     updateRecordingAllParticipantsFullRoomSupport: (support) => {},\n *     updateRecordingVideoParticipantsFullRoomSupport: (support) => {},\n *     updateRecordingPreferredOrientation: (orientation) => {},\n *     updateRecordingSupportForOtherOrientation: (support) => {},\n *     updateRecordingMultiFormatsSupport: (support) => {},\n *     updateRecordingVideoOptions: (options) => {},\n *     updateRecordingAudioOptions: (options) => {}, \n *     updateMainHeightWidth: (heightWidth) => {},\n *   }\n * });\n */\n\nexport const updateRoomParametersClient = ({ parameters }: UpdateRoomParametersClientOptions): void => {\n  try {\n    const {\n      screenPageLimit,\n      shareScreenStarted,\n      shared,\n\n      hParams = host_Params,\n      vParams = video_Params,\n      frameRate,\n\n      islevel,\n      showAlert,\n      data,\n\n      //updates\n      updateRtpCapabilities,\n      updateRoomRecvIPs,\n      updateMeetingRoomParams,\n      updateItemPageLimit,\n      updateAudioOnlyRoom,\n      updateScreenPageLimit,\n      updateVidCons,\n      updateFrameRate,\n      updateAdminPasscode,\n      updateEventType,\n      updateYouAreCoHost,\n      updateAutoWave,\n      updateForceFullDisplay,\n      updateChatSetting,\n      updateMeetingDisplayType,\n      updateAudioSetting,\n      updateVideoSetting,\n      updateScreenshareSetting,\n      updateHParams,\n      updateVParams,\n      updateScreenParams,\n      updateAParams,\n      updateTargetResolution,\n      updateTargetResolutionHost,\n      \n  \n\n      // Recording updates\n      updateRecordingAudioPausesLimit,\n      updateRecordingAudioPausesCount,\n      updateRecordingAudioSupport,\n      updateRecordingAudioPeopleLimit,\n      updateRecordingAudioParticipantsTimeLimit,\n      updateRecordingVideoPausesCount,\n      updateRecordingVideoPausesLimit,\n      updateRecordingVideoSupport,\n      updateRecordingVideoPeopleLimit,\n      updateRecordingVideoParticipantsTimeLimit,\n      updateRecordingAllParticipantsSupport,\n      updateRecordingVideoParticipantsSupport,\n      updateRecordingAllParticipantsFullRoomSupport,\n      updateRecordingVideoParticipantsFullRoomSupport,\n      updateRecordingPreferredOrientation,\n      updateRecordingSupportForOtherOrientation,\n      updateRecordingMultiFormatsSupport,\n      updateRecordingVideoOptions,\n      updateRecordingAudioOptions,\n      updateMainHeightWidth,\n    } = parameters;\n\n    if (data.rtpCapabilities == null) {\n      let reason = data.reason || \"\";\n      showAlert?.({\n        message: \"Sorry, you are not allowed to join this room. \" + reason,\n        type: \"danger\",\n        duration: 3000,\n      });\n      return;\n    }\n\n    // Update all values\n    updateRtpCapabilities(data.rtpCapabilities);\n    updateAdminPasscode(data.secureCode);\n    updateRoomRecvIPs(data.roomRecvIPs);\n    updateMeetingRoomParams(data.meetingRoomParams);\n\n    // Update recording values\n    updateRecordingAudioPausesLimit(data.recordingParams.recordingAudioPausesLimit);\n    updateRecordingAudioPausesCount(data.recordingParams.recordingAudioPausesCount!);\n    updateRecordingAudioSupport(data.recordingParams.recordingAudioSupport);\n    updateRecordingAudioPeopleLimit(data.recordingParams.recordingAudioPeopleLimit);\n    updateRecordingAudioParticipantsTimeLimit(data.recordingParams.recordingAudioParticipantsTimeLimit);\n    updateRecordingVideoPausesCount(data.recordingParams.recordingVideoPausesCount!);\n    updateRecordingVideoPausesLimit(data.recordingParams.recordingVideoPausesLimit);\n    updateRecordingVideoSupport(data.recordingParams.recordingVideoSupport);\n    updateRecordingVideoPeopleLimit(data.recordingParams.recordingVideoPeopleLimit);\n    updateRecordingVideoParticipantsTimeLimit(data.recordingParams.recordingVideoParticipantsTimeLimit);\n    updateRecordingAllParticipantsSupport(data.recordingParams.recordingAllParticipantsSupport);\n    updateRecordingVideoParticipantsSupport(data.recordingParams.recordingVideoParticipantsSupport);\n    updateRecordingAllParticipantsFullRoomSupport(data.recordingParams.recordingAllParticipantsFullRoomSupport);\n    updateRecordingVideoParticipantsFullRoomSupport(data.recordingParams.recordingVideoParticipantsFullRoomSupport);\n    updateRecordingPreferredOrientation(data.recordingParams.recordingPreferredOrientation);\n    updateRecordingSupportForOtherOrientation(data.recordingParams.recordingSupportForOtherOrientation);\n    updateRecordingMultiFormatsSupport(data.recordingParams.recordingMultiFormatsSupport);\n\n    // Update other meeting room settings\n    updateItemPageLimit(data.meetingRoomParams.itemPageLimit);\n    updateEventType(data.meetingRoomParams.type);\n\n    if (data.meetingRoomParams.type == \"chat\" && islevel != \"2\") {\n      updateYouAreCoHost(true);\n    }\n\n    if ([\"chat\", \"broadcast\"].includes(data.meetingRoomParams.type)) {\n      updateAutoWave(false);\n      updateMeetingDisplayType(\"all\");\n      updateForceFullDisplay(true);\n      updateChatSetting('allow');\n      updateItemPageLimit(2);\n\n      if ([\"broadcast\"].includes(data.meetingRoomParams.type)) {\n          updateRecordingVideoOptions(\"mainScreen\");\n          updateRecordingAudioOptions(\"host\");\n          updateItemPageLimit(1);\n      }\n    }\n\n    updateAudioSetting(data.meetingRoomParams.audioSetting);\n    updateVideoSetting(data.meetingRoomParams.videoSetting);\n    updateScreenshareSetting(data.meetingRoomParams.screenshareSetting);\n    updateChatSetting(data.meetingRoomParams.chatSetting);\n\n    updateAudioOnlyRoom(data.meetingRoomParams.mediaType != \"video\");\n\n    if (data.meetingRoomParams.type == \"conference\" && (shared || shareScreenStarted)) {\n      updateMainHeightWidth(100);\n    } else {\n      updateMainHeightWidth(0);\n    }\n\n    updateScreenPageLimit(Math.min(data.meetingRoomParams.itemPageLimit, screenPageLimit));\n\n    // Assign media capture constraints based on the user's role and room settings\n    let targetOrientation = islevel == \"2\" ? data.meetingRoomParams.targetOrientationHost : data.meetingRoomParams.targetOrientation;\n    let targetResolution = islevel == \"2\" ? data.meetingRoomParams.targetResolutionHost : data.meetingRoomParams.targetResolution;\n\n    let vidCons: VidCons;\n    if (targetOrientation == \"landscape\") {\n      vidCons = targetResolution == \"hd\" ? hdCons : targetResolution == \"fhd\" ? fhdCons : targetResolution == \"qhd\" ? qhdCons : targetResolution == \"sd\" ? sdCons : QnHDCons;\n    } else if (targetOrientation == \"neutral\") {\n      vidCons = targetResolution == \"hd\" ? hdConsNeu : targetResolution == \"fhd\" ? fhdConsNeu : targetResolution == \"qhd\" ? qhdConsNeu : targetResolution == \"sd\" ? sdConsNeu : QnHDConsNeu;\n    } else {\n      vidCons = targetResolution == \"hd\" ? hdConsPort : targetResolution == \"fhd\" ? fhdConsPort : targetResolution == \"qhd\" ? qhdConsPort : targetResolution == \"sd\" ? sdConsPort : QnHDConsPort;\n    }\n\n    let frameRateValue = frameRate ? frameRate : 10;\n\n    let vParamsValue = { ...vParams };\n    let hParamsValue = { ...hParams };\n \n    if (Object.keys(vParamsValue).length == 0) {\n      vParamsValue = { ...video_Params };\n    }\n\n    if (Object.keys(hParamsValue).length == 0) {\n      hParamsValue = { ...host_Params };\n    }\n\n    if (targetResolution == \"hd\") {\n      frameRateValue = hdFrameRate;\n      vParamsValue.encodings.forEach((encoding: Partial<VParamsType[\"encodings\"][0]>) => {\n        if (encoding.maxBitrate) {\n          encoding.maxBitrate *= 4;\n        }\n      });\n\n      hParamsValue.encodings.forEach((encoding: Partial<HParamsType[\"encodings\"][0]>) => {\n        if (encoding.maxBitrate) {\n          encoding.maxBitrate *= 4;\n        }\n      });\n    } else if (targetResolution == \"QnHD\") {\n      frameRateValue = QnHDFrameRate;\n      vParamsValue.encodings.forEach((encoding: Partial<VParamsType[\"encodings\"][0]>) => {\n        if (encoding.maxBitrate) {\n          encoding.maxBitrate *= 0.25;\n        }\n      });\n\n      hParamsValue.encodings.forEach((encoding: Partial<HParamsType[\"encodings\"][0]>) => {\n        if (encoding.maxBitrate) {\n          encoding.maxBitrate *= 0.25;\n        }\n      });\n\n      if (hParamsValue.codecOptions && hParamsValue.codecOptions.videoGoogleStartBitrate) {\n        hParamsValue.codecOptions.videoGoogleStartBitrate *= 0.25;\n      }\n      if (vParamsValue.codecOptions && vParamsValue.codecOptions.videoGoogleStartBitrate) {\n        vParamsValue.codecOptions.videoGoogleStartBitrate *= 0.25;\n      }\n    } else if (targetResolution == 'fhd') {\n      frameRateValue = fhdFrameRate;\n      vParamsValue.encodings.forEach((encoding: Partial<VParamsType[\"encodings\"][0]>) => {\n        if (encoding.maxBitrate) {\n          encoding.maxBitrate *= 8;\n        }\n      });\n\n      hParamsValue.encodings.forEach((encoding: Partial<HParamsType[\"encodings\"][0]>) => {\n        if (encoding.maxBitrate) {\n          encoding.maxBitrate *= 8;\n        }\n      });\n    } else if (targetResolution == 'qhd') {\n      frameRateValue = qhdFrameRate;\n      vParamsValue.encodings.forEach((encoding: Partial<VParamsType[\"encodings\"][0]>) => {\n        if (encoding.maxBitrate) {\n          encoding.maxBitrate *= 16;\n        }\n      });\n\n      hParamsValue.encodings.forEach((encoding: Partial<HParamsType[\"encodings\"][0]>) => {\n        if (encoding.maxBitrate) {\n          encoding.maxBitrate *= 16;\n        }\n      });\n    }\n\n    if (data.recordingParams.recordingVideoSupport) {\n      vParamsValue.encodings.forEach((encoding: Partial<VParamsType[\"encodings\"][0]>) => {\n        if (encoding.maxBitrate) {\n          encoding.maxBitrate *= 1.2;\n        }\n      });\n\n      hParamsValue.encodings.forEach((encoding: Partial<HParamsType[\"encodings\"][0]>) => {\n        if (encoding.maxBitrate) {\n          encoding.maxBitrate *= 1.2;\n        }\n      });\n\n      if (hParamsValue.codecOptions && hParamsValue.codecOptions.videoGoogleStartBitrate) {\n        hParamsValue.codecOptions.videoGoogleStartBitrate *= 1.2;\n      }\n      if (vParamsValue.codecOptions && vParamsValue.codecOptions.videoGoogleStartBitrate) {\n        vParamsValue.codecOptions.videoGoogleStartBitrate *= 1.2;\n      }\n    }\n\n    updateVidCons(vidCons);\n    updateFrameRate(frameRateValue);\n    updateHParams(hParamsValue);\n    updateVParams(vParamsValue);\n    updateScreenParams(screen_Params);\n    updateAParams(audio_Params);\n    updateTargetResolution(data.meetingRoomParams.targetResolution);\n    updateTargetResolutionHost(data.meetingRoomParams.targetResolutionHost);\n  } catch (error) {\n    console.log(\"updateRoomParametersClient error\", error);\n    if (parameters.showAlert) {\n      parameters.showAlert({\n        message: (error as Error).message,\n        type: \"danger\",\n        duration: 3000,\n      });\n    }\n  }\n};\n","import type { PreJoinPageParameters } from \"../../@types/types\";\nimport type { Socket } from \"socket.io-client\";\nimport Cookies from \"universal-cookie\";\n\n\nconst cookies = new Cookies();\nconst MAX_ATTEMPTS = 10; // Maximum number of unsuccessful attempts before rate limiting\nconst RATE_LIMIT_DURATION = 3 * 60 * 60 * 1000; // 3 hours in milliseconds\n\n\nexport const checkLimitsAndMakeRequest = async ({\n    apiUserName,\n    apiToken,\n    link,\n    apiKey = \"\",\n    userName,\n    parameters,\n    validate = true,\n  }: {\n    apiUserName: string;\n    apiToken: string;\n    link: string;\n    apiKey?: string;\n    userName: string;\n    parameters: PreJoinPageParameters;\n    validate?: boolean;\n  }) => {\n    const TIMEOUT_DURATION = 10000; // 10 seconds\n    let unsuccessfulAttempts =\n      parseInt(cookies.get(\"unsuccessfulAttempts\")) || 0;\n    let lastRequestTimestamp =\n      parseInt(cookies.get(\"lastRequestTimestamp\")) || 0;\n  \n    if (\n      unsuccessfulAttempts >= MAX_ATTEMPTS &&\n      Date.now() - lastRequestTimestamp < RATE_LIMIT_DURATION\n    ) {\n      parameters.showAlert?.({\n        message: \"Too many unsuccessful attempts. Please try again later.\",\n        type: \"danger\",\n        duration: 3000,\n      });\n      return;\n    } else {\n      unsuccessfulAttempts = 0;\n      cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n      cookies.set(\"lastRequestTimestamp\", Date.now().toString());\n    }\n  \n    try {\n      parameters.updateIsLoadingModalVisible(true);\n      const socketPromise = await parameters.connectSocket({\n        apiUserName,\n        apiKey,\n        apiToken,\n        link,\n      });\n      const timeoutPromise = new Promise<null>((_, reject) =>\n        setTimeout(\n          () => reject(new Error(\"Request timed out\")),\n          TIMEOUT_DURATION\n        )\n      );\n  \n      const socketResult = await Promise.race([socketPromise, timeoutPromise]) as Socket | null;\n      if (\n        socketResult &&\n        typeof socketResult === \"object\" &&\n        \"id\" in socketResult &&\n        typeof socketResult.id === \"string\"\n      ) {\n        const socket = socketResult as Socket;\n        unsuccessfulAttempts = 0;\n        cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n        cookies.set(\"lastRequestTimestamp\", Date.now().toString());\n        if (validate){\n          // only one connection is established, no local socket\n          parameters.updateSocket(socket);\n        }else{\n          // local socket is also established, mediaSFU connection is now the local socket\n          parameters.updateLocalSocket?.(socket);\n        }\n        parameters.updateApiUserName(apiUserName);\n        parameters.updateApiToken(apiToken);\n        parameters.updateLink(link);\n        parameters.updateRoomName(apiUserName);\n        parameters.updateMember(userName);\n        if (validate) parameters.updateValidated(true);\n      } else {\n        unsuccessfulAttempts += 1;\n        cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n        parameters.updateIsLoadingModalVisible(false);\n        parameters.showAlert?.({\n          message: \"Invalid credentials.\",\n          type: \"danger\",\n          duration: 3000,\n        });\n      }\n    } catch {\n      parameters.showAlert?.({\n        message: \"Unable to connect. Check your credentials and try again.\",\n        type: \"danger\",\n        duration: 3000,\n      });\n      unsuccessfulAttempts += 1;\n      cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n      parameters.updateIsLoadingModalVisible(false);\n    }\n  };","import type { ResponseJoinLocalRoom, PreJoinPageParameters, JoinMediaSFURoomOptions } from \"../../@types/types\";\nimport { validateAlphanumeric } from \"../../methods/utils/validateAlphanumeric\";\nimport type { Socket } from \"socket.io-client\";\nimport { joinRoomOnMediaSFU } from \"../../methods/utils/joinRoomOnMediaSFU\";\nimport type { JoinRoomOnMediaSFUType } from \"../../methods/utils/joinRoomOnMediaSFU\";\nimport { checkLimitsAndMakeRequest } from \"../../methods/utils/checkLimitsAndMakeRequest\";\n\nexport interface JoinLocalRoomOptions {\n  socket: Socket;\n  roomName: string;\n  islevel: string;\n  member: string;\n  sec: string;\n  apiUserName: string;\n  parameters: PreJoinPageParameters;\n  checkConnect?: boolean;\n  joinMediaSFURoom?: JoinRoomOnMediaSFUType,\n  localLink?: string;\n}\n\n// Export the type definition for the function\nexport type JoinLocalRoomType = (\n  options: JoinLocalRoomOptions\n) => Promise<ResponseJoinLocalRoom>;\n\n\nexport interface CheckMediasfuURLOptions {\n  data: ResponseJoinLocalRoom;\n  member: string;\n  roomName: string;\n  islevel: string;\n  socket: Socket;\n  parameters: PreJoinPageParameters;\n  joinMediaSFURoom?: JoinRoomOnMediaSFUType,\n  localLink?: string;\n}\n\n// Export the type definition for the function\nexport type CheckMediasfuURLType = (options: CheckMediasfuURLOptions) => Promise<void>;\n\n/**\n * Checks the MediaSFU URL and processes the necessary actions based on the URL's validity.\n *\n * @param {CheckMediasfuURLOptions} options - The options for checking and handling the MediaSFU URL.\n * @param {ResponseJoinLocalRoom} options.data - The data received from the room join response.\n * @param {string} options.member - The member identifier.\n * @param {string} options.roomName - The name of the room to join.\n * @param {string} options.islevel - The level of the user.\n * @param {Socket} options.socket - The socket instance to use for communication.\n * @param {PreJoinPageParameters} options.parameters - Additional parameters for pre-join page actions.\n * @param {JoinRoomOnMediaSFUType} [options.joinMediaSFURoom] - The function to join a room on MediaSFU.\n * @param {string} [options.localLink] - The local link for the Community Edition.\n * \n * @returns {Promise<void>} A promise that resolves when the actions are complete.\n * \n * @example\n * ```typescript\n * const options = {\n *   data: {\n *     mediasfuURL: \"https://example.com/meet/room123/secret\",\n *     allowRecord: true,\n *     apiKey: \"1234567890123456789012345678901234567890123456789012345678901234\",\n *     apiUserName: \"user123\",\n *   },\n *   member: \"user123\",\n *   roomName: \"s12345678\",\n *   islevel: \"1\",\n *   socket: socketInstance,\n *   parameters: {\n *     someParameter: \"value\",\n *   },\n * };\n *\n * try {\n *   await checkMediasfuURL(options);\n *   console.log(\"MediaSFU URL processed successfully.\");\n * } catch (error) {\n *   console.error(\"Failed to process MediaSFU URL:\", error);\n * }\n * ```\n */\n\nexport async function checkMediasfuURL({\n  data,\n  member,\n  roomName,\n  islevel,\n  socket,\n  parameters,\n  joinMediaSFURoom = joinRoomOnMediaSFU,\n  localLink = \"\",\n}: CheckMediasfuURLOptions): Promise<void> {\n\n  if (\n    data.mediasfuURL &&\n    data.mediasfuURL !== \"\" &&\n    data.mediasfuURL.length > 10\n  ) {\n    let link = data.mediasfuURL;\n    let secretCode: string | undefined;\n\n    try {\n      const splitTexts = [\"/meet/\", \"/chat/\", \"/broadcast/\"];\n      const splitText =\n        splitTexts.find((text) => data.mediasfuURL.includes(text)) ||\n        \"/meet/\";\n\n      const urlParts = data.mediasfuURL.split(splitText);\n      link = urlParts[0] ?? link;\n      if (urlParts[1]) {\n        const segments = urlParts[1].split(\"/\");\n        secretCode = segments[1] ?? segments[0];\n      }\n    } catch {\n      // Fallback to initial link with no secret code\n      secretCode = undefined;\n    }\n\n    if (!secretCode) {\n      return;\n    }\n\n    await checkLimitsAndMakeRequest({\n      apiUserName: roomName,\n      apiToken: secretCode,\n      link,\n      apiKey: \"\",\n      userName: member,\n      parameters,\n      validate: false,\n    });\n\n    return;\n  }\n\n  if (\n    (!data.mediasfuURL || data.mediasfuURL.length < 10) &&\n    islevel !== \"2\" &&\n    data.allowRecord &&\n    (data.allowRecord === true || data.allowRecord === \"true\") &&\n    data.apiKey &&\n    data.apiKey.length === 64 &&\n    data.apiUserName &&\n    data.apiUserName.length > 5 &&\n    (roomName.startsWith(\"s\") || roomName.startsWith(\"p\"))\n  ) {\n    const payload:JoinMediaSFURoomOptions = {\n      action: \"join\",\n      meetingID: roomName,\n      userName: member,\n    };\n\n    const response = await joinMediaSFURoom({\n      payload,\n      apiKey: data.apiKey,\n      apiUserName: data.apiUserName,\n      localLink,\n    });\n\n    if (response.success && response.data && \"roomName\" in response.data) {\n\n      try {\n        socket.emit(\n          \"updateMediasfuURL\",\n          { eventID: roomName, mediasfuURL: response.data.publicURL },\n          async () => {}\n        );\n      } catch {\n        // Do nothing\n      }\n    \n      await checkLimitsAndMakeRequest({\n        apiUserName: response.data.roomName,\n        apiToken: response.data.secret,\n        link: response.data.link,\n        userName: member,\n        parameters: parameters,\n        validate: false,\n      });\n      parameters.updateApiToken(response.data.secret);\n    }\n    return;\n  }\n}\n\n/**\n * Joins a user to a specified room via a socket connection.\n *\n * @param {JoinLocalRoomOptions} options - The options for joining the room.\n * @param {Socket} options.socket - The socket instance to use for communication.\n * @param {string} options.roomName - The name of the room to join.\n * @param {string} options.islevel - The level of the user.\n * @param {string} options.member - The member identifier.\n * @param {string} options.sec - The security token.\n * @param {string} options.apiUserName - The API username of the user.\n * @param {PreJoinPageParameters} options.parameters - Additional parameters for pre-join page actions.\n * @param {boolean} options.checkConnect - A flag to check the MediaSFU URL and perform necessary actions.\n * @param {JoinRoomOnMediaSFUType} [options.joinMediaSFURoom] - The function to join a room on MediaSFU.\n * @param {string} [options.localLink] - The local link for the Community Edition.\n * \n * @returns {Promise<object>} A promise that resolves with the data received from the 'joinRoom' event or rejects with a validation error.\n * \n * @example\n * ```typescript\n * const options = {\n *   socket: socketInstance,\n *   roomName: \"s12345678\",\n *   islevel: \"1\",\n *   member: \"user123\",\n *   sec: \"32CharacterLongSecretHere\",\n *   apiUserName: \"user123\",\n *   parameters: { someParameter: \"value\" },\n *   checkConnect: true,\n * };\n *\n * try {\n *   const response = await joinLocalRoom(options);\n *   console.log(\"Room joined:\", response);\n * } catch (error) {\n *   console.error(\"Failed to join room:\", error);\n * }\n * ```\n */\n\nasync function joinLocalRoom\n  ({\n    socket,\n    roomName,\n    islevel,\n    member,\n    sec,\n    apiUserName,\n    parameters,\n    checkConnect = false,\n    joinMediaSFURoom = joinRoomOnMediaSFU,\n    localLink = \"\",\n  }: JoinLocalRoomOptions): Promise<ResponseJoinLocalRoom> {\n\n  return new Promise((resolve, reject) => {\n    // Validate inputs\n    if (!(sec && roomName && islevel && apiUserName && member)) {\n      const validationError = {\n        success: false,\n        rtpCapabilities: null,\n        reason: \"Missing required parameters\",\n      };\n      reject(validationError);\n      return;\n    }\n\n    // Validate alphanumeric for roomName, apiUserName, and member\n    try {\n      validateAlphanumeric({ str: roomName });\n      validateAlphanumeric({ str: apiUserName });\n      validateAlphanumeric({ str: member });\n    } catch {\n      const validationError = {\n        success: false,\n        rtpCapabilities: null,\n        reason: \"Invalid roomName or apiUserName or member\",\n      };\n      reject(validationError);\n      return;\n    }\n\n    // Validate roomName starts with 's' or 'p'\n    if (!(roomName.startsWith(\"s\") || roomName.startsWith(\"p\") || roomName.startsWith(\"m\"))) {\n      const validationError = {\n        success: false,\n        rtpCapabilities: null,\n        reason: \"Invalid roomName, must start with s or p\",\n      };\n      reject(validationError);\n      return;\n    }\n\n    // Validate other conditions for sec, roomName, islevel, apiUserName\n    if (\n      !(\n        sec.length === 32 &&\n        roomName.length >= 8 &&\n        islevel.length === 1 &&\n        apiUserName.length >= 6 &&\n        (islevel === \"0\" || islevel === \"1\" || islevel === \"2\")\n      )\n    ) {\n      const validationError = {\n        success: false,\n        rtpCapabilities: null,\n        reason: \"Invalid roomName or islevel or apiUserName or secret\",\n      };\n      reject(validationError);\n      return;\n    }\n\n    socket.emit(\n      \"joinRoom\",\n      { roomName, islevel, member, sec, apiUserName },\n      async (data: ResponseJoinLocalRoom) => {\n\n        try {\n          // Check if rtpCapabilities is null\n          if (data.rtpCapabilities === null) {\n            // Check if isBanned or hostNotJoined\n            if (data.isBanned) {\n              throw new Error(\"User is banned.\");\n            }\n            if (data.hostNotJoined) {\n              throw new Error(\"Host has not joined the room yet.\");\n            }\n\n            // If not null, create device or perform other actions as needed\n            // ...\n\n            // Resolve with the data received from the 'joinRoom' event\n            resolve(data);\n          } else {\n            if (checkConnect) {\n              await checkMediasfuURL({\n                data,\n                member,\n                roomName,\n                islevel,\n                socket,\n                parameters,\n                joinMediaSFURoom,\n                localLink,\n              });\n            }else {\n              // if mediasfuURL is present, split and get the secret code\n              if (\n                data.mediasfuURL &&\n                data.mediasfuURL !== \"\" &&\n                data.mediasfuURL.length > 10\n              ) {\n                const splitTexts = [\"/meet/\", \"/chat/\", \"/broadcast/\"];\n                const splitText =\n                  splitTexts.find((text) => data.mediasfuURL.includes(text)) ||\n                  \"/meet/\";\n                const urlParts = data.mediasfuURL.split(splitText);\n                let secretCode: string | undefined;\n                if (urlParts[1]) {\n                  const segments = urlParts[1].split(\"/\");\n                  secretCode = segments[1] ?? segments[0];\n                }\n                if (secretCode) {\n                  parameters.updateApiToken(secretCode);\n                }\n              }\n            }\n            // Resolve with the data received from the 'joinRoom' event\n            resolve(data);\n          }\n        } catch (error) {\n          // Handle errors during the joinRoom process\n          console.log(\"Error joining room:\", error);\n          reject(error);\n        }\n      }\n    );\n  });\n}\n\nexport { joinLocalRoom };\n","import { Socket } from \"socket.io-client\";\nimport {\n  Participant, Request, ReorderStreamsType, ReorderStreamsParameters, SleepType, ConnectIpsParameters, OnScreenChangesParameters,\n  OnScreenChangesType, ConnectIpsType, ConsumeSocket, ConnectLocalIpsType, ConnectLocalIpsParameters,\n  CoHostResponsibility,\n  WaitingRoomParticipant\n} from \"../../@types/types\";\n\n/**\n * Handles participant management and UI updates for all members.\n * \n * @param {Object} params - The parameters for the allMembers method.\n * @param {Participant[]} params.members - The array of participant members.\n * @param {Request[]} params.requestss - The array of requests.\n * @param {string} params.coHoste - The co-host identifier.\n * @param {CoHostResponsibility[]} params.coHostRes - The co-host responsibilities.\n * @param {AllMembersParameters} params.parameters - The parameters object for allMembers handling.\n * @param {ConsumeSocket[]} params.consume_sockets - The array of consume sockets.\n * @param {string} params.apiUserName - The API username.\n * @param {string} params.apiKey - The API key.\n * @param {string} params.apiToken - The API token.\n * @returns {Promise<void>} - A promise that resolves when all participant management actions are completed.\n * \n * @example\n * ```typescript\n * await allMembers({\n *   members: participantList,\n *   requestss: requestList,\n *   coHoste: 'coHostName',\n *   coHostRes: [{ type: 'moderate', allowed: true }],\n *   parameters: allMembersParams,\n *   consume_sockets: [socket1, socket2],\n *   apiUserName: 'userAPI',\n *   apiKey: 'apiKey123',\n *   apiToken: 'tokenXYZ'\n * });\n * ```\n */\n\nexport interface AllMembersParameters extends ReorderStreamsParameters, ConnectIpsParameters, OnScreenChangesParameters, ConnectLocalIpsParameters {\n  participantsAll: Participant[];\n  participants: Participant[];\n  dispActiveNames: string[];\n  requestList: Request[];\n  coHost: string;\n  coHostResponsibility: CoHostResponsibility[];\n  lock_screen: boolean;\n  firstAll: boolean;\n  membersReceived: boolean;\n  roomRecvIPs: string[];\n  deferScreenReceived: boolean;\n  screenId?: string;\n  shareScreenStarted: boolean;\n  meetingDisplayType: string;\n  hostFirstSwitch: boolean;\n  waitingRoomList: WaitingRoomParticipant[];\n  islevel: string;\n  socket: Socket;\n\n  updateParticipantsAll: (participantsAll: Participant[]) => void;\n  updateParticipants: (participants: Participant[]) => void;\n  updateRequestList: (requestList: Request[]) => void;\n  updateCoHost: (coHost: string) => void;\n  updateCoHostResponsibility: (coHostRes: CoHostResponsibility[]) => void;\n  updateFirstAll: (firstAll: boolean) => void;\n  updateMembersReceived: (membersReceived: boolean) => void;\n  updateDeferScreenReceived: (deferScreenReceived: boolean) => void;\n  updateShareScreenStarted: (shareScreenStarted: boolean) => void;\n  updateHostFirstSwitch: (hostFirstSwitch: boolean) => void;\n  updateConsume_sockets: (sockets: ConsumeSocket[]) => void;\n  updateRoomRecvIPs: (ips: string[]) => void;\n  updateIsLoadingModalVisible: (visible: boolean) => void;\n  updateTotalReqWait: (total: number) => void;\n\n  // mediasfu functions\n  onScreenChanges: OnScreenChangesType;\n  connectIps: ConnectIpsType;\n  connectLocalIps?: ConnectLocalIpsType;\n  sleep: SleepType;\n  reorderStreams: ReorderStreamsType;\n\n  getUpdatedAllParams: () => AllMembersParameters;\n  [key: string]: any;\n}\n\nexport interface AllMembersOptions {\n  members: Participant[];\n  requestss: Request[];\n  coHoste: string;\n  coHostRes: CoHostResponsibility[];\n  parameters: AllMembersParameters;\n  consume_sockets: ConsumeSocket[];\n  apiUserName: string;\n  apiKey: string;\n  apiToken: string;\n}\n\n\n// Export the type definition for the function\nexport type AllMembersType = (options: AllMembersOptions) => Promise<void>;\n\n/**\n * allMembers - A method for handling various tasks related to participant management and UI updates.\n * @param {Object} params - The parameters passed to the allMembers method.\n * @returns {void} - No return value.\n */\nexport const allMembers = async ({\n  members,\n  requestss,\n  coHoste,\n  coHostRes,\n  parameters,\n  consume_sockets,\n  apiUserName,\n  apiKey,\n  apiToken,\n}: AllMembersOptions): Promise<void> => {\n  let {\n    participantsAll,\n    participants,\n    dispActiveNames,\n    requestList,\n    lock_screen,\n    firstAll,\n    membersReceived,\n    roomRecvIPs,\n    deferScreenReceived,\n    screenId,\n    shareScreenStarted,\n    meetingDisplayType,\n    hostFirstSwitch,\n    waitingRoomList,\n    islevel,\n    socket,\n\n    updateParticipantsAll,\n    updateParticipants,\n    updateRequestList,\n    updateCoHost,\n    updateCoHostResponsibility,\n    updateFirstAll,\n    updateMembersReceived,\n    updateDeferScreenReceived,\n    updateShareScreenStarted,\n    updateHostFirstSwitch,\n    updateConsume_sockets,\n    updateRoomRecvIPs,\n    updateIsLoadingModalVisible,\n    updateTotalReqWait,\n\n    onScreenChanges,\n    connectIps,\n    connectLocalIps,\n    sleep,\n    reorderStreams,\n  } = parameters;\n\n  participantsAll = members.map(({ isBanned, isSuspended, name, audioID, videoID }) => ({\n    isBanned,\n    isSuspended,\n    name,\n    audioID,\n    videoID,\n  }));\n\n  updateParticipantsAll(participantsAll);\n\n  participants = members.filter(\n    (participant) => !participant.isBanned && !participant.isSuspended\n  );\n\n  updateParticipants(participants);\n\n  if (dispActiveNames.length > 0) {\n    const dispActiveNames_ = dispActiveNames.filter(\n      (name) => !participants.map((participant) => participant.name).includes(name)\n    );\n\n    if (dispActiveNames_.length > 0) {\n      await reorderStreams({ add: false, screenChanged: true, parameters });\n    }\n  }\n\n  // check to expect no roomRecvIPs for local instance\n  let onLocal = false;\n  if (roomRecvIPs.length === 1 && roomRecvIPs[0] === \"none\") {\n    onLocal = true;\n  }\n\n\n  if (!membersReceived && !onLocal) {\n    if (roomRecvIPs.length < 1) {\n      let checkIPs = setInterval(async () => {\n        if (roomRecvIPs.length > 0) {\n          clearInterval(checkIPs);\n\n          if (deferScreenReceived && screenId) {\n            shareScreenStarted = true;\n            updateShareScreenStarted(shareScreenStarted);\n          }\n\n          const [sockets_, ips_] = await connectIps({\n            consume_sockets,\n            remIP: roomRecvIPs,\n            parameters,\n            apiUserName,\n            apiKey,\n            apiToken,\n          });\n\n          updateConsume_sockets(sockets_);\n          updateRoomRecvIPs(ips_);\n\n          membersReceived = true;\n          updateMembersReceived(membersReceived);\n\n          await sleep({ ms: 250 });\n          updateIsLoadingModalVisible(false);\n          deferScreenReceived = false;\n          updateDeferScreenReceived(deferScreenReceived);\n        }\n      }, 10);\n    } else {\n      const [sockets_, ips_] = await connectIps({\n        consume_sockets,\n        remIP: roomRecvIPs,\n        parameters,\n        apiUserName,\n        apiKey,\n        apiToken,\n      });\n\n      updateConsume_sockets(sockets_);\n      updateRoomRecvIPs(ips_);\n      membersReceived = true;\n      updateMembersReceived(membersReceived);\n\n      if (deferScreenReceived && screenId) {\n        shareScreenStarted = true;\n        updateShareScreenStarted(shareScreenStarted);\n      }\n\n      await sleep({ ms: 250 });\n      updateIsLoadingModalVisible(false);\n      deferScreenReceived = false;\n      updateDeferScreenReceived(deferScreenReceived);\n    }\n  }\n\n  if (onLocal && !membersReceived) {\n    if (connectLocalIps) {\n      await connectLocalIps({ socket: socket, parameters });\n    }\n    await sleep({ ms: 50 });\n    updateIsLoadingModalVisible(false);\n  }\n\n  requestList = requestss.filter((request) =>\n    participants.some((participant) => participant.id === request.id)\n  );\n  updateRequestList(requestList);\n\n  updateTotalReqWait(requestList.length + waitingRoomList.length);\n\n  updateCoHost(coHoste);\n  updateCoHostResponsibility(coHostRes);\n\n  if (!lock_screen && !firstAll) {\n    await onScreenChanges({ parameters });\n\n    if (meetingDisplayType !== \"all\") {\n      updateFirstAll(true);\n    }\n  } else if (islevel === \"2\" && !hostFirstSwitch) {\n    await onScreenChanges({ parameters });\n    updateHostFirstSwitch(true);\n  }\n};\n","import { Socket } from \"socket.io-client\";\nimport {\n  Participant, CoHostResponsibility, OnScreenChangesType, OnScreenChangesParameters, Request, ConnectIpsParameters,\n  ReorderStreamsParameters, ConnectIpsType, SleepType, ReorderStreamsType, Settings, ConsumeSocket, ConnectLocalIpsType, ConnectLocalIpsParameters,\n} from \"../../@types/types\";\nexport interface AllMembersRestParameters extends OnScreenChangesParameters, ConnectIpsParameters, ReorderStreamsParameters, ConnectLocalIpsParameters {\n  participantsAll: Participant[];\n  participants: Participant[];\n  dispActiveNames: string[];\n  requestList: Request[];\n  coHost: string;\n  coHostResponsibility: CoHostResponsibility[];\n  lock_screen: boolean;\n  firstAll: boolean;\n  membersReceived: boolean;\n  roomRecvIPs: string[];\n  deferScreenReceived: boolean;\n  screenId?: string;\n  shareScreenStarted: boolean;\n  meetingDisplayType: string;\n  audioSetting: string\n  videoSetting: string;\n  screenshareSetting: string;\n  chatSetting: string;\n  socket: Socket;\n\n  updateParticipantsAll: (participantsAll: Participant[]) => void;\n  updateParticipants: (participants: Participant[]) => void;\n  updateRequestList: (requestList: Request[]) => void;\n  updateCoHost: (coHost: string) => void;\n  updateCoHostResponsibility: (coHostResponsibility: CoHostResponsibility[]) => void;\n  updateFirstAll: (firstAll: boolean) => void;\n  updateMembersReceived: (membersReceived: boolean) => void;\n  updateDeferScreenReceived: (deferScreenReceived: boolean) => void;\n  updateShareScreenStarted: (shareScreenStarted: boolean) => void;\n  updateAudioSetting: (audioSetting: string) => void;\n  updateVideoSetting: (videoSetting: string) => void;\n  updateScreenshareSetting: (screenshareSetting: string) => void;\n  updateChatSetting: (chatSetting: string) => void;\n  updateConsume_sockets: (consume_sockets: ConsumeSocket[]) => void;\n  updateRoomRecvIPs: (ips: string[]) => void;\n  updateIsLoadingModalVisible: (visible: boolean) => void;\n\n  // mediasfu functions\n  onScreenChanges: OnScreenChangesType;\n  connectIps: ConnectIpsType;\n  connectLocalIps?: ConnectLocalIpsType;\n  sleep: SleepType;\n  reorderStreams: ReorderStreamsType;\n\n  getUpdatedAllParams: () => AllMembersRestParameters;\n  [key: string]: any;\n}\n\nexport interface AllMembersRestOptions {\n  members: Participant[];\n  settings: Settings;\n  coHoste?: string;\n  coHostRes?: CoHostResponsibility[];\n  parameters: AllMembersRestParameters;\n  consume_sockets: ConsumeSocket[];\n  apiUserName: string;\n  apiKey: string;\n  apiToken: string;\n}\n\n// Export the type definition for the function\nexport type AllMembersRestType = (options: AllMembersRestOptions) => Promise<void>;\n\n/**\n * Handles the reception and processing of all members' data.\n * \n * @param {Object} options - The options for the function.\n * @param {Array} options.members - The list of members.\n * @param {Settings} options.settings - The settings for audio, video, screenshare, and chat.\n * @param {string} [options.coHoste] - Optional co-host information.\n * @param {CoHostResponsibility[]} [options.coHostRes] - Optional co-host responsibility information.\n * @param {AllMembersRestParameters} options.parameters - The parameters for the function.\n * @param {ConsumeSocket[]} options.consume_sockets - The sockets to consume.\n * @param {string} options.apiUserName - The API username.\n * @param {string} options.apiKey - The API key.\n * @param {string} options.apiToken - The API token.\n * \n * @returns {Promise<void>} A promise that resolves when the function completes.\n * \n * @example\n * ```typescript\n * await allMembersRest({\n *   members: memberList,\n *   settings: { audio: 'on', video: 'on', screenshare: 'off', chat: 'on' },\n *   coHoste: 'coHostName',\n *   coHostRes: [{ type: 'moderate', allowed: true }],\n *   parameters: allParams,\n *   consume_sockets: [socket1, socket2],\n *   apiUserName: 'apiUser',\n *   apiKey: 'apiKey123',\n *   apiToken: 'tokenXYZ'\n * });\n * ```\n */\n\nexport const allMembersRest = async ({\n  members,\n  settings,\n  coHoste,\n  coHostRes,\n  parameters,\n  consume_sockets,\n  apiUserName,\n  apiKey,\n  apiToken,\n}: AllMembersRestOptions): Promise<void> => {\n  let {\n    participantsAll,\n    participants,\n    dispActiveNames,\n    requestList,\n    coHost,\n    coHostResponsibility,\n    lock_screen,\n    firstAll,\n    membersReceived,\n    roomRecvIPs,\n    deferScreenReceived,\n    screenId,\n    shareScreenStarted,\n    meetingDisplayType,\n    audioSetting,\n    videoSetting,\n    screenshareSetting,\n    chatSetting,\n    socket,\n\n    updateParticipantsAll,\n    updateParticipants,\n    updateRequestList,\n    updateCoHost,\n    updateCoHostResponsibility,\n    updateFirstAll,\n    updateMembersReceived,\n    updateDeferScreenReceived,\n    updateShareScreenStarted,\n    updateAudioSetting,\n    updateVideoSetting,\n    updateScreenshareSetting,\n    updateChatSetting,\n    updateConsume_sockets,\n    updateRoomRecvIPs,\n    updateIsLoadingModalVisible,\n\n    onScreenChanges,\n    connectIps,\n    connectLocalIps,\n    sleep,\n    reorderStreams,\n  } = parameters;\n\n  // Filter out banned and suspended participants\n  participantsAll = members.map((participant) => ({\n    isBanned: participant.isBanned,\n    isSuspended: participant.isSuspended,\n    name: participant.name,\n    audioID: participant.audioID,\n    videoID: participant.videoID,\n  }));\n\n  updateParticipantsAll(participantsAll);\n\n  participants = members.filter(\n    (participant) => !participant.isBanned && !participant.isSuspended\n  );\n  updateParticipants(participants);\n\n  // Update UI if dispActiveNames contains participants not in the participants array\n  if (dispActiveNames.length > 0) {\n    const dispActiveNames_ = dispActiveNames.filter(\n      (name) => !participants.some((participant) => participant.name === name)\n    );\n    if (dispActiveNames_.length > 0 && membersReceived) {\n      await reorderStreams({ add: false, screenChanged: true, parameters });\n    }\n  }\n\n  // check to expect no roomRecvIPs for local instance\n  let onLocal = false;\n  if (roomRecvIPs.length === 1 && roomRecvIPs[0] === \"none\") {\n    onLocal = true;\n  }\n\n  // Check for roomRecvIPs and connect to the server\n  if (!onLocal) {\n    if (!membersReceived) {\n      if (roomRecvIPs.length < 1) {\n        const checkIPs = setInterval(async () => {\n          if (roomRecvIPs.length > 0) {\n            clearInterval(checkIPs);\n\n            if (deferScreenReceived && screenId) {\n              shareScreenStarted = true;\n              updateShareScreenStarted(shareScreenStarted);\n            }\n\n            const [sockets_, ips_] = await connectIps({\n              consume_sockets,\n              remIP: roomRecvIPs,\n              parameters,\n              apiUserName,\n              apiKey,\n              apiToken,\n            });\n\n            if (sockets_ && ips_) {\n              updateConsume_sockets(sockets_);\n              updateRoomRecvIPs(ips_);\n            }\n\n            membersReceived = true;\n            updateMembersReceived(membersReceived);\n\n            await sleep({ ms: 250 });\n            updateIsLoadingModalVisible(false);\n            deferScreenReceived = false;\n            updateDeferScreenReceived(deferScreenReceived);\n          }\n        }, 10);\n      } else {\n        const [sockets_, ips_] = await connectIps({\n          consume_sockets,\n          remIP: roomRecvIPs,\n          parameters,\n          apiUserName,\n          apiKey,\n          apiToken,\n        });\n\n        if (sockets_ && ips_) {\n          updateConsume_sockets(sockets_);\n          updateRoomRecvIPs(ips_);\n        }\n        membersReceived = true;\n        updateMembersReceived(membersReceived);\n\n        if (deferScreenReceived && screenId) {\n          shareScreenStarted = true;\n          updateShareScreenStarted(shareScreenStarted);\n        }\n\n        await sleep({ ms: 250 });\n        updateIsLoadingModalVisible(false);\n        deferScreenReceived = false;\n        updateDeferScreenReceived(deferScreenReceived);\n      }\n    } else {\n      if (screenId) {\n        const host = participants.find(\n          (participant) => participant.ScreenID === screenId && participant.ScreenOn === true\n        );\n        if (deferScreenReceived && screenId && host) {\n          shareScreenStarted = true;\n          updateShareScreenStarted(shareScreenStarted);\n        }\n      }\n    }\n  }\n\n  if (onLocal && !membersReceived) {\n    if (connectLocalIps) {\n      await connectLocalIps({ socket: socket, parameters });\n    }\n    await sleep({ ms: 50 });\n    updateIsLoadingModalVisible(false);\n  }\n\n  // Filter requests based on participants\n  requestList = requestList.filter((request) =>\n    participants.some((participant) => participant.id === request.id)\n  );\n  updateRequestList(requestList);\n\n  coHost = coHoste!;\n  updateCoHost(coHost);\n  coHostResponsibility = coHostRes!;\n  updateCoHostResponsibility(coHostResponsibility);\n\n  // Handle screen changes if necessary\n  if (!lock_screen && !firstAll) {\n    await onScreenChanges({ parameters });\n    if (meetingDisplayType !== \"all\") {\n      firstAll = true;\n      updateFirstAll(firstAll);\n    }\n  }\n\n  try {\n    if (membersReceived) {\n      audioSetting = settings[0];\n      videoSetting = settings[1];\n      screenshareSetting = settings[2];\n      chatSetting = settings[3];\n\n      updateAudioSetting(audioSetting);\n      updateVideoSetting(videoSetting);\n      updateScreenshareSetting(screenshareSetting);\n      updateChatSetting(chatSetting);\n    }\n  } catch {\n    /* empty */\n  }\n};\n","import { WaitingRoomParticipant } from '../../@types/types';\nexport interface AllWaitingRoomMembersOptions {\n  waitingParticipants: WaitingRoomParticipant[];\n  updateWaitingRoomList: (participants: WaitingRoomParticipant[]) => void;\n  updateTotalReqWait: (totalReqs: number) => void;\n}\n\n// Export the type definition for the function\nexport type AllWaitingRoomMembersType = (options: AllWaitingRoomMembersOptions) => Promise<void>;\n\n/**\n * Updates the waiting room participants list and the total count of waiting room participants.\n *\n * @param {Object} options - The options object.\n * @param {Array} options.waitingParticipants - An array of participants currently in the waiting room.\n * @param {Function} options.updateWaitingRoomList - A function to update the waiting room participants list.\n * @param {Function} options.updateTotalReqWait - A function to update the total count of waiting room participants.\n * @returns {Promise<void>} A promise that resolves when the updates are complete.\n *\n * @example\n * ```typescript\n * const participants = [\n *   { name: \"Alice\", waitingSince: \"10:30\" },\n *   { name: \"Bob\", waitingSince: \"10:35\" },\n * ];\n *\n * await allWaitingRoomMembers({\n *   waitingParticipants: participants,\n *   updateWaitingRoomList: setWaitingRoomParticipants,\n *   updateTotalReqWait: setTotalWaitingRequests,\n * });\n * ```\n */\n\nexport const allWaitingRoomMembers = async ({\n  waitingParticipants,\n  updateWaitingRoomList, updateTotalReqWait\n}: AllWaitingRoomMembersOptions): Promise<void> => {\n\n  // Calculate the total number of waiting room participants\n  const totalReqs = waitingParticipants.length;\n\n  // Update the waiting room participants list\n  updateWaitingRoomList(waitingParticipants);\n\n  // Update the total count of waiting room participants\n  updateTotalReqWait(totalReqs);\n};\n","import type {\n  Participant,\n  ReorderStreamsType,\n  ReorderStreamsParameters,\n} from \"../../@types/types\";\n\nexport interface BanParticipantParameters extends ReorderStreamsParameters {\n  activeNames: string[];\n  dispActiveNames: string[];\n  participants: Participant[];\n  updateParticipants: (participants: Participant[]) => void;\n\n  // mediasfu functions\n  reorderStreams: ReorderStreamsType;\n  [key: string]: any;\n}\n\nexport interface BanParticipantOptions {\n  name: string;\n  parameters: BanParticipantParameters;\n}\n\n// Export the type definition for the function\nexport type BanParticipantType = (options: BanParticipantOptions) => Promise<void>;\n\n/**\n * Bans a participant from the session by removing them from the active and display names arrays,\n * updating the participants list, and reordering the streams.\n *\n * @param {BanParticipantOptions} options - The options for banning a participant.\n * @param {string} options.name - The name of the participant to be banned.\n * @param {Object} options.parameters - The parameters required for banning the participant.\n * @param {string[]} options.parameters.activeNames - The array of active participant names.\n * @param {string[]} options.parameters.dispActiveNames - The array of display participant names.\n * @param {Object[]} options.parameters.participants - The array of participant objects.\n * @param {Function} options.parameters.updateParticipants - The function to update the participants array.\n * @param {Function} options.parameters.reorderStreams - The function to reorder the streams.\n *\n * @returns {Promise<void>} A promise that resolves when the participant has been banned and streams reordered.\n *\n * @example\n * ```typescript\n * await banParticipant({\n *   name: \"John Doe\",\n *   parameters: {\n *     activeNames: [\"Alice\", \"Bob\", \"John Doe\"],\n *     dispActiveNames: [\"Alice\", \"John Doe\"],\n *     participants: [\n *       { name: \"Alice\", isActive: true },\n *       { name: \"Bob\", isActive: true },\n *       { name: \"John Doe\", isActive: true }\n *     ],\n *     updateParticipants: (updated) => setParticipants(updated),\n *     reorderStreams: reorderStreamFunction,\n *   },\n * });\n * ```\n */\n\nexport const banParticipant = async ({\n  name,\n  parameters,\n}: BanParticipantOptions) => {\n  const {\n    activeNames,\n    dispActiveNames,\n    participants,\n    updateParticipants,\n    reorderStreams,\n  } = parameters;\n\n  // Check if the participant is in the active or display names array\n  if (activeNames.includes(name) || dispActiveNames.includes(name)) {\n    // Filter out the banned participant from the participants array\n    const updatedParticipants = participants.filter(\n      (participant) => participant.name !== name\n    );\n\n    // Update the participants array\n    updateParticipants(updatedParticipants);\n\n    // Reorder streams after participant removal\n    await reorderStreams({ add: false, screenChanged: true, parameters });\n  }\n};\n","import type {\n  OnScreenChangesType,\n  StopShareScreenType,\n  DisconnectSendTransportVideoType,\n  DisconnectSendTransportAudioType,\n  DisconnectSendTransportScreenType,\n  OnScreenChangesParameters,\n  StopShareScreenParameters,\n  DisconnectSendTransportVideoParameters,\n  DisconnectSendTransportAudioParameters,\n  DisconnectSendTransportScreenParameters,\n} from \"../../@types/types\";\nexport interface ControlMediaHostParameters extends OnScreenChangesParameters, StopShareScreenParameters, DisconnectSendTransportVideoParameters, DisconnectSendTransportAudioParameters, DisconnectSendTransportScreenParameters {\n  updateAdminRestrictSetting: (value: boolean) => void;\n  localStream: MediaStream | null;\n  updateLocalStream: (stream: (MediaStream | null)) => void;\n  updateAudioAlreadyOn: (value: boolean) => void;\n  localStreamScreen: MediaStream | null;\n  updateLocalStreamScreen: (stream: (MediaStream | null)) => void;\n  localStreamVideo: MediaStream | null;\n  updateLocalStreamVideo: (stream: (MediaStream | null)) => void;\n\n  updateScreenAlreadyOn: (value: boolean) => void;\n  updateVideoAlreadyOn: (value: boolean) => void;\n  updateChatAlreadyOn: (value: boolean) => void;\n\n  // mediasfu functions\n  onScreenChanges: OnScreenChangesType;\n  stopShareScreen: StopShareScreenType;\n  disconnectSendTransportVideo: DisconnectSendTransportVideoType;\n  disconnectSendTransportAudio: DisconnectSendTransportAudioType;\n  disconnectSendTransportScreen: DisconnectSendTransportScreenType;\n\n  getUpdatedAllParams: () => ControlMediaHostParameters;\n  [key: string]: any;\n}\n\n\nexport interface ControlMediaHostOptions {\n  type: \"audio\" | \"video\" | \"screenshare\" | \"chat\" | \"all\";\n  parameters: ControlMediaHostParameters;\n}\n\n// Export the type definition for the function\nexport type ControlMediaHostType = (options: ControlMediaHostOptions) => Promise<void>;\n\n/**\n * Controls the media host by disabling specific media types (audio, video, screenshare, chat)\n * and updating the corresponding states.\n *\n * @param {ControlMediaHostOptions} options - The options for controlling the media host.\n * @param {string} options.type - The type of media to control. Can be \"audio\", \"video\", \"screenshare\", \"chat\", or \"all\".\n * @param {Object} options.parameters - The parameters required for controlling the media host.\n * @param {Function} options.parameters.updateAdminRestrictSetting - Function to update the admin restrict setting.\n * @param {MediaStream} options.parameters.localStream - The local media stream.\n * @param {Function} options.parameters.updateLocalStream - Function to update the local media stream.\n * @param {Function} options.parameters.updateAudioAlreadyOn - Function to update the audio state.\n * @param {MediaStream} options.parameters.localStreamScreen - The local screen share stream.\n * @param {Function} options.parameters.updateLocalStreamScreen - Function to update the local screen share stream.\n * @param {MediaStream} options.parameters.localStreamVideo - The local video stream.\n * @param {Function} options.parameters.updateLocalStreamVideo - Function to update the local video stream.\n * @param {Function} options.parameters.updateScreenAlreadyOn - Function to update the screen share state.\n * @param {Function} options.parameters.updateVideoAlreadyOn - Function to update the video state.\n * @param {Function} options.parameters.updateChatAlreadyOn - Function to update the chat state.\n * @param {Function} options.parameters.onScreenChanges - Function to handle screen changes.\n * @param {Function} options.parameters.stopShareScreen - Function to stop screen sharing.\n * @param {Function} options.parameters.disconnectSendTransportVideo - Function to disconnect the video transport.\n * @param {Function} options.parameters.disconnectSendTransportAudio - Function to disconnect the audio transport.\n * @param {Function} options.parameters.disconnectSendTransportScreen - Function to disconnect the screen share transport.\n *\n * @returns {Promise<void>} A promise that resolves when the media control actions are completed.\n *\n * @example\n * ```typescript\n * await controlMediaHost({\n *   type: \"video\",\n *   parameters: {\n *     updateAdminRestrictSetting: setAdminRestrict,\n *     localStream: userMediaStream,\n *     updateLocalStream: setUserMediaStream,\n *     updateAudioAlreadyOn: setAudioState,\n *     localStreamScreen: screenMediaStream,\n *     updateLocalStreamScreen: setScreenMediaStream,\n *     localStreamVideo: videoMediaStream,\n *     updateLocalStreamVideo: setVideoMediaStream,\n *     updateScreenAlreadyOn: setScreenState,\n *     updateVideoAlreadyOn: setVideoState,\n *     updateChatAlreadyOn: setChatState,\n *     onScreenChanges: handleScreenChanges,\n *     stopShareScreen: stopScreenSharing,\n *     disconnectSendTransportVideo: disconnectVideoTransport,\n *     disconnectSendTransportAudio: disconnectAudioTransport,\n *     disconnectSendTransportScreen: disconnectScreenTransport,\n *   }\n * });\n * ```\n */\n\nexport const controlMediaHost = async ({ type, parameters }: ControlMediaHostOptions): Promise<void> => {\n  let {\n    updateAdminRestrictSetting,\n    updateLocalStream,\n    updateAudioAlreadyOn,\n    updateLocalStreamScreen,\n    updateLocalStreamVideo,\n    updateScreenAlreadyOn,\n    updateVideoAlreadyOn,\n    updateChatAlreadyOn,\n    onScreenChanges,\n    stopShareScreen,\n    disconnectSendTransportVideo,\n    disconnectSendTransportAudio,\n    disconnectSendTransportScreen,\n  } = parameters;\n\n  let { localStream, localStreamScreen, localStreamVideo } =\n    parameters.getUpdatedAllParams();\n\n  const disableTrack = (\n    stream: MediaStream | null,\n    kind: \"audio\" | \"video\"\n  ): boolean => {\n    const tracks =\n      kind === \"audio\" ? stream?.getAudioTracks() : stream?.getVideoTracks();\n    const track = tracks && tracks[0];\n    if (track) {\n      track.enabled = false;\n      return true;\n    }\n    return false;\n  };\n\n  try {\n    updateAdminRestrictSetting(true);\n\n    if (type === \"audio\") {\n      disableTrack(localStream, \"audio\");\n      updateLocalStream(localStream ?? null);\n      await disconnectSendTransportAudio({ parameters });\n      updateAudioAlreadyOn(false);\n    } else if (type === \"video\") {\n      disableTrack(localStream, \"video\");\n      updateLocalStream(localStream ?? null);\n      await disconnectSendTransportVideo({ parameters });\n      await onScreenChanges({ changed: true, parameters });\n\n      disableTrack(localStreamVideo, \"video\");\n      updateLocalStreamVideo(localStreamVideo ?? null);\n      await disconnectSendTransportVideo({ parameters });\n      await onScreenChanges({ changed: true, parameters });\n\n      updateVideoAlreadyOn(false);\n\n    } else if (type === \"screenshare\") {\n      disableTrack(localStreamScreen, \"video\");\n      updateLocalStreamScreen(localStreamScreen ?? null);\n      await disconnectSendTransportScreen({ parameters });\n      await stopShareScreen({ parameters });\n      updateScreenAlreadyOn(false);\n    } else if (type === \"chat\") {\n      updateChatAlreadyOn(false);\n    } else if (type === \"all\") {\n      disableTrack(localStream, \"audio\");\n      updateLocalStream(localStream ?? null);\n      await disconnectSendTransportAudio({ parameters });\n      updateAudioAlreadyOn(false);\n\n      disableTrack(localStreamScreen, \"video\");\n      updateLocalStreamScreen(localStreamScreen ?? null);\n      await disconnectSendTransportScreen({ parameters });\n      await stopShareScreen({ parameters });\n      updateScreenAlreadyOn(false);\n\n      disableTrack(localStream, \"video\");\n      updateLocalStream(localStream ?? null);\n      await disconnectSendTransportVideo({ parameters });\n      await onScreenChanges({ changed: true, parameters });\n\n      disableTrack(localStreamVideo, \"video\");\n      updateLocalStreamVideo(localStreamVideo ?? null);\n      await disconnectSendTransportVideo({ parameters });\n      await onScreenChanges({ changed: true, parameters });\n\n      updateVideoAlreadyOn(false);\n    }\n  } catch (error) {\n    console.error(\"Error in controlMediaHost:\", error);\n  }\n};\n","import type { ShowAlert } from \"../../@types/types\";\n\nexport interface DisconnectOptions {\n  showAlert?: ShowAlert;\n  redirectURL?: string;\n  onWeb: boolean;\n  updateValidated?: (isValidated: boolean) => void;\n}\n\n// Export the type definition for the function\nexport type DisconnectType = (options: DisconnectOptions) => Promise<void>;\n\n\n/**\n * Disconnects the user from the specified room and bans them.\n *\n * @param {DisconnectUserSelfOptions} options - The options for disconnecting the user.\n * @param {string} options.member - The username of the member to disconnect.\n * @param {string} options.roomName - The name of the room from which the user will be disconnected.\n * @param {Socket} options.socket - The socket instance used to emit the disconnection request.\n * @returns {Promise<void>} A promise that resolves when the disconnection request has been emitted.\n *\n * @example\n * ```typescript\n * await disconnectUserSelf({\n *   member: \"user123\",\n *   roomName: \"main-room\",\n *   socket: socketInstance,\n * });\n * ```\n */\n\nexport const disconnect = async ({ showAlert, redirectURL, onWeb }: DisconnectOptions): Promise<void> => {\n\n  // Redirect to the specified URL on the web\n  if (onWeb && redirectURL) {\n    window.location.href = redirectURL;\n  } else {\n    // Display an alert and update the validated state\n    showAlert?.({\n      message: \"You have been disconnected from the session.\",\n      type: \"danger\",\n      duration: 2000,\n    });\n\n    // Optionally update the validation state\n    // if (parameters.updateValidated) {\n    //   setTimeout(() => {\n    //     parameters.updateValidated(false);\n    //   }, 2000);\n    // }\n  }\n};\n","import { Socket } from \"socket.io-client\";\n\nexport interface DisconnectUserSelfOptions {\n  member: string;\n  roomName: string;\n  socket: Socket;\n  localSocket?: Socket;\n}\n\n// Export the type definition for the function\nexport type DisconnectUserSelfType = (options: DisconnectUserSelfOptions) => Promise<void>;\n\n\n/**\n * Disconnects the user from the specified room and bans them.\n *\n * @param {DisconnectUserSelfOptions} options - The options for disconnecting the user.\n * @param {Object} options.member - The member object representing the user to disconnect.\n * @param {string} options.roomName - The name of the room from which the user will be disconnected.\n * @param {Socket} options.socket - The socket instance used to emit the disconnection request.\n * @param {Socket} [options.localSocket] - The local socket instance used to emit the disconnection request.\n * @returns {Promise<void>} A promise that resolves when the disconnection request has been emitted.\n * \n * @example\n * ```typescript\n * await disconnectUserSelf({\n *  member: \"user123\",\n * roomName: \"main-room\",\n * socket: socketInstance,\n * localSocket: localSocketInstance\n * });\n * ```\n */\n\nexport async function disconnectUserSelf({ member, roomName, socket, localSocket }: DisconnectUserSelfOptions): Promise<void> {\n\n  // Emit the disconnection request to the socket, indicating that the user is being banned\n  socket.emit(\"disconnectUser\", {\n    member: member,\n    roomName: roomName,\n    ban: true,\n  });\n\n  try {\n    if (localSocket && localSocket.id) {\n      // Emit the disconnection request to the local socket, indicating that the user is being banned\n      localSocket.emit(\"disconnectUser\", {\n        member: member,\n        roomName: roomName,\n        ban: true,\n      });\n    }\n  } catch  {\n    // Do nothing\n  }\n}\n","\nimport type { ConnectIpsType, ConnectIpsParameters, AltDomains, ConsumeSocket } from \"../../@types/types\";\nimport type { RtpCapabilities } from 'mediasoup-client';\n\nexport interface GetDomainsParameters extends ConnectIpsParameters {\n\n  roomRecvIPs: string[];\n  rtpCapabilities: RtpCapabilities | null;\n  consume_sockets: ConsumeSocket[];\n\n  // mediasfu functions\n  connectIps: ConnectIpsType;\n  getUpdatedAllParams: () => GetDomainsParameters;\n\n  [key: string]: any;\n\n}\n\nexport interface GetDomainsOptions {\n  domains: string[];\n  alt_domains: AltDomains;\n  apiUserName: string;\n  apiKey: string;\n  apiToken: string;\n  parameters: GetDomainsParameters;\n}\n\n// Export the type definition for the function\nexport type GetDomainsType = (options: GetDomainsOptions) => Promise<void>;\n\n\n\n/**\n * Asynchronously processes domain information and connects to specified IPs.\n *\n * @param {GetDomainsOptions} options - The options for processing domains and connecting to IPs.\n * @param {string[]} options.domains - Array of domain names to process.\n * @param {AltDomains} options.alt_domains - Alternative domain mapping with IP addresses.\n * @param {string} options.apiUserName - The API username for domain authentication.\n * @param {string} options.apiKey - The API key for domain authentication.\n * @param {string} options.apiToken - The API token for domain authentication.\n * @param {GetDomainsParameters} options.parameters - Additional parameters for domain processing.\n * @param {string[]} options.parameters.roomRecvIPs - Array of IPs that are already connected and receiving.\n * @param {ConsumeSocket[]} options.parameters.consume_sockets - List of consume sockets.\n * @param {ConnectIpsType} options.parameters.connectIps - Function to connect to specified IPs.\n * @param {Function} options.parameters.getUpdatedAllParams - Function to get updated parameters.\n *\n * @returns {Promise<void>} A promise that resolves when the domain processing and IP connection is complete.\n *\n * @throws {Error} Will throw an error if the operation fails.\n *\n * @example\n * ```typescript\n * await getDomains({\n *   domains: [\"example1.com\", \"example2.com\"],\n *   alt_domains: { \"example1.com\": \"192.168.1.1\" },\n *   apiUserName: \"user123\",\n *   apiKey: \"apikey123\",\n *   apiToken: \"apitoken123\",\n *   parameters: {\n *     roomRecvIPs: [\"192.168.1.10\"],\n *     consume_sockets: [{ id: \"socket1\" }],\n *     connectIps: async ({ consume_sockets, remIP, parameters, apiUserName, apiKey, apiToken }) => {\n *       // Connect IP logic here\n *     },\n *     getUpdatedAllParams: () => ({ ...parameters }),\n *   },\n * });\n * ```\n */\n\nexport const getDomains = async ({\n  domains,\n  alt_domains,\n  apiUserName,\n  apiKey,\n  apiToken,\n  parameters,\n}: GetDomainsOptions): Promise<void> => {\n  // Destructuring parameters\n  let {\n    roomRecvIPs,\n    consume_sockets,\n    connectIps,\n  } = parameters;\n\n  const ipsToConnect: string[] = [];\n\n  try {\n    // Get the latest consume_sockets\n    const updatedParams = parameters.getUpdatedAllParams();\n    consume_sockets = updatedParams.consume_sockets;\n\n    // Process each domain\n    for (const domain of domains) {\n      const ipToCheck = alt_domains[domain] || domain;\n\n      // If the IP is not in roomRecvIPs, add to ipsToConnect\n      if (!roomRecvIPs.includes(ipToCheck)) {\n        ipsToConnect.push(ipToCheck);\n      }\n    }\n\n    // Connect to the IPs\n    await connectIps({\n      consume_sockets,\n      remIP: ipsToConnect,\n      parameters,\n      apiUserName,\n      apiKey,\n      apiToken,\n    });\n  } catch (error) {\n    console.error(\"Error in getDomains: \", error);\n  }\n};\n","import type { ShowAlert, Request, RequestResponse } from \"../../@types/types\";\n\nexport interface HostRequestResponseOptions {\n  requestResponse: RequestResponse;\n\n  showAlert?: ShowAlert;\n  requestList: Request[];\n  updateRequestList: (requestList: Request[]) => void;\n  updateMicAction: (action: boolean) => void;\n  updateVideoAction: (action: boolean) => void;\n  updateScreenAction: (action: boolean) => void;\n  updateChatAction: (action: boolean) => void;\n  updateAudioRequestState: (state: string | null) => void;\n  updateVideoRequestState: (state: string | null) => void;\n  updateScreenRequestState: (state: string | null) => void;\n  updateChatRequestState: (state: string | null) => void;\n  updateAudioRequestTime: (time: number) => void;\n  updateVideoRequestTime: (time: number) => void;\n  updateScreenRequestTime: (time: number) => void;\n  updateChatRequestTime: (time: number) => void;\n  updateRequestIntervalSeconds: number;\n}\n\n\n// Export the type definition for the function\nexport type HostRequestResponseType = (options: HostRequestResponseOptions) => Promise<void>;\n\n\n/**\n * Handles a host's response to a participant request, updating the request list and performing actions based on the response.\n *\n * @param {HostRequestResponseOptions} options - The options for handling the host's response to the participant request.\n * @param {RequestResponse} options.requestResponse - The host's response to the request.\n * @param {Function} [options.showAlert] - Optional function to show alerts.\n * @param {Request[]} options.requestList - The current list of participant requests.\n * @param {Function} options.updateRequestList - Function to update the request list.\n * @param {Function} options.updateMicAction - Function to update the microphone action state.\n * @param {Function} options.updateVideoAction - Function to update the video action state.\n * @param {Function} options.updateScreenAction - Function to update the screen action state.\n * @param {Function} options.updateChatAction - Function to update the chat action state.\n * @param {Function} options.updateAudioRequestState - Function to update the audio request state.\n * @param {Function} options.updateVideoRequestState - Function to update the video request state.\n * @param {Function} options.updateScreenRequestState - Function to update the screen request state.\n * @param {Function} options.updateChatRequestState - Function to update the chat request state.\n * @param {Function} options.updateAudioRequestTime - Function to set a cooldown for new audio requests.\n * @param {Function} options.updateVideoRequestTime - Function to set a cooldown for new video requests.\n * @param {Function} options.updateScreenRequestTime - Function to set a cooldown for new screenshare requests.\n * @param {Function} options.updateChatRequestTime - Function to set a cooldown for new chat requests.\n * @param {number} options.updateRequestIntervalSeconds - The interval in seconds to wait before allowing another request of the same type.\n *\n * @returns {Promise<void>} A promise that resolves when the host's response has been processed.\n *\n * @example\n * ```typescript\n * await hostRequestResponse({\n *   requestResponse: { id: \"req123\", type: \"fa-video\", action: \"accepted\" },\n *   showAlert: (alertOptions) => console.log(alertOptions.message),\n *   requestList: [{ id: \"req123\", icon: \"fa-video\", name: \"Video Request\" }],\n *   updateRequestList: (list) => console.log(\"Updated request list\", list),\n *   updateMicAction: (state) => console.log(\"Mic action:\", state),\n *   updateVideoAction: (state) => console.log(\"Video action:\", state),\n *   updateScreenAction: (state) => console.log(\"Screen action:\", state),\n *   updateChatAction: (state) => console.log(\"Chat action:\", state),\n *   updateAudioRequestState: (state) => console.log(\"Audio request state:\", state),\n *   updateVideoRequestState: (state) => console.log(\"Video request state:\", state),\n *   updateScreenRequestState: (state) => console.log(\"Screen request state:\", state),\n *   updateChatRequestState: (state) => console.log(\"Chat request state:\", state),\n *   updateAudioRequestTime: (time) => console.log(\"Audio request cooldown:\", time),\n *   updateVideoRequestTime: (time) => console.log(\"Video request cooldown:\", time),\n *   updateScreenRequestTime: (time) => console.log(\"Screenshare request cooldown:\", time),\n *   updateChatRequestTime: (time) => console.log(\"Chat request cooldown:\", time),\n *   updateRequestIntervalSeconds: 30,\n * });\n * ```\n */\n\nexport const hostRequestResponse = async ({\n  requestResponse,\n  showAlert,\n  requestList,\n  updateRequestList,\n  updateMicAction,\n  updateVideoAction,\n  updateScreenAction,\n  updateChatAction,\n  updateAudioRequestState,\n  updateVideoRequestState,\n  updateScreenRequestState,\n  updateChatRequestState,\n  updateAudioRequestTime,\n  updateVideoRequestTime,\n  updateScreenRequestTime,\n  updateChatRequestTime,\n  updateRequestIntervalSeconds,\n}: HostRequestResponseOptions): Promise<void> => {\n  // Filter out the request from the list\n  const filteredRequests = requestList.filter(\n    (request) =>\n      request.id !== requestResponse.id &&\n      request.icon !== requestResponse.type &&\n      request.name !== requestResponse.name &&\n      request.username !== requestResponse.username\n  );\n  updateRequestList(filteredRequests);\n\n  const requestType = requestResponse.type;\n\n  // Handle accepted actions\n  if (requestResponse.action === \"accepted\") {\n    switch (requestType) {\n      case \"fa-microphone\":\n        showAlert?.({\n          message: \"Unmute request was accepted; click the mic button again to begin.\",\n          type: \"success\",\n          duration: 10000,\n        });\n        updateMicAction(true);\n        updateAudioRequestState(\"accepted\");\n        break;\n      case \"fa-video\":\n        showAlert?.({\n          message: \"Video request was accepted; click the video button again to begin.\",\n          type: \"success\",\n          duration: 10000,\n        });\n        updateVideoAction(true);\n        updateVideoRequestState(\"accepted\");\n        break;\n      case \"fa-desktop\":\n        showAlert?.({\n          message: \"Screenshare request was accepted; click the screen button again to begin.\",\n          type: \"success\",\n          duration: 10000,\n        });\n        updateScreenAction(true);\n        updateScreenRequestState(\"accepted\");\n        break;\n      case \"fa-comments\":\n        showAlert?.({\n          message: \"Chat request was accepted; click the chat button again to begin.\",\n          type: \"success\",\n          duration: 10000,\n        });\n        updateChatAction(true);\n        updateChatRequestState(\"accepted\");\n        break;\n    }\n  } else {\n    // Handle rejected actions\n    let timerDate: Date;\n    switch (requestType) {\n      case \"fa-microphone\":\n        showAlert?.({\n          message: \"Unmute request was not accepted\",\n          type: \"danger\",\n          duration: 10000,\n        });\n        updateAudioRequestState(\"rejected\");\n        timerDate = new Date();\n        timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);\n        updateAudioRequestTime(timerDate.getTime());\n        break;\n      case \"fa-video\":\n        showAlert?.({\n          message: \"Video request was not accepted\",\n          type: \"danger\",\n          duration: 10000,\n        });\n        updateVideoRequestState(\"rejected\");\n        timerDate = new Date();\n        timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);\n        updateVideoRequestTime(timerDate.getTime());\n        break;\n      case \"fa-desktop\":\n        showAlert?.({\n          message: \"Screenshare request was not accepted\",\n          type: \"danger\",\n          duration: 10000,\n        });\n        updateScreenRequestState(\"rejected\");\n        timerDate = new Date();\n        timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);\n        updateScreenRequestTime(timerDate.getTime());\n        break;\n      case \"fa-comments\":\n        showAlert?.({\n          message: \"Chat request was not accepted\",\n          type: \"danger\",\n          duration: 10000,\n        });\n        updateChatRequestState(\"rejected\");\n        timerDate = new Date();\n        timerDate.setSeconds(timerDate.getSeconds() + updateRequestIntervalSeconds);\n        updateChatRequestTime(timerDate.getTime());\n        break;\n    }\n  }\n};\n","import type { EventType, ShowAlert } from \"../../@types/types\";\n\nexport interface MeetingEndedOptions {\n  showAlert?: ShowAlert;\n  redirectURL?: string;\n  onWeb: boolean;\n  eventType: EventType;\n  updateValidated?: (isValid: boolean) => void;\n}\n\n\n// Export the type definition for the function\nexport type MeetingEndedType = (options: MeetingEndedOptions) => Promise<void>;\n\n\n/**\n * Handles the end of a meeting by showing an alert and redirecting the user.\n *\n * @param {MeetingEndedOptions} options - The options for handling the meeting end.\n * @param {Function} [options.showAlert] - Optional function to show an alert message.\n * @param {string} [options.redirectURL] - URL to redirect to after the meeting ends.\n * @param {boolean} options.onWeb - Flag indicating if the application is running on the web.\n * @param {EventType} options.eventType - Type of the event that triggered the meeting end.\n *\n * @returns {Promise<void>} A promise that resolves when the meeting end handling is complete.\n *\n * @example\n * ```typescript\n * const options: MeetingEndedOptions = {\n *   showAlert: ({ message, type, duration }) => console.log(`Alert: ${message}, Type: ${type}, Duration: ${duration}`),\n *   redirectURL: \"https://homepage.com\",\n *   onWeb: true,\n *   eventType: \"meeting\",\n * };\n *\n * await meetingEnded(options);\n * // Output:\n * // Alert: The event has ended. You will be redirected to the home page in 2 seconds., Type: danger, Duration: 2000\n * // (Redirects to the specified URL after 2 seconds if on the web)\n * ```\n */\n\nexport const meetingEnded = async ({ showAlert, redirectURL, onWeb, eventType }: MeetingEndedOptions): Promise<void> => {\n\n  // Show an alert that the meeting has ended and wait for 2 seconds before redirecting to the home page\n  if (eventType !== \"chat\") {\n    showAlert?.({\n      message:\n        \"The event has ended. You will be redirected to the home page in 2 seconds.\",\n      type: \"danger\",\n      duration: 2000,\n    });\n  }\n\n  if (onWeb && redirectURL) {\n    setTimeout(() => {\n      window.location.href = redirectURL;\n    }, 2000);\n  } else {\n\n    // if (parameters.updateValidated) {\n    //   setTimeout(() => {\n    //     parameters.updateValidated(false);\n    //   }, 2000);\n    // }\n  }\n};\n","export interface MeetingStillThereOptions {\n  updateIsConfirmHereModalVisible: (isVisible: boolean) => void;\n}\n\n// Export the type definition for the function\nexport type MeetingStillThereType = (options: MeetingStillThereOptions) => Promise<void>;\n\n\n/**\n * Handles the \"still there?\" meeting check by updating the visibility of the confirmation modal.\n *\n * @param {MeetingStillThereOptions} options - The options for the meeting still-there check.\n * @param {Function} options.updateIsConfirmHereModalVisible - Function to update the visibility of the \"still there?\" modal.\n * @returns {Promise<void>} A promise that resolves when the modal visibility is updated.\n *\n * @example\n * ```typescript\n * const options = {\n *   updateIsConfirmHereModalVisible: (isVisible) => console.log(`Modal visibility: ${isVisible}`),\n * };\n *\n * await meetingStillThere(options);\n * // Output:\n * // \"Modal visibility: true\"\n * ```\n */\n\nexport const meetingStillThere = async ({\n  updateIsConfirmHereModalVisible\n}: MeetingStillThereOptions): Promise<void> => {\n\n  // Update the visibility of the \"still there?\" modal\n  updateIsConfirmHereModalVisible(true);\n};\n","import type { EventType, ShowAlert } from \"../../@types/types\";\n\nexport interface MeetingTimeRemainingOptions {\n  timeRemaining: number;\n  showAlert?: ShowAlert;\n  eventType: EventType;\n}\n\n// Export the type definition for the function\nexport type MeetingTimeRemainingType = (options: MeetingTimeRemainingOptions) => Promise<void>;\n\n/**\n * Handles the remaining time for a meeting and shows an alert if the event type is not 'chat'.\n *\n * @param {MeetingTimeRemainingOptions} options - The options for the meeting time remaining.\n * @param {number} options.timeRemaining - The remaining time in milliseconds.\n * @param {Function} options.showAlert - The function to show an alert message.\n * @param {EventType} options.eventType - The type of the event.\n * @returns {Promise<void>} A promise that resolves when the operation is complete.\n *\n * @example\n * ```typescript\n * const options = {\n *   timeRemaining: 450000, // 7 minutes and 30 seconds\n *   showAlert: (alert) => console.log(alert.message),\n *   eventType: \"meeting\",\n * };\n *\n * await meetingTimeRemaining(options);\n * // Output:\n * // \"The event will end in 7:30 minutes.\"\n * ```\n */\n\nexport const meetingTimeRemaining = async ({\n  timeRemaining,\n  showAlert, eventType\n}: MeetingTimeRemainingOptions): Promise<void> => {\n  // Convert time from milliseconds to readable format of minutes and seconds\n  const minutes = Math.floor(timeRemaining / 60000);\n  const seconds = Math.floor((timeRemaining % 60000) / 1000);\n  const timeRemainingString = `${minutes}:${seconds < 10 ? \"0\" : \"\"}${seconds}`;\n\n  // Show alert with time remaining if eventType is not 'chat'\n  if (eventType !== \"chat\") {\n    showAlert?.({\n      message: `The event will end in ${timeRemainingString} minutes.`,\n      type: \"success\",\n      duration: 3000,\n    });\n  }\n};\n","import type { Request, WaitingRoomParticipant } from \"../../@types/types\";\nexport interface ParticipantRequestedOptions {\n  userRequest: Request;\n\n  requestList: Request[];\n  waitingRoomList: WaitingRoomParticipant[];\n  updateTotalReqWait: (count: number) => void;\n  updateRequestList: (list: Request[]) => void;\n}\n\n// Export the type definition for the function\nexport type ParticipantRequestedType = (options: ParticipantRequestedOptions) => Promise<void>;\n\n\n/**\n * Handles a participant's request by adding it to the request list and updating the total count of requests and waiting room participants.\n *\n * @param {ParticipantRequestedOptions} options - The options for handling the participant's request.\n * @param {Request} options.userRequest - The user request to be added to the request list.\n * @param {Request[]} options.requestList - The current list of user requests.\n * @param {WaitingRoomParticipant[]} options.waitingRoomList - The current list of participants in the waiting room.\n * @param {Function} options.updateTotalReqWait - Function to update the total count of requests and waiting room participants.\n * @param {Function} options.updateRequestList - Function to update the request list.\n * @returns {Promise<void>} A promise that resolves when the participant's request has been handled.\n *\n * @example\n * ```typescript\n * const options = {\n *   userRequest: { id: \"user123\", reason: \"join\" },\n *   requestList: [{ id: \"user1\", reason: \"help\" }],\n *   waitingRoomList: [{ id: \"user2\", name: \"Alice\" }],\n *   updateTotalReqWait: (count) => console.log(\"Total requests:\", count),\n *   updateRequestList: (list) => console.log(\"Updated request list:\", list),\n * };\n *\n * await participantRequested(options);\n * // Output:\n * // \"Updated request list: [{ id: 'user1', reason: 'help' }, { id: 'user123', reason: 'join' }]\"\n * // \"Total requests: 3\"\n * ```\n */\n\nexport const participantRequested = async ({\n  userRequest,\n  requestList,\n  waitingRoomList,\n  updateTotalReqWait,\n  updateRequestList,\n}: ParticipantRequestedOptions): Promise<void> => {\n\n  // Add the user request to the request list\n  const updatedRequestList = [...requestList, userRequest];\n  updateRequestList(updatedRequestList);\n\n  // Update the total count of requests and waiting room participants\n  const reqCount = updatedRequestList.length + waitingRoomList.length;\n  updateTotalReqWait(reqCount);\n};\n","import type { ShowAlert } from \"../../@types/types\";\n\nexport interface PersonJoinedOptions {\n  showAlert?: ShowAlert;\n  name: string;\n}\n\n// Export the type definition for the function\nexport type PersonJoinedType = (options: PersonJoinedOptions) => Promise<void>;\n\n\n/**\n * Handles the event when a person joins.\n *\n * @param {PersonJoinedOptions} options - The options for the person joined event.\n * @param {string} options.name - The name of the person who joined.\n * @param {Function} [options.showAlert] - Optional function to display an alert/notification.\n * @returns {Promise<void>} A promise that resolves when the alert has been shown.\n *\n * @example\n * ```typescript\n * const options = {\n *   name: \"Alice\",\n *   showAlert: ({ message, type, duration }) => console.log(message, type, duration),\n * };\n *\n * await personJoined(options);\n * // Output: \"Alice joined the event.\" (Displayed as a success alert for 3000 ms)\n * ```\n */\n\nexport const personJoined = async ({ name, showAlert }: PersonJoinedOptions): Promise<void> => {\n  // Display an alert/notification about the person joining the event\n  showAlert?.({\n    message: `${name} joined the event.`,\n    type: \"success\",\n    duration: 3000,\n  });\n\n};\n","import type { CloseAndResizeParameters, CloseAndResizeType, PrepopulateUserMediaParameters, PrepopulateUserMediaType, ReorderStreamsParameters, ReorderStreamsType, Transport } from \"../../@types/types\";\n\nexport interface ProducerMediaClosedParameters extends CloseAndResizeParameters, PrepopulateUserMediaParameters, ReorderStreamsParameters {\n  consumerTransports: Transport[];\n  updateConsumerTransports: (transports: Transport[]) => void;\n  hostLabel: string;\n  shared: boolean;\n  updateShared: (shared: boolean) => void;\n  updateShareScreenStarted: (started: boolean) => void;\n  updateScreenId: (screenId: string) => void;\n  updateShareEnded: (ended: boolean) => void;\n\n  // mediasfu functions\n  closeAndResize: CloseAndResizeType;\n  prepopulateUserMedia: PrepopulateUserMediaType;\n  reorderStreams: ReorderStreamsType;\n\n  getUpdatedAllParams: () => ProducerMediaClosedParameters;\n  [key: string]: any;\n}\n\nexport interface ProducerMediaClosedOptions {\n  producerId: string;\n  kind: 'video' | 'screen' | 'audio' | 'screenshare';\n  parameters: ProducerMediaClosedParameters;\n}\n\n// Export the type definition for the function\nexport type ProducerMediaClosedType = (options: ProducerMediaClosedOptions) => Promise<void>;\n\n\n/**\n * Handles the closure of a media producer.\n *\n * @param {ProducerMediaClosedOptions} options - The options for closing the media producer.\n * @param {string} options.producerId - The ID of the producer to close.\n * @param {string} options.kind - The kind of media (e.g., \"screenshare\" or \"screen\").\n * @param {ProducerMediaClosedParameters} options.parameters - The parameters object containing various methods and properties.\n *\n * @returns {Promise<void>} - A promise that resolves when the producer has been closed and necessary updates are made.\n *\n * @remarks\n * This function performs the following steps:\n * 1. Retrieves updated parameters.\n * 2. Finds the transport associated with the producer to close.\n * 3. Closes the consumer transport and consumer if found.\n * 4. Updates the consumer transports list.\n * 5. Calls `closeAndResize` with the necessary parameters.\n * 6. If the producer kind is \"screenshare\" or \"screen\", updates shared state and calls various update methods.\n *\n * @example\n * ```typescript\n * const options: ProducerMediaClosedOptions = {\n *   producerId: \"12345\",\n *   kind: \"screenshare\",\n *   parameters: {\n *     consumerTransports: [{ producerId: \"12345\", consumerTransport: someTransport, consumer: someConsumer }],\n *     updateConsumerTransports: (transports) => console.log(\"Updated transports:\", transports),\n *     hostLabel: \"Host1\",\n *     shared: true,\n *     updateShared: (shared) => console.log(\"Updated shared state:\", shared),\n *     updateShareScreenStarted: (started) => console.log(\"Screen sharing started:\", started),\n *     updateScreenId: (screenId) => console.log(\"Screen ID updated:\", screenId),\n *     updateShareEnded: (ended) => console.log(\"Share ended:\", ended),\n *     closeAndResize: async (params) => console.log(\"Closed and resized:\", params),\n *     prepopulateUserMedia: async (params) => console.log(\"Prepopulated user media:\", params),\n *     reorderStreams: async (params) => console.log(\"Reordered streams:\", params),\n *     getUpdatedAllParams: () => (),\n *   },\n * };\n *\n * await producerMediaClosed(options);\n * ```\n */\n\n\nexport const producerMediaClosed = async ({\n  producerId,\n  kind,\n  parameters,\n}: ProducerMediaClosedOptions): Promise<void> => {\n  // Get updated parameters\n  const updatedParameters = parameters.getUpdatedAllParams();\n  \n  const {\n    consumerTransports,\n    updateConsumerTransports,\n    hostLabel,\n    shared,\n    updateShared,\n    updateShareScreenStarted,\n    updateScreenId,\n    updateShareEnded,\n    closeAndResize,\n    prepopulateUserMedia,\n    reorderStreams,\n  } = updatedParameters;\n\n  // Find the transport for the producer to close\n  const producerToClose = consumerTransports.find(\n    (transportData) => transportData.producerId === producerId\n  );\n\n  if (producerToClose) {\n    try {\n      await producerToClose.consumerTransport.close();\n    } catch (error) {\n      console.error(\"Error closing consumer transport:\", error);\n    }\n\n    try {\n      producerToClose.consumer.close();\n    } catch (error) {\n      console.error(\"Error closing consumer:\", error);\n    }\n\n    const updatedTransports = consumerTransports.filter(\n      (transportData) => transportData.producerId !== producerId\n    );\n    updateConsumerTransports(updatedTransports);\n\n    await closeAndResize({\n      producerId: producerId,\n      kind: kind,\n      parameters: updatedParameters,\n    });\n  } else {\n    if (kind === \"screenshare\" || kind === \"screen\") {\n      if (shared) {\n        updateShared(false);\n      } else {\n        updateShareScreenStarted(false);\n        updateScreenId(\"\");\n      }\n      updateShareEnded(true);\n      await prepopulateUserMedia({ name: hostLabel, parameters: updatedParameters });\n      await reorderStreams({ add: false, screenChanged: true, parameters: updatedParameters });\n    }\n  }\n};\n","\nimport {\n  Participant, PrepopulateUserMediaType, ReorderStreamsType, ReUpdateInterParameters,\n  ReUpdateInterType, ReorderStreamsParameters, PrepopulateUserMediaParameters,\n} from \"../../@types/types\";\n\nexport interface ProducerMediaPausedParameters extends PrepopulateUserMediaParameters, ReorderStreamsParameters, ReUpdateInterParameters {\n  activeSounds: string[];\n  meetingDisplayType: string;\n  meetingVideoOptimized: boolean;\n  participants: Participant[];\n  oldSoundIds: string[];\n  shared: boolean;\n  shareScreenStarted: boolean;\n  updateMainWindow: boolean;\n  hostLabel: string;\n  islevel: string;\n  updateActiveSounds: (activeSounds: string[]) => void;\n  updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n\n  // mediasfu functions\n  reorderStreams: ReorderStreamsType;\n  prepopulateUserMedia: PrepopulateUserMediaType;\n  reUpdateInter: ReUpdateInterType;\n\n  getUpdatedAllParams: () => ProducerMediaPausedParameters;\n  [key: string]: any;\n}\n\nexport interface ProducerMediaPausedOptions {\n  producerId: string;\n  kind: 'audio' | 'video' | 'screenshare' | 'screen';\n  name: string;\n  parameters: ProducerMediaPausedParameters;\n}\n\n// Export the type definition for the function\nexport type ProducerMediaPausedType = (options: ProducerMediaPausedOptions) => Promise<void>;\n\n\n/**\n * Handles the event when media is paused for a producer.\n *\n * @param {ProducerMediaPausedOptions} options - The options for the producer media paused event.\n * @param {string} options.producerId - The ID of the producer.\n * @param {string} options.kind - The kind of media (e.g., \"audio\", \"video\").\n * @param {string} options.name - The name of the producer.\n * @param {ProducerMediaPausedParameters} options.parameters - The parameters for the event.\n *\n * @returns {Promise<void>} A promise that resolves when the media paused handling is complete.\n *\n * @description\n * This function handles the event when media is paused for a producer. It performs the following tasks:\n * - Updates the parameters.\n * - Iterates through participants and updates the UI based on their muted status and other conditions.\n * - Manages active sounds and screen sharing state.\n * - Optimizes UI based on meeting display type and video optimization settings.\n *\n * @example\n * ```typescript\n * const options = {\n *   producerId: \"abc123\",\n *   kind: \"audio\",\n *   name: \"Participant1\",\n *   parameters: {\n *     activeSounds: [],\n *     meetingDisplayType: \"media\",\n *     meetingVideoOptimized: false,\n *     participants: [{ name: \"Participant1\", muted: true, islevel: \"2\", videoID: null }],\n *     oldSoundIds: [\"Participant1\"],\n *     shared: false,\n *     shareScreenStarted: false,\n *     updateMainWindow: false,\n *     hostLabel: \"Host\",\n *     islevel: \"1\",\n *     updateActiveSounds: (sounds) => console.log(\"Active sounds updated:\", sounds),\n *     updateUpdateMainWindow: (update) => console.log(\"Main window update:\", update),\n *     reorderStreams: async (params) => console.log(\"Reordered streams:\", params),\n *     prepopulateUserMedia: async (params) => console.log(\"Prepopulated user media:\", params),\n *     reUpdateInter: async (params) => console.log(\"Re-updated interface:\", params),\n *     getUpdatedAllParams: () => ({ }),\n *   },\n * };\n *\n * await producerMediaPaused(options);\n * ```\n */\n\nexport const producerMediaPaused = async ({\n  producerId,\n  kind,\n  name,\n  parameters,\n}: ProducerMediaPausedOptions): Promise<void> => {\n  // Get updated parameters\n  parameters = parameters.getUpdatedAllParams();\n\n  let {\n    activeSounds,\n    meetingDisplayType,\n    meetingVideoOptimized,\n    participants,\n    oldSoundIds,\n    shared,\n    shareScreenStarted,\n    updateMainWindow,\n    hostLabel,\n    islevel,\n    updateActiveSounds,\n    updateUpdateMainWindow,\n    reorderStreams,\n    prepopulateUserMedia,\n    reUpdateInter,\n  } = parameters;\n\n  // Iterate through participants and update UI\n  await Promise.all(\n    participants.map(async (participant) => {\n      if (participant.muted) {\n        try {\n          if (participant.islevel === \"2\" && !participant.videoID && !shared && !shareScreenStarted && islevel !== \"2\") {\n            updateMainWindow = true;\n            updateUpdateMainWindow(updateMainWindow);\n            await prepopulateUserMedia({ name: hostLabel, parameters });\n            updateMainWindow = false;\n            updateUpdateMainWindow(updateMainWindow);\n          }\n        } catch { /* empty */ }\n\n        if (shareScreenStarted || shared) {\n          if (participant.name && activeSounds.includes(participant.name)) {\n            activeSounds = activeSounds.filter((audioStream) => audioStream !== participant.name);\n            updateActiveSounds(activeSounds);\n          }\n\n          reUpdateInter({\n            name: participant.name!,\n            add: false,\n            force: true,\n            parameters,\n          });\n        } else {\n          // no screensahre so obey user display settings; show waveforms, ..\n        }\n      }\n    })\n  );\n\n  // Handle meeting display type and optimize UI\n  if (\n    meetingDisplayType === \"media\" ||\n    (meetingDisplayType === \"video\" && !meetingVideoOptimized)\n  ) {\n    const participant = participants.find((p) => p.name === name);\n    const hasVideo = participant?.videoID !== null && participant?.videoID !== '';\n\n    if (!hasVideo && !(shareScreenStarted || shared)) {\n      await reorderStreams({ add: false, screenChanged: true, parameters });\n    }\n  }\n\n  // Handle audio media\n  if (kind === \"audio\") {\n    try {\n      const participant = participants.find((p) => p.audioID === producerId) || participants.find((p) => p.name === name);\n\n      if (participant && ((participant.name && oldSoundIds.includes(participant.name)) || (name && oldSoundIds.includes(name)))) {\n        reUpdateInter({\n          name: participant.name!,\n          add: false,\n          force: true,\n          parameters,\n        });\n      }\n    } catch { /* empty */ }\n  }\n};\n","import type { Participant, PrepopulateUserMediaParameters, PrepopulateUserMediaType, ReorderStreamsParameters, ReorderStreamsType } from \"../../@types/types\";\n\nexport interface ProducerMediaResumedParameters extends PrepopulateUserMediaParameters, ReorderStreamsParameters {\n  meetingDisplayType: string;\n  participants: Participant[];\n  shared: boolean;\n  shareScreenStarted: boolean;\n  mainScreenFilled: boolean;\n  hostLabel: string;\n  updateUpdateMainWindow: (updateMainWindow: boolean) => void;\n\n  // mediasfu functions\n  reorderStreams: ReorderStreamsType;\n  prepopulateUserMedia: PrepopulateUserMediaType;\n\n  getUpdatedAllParams: () => ProducerMediaResumedParameters;\n  [key: string]: any;\n}\n\nexport interface ProducerMediaResumedOptions {\n  name: string;\n  kind: 'audio';\n  parameters: ProducerMediaResumedParameters;\n}\n\n// Export the type definition for the function\nexport type ProducerMediaResumedType = (options: ProducerMediaResumedOptions) => Promise<void>;\n\n/**\n * Resumes media for a specific participant in a meeting.\n *\n * @param {ProducerMediaResumedOptions} options - The options for resuming media.\n * @param {string} options.name - The name of the participant whose media is to be resumed.\n * @param {ProducerMediaResumedParameters} options.parameters - The parameters related to the meeting and participants.\n * @param {string} options.parameters.meetingDisplayType - The type of meeting display.\n * @param {Participant[]} options.parameters.participants - The list of participants in the meeting.\n * @param {boolean} options.parameters.shared - Indicates if the screen is being shared.\n * @param {boolean} options.parameters.shareScreenStarted - Indicates if screen sharing has started.\n * @param {boolean} options.parameters.mainScreenFilled - Indicates if the main screen is filled.\n * @param {string} options.parameters.hostLabel - The label of the host.\n * @param {Function} options.parameters.updateUpdateMainWindow - Function to update the main window.\n * @param {Function} options.parameters.reorderStreams - Function to reorder the streams.\n * @param {Function} options.parameters.prepopulateUserMedia - Function to prepopulate user media.\n *\n * @returns {Promise<void>} A promise that resolves when the media has been resumed.\n *\n * @example\n * ```typescript\n * const options = {\n *   name: \"John Doe\",\n *   kind: 'audio',\n *   parameters: {\n *     meetingDisplayType: \"media\",\n *     participants: [{ name: \"John Doe\", islevel: \"2\", videoID: \"\" }],\n *     shared: false,\n *     shareScreenStarted: false,\n *     mainScreenFilled: false,\n *     hostLabel: \"Host\",\n *     updateUpdateMainWindow: (update) => { console.log(\"Main window updated:\", update); },\n *     reorderStreams: async (opts) => { console.log(\"Reordered streams:\", opts); },\n *     prepopulateUserMedia: async (opts) => { console.log(\"Prepopulated user media:\", opts); },\n *   },\n * };\n *\n * await producerMediaResumed(options);\n * ```\n */\n\nexport const producerMediaResumed = async ({\n  name,\n  parameters,\n}: ProducerMediaResumedOptions): Promise<void> => {\n  const {\n    meetingDisplayType,\n    participants,\n    shared,\n    shareScreenStarted,\n    mainScreenFilled,\n    hostLabel,\n    updateUpdateMainWindow,\n    reorderStreams,\n    prepopulateUserMedia,\n  } = parameters;\n\n  // Update to resume the audio only of a participant\n  const participant = participants.find((obj) => obj.name === name);\n\n  if (participant && !mainScreenFilled && participant.islevel === \"2\") {\n    updateUpdateMainWindow(true);\n    await prepopulateUserMedia({ name: hostLabel, parameters });\n    updateUpdateMainWindow(false);\n  }\n\n  let checker: boolean | undefined;\n  if (meetingDisplayType === \"media\") {\n    if (participant) {\n      checker = participant.videoID !== null && participant.videoID !== '';\n\n      if (!checker) {\n        if (!(shareScreenStarted || shared)) {\n          await reorderStreams({ add: false, screenChanged: true, parameters });\n        }\n      }\n    }\n  }\n};\n","import { Socket } from \"socket.io-client\";\nexport interface ReInitiateRecordingOptions {\n  roomName: string;\n  member: string;\n  socket: Socket;\n  adminRestrictSetting: boolean;\n}\n\n// Export the type definition for the function\nexport type ReInitiateRecordingType = (options: ReInitiateRecordingOptions) => Promise<void>;\n\n/**\n * Re-initiates the recording for a given room and member.\n *\n * @param {ReInitiateRecordingOptions} options - The options for re-initiating the recording.\n * @param {string} options.roomName - The name of the room to re-initiate recording.\n * @param {string} options.member - The member re-initiating the recording.\n * @param {Socket} options.socket - The socket instance for communication.\n * @param {boolean} options.adminRestrictSetting - Determines if the admin has restricted access to specific media features.\n *\n * @returns {Promise<void>} A promise that resolves when the recording is re-initiated.\n *\n * @example\n * ```typescript\n * const options = {\n *   roomName: \"exampleRoom\",\n *   member: \"adminUser\",\n *   socket: socketInstance,\n *   adminRestrictSetting: false,\n * };\n * \n * await reInitiateRecording(options);\n * ```\n */\n\nexport const reInitiateRecording = async ({\n  roomName, member, socket, adminRestrictSetting\n}: ReInitiateRecordingOptions): Promise<void> => {\n\n  // Function to re-initiate recording\n  if (!adminRestrictSetting) {\n    socket.emit(\n      \"startRecordIng\",\n      { roomName, member },\n      ({ success }: { success: boolean; }) => {\n        if (success) {\n          // Handle success, if needed\n        } else {\n          // Handle failure, if needed\n        }\n      }\n    );\n  }\n};\n","import type { EventType, Message, Participant } from \"../../@types/types\";\n\nexport interface ReceiveMessageOptions {\n  message: Message;\n  messages: Message[];\n  participantsAll: Participant[];\n  member: string;\n  eventType: EventType;\n  islevel: string;\n  coHost: string;\n  updateMessages: (messages: Message[]) => void;\n  updateShowMessagesBadge: (showBadge: boolean) => void;\n}\n\n// Export the type definition for the function\nexport type ReceiveMessageType = (options: ReceiveMessageOptions) => Promise<void>;\n\n\n/**\n * Asynchronously processes and updates the received message.\n *\n * @param {ReceiveMessageOptions} options - The options object.\n * @param {Message} options.message - The received message object.\n * @param {Message[]} options.messages - The current array of messages.\n * @param {Participant[]} options.participantsAll - The list of all participants.\n * @param {string} options.member - The current member's name.\n * @param {EventType} options.eventType - The type of event triggering the message reception.\n * @param {string} options.islevel - The level of the current member.\n * @param {string} options.coHost - The co-host's name.\n * @param {Function} options.updateMessages - Function to update the messages array.\n * @param {Function} options.updateShowMessagesBadge - Function to update the visibility of the messages badge.\n *\n * @returns {Promise<void>} A promise that resolves when the message processing is complete.\n *\n * @example\n * ```typescript\n * const options = {\n *   message: { sender: \"user1\", receivers: [\"user2\"], message: \"Hello\", timestamp: Date.now(), group: false },\n *   messages: [],\n *   participantsAll: [{ name: \"user1\", isBanned: false }],\n *   member: \"user2\",\n *   eventType: \"conference\",\n *   islevel: \"1\",\n *   coHost: \"user3\",\n *   updateMessages: (msgs) => { console.log(\"Updated messages:\", msgs); },\n *   updateShowMessagesBadge: (show) => { console.log(\"Show message badge:\", show); },\n * };\n *\n * await receiveMessage(options);\n * ```\n */\n\nexport const receiveMessage = async ({\n  message,\n  messages,\n  participantsAll,\n  member,\n  eventType,\n  islevel,\n  coHost,\n  updateMessages,\n  updateShowMessagesBadge,\n}: ReceiveMessageOptions): Promise<void> => {\n\n  // Add the received message to the messages array\n  const { sender, receivers, message: content, timestamp, group } = message;\n  const oldMessages = messages;\n  messages = [...messages, { sender, receivers, message: content, timestamp, group }];\n\n  // Filter out messages with banned senders\n  if (eventType !== \"broadcast\" && eventType !== \"chat\") {\n    messages = messages.filter((msg) =>\n      participantsAll.some(\n        (participant) => participant.name === msg.sender && !participant.isBanned\n      )\n    );\n    updateMessages(messages);\n  } else {\n    messages = messages.filter((msg) => {\n      const participant = participantsAll.find((p) => p.name === msg.sender);\n      return !participant || !participant.isBanned;\n    });\n    updateMessages(messages);\n  }\n\n  // Separate group and direct messages\n  const oldGroupMessages = oldMessages.filter((msg) => msg.group);\n  const oldDirectMessages = oldMessages.filter((msg) => !msg.group);\n\n  // Group messages logic\n  const groupMessages = messages.filter((msg) => msg.group);\n\n  if (eventType !== \"broadcast\" && eventType !== \"chat\") {\n    if (oldGroupMessages.length !== groupMessages.length) {\n      const newGroupMessages = groupMessages.filter(\n        (msg) => !oldGroupMessages.some((oldMsg) => oldMsg.timestamp === msg.timestamp)\n      );\n\n      const newGroupMessages2 = newGroupMessages.filter(\n        (msg) => msg.sender === member || msg.receivers.includes(member)\n      );\n\n      const newGroupMessages3 = newGroupMessages2.filter((msg) => msg.sender === member);\n\n      if (newGroupMessages.length > 0 && newGroupMessages.length !== newGroupMessages3.length) {\n        updateShowMessagesBadge(true);\n      }\n    }\n  }\n\n  // Direct messages logic\n  const directMessages = messages.filter((msg) => !msg.group);\n\n  if (eventType !== \"broadcast\" && eventType !== \"chat\") {\n    if (oldDirectMessages.length !== directMessages.length) {\n      const newDirectMessages = directMessages.filter(\n        (msg) => !oldDirectMessages.some((oldMsg) => oldMsg.timestamp === msg.timestamp)\n      );\n\n      const newDirectMessages2 = newDirectMessages.filter(\n        (msg) => msg.sender === member || msg.receivers.includes(member)\n      );\n\n      const newDirectMessages3 = newDirectMessages2.filter((msg) => msg.sender === member);\n\n      if (\n        (newDirectMessages.length > 0 && newDirectMessages2.length > 0) ||\n        (newDirectMessages.length > 0 && (islevel === \"2\" || coHost === member))\n      ) {\n        if (islevel === \"2\" || coHost === member) {\n          if (newDirectMessages.length !== newDirectMessages3.length) {\n            updateShowMessagesBadge(true);\n          }\n        } else {\n          if (newDirectMessages2.length > 0) {\n            if (newDirectMessages.length !== newDirectMessages3.length) {\n              updateShowMessagesBadge(true);\n            }\n          }\n        }\n      }\n    }\n  }\n};\n","export interface SoundPlayerOptions {\n  soundUrl: string;\n}\n\n// Export the type definition for the function\nexport type SoundPlayerType = (options: SoundPlayerOptions) => void;\n\n/**\n * Plays a sound from a given URL.\n * \n * @param {SoundPlayerOptions} options - The options for the sound player.\n * @param {string} options.soundUrl - The URL of the sound to play.\n * \n * @returns {void}\n * \n * @example\n * ```typescript\n * SoundPlayer({ soundUrl: 'https://example.com/sound.mp3' });\n * ```\n */\n\nexport const SoundPlayer = ({ soundUrl }: SoundPlayerOptions): void => {\n  /**\n   * Plays a sound from the specified URL.\n   * @function\n   * @param {string} url - The URL of the sound to play.\n   */\n  const playSound = (url: string): void => {\n    const audio = new Audio(url);\n    audio.play().catch((error) => console.error('Error playing sound:', error));\n  };\n\n  if (soundUrl) {\n    playSound(soundUrl);\n  }\n};\n","\nimport { SoundPlayer } from \"../../methods/utils/SoundPlayer\";\nimport type { EventType, UserRecordingParams } from \"../../@types/types\";\n\nexport interface RecordingNoticeParameters {\n  islevel: string;\n  userRecordingParams: UserRecordingParams;\n  recordElapsedTime: number;\n  recordStartTime: number;\n  recordStarted: boolean;\n  recordPaused: boolean;\n  canLaunchRecord: boolean;\n  stopLaunchRecord: boolean;\n  recordStopped: boolean;\n  isTimerRunning: boolean;\n  canPauseResume: boolean;\n  eventType: EventType;\n\n  updateRecordingProgressTime: (time: string) => void;\n  updateShowRecordButtons: (show: boolean) => void;\n  updateUserRecordingParams: (params: UserRecordingParams) => void;\n  updateRecordingMediaOptions: (options: string) => void;\n  updateRecordingAudioOptions: (options: string) => void;\n  updateRecordingVideoOptions: (options: string) => void;\n  updateRecordingVideoType: (type: string) => void;\n  updateRecordingVideoOptimized: (optimized: boolean) => void;\n  updateRecordingDisplayType: (type: \"video\" | \"media\" | \"all\") => void;\n  updateRecordingAddHLS: (addHLS: boolean) => void;\n  updateRecordingNameTags: (nameTags: boolean) => void;\n  updateRecordingBackgroundColor: (color: string) => void;\n  updateRecordingNameTagsColor: (color: string) => void;\n  updateRecordingOrientationVideo: (orientation: string) => void;\n  updateRecordingAddText: (addText: boolean) => void;\n  updateRecordingCustomText: (text: string) => void;\n  updateRecordingCustomTextPosition: (position: string) => void;\n  updateRecordingCustomTextColor: (color: string) => void;\n  updatePauseRecordCount: (count: number) => void;\n  updateRecordElapsedTime: (time: number) => void;\n  updateRecordStarted: (started: boolean) => void;\n  updateRecordPaused: (paused: boolean) => void;\n  updateCanLaunchRecord: (canLaunch: boolean) => void;\n  updateStopLaunchRecord: (stop: boolean) => void;\n  updateRecordStopped: (stopped: boolean) => void;\n  updateIsTimerRunning: (running: boolean) => void;\n  updateCanPauseResume: (canPause: boolean) => void;\n  updateRecordStartTime: (startTime: number) => void;\n  updateRecordState: (state: string) => void;\n\n  // mediasfu functions\n  [key: string]: any;\n}\n\nexport interface RecordingNoticeOptions {\n  state: string;\n  userRecordingParam: UserRecordingParams | null;\n  pauseCount: number;\n  timeDone: number;\n  parameters: RecordingNoticeParameters;\n}\n\n// Export the type definition for the function\nexport type RecordingNoticeType = (options: RecordingNoticeOptions) => Promise<void>;\n\n/**\n * Handles the recording notice state and updates various recording parameters accordingly.\n *\n * @param {RecordingNoticeOptions} options - The options object.\n * @param {string} options.state - The current state of the recording (e.g., \"pause\", \"stop\").\n * @param {UserRecordingParams | null} options.userRecordingParam - The user recording parameters.\n * @param {number} options.pauseCount - The count of pauses during the recording.\n * @param {number} options.timeDone - The elapsed time of the recording.\n * @param {Object} options.parameters - The parameters object containing various update functions and state variables.\n * @param {string} options.parameters.islevel - The level of the recording.\n * @param {Object} options.parameters.userRecordingParams - The user recording parameters.\n * @param {number} options.parameters.pauseRecordCount - The count of pauses during the recording.\n * @param {number} options.parameters.recordElapsedTime - The elapsed time of the recording.\n * @param {number} options.parameters.recordStartTime - The start time of the recording.\n * @param {boolean} options.parameters.recordStarted - Indicates if the recording has started.\n * @param {boolean} options.parameters.recordPaused - Indicates if the recording is paused.\n * @param {boolean} options.parameters.canLaunchRecord - Indicates if the recording can be launched.\n * @param {boolean} options.parameters.stopLaunchRecord - Indicates if the recording launch should be stopped.\n * @param {boolean} options.parameters.recordStopped - Indicates if the recording is stopped.\n * @param {boolean} options.parameters.isTimerRunning - Indicates if the timer is running.\n * @param {boolean} options.parameters.canPauseResume - Indicates if the recording can be paused or resumed.\n * @param {string} options.parameters.eventType - The type of event triggering the recording notice.\n * @param {Function} options.parameters.updateRecordingProgressTime - Function to update the recording progress time.\n * @param {Function} options.parameters.updateShowRecordButtons - Function to update the visibility of record buttons.\n * @param {Function} options.parameters.updateUserRecordingParams - Function to update user recording parameters.\n * @param {Function} options.parameters.updateRecordingMediaOptions - Function to update recording media options.\n * @param {Function} options.parameters.updateRecordingAudioOptions - Function to update recording audio options.\n * @param {Function} options.parameters.updateRecordingVideoOptions - Function to update recording video options.\n * @param {Function} options.parameters.updateRecordingVideoType - Function to update recording video type.\n * @param {Function} options.parameters.updateRecordingVideoOptimized - Function to update recording video optimization.\n * @param {Function} options.parameters.updateRecordingDisplayType - Function to update recording display type.\n * @param {Function} options.parameters.updateRecordingAddHLS - Function to update HLS addition in recording.\n * @param {Function} options.parameters.updateRecordingNameTags - Function to update recording name tags.\n * @param {Function} options.parameters.updateRecordingBackgroundColor - Function to update recording background color.\n * @param {Function} options.parameters.updateRecordingNameTagsColor - Function to update recording name tags color.\n * @param {Function} options.parameters.updateRecordingOrientationVideo - Function to update recording orientation video.\n * @param {Function} options.parameters.updateRecordingAddText - Function to update recording text addition.\n * @param {Function} options.parameters.updateRecordingCustomText - Function to update custom text in recording.\n * @param {Function} options.parameters.updateRecordingCustomTextPosition - Function to update custom text position.\n * @param {Function} options.parameters.updateRecordingCustomTextColor - Function to update custom text color.\n * @param {Function} options.parameters.updatePauseRecordCount - Function to update pause record count.\n * @param {Function} options.parameters.updateRecordElapsedTime - Function to update record elapsed time.\n * @param {Function} options.parameters.updateRecordStartTime - Function to update record start time.\n * @param {Function} options.parameters.updateRecordStarted - Function to update record started status.\n * @param {Function} options.parameters.updateRecordPaused - Function to update record paused status.\n * @param {Function} options.parameters.updateCanLaunchRecord - Function to update can launch record status.\n * @param {Function} options.parameters.updateStopLaunchRecord - Function to update stop launch record status.\n * @param {Function} options.parameters.updateRecordStopped - Function to update record stopped status.\n * @param {Function} options.parameters.updateIsTimerRunning - Function to update timer running status.\n * @param {Function} options.parameters.updateCanPauseResume - Function to update can pause/resume status.\n * @param {Function} options.parameters.updateRecordState - Function to update the record state.\n *\n * @returns {Promise<void>} A promise that resolves when the recording notice handling is complete.\n *\n * @example\n * ```typescript\n * const options = {\n *   state: \"pause\",\n *   userRecordingParam: {\n *     mainSpecs: { mediaOptions: \"option1\", audioOptions: \"option2\", videoOptions: \"option3\", videoType: \"HD\" },\n *     dispSpecs: { nameTags: true, backgroundColor: \"blue\", orientationVideo: \"landscape\" },\n *     textSpecs: { addText: true, customText: \"Sample\", customTextPosition: \"top-right\", customTextColor: \"white\" },\n *   },\n *   pauseCount: 2,\n *   timeDone: 3600,\n *   parameters: { \n *     islevel: \"2\",\n *     userRecordingParams: { },\n *     recordElapsedTime: 0,\n *     recordStartTime: 0,\n *     // various other parameters and update functions here...\n *   },\n * };\n * await recordingNotice(options);\n * ```\n */\n\nexport const recordingNotice = async ({\n  state,\n  userRecordingParam,\n  pauseCount,\n  timeDone,\n  parameters,\n}: RecordingNoticeOptions): Promise<void> => {\n  let {\n    islevel,\n    userRecordingParams,\n    pauseRecordCount,\n    recordElapsedTime,\n    recordStartTime,\n    recordStarted,\n    recordPaused,\n    canLaunchRecord,\n    stopLaunchRecord,\n    recordStopped,\n    isTimerRunning,\n    canPauseResume,\n    eventType,\n\n    updateRecordingProgressTime,\n    updateShowRecordButtons,\n    updateUserRecordingParams,\n    updateRecordingMediaOptions,\n    updateRecordingAudioOptions,\n    updateRecordingVideoOptions,\n    updateRecordingVideoType,\n    updateRecordingVideoOptimized,\n    updateRecordingDisplayType,\n    updateRecordingAddHLS,\n    updateRecordingNameTags,\n    updateRecordingBackgroundColor,\n    updateRecordingNameTagsColor,\n    updateRecordingOrientationVideo,\n    updateRecordingAddText,\n    updateRecordingCustomText,\n    updateRecordingCustomTextPosition,\n    updateRecordingCustomTextColor,\n    updatePauseRecordCount,\n    updateRecordElapsedTime,\n    updateRecordStartTime,\n    updateRecordStarted,\n    updateRecordPaused,\n    updateCanLaunchRecord,\n    updateStopLaunchRecord,\n    updateRecordStopped,\n    updateIsTimerRunning,\n    updateCanPauseResume,\n    updateRecordState,\n  } = parameters;\n\n  try {\n    if (islevel !== \"2\") {\n      if (state === \"pause\") {\n        updateRecordStarted(true);\n        updateRecordPaused(true);\n        updateRecordState(\"yellow\");\n        if (eventType !== 'broadcast') {\n          SoundPlayer({ soundUrl: \"https://www.mediasfu.com/sounds/record-paused.mp3\" });\n        }\n      } else if (state === \"stop\") {\n        updateRecordStarted(true);\n        updateRecordStopped(true);\n        updateRecordState(\"green\");\n        if (eventType !== 'broadcast') {\n          SoundPlayer({ soundUrl: \"https://www.mediasfu.com/sounds/record-stopped.mp3\" });\n        }\n      } else {\n        updateRecordState(\"red\");\n        updateRecordStarted(true);\n        updateRecordPaused(false);\n        if (eventType !== 'broadcast') {\n          SoundPlayer({ soundUrl: \"https://www.mediasfu.com/sounds/record-progress.mp3\" });\n        }\n      }\n    } else {\n      if (state === \"pause\") {\n        updateRecordState(\"yellow\");\n        if (userRecordingParam) {\n          userRecordingParams.mainSpecs = userRecordingParam.mainSpecs;\n          userRecordingParams.dispSpecs = userRecordingParam.dispSpecs;\n          userRecordingParams.textSpecs = userRecordingParam.textSpecs;\n\n          updateUserRecordingParams(userRecordingParams);\n          updateRecordingMediaOptions(userRecordingParams.mainSpecs.mediaOptions);\n          updateRecordingAudioOptions(userRecordingParams.mainSpecs.audioOptions);\n          updateRecordingVideoOptions(userRecordingParams.mainSpecs.videoOptions);\n          updateRecordingVideoType(userRecordingParams.mainSpecs.videoType);\n          updateRecordingVideoOptimized(userRecordingParams.mainSpecs.videoOptimized);\n          updateRecordingDisplayType(userRecordingParams.mainSpecs.recordingDisplayType);\n          updateRecordingAddHLS(userRecordingParams.mainSpecs.addHLS);\n          updateRecordingNameTags(userRecordingParams.dispSpecs.nameTags);\n          updateRecordingBackgroundColor(userRecordingParams.dispSpecs.backgroundColor);\n          updateRecordingNameTagsColor(userRecordingParams.dispSpecs.nameTagsColor);\n          updateRecordingOrientationVideo(userRecordingParams.dispSpecs.orientationVideo);\n          updateRecordingAddText(userRecordingParams.textSpecs?.addText ?? false);\n          updateRecordingCustomText(userRecordingParams.textSpecs?.customText ?? '');\n          updateRecordingCustomTextPosition(userRecordingParams.textSpecs?.customTextPosition ?? '');\n          updateRecordingCustomTextColor(userRecordingParams.textSpecs?.customTextColor ?? '');\n\n          pauseRecordCount = pauseCount;\n          updatePauseRecordCount(pauseRecordCount);\n\n          recordElapsedTime = timeDone;\n          recordElapsedTime = Math.floor(recordElapsedTime / 1000);\n          recordStartTime = Math.floor(Date.now() / 1000) - recordElapsedTime;\n          updateRecordStartTime(recordStartTime);\n          updateRecordElapsedTime(recordElapsedTime);\n\n\n\n          recordStarted = true;\n          recordPaused = true;\n          canLaunchRecord = false;\n          recordStopped = false;\n\n          updateRecordStarted(recordStarted);\n          updateRecordPaused(recordPaused);\n          updateCanLaunchRecord(canLaunchRecord);\n          updateRecordStopped(recordStopped);\n          updateShowRecordButtons(true);\n\n          isTimerRunning = false;\n          canPauseResume = true;\n\n          updateIsTimerRunning(isTimerRunning);\n          updateCanPauseResume(canPauseResume);\n\n          const formattedTime = formatElapsedTime(recordElapsedTime);\n          updateRecordingProgressTime(formattedTime);\n        }\n        SoundPlayer({ soundUrl: \"https://www.mediasfu.com/sounds/record-paused.mp3\" });\n      } else if (state === \"stop\") {\n        updateRecordStarted(true);\n        updateRecordStopped(true);\n        canLaunchRecord = false;\n        stopLaunchRecord = true;\n\n        updateRecordStarted(recordStarted);\n        updateRecordStopped(recordStopped);\n        updateCanLaunchRecord(canLaunchRecord);\n        updateStopLaunchRecord(stopLaunchRecord);\n        updateShowRecordButtons(false);\n\n        updateRecordState(\"green\");\n        SoundPlayer({ soundUrl: \"https://www.mediasfu.com/sounds/record-stopped.mp3\" });\n      } else {\n        updateRecordState(\"red\");\n        updateRecordStarted(true);\n        updateRecordPaused(false);\n        SoundPlayer({ soundUrl: \"https://www.mediasfu.com/sounds/record-progress.mp3\" });\n      }\n    }\n  } catch (error) {\n    console.log(\"Error in RecordingNotice: \", error);\n    // throw new Error(\"Failed to handle recording state and status.\");\n  }\n};\n\nconst formatElapsedTime = (recordElapsedTime: number): string => {\n  \n  const hours = Math.floor(recordElapsedTime / 3600);\n  const minutes = Math.floor((recordElapsedTime % 3600) / 60);\n  const seconds = recordElapsedTime % 60;\n\n  return `${padNumber(hours)}:${padNumber(minutes)}:${padNumber(seconds)}`;\n};\n\nconst padNumber = (number: number): string => {\n  return number.toString().padStart(2, \"0\");\n};\n","export interface RecordParams {\n  recordingAudioPausesLimit: number;\n  recordingAudioPausesCount: number;\n  recordingAudioSupport: boolean;\n  recordingAudioPeopleLimit: number;\n  recordingAudioParticipantsTimeLimit: number;\n  recordingVideoPausesCount: number;\n  recordingVideoPausesLimit: number;\n  recordingVideoSupport: boolean;\n  recordingVideoPeopleLimit: number;\n  recordingVideoParticipantsTimeLimit: number;\n  recordingAllParticipantsSupport: boolean;\n  recordingVideoParticipantsSupport: boolean;\n  recordingAllParticipantsFullRoomSupport: boolean;\n  recordingVideoParticipantsFullRoomSupport: boolean;\n  recordingPreferredOrientation: string;\n  recordingSupportForOtherOrientation: boolean;\n  recordingMultiFormatsSupport: boolean;\n}\n\nexport interface RoomRecordParamsParameters {\n  updateRecordingAudioPausesLimit: (value: number) => void;\n  updateRecordingAudioPausesCount: (value: number) => void;\n  updateRecordingAudioSupport: (value: boolean) => void;\n  updateRecordingAudioPeopleLimit: (value: number) => void;\n  updateRecordingAudioParticipantsTimeLimit: (value: number) => void;\n  updateRecordingVideoPausesCount: (value: number) => void;\n  updateRecordingVideoPausesLimit: (value: number) => void;\n  updateRecordingVideoSupport: (value: boolean) => void;\n  updateRecordingVideoPeopleLimit: (value: number) => void;\n  updateRecordingVideoParticipantsTimeLimit: (value: number) => void;\n  updateRecordingAllParticipantsSupport: (value: boolean) => void;\n  updateRecordingVideoParticipantsSupport: (value: boolean) => void;\n  updateRecordingAllParticipantsFullRoomSupport: (value: boolean) => void;\n  updateRecordingVideoParticipantsFullRoomSupport: (value: boolean) => void;\n  updateRecordingPreferredOrientation: (value: string) => void;\n  updateRecordingSupportForOtherOrientation: (value: boolean) => void;\n  updateRecordingMultiFormatsSupport: (value: boolean) => void;\n\n  // mediasfu functions\n  [key: string]: any;\n}\nexport interface RoomRecordParamsOptions {\n  recordParams: RecordParams;\n  parameters: RoomRecordParamsParameters;\n}\n\n// Export the type definition for the function\nexport type RoomRecordParamsType = ({\n  recordParams,\n  parameters,\n}: RoomRecordParamsOptions) => Promise<void>;\n\n/**\n * Updates various recording parameters based on the provided `recordParams`.\n *\n * @param {Object} params - The parameters object.\n * @param {RecordParams} params.recordParams - The recording parameters to update.\n * @param {Parameters} params.parameters - The functions to update each recording parameter.\n * @param {Function} params.parameters.updateRecordingAudioPausesLimit - Function to update the audio pauses limit.\n * @param {Function} params.parameters.updateRecordingAudioPausesCount - Function to update the audio pauses count.\n * @param {Function} params.parameters.updateRecordingAudioSupport - Function to update the audio support.\n * @param {Function} params.parameters.updateRecordingAudioPeopleLimit - Function to update the audio people limit.\n * @param {Function} params.parameters.updateRecordingAudioParticipantsTimeLimit - Function to update the audio participants time limit.\n * @param {Function} params.parameters.updateRecordingVideoPausesCount - Function to update the video pauses count.\n * @param {Function} params.parameters.updateRecordingVideoPausesLimit - Function to update the video pauses limit.\n * @param {Function} params.parameters.updateRecordingVideoSupport - Function to update the video support.\n * @param {Function} params.parameters.updateRecordingVideoPeopleLimit - Function to update the video people limit.\n * @param {Function} params.parameters.updateRecordingVideoParticipantsTimeLimit - Function to update the video participants time limit.\n * @param {Function} params.parameters.updateRecordingAllParticipantsSupport - Function to update the all participants support.\n * @param {Function} params.parameters.updateRecordingVideoParticipantsSupport - Function to update the video participants support.\n * @param {Function} params.parameters.updateRecordingAllParticipantsFullRoomSupport - Function to update the all participants full room support.\n * @param {Function} params.parameters.updateRecordingVideoParticipantsFullRoomSupport - Function to update the video participants full room support.\n * @param {Function} params.parameters.updateRecordingPreferredOrientation - Function to update the preferred orientation.\n * @param {Function} params.parameters.updateRecordingSupportForOtherOrientation - Function to update the support for other orientation.\n * @param {Function} params.parameters.updateRecordingMultiFormatsSupport - Function to update the multi-formats support.\n * @returns {Promise<void>} A promise that resolves when all parameters have been updated.\n *\n * @example\n * ```typescript\n * const recordParams = {\n *   recordingAudioPausesLimit: 3,\n *   recordingAudioPausesCount: 1,\n *   recordingAudioSupport: true,\n *   recordingAudioPeopleLimit: 10,\n *   recordingAudioParticipantsTimeLimit: 60,\n *   recordingVideoPausesCount: 1,\n *   recordingVideoPausesLimit: 3,\n *   recordingVideoSupport: true,\n *   recordingVideoPeopleLimit: 10,\n *   recordingVideoParticipantsTimeLimit: 60,\n *   recordingAllParticipantsSupport: true,\n *   recordingVideoParticipantsSupport: false,\n *   recordingAllParticipantsFullRoomSupport: true,\n *   recordingVideoParticipantsFullRoomSupport: false,\n *   recordingPreferredOrientation: \"landscape\",\n *   recordingSupportForOtherOrientation: true,\n *   recordingMultiFormatsSupport: false,\n * };\n *\n * const parameters = {\n *   updateRecordingAudioPausesLimit: (value) => console.log(\"Audio Pauses Limit:\", value),\n *   updateRecordingAudioPausesCount: (value) => console.log(\"Audio Pauses Count:\", value),\n *   updateRecordingAudioSupport: (value) => console.log(\"Audio Support:\", value),\n *   updateRecordingAudioPeopleLimit: (value) => console.log(\"Audio People Limit:\", value),\n *   updateRecordingAudioParticipantsTimeLimit: (value) => console.log(\"Audio Participants Time Limit:\", value),\n *   updateRecordingVideoPausesCount: (value) => console.log(\"Video Pauses Count:\", value),\n *   updateRecordingVideoPausesLimit: (value) => console.log(\"Video Pauses Limit:\", value),\n *   updateRecordingVideoSupport: (value) => console.log(\"Video Support:\", value),\n *   updateRecordingVideoPeopleLimit: (value) => console.log(\"Video People Limit:\", value),\n *   updateRecordingVideoParticipantsTimeLimit: (value) => console.log(\"Video Participants Time Limit:\", value),\n *   updateRecordingAllParticipantsSupport: (value) => console.log(\"All Participants Support:\", value),\n *   updateRecordingVideoParticipantsSupport: (value) => console.log(\"Video Participants Support:\", value),\n *   updateRecordingAllParticipantsFullRoomSupport: (value) => console.log(\"All Participants Full Room Support:\", value),\n *   updateRecordingVideoParticipantsFullRoomSupport: (value) => console.log(\"Video Participants Full Room Support:\", value),\n *   updateRecordingPreferredOrientation: (value) => console.log(\"Preferred Orientation:\", value),\n *   updateRecordingSupportForOtherOrientation: (value) => console.log(\"Support For Other Orientation:\", value),\n *   updateRecordingMultiFormatsSupport: (value) => console.log(\"Multi-Formats Support:\", value),\n * };\n *\n * await roomRecordParams({ recordParams, parameters });\n * ```\n */\n\nexport const roomRecordParams = async ({\n  recordParams,\n  parameters,\n}: RoomRecordParamsOptions): Promise<void> => {\n\n  const {\n    updateRecordingAudioPausesLimit,\n    updateRecordingAudioPausesCount,\n    updateRecordingAudioSupport,\n    updateRecordingAudioPeopleLimit,\n    updateRecordingAudioParticipantsTimeLimit,\n    updateRecordingVideoPausesCount,\n    updateRecordingVideoPausesLimit,\n    updateRecordingVideoSupport,\n    updateRecordingVideoPeopleLimit,\n    updateRecordingVideoParticipantsTimeLimit,\n    updateRecordingAllParticipantsSupport,\n    updateRecordingVideoParticipantsSupport,\n    updateRecordingAllParticipantsFullRoomSupport,\n    updateRecordingVideoParticipantsFullRoomSupport,\n    updateRecordingPreferredOrientation,\n    updateRecordingSupportForOtherOrientation,\n    updateRecordingMultiFormatsSupport,\n  } = parameters;\n\n  // Update each recording parameter based on the provided recordParams\n  updateRecordingAudioPausesLimit(recordParams.recordingAudioPausesLimit);\n  updateRecordingAudioPausesCount(recordParams.recordingAudioPausesCount);\n  updateRecordingAudioSupport(recordParams.recordingAudioSupport);\n  updateRecordingAudioPeopleLimit(recordParams.recordingAudioPeopleLimit);\n  updateRecordingAudioParticipantsTimeLimit(\n    recordParams.recordingAudioParticipantsTimeLimit\n  );\n  updateRecordingVideoPausesCount(recordParams.recordingVideoPausesCount);\n  updateRecordingVideoPausesLimit(recordParams.recordingVideoPausesLimit);\n  updateRecordingVideoSupport(recordParams.recordingVideoSupport);\n  updateRecordingVideoPeopleLimit(recordParams.recordingVideoPeopleLimit);\n  updateRecordingVideoParticipantsTimeLimit(\n    recordParams.recordingVideoParticipantsTimeLimit\n  );\n  updateRecordingAllParticipantsSupport(\n    recordParams.recordingAllParticipantsSupport\n  );\n  updateRecordingVideoParticipantsSupport(\n    recordParams.recordingVideoParticipantsSupport\n  );\n  updateRecordingAllParticipantsFullRoomSupport(\n    recordParams.recordingAllParticipantsFullRoomSupport\n  );\n  updateRecordingVideoParticipantsFullRoomSupport(\n    recordParams.recordingVideoParticipantsFullRoomSupport\n  );\n  updateRecordingPreferredOrientation(\n    recordParams.recordingPreferredOrientation\n  );\n  updateRecordingSupportForOtherOrientation(\n    recordParams.recordingSupportForOtherOrientation\n  );\n  updateRecordingMultiFormatsSupport(recordParams.recordingMultiFormatsSupport);\n};\n","import type { Participant } from \"../../@types/types\";\n\nexport interface ScreenProducerIdOptions {\n  producerId: string;\n  screenId: string;\n  membersReceived: boolean;\n  shareScreenStarted: boolean;\n  deferScreenReceived: boolean;\n  participants: Participant[];\n  updateScreenId: (id: string) => void;\n  updateShareScreenStarted: (started: boolean) => void;\n  updateDeferScreenReceived: (received: boolean) => void;\n}\n\n// Export the type definition for the function\nexport type ScreenProducerIdType = (options: ScreenProducerIdOptions) => void;\n\n/**\n * Manages and updates screen sharing based on the producer ID.\n *\n * @param {ScreenProducerIdOptions} options - The configuration options.\n * @param {string} options.producerId - The producer's unique ID for screen sharing.\n * @param {string} options.screenId - The current screen ID.\n * @param {boolean} options.membersReceived - Indicates if member data has been received.\n * @param {boolean} options.shareScreenStarted - Indicates if screen sharing has started.\n * @param {boolean} options.deferScreenReceived - Indicates if screen sharing should be deferred.\n * @param {Participant[]} options.participants - List of participants.\n * @param {Function} options.updateScreenId - Function to update the screen ID.\n * @param {Function} options.updateShareScreenStarted - Function to update the screen sharing status.\n * @param {Function} options.updateDeferScreenReceived - Function to update the defer screen sharing status.\n *\n * @returns {void}\n *\n * @example\n * ```typescript\n * const options = {\n *   producerId: \"abc123\",\n *   screenId: \"screen1\",\n *   membersReceived: true,\n *   shareScreenStarted: false,\n *   deferScreenReceived: false,\n *   participants: [{ ScreenID: \"screen1\", ScreenOn: true }],\n *   updateScreenId: (id) => console.log(\"Screen ID updated to:\", id),\n *   updateShareScreenStarted: (started) => console.log(\"Share screen started:\", started),\n *   updateDeferScreenReceived: (deferred) => console.log(\"Defer screen received:\", deferred),\n * };\n *\n * screenProducerId(options);\n * // Output:\n * // Screen ID updated to: abc123\n * // Share screen started: true\n * // Defer screen received: false\n * ```\n */\n\nexport const screenProducerId = ({\n  producerId,\n  screenId,\n  membersReceived,\n  shareScreenStarted,\n  deferScreenReceived,\n  participants,\n  updateScreenId,\n  updateShareScreenStarted,\n  updateDeferScreenReceived,\n}: ScreenProducerIdOptions): void => {\n\n  // Check if members data has been received with the screenId participant in it\n  const host = participants.find(\n    (participant) =>\n      participant.ScreenID === screenId && participant.ScreenOn === true\n  );\n\n  // Operations to update the UI\n  if (host && membersReceived) {\n    screenId = producerId;\n    shareScreenStarted = true;\n    deferScreenReceived = false;\n\n    updateScreenId(screenId);\n    updateShareScreenStarted(shareScreenStarted);\n    updateDeferScreenReceived(deferScreenReceived);\n  } else {\n    deferScreenReceived = true;\n    screenId = producerId;\n\n    updateScreenId(screenId);\n    updateDeferScreenReceived(deferScreenReceived);\n  }\n};\n","import { Socket } from \"socket.io-client\";\n\nexport interface StartRecordsOptions {\n  roomName: string;\n  member: string;\n  socket: Socket;\n}\n\n// Export the type definition for the function\nexport type StartRecordsType = (options: StartRecordsOptions) => Promise<void>;\n\n/**\n * Starts recording for a specified room.\n *\n * @param {StartRecordsOptions} options - Configuration options to start the recording.\n * @param {string} options.roomName - The name of the room to record.\n * @param {string} options.member - The name of the member initiating the recording.\n * @param {Socket} options.socket - The socket instance to communicate with the server.\n *\n * @returns {Promise<void>} A promise that resolves when the attempt to start recording completes.\n *\n * @example\n * ```typescript\n * const options = {\n *   roomName: \"RoomA\",\n *   member: \"AdminUser\",\n *   socket: socketInstance,\n * };\n *\n * startRecords(options)\n *   .then(() => console.log(\"Recording started successfully\"))\n *   .catch((error) => console.error(\"Failed to start recording\", error));\n * ```\n */\n\nexport const startRecords = async ({\n  roomName, member, socket\n}: StartRecordsOptions): Promise<void> => {\n\n  // Send the 'startRecording' event to the server with roomName and member information\n  socket.emit(\n    \"startRecordIng\",\n    { roomName, member },\n    ({ success }: { success: boolean; }) => {\n      if (success) {\n        // Handle success case\n        // console.log('Recording started', success);\n      } else {\n        // Handle failure case\n        // console.log('Recording failed to start', success);\n      }\n    }\n  );\n};\n","import type { ShowAlert } from \"../../@types/types\";\nexport interface StoppedRecordingOptions {\n  state: string;\n  reason: string;\n  showAlert?: ShowAlert;\n}\n\n// Export the type definition for the function\nexport type StoppedRecordingType = (options: StoppedRecordingOptions) => Promise<void>;\n\n/**\n * Displays an alert message when the recording has stopped, indicating the reason.\n *\n * @param {StoppedRecordingOptions} options - Options for showing the recording stopped alert.\n * @param {string} options.state - The state of the recording, should be \"stop\" to trigger the alert.\n * @param {string} options.reason - Reason why the recording stopped.\n * @param {ShowAlert} [options.showAlert] - Optional function to display the alert message.\n *\n * @returns {Promise<void>} A promise that resolves once the alert is shown, if applicable.\n *\n * @example\n * ```typescript\n * const options = {\n *   state: \"stop\",\n *   reason: \"The session ended.\",\n *   showAlert: (alert) => console.log(alert.message),\n * };\n * \n * stoppedRecording(options);\n * // Output: \"The recording has stopped - The session ended.\"\n * ```\n */\n\nexport const stoppedRecording = async ({\n  state,\n  reason,\n  showAlert\n}: StoppedRecordingOptions): Promise<void> => {\n\n  try {\n    // Ensure the state is 'stop' before showing the alert\n    if (state === \"stop\") {\n      showAlert?.({\n        message: `The recording has stopped - ${reason}.`,\n        duration: 3000,\n        type: \"danger\",\n      });\n    }\n  } catch (error) {\n    console.log(\"Error in stoppedRecording: \", error);\n    // throw new Error(\"Failed to display the recording stopped alert message.\");\n  }\n};\n","import type { ShowAlert } from \"../../@types/types\";\nexport interface TimeLeftRecordingOptions {\n  timeLeft: number;\n  showAlert?: ShowAlert;\n}\n\n// Export the type definition for the function\nexport type TimeLeftRecordingType = (options: TimeLeftRecordingOptions) => void;\n\n\n/**\n * Displays an alert message indicating the remaining time left for recording.\n *\n * @param {TimeLeftRecordingOptions} options - Options to manage time left for recording.\n * @param {number} options.timeLeft - Time remaining for the recording in seconds.\n * @param {ShowAlert} [options.showAlert] - Optional function to show alert message.\n * \n * @returns {void}\n * \n * @example\n * ```typescript\n * const options = {\n *   timeLeft: 30,\n *   showAlert: (alert) => console.log(alert.message),\n * };\n * \n * timeLeftRecording(options);\n * // Output: \"The recording will stop in less than 30 seconds.\"\n * ```\n */\n\nexport const timeLeftRecording = ({ timeLeft, showAlert }: TimeLeftRecordingOptions): void => {\n  try {\n    // Display alert message\n\n    showAlert?.({\n      message: `The recording will stop in less than ${timeLeft} seconds.`,\n      duration: 3000,\n      type: \"danger\",\n    });\n\n  } catch (error) {\n    console.log(\"Error in timeLeftRecording: \", error);\n    // throw new Error(\"Failed to display the time left alert message.\");\n  }\n};\n","import type { ConnectIpsType, GetDomainsType, ConnectIpsParameters, GetDomainsParameters, AltDomains, Participant, ConsumeSocket } from \"../../@types/types\";\n\nexport interface UpdateConsumingDomainsParameters extends ConnectIpsParameters, GetDomainsParameters {\n  participants: Participant[];\n  consume_sockets: ConsumeSocket[];\n\n  // mediasfu functions\n  connectIps: ConnectIpsType;\n  getDomains: GetDomainsType;\n\n  getUpdatedAllParams: () => UpdateConsumingDomainsParameters;\n  [key: string]: any;\n}\n\nexport interface UpdateConsumingDomainsOptions {\n  domains: string[];\n  alt_domains: AltDomains,\n  apiUserName: string;\n  apiKey: string;\n  apiToken: string;\n  parameters: UpdateConsumingDomainsParameters;\n}\n\n\n// Export the type definition for the function\nexport type UpdateConsumingDomainsType = (options: UpdateConsumingDomainsOptions) => Promise<void>;\n\n/**\n * Updates the consuming domains based on provided options.\n *\n * @param {UpdateConsumingDomainsOptions} options - Options for updating consuming domains.\n * @param {string[]} options.domains - The primary domains to be updated.\n * @param {AltDomains} options.alt_domains - The alternative consuming domains for participants.\n * @param {string} options.apiUserName - API username for domain updates.\n * @param {string} options.apiKey - API key for authorization.\n * @param {string} options.apiToken - API token for secure access.\n * @param {UpdateConsumingDomainsParameters} options.parameters - Additional parameters required for updating consuming domains.\n * \n * @returns {Promise<void>} Resolves when consuming domains have been successfully updated.\n * \n * @throws Logs an error if an issue occurs during the update process.\n * \n * @example\n * ```typescript\n * const options = {\n *   domains: [\"domain1.com\", \"domain2.com\"],\n *   alt_domains: { domainAlias: [\"altDomain1.com\"] },\n *   apiUserName: \"myApiUser\",\n *   apiKey: \"myApiKey\",\n *   apiToken: \"myApiToken\",\n *   parameters: {\n *     participants: [{ id: \"user1\", name: \"User 1\" }],\n *     consume_sockets: [{ id: \"socket1\", isConnected: true }],\n *     connectIps: async (options) => { console.log(\"Connecting IPs\", options); },\n *     getDomains: async (options) => { console.log(\"Getting Domains\", options); },\n *     getUpdatedAllParams: () => ({ consume_sockets: [{ id: \"socket1\", isConnected: true }] }),\n *   },\n * };\n * \n * await updateConsumingDomains(options);\n * ```\n */\n\nexport const updateConsumingDomains = async ({\n  domains,\n  alt_domains,\n  parameters,\n  apiUserName,\n  apiKey,\n  apiToken\n  }: UpdateConsumingDomainsOptions): Promise<void> => {\n  // Destructure necessary variables from parameters\n  let {\n    participants,\n    getDomains,\n    consume_sockets,\n\n    //mediasfu functions\n    connectIps,\n  } = parameters;\n\n  // Update consume_sockets with the latest value from getUpdatedAllParams\n  consume_sockets = parameters.getUpdatedAllParams().consume_sockets;\n\n  try {\n    // Check if participants array is not empty\n    if (participants.length > 0) {\n      // Check if alt_domains has keys and remove duplicates\n      if (Object.keys(alt_domains).length > 0) {\n        await getDomains({ domains, alt_domains, apiUserName, apiKey, apiToken , parameters });\n      } else {\n        await connectIps({\n          consume_sockets: consume_sockets,\n          remIP: domains,\n          parameters: parameters,\n          apiUserName: apiUserName,\n          apiKey: apiKey,\n          apiToken: apiToken,\n        });\n      }\n    }\n  } catch (error) {\n    console.log(\"Error in updateConsumingDomains: \", error);\n    // Optionally, throw the error if you want to handle it at a higher level\n    // throw new Error(\"Failed to update consuming domains.\");\n  }\n};\n","import type { Settings } from \"../../@types/types\";\n\nexport interface UpdateMediaSettingsOptions {\n  settings: Settings;\n  updateAudioSetting: (value: string) => void;\n  updateVideoSetting: (value: string) => void;\n  updateScreenshareSetting: (value: string) => void;\n  updateChatSetting: (value: string) => void;\n}\n\n\n// Export the type definition for the function\nexport type UpdateMediaSettingsType = (options: UpdateMediaSettingsOptions) => void;\n\n/**\n * Updates media settings by calling the respective update functions for each setting type.\n *\n * @param {UpdateMediaSettingsOptions} options - The options for updating media settings.\n * @param {Settings} options.settings - The settings array containing values for audio, video, screenshare, and chat.\n * @param {Function} options.updateAudioSetting - Function to update the audio setting.\n * @param {Function} options.updateVideoSetting - Function to update the video setting.\n * @param {Function} options.updateScreenshareSetting - Function to update the screenshare setting.\n * @param {Function} options.updateChatSetting - Function to update the chat setting.\n *\n * @returns {void} Does not return a value, as it directly updates each setting via provided functions.\n *\n * @example\n * ```typescript\n * const options = {\n *   settings: [\"enabled\", \"enabled\", \"disabled\", \"enabled\"],\n *   updateAudioSetting: (value) => console.log(\"Audio setting:\", value),\n *   updateVideoSetting: (value) => console.log(\"Video setting:\", value),\n *   updateScreenshareSetting: (value) => console.log(\"Screenshare setting:\", value),\n *   updateChatSetting: (value) => console.log(\"Chat setting:\", value),\n * };\n *\n * updateMediaSettings(options);\n * // Logs:\n * // \"Audio setting: enabled\"\n * // \"Video setting: enabled\"\n * // \"Screenshare setting: disabled\"\n * // \"Chat setting: enabled\"\n * ```\n */\n\nexport const updateMediaSettings = ({\n  settings,\n  updateAudioSetting,\n  updateVideoSetting,\n  updateScreenshareSetting,\n  updateChatSetting,\n}: UpdateMediaSettingsOptions): void => {\n\n  const [audioSetting, videoSetting, screenshareSetting, chatSetting] = settings;\n\n  // Update audio setting\n  updateAudioSetting(audioSetting);\n  // Update video setting\n  updateVideoSetting(videoSetting);\n  // Update screenshare setting\n  updateScreenshareSetting(screenshareSetting);\n  // Update chat setting\n  updateChatSetting(chatSetting);\n};\n","import type { CoHostResponsibility, EventType, ShowAlert } from \"../../@types/types\";\n\nexport interface UpdatedCoHostOptions {\n  coHost: string;\n  coHostResponsibility: CoHostResponsibility[];\n  showAlert?: ShowAlert;\n  eventType: EventType;\n  islevel: string;\n  member: string;\n  youAreCoHost: boolean;\n  updateCoHost: (coHost: string) => void;\n  updateCoHostResponsibility: (responsibility: CoHostResponsibility[]) => void;\n  updateYouAreCoHost: (youAreCoHost: boolean) => void;\n}\n\n// Export the type definition for the function\nexport type UpdatedCoHostType = (options: UpdatedCoHostOptions) => Promise<void>;\n\n/**\n * Updates co-host information and responsibilities based on provided options.\n *\n * @param {UpdatedCoHostOptions} options - Options for updating co-host status and responsibilities.\n * @param {string} options.coHost - The identifier of the new co-host.\n * @param {CoHostResponsibility[]} options.coHostResponsibility - Array of co-host responsibilities.\n * @param {ShowAlert} [options.showAlert] - Optional function to display alert messages.\n * @param {EventType} options.eventType - The event type (e.g., \"broadcast\", \"chat\").\n * @param {string} options.islevel - The event level.\n * @param {string} options.member - Identifier for the member.\n * @param {boolean} options.youAreCoHost - Boolean indicating if the current user is a co-host.\n * @param {Function} options.updateCoHost - Function to update the co-host identifier.\n * @param {Function} options.updateCoHostResponsibility - Function to update co-host responsibilities.\n * @param {Function} options.updateYouAreCoHost - Function to update the current user's co-host status.\n *\n * @returns {Promise<void>} Resolves when co-host information is updated.\n *\n * @example\n * const options = {\n *   coHost: \"user123\",\n *   coHostResponsibility: [{ task: \"moderate\", canEdit: true }],\n *   showAlert: (alert) => console.log(alert.message),\n *   eventType: \"conference\",\n *   islevel: \"1\",\n *   member: \"user123\",\n *   youAreCoHost: false,\n *   updateCoHost: (host) => console.log(\"Updated co-host:\", host),\n *   updateCoHostResponsibility: (resps) => console.log(\"Responsibilities:\", resps),\n *   updateYouAreCoHost: (status) => console.log(\"You are now co-host:\", status),\n * };\n *\n * await updatedCoHost(options);\n * // Logs:\n * // \"Updated co-host: user123\"\n * // \"Responsibilities: [{ task: 'moderate', canEdit: true }]\"\n * // \"You are now co-host: true\"\n * // \"You are now a co-host.\" (alert)\n */\n\nexport const updatedCoHost = async ({\n  coHost,\n  coHostResponsibility,\n  showAlert,\n  eventType,\n  islevel,\n  member,\n  youAreCoHost,\n  updateCoHost,\n  updateCoHostResponsibility,\n  updateYouAreCoHost,\n}: UpdatedCoHostOptions): Promise<void> => {\n\n  if (eventType !== \"broadcast\" && eventType !== \"chat\") {\n    // Only update the co-host if the event type is not broadcast or chat\n    updateCoHost(coHost);\n    updateCoHostResponsibility(coHostResponsibility);\n\n    if (member === coHost) {\n      if (!youAreCoHost) {\n        updateYouAreCoHost(true);\n\n        showAlert?.({\n          message: \"You are now a co-host.\",\n          type: \"success\",\n          duration: 3000,\n        });\n\n      }\n    } else {\n      updateYouAreCoHost(false);\n    }\n  } else {\n    if (islevel !== \"2\") {\n      updateYouAreCoHost(true);\n    }\n  }\n};\n","import type { ShowAlert } from \"../../@types/types\";\n\nexport interface UserWaitingOptions {\n  name: string;\n  showAlert?: ShowAlert;\n  totalReqWait: number;\n  updateTotalReqWait: (total: number) => void;\n}\n\n// Export the type definition for the function\nexport type UserWaitingType = (options: UserWaitingOptions) => Promise<void>;\n\n\n/**\n * Handles the event when a user joins the waiting room, displaying a notification and updating the count of waiting requests.\n *\n * @param {Object} options - The options for managing the user waiting event.\n * @param {string} options.name - The name of the user joining the waiting room.\n * @param {Function} [options.showAlert] - Optional function to display an alert/notification.\n * @param {number} options.totalReqWait - The current total count of requests waiting.\n * @param {Function} options.updateTotalReqWait - Function to update the total number of requests in the waiting room.\n * @returns {Promise<void>} A promise that resolves when the waiting event is fully handled.\n *\n * @example\n * ```typescript\n * const options = {\n *   name: \"John Doe\",\n *   showAlert: (alert) => console.log(alert.message),\n *   totalReqWait: 3,\n *   updateTotalReqWait: (total) => console.log(\"Updated total:\", total),\n * };\n * \n * userWaiting(options)\n *   .then(() => console.log(\"User waiting handled\"))\n *   .catch((error) => console.error(\"Error:\", error));\n * ```\n */\n\nexport const userWaiting = async ({ name, showAlert, totalReqWait, updateTotalReqWait }: UserWaitingOptions): Promise<void> => {\n\n  // Display an alert/notification about the user joining the waiting room\n  showAlert?.({\n    message: `${name} joined the waiting room.`,\n    type: \"success\",\n    duration: 3000,\n  });\n\n\n  // Update the total number of requests waiting in the waiting room\n  const totalReqs = totalReqWait + 1;\n  updateTotalReqWait(totalReqs);\n};\n","import { CreateJoinRoomError, CreateJoinRoomResponse, CreateJoinRoomType, CreateMediaSFURoomOptions, JoinMediaSFURoomOptions } from '../../@types/types';\n\n/**\n * Asynchronously creates a room on MediaSFU.\n *\n * This function sends a POST request to the MediaSFU API to create a new room. \n * It validates the provided credentials and constructs the appropriate API endpoint, \n * including support for the Community Edition via a custom `localLink`.\n *\n * @param {object} options - Configuration options for creating the room.\n * @param {CreateMediaSFURoomOptions} options.payload - The payload containing the room creation details.\n * @param {string} options.apiUserName - The API username, used for authentication.\n * @param {string} options.apiKey - The API key, used for authentication.\n * @param {string} [options.localLink=\"\"] - The local link for Community Edition users. If provided, it overrides the default API URL.\n * \n * @returns {Promise<{ \n*   data: CreateJoinRoomResponse | CreateJoinRoomError | null; \n*   success: boolean; \n* }>} A promise resolving to an object containing the API response:\n* - `data`: The response object, either `CreateJoinRoomResponse` or `CreateJoinRoomError`.\n* - `success`: Boolean indicating whether the operation was successful.\n*\n* @throws {Error} Throws an error if the request fails or if the provided credentials are invalid.\n*\n* @example\n* const response = await createRoomOnMediaSFU({\n*   payload: {\n*     action: 'create',\n*     duration: 60, // Duration in minutes\n*     capacity: 10, // Max participants\n*     userName: 'hostUser',\n*     scheduledDate: Date.now() + 3600000, // One hour from now\n*     secureCode: 'secure123', // Optional\n*     eventType: 'conference', // Optional\n*   },\n*   apiUserName: 'yourAPIUSERNAME',\n*   apiKey: 'yourAPIKEY',\n*   localLink: 'http://localhost:3000', // Optional for Community Edition\n* });\n*\n* if (response.success) {\n*   console.log('Room created successfully:', response.data);\n* } else {\n*   console.error('Failed to create room:', response.data?.error);\n* }\n*/\n\nexport const createRoomOnMediaSFU: CreateJoinRoomType = async ({\n    payload,\n    apiUserName,\n    apiKey,\n    localLink = '',\n}: {\n    payload: CreateMediaSFURoomOptions | JoinMediaSFURoomOptions;\n    apiUserName: string;\n    apiKey: string;\n    localLink?: string;\n}): Promise<{\n    data: CreateJoinRoomResponse | CreateJoinRoomError | null;\n    success: boolean;\n}> => {\n  // Create a unique key for this room creation request\n  const roomIdentifier = payload.action === 'create' \n    ? `create_${(payload as CreateMediaSFURoomOptions).userName}_${(payload as CreateMediaSFURoomOptions).duration}_${(payload as CreateMediaSFURoomOptions).capacity}`\n    : `join_${(payload as JoinMediaSFURoomOptions).meetingID}_${payload.userName}`;\n  \n  const pendingKey = `mediasfu_pending_${roomIdentifier}`;\n  const PENDING_TIMEOUT = 30 * 1000; // 30 seconds\n\n  try {\n        // Check if there's already a pending request for this room\n        const pendingRequest = localStorage.getItem(pendingKey);\n        if (pendingRequest) {\n        const pendingData = JSON.parse(pendingRequest);\n        const timeSincePending = Date.now() - pendingData.timestamp;\n        \n        if (timeSincePending < PENDING_TIMEOUT) {\n            return {\n            data: { error: \"Room creation already in progress\" },\n            success: false,\n            };\n        } else {\n            // Timeout exceeded, clear stale pending request\n            localStorage.removeItem(pendingKey);\n        }\n        }\n\n        if (\n            !apiUserName ||\n            !apiKey ||\n            apiUserName === 'yourAPIUSERNAME' ||\n            apiKey === 'yourAPIKEY' ||\n            apiKey.length !== 64 ||\n            apiUserName.length < 6\n        ) {\n            return { data: { error: 'Invalid credentials' }, success: false };\n        }\n\n        let finalLink = 'https://mediasfu.com/v1/rooms/';\n        if (localLink && localLink.trim() !== '' && !localLink.includes('mediasfu.com')) {\n            localLink = localLink.replace(/\\/$/, '');\n            finalLink = localLink + '/createRoom';\n        }\n\n\n    // Mark request as pending\n    localStorage.setItem(pendingKey, JSON.stringify({\n      timestamp: Date.now(),\n      payload: {\n        action: payload.action,\n        userName: payload.userName,\n        meetingID: (payload as any).meetingID || 'create'\n      }\n    }));\n\n    // Set timeout to clear pending status\n    setTimeout(() => {\n      try {\n        localStorage.removeItem(pendingKey);\n      } catch (error) {\n        // Ignore localStorage errors\n      }\n    }, PENDING_TIMEOUT);\n\n    const response = await fetch(finalLink,\n        {\n            method: 'POST',\n            headers: {\n                'Content-Type': 'application/json',\n                Authorization: `Bearer ${apiUserName}:${apiKey}`,\n            },\n            body: JSON.stringify(payload),\n        }\n    );\n\n        if (!response.ok) {\n            throw new Error(`HTTP error! Status: ${response.status}`);\n        }\n\n    const data: CreateJoinRoomResponse = await response.json();\n    \n    // Clear pending status on success\n    localStorage.removeItem(pendingKey);\n    \n    return { data, success: true };\n  } catch (error) {\n    // Clear pending status on error\n    try {\n      localStorage.removeItem(pendingKey);\n    } catch (e) {\n      // Ignore localStorage errors\n    }\n    \n        const errorMessage = (error as Error).message || 'unknown error';\n        return {\n            data: { error: `Unable to create room, ${errorMessage}` },\n            success: false,\n        };\n    }\n};\n\n\n\n","import React, { useState, useEffect } from \"react\";\n// import { Scanner } from \"@yudiel/react-qr-scanner\";\nimport Cookies from \"universal-cookie\";\nimport { CSSProperties } from \"react\";\nimport { Socket } from \"socket.io-client\";\nimport { ConnectSocketType } from \"../../sockets/SocketManager\";\nimport { ShowAlert } from \"../../@types/types\";\n\nconst cookies = new Cookies();\nconst MAX_ATTEMPTS = 10; // Maximum number of unsuccessful attempts before rate limiting\nconst RATE_LIMIT_DURATION = 3 * 60 * 60 * 1000; // 3 hours in milliseconds\n\n// Define the type for the parameters prop\nexport interface WelcomePageParameters {\n  imgSrc?: string;\n  showAlert?: ShowAlert;\n  updateIsLoadingModalVisible: (visible: boolean) => void;\n  connectSocket: ConnectSocketType;\n  updateSocket: (socket: Socket) => void;\n  updateValidated: (validated: boolean) => void;\n  updateApiUserName: (apiUserName: string) => void;\n  updateApiToken: (apiToken: string) => void;\n  updateLink: (link: string) => void;\n  updateRoomName: (roomName: string) => void;\n  updateMember: (userName: string) => void;\n}\n\n// Define the prop type for the component\nexport interface WelcomePageOptions {\n  parameters: WelcomePageParameters;\n}\n\nexport type WelcomePageType = (options: WelcomePageOptions) => React.JSX.Element;\n\n/**\n * WelcomePage component allows users to enter event details manually or by scanning a QR code.\n * It validates the input and attempts to connect to a socket with the provided credentials.\n *\n * @component\n * @param {WelcomePageOptions} parameters - The parameters for the WelcomePage component.\n * @param {Function} parameters.showAlert - Function to show alert messages.\n * @param {Function} parameters.updateIsLoadingModalVisible - Function to update loading modal visibility.\n * @param {Function} parameters.connectSocket - Function to connect to a socket.\n * @param {Function} parameters.updateSocket - Function to update the socket state.\n * @param {Function} parameters.updateValidated - Function to update validation state.\n * @param {Function} parameters.updateApiUserName - Function to update API username.\n * @param {Function} parameters.updateApiToken - Function to update API token.\n * @param {Function} parameters.updateLink - Function to update the event link.\n * @param {Function} parameters.updateRoomName - Function to update the room name.\n * @param {Function} parameters.updateMember - Function to update the member name.\n *\n * @returns {React.JSX.Element} The rendered WelcomePage component.\n * \n * @example\n * ```tsx\n * import React from 'react';\n * import { WelcomePage } from 'mediasfu-reactjs';\n * \n * const parameters = {\n *   showAlert: (message) => console.log(message),\n *   updateIsLoadingModalVisible: (visible) => console.log(visible),\n *   connectSocket: (socket) => console.log(socket),\n *   updateSocket: (socket) => console.log(socket),\n *   updateValidated: (validated) => console.log(validated),\n *   updateApiUserName: (apiUserName) => console.log(apiUserName),\n *   updateApiToken: (apiToken) => console.log(apiToken),\n *   updateLink: (link) => console.log(link),\n *   updateRoomName: (roomName) => console.log(roomName),\n *   updateMember: (userName) => console.log(userName),\n * };\n * \n * <WelcomePage parameters={parameters} />\n * ```\n */\n\n\nconst WelcomePage: React.FC<WelcomePageOptions> = ({ parameters }) => {\n  const [name, setName] = useState<string>(\"\");\n  const [secret, setSecret] = useState<string>(\"\");\n  const [eventID, setEventID] = useState<string>(\"\");\n  const [link, setLink] = useState<string>(\"\");\n  const [, setScannerVisible] = useState<boolean>(false);\n  const [scannedData] = useState<any>(null);\n\n  const {\n    showAlert,\n    updateIsLoadingModalVisible,\n    connectSocket,\n    updateSocket,\n    updateValidated,\n    updateApiUserName,\n    updateApiToken,\n    updateLink,\n    updateRoomName,\n    updateMember,\n  } = parameters;\n\n  const checkLimitsAndMakeRequest = async ({\n    apiUserName,\n    apiToken,\n    link,\n    apiKey = \"\",\n    userName,\n  }: {\n    apiUserName: string;\n    apiToken: string;\n    link: string;\n    apiKey?: string;\n    userName: string;\n  }) => {\n    const TIMEOUT_DURATION = 10000; // 10 seconds\n\n    let unsuccessfulAttempts = parseInt(\n      cookies.get(\"unsuccessfulAttempts\") || \"0\"\n    );\n    let lastRequestTimestamp = parseInt(\n      cookies.get(\"lastRequestTimestamp\") || \"0\"\n    );\n\n    if (unsuccessfulAttempts >= MAX_ATTEMPTS) {\n      if (Date.now() - lastRequestTimestamp < RATE_LIMIT_DURATION) {\n        showAlert?.({\n          message: \"Too many unsuccessful attempts. Please try again later.\",\n          type: \"danger\",\n          duration: 3000,\n        });\n        cookies.set(\"lastRequestTimestamp\", Date.now().toString());\n        return;\n      } else {\n        unsuccessfulAttempts = 0;\n        cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n        cookies.set(\"lastRequestTimestamp\", Date.now().toString());\n      }\n    }\n\n    try {\n      updateIsLoadingModalVisible(true);\n\n      const socketPromise = connectSocket({\n        apiUserName,\n        apiKey,\n        apiToken,\n        link,\n      });\n      const timeoutPromise = new Promise<never>((_, reject) =>\n        setTimeout(\n          () => reject(new Error(\"Request timed out\")),\n          TIMEOUT_DURATION\n        )\n      );\n\n      const socket = await Promise.race([socketPromise, timeoutPromise]);\n\n      if (socket && socket instanceof Socket && socket.id) {\n        unsuccessfulAttempts = 0;\n        cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n        cookies.set(\"lastRequestTimestamp\", Date.now().toString());\n        updateSocket(socket);\n        updateApiUserName(apiUserName);\n        updateApiToken(apiToken);\n        updateLink(link);\n        updateRoomName(apiUserName);\n        updateMember(userName);\n        updateValidated(true);\n      } else {\n        unsuccessfulAttempts += 1;\n        cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n        cookies.set(\"lastRequestTimestamp\", Date.now().toString());\n        updateIsLoadingModalVisible(false);\n\n        if (unsuccessfulAttempts >= MAX_ATTEMPTS) {\n          showAlert?.({\n            message: \"Too many unsuccessful attempts. Please try again later.\",\n            type: \"danger\",\n            duration: 3000,\n          });\n        } else {\n          showAlert?.({\n            message: \"Invalid credentials.\",\n            type: \"danger\",\n            duration: 3000,\n          });\n        }\n      }\n    } catch {\n      showAlert?.({\n        message: \"Unable to connect. Check your credentials and try again.\",\n        type: \"danger\",\n        duration: 3000,\n      });\n\n      unsuccessfulAttempts += 1;\n      cookies.set(\"unsuccessfulAttempts\", unsuccessfulAttempts.toString());\n      cookies.set(\"lastRequestTimestamp\", Date.now().toString());\n      updateIsLoadingModalVisible(false);\n    }\n  };\n\n  useEffect(() => {\n    // Handle scanned data\n    try {\n      if (scannedData && scannedData.length > 0) {\n        // Implement logic to process scanned data\n        const data = scannedData[0].rawValue.trim();\n        // Extracting parts based on semicolon delimiter\n        const parts = data.split(\";\");\n        let userName: string,\n          link_: string,\n          userSecret: string,\n          passWord: string,\n          meetingID: string;\n\n        if (parts.length === 5) {\n          [userName, link_, userSecret, passWord, meetingID] = parts;\n\n          // Implement logic to check if the data is valid\n          if (\n            userName.length === 0 ||\n            link_.length === 0 ||\n            userSecret.length === 0 ||\n            passWord.length === 0 ||\n            meetingID.length === 0\n          ) {\n            showAlert?.({\n              message: \"Invalid scanned data.\",\n              type: \"danger\",\n              duration: 3000,\n            });\n          }\n\n          if (\n            !validateAlphanumeric(userName) ||\n            !validateAlphanumeric(userSecret) ||\n            !validateAlphanumeric(passWord) ||\n            !validateAlphanumeric(meetingID)\n          ) {\n            showAlert?.({\n              message: \"Invalid scanned data.\",\n              type: \"danger\",\n              duration: 3000,\n            });\n          }\n\n          if (\n            userSecret.length != 64 ||\n            userName.length > 12 ||\n            userName.length < 2 ||\n            meetingID.length > 32 ||\n            meetingID.length < 8 ||\n            !link_.includes(\"mediasfu.com\") ||\n            eventID.toLowerCase().startsWith(\"d\")\n          ) {\n            showAlert?.({\n              message: \"Invalid scanned data.\",\n              type: \"danger\",\n              duration: 3000,\n            });\n          }\n\n          // Further processing logic if needed\n        } else {\n          // Handle the case where the scanned data doesn't have the expected format\n          showAlert?.({\n            message: \"Invalid scanned data.\",\n            type: \"danger\",\n            duration: 3000,\n          });\n        }\n\n        setName(userName!);\n\n        setScannerVisible(false);\n\n        async function makeRequest() {\n          await checkLimitsAndMakeRequest({\n            apiUserName: meetingID,\n            apiToken: userSecret,\n            link: link_,\n            userName: userName,\n          });\n        }\n\n        makeRequest();\n      }\n    } catch {\n      showAlert?.({\n        message: \"Invalid scanned data.\",\n        type: \"danger\",\n        duration: 3000,\n      });\n    }\n  }, [scannedData]);\n\n  const validateAlphanumeric = (str: string): boolean => {\n    if (str.length === 0) return true; // Allow empty string (for secret)\n    const alphanumericRegex = /^[a-zA-Z0-9]+$/;\n    return alphanumericRegex.test(str);\n  };\n\n  const handleNameChange = (text: string) => {\n    if (text.length <= 12 && validateAlphanumeric(text)) {\n      setName(text);\n    }\n  };\n\n  const handleSecretChange = (text: string) => {\n    if (text.length <= 64 && validateAlphanumeric(text)) {\n      setSecret(text);\n    }\n  };\n\n  const handleEventIDChange = (text: string) => {\n    if (text.length <= 32 && validateAlphanumeric(text)) {\n      setEventID(text);\n    }\n  };\n\n  const handleConfirm = async () => {\n    updateIsLoadingModalVisible(true);\n\n    if (\n      name.length === 0 ||\n      secret.length === 0 ||\n      eventID.length === 0 ||\n      link.length === 0\n    ) {\n      showAlert?.({\n        message: \"Please fill all the fields.\",\n        type: \"danger\",\n        duration: 3000,\n      });\n\n      updateIsLoadingModalVisible(false);\n      return;\n    }\n\n    if (\n      !validateAlphanumeric(name) ||\n      !validateAlphanumeric(secret) ||\n      !validateAlphanumeric(eventID) ||\n      !link.includes(\"mediasfu.com\") ||\n      eventID.toLowerCase().startsWith(\"d\")\n    ) {\n      showAlert?.({\n        message: \"Please enter valid details.\",\n        type: \"danger\",\n        duration: 3000,\n      });\n\n      updateIsLoadingModalVisible(false);\n      return;\n    }\n\n    if (\n      secret.length != 64 ||\n      name.length > 12 ||\n      name.length < 2 ||\n      eventID.length > 32 ||\n      eventID.length < 8 ||\n      link.length < 12\n    ) {\n      showAlert?.({\n        message: \"Please enter valid details.\",\n        type: \"danger\",\n        duration: 3000,\n      });\n\n      updateIsLoadingModalVisible(false);\n      return;\n    }\n\n    await checkLimitsAndMakeRequest({\n      apiUserName: eventID,\n      apiToken: secret,\n      link: link,\n      userName: name,\n    });\n    updateIsLoadingModalVisible(false);\n  };\n\n  return (\n    <div style={styles.container}>\n      <div style={styles.logoContainer}>\n        <img\n          src={parameters.imgSrc || \"https://mediasfu.com/images/logo192.png\"}\n          style={styles.logoImage}\n          alt=\"Logo\"\n        />\n      </div>\n      <div style={styles.inputContainer}>\n        <input\n          type=\"text\"\n          placeholder=\"Event Display Name\"\n          value={name ? name : \"\"}\n          onChange={(e) => handleNameChange(e.target.value)}\n          style={styles.inputField}\n        />\n        <input\n          type=\"text\"\n          placeholder=\"Event Token (Secret)\"\n          value={secret ? secret : \"\"}\n          onChange={(e) => handleSecretChange(e.target.value)}\n          style={styles.inputField}\n        />\n        <input\n          type=\"text\"\n          placeholder=\"Event ID\"\n          value={eventID ? eventID : \"\"}\n          onChange={(e) => handleEventIDChange(e.target.value)}\n          style={styles.inputField}\n        />\n        <input\n          type=\"text\"\n          placeholder=\"Event Link\"\n          value={link ? link : \"\"}\n          onChange={(e) => setLink(e.target.value)}\n          style={styles.inputField}\n        />\n      </div>\n      <button onClick={handleConfirm} style={styles.confirmButton}>\n        Confirm\n      </button>\n\n      {/* <div style={styles.scannerContainer}>\n        <div style={styles.orContainer}>\n          <hr style={styles.horizontalLine} />\n          <span style={styles.orText}>OR</span>\n          <hr style={styles.horizontalLine} />\n        </div>\n        {isScannerVisible && (\n          <div style={styles.scanButtonContainer}>\n          <Scanner\n            onScan={(data) => setScannedData(data)}\n            onError={(error) => console.log(error)}\n            styles={{ container: { width: \"300px\", height: \"300px\" } }}\n          />\n          </div>\n        )}\n        {!isScannerVisible && (\n          <div style={styles.scanButtonContainer}>\n            <button\n              onClick={() => setScannerVisible(true)}\n              style={styles.scanButton}\n            >\n              <FontAwesomeIcon icon={faQrcode} style={{ marginRight: \"5px\" }} />\n              Scan QR Code\n            </button>\n          </div>\n        )}\n      </div> */}\n\n      <div style={styles.additionalOptionsContainer}>\n        <p>\n          Provide the event details either by typing manually or scanning the\n          QR-code to autofill.\n        </p>\n        <p>Do not have a secret?</p>\n        <a\n          href=\"https://meeting.mediasfu.com/meeting/start/\"\n          target=\"_blank\"\n          rel=\"noreferrer\"\n          style={styles.link}\n        >\n          Get one from mediasfu.com\n        </a>\n      </div>\n    </div>\n  );\n};\n\nconst styles: { [key: string]: CSSProperties } = {\n  container: {\n    display: \"flex\",\n    flexDirection: \"column\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    height: \"100vh\",\n    width: \"100vw\",\n    backgroundColor: \"#53C6E0\",\n    overflow: \"auto\",\n  },\n  logoContainer: {\n    marginTop: \"30px\",\n    paddingTop: \"10px\",\n    marginBottom: \"10px\",\n  },\n  logoImage: {\n    width: \"100px\",\n    height: \"100px\",\n    borderRadius: \"50%\",\n  },\n  inputContainer: {\n    marginBottom: \"10px\",\n    flexDirection: \"column\",\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n  },\n  inputField: {\n    height: \"30px\",\n    borderColor: \"gray\",\n    borderWidth: \"1px\",\n    marginBottom: \"10px\",\n    padding: \"0 5px\",\n    borderRadius: \"5px\",\n  },\n  confirmButton: {\n    backgroundColor: \"black\",\n    color: \"white\",\n    padding: \"5px 5px\",\n    borderRadius: \"5px\",\n    marginBottom: \"10px\",\n  },\n  scannerContainer: {\n    marginBottom: \"10px\",\n    width: \"100%\",\n    justifyContent: \"center\",\n    alignItems: \"center\",\n    justifySelf: \"center\",\n    justifyItems: \"center\",\n  },\n  additionalOptionsContainer: {\n    textAlign: \"center\",\n  },\n  link: {\n    color: \"blue\",\n    textDecoration: \"none\",\n    fontWeight: \"bold\",\n    marginLeft: \"5px\",\n  },\n  scanButton: {\n    backgroundColor: \"black\",\n    color: \"white\",\n    padding: \"10px 20px\",\n    borderRadius: \"5px\",\n    marginBottom: \"20px\",\n  },\n  scanButtonContainer: {\n    display: \"flex\",\n    justifyContent: \"center\",\n    alignItems: \"center\",\n  },\n\n  orContainer: {\n    display: \"flex\",\n    alignItems: \"center\",\n    justifyContent: \"center\",\n    margin: \"10px 0\",\n  },\n  horizontalLine: {\n    width: \"40%\",\n    margin: \"0 10px\",\n  },\n  orText: {\n    color: \"black\",\n    fontSize: \"medium\",\n    fontWeight: \"bold\",\n  },\n};\n\nexport default WelcomePage;\n"," \nimport { Socket } from \"socket.io-client\";\nimport { CoHostResponsibility, Participant, ShowAlert } from \"../@types/types\";\n\nexport interface ControlMediaOptions {\n  participantId: string;\n  participantName: string;\n  type: 'audio' | 'video' | 'screenshare' | 'all';\n  socket: Socket;\n  coHostResponsibility: CoHostResponsibility[];\n  participants: Participant[];\n  member: string;\n  islevel: string;\n  showAlert?: ShowAlert;\n  coHost: string;\n  roomName: string;\n}\n// Export the type definition for the function\nexport type ControlMediaType = (options: ControlMediaOptions) => Promise<void>;\n\n/**\n * Controls the media of a participant in a media session if certain conditions are met.\n *\n * @param {ControlMediaOptions} options - The options for controlling media.\n * @param {string} options.participantId - The ID of the participant to control.\n * @param {string} options.participantName - The name of the participant to control.\n * @param {'audio' | 'video' | 'screenshare' | 'all'} options.type - The type of media to control.\n * @param {Socket} options.socket - The socket instance for communication.\n * @param {Array<CoHostResponsibility>} options.coHostResponsibility - List of co-host responsibilities.\n * @param {Array<Participant>} options.participants - List of participants in the session.\n * @param {string} options.member - The current member attempting to control media.\n * @param {string} options.islevel - The level of the current member.\n * @param {Function} [options.showAlert] - Optional function to show alerts.\n * @param {string} options.coHost - The co-host information.\n * @param {string} options.roomName - The name of the room.\n *\n * @returns {Promise<void>} A promise that resolves when the media control operation is complete.\n *\n * @throws Will log an error message if there are issues controlling the media or if participant is not found.\n *\n * @example\n * const options = {\n *   participantId: '1234',\n *   participantName: 'John Doe',\n *   type: 'audio',\n *   socket: socketInstance,\n *   coHostResponsibility: [{ name: 'media', value: true }],\n *   participants: participantList,\n *   member: 'Admin',\n *   islevel: '1',\n *   showAlert: (alert) => console.log(alert.message),\n *   coHost: 'CoHostName',\n *   roomName: 'Room 1',\n * };\n * \n * controlMedia(options)\n *   .then(() => {\n *     console.log('Media control operation completed successfully.');\n *   })\n *   .catch((error) => {\n *     console.error('Error controlling media:', error);\n *   });\n */\n\nexport async function controlMedia({\n  participantId,\n  participantName,\n  type,\n  socket,\n  coHostResponsibility,\n  participants,\n  member,\n  islevel,\n  showAlert,\n  coHost,\n  roomName,\n}: ControlMediaOptions): Promise<void> {\n  try {\n    let mediaValue = false;\n\n    try {\n      mediaValue = coHostResponsibility.find((item) => item.name === \"media\")?.value ?? false;\n    } catch (error) {\n      console.log(\"Error retrieving media control value\", error);\n    }\n\n    const participant = participants.find((obj) => obj.name === participantName);\n\n    if (!participant) {\n      console.log(\"Participant not found\");\n      return;\n    }\n\n    if (islevel === \"2\" || (coHost === member && mediaValue === true)) {\n      if (\n        (!participant.muted && participant.islevel !== \"2\" && type === \"audio\") ||\n        (participant.islevel !== \"2\" && type === \"video\" && participant.videoOn)\n      ) {\n        socket.emit(\"controlMedia\", {\n          participantId,\n          participantName,\n          type,\n          roomName,\n        });\n      }\n    } else {\n      if (showAlert) {\n        showAlert({\n          message: \"You are not allowed to control media for other participants.\",\n          type: \"danger\",\n          duration: 3000,\n        });\n      }\n    }\n  } catch (error) {\n    console.log(\"controlMedia error\", error);\n  }\n}\n","<!--\n/**\n * @fileoverview CardVideoDisplay - Video element wrapper for participant video streams\n * @component CardVideoDisplay\n * @module components/displayComponents/CardVideoDisplay\n * \n * @description\n * A low-level video element wrapper that displays a participant's remote video stream.\n * Handles video element lifecycle, stream attachment, and responsive sizing based on\n * event type and display mode. Used internally by VideoCard and other video display\n * components to render the actual video element with proper object-fit behavior.\n * \n * Features:\n * - Automatic MediaStream attachment to video element\n * - Two display modes: forceFullDisplay (cover) or normal (contain)\n * - Event type-aware sizing (conference/webinar vs broadcast)\n * - Optional video mirroring for local streams\n * - Custom background color support\n * - Full HTML attribute passthrough for container and video element\n * - Automatic cleanup on unmount\n * \n * Display Modes:\n * - **forceFullDisplay: true** - Video fills entire container using object-fit: cover (cropped)\n * - **forceFullDisplay: false** - Video fits within container using object-fit: contain (letterboxed)\n * \n * Event Type Behavior:\n * - **broadcast**: Forces max-width: 100% for full-width display\n * - **conference/webinar**: Natural video sizing based on aspect ratio\n * \n * @example Basic Video Display\n * // <CardVideoDisplay\n *   // remoteProducerId=\"producer-123\"\n *   // eventType=\"conference\"\n *   // :forceFullDisplay=\"false\"\n *   // :videoStream=\"participantStream\"\n * // />\n * \n * @example Full Display Mode (Cover)\n * // <CardVideoDisplay\n *   // remoteProducerId=\"producer-456\"\n *   // eventType=\"webinar\"\n *   // :forceFullDisplay=\"true\"\n *   // :videoStream=\"stream\"\n *   // backgroundColor=\"rgba(0,0,0,0.9)\"\n * // />\n * \n * @example Mirrored Local Stream\n * // <CardVideoDisplay\n *   // remoteProducerId=\"local\"\n *   // eventType=\"conference\"\n *   // :forceFullDisplay=\"false\"\n *   // :videoStream=\"localVideoStream\"\n *   // :doMirror=\"true\"\n * // />\n * \n * @example Custom Container Styling\n * // <CardVideoDisplay\n *   // remoteProducerId=\"producer-789\"\n *   // eventType=\"broadcast\"\n *   // :forceFullDisplay=\"true\"\n *   // :videoStream=\"screenShareStream\"\n *   // :containerProps=\"{ class: 'screen-share-video', style: { border: '2px solid #22c55e' } }\"\n *   // :videoProps=\"{ class: 'broadcast-video' }\"\n * // />\n * \n * @remarks\n * This is a low-level component used primarily by VideoCard. Most applications\n * should use VideoCard or MiniCard instead which provide additional participant\n * information overlays and controls.\n * \n * Workflow:\n * 1. Component mounts → references video element\n * 2. videoStream provided → calls attachStream() to set video.srcObject\n * 3. Video plays automatically (autoplay, muted, playsinline attributes)\n * 4. Responsive sizing based on forceFullDisplay and eventType\n * 5. Stream changes → detaches old stream, attaches new stream\n * 6. Component unmounts → detaches stream for cleanup\n * \n * @see {@link VideoCard} - Higher-level video card with overlays and controls\n * @see {@link MiniCard} - Compact video card for gallery view\n */\n-->\n<template>\n  <div\n    v-bind=\"containerRestAttrs\"\n    :class=\"containerClassNames\"\n    :style=\"containerMergedStyle\"\n  >\n    <video\n      ref=\"videoRef\"\n      autoplay\n      muted\n      playsinline\n      v-bind=\"videoRestAttrs\"\n      :class=\"videoClassNames\"\n      :style=\"videoMergedStyle\"\n    />\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  ref,\n  computed,\n  watch,\n  onMounted,\n  onBeforeUnmount,\n  type CSSProperties,\n  type HTMLAttributes,\n  type VideoHTMLAttributes,\n} from 'vue';\nimport type { EventType } from '../../../../SharedTypes';\n\n/**\n * Props for the CardVideoDisplay component\n * @interface CardVideoDisplayProps\n * \n * @property {string} remoteProducerId - Unique identifier for the video producer\n * @property {EventType} eventType - Event type ('conference' | 'webinar' | 'broadcast' | 'chat')\n * @property {boolean} forceFullDisplay - If true, video covers container (object-fit: cover); if false, video fits container (object-fit: contain)\n * @property {MediaStream | null} videoStream - MediaStream to display in the video element\n * @property {string} [backgroundColor='transparent'] - Background color for the container\n * @property {boolean} [doMirror=false] - If true, applies horizontal flip to video (for local streams)\n * @property {HTMLAttributes} [containerProps] - Additional HTML attributes for the container div\n * @property {VideoHTMLAttributes} [videoProps] - Additional HTML attributes for the video element\n * \n * @default backgroundColor - 'transparent'\n * @default doMirror - false\n * @default containerProps - {}\n * @default videoProps - {}\n * \n * @example\n * ```typescript\n * // <CardVideoDisplay\n *   // remoteProducerId=\"producer-abc\"\n *   // eventType=\"conference\"\n *   // :forceFullDisplay=\"true\"\n *   // :videoStream=\"stream\"\n *   // backgroundColor=\"#1a1a1a\"\n *   // :doMirror=\"true\"\n *   // :containerProps=\"{ class: 'video-wrapper' }\"\n *   // :videoProps=\"{ class: 'video-element' }\"\n * // />\n * ```\n */\nexport interface CardVideoDisplayProps {\n  remoteProducerId: string;\n  eventType: EventType;\n  forceFullDisplay: boolean;\n  videoStream: MediaStream | null;\n  backgroundColor?: string;\n  doMirror?: boolean;\n  containerProps?: HTMLAttributes;\n  videoProps?: VideoHTMLAttributes;\n}\n\nconst props = withDefaults(defineProps<CardVideoDisplayProps>(), {\n  backgroundColor: 'transparent',\n  doMirror: false,\n  containerProps: () => ({}),\n  videoProps: () => ({}),\n});\n\nconst videoRef = ref<HTMLVideoElement | null>(null);\n\nconst setVideoStream = (stream: MediaStream | null | undefined) => {\n  const element = videoRef.value;\n  if (!(element instanceof HTMLVideoElement)) {\n    return;\n  }\n\n  if (!stream) {\n    element.srcObject = null;\n    return;\n  }\n\n  if (typeof MediaStream !== 'undefined' && !(stream instanceof MediaStream)) {\n    element.srcObject = null;\n    return;\n  }\n\n  element.srcObject = stream;\n\n  if (stream instanceof MediaStream) {\n    const playPromise = element.play?.();\n    if (playPromise instanceof Promise) {\n      playPromise.catch(() => {\n        /* Suppress autoplay rejections */\n      });\n    }\n  }\n};\n\n// Watch videoStream changes and update srcObject\nwatch(\n  () => props.videoStream,\n  (newStream) => {\n    setVideoStream(newStream ?? null);\n  },\n  { immediate: true, flush: 'post' }\n);\n\nonMounted(() => {\n  setVideoStream(props.videoStream ?? null);\n});\n\nonBeforeUnmount(() => {\n  const element = videoRef.value;\n  if (element instanceof HTMLVideoElement) {\n    element.srcObject = null;\n  }\n});\n\nconst videoBaseStyle = computed<CSSProperties>(() => {\n  const baseStyles: CSSProperties = {\n    width: props.forceFullDisplay ? '100%' : 'auto',\n    height: '100%',\n    objectFit: props.forceFullDisplay ? 'cover' : 'contain',\n    backgroundColor: props.backgroundColor,\n    maxHeight: '100%',\n    maxWidth: '100%',\n  };\n\n  if (props.doMirror) {\n    baseStyles.transform = 'rotateY(180deg)';\n  }\n\n  return baseStyles;\n});\n\nconst videoRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.videoProps ?? {};\n  return rest;\n});\n\nconst videoClassNames = computed(() => [\n  props.videoProps?.class,\n]);\n\nconst videoMergedStyle = computed(() => ({\n  ...videoBaseStyle.value,\n  ...(props.videoProps?.style as CSSProperties | undefined),\n}));\n\nconst videoContainerStyle: CSSProperties = {\n  display: 'flex',\n  justifyContent: 'center',\n  alignItems: 'center',\n  backgroundColor: 'black',\n  width: '100%',\n  height: '100%',\n};\n\nconst containerRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.containerProps ?? {};\n  return rest;\n});\n\nconst containerClassNames = computed(() => [\n  'mediasfu-card-video',\n  props.containerProps?.class,\n]);\n\nconst containerMergedStyle = computed(() => ({\n  ...videoContainerStyle,\n  ...(props.containerProps?.style as CSSProperties | undefined),\n  backgroundColor: props.backgroundColor,\n}));\n\n</script>\n","<!--\n/**\n * @fileoverview VideoCard Component - Video participant card with controls and waveform\n * @component VideoCard\n * @module components/displayComponents/VideoCard\n * \n * @description\n * A full-featured video participant card that displays a participant's video stream\n * with optional audio waveform visualization and control buttons (mute/unmute video/audio).\n * Used in the main grid view and spotlight layouts. Supports complete customization via\n * render props and can be fully replaced via `uiOverrides.videoCard`.\n * \n * Features:\n * - Live video stream display with mirror support\n * - Animated audio waveform visualization\n * - Control buttons for audio/video toggle (for hosts/co-hosts)\n * - Participant name overlay\n * - Custom component injection via slots\n * - Comprehensive styling and positioning control\n * \n * @example Basic Usage\n * // <VideoCard\n *   // name=\"John Doe\"\n *   // :remoteProducerId=\"producer.id\"\n *   // :videoStream=\"stream\"\n *   // :participant=\"participant\"\n *   // eventType=\"conference\"\n *   // :forceFullDisplay=\"false\"\n *   // :parameters=\"parameters\"\n * // />\n * \n * @example With Custom Styling\n * // <VideoCard\n *   // name=\"Jane Smith\"\n *   // :remoteProducerId=\"producer.id\"\n *   // :videoStream=\"stream\"\n *   // :participant=\"participant\"\n *   // eventType=\"webinar\"\n *   // :forceFullDisplay=\"true\"\n *   // :parameters=\"parameters\"\n *   // barColor=\"#22c55e\"\n *   // textColor=\"#fff\"\n *   // :customStyle=\"{ borderRadius: '12px', border: '2px solid #22c55e' }\"\n *   // controlsPosition=\"bottomRight\"\n *   // infoPosition=\"topLeft\"\n * // />\n * \n * @example With Custom Components\n * // <VideoCard\n *   // name=\"Alex Johnson\"\n *   // :remoteProducerId=\"producer.id\"\n *   // :videoStream=\"stream\"\n *   // :participant=\"participant\"\n *   // eventType=\"broadcast\"\n *   // :forceFullDisplay=\"false\"\n *   // :parameters=\"parameters\"\n *   // :videoInfoComponent=\"CustomInfoOverlay\"\n *   // :videoControlsComponent=\"CustomControlButtons\"\n * >\n *   <template #extra-widgets>\n *     <div class=\"custom-badge\">LIVE</div>\n *   </template>\n * // </VideoCard>\n * \n * @example Complete Replacement via UI Overrides\n * // In your App component (AppUnique.vue pattern)\n * const uiOverrides = computed(() => ({\n *   // videoCard: {\n *     component: {\n *       name: 'CustomVideoCard',\n *       props: ['name', 'participant', 'videoStream', 'remoteProducerId', 'barColor', 'textColor'],\n *       setup(props) {\n *         return () => h(VideoCard, {\n *           ...props,\n *           customStyle: {\n *             background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n *             borderRadius: '16px',\n *             boxShadow: '0 8px 32px rgba(0,0,0,0.2)'\n *           },\n *           barColor: '#a78bfa',\n *           controlsPosition: 'bottomLeft'\n *         });\n *       }\n *     }\n *   }\n * }));\n */\n-->\n<template>\n  <div\n    v-bind=\"containerRestAttrs\"\n    :class=\"containerClassNames\"\n    :style=\"containerMergedStyle\"\n  >\n    <slot name=\"extra-widgets\" />\n    <CardVideoDisplay\n      :remote-producer-id=\"remoteProducerId\"\n      :event-type=\"eventType\"\n      :force-full-display=\"forceFullDisplay\"\n      :video-stream=\"videoStream\"\n      :background-color=\"backgroundColor\"\n      :do-mirror=\"doMirror\"\n      v-bind=\"resolvedVideoDisplayProps\"\n    />\n\n    <component\n      :is=\"videoInfoComponent\"\n      v-if=\"videoInfoComponent\"\n    />\n    <div\n      v-else-if=\"showInfo\"\n      v-bind=\"infoOverlayRestAttrs\"\n      :class=\"infoOverlayClassNames\"\n      :style=\"infoOverlayStyle\"\n    >\n      <div :style=\"nameColumnStyle\">\n        <span :style=\"{ ...nameTextStyle, color: textColor }\">\n          {{ participant?.name }}\n        </span>\n      </div>\n      <div\n        v-if=\"showWaveformState\"\n        v-bind=\"waveformContainerRestAttrs\"\n        :class=\"waveformContainerClassNames\"\n        :style=\"waveformContainerStyle\"\n      >\n        <div\n          v-for=\"(animation, index) in waveformAnimations\"\n          :key=\"index\"\n          :style=\"{\n            ...waveformBarMergedStyle,\n            height: animation === 0 ? '1px' : '16px',\n            backgroundColor: barColor,\n          }\"\n          :class=\"waveformBarClassNames\"\n        />\n      </div>\n    </div>\n\n    <component\n      :is=\"videoControlsComponent\"\n      v-if=\"videoControlsComponent\"\n    />\n    <div\n      v-else-if=\"showControls\"\n      v-bind=\"controlsOverlayRestAttrs\"\n      :class=\"controlsOverlayClassNames\"\n      :style=\"controlsOverlayStyle\"\n    >\n      <div :style=\"overlayControlsStyle\">\n        <button\n          :style=\"controlButtonStyle\"\n          @click=\"toggleAudio\"\n        >\n          <font-awesome-icon\n            :icon=\"participant?.muted ? faMicrophoneSlash : faMicrophone\"\n            size=\"sm\"\n            :color=\"participant?.muted ? 'red' : 'green'\"\n          />\n        </button>\n        <button\n          :style=\"controlButtonStyle\"\n          @click=\"toggleVideo\"\n        >\n          <font-awesome-icon\n            :icon=\"participant?.videoOn ? faVideo : faVideoSlash\"\n            size=\"sm\"\n            :color=\"participant?.videoOn ? 'green' : 'red'\"\n          />\n        </button>\n      </div>\n    </div>\n\n    <slot />\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  computed,\n  ref,\n  watch,\n  onUnmounted,\n  type CSSProperties,\n  type Component,\n  type HTMLAttributes,\n} from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport {\n  faMicrophone,\n  faMicrophoneSlash,\n  faVideo,\n  faVideoSlash,\n} from '@fortawesome/free-solid-svg-icons';\nimport { controlMedia } from '@legacy/consumers/controlMedia';\nimport { getOverlayPosition } from '@legacy/methods/utils/getOverlayPosition';\nimport CardVideoDisplay, { type CardVideoDisplayProps } from './CardVideoDisplay.vue';\nimport type {\n  AudioDecibels,\n  CoHostResponsibility,\n  Participant,\n  ShowAlert,\n  EventType,\n} from '../../../../SharedTypes';\nimport type { Socket } from 'socket.io-client';\n\n/**\n * Parameters object for VideoCard control operations\n * @interface VideoCardParameters\n */\nexport interface VideoCardParameters {\n  /** Socket.io connection for real-time communication */\n  socket: Socket;\n  /** Name of the current room/session */\n  roomName: string;\n  /** Array of co-host responsibilities */\n  coHostResponsibility: CoHostResponsibility[];\n  /** Alert display function */\n  showAlert?: ShowAlert;\n  /** Co-host identifier */\n  coHost: string;\n  /** List of all participants in the session */\n  participants: Participant[];\n  /** Current user's identifier */\n  member: string;\n  /** User level ('0' = regular, '1' = admin, '2' = host) */\n  islevel: string;\n  /** Audio level data for all participants */\n  audioDecibels: AudioDecibels[];\n  /** Function to get the latest parameters */\n  getUpdatedAllParams: () => VideoCardParameters;\n  /** Additional dynamic parameters */\n  [key: string]: unknown;\n}\n\n/**\n * Props for the VideoCard component\n * @interface VideoCardProps\n */\nexport interface VideoCardProps {\n  /**\n   * Custom CSS styles for the card container\n   * @example { borderRadius: '12px', border: '2px solid #22c55e' }\n   */\n  customStyle?: CSSProperties;\n  \n  /**\n   * Participant's display name\n   * @example \"John Doe\"\n   */\n  name: string;\n  \n  /**\n   * Color of the audio waveform bars\n   * @default \"red\"\n   * @example \"#22c55e\"\n   */\n  barColor?: string;\n  \n  /**\n   * Color of the participant name text\n   * @default \"white\"\n   * @example \"#fff\"\n   */\n  textColor?: string;\n  \n  /**\n   * URL of participant's profile image (fallback for video-off)\n   * @example \"https://example.com/avatar.jpg\"\n   */\n  imageSource?: string;\n  \n  /**\n   * Whether to apply rounded styling to the image\n   * @default false\n   */\n  roundedImage?: boolean;\n  \n  /**\n   * Custom styles for the profile image\n   * @example { objectFit: 'cover', border: '2px solid #fff' }\n   */\n  imageStyle?: CSSProperties;\n  \n  /**\n   * Producer ID for the remote video stream\n   * @example \"producer_12345\"\n   */\n  remoteProducerId: string;\n  \n  /**\n   * Type of MediaSFU event\n   * @example \"conference\" | \"webinar\" | \"broadcast\" | \"chat\"\n   */\n  eventType: EventType;\n  \n  /**\n   * Whether to force video to fill entire container\n   * @default false\n   */\n  forceFullDisplay: boolean;\n  \n  /**\n   * The MediaStream object containing video track\n   */\n  videoStream: MediaStream | null;\n  \n  /**\n   * Whether to show audio/video control buttons (for hosts/co-hosts)\n   * @default true\n   */\n  showControls?: boolean;\n  \n  /**\n   * Whether to show participant name and waveform overlay\n   * @default true\n   */\n  showInfo?: boolean;\n  \n  /**\n   * Custom component for the info overlay (replaces name/waveform)\n   */\n  videoInfoComponent?: Component;\n  \n  /**\n   * Custom component for control buttons (replaces mute/video toggles)\n   */\n  videoControlsComponent?: Component;\n  \n  /**\n   * Position of control buttons overlay\n   * @default \"topLeft\"\n   */\n  controlsPosition?: 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight';\n  \n  /**\n   * Position of info overlay (name/waveform)\n   * @default \"topRight\"\n   */\n  infoPosition?: 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight';\n  \n  /**\n   * Full participant object with name, muted, videoOn, etc.\n   */\n  participant: Participant;\n  \n  /**\n   * Background color for the card\n   * @example \"#000000\"\n   */\n  backgroundColor?: string;\n  \n  /**\n   * Audio decibel levels for waveform animation\n   */\n  audioDecibels?: AudioDecibels[];\n  \n  /**\n   * Whether to mirror the video (for local camera)\n   * @default false\n   */\n  doMirror?: boolean;\n  \n  /**\n   * MediaSFU parameters object for control operations\n   */\n  parameters: VideoCardParameters;\n  \n  /**\n   * HTML attributes for the outer container\n   * @example { 'data-testid': 'video-card', class: 'custom-class' }\n   */\n  containerProps?: HTMLAttributes;\n  \n  /**\n   * HTML attributes for the info overlay wrapper\n   */\n  infoOverlayProps?: HTMLAttributes;\n  \n  /**\n   * HTML attributes for the controls overlay wrapper\n   */\n  controlsOverlayProps?: HTMLAttributes;\n  \n  /**\n   * HTML attributes for the waveform container\n   */\n  waveformContainerProps?: HTMLAttributes;\n  \n  /**\n   * CSS styles for individual waveform bars\n   * @example { borderRadius: '2px', margin: '0 1px' }\n   */\n  waveformBarStyle?: CSSProperties;\n  \n  /**\n   * CSS class(es) for waveform bars\n   * @example \"animated-bar\" or [\"animated-bar\", \"green-bar\"]\n   */\n  waveformBarClassName?: string | string[];\n  \n  /**\n   * Additional props to pass to the CardVideoDisplay component\n   */\n  videoDisplayProps?: Partial<CardVideoDisplayProps>;\n}\n\nconst props = withDefaults(defineProps<VideoCardProps>(), {\n  barColor: 'red',\n  textColor: 'white',\n  showControls: true,\n  showInfo: true,\n  controlsPosition: 'topLeft',\n  infoPosition: 'topRight',\n  doMirror: false,\n  customStyle: undefined,\n  imageSource: undefined,\n  imageStyle: undefined,\n  videoInfoComponent: undefined,\n  videoControlsComponent: undefined,\n  backgroundColor: undefined,\n  audioDecibels: undefined,\n  containerProps: () => ({}),\n  infoOverlayProps: () => ({}),\n  controlsOverlayProps: () => ({}),\n  waveformContainerProps: () => ({}),\n  waveformBarStyle: () => ({}),\n  waveformBarClassName: undefined,\n  videoDisplayProps: () => ({}),\n});\n\nconst waveformAnimations = ref<number[]>(Array.from({ length: 9 }, () => 0));\nconst showWaveformState = ref(true);\nlet checkAudioInterval: ReturnType<typeof setInterval> | null = null;\n\nconst getAnimationDuration = (index: number): number => {\n  const durations = [474, 433, 407, 458, 400, 427, 441, 419, 487];\n  return durations[index] || 0;\n};\n\nconst animateBar = (index: number) => {\n  if (waveformAnimations.value[index] !== undefined) {\n    waveformAnimations.value[index] = 1;\n  }\n\n  setTimeout(() => {\n    if (waveformAnimations.value[index] !== undefined) {\n      waveformAnimations.value[index] = 0;\n    }\n  }, getAnimationDuration(index));\n};\n\nconst animateWaveform = () => {\n  waveformAnimations.value.forEach((_, index) => {\n    setInterval(() => animateBar(index), getAnimationDuration(index) * 2);\n  });\n};\n\nconst resetWaveform = () => {\n  waveformAnimations.value = Array.from({ length: 9 }, () => 0);\n};\n\n// Check audio levels interval\ncheckAudioInterval = setInterval(() => {\n  const { getUpdatedAllParams } = props.parameters;\n  const updatedParams = getUpdatedAllParams();\n  const { audioDecibels, participants } = updatedParams;\n\n  const existingEntry =\n    audioDecibels && audioDecibels.find((entry: AudioDecibels) => entry.name === props.name);\n  const participantEntry =\n    participants && participants.find((p: Participant) => p.name === props.name);\n\n  if (\n    existingEntry &&\n    existingEntry.averageLoudness > 127.5 &&\n    participantEntry &&\n    !participantEntry.muted\n  ) {\n    animateWaveform();\n  } else {\n    resetWaveform();\n  }\n}, 1000);\n\n// Watch participant muted state\nwatch(\n  () => props.participant?.muted,\n  (muted) => {\n    if (muted) {\n      showWaveformState.value = false;\n    } else {\n      showWaveformState.value = true;\n    }\n  },\n  { immediate: true }\n);\n\nconst toggleAudio = async () => {\n  if (!props.participant?.muted) {\n    const { getUpdatedAllParams } = props.parameters;\n    const updatedParams = getUpdatedAllParams();\n    await controlMedia({\n      participantId: props.participant.id || '',\n      participantName: props.participant.name,\n      type: 'audio',\n  socket: updatedParams.socket as unknown as Socket,\n      roomName: updatedParams.roomName,\n      coHostResponsibility: updatedParams.coHostResponsibility,\n      showAlert: updatedParams.showAlert,\n      coHost: updatedParams.coHost,\n      participants: updatedParams.participants,\n      member: updatedParams.member,\n      islevel: updatedParams.islevel,\n    });\n  }\n};\n\nconst toggleVideo = async () => {\n  if (props.participant?.videoOn) {\n    const { getUpdatedAllParams } = props.parameters;\n    const updatedParams = getUpdatedAllParams();\n    await controlMedia({\n      participantId: props.participant.id || '',\n      participantName: props.participant.name,\n      type: 'video',\n  socket: updatedParams.socket as unknown as Socket,\n      roomName: updatedParams.roomName,\n      coHostResponsibility: updatedParams.coHostResponsibility,\n      showAlert: updatedParams.showAlert,\n      coHost: updatedParams.coHost,\n      participants: updatedParams.participants,\n      member: updatedParams.member,\n      islevel: updatedParams.islevel,\n    });\n  }\n};\n\nonUnmounted(() => {\n  if (checkAudioInterval) {\n    clearInterval(checkAudioInterval);\n  }\n});\n\n// Styles\nconst cardStyle: CSSProperties = {\n  width: '100%',\n  height: '100%',\n  margin: 0,\n  padding: 0,\n  backgroundColor: '#2c678f',\n  position: 'relative',\n};\n\nconst overlayWebStyle: CSSProperties = {\n  position: 'absolute',\n  minWidth: '40%',\n  minHeight: '5%',\n  maxHeight: '100%',\n  display: 'grid',\n  gridTemplateColumns: '4fr 2fr',\n  gridGap: '3px',\n};\n\nconst overlayWebAltStyle: CSSProperties = {\n  position: 'absolute',\n  minWidth: '50%',\n  minHeight: '5%',\n  maxHeight: '100%',\n  display: 'grid',\n  gridTemplateColumns: '4fr',\n  gridGap: '0px',\n  top: 0,\n  right: 0,\n};\n\nconst overlayControlsStyle: CSSProperties = {\n  display: 'flex',\n  flexDirection: 'row',\n  padding: 0,\n  position: 'absolute',\n  top: 0,\n  left: 0,\n};\n\nconst controlButtonStyle: CSSProperties = {\n  justifyContent: 'center',\n  alignItems: 'center',\n  backgroundColor: 'rgba(0, 0, 0, 0.2)',\n  padding: '2px 4px',\n  marginRight: '2px',\n  fontSize: 'medium',\n  border: 'none',\n  cursor: 'pointer',\n};\n\nconst nameColumnStyle: CSSProperties = {\n  justifyContent: 'center',\n  alignItems: 'center',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  padding: '5px',\n  marginRight: '2px',\n  fontSize: 'small',\n  textAlign: 'center',\n};\n\nconst nameTextStyle: CSSProperties = {\n  fontSize: 'small',\n  fontWeight: 'bolder',\n};\n\nconst waveformWebStyle: CSSProperties = {\n  display: 'flex',\n  justifyContent: 'left',\n  alignItems: 'center',\n  backgroundColor: 'rgba(0, 0, 0, 0.05)',\n  padding: 0,\n  flexDirection: 'row',\n};\n\nconst barStyle: CSSProperties = {\n  flex: 1,\n  opacity: 0.35,\n  margin: '0 1px',\n  transition: 'height 0.5s ease',\n};\n\nconst resolvedVideoDisplayProps = computed(() => props.videoDisplayProps ?? {});\n\nconst containerClassNames = computed(() => {\n  const baseClass = 'mediasfu-video-card';\n  const classes = props.containerProps?.class;\n  if (!classes) {\n    return baseClass;\n  }\n  return [baseClass, classes];\n});\n\nconst containerMergedStyle = computed<CSSProperties>(() => ({\n  ...cardStyle,\n  ...(props.containerProps?.style as CSSProperties | undefined),\n  ...(props.customStyle ?? {}),\n  backgroundColor: props.backgroundColor,\n}));\n\nconst containerRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.containerProps ?? {};\n  return rest;\n});\n\nconst infoOverlayClassNames = computed(() => {\n  const baseClass = 'mediasfu-video-card__info-overlay';\n  const classes = props.infoOverlayProps?.class;\n  if (!classes) {\n    return baseClass;\n  }\n  return [baseClass, classes];\n});\n\nconst infoOverlayStyle = computed<CSSProperties>(() => ({\n  ...getOverlayPosition({ position: props.infoPosition }),\n  ...(props.showControls ? overlayWebStyle : overlayWebAltStyle),\n  ...(props.infoOverlayProps?.style as CSSProperties | undefined),\n}));\n\nconst infoOverlayRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.infoOverlayProps ?? {};\n  return rest;\n});\n\nconst controlsOverlayClassNames = computed(() => {\n  const baseClass = 'mediasfu-video-card__controls-overlay';\n  const classes = props.controlsOverlayProps?.class;\n  if (!classes) {\n    return baseClass;\n  }\n  return [baseClass, classes];\n});\n\nconst controlsOverlayStyle = computed<CSSProperties>(() => ({\n  ...overlayControlsStyle,\n  ...getOverlayPosition({ position: props.controlsPosition }),\n  ...(props.controlsOverlayProps?.style as CSSProperties | undefined),\n}));\n\nconst controlsOverlayRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.controlsOverlayProps ?? {};\n  return rest;\n});\n\nconst waveformContainerClassNames = computed(() => {\n  const baseClass = 'mediasfu-video-card__waveform';\n  const classes = props.waveformContainerProps?.class;\n  if (!classes) {\n    return baseClass;\n  }\n  return [baseClass, classes];\n});\n\nconst waveformContainerStyle = computed<CSSProperties>(() => ({\n  ...waveformWebStyle,\n  ...(props.waveformContainerProps?.style as CSSProperties | undefined),\n}));\n\nconst waveformContainerRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.waveformContainerProps ?? {};\n  return rest;\n});\n\nconst waveformBarMergedStyle = computed<CSSProperties>(() => ({\n  ...barStyle,\n  ...(props.waveformBarStyle ?? {}),\n}));\n\nconst waveformBarClassNames = computed(() => {\n  const baseClass = 'mediasfu-video-card__waveform-bar';\n  const classes = props.waveformBarClassName;\n  if (!classes || (Array.isArray(classes) && classes.length === 0)) {\n    return baseClass;\n  }\n  return Array.isArray(classes) ? [baseClass, ...classes] : [baseClass, classes];\n});\n\n</script>\n","<!--\n/**\n * @fileoverview MiniCard Component - Compact participant avatar/initials card\n * @component MiniCard\n * @module components/displayComponents/MiniCard\n * \n * @description\n * A compact participant card that displays either an avatar image or initials.\n * Used in participant lists, grid views, and as a fallback for audio-only participants.\n * Highly customizable through props and render functions, and can be completely replaced\n * via the MediaSFU `uiOverrides.miniCard` system.\n * \n * @example Basic Usage\n * <MiniCard initials=\"JD\" :fontSize=\"16\" />\n * \n * @example With Profile Image\n * <MiniCard \n *   // imageSource=\"https://example.com/avatar.jpg\"\n *   // :roundedImage=\"true\"\n * // />\n * \n * @example Custom Styled\n * // <MiniCard\n *   // initials=\"AB\"\n *   // :fontSize=\"20\"\n *   // :customStyle=\"{ backgroundColor: '#22c55e', color: '#fff' }\"\n * // />\n * \n * @example With Render Override\n * // <MiniCard\n *   // initials=\"XY\"\n *   // :renderContainer=\"({ defaultContainer }) => \n *     h('div', { class: 'frosted-glass' }, [defaultContainer])\n *   \"\n * // />\n * \n * @example Complete Replacement via UI Overrides\n * // In your App component (AppUnique.vue pattern)\n * const uiOverrides = computed(() => ({\n *   // miniCard: {\n *     component: {\n *       name: 'CustomMiniCard',\n *       props: ['initials', 'fontSize', 'imageSource'],\n *       setup(props) {\n *         return () => h('div', {\n *           style: {\n *             background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n *             borderRadius: '50%',\n *             display: 'flex',\n *             alignItems: 'center',\n *             justifyContent: 'center',\n *             color: '#fff',\n *             fontWeight: 'bold'\n *           }\n *         }, props.initials || '?');\n *       }\n *     }\n *   }\n * }));\n */\n-->\n<template>\n  <RenderVNode :node=\"containerNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  computed,\n  defineComponent,\n  h,\n  isVNode,\n  type CSSProperties,\n  type HTMLAttributes,\n  type ImgHTMLAttributes,\n  type PropType,\n  type VNode,\n  type VNodeChild,\n} from 'vue';\n\n/**\n * Options passed to `renderContainer` function\n * @interface RenderContainerOptions\n */\ninterface RenderContainerOptions {\n  /** The default rendered container with all styling applied */\n  defaultContainer: VNode;\n  /** Whether the card is displaying an image (true) or initials (false) */\n  isImage: boolean;\n}\n\n/**\n * Options passed to `renderImage` function\n * @interface RenderImageOptions\n */\ninterface RenderImageOptions {\n  /** The default rendered image element (null if no imageSource) */\n  defaultImage: VNode | null;\n  /** The source URL of the image (optional) */\n  imageSource?: string;\n}\n\n/**\n * Options passed to `renderInitials` function\n * @interface RenderInitialsOptions\n */\ninterface RenderInitialsOptions {\n  /** The default rendered initials text element */\n  defaultInitials: VNode;\n  /** The initials string (optional) */\n  initials?: string;\n}\n\n/**\n * Props for the MiniCard component\n * @interface MiniCardProps\n */\nexport interface MiniCardProps {\n  /**\n   * Initials to display when no imageSource is provided\n   * @default undefined\n   * @example \"JD\", \"AB\", \"XY\"\n   */\n  initials?: string;\n  \n  /**\n   * Font size for initials in pixels\n   * @default 14\n   */\n  fontSize?: number;\n  \n  /**\n   * Custom CSS styles for the outer container\n   * @example { backgroundColor: '#22c55e', color: '#fff' }\n   */\n  customStyle?: CSSProperties;\n  \n  /**\n   * URL of the profile image (displays instead of initials when provided)\n   * @example \"https://example.com/avatar.jpg\"\n   */\n  imageSource?: string;\n  \n  /**\n   * Whether to apply border-radius: 50% to the image\n   * @default true\n   */\n  roundedImage?: boolean;\n  \n  /**\n   * Custom CSS styles for the image element\n   * @example { objectFit: 'cover', border: '2px solid #fff' }\n   */\n  imageStyle?: CSSProperties;\n  \n  /**\n   * HTML attributes for the outer container element\n   * @example { 'data-testid': 'mini-card', class: 'custom-class' }\n   */\n  containerProps?: HTMLAttributes;\n  \n  /**\n   * HTML attributes for the image container wrapper\n   */\n  imageContainerProps?: HTMLAttributes;\n  \n  /**\n   * HTML attributes for the <img> element\n   * @example { alt: 'User Avatar', loading: 'lazy' }\n   */\n  imageProps?: ImgHTMLAttributes;\n  \n  /**\n   * HTML attributes for the initials container element\n   */\n  initialsContainerProps?: HTMLAttributes;\n  \n  /**\n   * HTML attributes for the initials text element\n   */\n  initialsTextProps?: HTMLAttributes;\n  \n  /**\n   * Custom render function for the entire container.\n   * Receives the default container and can wrap or replace it.\n   * \n   * @param options - Rendering options\n   * @param options.defaultContainer - The fully-styled default container VNode\n   * @param options.isImage - Whether displaying image (true) or initials (false)\n   * @returns Custom VNode to render\n   * \n   * @example\n   * ```ts\n   * ({ defaultContainer, isImage }) => {\n   *   return h('div', { class: 'frosted-glass' }, [defaultContainer]);\n   * }\n   * ```\n   */\n  renderContainer?: (options: RenderContainerOptions) => VNodeChild;\n  \n  /**\n   * Custom render function for the image element.\n   * \n   * @param options - Rendering options\n   * @param options.defaultImage - The default image VNode (null if no source)\n   * @param options.imageSource - The image URL\n   * @returns Custom VNode or null\n   * \n   * @example\n   * ```ts\n   * ({ defaultImage, imageSource }) => {\n   *   if (!imageSource) return null;\n   *   return h('img', { src: imageSource, class: 'custom-avatar' });\n   * }\n   * ```\n   */\n  renderImage?: (options: RenderImageOptions) => VNodeChild;\n  \n  /**\n   * Custom render function for the initials text.\n   * \n   * @param options - Rendering options\n   * @param options.defaultInitials - The default initials text VNode\n   * @param options.initials - The initials string\n   * @returns Custom VNode\n   * \n   * @example\n   * ```ts\n   * ({ defaultInitials, initials }) => {\n   *   return h('strong', { class: 'bold-initials' }, initials || '?');\n   * }\n   * ```\n   */\n  renderInitials?: (options: RenderInitialsOptions) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<MiniCardProps>(), {\n  fontSize: 14,\n  roundedImage: true,\n  initials: undefined,\n  customStyle: undefined,\n  imageSource: undefined,\n  imageStyle: undefined,\n  containerProps: () => ({}),\n  imageContainerProps: () => ({}),\n  imageProps: () => ({}),\n  initialsContainerProps: () => ({}),\n  initialsTextProps: () => ({}),\n  renderContainer: undefined,\n  renderImage: undefined,\n  renderInitials: undefined,\n});\n\n// Wrapper component for flexible VNodeChild rendering\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Boolean, Array] as PropType<VNodeChild>,\n      default: undefined,\n    },\n  },\n  render() {\n    if (isVNode(this.node)) {\n      return this.node;\n    }\n    if (typeof this.node === 'string' || typeof this.node === 'number') {\n      return String(this.node);\n    }\n    return null;\n  },\n});\n\n// Helper to merge classes\nfunction joinClassNames(...classes: (string | string[] | undefined)[]): string[] {\n  const result: string[] = [];\n  classes.forEach(cls => {\n    if (!cls) return;\n    if (Array.isArray(cls)) {\n      result.push(...cls);\n    } else {\n      result.push(cls);\n    }\n  });\n  return result;\n}\n\nconst styles: Record<string, CSSProperties> = {\n  miniCard: {\n    display: 'flex',\n    justifyContent: 'center',\n    alignItems: 'center',\n    width: '100%',\n    height: '100%',\n    borderRadius: '0px',\n    color: '#000000',\n    fontFamily: 'Nunito',\n    overflow: 'hidden',\n    backgroundColor: 'transparent',\n  },\n  imageContainer: {\n    display: 'flex',\n    justifyContent: 'center',\n    alignItems: 'center',\n    width: '100%',\n    height: '100%',\n    overflow: 'hidden',\n  },\n  backgroundImage: {\n    width: '60%',\n    height: '60%',\n    objectFit: 'cover',\n  },\n  roundedImage: {\n    borderRadius: '50%',\n  },\n  initials: {\n    display: 'flex',\n    justifyContent: 'center',\n    alignItems: 'center',\n    textAlign: 'center',\n    width: '100%',\n    height: '100%',\n  },\n};\n\n// =========================\n// Container Props Merging\n// =========================\nconst containerRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.containerProps || {};\n  return rest;\n});\n\nconst containerClassNames = computed(() =>\n  joinClassNames('mediasfu-mini-card', props.containerProps?.class)\n);\n\nconst containerStyle = computed(() => ({\n  ...styles.miniCard,\n  fontSize: `${props.fontSize || 14}px`,\n  ...props.customStyle,\n  ...(typeof props.containerProps?.style === 'object' ? props.containerProps.style : {}),\n} as CSSProperties));\n\n// =========================\n// ImageContainer Props Merging\n// =========================\nconst imageContainerRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.imageContainerProps || {};\n  return rest;\n});\n\nconst imageContainerClassNames = computed(() =>\n  joinClassNames('mediasfu-mini-card__image-container', props.imageContainerProps?.class)\n);\n\nconst imageContainerStyle = computed(() => ({\n  ...styles.imageContainer,\n  ...(typeof props.imageContainerProps?.style === 'object' ? props.imageContainerProps.style : {}),\n} as CSSProperties));\n\n// =========================\n// Image Props Merging\n// =========================\nconst imageRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.imageProps || {};\n  return rest;\n});\n\nconst imageClassNames = computed(() =>\n  joinClassNames('mediasfu-mini-card__image', props.imageProps?.class)\n);\n\nconst imageCombinedStyle = computed(() => ({\n  ...styles.backgroundImage,\n  ...(props.roundedImage ? styles.roundedImage : {}),\n  ...props.imageStyle,\n  ...(typeof props.imageProps?.style === 'object' ? props.imageProps.style : {}),\n} as CSSProperties));\n\n// =========================\n// InitialsContainer Props Merging\n// =========================\nconst initialsContainerRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.initialsContainerProps || {};\n  return rest;\n});\n\nconst initialsContainerClassNames = computed(() =>\n  joinClassNames('mediasfu-mini-card__initials-container', props.initialsContainerProps?.class)\n);\n\nconst initialsContainerStyle = computed(() => ({\n  ...styles.initials,\n  fontSize: `${props.fontSize}px`,\n  ...(typeof props.initialsContainerProps?.style === 'object'\n    ? props.initialsContainerProps.style\n    : {}),\n} as CSSProperties));\n\n// =========================\n// InitialsText Props Merging\n// =========================\nconst initialsTextRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.initialsTextProps || {};\n  return rest;\n});\n\nconst initialsTextClassNames = computed(() =>\n  joinClassNames('mediasfu-mini-card__initials-text', props.initialsTextProps?.class)\n);\n\nconst initialsTextStyle = computed(() => ({\n  ...(typeof props.initialsTextProps?.style === 'object' ? props.initialsTextProps.style : {}),\n} as CSSProperties));\n\n// =========================\n// Render Logic\n// =========================\nconst defaultImage = computed(() => {\n  if (!props.imageSource) return null;\n  return h('img', {\n    src: props.imageSource,\n    alt: 'Profile',\n    class: imageClassNames.value,\n    style: imageCombinedStyle.value,\n    ...imageRestAttrs.value,\n  });\n});\n\nconst imageNode = computed<VNode | null>(() => {\n  if (props.renderImage) {\n    const result = props.renderImage({\n      defaultImage: defaultImage.value,\n      imageSource: props.imageSource,\n    });\n    return isVNode(result) ? result : null;\n  }\n  return defaultImage.value;\n});\n\nconst defaultInitials = computed(() => {\n  return h(\n    'span',\n    {\n      class: initialsTextClassNames.value,\n      style: initialsTextStyle.value,\n      ...initialsTextRestAttrs.value,\n    },\n    props.initials || ''\n  );\n});\n\nconst initialsNode = computed<VNode>(() => {\n  if (props.renderInitials) {\n    const result = props.renderInitials({\n      defaultInitials: defaultInitials.value,\n      initials: props.initials,\n    });\n    if (isVNode(result)) return result;\n  }\n  return defaultInitials.value;\n});\n\nconst defaultContainer = computed(() => {\n  const isImage = !!props.imageSource;\n  if (isImage && imageNode.value) {\n    return h(\n      'div',\n      {\n        class: imageContainerClassNames.value,\n        style: imageContainerStyle.value,\n        ...imageContainerRestAttrs.value,\n      },\n      [imageNode.value]\n    );\n  }\n  return h(\n    'div',\n    {\n      class: initialsContainerClassNames.value,\n      style: initialsContainerStyle.value,\n      ...initialsContainerRestAttrs.value,\n    },\n    [initialsNode.value]\n  );\n});\n\nconst containerNode = computed<VNode>(() => {\n  const isImage = !!props.imageSource;\n  const wrappedContent = h(\n    'div',\n    {\n      class: containerClassNames.value,\n      style: containerStyle.value,\n      ...containerRestAttrs.value,\n    },\n    [defaultContainer.value]\n  );\n\n  if (props.renderContainer) {\n    const result = props.renderContainer({\n      defaultContainer: wrappedContent,\n      isImage,\n    });\n    if (isVNode(result)) return result;\n  }\n  return wrappedContent;\n});\n</script>\n\n<style scoped>\n/* Component-specific styles */\n</style>\n","<!--\n/**\n * @fileoverview AudioCard Component - Audio-only participant card with waveform visualization\n * @component AudioCard\n * @module components/displayComponents/AudioCard\n * \n * @description\n * An audio-only participant card that displays either a profile image or MiniCard fallback\n * with animated audio waveform visualization and control buttons. Used for participants\n * who are audio-only or have their video disabled. Supports complete customization via\n * render props and can be fully replaced via `uiOverrides.audioCard`.\n * \n * Features:\n * - Profile image display or MiniCard fallback with initials\n * - Animated audio waveform with customizable bar count and styling\n * - Control buttons for audio/video toggle (for hosts/co-hosts)\n * - Participant name overlay with configurable position\n * - Custom component injection via slots\n * - Comprehensive styling and positioning control\n * - Waveform animation synchronized with audio levels\n * \n * @example Basic Usage\n * // <AudioCard\n *   // name=\"Jane Smith\"\n *   // :participant=\"participant\"\n *   // :parameters=\"parameters\"\n * // />\n * \n * @example With Profile Image\n * // <AudioCard\n *   // name=\"John Doe\"\n *   // imageSource=\"https://example.com/avatar.jpg\"\n *   // :roundedImage=\"true\"\n *   // :participant=\"participant\"\n *   // :parameters=\"parameters\"\n *   // barColor=\"#22c55e\"\n *   // textColor=\"#fff\"\n * // />\n * \n * @example Custom Styled with Waveform Configuration\n * // <AudioCard\n *   // name=\"Alex Johnson\"\n *   // :participant=\"participant\"\n *   // :parameters=\"parameters\"\n *   // :customStyle=\"{ \n *     background: 'rgba(34,197,94,0.1)', \n *     borderRadius: '12px' \n *   }\"\n *   // barColor=\"#22c55e\"\n *   // :waveformBarCount=\"12\"\n *   // :waveformHeights=\"{ silent: 2, active: 16 }\"\n *   // controlsPosition=\"bottomRight\"\n *   // infoPosition=\"topLeft\"\n * // />\n * \n * @example With Custom Waveform Renderer\n * // <AudioCard\n *   // name=\"Sam Lee\"\n *   // :participant=\"participant\"\n *   // :parameters=\"parameters\"\n *   // :renderWaveformBar=\"({ index, isActive, height, style, props }) => \n *     h('div', {\n *       key: index,\n *       style: {\n *         ...style,\n *         background: isActive \n *           ? 'linear-gradient(to top, #22c55e, #16a34a)' \n *           : '#d1d5db'\n *       },\n *       ...props\n *     })\n *   \"\n * // />\n * \n * @example Complete Replacement via UI Overrides\n * // In your App component (AppUnique.vue pattern)\n * const uiOverrides = computed(() => ({\n *   // audioCard: {\n *     component: {\n *       name: 'CustomAudioCard',\n *       props: ['name', 'participant', 'barColor', 'imageSource'],\n *       setup(props) {\n *         return () => h(AudioCard, {\n *           ...props,\n *           customStyle: {\n *             background: 'rgba(34,197,94,0.1)',\n *             borderRadius: '22px',\n *             border: '2px solid #22c55e'\n *           },\n *           barColor: '#22c55e',\n *           waveformBarCount: 12\n *         });\n *       }\n *     }\n *   }\n * }));\n */\n-->\n<template>\n  <div\n    v-bind=\"cardRestAttrs\"\n    :class=\"cardClassNames\"\n    :style=\"cardMergedStyle\"\n  >\n    <slot name=\"extra-widgets\" />\n\n    <div\n      v-if=\"imageSource\"\n      :style=\"imageContainerStyle\"\n    >\n      <img\n        v-bind=\"imageRestAttrs\"\n        :src=\"imageSource\"\n        alt=\"Participant\"\n        :style=\"imageMergedStyle\"\n      />\n    </div>\n    <MiniCard\n      v-else\n      v-bind=\"miniCardProps\"\n    />\n\n    <component\n      :is=\"videoInfoComponent\"\n      v-if=\"videoInfoComponent\"\n    />\n    <div\n      v-else-if=\"showInfo\"\n      v-bind=\"infoOverlayRestAttrs\"\n      :class=\"infoOverlayClassNames\"\n      :style=\"infoOverlayMergedStyle\"\n    >\n      <div\n        v-bind=\"nameContainerRestAttrs\"\n        :class=\"nameContainerClassNames\"\n        :style=\"nameContainerMergedStyle\"\n      >\n        <p\n          v-bind=\"nameTextRestAttrs\"\n          :class=\"nameTextClassNames\"\n          :style=\"nameTextMergedStyle\"\n        >\n          {{ name }}\n        </p>\n      </div>\n      <div\n        v-if=\"showWaveformState\"\n        v-bind=\"waveformContainerRestAttrs\"\n        :class=\"waveformContainerClassNames\"\n        :style=\"waveformContainerMergedStyle\"\n      >\n        <template\n          v-for=\"descriptor in waveformBarDescriptors\"\n          :key=\"descriptor.key\"\n        >\n          <RenderVNode\n            v-if=\"descriptor.customNode !== null && descriptor.customNode !== undefined\"\n            :node=\"descriptor.customNode\"\n          />\n          <component\n            :is=\"descriptor.component\"\n            v-else\n            v-bind=\"descriptor.props\"\n          />\n        </template>\n      </div>\n    </div>\n\n    <component\n      :is=\"videoControlsComponent\"\n      v-if=\"videoControlsComponent\"\n    />\n    <div\n      v-else-if=\"showControls\"\n      v-bind=\"controlsOverlayRestAttrs\"\n      :class=\"controlsOverlayClassNames\"\n      :style=\"controlsOverlayMergedStyle\"\n    >\n      <button\n        v-bind=\"audioButtonRestAttrs\"\n        :class=\"audioButtonClassNames\"\n        :style=\"audioButtonMergedStyle\"\n        :type=\"audioButtonType\"\n        @click=\"handleAudioButtonClick\"\n      >\n        <RenderVNode :node=\"audioIconNode\" />\n      </button>\n      <button\n        v-bind=\"videoButtonRestAttrs\"\n        :class=\"videoButtonClassNames\"\n        :style=\"videoButtonMergedStyle\"\n        :type=\"videoButtonType\"\n        @click=\"handleVideoButtonClick\"\n      >\n        <RenderVNode :node=\"videoIconNode\" />\n      </button>\n    </div>\n\n    <slot />\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  computed,\n  defineComponent,\n  h,\n  onUnmounted,\n  ref,\n  watch,\n  type CSSProperties,\n  type Component,\n  type HTMLAttributes,\n  type ImgHTMLAttributes,\n  type PropType,\n  type VNodeChild,\n} from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport {\n  faVideo,\n  faVideoSlash,\n  faMicrophone,\n  faMicrophoneSlash,\n} from '@fortawesome/free-solid-svg-icons';\nimport { getOverlayPosition } from '@legacy/methods/utils/getOverlayPosition';\nimport MiniCard from './MiniCard.vue';\nimport {\n  controlMedia,\n  type ControlMediaOptions,\n} from '@legacy/consumers/controlMedia';\nimport type {\n  ControlsPosition,\n  InfoPosition,\n  Participant,\n  AudioDecibels,\n  CoHostResponsibility,\n  ShowAlert,\n} from '../../../../SharedTypes';\nimport type { Socket } from 'socket.io-client';\n\n/**\n * Parameters object for AudioCard control operations\n * @interface AudioCardParameters\n */\nexport interface AudioCardParameters {\n  /** Audio level data for all participants */\n  audioDecibels: AudioDecibels[];\n  /** List of all participants in the session */\n  participants: Participant[];\n  /** Socket.io connection for real-time communication */\n  socket: Socket;\n  /** Array of co-host responsibilities */\n  coHostResponsibility: CoHostResponsibility[];\n  /** Name of the current room/session */\n  roomName: string;\n  /** Alert display function */\n  showAlert?: ShowAlert;\n  /** Co-host identifier */\n  coHost: string;\n  /** User level ('0' = regular, '1' = admin, '2' = host) */\n  islevel: string;\n  /** Current user's identifier */\n  member: string;\n  /** Type of MediaSFU event */\n  eventType: string;\n  /** Function to get the latest parameters */\n  getUpdatedAllParams(): AudioCardParameters;\n}\n\ntype MiniCardComponentProps = InstanceType<typeof MiniCard>['$props'];\n\n/**\n * Configuration for waveform bar heights\n * @interface WaveformHeightsConfig\n */\ninterface WaveformHeightsConfig {\n  /** Height in pixels when audio is silent @default 1 */\n  silent?: number;\n  /** Height in pixels when audio is active @default 12 */\n  active?: number;\n}\n\n/**\n * Options passed to custom waveform bar renderer\n * @interface WaveformBarRenderOptions\n */\ninterface WaveformBarRenderOptions {\n  /** Bar index (0-based) */\n  index: number;\n  /** Whether this bar is currently animated (active audio) */\n  isActive: boolean;\n  /** Computed height for this bar (silent or active) */\n  height: number;\n  /** Default computed CSS styles */\n  style: CSSProperties;\n  /** Default HTML attributes */\n  props: HTMLAttributes;\n}\n\n/**\n * Custom renderer function for waveform bars\n * @callback WaveformBarRenderer\n * @param {WaveformBarRenderOptions} options - Rendering options\n * @returns {VNodeChild} Custom VNode for the waveform bar\n */\ntype WaveformBarRenderer = (options: WaveformBarRenderOptions) => VNodeChild;\n\ntype ButtonAttrs = HTMLAttributes & {\n  type?: string;\n  onClick?: (event: MouseEvent) => void;\n};\n\n/**\n * Per-button HTML attribute configuration\n * @interface ControlButtonPropsConfig\n */\ninterface ControlButtonPropsConfig {\n  /** Attributes for the audio toggle button */\n  audio?: ButtonAttrs;\n  /** Attributes for the video toggle button */\n  video?: ButtonAttrs;\n}\n\n/**\n * Props for the AudioCard component\n * @interface AudioCardProps\n */\nexport interface AudioCardProps {\n  /**\n   * Custom function for controlling participant media (mute/unmute)\n   * @default controlMedia\n   */\n  controlUserMedia?: (options: ControlMediaOptions) => Promise<void>;\n  \n  /**\n   * Custom CSS styles for the card container\n   * @example { background: 'rgba(34,197,94,0.1)', borderRadius: '12px' }\n   */\n  customStyle?: CSSProperties;\n  \n  /**\n   * Participant's display name\n   * @example \"Jane Smith\"\n   */\n  name: string;\n  \n  /**\n   * Color of the audio waveform bars\n   * @default \"red\"\n   * @example \"#22c55e\"\n   */\n  barColor?: string;\n  \n  /**\n   * Color of the participant name text\n   * @default \"white\"\n   * @example \"#fff\"\n   */\n  textColor?: string;\n  \n  /**\n   * URL of participant's profile image\n   * @example \"https://example.com/avatar.jpg\"\n   */\n  imageSource?: string;\n  \n  /**\n   * Whether to apply rounded styling to the image\n   * @default false\n   */\n  roundedImage?: boolean;\n  \n  /**\n   * Custom styles for the profile image\n   * @example { objectFit: 'cover', border: '2px solid #fff' }\n   */\n  imageStyle?: CSSProperties;\n  \n  /**\n   * Whether to show audio/video control buttons (for hosts/co-hosts)\n   * @default true\n   */\n  showControls?: boolean;\n  \n  /**\n   * Whether to show participant name and waveform overlay\n   * @default true\n   */\n  showInfo?: boolean;\n  \n  /**\n   * Custom component for the info overlay (replaces name/waveform)\n   */\n  videoInfoComponent?: Component;\n  \n  /**\n   * Custom component for control buttons (replaces mute/video toggles)\n   */\n  videoControlsComponent?: Component;\n  \n  /**\n   * Position of control buttons overlay\n   * @default \"topLeft\"\n   */\n  controlsPosition?: ControlsPosition;\n  \n  /**\n   * Position of info overlay (name/waveform)\n   * @default \"topRight\"\n   */\n  infoPosition?: InfoPosition;\n  \n  /**\n   * Full participant object with name, muted, videoOn, etc.\n   */\n  participant: Participant;\n  \n  /**\n   * Background color for the card\n   * @example \"#000000\"\n   */\n  backgroundColor?: string;\n  \n  /**\n   * Audio decibel level data for this participant\n   */\n  audioDecibels?: AudioDecibels;\n  \n  /**\n   * MediaSFU parameters object for control operations\n   */\n  parameters: AudioCardParameters;\n  \n  /**\n   * HTML attributes for the outer card container\n   * @example { 'data-testid': 'audio-card', class: 'custom-class' }\n   */\n  cardProps?: HTMLAttributes;\n  \n  /**\n   * HTML attributes for the info overlay wrapper\n   */\n  infoOverlayProps?: HTMLAttributes;\n  \n  /**\n   * HTML attributes for the name container element\n   */\n  nameContainerProps?: HTMLAttributes;\n  \n  /**\n   * HTML attributes for the name text element\n   */\n  nameTextProps?: HTMLAttributes;\n  \n  /**\n   * HTML attributes for the waveform container\n   */\n  waveformContainerProps?: HTMLAttributes;\n  \n  /**\n   * CSS styles for individual waveform bars\n   * @example { borderRadius: '2px', margin: '0 1px' }\n   */\n  waveformBarStyle?: CSSProperties;\n  \n  /**\n   * HTML attributes for each waveform bar\n   */\n  waveformBarProps?: HTMLAttributes;\n  \n  /**\n   * Configuration for waveform bar heights\n   * @example { silent: 2, active: 16 }\n   */\n  waveformHeights?: WaveformHeightsConfig;\n  \n  /**\n   * Custom animation durations for each waveform bar (ms)\n   * @default [474, 433, 407, 458, 400, 427, 441, 419, 487]\n   * @example [400, 450, 500, 550, 600]\n   */\n  waveformDurations?: number[];\n  \n  /**\n   * Number of waveform bars to display\n   * @default 9 (length of waveformDurations array)\n   * @example 12\n   */\n  waveformBarCount?: number;\n  \n  /**\n   * Custom render function for individual waveform bars.\n   * Receives bar index, active state, height, and default styling.\n   * \n   * @param options - Waveform bar rendering options\n   * @param options.index - Bar index (0-based)\n   * @param options.isActive - Whether this bar is currently animated\n   * @param options.height - Computed height for this bar\n   * @param options.style - Default computed CSS styles\n   * @param options.props - Default HTML attributes\n   * @returns Custom VNode for the waveform bar\n   * \n   * @example\n   * ```ts\n   * ({ index, isActive, height, style, props }) => \n   *   h('div', {\n   *     key: index,\n   *     style: {\n   *       ...style,\n   *       background: isActive \n   *         ? 'linear-gradient(to top, #22c55e, #16a34a)' \n   *         : '#d1d5db'\n   *     },\n   *     ...props\n   *   })\n   * ```\n   */\n  renderWaveformBar?: WaveformBarRenderer;\n  \n  /**\n   * HTML attributes for the controls overlay wrapper\n   */\n  controlsOverlayProps?: HTMLAttributes;\n  \n  /**\n   * Per-button HTML attributes for control buttons\n   * @example { audio: { 'data-testid': 'mute-btn' }, video: { 'data-testid': 'video-btn' } }\n   */\n  controlButtonProps?: ControlButtonPropsConfig;\n  \n  /**\n   * Custom icon for audio enabled state\n   * @example h(FontAwesomeIcon, { icon: faMicrophone })\n   */\n  audioEnabledIcon?: VNodeChild;\n  \n  /**\n   * Custom icon for audio disabled (muted) state\n   * @example h(FontAwesomeIcon, { icon: faMicrophoneSlash })\n   */\n  audioDisabledIcon?: VNodeChild;\n  \n  /**\n   * Custom icon for video enabled state\n   * @example h(FontAwesomeIcon, { icon: faVideo })\n   */\n  videoEnabledIcon?: VNodeChild;\n  \n  /**\n   * Custom icon for video disabled state\n   * @example h(FontAwesomeIcon, { icon: faVideoSlash })\n   */\n  videoDisabledIcon?: VNodeChild;\n  \n  /**\n   * Props to pass to the fallback MiniCard component (when no imageSource)\n   * @example { fontSize: 18, customStyle: { background: '#22c55e' } }\n   */\n  fallbackMiniCardProps?: Partial<MiniCardComponentProps>;\n  \n  /**\n   * HTML attributes for the profile image element\n   * @example { alt: 'User Avatar', loading: 'lazy' }\n   */\n  imageProps?: ImgHTMLAttributes;\n  \n  /**\n   * Whether to show waveform animation even when participant is muted\n   * @default false\n   */\n  showWaveformWhenMuted?: boolean;\n}\n\nconst props = withDefaults(defineProps<AudioCardProps>(), {\n  controlUserMedia: controlMedia,\n  barColor: 'red',\n  textColor: 'white',\n  roundedImage: false,\n  showControls: true,\n  showInfo: true,\n  controlsPosition: 'topLeft',\n  infoPosition: 'topRight',\n  customStyle: undefined,\n  imageSource: undefined,\n  imageStyle: undefined,\n  videoInfoComponent: undefined,\n  videoControlsComponent: undefined,\n  backgroundColor: undefined,\n  audioDecibels: undefined,\n  cardProps: () => ({}),\n  infoOverlayProps: () => ({}),\n  nameContainerProps: () => ({}),\n  nameTextProps: () => ({}),\n  waveformContainerProps: () => ({}),\n  waveformBarStyle: () => ({}),\n  waveformBarProps: () => ({}),\n  waveformHeights: () => ({}),\n  waveformDurations: () => [],\n  waveformBarCount: undefined,\n  renderWaveformBar: undefined,\n  controlsOverlayProps: () => ({}),\n  controlButtonProps: () => ({}),\n  audioEnabledIcon: undefined,\n  audioDisabledIcon: undefined,\n  videoEnabledIcon: undefined,\n  videoDisabledIcon: undefined,\n  fallbackMiniCardProps: () => ({}),\n  imageProps: () => ({}),\n  showWaveformWhenMuted: false,\n});\n\nconst DEFAULT_WAVEFORM_DURATIONS = [474, 433, 407, 458, 400, 427, 441, 419, 487];\n\nconst latestParametersSnapshot = ref(props.parameters.getUpdatedAllParams());\n\nconst getLatestParameters = () => props.parameters.getUpdatedAllParams();\n\nconst durations = computed(() =>\n  props.waveformDurations && props.waveformDurations.length > 0\n    ? props.waveformDurations\n    : DEFAULT_WAVEFORM_DURATIONS\n);\n\nconst barCount = computed(() => props.waveformBarCount ?? durations.value.length);\n\nconst waveformAnimations = ref<number[]>([]);\nconst showWaveformState = ref(true);\n\nlet checkAudioInterval: ReturnType<typeof setInterval> | null = null;\nlet waveformInterval: ReturnType<typeof setInterval> | null = null;\n\nconst silentHeight = computed(() => props.waveformHeights?.silent ?? 1);\nconst activeHeight = computed(() => props.waveformHeights?.active ?? 12);\n\nconst resetWaveform = () => {\n  waveformAnimations.value = Array.from({ length: barCount.value }, () => 0);\n};\n\nwatch(\n  barCount,\n  () => {\n    resetWaveform();\n  },\n  { immediate: true }\n);\n\nconst getAnimationDuration = (index: number): number => {\n  if (durations.value.length === 0) {\n    return 0;\n  }\n  const fallback = durations.value[durations.value.length - 1] ?? 0;\n  return durations.value[index] ?? fallback;\n};\n\nconst animateBar = (index: number) => {\n  if (index >= waveformAnimations.value.length) {\n    return;\n  }\n\n  waveformAnimations.value[index] = 1;\n\n  const duration = getAnimationDuration(index);\n  if (duration <= 0) {\n    waveformAnimations.value[index] = 0;\n    return;\n  }\n\n  setTimeout(() => {\n    if (index < waveformAnimations.value.length) {\n      waveformAnimations.value[index] = 0;\n    }\n  }, duration);\n};\n\nconst animateWaveform = () => {\n  for (let index = 0; index < barCount.value; index += 1) {\n    animateBar(index);\n  }\n};\n\nconst evaluateAudioLevels = () => {\n  const updatedParameters = getLatestParameters();\n  latestParametersSnapshot.value = updatedParameters;\n\n  const { audioDecibels, participants } = updatedParameters;\n  const existingEntry =\n    audioDecibels?.find((entry: AudioDecibels) => entry.name === props.name) ?? null;\n  const participantEntry =\n    participants?.find((participantItem: Participant) => participantItem.name === props.name) ??\n    null;\n\n  if (\n    existingEntry &&\n    existingEntry.averageLoudness > 127.5 &&\n    participantEntry &&\n    !participantEntry.muted\n  ) {\n    if (!showWaveformState.value) {\n      showWaveformState.value = true;\n    }\n  } else if (!props.showWaveformWhenMuted) {\n    showWaveformState.value = false;\n  }\n};\n\ncheckAudioInterval = setInterval(evaluateAudioLevels, 1000);\nevaluateAudioLevels();\n\nwatch(\n  () => props.participant?.muted,\n  (muted) => {\n    if (muted && !props.showWaveformWhenMuted) {\n      showWaveformState.value = false;\n      resetWaveform();\n    } else if (!muted) {\n      showWaveformState.value = true;\n    }\n  },\n  { immediate: true }\n);\n\nwatch(\n  showWaveformState,\n  (show) => {\n    if (waveformInterval) {\n      clearInterval(waveformInterval);\n      waveformInterval = null;\n    }\n\n    if (show) {\n      animateWaveform();\n      waveformInterval = setInterval(animateWaveform, 1000);\n    } else {\n      resetWaveform();\n    }\n  },\n  { immediate: true }\n);\n\nconst toggleAudio = async () => {\n  if (!props.participant?.muted) {\n    const updatedParameters = getLatestParameters();\n    latestParametersSnapshot.value = updatedParameters;\n\n    await props.controlUserMedia!({\n      participantId: props.participant.id || '',\n      participantName: props.participant.name,\n      type: 'audio',\n      socket: updatedParameters.socket,\n      coHostResponsibility: updatedParameters.coHostResponsibility,\n      roomName: updatedParameters.roomName,\n      showAlert: updatedParameters.showAlert,\n      coHost: updatedParameters.coHost,\n      islevel: updatedParameters.islevel,\n      member: updatedParameters.member,\n      participants: updatedParameters.participants,\n    });\n  }\n};\n\nconst toggleVideo = async () => {\n  if (props.participant?.videoOn) {\n    const updatedParameters = getLatestParameters();\n    latestParametersSnapshot.value = updatedParameters;\n\n    await props.controlUserMedia!({\n      participantId: props.participant.id || '',\n      participantName: props.participant.name,\n      type: 'video',\n      socket: updatedParameters.socket,\n      coHostResponsibility: updatedParameters.coHostResponsibility,\n      roomName: updatedParameters.roomName,\n      showAlert: updatedParameters.showAlert,\n      coHost: updatedParameters.coHost,\n      islevel: updatedParameters.islevel,\n      member: updatedParameters.member,\n      participants: updatedParameters.participants,\n    });\n  }\n};\n\nonUnmounted(() => {\n  if (checkAudioInterval) {\n    clearInterval(checkAudioInterval);\n  }\n  if (waveformInterval) {\n    clearInterval(waveformInterval);\n  }\n});\n\n// Styles\nconst cardStyle: CSSProperties = {\n  width: '100%',\n  height: '100%',\n  margin: 0,\n  padding: 0,\n  backgroundColor: 'transparent',\n  position: 'relative',\n};\n\nconst imageContainerStyle: CSSProperties = {\n  display: 'flex',\n  justifyContent: 'center',\n  alignItems: 'center',\n  width: '100%',\n  height: '100%',\n};\n\nconst backgroundImageStyle: CSSProperties = {\n  width: '80px',\n  height: '80px',\n};\n\nconst overlayWebStyle: CSSProperties = {\n  position: 'absolute',\n  minWidth: '50%',\n  minHeight: '5%',\n  maxHeight: '100%',\n  display: 'grid',\n  gridTemplateColumns: '4fr 2fr',\n  gridGap: '3px',\n};\n\nconst overlayWebAltStyle: CSSProperties = {\n  position: 'absolute',\n  minWidth: '50%',\n  minHeight: '5%',\n  maxHeight: '100%',\n  display: 'grid',\n  gridTemplateColumns: '4fr',\n  gridGap: '0px',\n  top: 0,\n  right: 0,\n};\n\nconst overlayControlsStyle: CSSProperties = {\n  display: 'flex',\n  flexDirection: 'row',\n  padding: 0,\n  position: 'absolute',\n  top: 0,\n  left: 0,\n};\n\nconst controlButtonStyle: CSSProperties = {\n  justifyContent: 'center',\n  alignItems: 'center',\n  backgroundColor: 'rgba(0, 0, 0, 0.2)',\n  padding: '0px 5px',\n  marginRight: '2px',\n  fontSize: 'medium',\n  border: 'none',\n  cursor: 'pointer',\n};\n\nconst nameColumnStyle: CSSProperties = {\n  justifyContent: 'center',\n  alignItems: 'center',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  padding: '0px',\n  paddingTop: '5px',\n  marginRight: '2px',\n  fontSize: 'small',\n  textAlign: 'center',\n  minHeight: '4%',\n  maxHeight: '70%',\n};\n\nconst nameTextStyle: CSSProperties = {\n  fontSize: 'small',\n  fontWeight: 'bolder',\n};\n\nconst waveformWebStyle: CSSProperties = {\n  display: 'flex',\n  justifyContent: 'left',\n  alignItems: 'center',\n  backgroundColor: 'rgba(0, 0, 0, 0.05)',\n  padding: '0px',\n  flexDirection: 'row',\n  minHeight: '4%',\n  maxHeight: '70%',\n};\n\nconst barStyle: CSSProperties = {\n  flex: 1,\n  opacity: 0.75,\n  margin: '0 1px',\n  transition: 'height 0.5s ease',\n};\n\nconst RenderVNode = defineComponent({\n  name: 'AudioCardRenderVNode',\n  props: {\n    node: {\n      type: [String, Number, Boolean, Object, Array, Function] as PropType<VNodeChild>,\n      required: true,\n    },\n  },\n  setup(renderProps) {\n    return () => renderProps.node as VNodeChild;\n  },\n});\n\nconst cardClassNames = computed(() => {\n  const baseClass = 'mediasfu-audio-card';\n  const classes = props.cardProps?.class;\n  if (!classes) {\n    return baseClass;\n  }\n  return [baseClass, classes];\n});\n\nconst cardMergedStyle = computed<CSSProperties>(() => ({\n  ...cardStyle,\n  ...(props.cardProps?.style as CSSProperties | undefined),\n  ...(props.customStyle ?? {}),\n  ...(props.backgroundColor ? { backgroundColor: props.backgroundColor } : {}),\n}));\n\nconst cardRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.cardProps ?? {};\n  return rest;\n});\n\nconst infoOverlayClassNames = computed(() => {\n  const baseClass = 'mediasfu-audio-card__info-overlay';\n  const classes = props.infoOverlayProps?.class;\n  if (!classes) {\n    return baseClass;\n  }\n  return [baseClass, classes];\n});\n\nconst infoOverlayMergedStyle = computed<CSSProperties>(() => ({\n  ...getOverlayPosition({ position: props.infoPosition }),\n  ...(props.showControls ? overlayWebStyle : overlayWebAltStyle),\n  ...(props.infoOverlayProps?.style as CSSProperties | undefined),\n}));\n\nconst infoOverlayRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.infoOverlayProps ?? {};\n  return rest;\n});\n\nconst nameContainerClassNames = computed(() => {\n  const baseClass = 'mediasfu-audio-card__info-name';\n  const classes = props.nameContainerProps?.class;\n  if (!classes) {\n    return baseClass;\n  }\n  return [baseClass, classes];\n});\n\nconst nameContainerMergedStyle = computed<CSSProperties>(() => ({\n  ...nameColumnStyle,\n  ...(props.nameContainerProps?.style as CSSProperties | undefined),\n}));\n\nconst nameContainerRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.nameContainerProps ?? {};\n  return rest;\n});\n\nconst nameTextClassNames = computed(() => {\n  const baseClass = 'mediasfu-audio-card__info-text';\n  const classes = props.nameTextProps?.class;\n  if (!classes) {\n    return baseClass;\n  }\n  return [baseClass, classes];\n});\n\nconst nameTextMergedStyle = computed<CSSProperties>(() => ({\n  color: props.textColor,\n  ...nameTextStyle,\n  ...(props.nameTextProps?.style as CSSProperties | undefined),\n}));\n\nconst nameTextRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.nameTextProps ?? {};\n  return rest;\n});\n\nconst waveformContainerClassNames = computed(() => {\n  const baseClass = 'mediasfu-audio-card__waveform';\n  const classes = props.waveformContainerProps?.class;\n  if (!classes) {\n    return baseClass;\n  }\n  return [baseClass, classes];\n});\n\nconst waveformContainerMergedStyle = computed<CSSProperties>(() => ({\n  ...waveformWebStyle,\n  ...(props.waveformContainerProps?.style as CSSProperties | undefined),\n}));\n\nconst waveformContainerRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.waveformContainerProps ?? {};\n  return rest;\n});\n\nconst waveformBarRestAttrs = computed<HTMLAttributes>(() => {\n  const { class: _class, style: _style, ...rest } = props.waveformBarProps ?? {};\n  return rest;\n});\n\nconst waveformBarClassNames = computed(() => {\n  const baseClass = 'mediasfu-audio-card__waveform-bar';\n  const classes = props.waveformBarProps?.class;\n  if (!classes) {\n    return baseClass;\n  }\n  return [baseClass, classes];\n});\n\nconst waveformBarMergedStyle = computed<CSSProperties>(() => ({\n  ...barStyle,\n  ...(props.waveformBarStyle ?? {}),\n  ...(props.waveformBarProps?.style as CSSProperties | undefined),\n}));\n\nconst controlsOverlayClassNames = computed(() => {\n  const baseClass = 'mediasfu-audio-card__controls-overlay';\n  const classes = props.controlsOverlayProps?.class;\n  if (!classes) {\n    return baseClass;\n  }\n  return [baseClass, classes];\n});\n\nconst controlsOverlayMergedStyle = computed<CSSProperties>(() => ({\n  ...overlayControlsStyle,\n  ...getOverlayPosition({ position: props.controlsPosition }),\n  ...(props.controlsOverlayProps?.style as CSSProperties | undefined),\n}));\n\nconst controlsOverlayRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.controlsOverlayProps ?? {};\n  return rest;\n});\n\nconst audioButtonRestAttrs = computed(() => {\n  const { class: _class, style: _style, onClick: _onClick, type: _type, ...rest } =\n    props.controlButtonProps?.audio ?? {};\n  return rest;\n});\n\nconst audioButtonClassNames = computed(() => {\n  const baseClass = 'mediasfu-audio-card__control-button';\n  const classes = props.controlButtonProps?.audio?.class;\n  if (!classes) {\n    return baseClass;\n  }\n  return [baseClass, classes];\n});\n\nconst audioButtonMergedStyle = computed<CSSProperties>(() => ({\n  ...controlButtonStyle,\n  ...(props.controlButtonProps?.audio?.style as CSSProperties | undefined),\n}));\n\nconst normalizeButtonType = (value?: string): 'button' | 'submit' | 'reset' | undefined => {\n  if (value === undefined) {\n    return undefined;\n  }\n  const allowed: Array<'button' | 'submit' | 'reset'> = ['button', 'submit', 'reset'];\n  return allowed.includes(value as typeof allowed[number])\n    ? (value as 'button' | 'submit' | 'reset')\n    : 'button';\n};\n\nconst audioButtonType = computed<'button' | 'submit' | 'reset' | undefined>(() =>\n  normalizeButtonType(props.controlButtonProps?.audio?.type)\n);\n\nconst videoButtonRestAttrs = computed(() => {\n  const { class: _class, style: _style, onClick: _onClick, type: _type, ...rest } =\n    props.controlButtonProps?.video ?? {};\n  return rest;\n});\n\nconst videoButtonClassNames = computed(() => {\n  const baseClass = 'mediasfu-audio-card__control-button';\n  const classes = props.controlButtonProps?.video?.class;\n  if (!classes) {\n    return baseClass;\n  }\n  return [baseClass, classes];\n});\n\nconst videoButtonMergedStyle = computed<CSSProperties>(() => ({\n  ...controlButtonStyle,\n  ...(props.controlButtonProps?.video?.style as CSSProperties | undefined),\n}));\n\nconst videoButtonType = computed<'button' | 'submit' | 'reset' | undefined>(() =>\n  normalizeButtonType(props.controlButtonProps?.video?.type)\n);\n\nconst imageRestAttrs = computed<ImgHTMLAttributes>(() => {\n  const { style: _style, ...rest } = props.imageProps ?? {};\n  return rest;\n});\n\nconst imageMergedStyle = computed<CSSProperties>(() => ({\n  ...backgroundImageStyle,\n  ...(props.roundedImage ? { borderRadius: '20%' } : {}),\n  ...(props.imageStyle ?? {}),\n  ...(props.imageProps?.style as CSSProperties | undefined),\n}));\n\nconst miniCardBaseProps = computed<MiniCardComponentProps>(() => ({\n  initials: props.name,\n  fontSize: 20,\n  customStyle: {\n    border:\n      (latestParametersSnapshot.value.eventType ?? props.parameters.eventType) !== 'broadcast'\n        ? '2px solid black'\n        : '0px solid black',\n  },\n}));\n\nconst miniCardProps = computed<MiniCardComponentProps>(() => ({\n  ...miniCardBaseProps.value,\n  ...(props.fallbackMiniCardProps ?? {}),\n  customStyle: {\n    ...(miniCardBaseProps.value.customStyle as CSSProperties | undefined),\n    ...(props.fallbackMiniCardProps?.customStyle as CSSProperties | undefined),\n  },\n}));\n\nconst waveformBarDescriptors = computed(() =>\n  waveformAnimations.value.map((animation, index) => {\n    const isActive = animation === 1;\n    const height = isActive ? activeHeight.value : silentHeight.value;\n    const style: CSSProperties = {\n      ...waveformBarMergedStyle.value,\n      height,\n      backgroundColor: props.barColor,\n    };\n\n    const baseProps: Record<string, unknown> = {\n      ...waveformBarRestAttrs.value,\n      class: waveformBarClassNames.value,\n      style,\n    };\n\n    const customNode = props.renderWaveformBar\n      ? props.renderWaveformBar({\n          index,\n          isActive,\n          height,\n          style,\n          props: baseProps,\n        })\n      : null;\n\n    return {\n      key: index,\n      customNode,\n      component: 'div',\n      props: baseProps,\n    };\n  })\n);\n\nconst audioButtonExternalOnClick = computed(() => props.controlButtonProps?.audio?.onClick);\nconst videoButtonExternalOnClick = computed(() => props.controlButtonProps?.video?.onClick);\n\nconst handleAudioButtonClick = async (event: MouseEvent) => {\n  audioButtonExternalOnClick.value?.(event);\n  if (event.defaultPrevented) {\n    return;\n  }\n  await toggleAudio();\n};\n\nconst handleVideoButtonClick = async (event: MouseEvent) => {\n  videoButtonExternalOnClick.value?.(event);\n  if (event.defaultPrevented) {\n    return;\n  }\n  await toggleVideo();\n};\n\nconst audioIconNode = computed<VNodeChild>(() =>\n  props.participant?.muted\n    ? props.audioDisabledIcon ?? h(FontAwesomeIcon, { icon: faMicrophoneSlash, size: 'sm', color: 'red' })\n    : props.audioEnabledIcon ?? h(FontAwesomeIcon, { icon: faMicrophone, size: 'sm', color: 'green' })\n);\n\nconst videoIconNode = computed<VNodeChild>(() =>\n  props.participant?.videoOn\n    ? props.videoEnabledIcon ?? h(FontAwesomeIcon, { icon: faVideo, size: 'sm', color: 'green' })\n    : props.videoDisabledIcon ?? h(FontAwesomeIcon, { icon: faVideoSlash, size: 'sm', color: 'red' })\n);\n\n</script>\n","/**\n * Vue-native addVideosGrid - adapted from React version\n * Adds participants to the main and alternate video grids\n */\n\nimport VideoCard from '../components/displayComponents/VideoCard.vue';\nimport AudioCard from '../components/displayComponents/AudioCard.vue';\nimport MiniCard from '../components/displayComponents/MiniCard.vue';\nimport type { RenderableComponent } from '../types/renderable-component';\nimport type { \n  Participant, \n  Stream, \n  EventType,\n} from 'mediasfu-shared';\n\nexport interface UpdateMiniCardsGridParameters {\n  getUpdatedAllParams: () => AddVideosGridParameters;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  [key: string]: any;\n}\n\nexport interface AddVideosGridParameters extends UpdateMiniCardsGridParameters {\n  eventType: EventType;\n  updateAddAltGrid: (addAltGrid: boolean) => void;\n  ref_participants: Participant[];\n  islevel: string;\n  videoAlreadyOn: boolean;\n  localStreamVideo: MediaStream | null;\n  keepBackground: boolean;\n  virtualStream: MediaStream | null;\n  forceFullDisplay: boolean;\n  otherGridStreams: RenderableComponent[][];\n  updateOtherGridStreams: (otherGridStreams: RenderableComponent[][]) => void;\n  updateMiniCardsGrid: (options: {\n    rows: number;\n    cols: number;\n    defal: boolean;\n    actualRows: number;\n    parameters: AddVideosGridParameters;\n  }) => Promise<void>;\n\n  // Custom component builders\n  customVideoCard?: unknown;\n  customAudioCard?: unknown;\n  customMiniCard?: unknown;\n\n  // Override-provided components\n  videoCardComponent?: typeof VideoCard;\n  audioCardComponent?: typeof AudioCard;\n  miniCardComponent?: typeof MiniCard;\n\n  getUpdatedAllParams: () => AddVideosGridParameters;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  [key: string]: any;\n}\n\nexport interface AddVideosGridOptions {\n  mainGridStreams: (Stream | Participant)[];\n  altGridStreams: (Stream | Participant)[];\n  numtoadd: number;\n  numRows: number;\n  numCols: number;\n  actualRows: number;\n  lastrowcols: number;\n  removeAltGrid: boolean;\n  parameters: AddVideosGridParameters;\n}\n\nexport type AddVideosGridType = (options: AddVideosGridOptions) => Promise<void>;\n\n/**\n * Adds participants to the main and alternate video grids based on the provided parameters.\n * @param {AddVideosGridOptions} options - The options for adding videos to the grid.\n * @returns {Promise<void>} A promise that resolves when the grid has been updated successfully.\n */\nexport async function addVideosGrid({\n  mainGridStreams,\n  altGridStreams,\n  numtoadd,\n  numRows,\n  numCols,\n  actualRows,\n  lastrowcols,\n  removeAltGrid,\n  parameters,\n}: AddVideosGridOptions): Promise<void> {\n  const { getUpdatedAllParams } = parameters;\n  parameters = getUpdatedAllParams();\n\n  const {\n    eventType,\n    updateAddAltGrid,\n    ref_participants,\n    islevel,\n    videoAlreadyOn,\n    localStreamVideo,\n    keepBackground,\n    virtualStream,\n    forceFullDisplay,\n    otherGridStreams,\n    updateOtherGridStreams,\n    updateMiniCardsGrid,\n    customVideoCard,\n    customAudioCard,\n    customMiniCard,\n    videoCardComponent,\n    audioCardComponent,\n    miniCardComponent,\n  } = parameters;\n\n  const VideoCardComponentOverride = videoCardComponent ?? VideoCard;\n  const AudioCardComponentOverride = audioCardComponent ?? AudioCard;\n  const MiniCardComponentOverride = miniCardComponent ?? MiniCard;\n\n  const newComponents: RenderableComponent[][] = [[], []];\n  let remoteProducerId: string = '';\n\n  numtoadd = mainGridStreams.length;\n\n  if (removeAltGrid) {\n    updateAddAltGrid(false);\n  }\n\n  // Add participants to the main grid\n  for (let i = 0; i < numtoadd; i++) {\n    const participant = mainGridStreams[i];\n    if (!participant) continue;\n    remoteProducerId = (participant as Participant).producerId || '';\n\n    const pseudoName = !remoteProducerId || remoteProducerId === '';\n\n    if (pseudoName) {\n      remoteProducerId = (participant as Participant).name || '';\n\n      if ((participant as Participant).audioID) {\n        const audioCardComponent: RenderableComponent = customAudioCard\n          ? {\n              component: customAudioCard,\n              props: {\n                name: (participant as Participant).name || '',\n                barColor: 'red',\n                textColor: 'white',\n                customStyle: {\n                  backgroundColor: 'transparent',\n                  border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                },\n                controlsPosition: 'topLeft',\n                infoPosition: 'topRight',\n                roundedImage: true,\n                parameters: parameters,\n                backgroundColor: 'transparent',\n                showControls: eventType !== 'chat',\n                participant: participant,\n              },\n              key: `audio-${(participant as Participant).id}`,\n            }\n          : {\n              component: AudioCardComponentOverride,\n              props: {\n                name: (participant as Participant).name || '',\n                barColor: 'red',\n                textColor: 'white',\n                customStyle: {\n                  backgroundColor: 'transparent',\n                  border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                },\n                controlsPosition: 'topLeft',\n                infoPosition: 'topRight',\n                roundedImage: true,\n                parameters: parameters,\n                backgroundColor: 'transparent',\n                showControls: eventType !== 'chat',\n                participant: participant,\n              },\n              key: `audio-${(participant as Participant).id}`,\n            };\n\n        newComponents[0]!.push(audioCardComponent);\n      } else {\n        const miniCardComponent: RenderableComponent = customMiniCard\n          ? {\n              component: customMiniCard,\n              props: {\n                initials: (participant as Participant).name,\n                fontSize: 20,\n                customStyle: {\n                  backgroundColor: 'transparent',\n                  border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                },\n              },\n              key: `mini-${(participant as Participant).id}`,\n            }\n          : {\n              component: MiniCardComponentOverride,\n              props: {\n                initials: (participant as Participant).name,\n                fontSize: 20,\n                customStyle: {\n                  backgroundColor: 'transparent',\n                  border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                },\n              },\n              key: `mini-${(participant as Participant).id}`,\n            };\n\n        newComponents[0]!.push(miniCardComponent);\n      }\n    } else {\n      if (remoteProducerId === 'youyou' || remoteProducerId === 'youyouyou') {\n        let name = 'You';\n        if (islevel === '2' && eventType !== 'chat') {\n          name = 'You (Host)';\n        }\n\n        if (!videoAlreadyOn) {\n          const miniCardComponent: RenderableComponent = customMiniCard\n            ? {\n                component: customMiniCard,\n                props: {\n                  initials: name,\n                  fontSize: 20,\n                  customStyle: {\n                    backgroundColor: 'transparent',\n                    border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                  },\n                },\n                key: 'mini-you',\n              }\n            : {\n                component: MiniCardComponentOverride,\n                props: {\n                  initials: name,\n                  fontSize: 20,\n                  customStyle: {\n                    backgroundColor: 'transparent',\n                    border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                  },\n                },\n                key: 'mini-you',\n              };\n\n          newComponents[0]!.push(miniCardComponent);\n        } else {\n          const videoParticipant = {\n            id: 'youyouyou',\n            stream: keepBackground && virtualStream ? virtualStream : localStreamVideo,\n            name: 'youyouyou',\n          };\n\n          const videoCardComponent: RenderableComponent = customVideoCard\n            ? {\n                component: customVideoCard,\n                props: {\n                  participant: videoParticipant,\n                  stream: videoParticipant.stream || new MediaStream(),\n                  width: 0,\n                  height: 0,\n                  showControls: false,\n                  showInfo: false,\n                  name: videoParticipant.name,\n                  backgroundColor: 'transparent',\n                  parameters: parameters,\n                },\n                key: 'video-you',\n              }\n            : {\n                component: VideoCardComponentOverride,\n                props: {\n                  videoStream: videoParticipant.stream || new MediaStream(),\n                  remoteProducerId: videoParticipant.stream?.id || '',\n                  eventType: eventType,\n                  forceFullDisplay: eventType === 'webinar' ? false : forceFullDisplay,\n                  customStyle: {\n                    border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                  },\n                  participant: videoParticipant,\n                  backgroundColor: 'transparent',\n                  showControls: false,\n                  showInfo: false,\n                  name: videoParticipant.name,\n                  doMirror: true,\n                  parameters: parameters,\n                },\n                key: 'video-you',\n              };\n\n          newComponents[0]!.push(videoCardComponent);\n        }\n      } else {\n        const participant_ = ref_participants.find(\n          (obj: Participant) => obj.videoID === remoteProducerId\n        );\n        if (participant_) {\n          const videoCardComponent: RenderableComponent = customVideoCard\n            ? {\n                component: customVideoCard,\n                props: {\n                  participant: participant_,\n                  stream: (participant as Stream).stream || new MediaStream(),\n                  width: 0,\n                  height: 0,\n                  showControls: eventType !== 'chat',\n                  showInfo: true,\n                  name: participant_.name || '',\n                  backgroundColor: 'transparent',\n                  parameters: parameters,\n                },\n                key: `video-${participant_.id}`,\n              }\n            : {\n                component: VideoCardComponentOverride,\n                props: {\n                  videoStream: (participant as Stream).stream || new MediaStream(),\n                  remoteProducerId: remoteProducerId || '',\n                  eventType: eventType,\n                  forceFullDisplay: forceFullDisplay,\n                  customStyle: {\n                    border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                  },\n                  participant: participant_,\n                  backgroundColor: 'transparent',\n                  showControls: eventType !== 'chat',\n                  showInfo: true,\n                  name: participant_.name || '',\n                  doMirror: false,\n                  parameters: parameters,\n                },\n                key: `video-${participant_.id}`,\n              };\n\n          newComponents[0]!.push(videoCardComponent);\n        }\n      }\n    }\n\n    if (i === numtoadd - 1) {\n      otherGridStreams[0] = newComponents[0]!;\n\n      await updateMiniCardsGrid({\n        rows: numRows,\n        cols: numCols,\n        defal: true,\n        actualRows: actualRows,\n        parameters,\n      });\n\n      updateOtherGridStreams(otherGridStreams);\n\n      await updateMiniCardsGrid({\n        rows: numRows,\n        cols: numCols,\n        defal: true,\n        actualRows: actualRows,\n        parameters,\n      });\n    }\n  }\n\n  // Handle the alternate grid streams\n  if (!removeAltGrid) {\n    for (let i = 0; i < altGridStreams.length; i++) {\n      const participant = altGridStreams[i];\n      if (!participant) continue;\n\n      remoteProducerId = (participant as Participant).producerId || '';\n\n      const pseudoName = !remoteProducerId || remoteProducerId === '';\n\n      if (pseudoName) {\n        if ((participant as Participant).audioID) {\n          const audioCardComponent: RenderableComponent = customAudioCard\n            ? {\n                component: customAudioCard,\n                props: {\n                  name: (participant as Participant).name,\n                  barColor: 'red',\n                  textColor: 'white',\n                  customStyle: {\n                    backgroundColor: 'transparent',\n                    border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                  },\n                  controlsPosition: 'topLeft',\n                  infoPosition: 'topRight',\n                  roundedImage: true,\n                  parameters: parameters,\n                  backgroundColor: 'transparent',\n                  showControls: eventType !== 'chat',\n                  participant: participant,\n                },\n                key: `audio-alt-${(participant as Participant).id}`,\n              }\n            : {\n                component: AudioCardComponentOverride,\n                props: {\n                  name: (participant as Participant).name,\n                  barColor: 'red',\n                  textColor: 'white',\n                  customStyle: {\n                    backgroundColor: 'transparent',\n                    border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                  },\n                  controlsPosition: 'topLeft',\n                  infoPosition: 'topRight',\n                  roundedImage: true,\n                  parameters: parameters,\n                  backgroundColor: 'transparent',\n                  showControls: eventType !== 'chat',\n                  participant: participant,\n                },\n                key: `audio-alt-${(participant as Participant).id}`,\n              };\n\n          newComponents[1]!.push(audioCardComponent);\n        } else {\n          const miniCardComponent: RenderableComponent = customMiniCard\n            ? {\n                component: customMiniCard,\n                props: {\n                  initials: (participant as Participant).name,\n                  fontSize: 20,\n                  customStyle: {\n                    backgroundColor: 'transparent',\n                    border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                  },\n                },\n                key: `mini-alt-${(participant as Participant).id}`,\n              }\n            : {\n                component: MiniCardComponentOverride,\n                props: {\n                  initials: (participant as Participant).name,\n                  fontSize: 20,\n                  customStyle: {\n                    backgroundColor: 'transparent',\n                    border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                  },\n                },\n                key: `mini-alt-${(participant as Participant).id}`,\n              };\n\n          newComponents[1]!.push(miniCardComponent);\n        }\n      } else {\n        const participant_ = ref_participants.find(\n          (obj: Participant) => obj.videoID === remoteProducerId\n        );\n        if (participant_) {\n          const videoCardComponent: RenderableComponent = customVideoCard\n            ? {\n                component: customVideoCard,\n                props: {\n                  participant: participant_,\n                  stream: (participant as Stream).stream || new MediaStream(),\n                  width: 0,\n                  height: 0,\n                  showControls: eventType !== 'chat',\n                  showInfo: true,\n                  name: (participant as Participant).name,\n                  backgroundColor: 'transparent',\n                  parameters: parameters,\n                },\n                key: `video-alt-${participant_.id}`,\n              }\n            : {\n                component: VideoCardComponentOverride,\n                props: {\n                  videoStream: (participant as Stream).stream || new MediaStream(),\n                  remoteProducerId: remoteProducerId || '',\n                  eventType: eventType,\n                  forceFullDisplay: forceFullDisplay,\n                  customStyle: {\n                    border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                  },\n                  participant: participant_,\n                  backgroundColor: 'transparent',\n                  showControls: eventType !== 'chat',\n                  showInfo: true,\n                  name: (participant as Participant).name,\n                  doMirror: false,\n                  parameters: parameters,\n                },\n                key: `video-alt-${participant_.id}`,\n              };\n\n          newComponents[1]!.push(videoCardComponent);\n        }\n      }\n\n      if (i === altGridStreams.length - 1) {\n        otherGridStreams[1] = newComponents[1]!;\n\n        await updateMiniCardsGrid({\n          rows: 1,\n          cols: lastrowcols,\n          defal: false,\n          actualRows: actualRows,\n          parameters,\n        });\n\n        updateOtherGridStreams(otherGridStreams);\n\n        await updateMiniCardsGrid({\n          rows: numRows,\n          cols: numCols,\n          defal: true,\n          actualRows: actualRows,\n          parameters,\n        });\n      }\n    }\n  } else {\n    updateAddAltGrid(false);\n    otherGridStreams[1] = [];\n\n    await updateMiniCardsGrid({\n      rows: 0,\n      cols: 0,\n      defal: false,\n      actualRows: actualRows,\n      parameters,\n    });\n\n    updateOtherGridStreams(otherGridStreams);\n\n    await updateMiniCardsGrid({\n      rows: numRows,\n      cols: numCols,\n      defal: true,\n      actualRows: actualRows,\n      parameters,\n    });\n  }\n}\n","<!--\n/**\n * @fileoverview MiniAudio - Draggable floating audio card with waveform animation\n * @component MiniAudio\n * @module components/displayComponents/MiniAudio\n * \n * @description\n * A draggable floating audio card that displays participant name, avatar, and animated\n * waveform visualization. Used for audio-only participants or when a user wants a\n * compact audio overlay. Features smooth dragging with bounds checking and automatic\n * waveform animation synchronized with speaking activity.\n * \n * Features:\n * - Fully draggable with mouse/touch support\n * - Animated waveform visualization (9 bars with randomized timing)\n * - Optional profile image or fallback background\n * - Participant name overlay with configurable position\n * - Visibility toggle support\n * - Automatic bounds checking (stays within viewport)\n * - Custom render functions for all major sections\n * - Full HTML attribute passthrough\n * - Rounded image option\n * \n * Dragging Behavior:\n * - Click/touch and drag to reposition\n * - Automatic bounds checking prevents dragging off-screen\n * - Position maintained across visibility toggles\n * - Smooth drag experience with offset calculation\n * \n * Waveform Animation:\n * - 9 bars with independent animation timings (400-487ms cycles)\n * - Bars animate between 1px (inactive) and 16px (active) heights\n * - Continuous animation when showWaveform=true\n * - All timers automatically cleaned up on unmount\n * \n * @example Basic Draggable Audio Card\n * // <MiniAudio\n *   // name=\"Jane Doe\"\n *   // imageSource=\"https://example.com/avatar.jpg\"\n *   // :showWaveform=\"true\"\n * // />\n * \n * @example With Custom Colors\n * // <MiniAudio\n *   // name=\"John Smith\"\n *   // imageSource=\"https://example.com/avatar2.jpg\"\n *   // :showWaveform=\"true\"\n *   // barColor=\"#22c55e\"\n *   // textColor=\"#ffffff\"\n * // />\n * \n * @example Custom Styled with Rounded Image\n * // <MiniAudio\n *   // name=\"Alex Johnson\"\n *   // imageSource=\"https://example.com/avatar3.jpg\"\n *   // :roundedImage=\"true\"\n *   // :showWaveform=\"true\"\n *   // :customStyle=\"{ \n *     backgroundColor: 'rgba(0,0,0,0.85)', \n *     borderRadius: '12px',\n *     border: '2px solid #3b82f6'\n *   }\"\n *   // barColor=\"#3b82f6\"\n *   // textColor=\"#fff\"\n * // />\n * \n * @example Conditionally Visible\n * // <MiniAudio\n *   // name=\"Sarah Williams\"\n *   // imageSource=\"https://example.com/avatar4.jpg\"\n *   // :visible=\"isAudioOnlyMode\"\n *   // :showWaveform=\"isSpeaking\"\n *   // overlayPosition=\"topRight\"\n * // />\n * \n * @example Custom Card Renderer\n * // <MiniAudio\n *   // name=\"Mike Brown\"\n *   // imageSource=\"https://example.com/avatar5.jpg\"\n *   // :showWaveform=\"true\"\n *   // :renderCard=\"({ defaultCard, hasImage }) =>\n *     h('div', {\n *       class: 'custom-audio-card',\n *       style: {\n *         background: hasImage \n *           ? 'transparent' \n *           : 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)',\n *         borderRadius: '16px',\n *         overflow: 'hidden'\n *       }\n *     }, [defaultCard])\n *   \"\n * // />\n * \n * @remarks\n * The component automatically handles waveform animation lifecycle - starting animations\n * when showWaveform=true and cleaning up all timers on unmount. Position state is\n * maintained across visibility toggles, so the card returns to its last position when\n * made visible again.\n * \n * Workflow:\n * 1. Component mounts → Initializes position (default: { x: 0, y: 0 })\n * 2. showWaveform=true → Starts 9 independent waveform bar animations\n * 3. User drags card → Updates position with bounds checking\n * 4. showWaveform=false → Stops animations, resets bars to 1px height\n * 5. Component unmounts → Cleans up all animation timers\n * \n * @see {@link MiniCardAudio} - Static (non-draggable) version for grid layouts\n * @see {@link AudioCard} - Full-featured audio card with controls\n */\n-->\n<template>\n  <RenderVNode :node=\"wrapperNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  ref,\n  computed,\n  watch,\n  onUnmounted,\n  defineComponent,\n  h,\n  isVNode,\n  type CSSProperties,\n  type HTMLAttributes,\n  type ImgHTMLAttributes,\n  type PropType,\n  type VNode,\n  type VNodeChild,\n} from 'vue';\nimport { getOverlayPosition } from '@legacy/methods/utils/getOverlayPosition';\n\n/**\n * Options passed to renderWrapper function\n * @interface RenderWrapperOptions\n * @property {VNode} defaultWrapper - The default wrapper VNode with visibility control\n * @property {boolean} isVisible - Whether the component is currently visible\n */\ninterface RenderWrapperOptions {\n  defaultWrapper: VNode;\n  isVisible: boolean;\n}\n\n/**\n * Options passed to renderContainer function\n * @interface RenderContainerOptions\n * @property {VNode} defaultContainer - The default draggable container VNode\n * @property {boolean} isDragging - Whether the component is currently being dragged\n * @property {{ x: number; y: number }} position - Current position of the draggable element\n */\ninterface RenderContainerOptions {\n  defaultContainer: VNode;\n  isDragging: boolean;\n  position: { x: number; y: number };\n}\n\n/**\n * Options passed to renderCard function\n * @interface RenderCardOptions\n * @property {VNode} defaultCard - The default card VNode with image and overlay\n * @property {boolean} hasImage - Whether an image source is provided\n */\ninterface RenderCardOptions {\n  defaultCard: VNode;\n  hasImage: boolean;\n}\n\n/**\n * Options passed to renderWaveform function\n * @interface RenderWaveformOptions\n * @property {VNode} defaultWaveform - The default waveform VNode with animated bars\n * @property {boolean} showWaveform - Whether waveform animation is enabled\n * @property {number[]} animations - Array of current animation heights (0 or 1) for each bar\n */\ninterface RenderWaveformOptions {\n  defaultWaveform: VNode;\n  showWaveform: boolean;\n  animations: number[];\n}\n\n/**\n * Props for the MiniAudio component\n * @interface MiniAudioProps\n * \n * @property {boolean} [visible=true] - Whether the component is visible\n * @property {CSSProperties} [customStyle] - Custom CSS styles for the card\n * @property {string} name - Participant name to display\n * @property {boolean} [showWaveform=false] - Whether to show animated waveform\n * @property {string} [overlayPosition] - Position for name overlay (e.g., 'topLeft', 'bottomRight')\n * @property {string} [barColor='red'] - Color for waveform bars\n * @property {string} [textColor='white'] - Color for participant name text\n * @property {CSSProperties} [nameTextStyling] - Custom CSS styles for name text\n * @property {string} imageSource - URL for profile image or background\n * @property {boolean} [roundedImage=false] - Whether to apply rounded corners to image\n * @property {CSSProperties} [imageStyle] - Custom CSS styles for image\n * @property {HTMLAttributes} [wrapperProps] - Additional HTML attributes for wrapper\n * @property {HTMLAttributes} [draggableContainerProps] - Additional HTML attributes for draggable container\n * @property {HTMLAttributes} [cardProps] - Additional HTML attributes for card\n * @property {HTMLAttributes} [overlayProps] - Additional HTML attributes for overlay\n * @property {HTMLAttributes} [waveformContainerProps] - Additional HTML attributes for waveform container\n * @property {HTMLAttributes} [barProps] - Additional HTML attributes for each waveform bar\n * @property {HTMLAttributes} [nameContainerProps] - Additional HTML attributes for name container\n * @property {HTMLAttributes} [nameTextProps] - Additional HTML attributes for name text\n * @property {ImgHTMLAttributes} [imageProps] - Additional HTML attributes for image element\n * @property {(options: RenderWrapperOptions) => VNodeChild} [renderWrapper] - Custom render function for wrapper\n * @property {(options: RenderContainerOptions) => VNodeChild} [renderContainer] - Custom render function for draggable container\n * @property {(options: RenderCardOptions) => VNodeChild} [renderCard] - Custom render function for card\n * @property {(options: RenderWaveformOptions) => VNodeChild} [renderWaveform] - Custom render function for waveform\n * \n * @default visible - true\n * @default showWaveform - false\n * @default barColor - 'red'\n * @default textColor - 'white'\n * @default roundedImage - false\n * \n * @example\n * ```typescript\n * // <MiniAudio\n *   // name=\"Jane Smith\"\n *   // imageSource=\"https://example.com/avatar.jpg\"\n *   // :visible=\"true\"\n *   // :showWaveform=\"true\"\n *   // :roundedImage=\"true\"\n *   // barColor=\"#22c55e\"\n *   // textColor=\"#ffffff\"\n *   // overlayPosition=\"bottomLeft\"\n * // />\n * ```\n */\nexport interface MiniAudioProps {\n  visible?: boolean;\n  customStyle?: CSSProperties;\n  name: string;\n  showWaveform?: boolean;\n  overlayPosition?: string;\n  barColor?: string;\n  textColor?: string;\n  nameTextStyling?: CSSProperties;\n  imageSource: string;\n  roundedImage?: boolean;\n  imageStyle?: CSSProperties;\n  wrapperProps?: HTMLAttributes;\n  draggableContainerProps?: HTMLAttributes;\n  cardProps?: HTMLAttributes;\n  overlayProps?: HTMLAttributes;\n  waveformContainerProps?: HTMLAttributes;\n  barProps?: HTMLAttributes;\n  nameContainerProps?: HTMLAttributes;\n  nameTextProps?: HTMLAttributes;\n  imageProps?: ImgHTMLAttributes;\n  renderWrapper?: (options: RenderWrapperOptions) => VNodeChild;\n  renderContainer?: (options: RenderContainerOptions) => VNodeChild;\n  renderCard?: (options: RenderCardOptions) => VNodeChild;\n  renderWaveform?: (options: RenderWaveformOptions) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<MiniAudioProps>(), {\n  visible: true,\n  customStyle: undefined,\n  showWaveform: false,\n  overlayPosition: undefined,\n  barColor: 'red',\n  textColor: 'white',\n  nameTextStyling: undefined,\n  roundedImage: false,\n  imageStyle: undefined,\n  wrapperProps: () => ({}),\n  draggableContainerProps: () => ({}),\n  cardProps: () => ({}),\n  overlayProps: () => ({}),\n  waveformContainerProps: () => ({}),\n  barProps: () => ({}),\n  nameContainerProps: () => ({}),\n  nameTextProps: () => ({}),\n  imageProps: () => ({}),\n  renderWrapper: undefined,\n  renderContainer: undefined,\n  renderCard: undefined,\n  renderWaveform: undefined,\n});\n\nconst WAVEFORM_DURATIONS = [474, 433, 407, 458, 400, 427, 441, 419, 487];\n\nconst waveformAnimations = ref<number[]>(\n  Array.from({ length: WAVEFORM_DURATIONS.length }, () => 0)\n);\nconst intervals = ref<number[]>([]);\nconst timeouts = ref<number[]>([]);\nconst isDragging = ref(false);\nconst position = ref({ x: 0, y: 0 });\nconst dragOffset = ref({ x: 0, y: 0 });\n\n// Wrapper component for flexible VNodeChild rendering\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Boolean, Array] as PropType<VNodeChild>,\n      default: undefined,\n    },\n  },\n  render() {\n    if (isVNode(this.node)) {\n      return this.node;\n    }\n    if (typeof this.node === 'string' || typeof this.node === 'number') {\n      return String(this.node);\n    }\n    return null;\n  },\n});\n\n// Helper to join class names\nfunction joinClassNames(...classes: (string | string[] | undefined)[]): string | undefined {\n  const result: string[] = [];\n  classes.forEach((cls) => {\n    if (!cls) return;\n    if (Array.isArray(cls)) {\n      result.push(...cls);\n    } else {\n      result.push(cls);\n    }\n  });\n  const filtered = result.join(' ').trim();\n  return filtered.length > 0 ? filtered : undefined;\n}\n\nconst getAnimationDuration = (index: number): number => {\n  return WAVEFORM_DURATIONS[index] ?? 0;\n};\n\nconst clearIntervals = () => {\n  intervals.value.forEach(clearInterval);\n  intervals.value = [];\n};\n\nconst clearTimeouts = () => {\n  timeouts.value.forEach(clearTimeout);\n  timeouts.value = [];\n};\n\nconst resetWaveform = () => {\n  waveformAnimations.value = Array.from({ length: WAVEFORM_DURATIONS.length }, () => 0);\n  clearIntervals();\n  clearTimeouts();\n};\n\nconst animateBar = (index: number) => {\n  waveformAnimations.value[index] = 1;\n  \n  const timeoutId = window.setTimeout(() => {\n    waveformAnimations.value[index] = 0;\n  }, getAnimationDuration(index));\n\n  timeouts.value.push(timeoutId);\n};\n\nwatch(\n  () => props.showWaveform,\n  (newValue) => {\n    if (!newValue) {\n      resetWaveform();\n      return;\n    }\n\n    clearIntervals();\n    clearTimeouts();\n\n    intervals.value = Array.from({ length: WAVEFORM_DURATIONS.length }, (_, index) =>\n      window.setInterval(() => {\n        animateBar(index);\n      }, getAnimationDuration(index) * 2)\n    );\n  },\n  { immediate: true }\n);\n\nonUnmounted(() => {\n  resetWaveform();\n});\n\nconst handleMouseDown = (e: MouseEvent) => {\n  isDragging.value = true;\n  dragOffset.value = {\n    x: e.clientX - position.value.x,\n    y: e.clientY - position.value.y,\n  };\n};\n\nconst handleMouseMove = (e: MouseEvent) => {\n  if (isDragging.value) {\n    position.value = {\n      x: e.clientX - dragOffset.value.x,\n      y: e.clientY - dragOffset.value.y,\n    };\n  }\n};\n\nconst handleMouseUp = () => {\n  isDragging.value = false;\n};\n\nwatch(isDragging, (newValue) => {\n  if (newValue) {\n    document.addEventListener('mouseup', handleMouseUp);\n  } else {\n    document.removeEventListener('mouseup', handleMouseUp);\n  }\n});\n\nonUnmounted(() => {\n  document.removeEventListener('mouseup', handleMouseUp);\n});\n\n// =========================\n// Styles\n// =========================\nconst styles: Record<string, CSSProperties> = {\n  modalContainer: {\n    position: 'absolute',\n    top: 0,\n    right: 0,\n    padding: 0,\n    margin: 0,\n    width: '100px',\n    height: '100px',\n    justifyContent: 'center',\n    alignItems: 'center',\n    backgroundColor: 'rgba(0, 45, 33, 0.5)',\n    zIndex: 8,\n  },\n  card: {\n    width: '100%',\n    height: '100%',\n    margin: 0,\n    padding: 0,\n    backgroundColor: '#2c678f',\n    position: 'relative',\n  },\n  overlayWeb: {\n    position: 'absolute',\n    minWidth: '100%',\n    height: '100%',\n    maxHeight: '100%',\n    display: 'grid',\n    gridTemplateColumns: '1fr 12fr 1fr',\n    gridGap: '3px',\n  },\n  nameText: {\n    fontSize: '20px',\n    color: 'white',\n    fontWeight: 'bold',\n    justifyContent: 'center',\n    alignItems: 'center',\n    alignSelf: 'center',\n    backgroundColor: 'rgba(0, 0, 0, 0.5)',\n    width: '100%',\n    display: 'flex',\n    paddingTop: '5px',\n    paddingBottom: '5px',\n    textAlign: 'center',\n  },\n  waveformWeb: {\n    display: 'flex',\n    justifyContent: 'flex-start',\n    alignItems: 'center',\n    backgroundColor: 'rgba(0, 0, 0, 0.05)',\n    padding: 0,\n    flexDirection: 'row',\n  },\n  bar: {\n    flex: 1,\n    opacity: 0.35,\n    marginRight: '0.5px',\n  },\n  backgroundImage: {\n    position: 'absolute',\n    width: '70px',\n    height: '70px',\n    justifyContent: 'center',\n    alignItems: 'center',\n    alignSelf: 'center',\n    top: '40%',\n    left: '50%',\n    transform: 'translate(-35px, -10px)',\n  },\n  roundedImage: {\n    borderRadius: '20px',\n  },\n};\n\n// =========================\n// Props Merging & Computed\n// =========================\nconst overlayPositionStyles = computed(() => {\n  if (!props.overlayPosition) {\n    return undefined;\n  }\n  return getOverlayPosition({ position: props.overlayPosition });\n});\n\n// Wrapper Props\nconst wrapperRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.wrapperProps || {};\n  return rest;\n});\n\nconst wrapperClassNames = computed(() =>\n  joinClassNames('mediasfu-mini-audio__wrapper', props.wrapperProps?.class)\n);\n\nconst wrapperStyle = computed(() => ({\n  display: props.visible ? 'block' : 'none',\n  ...(typeof props.wrapperProps?.style === 'object' ? props.wrapperProps.style : {}),\n} as CSSProperties));\n\n// Draggable Container Props\nconst draggableRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.draggableContainerProps || {};\n  return rest;\n});\n\nconst draggableClassNames = computed(() =>\n  joinClassNames('mediasfu-mini-audio__draggable', props.draggableContainerProps?.class)\n);\n\nconst draggableStyle = computed(() => ({\n  transform: `translate(${position.value.x}px, ${position.value.y}px)`,\n  ...styles.modalContainer,\n  ...(typeof props.draggableContainerProps?.style === 'object'\n    ? props.draggableContainerProps.style\n    : {}),\n} as CSSProperties));\n\n// Card Props\nconst cardRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.cardProps || {};\n  return rest;\n});\n\nconst cardClassNames = computed(() =>\n  joinClassNames('mediasfu-mini-audio__card', props.cardProps?.class)\n);\n\nconst cardStyle = computed(() => ({\n  ...styles.card,\n  ...props.customStyle,\n  ...(typeof props.cardProps?.style === 'object' ? props.cardProps.style : {}),\n} as CSSProperties));\n\n// Overlay Props\nconst overlayRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.overlayProps || {};\n  return rest;\n});\n\nconst overlayClassNames = computed(() =>\n  joinClassNames('mediasfu-mini-audio__overlay', props.overlayProps?.class)\n);\n\nconst overlayStyle = computed(() => ({\n  ...styles.overlayWeb,\n  ...overlayPositionStyles.value,\n  ...(typeof props.overlayProps?.style === 'object' ? props.overlayProps.style : {}),\n  display: props.showWaveform ? 'grid' : 'none',\n} as CSSProperties));\n\n// Waveform Container Props\nconst waveformRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.waveformContainerProps || {};\n  return rest;\n});\n\nconst waveformClassNames = computed(() =>\n  joinClassNames('mediasfu-mini-audio__waveform', props.waveformContainerProps?.class)\n);\n\nconst waveformStyle = computed(() => ({\n  ...styles.waveformWeb,\n  ...(typeof props.waveformContainerProps?.style === 'object'\n    ? props.waveformContainerProps.style\n    : {}),\n} as CSSProperties));\n\n// Bar Props\nconst barRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.barProps || {};\n  return rest;\n});\n\nconst barClassNames = computed(() =>\n  joinClassNames('mediasfu-mini-audio__bar', props.barProps?.class)\n);\n\n// Name Container Props\nconst nameContainerRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.nameContainerProps || {};\n  return rest;\n});\n\nconst nameContainerClassNames = computed(() =>\n  joinClassNames('mediasfu-mini-audio__name-container', props.nameContainerProps?.class)\n);\n\nconst nameContainerStyle = computed(() => ({\n  ...styles.nameText,\n  color: props.textColor,\n  ...props.nameTextStyling,\n  ...(typeof props.nameContainerProps?.style === 'object' ? props.nameContainerProps.style : {}),\n} as CSSProperties));\n\n// Name Text Props\nconst nameTextRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.nameTextProps || {};\n  return rest;\n});\n\nconst nameTextClassNames = computed(() =>\n  joinClassNames('mediasfu-mini-audio__name-text', props.nameTextProps?.class)\n);\n\nconst nameTextStyle = computed(() => ({\n  ...(typeof props.nameTextProps?.style === 'object' ? props.nameTextProps.style : {}),\n} as CSSProperties));\n\n// =========================\n// Render Nodes\n// =========================\nconst hasImage = computed(() => Boolean(props.imageSource));\n\nconst imageElement = computed(() => {\n  if (!hasImage.value) return null;\n\n  return h('img', {\n    src: props.imageSource,\n    alt: props.imageProps?.alt ?? 'Background',\n    style: {\n      ...styles.backgroundImage,\n      ...(props.roundedImage ? styles.roundedImage : undefined),\n      ...props.imageStyle,\n      ...(typeof props.imageProps?.style === 'object' ? props.imageProps.style : {}),\n    } as CSSProperties,\n    ...props.imageProps,\n  });\n});\n\nconst nameContent = computed(() =>\n  h(\n    'div',\n    {\n      class: nameContainerClassNames.value,\n      style: nameContainerStyle.value,\n      ...nameContainerRestAttrs.value,\n    },\n    [\n      h(\n        'span',\n        {\n          class: nameTextClassNames.value,\n          style: nameTextStyle.value,\n          ...nameTextRestAttrs.value,\n        },\n        props.name\n      ),\n    ]\n  )\n);\n\nconst bars = computed(() =>\n  waveformAnimations.value.map((animation, index) =>\n    h('div', {\n      key: index,\n      class: barClassNames.value,\n      style: {\n        ...styles.bar,\n        height: animation === 0 ? 1 : 30,\n        width: 10,\n        backgroundColor: props.barColor,\n        ...(typeof props.barProps?.style === 'object' ? props.barProps.style : {}),\n      } as CSSProperties,\n      ...barRestAttrs.value,\n    })\n  )\n);\n\nconst defaultWaveform = computed(() =>\n  h(\n    'div',\n    {\n      class: waveformClassNames.value,\n      style: waveformStyle.value,\n      ...waveformRestAttrs.value,\n    },\n    bars.value\n  )\n);\n\nconst waveformNode = computed(() => {\n  if (props.renderWaveform) {\n    const result = props.renderWaveform({\n      defaultWaveform: defaultWaveform.value,\n      showWaveform: props.showWaveform ?? false,\n      animations: waveformAnimations.value,\n    });\n    if (isVNode(result)) return result;\n  }\n  return defaultWaveform.value;\n});\n\nconst defaultCard = computed(() =>\n  h(\n    'div',\n    {\n      class: cardClassNames.value,\n      style: cardStyle.value,\n      ...cardRestAttrs.value,\n    },\n    [\n      imageElement.value,\n      nameContent.value,\n      h(\n        'div',\n        {\n          class: overlayClassNames.value,\n          style: overlayStyle.value,\n          ...overlayRestAttrs.value,\n        },\n        [waveformNode.value]\n      ),\n    ]\n  )\n);\n\nconst cardNode = computed(() => {\n  if (props.renderCard) {\n    const result = props.renderCard({\n      defaultCard: defaultCard.value,\n      hasImage: hasImage.value,\n    });\n    if (isVNode(result)) return result;\n  }\n  return defaultCard.value;\n});\n\nconst defaultContainer = computed(() =>\n  h(\n    'div',\n    {\n      class: draggableClassNames.value,\n      style: draggableStyle.value,\n      onMousedown: handleMouseDown,\n      onMousemove: handleMouseMove,\n      ...draggableRestAttrs.value,\n    },\n    [cardNode.value]\n  )\n);\n\nconst containerNode = computed(() => {\n  if (props.renderContainer) {\n    const result = props.renderContainer({\n      defaultContainer: defaultContainer.value,\n      isDragging: isDragging.value,\n      position: position.value,\n    });\n    if (isVNode(result)) return result;\n  }\n  return defaultContainer.value;\n});\n\nconst wrapperNode = computed(() => {\n  const defaultWrapper = h(\n    'div',\n    {\n      class: wrapperClassNames.value,\n      style: wrapperStyle.value,\n      ...wrapperRestAttrs.value,\n    },\n    [containerNode.value]\n  );\n\n  if (props.renderWrapper) {\n    const result = props.renderWrapper({\n      defaultWrapper,\n      isVisible: props.visible,\n    });\n    if (isVNode(result)) return result;\n  }\n  return defaultWrapper;\n});\n</script>\n\n<style scoped>\n/* Component-specific styles */\n</style>\n","<template>\n  <div :style=\"containerStyle\">\n    <audio\n      v-if=\"streamRef\"\n      ref=\"audioRef\"\n      autoplay\n      playsinline\n    />\n    <component\n      :is=\"resolvedMiniAudioComponent\"\n      v-if=\"showMiniAudio && resolvedMiniAudioComponent\"\n      v-bind=\"resolvedMiniAudioProps\"\n    />\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onBeforeUnmount, nextTick, type CSSProperties, type Component } from 'vue';\nimport MiniAudio from '../../../components/displayComponents/MiniAudio.vue';\nimport type { Consumer } from 'mediasoup-client';\nimport type { BreakoutParticipant, Participant } from '../../../../../SharedTypes';\n\ninterface MiniAudioPlayerParameters {\n  breakOutRoomStarted: boolean;\n  breakOutRoomEnded: boolean;\n  limitedBreakRoom: BreakoutParticipant[];\n  reUpdateInter?: (options: Record<string, unknown>) => void | Promise<void>;\n  updateParticipantAudioDecibels?: (options: Record<string, unknown>) => void;\n  getUpdatedAllParams: () => MiniAudioPlayerParameters & Record<string, unknown>;\n  updateActiveSounds?: (sounds: string[]) => void;\n  miniAudioComponent?: Component;\n  [key: string]: unknown;\n}\n\nexport interface MiniAudioPlayerProps {\n  stream: MediaStream | null;\n  remoteProducerId: string;\n  consumer: Consumer;\n  parameters: MiniAudioPlayerParameters;\n  miniAudioComponent?: Component | null;\n  miniAudioProps?: Record<string, unknown>;\n}\n\nconst props = withDefaults(defineProps<MiniAudioPlayerProps>(), {\n  stream: null,\n  miniAudioComponent: null,\n  miniAudioProps: () => ({}),\n});\n\nconst audioRef = ref<HTMLAudioElement | null>(null);\nconst showWaveModal = ref(false);\nconst isMuted = ref(false);\nconst autoWaveCheck = ref(false);\n\n// Resolve miniAudioComponent from props or parameters\nconst parameterMiniAudioComponent = computed<Component | undefined>(\n  () => props.parameters.miniAudioComponent as Component | undefined\n);\n\nconst resolvedMiniAudioComponent = computed<Component | null>(\n  () => props.miniAudioComponent ?? parameterMiniAudioComponent.value ?? MiniAudio\n);\n\nconst resolvedMiniAudioProps = computed<Record<string, unknown>>(() => ({\n  ...(props.miniAudioProps ?? {}),\n  showWaveform: showWaveModal.value,\n  visible: showWaveModal.value && !isMuted.value,\n}));\n\nconst showMiniAudio = computed(() => showWaveModal.value && !isMuted.value && resolvedMiniAudioComponent.value);\nconst streamRef = computed(() => props.stream);\n\nconst containerStyle: CSSProperties = {\n  display: 'flex',\n  justifyContent: 'center',\n  alignItems: 'center',\n  zIndex: 9,\n};\n\nlet intervalId: number | null = null;\n\nconst stopMonitoring = () => {\n  if (intervalId !== null) {\n    window.clearInterval(intervalId);\n    intervalId = null;\n  }\n};\n\nconst setAudioSource = (stream: MediaStream | null) => {\n  nextTick(() => {\n    const element = audioRef.value;\n    if (!element) {\n      return;\n    }\n    element.srcObject = stream;\n    if (stream) {\n      const playPromise = element.play?.();\n      if (playPromise instanceof Promise) {\n        playPromise.catch(() => {\n          /* ignore autoplay rejection */\n        });\n      }\n    }\n  });\n};\n\nconst startMonitoring = () => {\n  stopMonitoring();\n  if (!props.stream) {\n    return;\n  }\n\n  const baseParams = props.parameters;\n  let consLow = false;\n\n  intervalId = window.setInterval(async () => {\n    let averageLoudness = 128;\n\n    try {\n      const receiver = props.consumer?.rtpReceiver;\n      const stats = await receiver?.getStats?.();\n      stats?.forEach((report) => {\n        const stat = report as { type?: string; kind?: string; audioLevel?: number };\n        if (stat.type === 'inbound-rtp' && stat.kind === 'audio' && typeof stat.audioLevel === 'number') {\n          averageLoudness = 127.5 + stat.audioLevel * 127.5;\n        }\n      });\n    } catch {\n      /* stats unavailable */\n    }\n\n    const updatedParams = baseParams.getUpdatedAllParams?.() ?? baseParams;\n    const {\n      eventType,\n      meetingDisplayType,\n      shared,\n      shareScreenStarted,\n      dispActiveNames = [],\n      adminNameStream: initialAdminNameStream,\n      participants = [],\n      activeSounds: activeSoundsRaw = [],\n      autoWave = false,\n      updateActiveSounds,\n      paginatedStreams = [],\n      currentUserPage = 0,\n      reUpdateInter: updatedReUpdateInter,\n      updateParticipantAudioDecibels: updatedUpdateParticipantAudioDecibels,\n      breakOutRoomStarted: updatedBreakoutStarted,\n      breakOutRoomEnded: updatedBreakoutEnded,\n      limitedBreakRoom: updatedLimitedBreakRoom,\n    } = updatedParams as MiniAudioPlayerParameters & Record<string, unknown>;\n\n    const reUpdateInter = updatedReUpdateInter ?? baseParams.reUpdateInter;\n    const updateParticipantAudioDecibels = updatedUpdateParticipantAudioDecibels ?? baseParams.updateParticipantAudioDecibels;\n    const breakOutRoomStarted = updatedBreakoutStarted ?? baseParams.breakOutRoomStarted ?? false;\n    const breakOutRoomEnded = updatedBreakoutEnded ?? baseParams.breakOutRoomEnded ?? false;\n    const limitedBreakRoom = updatedLimitedBreakRoom ?? baseParams.limitedBreakRoom ?? [];\n\n    const activeSounds = Array.isArray(activeSoundsRaw) ? [...activeSoundsRaw] : [];\n    const autoWaveEnabled = typeof autoWave === 'boolean' ? autoWave : false;\n    const paginatedList = Array.isArray(paginatedStreams) ? paginatedStreams : [];\n    const pageIndex = typeof currentUserPage === 'number' ? currentUserPage : 0;\n    const currentPage = Array.isArray(paginatedList[pageIndex])\n      ? (paginatedList[pageIndex] as unknown[])\n      : [];\n    const displayedNames = Array.isArray(dispActiveNames) ? dispActiveNames : [];\n    const participant = (participants as Participant[]).find((obj) => obj.audioID === props.remoteProducerId);\n\n    let audioActiveInRoom = true;\n    if (participant && breakOutRoomStarted && !breakOutRoomEnded) {\n      const restrictedNames = new Set((limitedBreakRoom as BreakoutParticipant[]).map((obj) => obj.name));\n      if (participant.name && !restrictedNames.has(participant.name)) {\n        audioActiveInRoom = false;\n      }\n    }\n\n    if (meetingDisplayType !== 'video') {\n      autoWaveCheck.value = true;\n    }\n    if (shared || shareScreenStarted) {\n      autoWaveCheck.value = false;\n    }\n\n    if (participant) {\n      isMuted.value = participant.muted ?? false;\n\n      if (eventType !== 'chat' && eventType !== 'broadcast') {\n        updateParticipantAudioDecibels?.({\n          name: participant.name ?? '',\n          averageLoudness,\n          audioDecibels: updatedParams.audioDecibels,\n          updateAudioDecibels: updatedParams.updateAudioDecibels,\n        });\n      }\n\n      let adminNameStream = initialAdminNameStream as string | undefined;\n      const getEntryName = (entry: unknown): string | undefined => {\n        if (entry && typeof entry === 'object' && 'name' in entry) {\n          const value = (entry as { name?: unknown }).name;\n          if (typeof value === 'string') {\n            return value;\n          }\n        }\n        return undefined;\n      };\n\n      const inPage = (currentPage as unknown[]).findIndex((entry) => getEntryName(entry) === participant.name);\n\n      if (participant.name && !displayedNames.includes(participant.name) && inPage === -1) {\n        autoWaveCheck.value = false;\n        if (!adminNameStream) {\n          const adminParticipant = (participants as Participant[]).find((obj) => obj.islevel === '2');\n          adminNameStream = adminParticipant?.name ?? '';\n        }\n        if (participant.name === adminNameStream) {\n          autoWaveCheck.value = true;\n        }\n      } else {\n        autoWaveCheck.value = true;\n      }\n\n      if (\n        participant.videoID ||\n        autoWaveCheck.value ||\n        (breakOutRoomStarted && !breakOutRoomEnded && audioActiveInRoom)\n      ) {\n        showWaveModal.value = false;\n\n        if (averageLoudness > 127.5) {\n          consLow = false;\n          if (participant.name && !activeSounds.includes(participant.name)) {\n            activeSounds.push(participant.name);\n            if (!(shareScreenStarted || shared) || participant.videoID) {\n              if (eventType !== 'chat' && eventType !== 'broadcast' && participant.name) {\n                void reUpdateInter?.({\n                  name: participant.name,\n                  add: true,\n                  average: averageLoudness,\n                  parameters: updatedParams,\n                });\n              }\n            }\n          }\n        } else {\n          if (participant.name && activeSounds.includes(participant.name) && consLow) {\n            activeSounds.splice(activeSounds.indexOf(participant.name), 1);\n            if (!(shareScreenStarted || shared) || participant.videoID) {\n              if (eventType !== 'chat' && eventType !== 'broadcast' && participant.name) {\n                void reUpdateInter?.({\n                  name: participant.name,\n                  average: averageLoudness,\n                  parameters: updatedParams,\n                });\n              }\n            }\n          } else {\n            consLow = true;\n          }\n        }\n      } else {\n        if (averageLoudness > 127.5) {\n          showWaveModal.value = autoWaveEnabled;\n          if (participant.name && !activeSounds.includes(participant.name)) {\n            activeSounds.push(participant.name);\n          }\n          if ((shareScreenStarted || shared) && !participant.videoID) {\n            /* do nothing */\n          } else if (eventType !== 'chat' && eventType !== 'broadcast' && participant.name) {\n            void reUpdateInter?.({\n              name: participant.name,\n              add: true,\n              average: averageLoudness,\n              parameters: updatedParams,\n            });\n          }\n        } else {\n          showWaveModal.value = false;\n          if (participant.name && activeSounds.includes(participant.name)) {\n            activeSounds.splice(activeSounds.indexOf(participant.name), 1);\n          }\n          if ((shareScreenStarted || shared) && !participant.videoID) {\n            /* do nothing */\n          } else if (eventType !== 'chat' && eventType !== 'broadcast' && participant.name) {\n            void reUpdateInter?.({\n              name: participant.name,\n              average: averageLoudness,\n              parameters: updatedParams,\n            });\n          }\n        }\n      }\n\n      updateActiveSounds?.(activeSounds);\n    } else {\n      showWaveModal.value = false;\n      isMuted.value = true;\n    }\n  }, 2000);\n};\n\nwatch(\n  () => props.stream,\n  (stream) => {\n    setAudioSource(stream);\n    if (stream) {\n      startMonitoring();\n    } else {\n      showWaveModal.value = false;\n      isMuted.value = true;\n      stopMonitoring();\n    }\n  },\n  { immediate: true }\n);\n\nwatch(\n  () => props.consumer,\n  () => {\n    if (props.stream) {\n      startMonitoring();\n    }\n  }\n);\n\nonBeforeUnmount(() => {\n  stopMonitoring();\n});\n</script>\n\n<style scoped>\n/* No additional styles */\n</style>\n","import MiniAudioPlayer from '../methods/utils/MiniAudioPlayer/MiniAudioPlayer.vue';\nimport MiniAudio from '../components/displayComponents/MiniAudio.vue';\nimport type { RenderableComponent } from '../types/renderable-component';\nimport type { PrepopulateUserMediaType, PrepopulateUserMediaParameters } from './prepopulateUserMedia';\nimport type { Participant, Stream, EventType } from 'mediasfu-shared';\nimport type { Consumer } from 'mediasoup-client';\nimport type { Socket } from 'socket.io-client';\n\ntype ReorderStreamsOptions = {\n  add?: boolean;\n  screenChanged?: boolean;\n  parameters: ConsumerResumeParameters;\n  [key: string]: unknown;\n};\n\nexport interface ConsumerResumeParameters extends PrepopulateUserMediaParameters {\n  nStream: MediaStream | null;\n  allAudioStreams: (Stream | Participant)[];\n  streamNames: Stream[];\n  audStreamNames: Stream[];\n  updateMainWindow: boolean;\n  meetingDisplayType: string;\n  mainScreenFilled: boolean;\n  first_round: boolean;\n  lock_screen: boolean;\n  audioOnlyStreams: RenderableComponent[];\n  gotAllVids: boolean;\n  defer_receive: boolean;\n  firstAll: boolean;\n  remoteScreenStream: Stream[];\n  hostLabel: string;\n  whiteboardStarted: boolean;\n  whiteboardEnded: boolean;\n  participants: Participant[];\n  eventType: EventType;\n  member: string;\n  shareScreenStarted: boolean;\n  shared: boolean;\n  screenId?: string;\n  updateUpdateMainWindow: (value: boolean) => void;\n  updateAllAudioStreams: (streams: (Stream | Participant)[]) => void;\n  updateAllVideoStreams: (streams: (Stream | Participant)[]) => void;\n  updateStreamNames: (streams: Stream[]) => void;\n  updateAudStreamNames: (streams: Stream[]) => void;\n  updateNStream: (stream: MediaStream | null) => void;\n  updateMainHeightWidth: (value: number) => void;\n  updateLock_screen: (value: boolean) => void;\n  updateFirstAll: (value: boolean) => void;\n  updateRemoteScreenStream: (streams: Stream[]) => void;\n  updateOldAllStreams: (streams: (Stream | Participant)[]) => void;\n  updateAudioOnlyStreams: (components: RenderableComponent[]) => void;\n  updateShareScreenStarted: (value: boolean) => void;\n  updateGotAllVids: (value: boolean) => void;\n  updateScreenId: (value: string) => void;\n  updateDefer_receive: (value: boolean) => void;\n  reorderStreams: (options: ReorderStreamsOptions) => Promise<void>;\n  prepopulateUserMedia: PrepopulateUserMediaType;\n  \n  // Component overrides\n  miniAudioComponent?: typeof MiniAudio;\n  miniAudioPlayerComponent?: typeof MiniAudioPlayer;\n  \n  getUpdatedAllParams: () => ConsumerResumeParameters;\n}\n\ninterface ResumeParams {\n  id: string;\n  producerId: string;\n  kind: string;\n  rtpParameters: unknown;\n}\n\nexport interface ConsumerResumeOptions {\n  track: MediaStreamTrack;\n  kind: string;\n  remoteProducerId: string;\n  params: ResumeParams;\n  parameters: ConsumerResumeParameters;\n  nsock: Socket;\n  consumer: Consumer;\n}\n\nexport type ConsumerResumeType = (\n  options: ConsumerResumeOptions\n) => Promise<void>;\n\nexport const consumerResume: ConsumerResumeType = async ({\n  track,\n  remoteProducerId,\n  parameters,\n  nsock,\n  consumer,\n}: ConsumerResumeOptions): Promise<void> => {\n  try {\n    parameters = parameters.getUpdatedAllParams();\n\n    const {\n      shared,\n      participants = [],\n      eventType,\n      meetingDisplayType,\n      mainScreenFilled,\n      first_round,\n      mainHeightWidth,\n      member,\n      hostLabel,\n      whiteboardStarted,\n      whiteboardEnded,\n      reorderStreams,\n      prepopulateUserMedia,\n      miniAudioComponent,\n      miniAudioPlayerComponent,\n      updateUpdateMainWindow,\n      updateAllAudioStreams,\n      updateAllVideoStreams,\n      updateStreamNames,\n      updateAudStreamNames,\n      updateNStream,\n      updateMainHeightWidth,\n      updateLock_screen,\n      updateFirstAll,\n      updateRemoteScreenStream,\n      updateOldAllStreams,\n      updateAudioOnlyStreams,\n      updateShareScreenStarted,\n      updateGotAllVids,\n      updateScreenId,\n      updateDefer_receive,\n    } = parameters;\n\n    const MiniAudioComponentToUse = miniAudioComponent ?? MiniAudio;\n    const MiniAudioPlayerComponentToUse = miniAudioPlayerComponent ?? MiniAudioPlayer;\n\n    let {\n      nStream,\n      allAudioStreams,\n      allVideoStreams,\n      streamNames,\n      audStreamNames,\n      updateMainWindow,\n      shareScreenStarted,\n      screenId,\n      lock_screen,\n      oldAllStreams,\n      audioOnlyStreams,\n      gotAllVids,\n      defer_receive,\n      firstAll,\n      remoteScreenStream,\n    } = parameters;\n\n    if (!track) {\n      return;\n    }\n\n    if (parameters.meetingDisplayType === undefined) {\n      parameters.meetingDisplayType = meetingDisplayType;\n    }\n\n    if (parameters.allVideoStreams === undefined) {\n      parameters.allVideoStreams = allVideoStreams;\n    }\n\n    if (parameters.participants === undefined) {\n      parameters.participants = participants;\n    }\n\n    if (parameters.remoteScreenStream === undefined) {\n      parameters.remoteScreenStream = remoteScreenStream;\n    }\n\n    if (parameters.audStreamNames === undefined) {\n      parameters.audStreamNames = audStreamNames;\n    }\n\n    if (parameters.allAudioStreams === undefined) {\n      parameters.allAudioStreams = allAudioStreams;\n    }\n\n    if (parameters.audioOnlyStreams === undefined) {\n      parameters.audioOnlyStreams = audioOnlyStreams;\n    }\n\n    const participantByAudio = participants.filter(\n      (participant) => participant.audioID === remoteProducerId\n    );\n\n    if (track.kind === 'audio') {\n      const firstAudioParticipant = participantByAudio[0];\n      const participantName = firstAudioParticipant?.name ?? '';\n\n      if (participantName === member) {\n        return;\n      }\n\n      const activeScreenParticipants = participants.filter(\n        (participant) =>\n          participant.ScreenID != null &&\n          participant.ScreenOn === true &&\n          participant.ScreenID !== ''\n      );\n\n      if (activeScreenParticipants.length > 0) {\n        const firstScreenParticipant = activeScreenParticipants[0];\n        screenId = firstScreenParticipant?.ScreenID ?? '';\n        updateScreenId(screenId);\n        if (!shared) {\n          shareScreenStarted = true;\n          updateShareScreenStarted(shareScreenStarted);\n        }\n      } else if (!(whiteboardStarted && !whiteboardEnded)) {\n        screenId = '';\n        updateScreenId(screenId);\n        updateShareScreenStarted(false);\n      }\n\n      nStream = new MediaStream([track]);\n      updateNStream(nStream);\n\n      const miniAudioComponent: RenderableComponent = {\n        component: MiniAudioPlayerComponentToUse,\n        props: {\n          stream: nStream,\n          remoteProducerId,\n          parameters,\n          consumer,\n          miniAudioComponent: MiniAudioComponentToUse,\n          miniAudioProps: {\n            customStyle: { backgroundColor: 'gray' },\n            name: participantName,\n            showWaveform: true,\n            overlayPosition: 'topRight',\n            barColor: 'white',\n            textColor: 'white',\n            imageSource: 'https://mediasfu.com/images/logo192.png',\n            roundedImage: true,\n            imageStyle: {},\n          },\n        },\n        key: `audio-${remoteProducerId}`,\n      };\n\n      audioOnlyStreams = [...audioOnlyStreams, miniAudioComponent];\n      updateAudioOnlyStreams(audioOnlyStreams);\n\n      allAudioStreams = [\n        ...allAudioStreams,\n        { producerId: remoteProducerId, stream: nStream },\n      ];\n      updateAllAudioStreams(allAudioStreams);\n\n      if (!participantName) {\n        return;\n      }\n\n      audStreamNames = [\n        ...audStreamNames,\n        { producerId: remoteProducerId, name: participantName } as Stream,\n      ];\n      updateAudStreamNames(audStreamNames);\n\n      if (!mainScreenFilled && firstAudioParticipant?.islevel === '2') {\n        updateMainWindow = true;\n        updateUpdateMainWindow(updateMainWindow);\n        await prepopulateUserMedia({\n          name: hostLabel,\n          parameters: { ...parameters, audStreamNames, allAudioStreams },\n        });\n        updateMainWindow = false;\n        updateUpdateMainWindow(updateMainWindow);\n      }\n\n      const hasVideo =\n        meetingDisplayType === 'video'\n          ? firstAudioParticipant?.videoID != null &&\n            firstAudioParticipant?.videoID !== '' &&\n            firstAudioParticipant?.videoID !== undefined\n          : true;\n\n      const altChecker = meetingDisplayType !== 'video';\n\n      if (hasVideo) {\n        if (shareScreenStarted || shared) {\n          if (!altChecker) {\n            await reorderStreams({\n              parameters: { ...parameters, audStreamNames, allAudioStreams },\n            });\n          }\n        } else if (altChecker) {\n          await reorderStreams({\n            add: false,\n            screenChanged: true,\n            parameters: { ...parameters, audStreamNames, allAudioStreams },\n          });\n        }\n      }\n\n      return;\n    }\n\n    nStream = new MediaStream([track]);\n    updateNStream(nStream);\n\n    const activeScreenParticipants = participants.filter(\n      (participant) =>\n        participant.ScreenID != null &&\n        participant.ScreenOn === true &&\n        participant.ScreenID !== ''\n    );\n\n    if (activeScreenParticipants.length > 0) {\n      const firstScreenParticipant = activeScreenParticipants[0];\n      screenId = firstScreenParticipant?.ScreenID ?? '';\n      updateScreenId(screenId);\n      if (!shared) {\n        shareScreenStarted = true;\n        updateShareScreenStarted(shareScreenStarted);\n      }\n    } else if (!(whiteboardStarted && !whiteboardEnded)) {\n      screenId = '';\n      updateScreenId(screenId ?? '');\n      updateShareScreenStarted(false);\n    }\n\n    if (remoteProducerId === screenId) {\n      updateMainWindow = true;\n      updateUpdateMainWindow(updateMainWindow);\n      remoteScreenStream = [{ producerId: remoteProducerId, stream: nStream } as Stream];\n      updateRemoteScreenStream(remoteScreenStream);\n\n      if (eventType === 'conference') {\n        if (shared || shareScreenStarted) {\n          if (mainHeightWidth === 0) {\n            updateMainHeightWidth(84);\n          }\n        } else if (mainHeightWidth > 0) {\n          updateMainHeightWidth(0);\n        }\n      }\n\n      if (!lock_screen) {\n        await prepopulateUserMedia({ name: hostLabel, parameters });\n        await reorderStreams({\n          add: false,\n          screenChanged: true,\n          parameters: { ...parameters, remoteScreenStream, allVideoStreams },\n        });\n      } else if (!first_round) {\n        await prepopulateUserMedia({\n          name: hostLabel,\n          parameters: { ...parameters, remoteScreenStream, allVideoStreams },\n        });\n        await reorderStreams({\n          add: false,\n          screenChanged: true,\n          parameters: { ...parameters, remoteScreenStream, allVideoStreams },\n        });\n      }\n\n      lock_screen = true;\n      updateLock_screen(lock_screen);\n      firstAll = true;\n      updateFirstAll(firstAll);\n      return;\n    }\n\n    parameters = parameters.getUpdatedAllParams();\n\n    const participantByVideo = participants.filter(\n      (participant) => participant.videoID === remoteProducerId\n    );\n    const firstVideoParticipant = participantByVideo[0];\n\n    if (\n      firstVideoParticipant &&\n      firstVideoParticipant.name &&\n      firstVideoParticipant.name !== member\n    ) {\n      allVideoStreams = [\n        ...allVideoStreams,\n        { producerId: remoteProducerId, stream: nStream, socket_: nsock } as Stream,\n      ];\n      updateAllVideoStreams(allVideoStreams);\n    }\n\n    if (firstVideoParticipant) {\n      const name = firstVideoParticipant.name ?? '';\n      streamNames = [\n        ...streamNames,\n        { producerId: remoteProducerId, name } as Stream,\n      ];\n      updateStreamNames(streamNames);\n    }\n\n    if (!shareScreenStarted) {\n      const hostParticipants = participants.filter(\n        (participant) =>\n          (participant.isAdmin === true || participant.isHost === true) &&\n          participant.islevel === '2'\n      );\n\n      const firstHostParticipant = hostParticipants[0];\n\n      if (firstHostParticipant) {\n        const hostVideoId = firstHostParticipant.videoID;\n\n        if (hostVideoId) {\n          const previousHostStreams = oldAllStreams.length > 0 ? oldAllStreams : [];\n\n          oldAllStreams = allVideoStreams.filter(\n            (stream) => (stream as Stream).producerId === hostVideoId\n          );\n          updateOldAllStreams(oldAllStreams);\n\n          if (oldAllStreams.length < 1) {\n            oldAllStreams = previousHostStreams;\n            updateOldAllStreams(oldAllStreams);\n          }\n\n          allVideoStreams = allVideoStreams.filter(\n            (stream) => (stream as Stream).producerId !== hostVideoId\n          );\n          updateAllVideoStreams(allVideoStreams);\n\n          if (remoteProducerId === hostVideoId) {\n            updateMainWindow = true;\n          }\n        }\n\n        gotAllVids = true;\n        updateGotAllVids(gotAllVids);\n      }\n    } else {\n      const screenParticipant = participants.filter(\n        (participant) => participant.ScreenID === screenId\n      );\n\n      const screenParticipantVideoId = screenParticipant[0]?.videoID;\n\n      if (screenParticipantVideoId) {\n        await reorderStreams({\n          parameters: { ...parameters, allVideoStreams },\n        });\n        return;\n      }\n    }\n\n    if (lock_screen || shared) {\n      defer_receive = true;\n      updateDefer_receive(defer_receive);\n\n      if (!first_round) {\n        await reorderStreams({\n          add: false,\n          screenChanged: true,\n          parameters: { ...parameters, allVideoStreams },\n        });\n      }\n    } else {\n      await reorderStreams({\n        add: false,\n        screenChanged: true,\n        parameters: { ...parameters, allVideoStreams },\n      });\n    }\n  } catch (error) {\n    console.log('consumerResume error', error);\n  }\n};\n","/**\n * Vue-native prepopulateUserMedia - adapted from React version\n * Populates the main grid with video/audio cards based on participant state\n */\n\nimport VideoCard from '../components/displayComponents/VideoCard.vue';\nimport AudioCard from '../components/displayComponents/AudioCard.vue';\nimport MiniCard from '../components/displayComponents/MiniCard.vue';\nimport type { RenderableComponent } from '../types/renderable-component';\nimport type { \n  Participant, \n  Stream, \n  EventType,\n} from 'mediasfu-shared';\n\nexport interface PrepopulateUserMediaParameters {\n  participants: Participant[];\n  allVideoStreams: (Stream | Participant)[];\n  islevel: string;\n  member: string;\n  shared: boolean;\n  shareScreenStarted: boolean;\n  eventType: EventType;\n  screenId?: string;\n  forceFullDisplay: boolean;\n  updateMainWindow: boolean;\n  mainScreenFilled: boolean;\n  adminOnMainScreen: boolean;\n  mainScreenPerson: string;\n  videoAlreadyOn: boolean;\n  audioAlreadyOn: boolean;\n  oldAllStreams: (Stream | Participant)[];\n  checkOrientation: () => string;\n  screenForceFullDisplay: boolean;\n  localStreamScreen: MediaStream | null;\n  remoteScreenStream: Stream[];\n  localStreamVideo: MediaStream | null;\n  mainHeightWidth: number;\n  isWideScreen: boolean;\n  localUIMode: boolean;\n  whiteboardStarted: boolean;\n  whiteboardEnded: boolean;\n  virtualStream: MediaStream | null;\n  keepBackground: boolean;\n  annotateScreenStream: boolean;\n  updateMainScreenPerson: (person: string) => void;\n  updateMainScreenFilled: (filled: boolean) => void;\n  updateAdminOnMainScreen: (admin: boolean) => void;\n  updateMainHeightWidth: (heightWidth: number) => void;\n  updateScreenForceFullDisplay: (force: boolean) => void;\n  updateUpdateMainWindow: (update: boolean) => void;\n  updateMainGridStream: (components: RenderableComponent[]) => void;\n  customVideoCard?: unknown;\n  customAudioCard?: unknown;\n  customMiniCard?: unknown;\n  \n  // Override-provided component references\n  videoCardComponent?: typeof VideoCard;\n  audioCardComponent?: typeof AudioCard;\n  miniCardComponent?: typeof MiniCard;\n  \n  getUpdatedAllParams: () => PrepopulateUserMediaParameters;\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  [key: string]: any;\n}\n\nexport interface PrepopulateUserMediaOptions {\n  name: string;\n  parameters: PrepopulateUserMediaParameters;\n}\n\nexport type PrepopulateUserMediaType = (options: PrepopulateUserMediaOptions) => Promise<RenderableComponent[] | void>;\n\n/**\n * Prepopulates the user media for Vue - creates RenderableComponent array\n * @param {PrepopulateUserMediaOptions} options - Configuration options\n * @returns {Promise<RenderableComponent[] | void>} Array of Vue component descriptors\n */\nexport const prepopulateUserMedia = async ({\n  name,\n  parameters,\n}: PrepopulateUserMediaOptions): Promise<RenderableComponent[] | void> => {\n  try {\n    parameters = parameters.getUpdatedAllParams();\n\n    const {\n      participants,\n      allVideoStreams,\n      islevel,\n      member,\n      shared,\n      shareScreenStarted,\n      eventType,\n      screenId,\n      forceFullDisplay,\n      videoAlreadyOn,\n      audioAlreadyOn,\n      oldAllStreams,\n      checkOrientation,\n      localStreamScreen,\n      remoteScreenStream,\n      localStreamVideo,\n      mainHeightWidth,\n      isWideScreen,\n      localUIMode,\n      whiteboardStarted,\n      whiteboardEnded,\n      virtualStream,\n      keepBackground,\n      annotateScreenStream,\n      updateMainScreenPerson,\n      updateMainScreenFilled,\n      updateAdminOnMainScreen,\n      updateMainHeightWidth,\n      updateScreenForceFullDisplay,\n      updateUpdateMainWindow,\n      updateMainGridStream,\n      customVideoCard,\n      customAudioCard,\n      customMiniCard,\n      videoCardComponent,\n      audioCardComponent,\n      miniCardComponent,\n    } = parameters;\n\n    const VideoCardComponentOverride = videoCardComponent ?? VideoCard;\n    const AudioCardComponentOverride = audioCardComponent ?? AudioCard;\n    const MiniCardComponentOverride = miniCardComponent ?? MiniCard;\n\n    let {\n      updateMainWindow,\n      mainScreenFilled,\n      adminOnMainScreen,\n      mainScreenPerson,\n      screenForceFullDisplay,\n    } = parameters;\n\n    const newComponents: RenderableComponent[] = [];\n\n    if (eventType === 'chat') {\n      return;\n    }\n\n    let host: Participant | null = null;\n    let hostStream: MediaStream | Stream | null = null;\n\n    if (shareScreenStarted || shared) {\n      if (eventType === 'conference') {\n        if ((shared || shareScreenStarted) && mainHeightWidth === 0) {\n          updateMainHeightWidth(84);\n        } else if (!shared && !shareScreenStarted && mainHeightWidth !== 0) {\n          updateMainHeightWidth(0);\n        }\n      }\n\n      screenForceFullDisplay = forceFullDisplay;\n      updateScreenForceFullDisplay(screenForceFullDisplay);\n\n      const orientation = checkOrientation();\n      if ((orientation === 'portrait' || !isWideScreen) && (shareScreenStarted || shared)) {\n        screenForceFullDisplay = false;\n        updateScreenForceFullDisplay(screenForceFullDisplay);\n      }\n\n      if (shared) {\n        host = { name: member, audioID: '', videoID: '' };\n        hostStream = localStreamScreen;\n        adminOnMainScreen = islevel === '2';\n        updateAdminOnMainScreen(adminOnMainScreen);\n        mainScreenPerson = host.name ?? '';\n        updateMainScreenPerson(mainScreenPerson);\n      } else {\n        host =\n          participants.find(\n            (participant) => participant.ScreenID === screenId && participant.ScreenOn === true\n          ) ?? null;\n\n        if (whiteboardStarted && !whiteboardEnded) {\n          host = { name: 'WhiteboardActive', islevel: '2', audioID: '', videoID: '' };\n          hostStream = { producerId: 'WhiteboardActive' } as unknown as Stream;\n        }\n\n        if (!host) {\n          host = participants.find((participant) => participant.ScreenOn === true) ?? null;\n        }\n\n        if (host && !host.name?.includes('WhiteboardActive')) {\n          hostStream =\n            remoteScreenStream.length === 0\n              ? (allVideoStreams.find(\n                  (stream) => (stream as Stream).producerId === host?.ScreenID\n                ) as Stream | undefined) ?? null\n              : remoteScreenStream[0] ?? null;\n        }\n\n        adminOnMainScreen = (host && host.islevel === '2') ?? false;\n        updateAdminOnMainScreen(adminOnMainScreen);\n        mainScreenPerson = host?.name ?? '';\n        updateMainScreenPerson(mainScreenPerson);\n      }\n\n      if (host && hostStream) {\n        const isDirectStream = shared || !(hostStream as Stream).stream;\n        const effectiveStream = isDirectStream\n          ? (hostStream as MediaStream | null)\n          : ((hostStream as Stream).stream ?? null);\n\n        if (customVideoCard) {\n          newComponents.push({\n            component: customVideoCard,\n            props: {\n              participant: host,\n              stream: effectiveStream,\n              width: mainHeightWidth,\n              height: mainHeightWidth,\n              showControls: false,\n              showInfo: true,\n              name: host.name || '',\n              backgroundColor: 'rgba(217, 227, 234, 0.99)',\n              parameters,\n            },\n            key: host.ScreenID || `custom-video-${host.name ?? Date.now()}`,\n          });\n        } else {\n          newComponents.push({\n            component: VideoCardComponentOverride,\n            props: {\n              videoStream: effectiveStream,\n              remoteProducerId: host.ScreenID ?? '',\n              eventType,\n              forceFullDisplay: annotateScreenStream && shared ? false : screenForceFullDisplay,\n              customStyle: {\n                border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n              },\n              participant: host,\n              backgroundColor: 'rgba(217, 227, 234, 0.99)',\n              showControls: false,\n              showInfo: true,\n              name: host.name || '',\n              parameters,\n            },\n            key: host.ScreenID || `screen-${host.name ?? Date.now()}`,\n          });\n        }\n\n        updateMainGridStream(newComponents);\n        mainScreenFilled = true;\n        updateMainScreenFilled(mainScreenFilled);\n        adminOnMainScreen = host.islevel === '2';\n        updateAdminOnMainScreen(adminOnMainScreen);\n        mainScreenPerson = host.name ?? '';\n        updateMainScreenPerson(mainScreenPerson);\n\n        updateMainWindow = false;\n        updateUpdateMainWindow(updateMainWindow);\n\n        return newComponents;\n      }\n    } else {\n      if (eventType === 'conference') {\n        return;\n      }\n\n      host = participants.find((participant) => participant.islevel === '2') ?? null;\n      mainScreenPerson = host?.name ?? '';\n      updateMainScreenPerson(mainScreenPerson);\n    }\n\n    if (!host) {\n      newComponents.push({\n        component: customMiniCard ?? MiniCardComponentOverride,\n        props: customMiniCard\n          ? {\n              initials: name,\n              fontSize: 20,\n              customStyle: {\n                backgroundColor: 'transparent',\n                border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n              },\n            }\n          : {\n              initials: name,\n              fontSize: 20,\n              customStyle: {\n                backgroundColor: 'transparent',\n                border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n              },\n            },\n        key: `mini-${name}-${Date.now()}`,\n      });\n\n      updateMainGridStream(newComponents);\n      mainScreenFilled = false;\n      adminOnMainScreen = false;\n      mainScreenPerson = '';\n      updateMainScreenFilled(mainScreenFilled);\n      updateAdminOnMainScreen(adminOnMainScreen);\n      updateMainScreenPerson(mainScreenPerson);\n\n      updateMainWindow = false;\n      updateUpdateMainWindow(updateMainWindow);\n\n      return newComponents;\n    }\n\n    const videoIsOff =\n      (islevel !== '2' && !host.videoOn) ||\n      (islevel === '2' && (!host.videoOn || !videoAlreadyOn)) ||\n      localUIMode === true;\n\n    if (videoIsOff) {\n      if (islevel === '2' && videoAlreadyOn) {\n        const stream = keepBackground && virtualStream ? virtualStream : localStreamVideo;\n        if (stream) {\n          if (customVideoCard) {\n            newComponents.push({\n              component: customVideoCard,\n              props: {\n                participant: host,\n                stream,\n                width: mainHeightWidth,\n                height: mainHeightWidth,\n                showControls: false,\n                showInfo: true,\n                name: host.name || '',\n                backgroundColor: 'rgba(217, 227, 234, 0.99)',\n                parameters,\n              },\n              key: host.videoID || `custom-video-${host.name ?? Date.now()}`,\n            });\n          } else {\n            newComponents.push({\n              component: VideoCardComponentOverride,\n              props: {\n                videoStream: stream,\n                remoteProducerId: host.videoID || '',\n                eventType,\n                forceFullDisplay,\n                customStyle: {\n                  border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                },\n                participant: host,\n                backgroundColor: 'rgba(217, 227, 234, 0.99)',\n                showControls: false,\n                showInfo: true,\n                name: host.name || '',\n                doMirror: true,\n                parameters,\n              },\n              key: host.videoID || `video-${host.name ?? Date.now()}`,\n            });\n          }\n\n          updateMainGridStream(newComponents);\n          mainScreenFilled = true;\n          updateMainScreenFilled(mainScreenFilled);\n          adminOnMainScreen = true;\n          updateAdminOnMainScreen(adminOnMainScreen);\n          mainScreenPerson = host.name ?? '';\n          updateMainScreenPerson(mainScreenPerson);\n        }\n      } else {\n        let audOn = false;\n        if (islevel === '2' && audioAlreadyOn) {\n          audOn = true;\n        } else if (islevel !== '2') {\n          audOn = host.muted === false;\n        }\n\n        if (audOn) {\n          if (customAudioCard) {\n            newComponents.push({\n              component: customAudioCard,\n              props: {\n                name: host.name || '',\n                barColor: 'red',\n                textColor: 'white',\n                customStyle: {\n                  backgroundColor: 'transparent',\n                  border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                },\n                controlsPosition: 'topLeft',\n                infoPosition: 'topRight',\n                roundedImage: true,\n                parameters,\n                backgroundColor: 'transparent',\n                showControls: true,\n                participant: host,\n              },\n              key: `custom-audio-${host.name ?? Date.now()}`,\n            });\n          } else {\n            newComponents.push({\n              component: AudioCardComponentOverride,\n              props: {\n                name: host.name || '',\n                barColor: 'red',\n                textColor: 'white',\n                customStyle: {\n                  backgroundColor: 'transparent',\n                  border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                },\n                controlsPosition: 'topLeft',\n                infoPosition: 'topRight',\n                showWaveform: true,\n                roundedImage: true,\n                parameters,\n                participant: host,\n              },\n              key: `audio-${host.name ?? Date.now()}`,\n            });\n          }\n\n          updateMainGridStream(newComponents);\n          mainScreenFilled = false;\n          updateMainScreenFilled(mainScreenFilled);\n          adminOnMainScreen = host.islevel === '2';\n          updateAdminOnMainScreen(adminOnMainScreen);\n          mainScreenPerson = host.name ?? '';\n          updateMainScreenPerson(mainScreenPerson);\n        } else {\n          newComponents.push({\n            component: customMiniCard ?? MiniCardComponentOverride,\n            props: customMiniCard\n              ? {\n                  initials: name,\n                  fontSize: 20,\n                  customStyle: {\n                    backgroundColor: 'transparent',\n                    border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                  },\n                }\n              : {\n                  initials: name,\n                  fontSize: 20,\n                  customStyle: {\n                    backgroundColor: 'transparent',\n                    border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                  },\n                },\n            key: `mini-${name}-${Date.now()}`,\n          });\n\n          updateMainGridStream(newComponents);\n          mainScreenFilled = false;\n          updateMainScreenFilled(mainScreenFilled);\n          adminOnMainScreen = false;\n          updateAdminOnMainScreen(adminOnMainScreen);\n          mainScreenPerson = '';\n          updateMainScreenPerson(mainScreenPerson);\n        }\n      }\n    } else {\n      if (shareScreenStarted || shared) {\n        // Already handled earlier; fall through to avoid duplicate rendering when no stream\n      } else {\n        let resolvedStream: MediaStream | null = null;\n        if (islevel === '2') {\n          resolvedStream = (keepBackground && virtualStream) ? virtualStream : localStreamVideo;\n        } else {\n          const match = oldAllStreams.find(\n            (item) => (item as Stream).producerId === host?.videoID\n          ) as Stream | undefined;\n          resolvedStream = match?.stream ?? null;\n        }\n\n        if (resolvedStream) {\n          if (customVideoCard) {\n            newComponents.push({\n              component: customVideoCard,\n              props: {\n                participant: host,\n                stream: resolvedStream,\n                width: mainHeightWidth,\n                height: mainHeightWidth,\n                showControls: false,\n                showInfo: true,\n                name: host.name || '',\n                backgroundColor: 'rgba(217, 227, 234, 0.99)',\n                parameters,\n              },\n              key: host.videoID || `custom-video-${host.name ?? Date.now()}`,\n            });\n          } else {\n            newComponents.push({\n              component: VideoCardComponentOverride,\n              props: {\n                videoStream: resolvedStream,\n                remoteProducerId: host.videoID || '',\n                eventType,\n                forceFullDisplay,\n                customStyle: {\n                  border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                },\n                participant: host,\n                backgroundColor: 'rgba(217, 227, 234, 0.99)',\n                showControls: false,\n                showInfo: true,\n                name: host.name || '',\n                doMirror: member === host.name,\n                parameters,\n              },\n              key: host.videoID || `video-${host.name ?? Date.now()}`,\n            });\n          }\n\n          updateMainGridStream(newComponents);\n          mainScreenFilled = true;\n          adminOnMainScreen = host.islevel === '2';\n          mainScreenPerson = host.name ?? '';\n        } else {\n          newComponents.push({\n            component: customMiniCard ?? MiniCardComponentOverride,\n            props: customMiniCard\n              ? {\n                  initials: name,\n                  fontSize: 20,\n                  customStyle: {\n                    backgroundColor: 'transparent',\n                    border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                  },\n                }\n              : {\n                  initials: name,\n                  fontSize: 20,\n                  customStyle: {\n                    backgroundColor: 'transparent',\n                    border: eventType !== 'broadcast' ? '2px solid black' : '0px solid black',\n                  },\n                },\n            key: `mini-${name}-${Date.now()}`,\n          });\n\n          updateMainGridStream(newComponents);\n          mainScreenFilled = false;\n          adminOnMainScreen = islevel === '2';\n          mainScreenPerson = host.name ?? '';\n        }\n\n        updateMainScreenFilled(mainScreenFilled);\n        updateAdminOnMainScreen(adminOnMainScreen);\n        updateMainScreenPerson(mainScreenPerson);\n      }\n    }\n\n    updateMainWindow = false;\n    updateUpdateMainWindow(updateMainWindow);\n\n    return newComponents;\n  } catch (error) {\n    console.error('Error in prepopulateUserMedia:', error);\n    return [];\n  }\n};\n","import type { Producer, ProducerOptions, RtpCapabilities, Transport } from \"mediasoup-client\";\nimport type {\n  AParamsType,\n  CoHostResponsibility,\n  EventType,\n  HParamsType,\n  Participant,\n  Poll,\n  ScreenParamsType,\n  Stream,\n  VidCons,\n  VParamsType,\n  ConsumeSocket,\n  MeetingRoomParams,\n  UserRecordingParams,\n  ScreenState,\n  AudioDecibels,\n  GridSizes,\n  Message,\n  WaitingRoomParticipant,\n  Request,\n  BreakoutParticipant,\n  WhiteboardUser,\n  Shape,\n  ResponseJoinRoom,\n  ComponentSizes,\n  Transport as TransportType,\n} from \"../../@types/types\";\nimport type { Device } from \"mediasoup-client\";\nimport type { Socket } from \"socket.io-client\";\nimport type { SelfieSegmentation } from \"@mediapipe/selfie_segmentation\";\n\nexport interface InitialValuesStateType {\n  roomName: string;\n  member: string;\n  adminPasscode: string;\n  islevel: string;\n  coHost: string;\n  coHostResponsibility: CoHostResponsibility[];\n  youAreCoHost: boolean;\n  youAreHost: boolean;\n  confirmedToRecord: boolean;\n  meetingDisplayType: string;\n  meetingVideoOptimized: boolean;\n  eventType: EventType;\n  participants: Participant[];\n  filteredParticipants: Participant[];\n  participantsCounter: number;\n  participantsFilter: string;\n\n  validated: boolean;\n  localUIMode: boolean;\n  socket: Socket;\n  localSocket?: Socket;\n  roomData: ResponseJoinRoom | null;\n  device: Device | null;\n  apiKey: string;\n  apiUserName: string;\n  apiToken: string;\n  link: string;\n\n  consume_sockets: ConsumeSocket[];\n  rtpCapabilities: RtpCapabilities | null;\n  roomRecvIPs: string[];\n  meetingRoomParams: MeetingRoomParams | null;\n  itemPageLimit: number;\n  audioOnlyRoom: boolean;\n  addForBasic: boolean;\n  screenPageLimit: number;\n  shareScreenStarted: boolean;\n  shared: boolean;\n  targetOrientation: string;\n  targetResolution: string;\n  targetResolutionHost: string;\n  vidCons: VidCons;\n  frameRate: number;\n  hParams: HParamsType;\n  vParams: VParamsType;\n  screenParams: ScreenParamsType;\n  aParams: AParamsType;\n\n  // Recording Fields\n  recordingAudioPausesLimit: number;\n  recordingAudioPausesCount: number;\n  recordingAudioSupport: boolean;\n  recordingAudioPeopleLimit: number;\n  recordingAudioParticipantsTimeLimit: number;\n  recordingVideoPausesCount: number;\n  recordingVideoPausesLimit: number;\n  recordingVideoSupport: boolean;\n  recordingVideoPeopleLimit: number;\n  recordingVideoParticipantsTimeLimit: number;\n  recordingAllParticipantsSupport: boolean;\n  recordingVideoParticipantsSupport: boolean;\n  recordingAllParticipantsFullRoomSupport: boolean;\n  recordingVideoParticipantsFullRoomSupport: boolean;\n  recordingPreferredOrientation: string;\n  recordingSupportForOtherOrientation: boolean;\n  recordingMultiFormatsSupport: boolean;\n\n  userRecordingParams: UserRecordingParams;\n\n  canRecord: boolean;\n  startReport: boolean;\n  endReport: boolean;\n  recordTimerInterval: NodeJS.Timeout | null;\n  recordStartTime: number;\n  recordElapsedTime: number;\n  isTimerRunning: boolean;\n  canPauseResume: boolean;\n  recordChangeSeconds: number;\n  pauseLimit: number;\n  pauseRecordCount: number;\n  canLaunchRecord: boolean;\n  stopLaunchRecord: boolean;\n\n  // Room properties\n  participantsAll: Participant[];\n  firstAll: boolean;\n  updateMainWindow: boolean;\n  first_round: boolean;\n  landScaped: boolean;\n  lock_screen: boolean;\n  screenId: string;\n  allVideoStreams: (Participant | Stream)[];\n  newLimitedStreams: (Participant | Stream)[];\n  newLimitedStreamsIDs: string[];\n  activeSounds: string[];\n  screenShareIDStream: string;\n  screenShareNameStream: string;\n  adminIDStream: string;\n  adminNameStream: string;\n  youYouStream: (Participant | Stream)[];\n  youYouStreamIDs: string[];\n  localStream: MediaStream | null;\n  recordStarted: boolean;\n  recordResumed: boolean;\n  recordPaused: boolean;\n  recordStopped: boolean;\n  adminRestrictSetting: boolean;\n  videoRequestState: string | null;\n  videoRequestTime: number;\n  videoAction: boolean;\n  localStreamVideo: MediaStream | null;\n  userDefaultVideoInputDevice: string;\n  currentFacingMode: string;\n  prevFacingMode: string;\n  defVideoID: string;\n  allowed: boolean;\n  dispActiveNames: string[];\n  activeNames: string[];\n  prevActiveNames: string[];\n  p_activeNames: string[];\n  p_dispActiveNames: string[];\n  membersReceived: boolean;\n  deferScreenReceived: boolean;\n  hostFirstSwitch: boolean;\n  micAction: boolean;\n  screenAction: boolean;\n  chatAction: boolean;\n  audioRequestState: string | null;\n  screenRequestState: string | null;\n  chatRequestState: string | null;\n  audioRequestTime: number;\n  screenRequestTime: number;\n  chatRequestTime: number;\n  updateRequestIntervalSeconds: number;\n  oldSoundIds: string[];\n  hostLabel: string;\n  mainScreenFilled: boolean;\n  localStreamScreen: MediaStream | null;\n  screenAlreadyOn: boolean;\n  chatAlreadyOn: boolean;\n  redirectURL: string;\n  oldAllStreams: (Participant | Stream)[];\n  adminVidID: string;\n  streamNames: Stream[];\n  non_alVideoStreams: Participant[];\n  sortAudioLoudness: boolean;\n  audioDecibels: AudioDecibels[];\n  mixed_alVideoStreams: (Participant | Stream)[];\n  non_alVideoStreams_muted: Participant[];\n  paginatedStreams: (Participant | Stream)[][];\n  localStreamAudio: MediaStream | null;\n  defAudioID: string;\n  userDefaultAudioInputDevice: string;\n  userDefaultAudioOutputDevice: string;\n  prevAudioInputDevice: string;\n  prevVideoInputDevice: string;\n  audioPaused: boolean;\n  mainScreenPerson: string;\n  adminOnMainScreen: boolean;\n  screenStates: ScreenState[];\n  prevScreenStates: ScreenState[];\n  updateDateState: number | null;\n  lastUpdate: number | null;\n  nForReadjustRecord: number;\n  fixedPageLimit: number;\n  removeAltGrid: boolean;\n  nForReadjust: number;\n  reorderInterval: number;\n  fastReorderInterval: number;\n  lastReorderTime: number;\n  audStreamNames: Stream[];\n  currentUserPage: number;\n  mainHeightWidth: number;\n  prevMainHeightWidth: number;\n  prevDoPaginate: boolean;\n  doPaginate: boolean;\n  shareEnded: boolean;\n  lStreams: (Participant | Stream)[];\n  chatRefStreams: (Participant | Stream)[];\n  controlHeight: number;\n  isWideScreen: boolean;\n  isMediumScreen: boolean;\n  isSmallScreen: boolean;\n  addGrid: boolean;\n  addAltGrid: boolean;\n  gridRows: number;\n  gridCols: number;\n  altGridRows: number;\n  altGridCols: number;\n  numberPages: number;\n  currentStreams: (Participant | Stream)[];\n  showMiniView: boolean;\n  nStream: MediaStream | null;\n  defer_receive: boolean;\n  allAudioStreams: (Participant | Stream)[];\n  remoteScreenStream: Stream[];\n  screenProducer: Producer | null;\n  localScreenProducer: Producer | null;\n  gotAllVids: boolean;\n  paginationHeightWidth: number;\n  paginationDirection: string;\n  gridSizes: GridSizes;\n  screenForceFullDisplay: boolean;\n  mainGridStream: React.JSX.Element[];\n  otherGridStreams: React.JSX.Element[][];\n  audioOnlyStreams: React.JSX.Element[];\n  videoInputs: MediaDeviceInfo[];\n  audioInputs: MediaDeviceInfo[];\n  meetingProgressTime: string;\n  meetingElapsedTime: number;\n  ref_participants: Participant[];\n\n  // New fields related to messaging, events, modals, and other UI states\n  messages: Message[];\n  startDirectMessage: boolean;\n  directMessageDetails: Participant | null;\n  showMessagesBadge: boolean;\n  audioSetting: string;\n  videoSetting: string;\n  screenshareSetting: string;\n  chatSetting: string;\n  displayOption: string;\n  autoWave: boolean;\n  forceFullDisplay: boolean;\n  prevForceFullDisplay: boolean;\n  prevMeetingDisplayType: string;\n  waitingRoomFilter: string;\n  waitingRoomList: WaitingRoomParticipant[];\n  waitingRoomCounter: number;\n  filteredWaitingRoomList: WaitingRoomParticipant[];\n  requestFilter: string;\n  requestList: Request[];\n  requestCounter: number;\n  filteredRequestList: Request[];\n  totalReqWait: number;\n  alertVisible: boolean;\n  alertMessage: string;\n  alertType: \"success\" | \"danger\";\n  alertDuration: number;\n  progressTimerVisible: boolean;\n  progressTimerValue: number;\n  isMenuModalVisible: boolean;\n  isRecordingModalVisible: boolean;\n  isSettingsModalVisible: boolean;\n  isRequestsModalVisible: boolean;\n  isWaitingModalVisible: boolean;\n  isCoHostModalVisible: boolean;\n  isMediaSettingsModalVisible: boolean;\n  isDisplaySettingsModalVisible: boolean;\n  isParticipantsModalVisible: boolean;\n  isMessagesModalVisible: boolean;\n  isConfirmExitModalVisible: boolean;\n  isConfirmHereModalVisible: boolean;\n  isShareEventModalVisible: boolean;\n  isLoadingModalVisible: boolean;\n\n  recordingMediaOptions: string;\n  recordingAudioOptions: string;\n  recordingVideoOptions: string;\n  recordingVideoType: string;\n  recordingVideoOptimized: boolean;\n  recordingDisplayType: 'video' | 'media' | 'all';\n  recordingAddHLS: boolean;\n  recordingNameTags: boolean;\n  recordingBackgroundColor: string;\n  recordingNameTagsColor: string;\n  recordingAddText: boolean;\n  recordingCustomText: string;\n  recordingCustomTextPosition: string;\n  recordingCustomTextColor: string;\n  recordingOrientationVideo: string;\n  clearedToResume: boolean;\n  clearedToRecord: boolean;\n  recordState: string;\n  showRecordButtons: boolean;\n  recordingProgressTime: string;\n  audioSwitching: boolean;\n  videoSwitching: boolean;\n  videoAlreadyOn: boolean;\n  audioAlreadyOn: boolean;\n  componentSizes: ComponentSizes;\n  hasCameraPermission: boolean;\n  hasAudioPermission: boolean;\n  transportCreated: boolean;\n  localTransportCreated: boolean;\n  transportCreatedVideo: boolean;\n  transportCreatedAudio: boolean;\n  transportCreatedScreen: boolean;\n  producerTransport: Transport | null;\n  localProducerTransport: Transport | null;\n  videoProducer: Producer | null;\n  localVideoProducer: Producer | null;\n  params: ProducerOptions;\n  videoParams: ProducerOptions;\n  audioParams: ProducerOptions;\n  audioProducer: Producer | null;\n  localAudioProducer: Producer | null;\n  consumerTransports: TransportType[];\n  consumingTransports: string[];\n\n  // Polls\n  polls: Poll[];\n  poll: Poll | null;\n  isPollModalVisible: boolean;\n\n  // Background\n  customImage: string;\n  selectedImage: string;\n  segmentVideo: MediaStream | null;\n  selfieSegmentation: SelfieSegmentation | null;\n  pauseSegmentation: boolean;\n  processedStream: MediaStream | null;\n  keepBackground: boolean;\n  backgroundHasChanged: boolean;\n  virtualStream: MediaStream | null;\n  mainCanvas: HTMLCanvasElement | null;\n  prevKeepBackground: boolean;\n  appliedBackground: boolean;\n  isBackgroundModalVisible: boolean;\n  autoClickBackground: boolean;\n\n  // Breakout Rooms\n  breakoutRooms: BreakoutParticipant[][];\n  currentRoomIndex: number;\n  canStartBreakout: boolean;\n  breakOutRoomStarted: boolean;\n  breakOutRoomEnded: boolean;\n  hostNewRoom: number;\n  limitedBreakRoom: BreakoutParticipant[];\n  mainRoomsLength: number;\n  memberRoom: number;\n  isBreakoutRoomsModalVisible: boolean;\n\n  // Whiteboard\n  whiteboardUsers: WhiteboardUser[];\n  currentWhiteboardIndex: number;\n  canStartWhiteboard: boolean;\n  whiteboardStarted: boolean;\n  whiteboardEnded: boolean;\n  whiteboardLimit: number;\n  isWhiteboardModalVisible: boolean;\n  isConfigureWhiteboardModalVisible: boolean;\n  shapes: Shape[];\n  useImageBackground: boolean;\n  redoStack: Shape[];\n  undoStack: string[];\n  canvasStream: MediaStream | null;\n  canvasWhiteboard: HTMLCanvasElement | null;\n\n  // Screenboard\n  canvasScreenboard: HTMLCanvasElement | null;\n  processedScreenStream: MediaStream | null;\n  annotateScreenStream: boolean;\n  mainScreenCanvas: HTMLCanvasElement | null;\n  isScreenboardModalVisible: boolean;\n\n  // Control Buttons\n  micActive: boolean;\n  videoActive: boolean;\n  screenShareActive: boolean;\n  endCallActive: boolean;\n  participantsActive: boolean;\n  menuActive: boolean;\n  commentsActive: boolean;\n}\n\nexport const initialValuesState: InitialValuesStateType = {\n  // The following are the initial values\n\n  roomName: '',\n  member: '',\n  adminPasscode: '',\n  islevel: '1',\n  coHost: 'No coHost',\n  coHostResponsibility: [\n    { name: 'participants', value: false, dedicated: false },\n    { name: 'media', value: false, dedicated: false },\n    { name: 'waiting', value: false, dedicated: false },\n    { name: 'chat', value: false, dedicated: false },\n  ],\n  youAreCoHost: false,\n  youAreHost: false,\n  confirmedToRecord: false,\n  meetingDisplayType: 'media',\n  meetingVideoOptimized: false,\n  eventType: 'webinar',\n  participants: [],\n  filteredParticipants: [],\n  participantsCounter: 0,\n  participantsFilter: '',\n\n  validated: false,\n  localUIMode: false,\n  socket: {} as Socket,\n  localSocket: undefined,\n  roomData: null,\n  device: null,\n  apiKey: '',\n  apiUserName: '',\n  apiToken: '',\n  link: '',\n\n  consume_sockets: [],\n  rtpCapabilities: null,\n  roomRecvIPs: [],\n  meetingRoomParams: null,\n  itemPageLimit: 4,\n  audioOnlyRoom: false,\n  addForBasic: false,\n  screenPageLimit: 4,\n  shareScreenStarted: false,\n  shared: false,\n  targetOrientation: 'landscape',\n  targetResolution: 'sd',\n  targetResolutionHost: 'sd',\n  vidCons: { width: 640, height: 360 },\n  frameRate: 10,\n  hParams: {} as HParamsType,\n  vParams: {} as VParamsType,\n  screenParams: {} as ScreenParamsType,\n  aParams: {} as AParamsType,\n\n  // Initial Values for New Recording Fields\n  recordingAudioPausesLimit: 0,\n  recordingAudioPausesCount: 0,\n  recordingAudioSupport: false,\n  recordingAudioPeopleLimit: 0,\n  recordingAudioParticipantsTimeLimit: 0,\n  recordingVideoPausesCount: 0,\n  recordingVideoPausesLimit: 0,\n  recordingVideoSupport: false,\n  recordingVideoPeopleLimit: 0,\n  recordingVideoParticipantsTimeLimit: 0,\n  recordingAllParticipantsSupport: false,\n  recordingVideoParticipantsSupport: false,\n  recordingAllParticipantsFullRoomSupport: false,\n  recordingVideoParticipantsFullRoomSupport: false,\n  recordingPreferredOrientation: 'landscape',\n  recordingSupportForOtherOrientation: false,\n  recordingMultiFormatsSupport: false,\n\n  userRecordingParams: {\n    mainSpecs: {\n      mediaOptions: 'video',\n      audioOptions: 'all',\n      videoOptions: 'all',\n      videoType: 'fullDisplay',\n      videoOptimized: false,\n      recordingDisplayType: 'media',\n      addHLS: false,\n    },\n    dispSpecs: {\n      nameTags: true,\n      backgroundColor: '#000000',\n      nameTagsColor: '#ffffff',\n      orientationVideo: 'portrait',\n    }\n  },\n\n  canRecord: false,\n  startReport: false,\n  endReport: false,\n  recordTimerInterval: null,\n  recordStartTime: 0,\n  recordElapsedTime: 0,\n  isTimerRunning: false,\n  canPauseResume: false,\n  recordChangeSeconds: 15000,\n  pauseLimit: 0,\n  pauseRecordCount: 0,\n  canLaunchRecord: true,\n  stopLaunchRecord: false,\n\n  // Room properties\n  participantsAll: [],\n  firstAll: false,\n  updateMainWindow: false,\n  first_round: false,\n  landScaped: false,\n  lock_screen: false,\n  screenId: '',\n  allVideoStreams: [],\n  newLimitedStreams: [],\n  newLimitedStreamsIDs: [],\n  activeSounds: [],\n  screenShareIDStream: '',\n  screenShareNameStream: '',\n  adminIDStream: '',\n  adminNameStream: '',\n  youYouStream: [],\n  youYouStreamIDs: [],\n  localStream: null,\n  recordStarted: false,\n  recordResumed: false,\n  recordPaused: false,\n  recordStopped: false,\n  adminRestrictSetting: false,\n  videoRequestState: null,\n  videoRequestTime: 0,\n  videoAction: false,\n  localStreamVideo: null,\n  userDefaultVideoInputDevice: '',\n  currentFacingMode: 'user',\n  prevFacingMode: 'user',\n  defVideoID: '',\n  allowed: false,\n  dispActiveNames: [],\n  activeNames: [],\n  prevActiveNames: [],\n  p_activeNames: [],\n  p_dispActiveNames: [],\n  membersReceived: false,\n  deferScreenReceived: false,\n  hostFirstSwitch: false,\n  micAction: false,\n  screenAction: false,\n  chatAction: false,\n  audioRequestState: null,\n  screenRequestState: null,\n  chatRequestState: null,\n  audioRequestTime: 0,\n  screenRequestTime: 0,\n  chatRequestTime: 0,\n  updateRequestIntervalSeconds: 240,\n  oldSoundIds: [],\n  hostLabel: 'Host',\n  mainScreenFilled: false,\n  localStreamScreen: null,\n  screenAlreadyOn: false,\n  chatAlreadyOn: false,\n  redirectURL: '',\n  oldAllStreams: [],\n  adminVidID: '',\n  streamNames: [],\n  non_alVideoStreams: [],\n  sortAudioLoudness: false,\n  audioDecibels: [],\n  mixed_alVideoStreams: [],\n  non_alVideoStreams_muted: [],\n  paginatedStreams: [],\n  localStreamAudio: null,\n  defAudioID: '',\n  userDefaultAudioInputDevice: '',\n  userDefaultAudioOutputDevice: '',\n  prevAudioInputDevice: '',\n  prevVideoInputDevice: '',\n  audioPaused: false,\n  mainScreenPerson: '',\n  adminOnMainScreen: false,\n  screenStates: [{\n    mainScreenPerson: \"\",\n    mainScreenProducerId: \"\",\n    mainScreenFilled: false,\n    adminOnMainScreen: false,\n  }],\n  prevScreenStates: [{\n    mainScreenPerson: \"\",\n    mainScreenProducerId: \"\",\n    mainScreenFilled: false,\n    adminOnMainScreen: false,\n  }],\n  updateDateState: null,\n  lastUpdate: null,\n  nForReadjustRecord: 0,\n  fixedPageLimit: 4,\n  removeAltGrid: false,\n  nForReadjust: 0,\n  reorderInterval: 30000,\n  fastReorderInterval: 10000,\n  lastReorderTime: 0,\n  audStreamNames: [],\n  currentUserPage: 0,\n  mainHeightWidth: 0,\n  prevMainHeightWidth: 0,\n  prevDoPaginate: false,\n  doPaginate: false,\n  shareEnded: false,\n  lStreams: [],\n  chatRefStreams: [],\n  controlHeight: 0,\n  isWideScreen: false,\n  isMediumScreen: false,\n  isSmallScreen: false,\n  addGrid: false,\n  addAltGrid: false,\n  gridRows: 0,\n  gridCols: 0,\n  altGridRows: 0,\n  altGridCols: 0,\n  numberPages: 0,\n  currentStreams: [],\n  showMiniView: false,\n  nStream: null,\n  defer_receive: false,\n  allAudioStreams: [],\n  remoteScreenStream: [],\n  screenProducer: null,\n  localScreenProducer: null,\n  gotAllVids: false,\n  paginationHeightWidth: 40,\n  paginationDirection: \"horizontal\",\n  gridSizes: { gridWidth: 0, gridHeight: 0, altGridWidth: 0, altGridHeight: 0 },\n  screenForceFullDisplay: false,\n  mainGridStream: [],\n  otherGridStreams: [[], []],\n  audioOnlyStreams: [],\n  videoInputs: [],\n  audioInputs: [],\n  meetingProgressTime: \"00:00:00\",\n  meetingElapsedTime: 0,\n  ref_participants: [],\n\n  // Messaging, event, modals, and other UI states\n  messages: [],\n  startDirectMessage: false,\n  directMessageDetails: null,\n  showMessagesBadge: false,\n  audioSetting: 'allow',\n  videoSetting: 'allow',\n  screenshareSetting: 'allow',\n  chatSetting: 'allow',\n  displayOption: 'media',\n  autoWave: true,\n  forceFullDisplay: true,\n  prevForceFullDisplay: false,\n  prevMeetingDisplayType: 'video',\n  waitingRoomFilter: '',\n  waitingRoomList: [],\n  waitingRoomCounter: 0,\n  filteredWaitingRoomList: [],\n  requestFilter: '',\n  requestList: [],\n  requestCounter: 0,\n  filteredRequestList: [],\n  totalReqWait: 0,\n  alertVisible: false,\n  alertMessage: '',\n  alertType: 'success',\n  alertDuration: 3000,\n  progressTimerVisible: true,\n  progressTimerValue: 0,\n  isMenuModalVisible: false,\n  isRecordingModalVisible: false,\n  isSettingsModalVisible: false,\n  isRequestsModalVisible: false,\n  isWaitingModalVisible: false,\n  isCoHostModalVisible: false,\n  isMediaSettingsModalVisible: false,\n  isDisplaySettingsModalVisible: false,\n  isParticipantsModalVisible: false,\n  isMessagesModalVisible: false,\n  isConfirmExitModalVisible: false,\n  isConfirmHereModalVisible: false,\n  isShareEventModalVisible: false,\n  isLoadingModalVisible: false,\n\n  recordingMediaOptions: 'video',\n  recordingAudioOptions: 'all',\n  recordingVideoOptions: 'all',\n  recordingVideoType: 'fullDisplay',\n  recordingVideoOptimized: false,\n  recordingDisplayType: 'video',\n  recordingAddHLS: true,\n  recordingNameTags: true,\n  recordingBackgroundColor: '#83c0e9',\n  recordingNameTagsColor: '#ffffff',\n  recordingAddText: false,\n  recordingCustomText: 'Add Text',\n  recordingCustomTextPosition: 'top',\n  recordingCustomTextColor: '#ffffff',\n  recordingOrientationVideo: 'landscape',\n  clearedToResume: true,\n  clearedToRecord: true,\n  recordState: 'green',\n  showRecordButtons: false,\n  recordingProgressTime: '00:00:00',\n  audioSwitching: false,\n  videoSwitching: false,\n  videoAlreadyOn: false,\n  audioAlreadyOn: false,\n  componentSizes: { mainHeight: 0, otherHeight: 0, mainWidth: 0, otherWidth: 0 },\n  hasCameraPermission: false,\n  hasAudioPermission: false,\n  transportCreated: false,\n  localTransportCreated: false,\n  transportCreatedVideo: false,\n  transportCreatedAudio: false,\n  transportCreatedScreen: false,\n  producerTransport: null,\n  localProducerTransport: null,\n  videoProducer: null,\n  localVideoProducer: null,\n  params: {} as ProducerOptions,\n  videoParams: {} as ProducerOptions,\n  audioParams: {} as ProducerOptions,\n  audioProducer: null,\n  localAudioProducer: null,\n  consumerTransports: [],\n  consumingTransports: [],\n\n  // Polls\n  polls: [],\n  poll: null,\n  isPollModalVisible: false,\n\n  // Background\n  customImage: '',\n  selectedImage: '',\n  segmentVideo: null,\n  selfieSegmentation: null,\n  pauseSegmentation: false,\n  processedStream: null,\n  keepBackground: false,\n  backgroundHasChanged: false,\n  virtualStream: null,\n  mainCanvas: null,\n  prevKeepBackground: false,\n  appliedBackground: false,\n  isBackgroundModalVisible: false,\n  autoClickBackground: false,\n\n  // Breakout Rooms\n  breakoutRooms: [],\n  currentRoomIndex: 0,\n  canStartBreakout: false,\n  breakOutRoomStarted: false,\n  breakOutRoomEnded: false,\n  hostNewRoom: -1,\n  limitedBreakRoom: [],\n  mainRoomsLength: 0,\n  memberRoom: -1,\n  isBreakoutRoomsModalVisible: false,\n\n  // Whiteboard\n  whiteboardUsers: [],\n  currentWhiteboardIndex: 0,\n  canStartWhiteboard: false,\n  whiteboardStarted: false,\n  whiteboardEnded: false,\n  whiteboardLimit: 4,\n  isWhiteboardModalVisible: false,\n  isConfigureWhiteboardModalVisible: false,\n  shapes: [],\n  useImageBackground: true,\n  redoStack: [],\n  undoStack: [],\n  canvasStream: null,\n  canvasWhiteboard: null,\n\n  // Screenboard\n  canvasScreenboard: null,\n  processedScreenStream: null,\n  annotateScreenStream: false,\n  mainScreenCanvas: null,\n  isScreenboardModalVisible: false,\n\n  // Control Buttons\n  micActive: false,\n  videoActive: false,\n  screenShareActive: false,\n  endCallActive: false,\n  participantsActive: false,\n  menuActive: false,\n  commentsActive: false,\n};\n\n\n\n\n\n","<!--\n/**\n * @fileoverview MainAspectComponent - Responsive container with screen size tracking\n * @component MainAspectComponent\n * @module components/displayComponents/MainAspectComponent\n * \n * @description\n * A responsive container component that tracks window dimensions and updates screen size\n * categories (wide, medium, small). Automatically adjusts container dimensions based on\n * fraction props and provides real-time screen size state updates. Used as a main content\n * wrapper that adapts to viewport changes.\n * \n * Features:\n * - Real-time window resize tracking\n * - Automatic screen size categorization (wide ≥768px, medium ≥576px, small <576px)\n * - Fractional width/height sizing\n * - Optional controls visibility toggle\n * - Responsive dimension calculations\n * - Slot-based content projection\n * - Debounced resize handling\n * \n * Screen Size Breakpoints:\n * - **Wide Screen**: width ≥ 768px → updateIsWideScreen(true)\n * - **Medium Screen**: 576px ≤ width < 768px → updateIsMediumScreen(true)\n * - **Small Screen**: width < 576px → updateIsSmallScreen(true)\n * \n * @example Basic Responsive Container\n * // <MainAspectComponent\n *   // backgroundColor=\"#000000\"\n *   // :showControls=\"true\"\n *   // :updateIsWideScreen=\"setIsWide\"\n *   // :updateIsMediumScreen=\"setIsMedium\"\n *   // :updateIsSmallScreen=\"setIsSmall\"\n * >\n *   <VideoGrid />\n * // </MainAspectComponent>\n * \n * @example Custom Dimensions (80% width, 90% height)\n * // <MainAspectComponent\n *   // backgroundColor=\"transparent\"\n *   // :containerWidthFraction=\"0.8\"\n *   // :containerHeightFraction=\"0.9\"\n *   // :showControls=\"false\"\n *   // :updateIsWideScreen=\"handleWide\"\n *   // :updateIsMediumScreen=\"handleMedium\"\n *   // :updateIsSmallScreen=\"handleSmall\"\n * >\n *   <ParticipantGrid />\n * // </MainAspectComponent>\n * \n * @example Full Viewport Coverage\n * // <MainAspectComponent\n *   // :containerWidthFraction=\"1\"\n *   // :containerHeightFraction=\"1\"\n *   // :showControls=\"true\"\n *   // :updateIsWideScreen=\"updateWide\"\n *   // :updateIsMediumScreen=\"updateMedium\"\n *   // :updateIsSmallScreen=\"updateSmall\"\n * >\n *   <ScreenShare />\n * // </MainAspectComponent>\n * \n * @remarks\n * The component automatically adds/removes window resize event listeners and\n * recalculates screen size categories on every resize. The defaultFraction (0.94)\n * is applied when controls are visible to reserve space for control elements.\n * \n * Workflow:\n * 1. Component mounts → Attaches resize listener, calculates initial size\n * 2. Determines screen category → Calls appropriate update functions\n * 3. Window resized → Recalculates dimensions and screen category\n * 4. Updates propagate → Parent components receive new screen size state\n * 5. Container dimensions update → Child content reflows\n * 6. Component unmounts → Cleans up resize listener\n * \n * @see {@link MainContainerComponent} - Main content container\n * @see {@link MainGridComponent} - Grid layout for main content area\n */\n-->\n<template>\n  <div\n    :class=\"containerClassNames\"\n    :style=\"containerStyle\"\n    v-bind=\"containerRestAttrs\"\n  >\n    <slot />\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  ref,\n  computed,\n  watch,\n  onMounted,\n  onUnmounted,\n  type CSSProperties,\n  type HTMLAttributes,\n} from 'vue';\n\n/**\n * Props for the MainAspectComponent\n * @interface MainAspectComponentProps\n * \n * @property {string} [backgroundColor='transparent'] - Background color for the container\n * @property {boolean} [showControls=true] - Whether controls are visible (affects dimension calculations)\n * @property {number} [containerWidthFraction=1] - Fraction of available width (0-1)\n * @property {number} [containerHeightFraction=1] - Fraction of available height (0-1)\n * @property {number} [defaultFraction=0.94] - Default fraction applied when controls are shown\n * @property {(isWide: boolean) => void} updateIsWideScreen - Callback when wide screen state changes (≥768px)\n * @property {(isMedium: boolean) => void} updateIsMediumScreen - Callback when medium screen state changes (≥576px)\n * @property {(isSmall: boolean) => void} updateIsSmallScreen - Callback when small screen state changes (<576px)\n * @property {HTMLAttributes} [containerProps] - Additional HTML attributes for container\n * \n * @default backgroundColor - 'transparent'\n * @default showControls - true\n * @default containerWidthFraction - 1\n * @default containerHeightFraction - 1\n * @default defaultFraction - 0.94\n * \n * @example\n * ```typescript\n * // <MainAspectComponent\n *   // backgroundColor=\"#1a1a1a\"\n *   // :showControls=\"true\"\n *   // :containerWidthFraction=\"0.95\"\n *   // :containerHeightFraction=\"0.95\"\n *   // :updateIsWideScreen=\"(isWide) => { screenIsWide.value = isWide; }\"\n *   // :updateIsMediumScreen=\"(isMedium) => { screenIsMedium.value = isMedium; }\"\n *   // :updateIsSmallScreen=\"(isSmall) => { screenIsSmall.value = isSmall; }\"\n * >\n *   <slot />\n * // </MainAspectComponent>\n * ```\n */\nexport interface MainAspectComponentProps {\n  backgroundColor?: string;\n  showControls?: boolean;\n  containerWidthFraction?: number;\n  containerHeightFraction?: number;\n  defaultFraction?: number;\n  updateIsWideScreen: (isWide: boolean) => void;\n  updateIsMediumScreen: (isMedium: boolean) => void;\n  updateIsSmallScreen: (isSmall: boolean) => void;\n  containerProps?: HTMLAttributes;\n}\n\nconst props = withDefaults(defineProps<MainAspectComponentProps>(), {\n  backgroundColor: 'transparent',\n  showControls: true,\n  containerWidthFraction: 1,\n  containerHeightFraction: 1,\n  defaultFraction: 0.94,\n  containerProps: undefined,\n});\n\n// Helper: Join class names\nconst joinClassNames = (...classes: (string | undefined | null)[]): string | undefined => {\n  const filtered = classes.filter(Boolean).join(' ').trim();\n  return filtered.length > 0 ? filtered : undefined;\n};\n\nconst getWindowSize = () => {\n  if (typeof window === 'undefined') {\n    return { width: 0, height: 0 };\n  }\n  return { width: window.innerWidth, height: window.innerHeight };\n};\n\nconst computeDimensions = (size: { width: number; height: number }) => {\n  const { width, height } = size;\n  const computedHeight = props.showControls\n    ? Math.floor(props.containerHeightFraction * height * props.defaultFraction)\n    : Math.floor(props.containerHeightFraction * height);\n  const computedWidth = Math.floor(props.containerWidthFraction * width);\n\n  return { width: computedWidth, height: computedHeight };\n};\n\nconst aspectStyles = ref(computeDimensions(getWindowSize()));\n\nconst updateAspectStyles = () => {\n  const windowSize = getWindowSize();\n  const dimensions = computeDimensions(windowSize);\n\n  const parentWidth = dimensions.width;\n  const parentHeight = dimensions.height;\n\n  let isWideScreen = parentWidth >= 768;\n  const isMediumScreen = parentWidth >= 576 && parentWidth < 768;\n  const isSmallScreen = parentWidth < 576;\n\n  if (!isWideScreen && parentWidth > 1.5 * (parentHeight || 1)) {\n    isWideScreen = true;\n  }\n\n  props.updateIsWideScreen(isWideScreen);\n  props.updateIsMediumScreen(isMediumScreen);\n  props.updateIsSmallScreen(isSmallScreen);\n\n  aspectStyles.value = dimensions;\n};\n\n// Watch for prop changes\nwatch(\n  [\n    () => props.showControls,\n    () => props.containerHeightFraction,\n    () => props.containerWidthFraction,\n    () => props.defaultFraction,\n  ],\n  () => {\n    updateAspectStyles();\n  }\n);\n\nonMounted(() => {\n  updateAspectStyles();\n  window.addEventListener('resize', updateAspectStyles);\n  window.addEventListener('orientationchange', updateAspectStyles);\n});\n\nonUnmounted(() => {\n  window.removeEventListener('resize', updateAspectStyles);\n  window.removeEventListener('orientationchange', updateAspectStyles);\n});\n\n// Container props merging\nconst containerRestAttrs = computed(() => {\n  const { class: _c, style: _s, ...rest } = props.containerProps || {};\n  return rest;\n});\n\nconst containerClassNames = computed(() =>\n  joinClassNames('mediasfu-main-aspect', props.containerProps?.class as string | undefined)\n);\n\nconst containerStyle = computed(() => {\n  const baseStyle: CSSProperties = {\n    backgroundColor: props.backgroundColor,\n    height: `${aspectStyles.value.height}px`,\n    width: `${aspectStyles.value.width}px`,\n    overflow: 'hidden',\n    position: 'relative',\n    transition: 'width 0.2s ease, height 0.2s ease',\n  };\n\n  return {\n    ...baseStyle,\n    ...(typeof props.containerProps?.style === 'object' ? props.containerProps.style : {}),\n  } as CSSProperties;\n});\n\n</script>\n","<!--\n/**\n * @fileoverview LoadingModal - Full-screen loading overlay with spinner\n * @component LoadingModal\n * @module components/displayComponents/LoadingModal\n * \n * @description\n * A full-screen blocking loading overlay that displays a spinner and optional loading text.\n * Centers content vertically and horizontally, prevents user interaction with underlying UI,\n * and supports complete customization via render functions. Used during async operations\n * like room joining, recording start, or data fetching.\n * \n * Features:\n * - Full viewport coverage with fixed positioning\n * - Animated FontAwesome spinner (faSpinner by default)\n * - Customizable background and text colors\n * - Optional loading text message\n * - Toggle spinner visibility independently\n * - Custom spinner icon support\n * - Complete render function control for spinner and content\n * - Full HTML attribute passthrough\n * \n * @example Basic Loading Modal\n * // <LoadingModal\n *   // :isVisible=\"isLoading\"\n *   // loadingText=\"Joining room...\"\n * // />\n * \n * @example Custom Colors\n * // <LoadingModal\n *   // :isVisible=\"processing\"\n *   // loadingText=\"Processing request...\"\n *   // backgroundColor=\"rgba(0,0,0,0.85)\"\n *   // displayColor=\"#ffffff\"\n * // />\n * \n * @example Without Spinner (Text Only)\n * // <LoadingModal\n *   // :isVisible=\"saving\"\n *   // loadingText=\"Saving changes...\"\n *   // :showSpinner=\"false\"\n *   // backgroundColor=\"#1a1a1a\"\n *   // displayColor=\"#22c55e\"\n * // />\n * \n * @example Custom Spinner Icon\n * // <LoadingModal\n *   // :isVisible=\"uploading\"\n *   // loadingText=\"Uploading file...\"\n *   // :spinnerIcon=\"faCloudUploadAlt\"\n *   // displayColor=\"#3b82f6\"\n * // />\n * \n * @example Custom Content Renderer\n * // <LoadingModal\n *   // :isVisible=\"connecting\"\n *   // loadingText=\"Connecting to server...\"\n *   // :renderContent=\"({ defaultContent, isVisible, displayColor, loadingText }) =>\n *     h('div', { class: 'custom-loading', style: { color: displayColor } }, [\n *       h('div', { class: 'loader-animation' }),\n *       h('h2', loadingText),\n *       h('p', 'Please wait...')\n *     ])\n *   \"\n * // />\n * \n * @example Custom Spinner Renderer\n * // <LoadingModal\n *   // :isVisible=\"loading\"\n *   // loadingText=\"Loading...\"\n *   // :renderSpinner=\"({ defaultSpinner, isVisible, displayColor }) =>\n *     h('div', { class: 'custom-spinner-wrapper' }, [\n *       h('div', {\n *         class: 'pulse-circle',\n *         style: { borderColor: displayColor }\n *       })\n *     ])\n *   \"\n * // />\n * \n * @remarks\n * This is a blocking modal - it prevents all user interaction with the underlying UI.\n * Use sparingly and only for operations that truly require the user to wait. For\n * non-blocking loading indicators, consider using inline spinners or progress bars.\n * \n * Workflow:\n * 1. isVisible=true → Modal appears, covers entire viewport\n * 2. Spinner rotates (if showSpinner=true), text displays\n * 3. Async operation completes → Parent sets isVisible=false\n * 4. Modal disappears, user can interact with UI again\n * \n * @see {@link AlertComponent} - For non-blocking notifications\n */\n-->\n<template>\n  <RenderVNode :node=\"containerNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  computed,\n  defineComponent,\n  h,\n  isVNode,\n  type CSSProperties,\n  type HTMLAttributes,\n  type PropType,\n  type VNode,\n  type VNodeChild,\n} from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faSpinner, type IconDefinition } from '@fortawesome/free-solid-svg-icons';\n\n/**\n * Options passed to renderSpinner function\n * @interface RenderSpinnerOptions\n * @property {VNode | null} defaultSpinner - The default FontAwesome spinner VNode\n * @property {boolean} isVisible - Whether the loading modal is visible\n * @property {string} displayColor - Color for the spinner\n */\ninterface RenderSpinnerOptions {\n  defaultSpinner: VNode | null;\n  isVisible: boolean;\n  displayColor: string;\n}\n\n/**\n * Options passed to renderContent function\n * @interface RenderContentOptions\n * @property {VNode} defaultContent - The default loading content VNode (spinner + text)\n * @property {boolean} isVisible - Whether the loading modal is visible\n * @property {string} displayColor - Color for text and spinner\n * @property {VNodeChild} loadingText - The loading text message\n */\ninterface RenderContentOptions {\n  defaultContent: VNode;\n  isVisible: boolean;\n  displayColor: string;\n  loadingText: VNodeChild;\n}\n\n/**\n * Props for the LoadingModal component\n * @interface LoadingModalProps\n * \n * @property {boolean} isVisible - Whether the loading modal is currently visible\n * @property {string} [backgroundColor='#83c0e9'] - Background color for the full-screen overlay\n * @property {string} [displayColor='black'] - Color for spinner and text\n * @property {VNodeChild} [loadingText=''] - Loading message text to display\n * @property {boolean} [showSpinner=true] - Whether to show the spinner animation\n * @property {IconDefinition} [spinnerIcon=faSpinner] - FontAwesome icon for the spinner\n * @property {HTMLAttributes} [containerProps] - Additional HTML attributes for the container\n * @property {HTMLAttributes} [contentProps] - Additional HTML attributes for the content wrapper\n * @property {HTMLAttributes} [spinnerWrapperProps] - Additional HTML attributes for the spinner wrapper\n * @property {Record<string, unknown>} [spinnerProps] - Additional props for the FontAwesomeIcon component\n * @property {HTMLAttributes} [textProps] - Additional HTML attributes for the text element\n * @property {(options: RenderSpinnerOptions) => VNodeChild} [renderSpinner] - Custom render function for spinner\n * @property {(options: RenderContentOptions) => VNodeChild} [renderContent] - Custom render function for entire content\n * \n * @default backgroundColor - '#83c0e9'\n * @default displayColor - 'black'\n * @default loadingText - ''\n * @default showSpinner - true\n * @default spinnerIcon - faSpinner\n * \n * @example\n * ```typescript\n * // <LoadingModal\n *   // :isVisible=\"isLoading\"\n *   // loadingText=\"Please wait...\"\n *   // backgroundColor=\"rgba(0,0,0,0.9)\"\n *   // displayColor=\"#ffffff\"\n *   // :showSpinner=\"true\"\n * // />\n * ```\n */\nexport interface LoadingModalProps {\n  isVisible: boolean;\n  backgroundColor?: string;\n  displayColor?: string;\n  loadingText?: VNodeChild;\n  showSpinner?: boolean;\n  spinnerIcon?: IconDefinition;\n  containerProps?: HTMLAttributes;\n  contentProps?: HTMLAttributes;\n  spinnerWrapperProps?: HTMLAttributes;\n  spinnerProps?: Record<string, unknown>;\n  textProps?: HTMLAttributes;\n  renderSpinner?: (options: RenderSpinnerOptions) => VNodeChild;\n  renderContent?: (options: RenderContentOptions) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<LoadingModalProps>(), {\n  backgroundColor: '#83c0e9',\n  displayColor: 'black',\n  loadingText: 'Loading...',\n  showSpinner: true,\n  spinnerIcon: () => faSpinner,\n  containerProps: undefined,\n  contentProps: undefined,\n  spinnerWrapperProps: undefined,\n  spinnerProps: undefined,\n  textProps: undefined,\n  renderSpinner: undefined,\n  renderContent: undefined,\n});\n\n// Helper: Join class names\nfunction joinClassNames(...classes: (string | undefined)[]): string {\n  return classes.filter(Boolean).join(' ');\n}\n\n// RenderVNode wrapper component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Boolean, Array, Function] as PropType<VNodeChild>,\n      default: null,\n    },\n  },\n  render() {\n    if (!this.node) return null;\n    if (isVNode(this.node)) return this.node;\n    if (typeof this.node === 'function') {\n      const result = (this.node as () => VNodeChild)();\n      return isVNode(result) ? result : String(result);\n    }\n    return String(this.node);\n  },\n});\n\n// Container props merging\nconst containerRestAttrs = computed(() => {\n  const { class: _c, style: _s, ...rest } = props.containerProps || {};\n  return rest;\n});\n\nconst containerClassNames = computed(() =>\n  joinClassNames('mediasfu-loading-modal', props.containerProps?.class as string | undefined)\n);\n\nconst containerStyle = computed(() => {\n  const baseStyle: CSSProperties = {\n    position: 'fixed',\n    top: 0,\n    left: 0,\n    width: '100%',\n    height: '100%',\n    backgroundColor: props.backgroundColor,\n    display: 'flex',\n    justifyContent: 'center',\n    alignItems: 'center',\n    zIndex: 999,\n  };\n\n  return {\n    ...baseStyle,\n    ...(typeof props.containerProps?.style === 'object' ? props.containerProps.style : {}),\n  } as CSSProperties;\n});\n\n// Content props merging\nconst contentRestAttrs = computed(() => {\n  const { class: _c, style: _s, ...rest } = props.contentProps || {};\n  return rest;\n});\n\nconst contentClassNames = computed(() =>\n  joinClassNames(\n    'mediasfu-loading-modal__content',\n    props.contentProps?.class as string | undefined\n  )\n);\n\nconst contentStyle = computed(() => {\n  const baseStyle: CSSProperties = {\n    backgroundColor: props.backgroundColor,\n    borderRadius: '10px',\n    padding: '16px',\n    maxWidth: '240px',\n    display: 'flex',\n    flexDirection: 'column',\n    gap: '12px',\n    alignItems: 'center',\n  };\n\n  return {\n    ...baseStyle,\n    ...(typeof props.contentProps?.style === 'object' ? props.contentProps.style : {}),\n  } as CSSProperties;\n});\n\n// Spinner wrapper props merging\nconst spinnerWrapperRestAttrs = computed(() => {\n  const { class: _c, style: _s, ...rest } = props.spinnerWrapperProps || {};\n  return rest;\n});\n\nconst spinnerWrapperClassNames = computed(() =>\n  joinClassNames(\n    'mediasfu-loading-modal__spinner-wrapper',\n    props.spinnerWrapperProps?.class as string | undefined\n  )\n);\n\nconst spinnerWrapperStyle = computed(() => {\n  const baseStyle: CSSProperties = {\n    display: 'flex',\n    justifyContent: 'center',\n  };\n\n  return {\n    ...baseStyle,\n    ...(typeof props.spinnerWrapperProps?.style === 'object'\n      ? props.spinnerWrapperProps.style\n      : {}),\n  } as CSSProperties;\n});\n\n// Spinner element\nconst spinnerElement = computed(() => {\n  if (!props.showSpinner) return null;\n\n  const spinnerStyle: CSSProperties = {\n    fontSize: '48px',\n    color: props.displayColor,\n  };\n\n  return h(\n    FontAwesomeIcon,\n    {\n      icon: props.spinnerIcon,\n      spin: true,\n      style: spinnerStyle,\n      ...props.spinnerProps,\n    },\n    {}\n  );\n});\n\n// Rendered spinner (with wrapper)\nconst renderedSpinner = computed(() => {\n  if (!props.showSpinner) return null;\n\n  return h(\n    'div',\n    {\n      class: spinnerWrapperClassNames.value,\n      style: spinnerWrapperStyle.value,\n      ...spinnerWrapperRestAttrs.value,\n    },\n    [spinnerElement.value]\n  );\n});\n\n// Text props merging\nconst textRestAttrs = computed(() => {\n  const { class: _c, style: _s, ...rest } = props.textProps || {};\n  return rest;\n});\n\nconst textClassNames = computed(() =>\n  joinClassNames('mediasfu-loading-modal__text', props.textProps?.class as string | undefined)\n);\n\nconst textStyle = computed(() => {\n  const baseStyle: CSSProperties = {\n    color: props.displayColor,\n    textAlign: 'center',\n  };\n\n  return {\n    ...baseStyle,\n    ...(typeof props.textProps?.style === 'object' ? props.textProps.style : {}),\n  } as CSSProperties;\n});\n\n// Default content node\nconst defaultContentNode = computed(() => {\n  const children: VNode[] = [];\n\n  // Spinner\n  if (props.renderSpinner) {\n    const customSpinner = props.renderSpinner({\n      defaultSpinner: renderedSpinner.value,\n      isVisible: props.isVisible,\n      displayColor: props.displayColor,\n    });\n    if (customSpinner) {\n      if (isVNode(customSpinner)) {\n        children.push(customSpinner);\n      } else {\n        children.push(h(RenderVNode, { node: customSpinner }));\n      }\n    }\n  } else if (renderedSpinner.value) {\n    children.push(renderedSpinner.value);\n  }\n\n  // Text\n  const textContent =\n    typeof props.loadingText === 'function'\n      ? (props.loadingText as () => VNodeChild)()\n      : props.loadingText;\n\n  children.push(\n    h(\n      'div',\n      {\n        class: textClassNames.value,\n        style: textStyle.value,\n        ...textRestAttrs.value,\n      },\n      isVNode(textContent) ? [textContent] : [h(RenderVNode, { node: textContent })]\n    )\n  );\n\n  return h(\n    'div',\n    {\n      class: contentClassNames.value,\n      style: contentStyle.value,\n      ...contentRestAttrs.value,\n    },\n    children\n  );\n});\n\n// Final content (with renderContent hook)\nconst finalContent = computed(() => {\n  if (props.renderContent) {\n    const customContent = props.renderContent({\n      defaultContent: defaultContentNode.value,\n      isVisible: props.isVisible,\n      displayColor: props.displayColor,\n      loadingText: props.loadingText || 'Loading...',\n    });\n    if (customContent) {\n      if (isVNode(customContent)) return customContent;\n      return h(RenderVNode, { node: customContent });\n    }\n  }\n  return defaultContentNode.value;\n});\n\n// Container node\nconst containerNode = computed(() => {\n  if (!props.isVisible) return null;\n\n  return h(\n    'div',\n    {\n      class: containerClassNames.value,\n      style: containerStyle.value,\n      ...containerRestAttrs.value,\n    },\n    [finalContent.value]\n  );\n});\n\n</script>\n\n<style scoped>\n/* Component-specific styles */\n</style>\n","<!--\n * ControlButtonsComponent - Customizable control button row/column layout\n *\n * @fileoverview\n * A flexible control buttons container that renders a row or column of interactive buttons\n * with icons, labels, and active states. Provides extensive customization through props,\n * render functions, and per-button configuration. Designed for media controls, toolbar actions,\n * and interactive command interfaces.\n *\n * @component ControlButtonsComponent\n * @module components/displayComponents/ControlButtonsComponent\n *\n * @description\n * This component displays an array of buttons with icons and optional labels. Each button\n * supports:\n * - Active/inactive states with custom colors\n * - Primary and alternate icons (e.g., mic on/off)\n * - Custom background colors per button\n * - Individual button visibility control\n * - Custom render functions for button content\n * - FontAwesome icons or custom Vue components\n * - Flexible alignment (flex-start, center, flex-end, space-between, etc.)\n * - Horizontal or vertical orientation\n *\n * @example\n * // Basic horizontal button row\n * // <ControlButtonsComponent\n *   // :buttons=\"[\n *     { \n *       name: 'Microphone',\n *       icon: faMicrophone,\n *       alternateIcon: faMicrophoneSlash,\n *       active: isMicActive,\n *       onPress: toggleMicrophone\n *     },\n *     { \n *       name: 'Camera',\n *       icon: faVideo,\n *       alternateIcon: faVideoSlash,\n *       active: isCameraActive,\n *       onPress: toggleCamera\n *     },\n *     { \n *       name: 'Screen',\n *       icon: faDesktop,\n *       active: isSharingScreen,\n *       onPress: toggleScreenShare\n *     },\n *   ]\"\n *   // alignment=\"flex-start\"\n *   // :vertical=\"false\"\n * // />\n *\n * @example\n * // Vertical button column with custom colors\n * // <ControlButtonsComponent\n *   // :buttons=\"toolbarButtons\"\n *   // :vertical=\"true\"\n *   // alignment=\"center\"\n *   // button-color=\"#ffffff\"\n *   // :button-background-color=\"{ default: '#000000', pressed: '#333333' }\"\n *   // :gap=\"10\"\n * // />\n *\n * @example\n * // Custom styled buttons with individual configurations\n * // <ControlButtonsComponent\n *   // :buttons=\"[\n *     {\n *       name: 'Record',\n *       icon: faCircle,\n *       active: isRecording,\n *       activeColor: '#ff0000',\n *       inActiveColor: '#ffffff',\n *       backgroundColor: { default: '#1a1a1a', pressed: '#ff0000' },\n *       onPress: () => toggleRecording()\n *     },\n *     {\n *       name: 'Settings',\n *       icon: faCog,\n *       disabled: !canAccessSettings,\n *       onPress: openSettingsModal\n *     }\n *   ]\"\n *   // :buttonsContainerStyle=\"{ padding: '10px', borderRadius: '8px' }\"\n * // />\n *\n * @example\n * // Custom render function for button content\n * // <ControlButtonsComponent\n *   // :buttons=\"controlButtons\"\n *   // :render-button-content=\"(options) => {\n *     const { index, button, defaultIcon, defaultLabel, defaultContent, vertical } = options;\n *     return h('div', { class: 'custom-button-wrapper' }, [\n *       h('div', { class: 'icon-badge' }, [\n *         defaultIcon,\n *         button.active ? h('span', { class: 'active-indicator' }) : null\n *       ]),\n *       h('span', { class: 'label-text' }, button.name)\n *     ]);\n *   }\"\n * // />\n *\n * @example\n * // Custom button renderer with wrapper\n * // <ControlButtonsComponent\n *   // :buttons=\"menuButtons\"\n *   // :render-button=\"(options) => {\n *     const { index, button, defaultButton, defaultProps, vertical } = options;\n *     if (button.customComponent) {\n *       return h(button.customComponent, { ...defaultProps, button });\n *     }\n *     return h('div', { class: 'button-wrapper' }, [defaultButton]);\n *   }\"\n * // />\n-->\n<template>\n  <RenderVNode :node=\"containerNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  computed,\n  defineComponent,\n  h,\n  isVNode,\n  type ButtonHTMLAttributes,\n  type Component,\n  type CSSProperties,\n  type HTMLAttributes,\n  type PropType,\n  type VNodeChild,\n} from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\n\n// Helper to join class names\nfunction joinClassNames(...classes: Array<string | undefined | null | false>): string | undefined {\n  const filtered = classes.filter(Boolean) as string[];\n  return filtered.length > 0 ? filtered.join(' ').trim() : undefined;\n}\n\n/**\n * Button configuration interface\n * \n * @interface Button\n * @property {string} [name] - Button label text (displayed below icon)\n * @property {IconDefinition} [icon] - FontAwesome icon for inactive/default state\n * @property {IconDefinition} [alternateIcon] - FontAwesome icon for active state (e.g., mic on/off)\n * @property {() => void} [onPress] - Click handler function\n * @property {{ default?: string; pressed?: string; }} [backgroundColor] - Background colors\n * @property {boolean} [active] - Whether button is in active state (affects icon/color)\n * @property {Component} [alternateIconComponent] - Custom Vue component for alternate icon\n * @property {Component} [iconComponent] - Custom Vue component for primary icon\n * @property {Component} [customComponent] - Completely custom Vue component for button\n * @property {string} [color] - Icon/text color (fallback for both states)\n * @property {string} [activeColor] - Icon/text color when active\n * @property {string} [inActiveColor] - Icon/text color when inactive\n * @property {boolean} [disabled] - Whether button is disabled (greyed out, no interaction)\n * @property {boolean} [show] - Whether button is visible\n * @default true\n * @property {CSSProperties} [style] - Custom CSS styles for button element\n * @property {string} [className] - CSS class name for button element\n * @property {ButtonHTMLAttributes} [buttonProps] - HTML attributes for <button> element\n * @property {HTMLAttributes} [iconWrapperProps] - HTML attributes for icon wrapper div\n * @property {HTMLAttributes} [textProps] - HTML attributes for text/label span\n * @property {HTMLAttributes} [contentWrapperProps] - HTML attributes for content wrapper div\n * @property {(options: ButtonContentRenderOptions) => VNodeChild} [renderContent] - Custom renderer for button content\n */\nexport interface Button {\n  name?: string;\n  icon?: IconDefinition;\n  alternateIcon?: IconDefinition;\n  onPress?: () => void;\n  backgroundColor?: {\n    default?: string;\n    pressed?: string;\n  };\n  active?: boolean;\n  alternateIconComponent?: Component;\n  iconComponent?: Component;\n  customComponent?: Component;\n  color?: string;\n  activeColor?: string;\n  inActiveColor?: string;\n  disabled?: boolean;\n  show?: boolean;\n  style?: CSSProperties;\n  className?: string;\n  buttonProps?: ButtonHTMLAttributes;\n  iconWrapperProps?: HTMLAttributes;\n  textProps?: HTMLAttributes;\n  contentWrapperProps?: HTMLAttributes;\n  renderContent?: (options: {\n    index: number;\n    isActive: boolean;\n    defaultIcon: VNodeChild;\n    defaultLabel: VNodeChild;\n    defaultContent: VNodeChild;\n    vertical: boolean;\n  }) => VNodeChild;\n}\n\n/**\n * ControlButtonsComponent props interface\n * \n * @interface ControlButtonsComponentProps\n * @property {Button[]} buttons - Array of button configurations to render\n * @property {string} [buttonColor] - Default icon/text color for all buttons\n * @property {{ default?: string; pressed?: string; }} [buttonBackgroundColor] - Default background colors for all buttons\n * @property {'flex-start' | 'center' | 'flex-end' | 'space-between' | 'space-around' | 'space-evenly'} [alignment='flex-start'] - Flexbox alignment along main axis\n * @default 'flex-start'\n * @property {boolean} [vertical=false] - Whether buttons are arranged vertically (column) or horizontally (row)\n * @default false\n * @property {CSSProperties} [buttonsContainerStyle] - Custom styles for the container element\n * @property {Component} [alternateIconComponent] - Default alternate icon component for all buttons\n * @property {HTMLAttributes} [containerProps] - HTML attributes for container div\n * @property {ButtonHTMLAttributes} [buttonProps] - Default HTML attributes for all <button> elements\n * @property {CSSProperties} [buttonStyle] - Default styles for all button elements\n * @property {string} [buttonClassName] - Default CSS class for all button elements\n * @property {HTMLAttributes} [iconWrapperProps] - Default HTML attributes for all icon wrapper divs\n * @property {HTMLAttributes} [textProps] - Default HTML attributes for all text/label spans\n * @property {HTMLAttributes} [contentWrapperProps] - Default HTML attributes for all content wrapper divs\n * @property {(options: ButtonRenderOptions) => VNodeChild} [renderButton] - Custom renderer for entire button element\n * @example\n * ```typescript\n * renderButton: (options) => {\n *   // const { index, button, defaultButton } = options;\n *   // return h('div', { class: 'button-wrapper' }, [defaultButton]);\n * }\n * ```\n * @property {(options: ButtonContentRenderOptions) => VNodeChild} [renderButtonContent] - Custom renderer for button content (icon + label)\n * @example\n * ```typescript\n * renderButtonContent: (options) => {\n *   // const { defaultIcon, defaultLabel } = options;\n *   // return h('div', { class: 'custom-content' }, [defaultIcon, defaultLabel]);\n * }\n * ```\n * @property {number | string} [gap] - Gap/spacing between buttons (CSS gap value)\n * @example '10px', 10, '1rem'\n */\nexport interface ControlButtonsComponentProps {\n  buttons: Button[];\n  buttonColor?: string;\n  buttonBackgroundColor?: {\n    default?: string;\n    pressed?: string;\n  };\n  alignment?:\n    | 'flex-start'\n    | 'center'\n    | 'flex-end'\n    | 'space-between'\n    | 'space-around'\n    | 'space-evenly';\n  vertical?: boolean;\n  buttonsContainerStyle?: CSSProperties;\n  alternateIconComponent?: Component;\n  containerProps?: HTMLAttributes;\n  buttonProps?: ButtonHTMLAttributes;\n  buttonStyle?: CSSProperties;\n  buttonClassName?: string;\n  iconWrapperProps?: HTMLAttributes;\n  textProps?: HTMLAttributes;\n  contentWrapperProps?: HTMLAttributes;\n  renderButton?: (options: {\n    index: number;\n    button: Button;\n    defaultButton: VNodeChild;\n    defaultProps: ButtonHTMLAttributes;\n    vertical: boolean;\n  }) => VNodeChild;\n  renderButtonContent?: (options: {\n    index: number;\n    button: Button;\n    defaultIcon: VNodeChild;\n    defaultLabel: VNodeChild;\n    defaultContent: VNodeChild;\n    vertical: boolean;\n  }) => VNodeChild;\n  gap?: number | string;\n}\n\nconst props = withDefaults(defineProps<ControlButtonsComponentProps>(), {\n  alignment: 'flex-start',\n  vertical: false,\n  buttonColor: undefined,\n  buttonBackgroundColor: undefined,\n  buttonsContainerStyle: undefined,\n  alternateIconComponent: undefined,\n  containerProps: undefined,\n  buttonProps: undefined,\n  buttonStyle: undefined,\n  buttonClassName: undefined,\n  iconWrapperProps: undefined,\n  textProps: undefined,\n  contentWrapperProps: undefined,\n  renderButton: undefined,\n  renderButtonContent: undefined,\n  gap: undefined,\n});\n\n// RenderVNode wrapper component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Boolean, Array, Function] as PropType<VNodeChild>,\n      default: null,\n    },\n  },\n  render() {\n    if (!this.node) return null;\n    if (isVNode(this.node)) return this.node;\n    if (typeof this.node === 'function') {\n      const result = (this.node as () => VNodeChild)();\n      return isVNode(result) ? result : String(result);\n    }\n    return String(this.node);\n  },\n});\n\nconst getAlignmentStyle = computed<CSSProperties>(() => {\n  const alignment = props.alignment;\n  if (alignment === 'center') {\n    return { justifyContent: 'center' };\n  } else if (alignment === 'flex-end') {\n    return { justifyContent: 'flex-end' };\n  } else if (alignment === 'space-between') {\n    return { justifyContent: 'space-between' };\n  } else if (alignment === 'space-around') {\n    return { justifyContent: 'space-around' };\n  } else if (alignment === 'space-evenly') {\n    return { justifyContent: 'space-evenly' };\n  } else {\n    return { justifyContent: 'flex-start' };\n  }\n});\n\n// Extract shared button props\nconst sharedButtonAttrs = computed(() => {\n  const buttonProps = props.buttonProps || {};\n  const { class: cls, style, onClick, type, ...rest } = buttonProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    onClick: onClick as ((event: MouseEvent) => void) | undefined,\n    type: type as string | undefined,\n    rest,\n  };\n});\n\n// Extract container props\nconst containerAttrs = computed(() => {\n  const containerProps = props.containerProps || {};\n  const { class: cls, style, ...rest } = containerProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\n// Container class names\nconst containerClassNames = computed(() => \n  joinClassNames('mediasfu-container', containerAttrs.value.className)\n);\n\n// Container style\nconst containerStyle = computed<CSSProperties>(() => ({\n  ...getAlignmentStyle.value,\n  ...(props.vertical ? { flexDirection: 'column' } : {}),\n  ...(props.gap !== undefined ? { gap: typeof props.gap === 'number' ? `${props.gap}px` : props.gap } : {}),\n  ...props.buttonsContainerStyle,\n  ...containerAttrs.value.style,\n}));\n\n// Extract default content wrapper props\nconst defaultContentWrapperAttrs = computed(() => {\n  const contentWrapperProps = props.contentWrapperProps || {};\n  const { class: cls, style, ...rest } = contentWrapperProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\n// Extract default icon wrapper props\nconst defaultIconWrapperAttrs = computed(() => {\n  const iconWrapperProps = props.iconWrapperProps || {};\n  const { class: cls, style, ...rest } = iconWrapperProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\n// Extract default text props\nconst defaultTextAttrs = computed(() => {\n  const textProps = props.textProps || {};\n  const { class: cls, style, ...rest } = textProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\n// Button nodes computed\nconst buttonNodes = computed(() => {\n  return props.buttons.map((button, index) => {\n    // Extract per-button props\n    const {\n      buttonProps: perButtonProps,\n      style: perButtonStyle,\n      className: perButtonClassName,\n      iconWrapperProps: perButtonIconWrapperProps,\n      textProps: perButtonTextProps,\n      contentWrapperProps: perButtonContentWrapperProps,\n    } = button;\n\n    // Extract per-button button props\n    const perBtnProps = perButtonProps || {};\n    const {\n      onClick: perButtonOnClick,\n      style: perButtonButtonStyle,\n      class: perButtonButtonClassName,\n      type: perButtonType,\n      ...restPerButtonProps\n    } = perBtnProps as Record<string, unknown>;\n\n    // Content wrapper props\n    const perContentWrapperProps = perButtonContentWrapperProps || {};\n    const {\n      style: buttonContentWrapperStyle,\n      class: buttonContentWrapperClassName,\n      ...restButtonContentWrapper\n    } = perContentWrapperProps as Record<string, unknown>;\n\n    const contentWrapperClassName = joinClassNames(\n      'mediasfu-button-content',\n      defaultContentWrapperAttrs.value.className,\n      buttonContentWrapperClassName as string | undefined\n    );\n\n    const contentWrapperStyle: CSSProperties = {\n      display: 'flex',\n      alignItems: 'center',\n      gap: props.vertical ? '6px' : '8px',\n      ...(defaultContentWrapperAttrs.value.style && typeof defaultContentWrapperAttrs.value.style === 'object' ? defaultContentWrapperAttrs.value.style : {}),\n      ...(buttonContentWrapperStyle && typeof buttonContentWrapperStyle === 'object' ? buttonContentWrapperStyle : {}),\n    };\n\n    const resolvedContentWrapperProps: HTMLAttributes = {\n      ...defaultContentWrapperAttrs.value.rest,\n      ...restButtonContentWrapper,\n      class: contentWrapperClassName,\n      style: contentWrapperStyle,\n    };\n\n    // Icon wrapper props\n    const perIconWrapperProps = perButtonIconWrapperProps || {};\n    const {\n      style: perButtonIconWrapperStyle,\n      class: perButtonIconWrapperClassName,\n      ...restPerButtonIconWrapper\n    } = perIconWrapperProps as Record<string, unknown>;\n\n    const iconWrapperClassName = joinClassNames(\n      'mediasfu-button-icon',\n      defaultIconWrapperAttrs.value.className,\n      perButtonIconWrapperClassName as string | undefined\n    );\n\n    const iconWrapperStyle: CSSProperties = {\n      display: 'flex',\n      alignItems: 'center',\n      ...(defaultIconWrapperAttrs.value.style && typeof defaultIconWrapperAttrs.value.style === 'object' ? defaultIconWrapperAttrs.value.style : {}),\n      ...(perButtonIconWrapperStyle && typeof perButtonIconWrapperStyle === 'object' ? perButtonIconWrapperStyle : {}),\n    };\n\n    const resolvedIconWrapperProps: HTMLAttributes = {\n      ...defaultIconWrapperAttrs.value.rest,\n      ...restPerButtonIconWrapper,\n      class: iconWrapperClassName,\n      style: iconWrapperStyle,\n    };\n\n    // Text props\n    const perTextProps = perButtonTextProps || {};\n    const {\n      style: perButtonTextStyle,\n      class: perButtonTextClassName,\n      ...restPerButtonTextProps\n    } = perTextProps as Record<string, unknown>;\n\n    const textClassName = joinClassNames(\n      'buttonText',\n      defaultTextAttrs.value.className,\n      perButtonTextClassName as string | undefined\n    );\n\n    const textStyle: CSSProperties = {\n      color: button.color || props.buttonColor || '#ffffff',\n      ...(defaultTextAttrs.value.style && typeof defaultTextAttrs.value.style === 'object' ? defaultTextAttrs.value.style : {}),\n      ...(perButtonTextStyle && typeof perButtonTextStyle === 'object' ? perButtonTextStyle : {}),\n    };\n\n    const resolvedTextProps: HTMLAttributes = {\n      ...defaultTextAttrs.value.rest,\n      ...restPerButtonTextProps,\n      class: textClassName,\n      style: textStyle,\n    };\n\n    // Resolve icon colors\n    const activeIconColor = button.activeColor || props.buttonColor || '#ffffff';\n    const inactiveIconColor = button.inActiveColor || props.buttonColor || '#ffffff';\n\n    // Resolve icon element\n    const resolvedIcon = (() => {\n      if (button.customComponent) {\n        return h(button.customComponent);\n      }\n\n      if (button.icon) {\n        if (button.active) {\n          if (button.alternateIconComponent) {\n            return h(button.alternateIconComponent);\n          }\n\n          if (button.alternateIcon) {\n            return h(FontAwesomeIcon, {\n              icon: button.alternateIcon,\n              size: 'lg',\n              color: activeIconColor,\n            });\n          }\n\n          if (props.alternateIconComponent) {\n            return h(props.alternateIconComponent);\n          }\n        }\n\n        if (button.iconComponent) {\n          return h(button.iconComponent);\n        }\n\n        return h(FontAwesomeIcon, {\n          icon: button.icon,\n          size: 'lg',\n          color: inactiveIconColor,\n        });\n      }\n\n      return props.alternateIconComponent ? h(props.alternateIconComponent) : null;\n    })();\n\n    const iconElement = resolvedIcon\n      ? h('span', resolvedIconWrapperProps, resolvedIcon)\n      : null;\n\n    const labelElement = button.name\n      ? h('span', resolvedTextProps, button.name)\n      : null;\n\n    const defaultContent = h(\n      'div',\n      resolvedContentWrapperProps,\n      [iconElement, labelElement].filter(Boolean)\n    );\n\n    // Build content with render hooks\n    const renderedContent = (() => {\n      if (button.renderContent) {\n        return button.renderContent({\n          index,\n          isActive: !!button.active,\n          defaultIcon: iconElement,\n          defaultLabel: labelElement,\n          defaultContent,\n          vertical: props.vertical,\n        });\n      }\n\n      if (props.renderButtonContent) {\n        return props.renderButtonContent({\n          index,\n          button,\n          defaultIcon: iconElement,\n          defaultLabel: labelElement,\n          defaultContent,\n          vertical: props.vertical,\n        });\n      }\n\n      return defaultContent;\n    })();\n\n    // Merged button rest props\n    const mergedButtonRest: ButtonHTMLAttributes = {\n      ...sharedButtonAttrs.value.rest,\n      ...restPerButtonProps,\n      disabled:\n        button.disabled ?? (restPerButtonProps?.disabled as boolean | undefined) ?? (sharedButtonAttrs.value.rest?.disabled as boolean | undefined),\n    };\n\n    const isVisible = button.show !== false;\n\n    // Background color logic\n    const backgroundDefault = (() => {\n      const pressedColor =\n        button.backgroundColor?.pressed || props.buttonBackgroundColor?.pressed;\n      const defaultColor =\n        button.backgroundColor?.default || props.buttonBackgroundColor?.default;\n\n      if (!isVisible) {\n        return 'transparent';\n      }\n\n      if (button.active && pressedColor) {\n        return pressedColor;\n      }\n\n      if (defaultColor) {\n        return defaultColor;\n      }\n\n      const sharedStyle = sharedButtonAttrs.value.style as CSSProperties || {};\n      const btnStyle = props.buttonStyle || {};\n      const perBtnBtnStyle = perButtonButtonStyle as CSSProperties || {};\n      const perBtnStyle = perButtonStyle as CSSProperties || {};\n\n      return sharedStyle.backgroundColor || btnStyle.backgroundColor || perBtnBtnStyle.backgroundColor || perBtnStyle.backgroundColor || 'transparent';\n    })();\n\n    const combinedStyle = {\n      backgroundColor: backgroundDefault,\n      ...(props.vertical ? { flexDirection: 'column' } : {}),\n      display: isVisible ? 'flex' : 'none',\n      ...(sharedButtonAttrs.value.style && typeof sharedButtonAttrs.value.style === 'object' ? sharedButtonAttrs.value.style : {}),\n      ...(props.buttonStyle && typeof props.buttonStyle === 'object' ? props.buttonStyle : {}),\n      ...(perButtonButtonStyle && typeof perButtonButtonStyle === 'object' ? perButtonButtonStyle : {}),\n      ...(perButtonStyle && typeof perButtonStyle === 'object' ? perButtonStyle : {}),\n    } as CSSProperties;\n\n    if (isVisible && !combinedStyle.display) {\n      combinedStyle.display = 'flex';\n    }\n\n    const combinedClassName = joinClassNames(\n      'buttonContainer',\n      sharedButtonAttrs.value.className,\n      props.buttonClassName,\n      perButtonButtonClassName as string | undefined,\n      perButtonClassName\n    );\n\n    const resolvedType = (perButtonType as string | undefined) || sharedButtonAttrs.value.type || 'button';\n\n    const handleClick = (event: MouseEvent) => {\n      const perOnClick = perButtonOnClick as ((event: MouseEvent) => void) | undefined;\n      if (perOnClick) perOnClick(event);\n      if (sharedButtonAttrs.value.onClick) sharedButtonAttrs.value.onClick(event);\n\n      if (!event.defaultPrevented) {\n        button.onPress?.();\n      }\n    };\n\n    const computedButtonProps: ButtonHTMLAttributes = {\n      ...mergedButtonRest,\n      class: combinedClassName,\n      style: combinedStyle,\n      type: resolvedType as 'button' | 'submit' | 'reset' | undefined,\n      onClick: handleClick,\n    };\n\n    // Render button with hook if provided\n    if (props.renderButton) {\n      const customButton = props.renderButton({\n        index,\n        button,\n        defaultButton: h('button', computedButtonProps, [renderedContent]),\n        defaultProps: computedButtonProps,\n        vertical: props.vertical,\n      });\n\n      return isVNode(customButton) ? customButton : h(RenderVNode, { node: customButton });\n    }\n\n    return h('button', computedButtonProps, [\n      isVNode(renderedContent) ? renderedContent : h(RenderVNode, { node: renderedContent }),\n    ]);\n  });\n});\n\n// Container node\nconst containerNode = computed<VNodeChild>(() => {\n  return h(\n    'div',\n    {\n      ...containerAttrs.value.rest,\n      class: containerClassNames.value,\n      style: containerStyle.value,\n    },\n    buttonNodes.value\n  );\n});\n</script>\n\n<style scoped>\n@import './ControlButtonsComponent.css';\n</style>\n","<!--\n * ControlButtonsAltComponent - Alternative positioned control buttons layout\n *\n * @fileoverview\n * An alternative control buttons component with absolute positioning and optional visibility.\n * Similar to ControlButtonsComponentTouch but with simplified button configurations and\n * different default styling. Designed for alternative UI layouts where standard control\n * patterns don't fit.\n *\n * @component ControlButtonsAltComponent\n * @module components/displayComponents/ControlButtonsAltComponent\n *\n * @description\n * This component provides an alternative approach to control button layouts with:\n * - Absolute positioning (left/right/middle × top/bottom/center)\n * - Horizontal or vertical button arrangement\n * - Simplified button background (default only, no pressed state)\n * - Conditional rendering via showAspect prop\n * - Per-button custom render functions\n * - Active/inactive states with color control\n * - FontAwesome icons or custom Vue components\n * - Individual button visibility control\n *\n * @example\n * // Basic alternative layout - bottom right\n * // <ControlButtonsAltComponent\n *   // :buttons=\"[\n *     { \n *       name: 'Chat',\n *       icon: faComments,\n *       active: chatOpen,\n *       onPress: () => toggleChat()\n *     },\n *     { \n *       name: 'Participants',\n *       icon: faUsers,\n *       active: participantsOpen,\n *       onPress: () => toggleParticipants()\n *     }\n *   ]\"\n *   // position=\"right\"\n *   // location=\"bottom\"\n *   // :show-aspect=\"true\"\n * // />\n *\n * @example\n * // Vertical sidebar controls\n * // <ControlButtonsAltComponent\n *   // :buttons=\"sidebarButtons\"\n *   // position=\"left\"\n *   // location=\"center\"\n *   // direction=\"vertical\"\n *   // :show-aspect=\"sidebarVisible\"\n *   // :buttonsContainerStyle=\"{ backgroundColor: '#1a1a1a', padding: '8px' }\"\n *   // :gap=\"12\"\n * // />\n *\n * @example\n * // Custom styled with per-button visibility\n * // <ControlButtonsAltComponent\n *   // :buttons=\"[\n *     { \n *       name: 'Record',\n *       icon: faCircle,\n *       show: canRecord,\n *       active: isRecording,\n *       activeColor: '#ff0000',\n *       inActiveColor: '#ffffff',\n *       backgroundColor: { default: '#333' },\n *       onPress: toggleRecording\n *     },\n *     { \n *       name: 'Share',\n *       icon: faShareSquare,\n *       show: canShare,\n *       disabled: !hasContentToShare,\n *       onPress: startScreenShare\n *     }\n *   ]\"\n *   // position=\"middle\"\n *   // location=\"bottom\"\n *   // :show-aspect=\"controlsEnabled\"\n * // />\n *\n * @example\n * // Custom button renderer\n * // <ControlButtonsAltComponent\n *   // :buttons=\"actionButtons\"\n *   // position=\"right\"\n *   // location=\"top\"\n *   // :show-aspect=\"true\"\n *   // :render-button=\"(options) => {\n *     const { button, defaultButton } = options;\n *     if (button.customComponent) {\n *       return h(button.customComponent, { active: button.active });\n *     }\n *     return h('div', { class: 'alt-button-wrapper' }, [defaultButton]);\n *   }\"\n * // />\n *\n * @example\n * // Custom content renderer with badges\n * // <ControlButtonsAltComponent\n *   // :buttons=\"notificationButtons\"\n *   // position=\"right\"\n *   // location=\"top\"\n *   // :show-aspect=\"true\"\n *   // :render-button-content=\"(options) => {\n *     const { button, defaultIcon, defaultLabel } = options;\n *     return h('div', { class: 'button-with-badge' }, [\n *       defaultIcon,\n *       button.active ? h('span', { class: 'badge' }, '!') : null,\n *       defaultLabel\n *     ]);\n *   }\"\n * // />\n-->\n<template>\n  <RenderVNode :node=\"containerNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  computed,\n  defineComponent,\n  h,\n  isVNode,\n  type Component,\n  type ButtonHTMLAttributes,\n  type CSSProperties,\n  type HTMLAttributes,\n  type PropType,\n  type VNode,\n  type VNodeChild,\n} from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\n\n/**\n * Render options for button content\n * \n * @interface RenderContentOptions\n * @property {number} index - Button index in the array\n * @property {boolean} isActive - Whether button is in active state\n * @property {VNode | null} defaultIcon - Default rendered icon VNode\n * @property {VNode | null} defaultLabel - Default rendered label VNode\n * @property {VNode} defaultContent - Default complete content VNode\n * @property {'horizontal' | 'vertical'} direction - Layout direction\n */\ninterface RenderContentOptions {\n  index: number;\n  isActive: boolean;\n  defaultIcon: VNode | null;\n  defaultLabel: VNode | null;\n  defaultContent: VNode;\n  direction: 'horizontal' | 'vertical';\n}\n\n/**\n * Render options for entire button\n * \n * @interface RenderButtonOptions\n * @property {number} index - Button index in the array\n * @property {AltButton} button - Button configuration\n * @property {VNode} defaultButton - Default rendered button VNode\n * @property {ButtonHTMLAttributes} defaultProps - Default button HTML attributes\n * @property {'horizontal' | 'vertical'} direction - Layout direction\n */\ninterface RenderButtonOptions {\n  index: number;\n  button: AltButton;\n  defaultButton: VNode;\n  defaultProps: ButtonHTMLAttributes;\n  direction: 'horizontal' | 'vertical';\n}\n\n/**\n * Alternative button configuration interface\n * \n * @interface AltButton\n * @property {string} [name] - Button label text\n * @property {IconDefinition} [icon] - FontAwesome icon for default state\n * @property {IconDefinition} [alternateIcon] - FontAwesome icon for active state\n * @property {() => void} [onPress] - Click handler function\n * @property {{ default?: string; }} [backgroundColor] - Background color (default state only)\n * @property {boolean} [active] - Whether button is in active state\n * @property {Component} [alternateIconComponent] - Custom Vue component for alternate icon\n * @property {Component} [iconComponent] - Custom Vue component for primary icon\n * @property {Component} [customComponent] - Custom Vue component for entire button\n * @property {string} [color] - Icon/text color\n * @property {string} [activeColor] - Icon/text color when active\n * @property {string} [inActiveColor] - Icon/text color when inactive\n * @property {boolean} [show] - Whether button is visible\n * @default true\n * @property {boolean} [disabled] - Whether button is disabled\n * @property {ButtonHTMLAttributes} [buttonProps] - HTML attributes for <button> element\n * @property {CSSProperties} [style] - Custom CSS styles for button\n * @property {string} [className] - CSS class name for button\n * @property {HTMLAttributes} [iconWrapperProps] - HTML attributes for icon wrapper div\n * @property {HTMLAttributes} [textProps] - HTML attributes for text/label span\n * @property {HTMLAttributes} [contentWrapperProps] - HTML attributes for content wrapper div\n * @property {(options: RenderContentOptions) => VNodeChild} [renderContent] - Custom renderer for button content\n * @property {(options: RenderButtonOptions) => VNodeChild} [renderButton] - Custom renderer for entire button\n */\nexport interface AltButton {\n  name?: string;\n  icon?: IconDefinition;\n  alternateIcon?: IconDefinition;\n  onPress?: () => void;\n  backgroundColor?: {\n    default?: string;\n  };\n  active?: boolean;\n  alternateIconComponent?: Component;\n  iconComponent?: Component;\n  customComponent?: Component;\n  color?: string;\n  activeColor?: string;\n  inActiveColor?: string;\n  show?: boolean;\n  disabled?: boolean;\n  buttonProps?: ButtonHTMLAttributes;\n  style?: CSSProperties;\n  className?: string;\n  iconWrapperProps?: HTMLAttributes;\n  textProps?: HTMLAttributes;\n  contentWrapperProps?: HTMLAttributes;\n  renderContent?: (options: RenderContentOptions) => VNodeChild;\n  renderButton?: (options: RenderButtonOptions) => VNodeChild;\n}\n\n/**\n * ControlButtonsAltComponent props interface\n * \n * @interface ControlButtonsAltComponentProps\n * @property {AltButton[]} buttons - Array of button configurations to render\n * @property {'left' | 'right' | 'middle'} [position='left'] - Horizontal position (absolute positioning)\n * @default 'left'\n * @property {'top' | 'bottom' | 'center'} [location='top'] - Vertical position (absolute positioning)\n * @default 'top'\n * @property {'horizontal' | 'vertical'} [direction='horizontal'] - Button layout direction\n * @default 'horizontal'\n * @property {CSSProperties} [buttonsContainerStyle] - Custom styles for container element\n * @property {Component} [alternateIconComponent] - Default alternate icon component for all buttons\n * @property {Component} [iconComponent] - Default icon component for all buttons\n * @property {boolean} [showAspect=false] - Whether to show the component (conditional rendering)\n * @default false\n * @property {HTMLAttributes} [containerProps] - HTML attributes for container div\n * @property {ButtonHTMLAttributes} [buttonProps] - Default HTML attributes for all <button> elements\n * @property {CSSProperties} [buttonStyle] - Default styles for all button elements\n * @property {string} [buttonClassName] - Default CSS class for all button elements\n * @property {HTMLAttributes} [iconWrapperProps] - Default HTML attributes for all icon wrapper divs\n * @property {HTMLAttributes} [textProps] - Default HTML attributes for all text/label spans\n * @property {HTMLAttributes} [contentWrapperProps] - Default HTML attributes for all content wrapper divs\n * @property {(options: RenderButtonOptions) => VNodeChild} [renderButton] - Custom renderer for entire button element\n * @property {(options: Omit<RenderContentOptions, 'isActive'> & { button: AltButton }) => VNodeChild} [renderButtonContent] - Custom renderer for button content\n * @property {number | string} [gap] - Gap/spacing between buttons (CSS gap value)\n * @example '12px', 12, '0.75rem'\n */\nexport interface ControlButtonsAltComponentProps {\n  buttons: AltButton[];\n  position?: 'left' | 'right' | 'middle';\n  location?: 'top' | 'bottom' | 'center';\n  direction?: 'horizontal' | 'vertical';\n  buttonsContainerStyle?: CSSProperties;\n  alternateIconComponent?: Component;\n  iconComponent?: Component;\n  showAspect?: boolean;\n  containerProps?: HTMLAttributes;\n  buttonProps?: ButtonHTMLAttributes;\n  buttonStyle?: CSSProperties;\n  buttonClassName?: string;\n  iconWrapperProps?: HTMLAttributes;\n  textProps?: HTMLAttributes;\n  contentWrapperProps?: HTMLAttributes;\n  renderButton?: (options: RenderButtonOptions) => VNodeChild;\n  renderButtonContent?: (options: Omit<RenderContentOptions, 'isActive'> & { button: AltButton }) => VNodeChild;\n  gap?: number | string;\n}\n\nconst props = withDefaults(defineProps<ControlButtonsAltComponentProps>(), {\n  position: 'left',\n  location: 'top',\n  direction: 'horizontal',\n  showAspect: false,\n  buttonsContainerStyle: undefined,\n  alternateIconComponent: undefined,\n  iconComponent: undefined,\n  containerProps: undefined,\n  buttonProps: undefined,\n  buttonStyle: undefined,\n  buttonClassName: undefined,\n  iconWrapperProps: undefined,\n  textProps: undefined,\n  contentWrapperProps: undefined,\n  renderButton: undefined,\n  renderButtonContent: undefined,\n  gap: undefined,\n});\n\n// Helper: Join class names\nfunction joinClassNames(...classes: (string | undefined)[]): string {\n  return classes.filter(Boolean).join(' ');\n}\n\n// RenderVNode wrapper component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Boolean, Array, Function] as PropType<VNodeChild>,\n      default: null,\n    },\n  },\n  render() {\n    if (!this.node) return null;\n    if (isVNode(this.node)) return this.node;\n    if (typeof this.node === 'function') {\n      const result = (this.node as () => VNodeChild)();\n      return isVNode(result) ? result : String(result);\n    }\n    return String(this.node);\n  },\n});\n\nconst isVertical = computed(() => props.direction === 'vertical');\n\nconst styles = {\n  container: {\n    marginTop: '5px',\n    marginBottom: '5px',\n    zIndex: 9,\n  } as CSSProperties,\n  buttonContainer: {\n    alignItems: 'center',\n    padding: '10px',\n    borderRadius: '5px',\n    marginLeft: '5px',\n    marginRight: '5px',\n    cursor: 'pointer',\n    backgroundColor: 'transparent',\n  } as CSSProperties,\n  verticalButton: {\n    flexDirection: 'column',\n  } as CSSProperties,\n  buttonText: {\n    fontSize: '12px',\n    marginTop: '5px',\n  } as CSSProperties,\n};\n\n// Alignment style\nconst alignmentStyle = computed<CSSProperties>(() => {\n  const style: CSSProperties = {};\n\n  if (props.position === 'left' || props.position === 'right' || props.position === 'middle') {\n    style.justifyContent =\n      props.position === 'left' ? 'flex-start' : props.position === 'right' ? 'flex-end' : 'center';\n  }\n\n  if (props.location === 'top' || props.location === 'bottom' || props.location === 'center') {\n    style.alignItems =\n      props.location === 'top' ? 'flex-start' : props.location === 'bottom' ? 'flex-end' : 'center';\n  }\n\n  if (props.direction === 'vertical') {\n    style.flexDirection = 'column';\n  } else {\n    style.flexDirection = 'row';\n  }\n\n  if (props.gap !== undefined) {\n    style.gap = typeof props.gap === 'number' ? `${props.gap}px` : props.gap;\n  }\n\n  return style;\n});\n\n// Container props merging\nconst containerRestAttrs = computed(() => {\n  const { class: _c, style: _s, ...rest } = props.containerProps || {};\n  return rest;\n});\n\nconst containerClassNames = computed(() =>\n  joinClassNames('mediasfu-alt-buttons-container', props.containerProps?.class as string | undefined)\n);\n\nconst containerStyle = computed(() => {\n  const baseStyle: CSSProperties = {\n    ...styles.container,\n    ...alignmentStyle.value,\n    display: props.showAspect ? 'flex' : 'none',\n  };\n\n  return {\n    ...baseStyle,\n    ...(props.buttonsContainerStyle || {}),\n    ...(typeof props.containerProps?.style === 'object' ? props.containerProps.style : {}),\n  } as CSSProperties;\n});\n\n// Shared button props from component level\nconst sharedButtonRest = computed(() => {\n  const { onClick: _o, style: _s, class: _c, type: _t, ...rest } = props.buttonProps || {};\n  return rest;\n});\n\nconst sharedButtonStyle = computed(() => {\n  const style = props.buttonProps?.style;\n  return typeof style === 'object' && !Array.isArray(style) ? (style as CSSProperties) : {};\n});\n\nconst sharedButtonClassName = computed(() => props.buttonClassName);\nconst sharedButtonType = computed(() => props.buttonProps?.type);\nconst sharedButtonOnClick = computed(() => props.buttonProps?.onClick);\n\n// Render buttons\nconst buttonNodes = computed(() => {\n  return props.buttons.map((button, index) => {\n    const perButtonProps = button.buttonProps || {};\n    const perButtonStyle = button.style || {};\n    const perButtonClassName = button.className;\n    const perIconWrapperProps = button.iconWrapperProps || {};\n    const perTextProps = button.textProps || {};\n    const perContentWrapperProps = button.contentWrapperProps || {};\n\n    const { onClick: perButtonOnClick, style: perButtonButtonStyle, class: perButtonButtonClass, type: perButtonType, ...restPerButtonProps } = perButtonProps;\n\n    const isVisible = button.show !== false;\n\n    const mergedButtonRest: ButtonHTMLAttributes = {\n      ...sharedButtonRest.value,\n      ...restPerButtonProps,\n      disabled: button.disabled ?? restPerButtonProps.disabled ?? sharedButtonRest.value.disabled,\n    };\n\n    const perButtonButtonStyleObj = typeof perButtonButtonStyle === 'object' && !Array.isArray(perButtonButtonStyle) ? (perButtonButtonStyle as CSSProperties) : {};\n\n    const backgroundColor = isVisible\n      ? perButtonButtonStyleObj.backgroundColor ??\n        perButtonStyle?.backgroundColor ??\n        props.buttonStyle?.backgroundColor ??\n        sharedButtonStyle.value.backgroundColor ??\n        button.backgroundColor?.default ??\n        'transparent'\n      : 'transparent';\n\n    const combinedStyle = {\n      ...styles.buttonContainer,\n      ...(isVisible ? {} : { display: 'none' }),\n      ...(isVertical.value ? styles.verticalButton : {}),\n      backgroundColor,\n      ...sharedButtonStyle.value,\n      ...(props.buttonStyle || {}),\n      ...perButtonButtonStyleObj,\n      ...(perButtonStyle || {}),\n    } as CSSProperties;\n\n    if (isVisible && !combinedStyle.display) {\n      combinedStyle.display = 'flex';\n    }\n\n    const combinedClassName = joinClassNames(\n      'mediasfu-alt-button',\n      sharedButtonClassName.value,\n      props.buttonClassName,\n      perButtonButtonClass as string | undefined,\n      perButtonClassName\n    );\n\n    const resolvedType = perButtonType || sharedButtonType.value || 'button';\n\n    const handleClick = (event: MouseEvent) => {\n      if (perButtonOnClick) {\n        (perButtonOnClick as (e: MouseEvent) => void)(event);\n      }\n      if (sharedButtonOnClick.value) {\n        (sharedButtonOnClick.value as (e: MouseEvent) => void)(event);\n      }\n\n      if (!event.defaultPrevented) {\n        button.onPress?.();\n      }\n    };\n\n    // Content wrapper props\n    const { style: perContentWrapperStyle, class: perContentWrapperClass, ...restPerContentWrapper } = perContentWrapperProps;\n    const { style: defaultContentWrapperStyle, class: defaultContentWrapperClass, ...restDefaultContentWrapper } = props.contentWrapperProps || {};\n\n    const perContentWrapperStyleObj = typeof perContentWrapperStyle === 'object' && !Array.isArray(perContentWrapperStyle) ? (perContentWrapperStyle as CSSProperties) : {};\n    const defaultContentWrapperStyleObj = typeof defaultContentWrapperStyle === 'object' && !Array.isArray(defaultContentWrapperStyle) ? (defaultContentWrapperStyle as CSSProperties) : {};\n\n    const contentWrapperClassName = joinClassNames(\n      'mediasfu-alt-button-content',\n      defaultContentWrapperClass as string | undefined,\n      perContentWrapperClass as string | undefined\n    );\n\n    const contentWrapperStyle: CSSProperties = {\n      display: 'flex',\n      alignItems: 'center',\n      gap: isVertical.value ? '6px' : '8px',\n      ...defaultContentWrapperStyleObj,\n      ...perContentWrapperStyleObj,\n    };\n\n    // Icon wrapper props\n    const { style: perIconWrapperStyle, class: perIconWrapperClass, ...restPerIconWrapper } = perIconWrapperProps;\n    const { style: defaultIconWrapperStyle, class: defaultIconWrapperClass, ...restDefaultIconWrapper } = props.iconWrapperProps || {};\n\n    const perIconWrapperStyleObj = typeof perIconWrapperStyle === 'object' && !Array.isArray(perIconWrapperStyle) ? (perIconWrapperStyle as CSSProperties) : {};\n    const defaultIconWrapperStyleObj = typeof defaultIconWrapperStyle === 'object' && !Array.isArray(defaultIconWrapperStyle) ? (defaultIconWrapperStyle as CSSProperties) : {};\n\n    const iconWrapperClassName = joinClassNames(\n      'mediasfu-alt-button-icon',\n      defaultIconWrapperClass as string | undefined,\n      perIconWrapperClass as string | undefined\n    );\n\n    const iconWrapperStyle: CSSProperties = {\n      display: 'flex',\n      alignItems: 'center',\n      justifyContent: 'center',\n      ...defaultIconWrapperStyleObj,\n      ...perIconWrapperStyleObj,\n    };\n\n    // Text props\n    const { style: perTextStyle, class: perTextClass, ...restPerText } = perTextProps;\n    const { style: defaultTextStyle, class: defaultTextClass, ...restDefaultText } = props.textProps || {};\n\n    const perTextStyleObj = typeof perTextStyle === 'object' && !Array.isArray(perTextStyle) ? (perTextStyle as CSSProperties) : {};\n    const defaultTextStyleObj = typeof defaultTextStyle === 'object' && !Array.isArray(defaultTextStyle) ? (defaultTextStyle as CSSProperties) : {};\n\n    const textClassName = joinClassNames(\n      'mediasfu-alt-button-text',\n      defaultTextClass as string | undefined,\n      perTextClass as string | undefined\n    );\n\n    const textStyle: CSSProperties = {\n      ...styles.buttonText,\n      color: button.color || '#ffffff',\n      ...defaultTextStyleObj,\n      ...perTextStyleObj,\n    };\n\n    // Default icon\n    const defaultIcon = computed(() => {\n      if (button.icon) {\n        const iconColor = button.active\n          ? button.activeColor || button.inActiveColor || 'transparent'\n          : button.inActiveColor || 'transparent';\n\n        const iconToUse = button.active && button.alternateIcon ? button.alternateIcon : button.icon;\n        const componentToUse = button.active && button.alternateIconComponent\n          ? button.alternateIconComponent\n          : button.iconComponent;\n\n        if (componentToUse) {\n          return h(\n            'span',\n            {\n              class: iconWrapperClassName,\n              style: iconWrapperStyle,\n              ...restDefaultIconWrapper,\n              ...restPerIconWrapper,\n            },\n            [h(componentToUse)]\n          );\n        }\n\n        return h(\n          'span',\n          {\n            class: iconWrapperClassName,\n            style: iconWrapperStyle,\n            ...restDefaultIconWrapper,\n            ...restPerIconWrapper,\n          },\n          [\n            h(FontAwesomeIcon, {\n              icon: iconToUse,\n              size: 'lg',\n              color: iconColor,\n            }),\n          ]\n        );\n      } else if (button.customComponent) {\n        return h(button.customComponent);\n      }\n      return null;\n    });\n\n    // Default label\n    const defaultLabel = computed(() => {\n      if (button.name) {\n        return h(\n          'span',\n          {\n            class: textClassName,\n            style: textStyle,\n            ...restDefaultText,\n            ...restPerText,\n          },\n          button.name\n        );\n      }\n      return null;\n    });\n\n    // Default content\n    const defaultContent = computed(() => {\n      return h(\n        'div',\n        {\n          class: contentWrapperClassName,\n          style: contentWrapperStyle,\n          ...restDefaultContentWrapper,\n          ...restPerContentWrapper,\n        },\n        [defaultIcon.value, defaultLabel.value].filter(Boolean)\n      );\n    });\n\n    // Content node (with renderContent hooks)\n    const contentNode = computed(() => {\n      if (button.renderContent) {\n        const custom = button.renderContent({\n          index,\n          isActive: button.active || false,\n          defaultIcon: defaultIcon.value,\n          defaultLabel: defaultLabel.value,\n          defaultContent: defaultContent.value,\n          direction: props.direction,\n        });\n        if (custom) {\n          if (isVNode(custom)) return custom;\n          return h(RenderVNode, { node: custom });\n        }\n      }\n\n      if (props.renderButtonContent) {\n        const custom = props.renderButtonContent({\n          index,\n          button,\n          defaultIcon: defaultIcon.value,\n          defaultLabel: defaultLabel.value,\n          defaultContent: defaultContent.value,\n          direction: props.direction,\n        });\n        if (custom) {\n          if (isVNode(custom)) return custom;\n          return h(RenderVNode, { node: custom });\n        }\n      }\n\n      return defaultContent.value;\n    });\n\n    // Default button\n    const defaultButton = computed(() =>\n      h(\n        'button',\n        {\n          class: combinedClassName,\n          style: combinedStyle,\n          type: resolvedType,\n          onClick: handleClick,\n          ...mergedButtonRest,\n        },\n        [contentNode.value]\n      )\n    );\n\n    // Button node (with renderButton hooks)\n    if (button.renderButton) {\n      const custom = button.renderButton({\n        index,\n        button,\n        defaultButton: defaultButton.value,\n        defaultProps: {\n          class: combinedClassName,\n          style: combinedStyle,\n          type: resolvedType,\n          onClick: handleClick,\n          ...mergedButtonRest,\n        },\n        direction: props.direction,\n      });\n      if (custom) {\n        if (isVNode(custom)) return custom;\n        return h(RenderVNode, { node: custom });\n      }\n    }\n\n    if (props.renderButton) {\n      const custom = props.renderButton({\n        index,\n        button,\n        defaultButton: defaultButton.value,\n        defaultProps: {\n          class: combinedClassName,\n          style: combinedStyle,\n          type: resolvedType,\n          onClick: handleClick,\n          ...mergedButtonRest,\n        },\n        direction: props.direction,\n      });\n      if (custom) {\n        if (isVNode(custom)) return custom;\n        return h(RenderVNode, { node: custom });\n      }\n    }\n\n    return defaultButton.value;\n  });\n});\n\n// Container node\nconst containerNode = computed(() =>\n  h(\n    'div',\n    {\n      class: containerClassNames.value,\n      style: containerStyle.value,\n      ...containerRestAttrs.value,\n    },\n    buttonNodes.value\n  )\n);\n\n</script>\n","<!--\n * ControlButtonsComponentTouch - Touch-optimized positioned control buttons\n *\n * @fileoverview\n * A touch-friendly control buttons component with absolute positioning support.\n * Designed for mobile/tablet interfaces where buttons need to be positioned in\n * specific screen regions (corners, edges, center). Each button supports per-button\n * render functions and conditional visibility.\n *\n * @component ControlButtonsComponentTouch\n * @module components/displayComponents/ControlButtonsComponentTouch\n *\n * @description\n * This component renders control buttons with absolute positioning capabilities,\n * ideal for overlay interfaces on touch devices. Features:\n * - Absolute positioning (left/right/middle × top/bottom/center)\n * - Horizontal or vertical button arrangement\n * - Per-button visibility and render control\n * - Touch-optimized button sizing and spacing\n * - Active/inactive states with alternate icons\n * - Conditional rendering via showAspect prop\n * - Custom render functions per button\n * - FontAwesome icons or custom Vue components\n *\n * @example\n * // Basic bottom-left corner buttons\n * // <ControlButtonsComponentTouch\n *   // :buttons=\"[\n *     { \n *       name: 'Mic',\n *       icon: faMicrophone,\n *       alternateIcon: faMicrophoneSlash,\n *       active: isMicActive,\n *       onPress: toggleMic\n *     },\n *     { \n *       name: 'Camera',\n *       icon: faVideo,\n *       alternateIcon: faVideoSlash,\n *       active: isCameraActive,\n *       onPress: toggleCamera\n *     }\n *   ]\"\n *   // position=\"left\"\n *   // location=\"bottom\"\n *   // direction=\"horizontal\"\n *   // :show-aspect=\"true\"\n * // />\n *\n * @example\n * // Top-right vertical buttons with custom styling\n * // <ControlButtonsComponentTouch\n *   // :buttons=\"quickActionButtons\"\n *   // position=\"right\"\n *   // location=\"top\"\n *   // direction=\"vertical\"\n *   // :show-aspect=\"controlsVisible\"\n *   // :buttonsContainerStyle=\"{ padding: '10px', backgroundColor: 'rgba(0,0,0,0.5)' }\"\n *   // :gap=\"15\"\n * // />\n *\n * @example\n * // Center positioned with conditional visibility\n * // <ControlButtonsComponentTouch\n *   // :buttons=\"[\n *     { \n *       name: 'Settings',\n *       icon: faCog,\n *       show: canAccessSettings,\n *       onPress: openSettings\n *     },\n *     { \n *       name: 'Exit',\n *       icon: faSignOutAlt,\n *       show: canExit,\n *       onPress: handleExit\n *     }\n *   ]\"\n *   // position=\"middle\"\n *   // location=\"center\"\n *   // :show-aspect=\"menuOpen\"\n * // />\n *\n * @example\n * // Custom render function per button\n * // <ControlButtonsComponentTouch\n *   // :buttons=\"[\n *     {\n *       name: 'Record',\n *       icon: faCircle,\n *       active: isRecording,\n *       renderButton: (options) => {\n *         const { button, defaultButton } = options;\n *         return h('div', { \n *           class: ['record-button', button.active ? 'recording' : ''],\n *           style: { animation: button.active ? 'pulse 1s infinite' : 'none' }\n *         }, [defaultButton]);\n *       },\n *       onPress: toggleRecording\n *     }\n *   ]\"\n *   // position=\"middle\"\n *   // location=\"bottom\"\n *   // :show-aspect=\"true\"\n * // />\n *\n * @example\n * // Touch-optimized with custom button content\n * // <ControlButtonsComponentTouch\n *   // :buttons=\"controlButtons\"\n *   // position=\"left\"\n *   // location=\"bottom\"\n *   // direction=\"horizontal\"\n *   // :show-aspect=\"true\"\n *   // :render-button-content=\"(options) => {\n *     const { defaultIcon, defaultLabel, button } = options;\n *     return h('div', { class: 'touch-button-content' }, [\n *       h('div', { class: 'icon-large' }, [defaultIcon]),\n *       h('span', { class: 'label-touch' }, button.name)\n *     ]);\n *   }\"\n * // />\n-->\n<template>\n  <RenderVNode\n    v-if=\"showAspect\"\n    :node=\"containerNode\"\n  />\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  computed,\n  defineComponent,\n  h,\n  isVNode,\n  type ButtonHTMLAttributes,\n  type Component,\n  type CSSProperties,\n  type HTMLAttributes,\n  type PropType,\n  type VNodeChild,\n} from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\n\n// Helper to join class names\nfunction joinClassNames(...classes: Array<string | undefined | null | false>): string | undefined {\n  const filtered = classes.filter(Boolean) as string[];\n  return filtered.length > 0 ? filtered.join(' ').trim() : undefined;\n}\n\n/**\n * Touch button configuration interface\n * \n * @interface ButtonTouch\n * @property {string} [name] - Button label text\n * @property {IconDefinition} [icon] - FontAwesome icon for default state\n * @property {IconDefinition} [alternateIcon] - FontAwesome icon for active state\n * @property {() => void} [onPress] - Click/tap handler function\n * @property {{ default?: string; pressed?: string; }} [backgroundColor] - Background colors\n * @property {boolean} [active] - Whether button is in active state\n * @property {Component} [alternateIconComponent] - Custom Vue component for alternate icon\n * @property {Component} [iconComponent] - Custom Vue component for primary icon\n * @property {Component} [customComponent] - Custom Vue component for entire button\n * @property {string} [color] - Icon/text color\n * @property {string} [activeColor] - Icon/text color when active\n * @property {string} [inActiveColor] - Icon/text color when inactive\n * @property {boolean} [show] - Whether button is visible\n * @default true\n * @property {boolean} [disabled] - Whether button is disabled\n * @property {ButtonHTMLAttributes} [buttonProps] - HTML attributes for <button> element\n * @property {CSSProperties} [style] - Custom CSS styles for button\n * @property {string} [className] - CSS class name for button\n * @property {HTMLAttributes} [iconWrapperProps] - HTML attributes for icon wrapper div\n * @property {HTMLAttributes} [textProps] - HTML attributes for text/label span\n * @property {HTMLAttributes} [contentWrapperProps] - HTML attributes for content wrapper div\n * @property {(options: TouchButtonContentRenderOptions) => VNodeChild} [renderContent] - Custom renderer for button content\n * @property {(options: TouchButtonRenderOptions) => VNodeChild} [renderButton] - Custom renderer for entire button\n */\nexport interface ButtonTouch {\n  name?: string;\n  icon?: IconDefinition;\n  alternateIcon?: IconDefinition;\n  onPress?: () => void;\n  backgroundColor?: {\n    default?: string;\n    pressed?: string;\n  };\n  active?: boolean;\n  alternateIconComponent?: Component;\n  iconComponent?: Component;\n  customComponent?: Component;\n  color?: string;\n  activeColor?: string;\n  inActiveColor?: string;\n  show?: boolean;\n  disabled?: boolean;\n  buttonProps?: ButtonHTMLAttributes;\n  style?: CSSProperties;\n  className?: string;\n  iconWrapperProps?: HTMLAttributes;\n  textProps?: HTMLAttributes;\n  contentWrapperProps?: HTMLAttributes;\n  renderContent?: (options: {\n    index: number;\n    isActive: boolean;\n    defaultIcon: VNodeChild;\n    defaultLabel: VNodeChild;\n    defaultContent: VNodeChild;\n    direction: 'horizontal' | 'vertical';\n  }) => VNodeChild;\n  renderButton?: (options: {\n    index: number;\n    button: ButtonTouch;\n    defaultButton: VNodeChild;\n    defaultProps: ButtonHTMLAttributes;\n    direction: 'horizontal' | 'vertical';\n  }) => VNodeChild;\n}\n\n/**\n * ControlButtonsComponentTouch props interface\n * \n * @interface ControlButtonsComponentTouchProps\n * @property {ButtonTouch[]} buttons - Array of button configurations to render\n * @property {'left' | 'right' | 'middle'} [position='left'] - Horizontal position (absolute positioning)\n * @default 'left'\n * @property {'top' | 'bottom' | 'center'} [location='top'] - Vertical position (absolute positioning)\n * @default 'top'\n * @property {'horizontal' | 'vertical'} [direction='horizontal'] - Button layout direction\n * @default 'horizontal'\n * @property {CSSProperties} [buttonsContainerStyle] - Custom styles for container element\n * @property {Component} [alternateIconComponent] - Default alternate icon component for all buttons\n * @property {Component} [iconComponent] - Default icon component for all buttons\n * @property {boolean} [showAspect=false] - Whether to show the component (conditional rendering)\n * @default false\n * @example\n * // Hide buttons when not needed\n * :show-aspect=\"controlsVisible && !menuOpen\"\n * @property {HTMLAttributes} [containerProps] - HTML attributes for container div\n * @property {ButtonHTMLAttributes} [buttonProps] - Default HTML attributes for all <button> elements\n * @property {CSSProperties} [buttonStyle] - Default styles for all button elements\n * @property {string} [buttonClassName] - Default CSS class for all button elements\n * @property {HTMLAttributes} [iconWrapperProps] - Default HTML attributes for all icon wrapper divs\n * @property {HTMLAttributes} [textProps] - Default HTML attributes for all text/label spans\n * @property {HTMLAttributes} [contentWrapperProps] - Default HTML attributes for all content wrapper divs\n * @property {(options: TouchButtonRenderOptions) => VNodeChild} [renderButton] - Custom renderer for entire button element\n * @property {(options: TouchButtonContentRenderOptions) => VNodeChild} [renderButtonContent] - Custom renderer for button content\n * @property {number | string} [gap] - Gap/spacing between buttons (CSS gap value)\n * @example '15px', 15, '1rem'\n */\nexport interface ControlButtonsComponentTouchProps {\n  buttons: ButtonTouch[];\n  position?: 'left' | 'right' | 'middle';\n  location?: 'top' | 'bottom' | 'center';\n  direction?: 'horizontal' | 'vertical';\n  buttonsContainerStyle?: CSSProperties;\n  alternateIconComponent?: Component;\n  iconComponent?: Component;\n  showAspect?: boolean;\n  containerProps?: HTMLAttributes;\n  buttonProps?: ButtonHTMLAttributes;\n  buttonStyle?: CSSProperties;\n  buttonClassName?: string;\n  iconWrapperProps?: HTMLAttributes;\n  textProps?: HTMLAttributes;\n  contentWrapperProps?: HTMLAttributes;\n  renderButton?: (options: {\n    index: number;\n    button: ButtonTouch;\n    defaultButton: VNodeChild;\n    defaultProps: ButtonHTMLAttributes;\n    direction: 'horizontal' | 'vertical';\n  }) => VNodeChild;\n  renderButtonContent?: (options: {\n    index: number;\n    button: ButtonTouch;\n    defaultIcon: VNodeChild;\n    defaultLabel: VNodeChild;\n    defaultContent: VNodeChild;\n    direction: 'horizontal' | 'vertical';\n  }) => VNodeChild;\n  gap?: number | string;\n}\n\nconst props = withDefaults(defineProps<ControlButtonsComponentTouchProps>(), {\n  position: 'left',\n  location: 'top',\n  direction: 'horizontal',\n  showAspect: false,\n  alternateIconComponent: undefined,\n  iconComponent: undefined,\n  containerProps: undefined,\n  buttonProps: undefined,\n  buttonStyle: undefined,\n  buttonClassName: undefined,\n  iconWrapperProps: undefined,\n  textProps: undefined,\n  contentWrapperProps: undefined,\n  renderButton: undefined,\n  renderButtonContent: undefined,\n  gap: undefined,\n  buttonsContainerStyle: undefined,\n});\n\n// RenderVNode wrapper component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Boolean, Array, Function] as PropType<VNodeChild>,\n      default: null,\n    },\n  },\n  render() {\n    if (!this.node) return null;\n    if (isVNode(this.node)) return this.node;\n    if (typeof this.node === 'function') {\n      const result = (this.node as () => VNodeChild)();\n      return isVNode(result) ? result : String(result);\n    }\n    return String(this.node);\n  },\n});\n\nconst isVertical = computed(() => props.direction === 'vertical');\n\nconst getAlignmentStyle = computed<CSSProperties>(() => {\n  const style: CSSProperties = {};\n\n  if (props.position === 'left' || props.position === 'right' || props.position === 'middle') {\n    style.justifyContent =\n      props.position === 'left' ? 'flex-start' : props.position === 'right' ? 'flex-end' : 'center';\n  }\n\n  if (props.location === 'top' || props.location === 'bottom' || props.location === 'center') {\n    style.alignItems =\n      props.location === 'top' ? 'flex-start' : props.location === 'bottom' ? 'flex-end' : 'center';\n  }\n\n  style.flexDirection = isVertical.value ? 'column' : 'row';\n\n  return style;\n});\n\n// Styles object\nconst styles: Record<string, CSSProperties> = {\n  container: {\n    position: 'absolute',\n    bottom: 0,\n    left: 0,\n    right: 0,\n    marginTop: '5px',\n    marginBottom: '5px',\n    zIndex: 9,\n    backgroundColor: 'transparent',\n  },\n  buttonContainer: {\n    alignItems: 'center',\n    padding: '10px',\n    borderRadius: '5px',\n    marginRight: '5px',\n    marginLeft: '5px',\n    marginBottom: '5px',\n    marginTop: '5px',\n    cursor: 'pointer',\n    backgroundColor: 'transparent',\n    border: 'none',\n  },\n  verticalButton: {\n    flexDirection: 'column',\n  },\n  buttonText: {\n    fontSize: '12px',\n    color: 'transparent',\n  },\n};\n\n// Extract shared/container props\nconst containerAttrs = computed(() => {\n  const containerProps = props.containerProps || {};\n  const { class: cls, style, ...rest } = containerProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst containerClassNames = computed(() => \n  joinClassNames('mediasfu-touch-buttons', containerAttrs.value.className)\n);\n\nconst containerStyle = computed<CSSProperties>(() => ({\n  ...styles.container,\n  ...getAlignmentStyle.value,\n  ...(props.gap !== undefined ? { gap: typeof props.gap === 'number' ? `${props.gap}px` : props.gap } : {}),\n  ...props.buttonsContainerStyle,\n  ...containerAttrs.value.style,\n}));\n\nconst sharedButtonAttrs = computed(() => {\n  const buttonProps = props.buttonProps || {};\n  const { class: cls, style, onClick, type, ...rest } = buttonProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    onClick: onClick as ((event: MouseEvent) => void) | undefined,\n    type: type as string | undefined,\n    rest,\n  };\n});\n\nconst defaultContentWrapperAttrs = computed(() => {\n  const contentWrapperProps = props.contentWrapperProps || {};\n  const { class: cls, style, ...rest } = contentWrapperProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst defaultIconWrapperAttrs = computed(() => {\n  const iconWrapperProps = props.iconWrapperProps || {};\n  const { class: cls, style, ...rest } = iconWrapperProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst defaultTextAttrs = computed(() => {\n  const textProps = props.textProps || {};\n  const { class: cls, style, ...rest } = textProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\n// Button nodes computed - similar to ControlButtonsComponent but with touch-specific styling\nconst buttonNodes = computed(() => {\n  return props.buttons.map((button, index) => {\n    // Extract per-button props\n    const {\n      buttonProps: perButtonProps,\n      style: perButtonStyle,\n      className: perButtonClassName,\n      iconWrapperProps: perButtonIconWrapperProps,\n      textProps: perButtonTextProps,\n      contentWrapperProps: perButtonContentWrapperProps,\n    } = button;\n\n    // Extract per-button button props\n    const perBtnProps = perButtonProps || {};\n    const {\n      onClick: perButtonOnClick,\n      style: perButtonButtonStyle,\n      class: perButtonButtonClassName,\n      type: perButtonType,\n      ...restPerButtonProps\n    } = perBtnProps as Record<string, unknown>;\n\n    // Content wrapper props\n    const perContentWrapperProps = perButtonContentWrapperProps || {};\n    const {\n      style: buttonContentWrapperStyle,\n      class: buttonContentWrapperClassName,\n      ...restButtonContentWrapper\n    } = perContentWrapperProps as Record<string, unknown>;\n\n    const contentWrapperClassName = joinClassNames(\n      'mediasfu-touch-button-content',\n      defaultContentWrapperAttrs.value.className,\n      buttonContentWrapperClassName as string | undefined\n    );\n\n    const contentWrapperStyle: CSSProperties = {\n      display: 'flex',\n      alignItems: 'center',\n      gap: isVertical.value ? '6px' : '8px',\n      ...(defaultContentWrapperAttrs.value.style && typeof defaultContentWrapperAttrs.value.style === 'object' ? defaultContentWrapperAttrs.value.style : {}),\n      ...(buttonContentWrapperStyle && typeof buttonContentWrapperStyle === 'object' ? buttonContentWrapperStyle : {}),\n    };\n\n    const resolvedContentWrapperProps: HTMLAttributes = {\n      ...defaultContentWrapperAttrs.value.rest,\n      ...restButtonContentWrapper,\n      class: contentWrapperClassName,\n      style: contentWrapperStyle,\n    };\n\n    // Icon wrapper props\n    const perIconWrapperProps = perButtonIconWrapperProps || {};\n    const {\n      style: perButtonIconWrapperStyle,\n      class: perButtonIconWrapperClassName,\n      ...restPerButtonIconWrapper\n    } = perIconWrapperProps as Record<string, unknown>;\n\n    const iconWrapperClassName = joinClassNames(\n      'mediasfu-touch-button-icon',\n      defaultIconWrapperAttrs.value.className,\n      perButtonIconWrapperClassName as string | undefined\n    );\n\n    const iconWrapperStyle: CSSProperties = {\n      display: 'flex',\n      alignItems: 'center',\n      ...(defaultIconWrapperAttrs.value.style && typeof defaultIconWrapperAttrs.value.style === 'object' ? defaultIconWrapperAttrs.value.style : {}),\n      ...(perButtonIconWrapperStyle && typeof perButtonIconWrapperStyle === 'object' ? perButtonIconWrapperStyle : {}),\n    };\n\n    const resolvedIconWrapperProps: HTMLAttributes = {\n      ...defaultIconWrapperAttrs.value.rest,\n      ...restPerButtonIconWrapper,\n      class: iconWrapperClassName,\n      style: iconWrapperStyle,\n    };\n\n    // Text props\n    const perTextProps = perButtonTextProps || {};\n    const {\n      style: perButtonTextStyle,\n      class: perButtonTextClassName,\n      ...restPerButtonTextProps\n    } = perTextProps as Record<string, unknown>;\n\n    const textClassName = joinClassNames(\n      'buttonText',\n      defaultTextAttrs.value.className,\n      perButtonTextClassName as string | undefined\n    );\n\n    const textStyle: CSSProperties = {\n      ...styles.buttonText,\n      color: button.color || 'transparent',\n      ...(defaultTextAttrs.value.style && typeof defaultTextAttrs.value.style === 'object' ? defaultTextAttrs.value.style : {}),\n      ...(perButtonTextStyle && typeof perButtonTextStyle === 'object' ? perButtonTextStyle : {}),\n    };\n\n    const resolvedTextProps: HTMLAttributes = {\n      ...defaultTextAttrs.value.rest,\n      ...restPerButtonTextProps,\n      class: textClassName,\n      style: textStyle,\n    };\n\n    // Resolve icon colors\n    const activeIconColor = button.activeColor || 'transparent';\n    const inactiveIconColor = button.inActiveColor || 'transparent';\n\n    // Resolve icon element\n    const resolvedIcon = (() => {\n      if (button.customComponent) {\n        return h(button.customComponent);\n      }\n\n      if (button.icon) {\n        if (button.active) {\n          if (button.alternateIconComponent) {\n            return h(button.alternateIconComponent);\n          }\n\n          if (button.alternateIcon) {\n            return h(FontAwesomeIcon, {\n              icon: button.alternateIcon,\n              size: 'lg',\n              color: activeIconColor,\n            });\n          }\n\n          if (props.alternateIconComponent) {\n            return h(props.alternateIconComponent);\n          }\n        }\n\n        if (button.iconComponent) {\n          return h(button.iconComponent);\n        }\n\n        if (props.iconComponent) {\n          return h(props.iconComponent);\n        }\n\n        return h(FontAwesomeIcon, {\n          icon: button.icon,\n          size: 'lg',\n          color: inactiveIconColor,\n        });\n      }\n\n      return props.alternateIconComponent ? h(props.alternateIconComponent) : null;\n    })();\n\n    const iconElement = resolvedIcon\n      ? h('span', resolvedIconWrapperProps, resolvedIcon)\n      : null;\n\n    const labelElement = button.name\n      ? h('span', resolvedTextProps, button.name)\n      : null;\n\n    const defaultContent = h(\n      'div',\n      resolvedContentWrapperProps,\n      [iconElement, labelElement].filter(Boolean)\n    );\n\n    // Build content with render hooks\n    const renderedContent = (() => {\n      if (button.renderContent) {\n        return button.renderContent({\n          index,\n          isActive: !!button.active,\n          defaultIcon: iconElement,\n          defaultLabel: labelElement,\n          defaultContent,\n          direction: props.direction,\n        });\n      }\n\n      if (props.renderButtonContent) {\n        return props.renderButtonContent({\n          index,\n          button,\n          defaultIcon: iconElement,\n          defaultLabel: labelElement,\n          defaultContent,\n          direction: props.direction,\n        });\n      }\n\n      return defaultContent;\n    })();\n\n    // Merged button rest props\n    const mergedButtonRest: ButtonHTMLAttributes = {\n      ...sharedButtonAttrs.value.rest,\n      ...restPerButtonProps,\n      disabled:\n        button.disabled ?? (restPerButtonProps?.disabled as boolean | undefined) ?? (sharedButtonAttrs.value.rest?.disabled as boolean | undefined),\n    };\n\n    const isVisible =\n      button.show !== false ||\n      (button.inActiveColor === 'transparent' && button.activeColor === 'transparent');\n\n    // Background color logic\n    const backgroundDefault = (() => {\n      const pressedColor =\n        button.backgroundColor?.pressed;\n      const defaultColor =\n        button.backgroundColor?.default;\n\n      if (!isVisible) {\n        return 'transparent';\n      }\n\n      if (button.active && pressedColor) {\n        return pressedColor;\n      }\n\n      if (button.show && defaultColor) {\n        return defaultColor;\n      }\n\n      if (button.show) {\n        return 'rgba(255, 255, 255, 0.25)';\n      }\n\n      const sharedStyle = sharedButtonAttrs.value.style as CSSProperties || {};\n      const btnStyle = props.buttonStyle || {};\n      const perBtnBtnStyle = perButtonButtonStyle as CSSProperties || {};\n      const perBtnStyle = perButtonStyle as CSSProperties || {};\n\n      return sharedStyle.backgroundColor || btnStyle.backgroundColor || perBtnBtnStyle.backgroundColor || perBtnStyle.backgroundColor || 'transparent';\n    })();\n\n    const combinedStyle = {\n      ...styles.buttonContainer,\n      backgroundColor: backgroundDefault,\n      ...(isVertical.value ? styles.verticalButton : {}),\n      display: isVisible ? 'flex' : 'none',\n      ...(sharedButtonAttrs.value.style && typeof sharedButtonAttrs.value.style === 'object' ? sharedButtonAttrs.value.style : {}),\n      ...(props.buttonStyle && typeof props.buttonStyle === 'object' ? props.buttonStyle : {}),\n      ...(perButtonButtonStyle && typeof perButtonButtonStyle === 'object' ? perButtonButtonStyle : {}),\n      ...(perButtonStyle && typeof perButtonStyle === 'object' ? perButtonStyle : {}),\n    } as CSSProperties;\n\n    const combinedClassName = joinClassNames(\n      'buttonContainer',\n      sharedButtonAttrs.value.className,\n      props.buttonClassName,\n      perButtonButtonClassName as string | undefined,\n      perButtonClassName\n    );\n\n    const resolvedType = (perButtonType as string | undefined) || sharedButtonAttrs.value.type || 'button';\n\n    const handleClick = (event: MouseEvent) => {\n      const perOnClick = perButtonOnClick as ((event: MouseEvent) => void) | undefined;\n      if (perOnClick) perOnClick(event);\n      if (sharedButtonAttrs.value.onClick) sharedButtonAttrs.value.onClick(event);\n\n      if (!event.defaultPrevented) {\n        button.onPress?.();\n      }\n    };\n\n    const computedButtonProps: ButtonHTMLAttributes = {\n      ...mergedButtonRest,\n      class: combinedClassName,\n      style: combinedStyle,\n      type: resolvedType as 'button' | 'submit' | 'reset' | undefined,\n      onClick: handleClick,\n    };\n\n    // Render button with render hook support (per-button or global)\n    if (button.renderButton) {\n      const customButton = button.renderButton({\n        index,\n        button,\n        defaultButton: h('button', computedButtonProps, [renderedContent]),\n        defaultProps: computedButtonProps,\n        direction: props.direction,\n      });\n\n      return isVNode(customButton) ? customButton : h(RenderVNode, { node: customButton });\n    }\n\n    if (props.renderButton) {\n      const customButton = props.renderButton({\n        index,\n        button,\n        defaultButton: h('button', computedButtonProps, [renderedContent]),\n        defaultProps: computedButtonProps,\n        direction: props.direction,\n      });\n\n      return isVNode(customButton) ? customButton : h(RenderVNode, { node: customButton });\n    }\n\n    return h('button', computedButtonProps, [\n      isVNode(renderedContent) ? renderedContent : h(RenderVNode, { node: renderedContent }),\n    ]);\n  });\n});\n\n// Container node\nconst containerNode = computed<VNodeChild>(() => {\n  return h(\n    'div',\n    {\n      ...containerAttrs.value.rest,\n      class: containerClassNames.value,\n      style: containerStyle.value,\n    },\n    buttonNodes.value\n  );\n});\n</script>\n","<!--\n/**\n * @fileoverview MeetingProgressTimer - Meeting duration display badge\n * @component MeetingProgressTimer\n * @module components/displayComponents/MeetingProgressTimer\n * \n * @description\n * A positioned badge that displays the current meeting duration in HH:MM:SS format.\n * Automatically positions in one of four corners and updates in real-time as the\n * meeting progresses. Typically used to show elapsed meeting time to all participants.\n * \n * Features:\n * - Four corner positioning options (topLeft, topRight, bottomLeft, bottomRight)\n * - Real-time duration display (HH:MM:SS format)\n * - Customizable background color (default: green)\n * - Optional visibility toggle\n * - Custom text styling support\n * - Custom render functions for badge and container\n * - Full HTML attribute passthrough\n * - Fixed positioning for persistent display\n * \n * Position Options:\n * - **topLeft**: Top-left corner (10px from top, 10px from left)\n * - **topRight**: Top-right corner (10px from top, 10px from right)\n * - **bottomLeft**: Bottom-left corner (10px from bottom, 10px from left)\n * - **bottomRight**: Bottom-right corner (10px from bottom, 10px from right)\n * \n * @example Basic Timer (Top Left)\n * // <MeetingProgressTimer\n *   // meetingProgressTime=\"00:15:32\"\n * // />\n * \n * @example Top Right with Custom Color\n * // <MeetingProgressTimer\n *   // meetingProgressTime=\"01:23:45\"\n *   // position=\"topRight\"\n *   // initialBackgroundColor=\"#3b82f6\"\n * // />\n * \n * @example Bottom Right with Custom Text Style\n * // <MeetingProgressTimer\n *   // meetingProgressTime=\"00:05:12\"\n *   // position=\"bottomRight\"\n *   // initialBackgroundColor=\"#22c55e\"\n *   // :textStyle=\"{ fontSize: '16px', fontWeight: 'bold', color: '#ffffff' }\"\n * // />\n * \n * @example Conditionally Hidden\n * // <MeetingProgressTimer\n *   // meetingProgressTime=\"02:30:00\"\n *   // position=\"topLeft\"\n *   // :showTimer=\"isTimerVisible\"\n *   // initialBackgroundColor=\"#8b5cf6\"\n * // />\n * \n * @example Custom Badge Renderer\n * // <MeetingProgressTimer\n *   // meetingProgressTime=\"00:45:30\"\n *   // position=\"topRight\"\n *   // :renderBadge=\"({ defaultBadge, showTimer }) =>\n *     h('div', {\n *       class: 'custom-timer-badge',\n *       style: { background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)' }\n *     }, [\n *       h('i', { class: 'fa fa-clock' }),\n *       h('span', meetingProgressTime)\n *     ])\n *   \"\n * // />\n * \n * @example Custom Container Renderer\n * // <MeetingProgressTimer\n *   // meetingProgressTime=\"01:00:00\"\n *   // :renderContainer=\"({ defaultContainer }) =>\n *     h('div', {\n *       class: 'custom-timer-wrapper',\n *       style: { position: 'fixed', top: '50%', left: '50%', transform: 'translate(-50%, -50%)' }\n *     }, [defaultContainer])\n *   \"\n * // />\n * \n * @remarks\n * The meetingProgressTime should be updated by the parent component at regular intervals\n * (typically every second) to reflect the current meeting duration. The component itself\n * does not handle time calculation or updates.\n * \n * Workflow:\n * 1. Meeting starts → Parent begins tracking elapsed time\n * 2. Parent updates meetingProgressTime every second (e.g., \"00:00:01\", \"00:00:02\"...)\n * 3. Component displays formatted time in positioned badge\n * 4. showTimer=false → Badge hidden (but parent continues tracking time)\n * 5. Meeting ends → Badge removed from display\n * \n * @see {@link MainContainerComponent} - Main meeting container where timer is typically placed\n */\n-->\n<template>\n  <RenderVNode :node=\"containerNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  computed,\n  defineOptions,\n  defineComponent,\n  h,\n  isVNode,\n  type CSSProperties,\n  type HTMLAttributes,\n  type PropType,\n  type VNode,\n  type VNodeChild,\n} from 'vue';\n\ndefineOptions({\n  name: 'MeetingProgressTimer'\n});\n\n/**\n * Options passed to renderBadge function\n * @interface RenderBadgeOptions\n * @property {VNode} defaultBadge - The default timer badge VNode with time display\n * @property {boolean} showTimer - Whether the timer is currently visible\n */\ninterface RenderBadgeOptions {\n  defaultBadge: VNode;\n  showTimer: boolean;\n}\n\n/**\n * Options passed to renderContainer function\n * @interface RenderContainerOptions\n * @property {VNode} defaultContainer - The default positioned container VNode with badge\n */\ninterface RenderContainerOptions {\n  defaultContainer: VNode;\n}\n\n/**\n * Props for the MeetingProgressTimer component\n * @interface MeetingProgressTimerProps\n * \n * @property {string} meetingProgressTime - Current meeting duration in HH:MM:SS format (e.g., \"01:23:45\")\n * @property {string} [initialBackgroundColor='green'] - Background color for the timer badge\n * @property {'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight'} [position='topLeft'] - Corner position for the timer badge\n * @property {CSSProperties} [textStyle={}] - Custom CSS styles for the timer text\n * @property {boolean} [showTimer=true] - Whether to display the timer badge\n * @property {HTMLAttributes} [containerProps] - Additional HTML attributes for the container\n * @property {HTMLAttributes} [badgeProps] - Additional HTML attributes for the badge element\n * @property {HTMLAttributes} [textProps] - Additional HTML attributes for the text element\n * @property {(options: RenderBadgeOptions) => VNodeChild} [renderBadge] - Custom render function for the timer badge\n * @property {(options: RenderContainerOptions) => VNodeChild} [renderContainer] - Custom render function for the container\n * \n * @default initialBackgroundColor - 'green'\n * @default position - 'topLeft'\n * @default textStyle - {}\n * @default showTimer - true\n * \n * @example\n * ```typescript\n * // <MeetingProgressTimer\n *   // meetingProgressTime=\"00:15:32\"\n *   // position=\"topRight\"\n *   // initialBackgroundColor=\"#3b82f6\"\n *   // :textStyle=\"{ fontSize: '14px', fontWeight: '600' }\"\n *   // :showTimer=\"true\"\n * // />\n * ```\n */\nexport interface MeetingProgressTimerProps {\n  meetingProgressTime: string;\n  initialBackgroundColor?: string;\n  position?: 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight';\n  textStyle?: CSSProperties;\n  showTimer?: boolean;\n  containerProps?: HTMLAttributes;\n  badgeProps?: HTMLAttributes;\n  textProps?: HTMLAttributes;\n  renderBadge?: (options: RenderBadgeOptions) => VNodeChild;\n  renderContainer?: (options: RenderContainerOptions) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<MeetingProgressTimerProps>(), {\n  initialBackgroundColor: 'green',\n  position: 'topLeft',\n  textStyle: () => ({}),\n  showTimer: true,\n  containerProps: undefined,\n  badgeProps: undefined,\n  textProps: undefined,\n  renderBadge: undefined,\n  renderContainer: undefined,\n});\n\n// Helper: Join class names\nfunction joinClassNames(...classes: (string | undefined)[]): string {\n  return classes.filter(Boolean).join(' ');\n}\n\n// RenderVNode wrapper component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Boolean, Array, Function] as PropType<VNodeChild>,\n      default: null,\n    },\n  },\n  render() {\n    if (!this.node) return null;\n    if (isVNode(this.node)) return this.node;\n    if (typeof this.node === 'function') {\n      const result = (this.node as () => VNodeChild)();\n      return isVNode(result) ? result : String(result);\n    }\n    return String(this.node);\n  },\n});\n\nconst positions: Record<'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight', CSSProperties> = {\n  topLeft: { position: 'absolute', top: 0, left: 0 },\n  topRight: { position: 'absolute', top: 0, right: 0 },\n  bottomLeft: { position: 'absolute', bottom: 0, left: 0 },\n  bottomRight: { position: 'absolute', bottom: 0, right: 0 },\n};\n\nconst styles: Record<string, CSSProperties> = {\n  badgeContainer: {\n    padding: '5px',\n    position: 'relative',\n    zIndex: 1000,\n  },\n  progressTimer: {\n    backgroundColor: 'green',\n    padding: '5px',\n    borderRadius: '5px',\n    color: 'white',\n  },\n  progressTimerText: {\n    color: 'black',\n  },\n};\n\n// Container props merging\nconst containerRestAttrs = computed(() => {\n  const { class: _c, style: _s, ...rest } = props.containerProps || {};\n  return rest;\n});\n\nconst containerClassNames = computed(() =>\n  joinClassNames(\n    'mediasfu-meeting-progress__container',\n    props.containerProps?.class as string | undefined\n  )\n);\n\nconst resolvedPosition = computed(() => positions[props.position] ?? positions.topLeft);\n\nconst containerStyle = computed(() => {\n  const baseStyle: CSSProperties = {\n    ...styles.badgeContainer,\n    ...resolvedPosition.value,\n  };\n\n  return {\n    ...baseStyle,\n    ...(typeof props.containerProps?.style === 'object' ? props.containerProps.style : {}),\n  } as CSSProperties;\n});\n\n// Badge props merging\nconst badgeRestAttrs = computed(() => {\n  const { class: _c, style: _s, ...rest } = props.badgeProps || {};\n  return rest;\n});\n\nconst badgeClassNames = computed(() =>\n  joinClassNames(\n    'mediasfu-meeting-progress__badge',\n    props.badgeProps?.class as string | undefined\n  )\n);\n\nconst badgeStyle = computed(() => {\n  const baseStyle: CSSProperties = {\n    ...styles.progressTimer,\n    backgroundColor: props.initialBackgroundColor,\n    display: props.showTimer ? 'block' : 'none',\n  };\n\n  return {\n    ...baseStyle,\n    ...(typeof props.badgeProps?.style === 'object' ? props.badgeProps.style : {}),\n  } as CSSProperties;\n});\n\n// Text props merging\nconst textRestAttrs = computed(() => {\n  const { class: _c, style: _s, ...rest } = props.textProps || {};\n  return rest;\n});\n\nconst textClassNames = computed(() =>\n  joinClassNames(\n    'mediasfu-meeting-progress__text',\n    props.textProps?.class as string | undefined\n  )\n);\n\nconst textStyleCombined = computed(() => {\n  const baseStyle: CSSProperties = {\n    ...styles.progressTimerText,\n    ...props.textStyle,\n  };\n\n  return {\n    ...baseStyle,\n    ...(typeof props.textProps?.style === 'object' ? props.textProps.style : {}),\n  } as CSSProperties;\n});\n\n// Default badge\nconst defaultBadge = computed(() =>\n  h(\n    'div',\n    {\n      class: badgeClassNames.value,\n      style: badgeStyle.value,\n      ...badgeRestAttrs.value,\n    },\n    [\n      h(\n        'span',\n        {\n          class: textClassNames.value,\n          style: textStyleCombined.value,\n          ...textRestAttrs.value,\n        },\n        props.meetingProgressTime\n      ),\n    ]\n  )\n);\n\n// Badge node (with renderBadge hook)\nconst badgeNode = computed(() => {\n  if (props.renderBadge) {\n    const customBadge = props.renderBadge({\n      defaultBadge: defaultBadge.value,\n      showTimer: props.showTimer,\n    });\n    if (customBadge) {\n      if (isVNode(customBadge)) return customBadge;\n      return h(RenderVNode, { node: customBadge });\n    }\n  }\n  return defaultBadge.value;\n});\n\n// Default container\nconst defaultContainer = computed(() =>\n  h(\n    'div',\n    {\n      class: containerClassNames.value,\n      style: containerStyle.value,\n      ...containerRestAttrs.value,\n    },\n    [badgeNode.value]\n  )\n);\n\n// Container node (with renderContainer hook)\nconst containerNode = computed(() => {\n  if (props.renderContainer) {\n    const customContainer = props.renderContainer({\n      defaultContainer: defaultContainer.value,\n    });\n    if (customContainer) {\n      if (isVNode(customContainer)) return customContainer;\n      return h(RenderVNode, { node: customContainer });\n    }\n  }\n  return defaultContainer.value;\n});\n</script>\n\n<style scoped>\n/* Component-specific styles */\n</style>\n","<!--\n/**\n * @fileoverview OtherGridComponent - Secondary grid container with timer\n * @component OtherGridComponent\n * @module components/displayComponents/OtherGridComponent\n * \n * @description\n * A fixed-dimension grid container for secondary content (typically participant grid\n * or side panels) with optional timer overlay. Features column stacking by default\n * and 2px black border. Used for auxiliary video grids, participant lists, or\n * secondary content areas alongside the main grid.\n * \n * Features:\n * - Fixed width and height dimensions\n * - Optional MeetingProgressTimer overlay\n * - Custom timer component injection\n * - 2px solid black border\n * - Conditional visibility via showAspect\n * - Column stack direction by default\n * - Overflow hidden for clean edges\n * \n * @example Basic Secondary Grid\n * // <OtherGridComponent\n *   // backgroundColor=\"#1a1a1a\"\n *   // :width=\"400\"\n *   // :height=\"600\"\n *   // :showTimer=\"true\"\n *   // meetingProgressTime=\"00:15:32\"\n * >\n *   <ParticipantGrid />\n * // </OtherGridComponent>\n * \n * @example Without Timer\n * // <OtherGridComponent\n *   // backgroundColor=\"#000000\"\n *   // :width=\"300\"\n *   // :height=\"800\"\n *   // :showTimer=\"false\"\n *   // meetingProgressTime=\"00:00:00\"\n * >\n *   <SidePanel />\n * // </OtherGridComponent>\n * \n * @example Hidden Grid\n * // <OtherGridComponent\n *   // backgroundColor=\"transparent\"\n *   // :width=\"350\"\n *   // :height=\"700\"\n *   // :showAspect=\"false\"\n *   // :showTimer=\"false\"\n *   // meetingProgressTime=\"00:00:00\"\n * >\n *   <HiddenContent />\n * // </OtherGridComponent>\n * \n * @example Custom Timer Component\n * // <OtherGridComponent\n *   // backgroundColor=\"#1a1a1a\"\n *   // :width=\"400\"\n *   // :height=\"600\"\n *   // :showTimer=\"true\"\n *   // meetingProgressTime=\"01:23:45\"\n *   // :timerComponent=\"CustomTimerComponent\"\n *   // timeBackgroundColor=\"#3b82f6\"\n * >\n *   <SecondaryGrid />\n * // </OtherGridComponent>\n * \n * @remarks\n * This component is typically used alongside MainGridComponent to create split-screen\n * layouts with a main video grid and a secondary participant grid. The 2px black border\n * helps visually separate it from adjacent content. The timer overlay is positioned\n * absolutely and doesn't affect layout.\n * \n * Workflow:\n * 1. Component renders with fixed dimensions (width × height)\n * 2. 2px black border applied around container\n * 3. If showAspect=false → display: none (hidden but in DOM)\n * 4. If showTimer=true → MeetingProgressTimer rendered as overlay\n * 5. Slot content rendered inside bordered container\n * \n * @see {@link MainGridComponent} - Primary grid component for main content\n * @see {@link MeetingProgressTimer} - Timer overlay component\n */\n-->\n<template>\n  <div :style=\"containerStyle\">\n    <component\n      :is=\"timerComponent\"\n      v-if=\"showTimer\"\n      :meeting-progress-time=\"meetingProgressTime\"\n      :initial-background-color=\"timeBackgroundColor\"\n      :show-timer=\"showTimer\"\n    />\n    <slot />\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, toRefs, type CSSProperties, type Component } from 'vue';\nimport MeetingProgressTimer from './MeetingProgressTimer.vue';\n\n/**\n * Props for the OtherGridComponent\n * @interface OtherGridComponentProps\n * \n * @property {string} backgroundColor - Background color for the grid container\n * @property {number} width - Fixed width in pixels\n * @property {number} height - Fixed height in pixels\n * @property {boolean} [showAspect=true] - Whether to display the grid (false = display: none)\n * @property {string} [timeBackgroundColor='transparent'] - Background color for timer overlay\n * @property {boolean} showTimer - Whether to display the meeting timer overlay\n * @property {string} meetingProgressTime - Current meeting time in HH:MM:SS format\n * @property {'row' | 'column'} [stackDirection='column'] - Flex direction (currently not applied)\n * @property {Component} [timerComponent=MeetingProgressTimer] - Custom timer component to use\n * \n * @default showAspect - true\n * @default timeBackgroundColor - 'transparent'\n * @default stackDirection - 'column'\n * @default timerComponent - MeetingProgressTimer\n * \n * @example\n * ```typescript\n * // <OtherGridComponent\n *   // backgroundColor=\"#1a1a1a\"\n *   // :width=\"400\"\n *   // :height=\"600\"\n *   // :showTimer=\"true\"\n *   // meetingProgressTime=\"00:15:32\"\n * >\n *   <slot />\n * // </OtherGridComponent>\n * ```\n */\nexport interface OtherGridComponentProps {\n  backgroundColor: string;\n  width: number;\n  height: number;\n  showAspect?: boolean;\n  timeBackgroundColor?: string;\n  showTimer: boolean;\n  meetingProgressTime: string;\n  stackDirection?: 'row' | 'column';\n  \n  // UI override prop\n  timerComponent?: Component;\n}\n\nconst props = withDefaults(defineProps<OtherGridComponentProps>(), {\n  showAspect: true,\n  timeBackgroundColor: 'transparent',\n  stackDirection: 'column',\n  timerComponent: () => MeetingProgressTimer,\n});\n\nconst { showAspect, showTimer, meetingProgressTime, timeBackgroundColor } = toRefs(props);\n\nconst BORDER_WIDTH = 2;\n\nconst containerStyle = computed<CSSProperties>(() => ({\n  backgroundColor: props.backgroundColor,\n  width: `${props.width}px`,\n  height: `${props.height}px`,\n  display: showAspect.value ? 'block' : 'none',\n  overflow: 'hidden',\n  borderStyle: 'solid',\n  borderColor: 'black',\n  borderWidth: `${BORDER_WIDTH}px`,\n  borderRadius: 0,\n  margin: 0,\n  padding: 0,\n  boxSizing: 'border-box',\n}));\n\n</script>\n","<!--\n/**\n * @fileoverview MainScreenComponent - Responsive main screen container with dynamic sizing\n * @component MainScreenComponent\n * @module components/displayComponents/MainScreenComponent\n * \n * @description\n * The primary container for the main screen area of the MediaSFU application. Manages\n * responsive layout switching between wide-screen (side-by-side) and stacked (vertical)\n * modes. Calculates and broadcasts component sizes (mainHeight/Width, otherHeight/Width)\n * to child components. Supports custom render functions for complete UI override.\n * \n * Features:\n * - Automatic wide-screen detection (≥768px or width > 1.5 × height)\n * - Side-by-side layout for wide screens (horizontal split by mainSize%)\n * - Stacked layout for narrow screens (vertical split by mainSize%)\n * - Real-time viewport tracking with resize/orientation handlers\n * - Component size broadcasting to parent via updateComponentSizes\n * - Control bar height accommodation (defaultFraction = 0.94)\n * - Complete customization via renderChild/renderChildren/renderContainer\n * - Optimized resize handling with requestAnimationFrame\n * \n * Layout Modes:\n * - **Wide Screen (horizontal)**: Main area left (mainSize%), Other area right (100-mainSize%)\n * - **Narrow Screen (vertical)**: Main area top (mainSize%), Other area bottom (100-mainSize%)\n * - **No Stack Mode**: Full width/height for all children (for single participant view)\n * \n * @example Basic Two-Panel Layout\n * // <MainScreenComponent\n *   // :mainSize=\"70\"\n *   // :doStack=\"true\"\n *   // :showControls=\"true\"\n *   // :componentSizes=\"componentSizes\"\n *   // :updateComponentSizes=\"(sizes) => setComponentSizes(sizes)\"\n * >\n *   <template #default=\"{ mainWidth, mainHeight, otherWidth, otherHeight }\">\n *     <div :style=\"{ width: `${mainWidth}px`, height: `${mainHeight}px` }\">\n *       Main Content (70%)\n *     </div>\n *     <div :style=\"{ width: `${otherWidth}px`, height: `${otherHeight}px` }\">\n *       Secondary Content (30%)\n *     </div>\n *   </template>\n * // </MainScreenComponent>\n * \n * @example Single Panel (No Stack)\n * // <MainScreenComponent\n *   // :mainSize=\"100\"\n *   // :doStack=\"false\"\n *   // :showControls=\"true\"\n *   // :componentSizes=\"componentSizes\"\n *   // :updateComponentSizes=\"(sizes) => setComponentSizes(sizes)\"\n * >\n *   <template #default=\"{ mainWidth, mainHeight }\">\n *     <VideoCard :style=\"{ width: `${mainWidth}px`, height: `${mainHeight}px` }\" />\n *   </template>\n * // </MainScreenComponent>\n * \n * @example Custom Control Bar Height\n * // <MainScreenComponent\n *   // :mainSize=\"60\"\n *   // :doStack=\"true\"\n *   // :showControls=\"true\"\n *   // :defaultFraction=\"0.9\"\n *   // :containerHeightFraction=\"0.95\"\n *   // :componentSizes=\"componentSizes\"\n *   // :updateComponentSizes=\"(sizes) => setComponentSizes(sizes)\"\n * >\n *   // Content placeholder (90% of 95% viewport = 85.5% total height)\n * // </MainScreenComponent>\n * \n * @example With Custom Container Renderer\n * // <MainScreenComponent\n *   // :mainSize=\"50\"\n *   // :doStack=\"true\"\n *   // :showControls=\"true\"\n *   // :componentSizes=\"componentSizes\"\n *   // :updateComponentSizes=\"(sizes) => setComponentSizes(sizes)\"\n *   // :renderContainer=\"({ defaultContainer, isWideScreen, dimensions }) => {\n *     return h('div', {\n *       class: 'my-custom-container',\n *       style: { border: '2px solid blue', ...dimensions }\n *     }, [defaultContainer])\n *   }\"\n * >\n *   // Content placeholder\n * // </MainScreenComponent>\n * \n * @remarks\n * This component is the core layout manager for the main screen. It handles all viewport\n * calculations and broadcasts dimensions to children via scoped slots. The componentSizes\n * object is updated reactively whenever viewport or mainSize changes. Use doStack=true\n * for split-screen layouts and doStack=false for full-screen single views.\n * \n * Workflow:\n * 1. Component mounts and tracks window.innerWidth/innerHeight\n * 2. Calculates isWideScreen (≥768px or width > 1.5 × height)\n * 3. Computes parentWidth/Height using containerWidth/HeightFraction\n * 4. If showControls=true, applies defaultFraction to height (default 94%)\n * 5. Computes main/other dimensions based on doStack and mainSize\n * 6. Emits componentSizes to parent via updateComponentSizes\n * 7. Renders container with flex layout (row/column based on isWideScreen)\n * 8. Passes dimensions to children via scoped slots\n * 9. Re-calculates on window resize/orientation change\n * \n * Wide Screen Detection:\n * - Primary: width ≥ 768px\n * - Secondary: width > 1.5 × height (landscape tablets)\n * \n * @see {@link ComponentSizes} - Size data structure passed to parent\n * @see {@link MainAspectComponent} - Parent container with aspect ratio management\n */\n-->\n<template>\n  <component :is=\"containerNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, watch, onMounted, onUnmounted, ref, h, useSlots, type VNodeChild, type HTMLAttributes } from 'vue';\nimport type { ComponentSizes } from '../../../../SharedTypes';\n\nconst joinClassNames = (...classes: (string | undefined | null)[]): string => {\n  return classes.filter(Boolean).join(' ')\n}\n\nconst slots = useSlots();\n\n/**\n * Props for the MainScreenComponent\n * @interface MainScreenComponentProps\n * \n * @property {number} mainSize - Main area size percentage (0-100, e.g., 70 = 70%)\n * @property {boolean} doStack - Enable split-screen layout (true) or full-screen (false)\n * @property {number} [containerWidthFraction=1] - Viewport width multiplier (0-1)\n * @property {number} [containerHeightFraction=1] - Viewport height multiplier (0-1)\n * @property {function} updateComponentSizes - Callback to receive computed sizes\n * @property {number} [defaultFraction=0.94] - Height fraction when showControls=true (accounts for control bar)\n * @property {boolean} showControls - Whether control bar is visible (affects height calculation)\n * @property {ComponentSizes} componentSizes - Current component dimensions\n * @property {HTMLAttributes} [containerProps] - Additional props for container element\n * @property {function} [renderChild] - Custom renderer for individual child elements\n * @property {function} [renderChildren] - Custom renderer for all children\n * @property {function} [renderContainer] - Custom renderer for main container\n * \n * @example\n * ```typescript\n * // <MainScreenComponent\n *   // :mainSize=\"70\"\n *   // :doStack=\"true\"\n *   // :showControls=\"true\"\n *   // :defaultFraction=\"0.94\"\n *   // :componentSizes=\"{ mainHeight: 500, otherHeight: 500, mainWidth: 700, otherWidth: 300 }\"\n *   // :updateComponentSizes=\"(sizes) => console.log('New sizes:', sizes)\"\n * // />\n * ```\n */\nexport interface MainScreenComponentProps {\n  mainSize: number;\n  doStack: boolean;\n  containerWidthFraction?: number;\n  containerHeightFraction?: number;\n  updateComponentSizes: (sizes: ComponentSizes) => void;\n  defaultFraction?: number;\n  showControls: boolean;\n  componentSizes: ComponentSizes;\n  \n  // UI override props\n  containerProps?: HTMLAttributes;\n  renderChild?: (options: {\n    child: VNodeChild;\n    index: number;\n    mainSize: number;\n    isWideScreen: boolean;\n    doStack: boolean;\n    computedStyle: Record<string, unknown>;\n    componentSizes: ComponentSizes;\n  }) => VNodeChild;\n  renderChildren?: (options: {\n    defaultChildren: VNodeChild;\n    isWideScreen: boolean;\n    doStack: boolean;\n    componentSizes: ComponentSizes;\n  }) => VNodeChild;\n  renderContainer?: (options: {\n    defaultContainer: VNodeChild;\n    isWideScreen: boolean;\n    dimensions: { width: number; height: number };\n  }) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<MainScreenComponentProps>(), {\n  containerWidthFraction: 1,\n  containerHeightFraction: 1,\n  defaultFraction: 0.94,\n  containerProps: undefined,\n  renderChild: undefined,\n  renderChildren: undefined,\n  renderContainer: undefined,\n});\n\nconst viewportWidth = ref<number>(window.innerWidth);\nconst viewportHeight = ref<number>(window.innerHeight);\n\nlet resizeFrameId: number | null = null;\n\nconst updateViewportDimensions = () => {\n  if (resizeFrameId !== null) {\n    cancelAnimationFrame(resizeFrameId);\n  }\n  resizeFrameId = requestAnimationFrame(() => {\n    resizeFrameId = null;\n    viewportWidth.value = window.innerWidth;\n    viewportHeight.value = window.innerHeight;\n  });\n};\n\nconst parentWidth = computed(\n  () => viewportWidth.value * props.containerWidthFraction!\n);\n\nconst parentHeight = computed(() =>\n  props.showControls\n    ? viewportHeight.value * props.containerHeightFraction! * props.defaultFraction!\n    : viewportHeight.value * props.containerHeightFraction!\n);\n\nconst isWideScreen = computed(() => {\n  const width = parentWidth.value;\n  const height = parentHeight.value;\n  let wide = width >= 768;\n\n  if (!wide && width > 1.5 * height) {\n    wide = true;\n  }\n\n  return wide;\n});\n\nconst computeDimensions = () => {\n  if (props.doStack) {\n    return isWideScreen.value\n      ? {\n          mainHeight: parentHeight.value,\n          otherHeight: parentHeight.value,\n          mainWidth: Math.floor((props.mainSize / 100) * parentWidth.value),\n          otherWidth: Math.floor(((100 - props.mainSize) / 100) * parentWidth.value),\n        }\n      : {\n          mainHeight: Math.floor((props.mainSize / 100) * parentHeight.value),\n          otherHeight: Math.floor(((100 - props.mainSize) / 100) * parentHeight.value),\n          mainWidth: parentWidth.value,\n          otherWidth: parentWidth.value,\n        };\n  } else {\n    return {\n      mainHeight: parentHeight.value,\n      otherHeight: parentHeight.value,\n      mainWidth: parentWidth.value,\n      otherWidth: parentWidth.value,\n    };\n  }\n};\n\nconst lastEmittedSizes = ref<ComponentSizes | null>(null);\n\nconst emitComponentSizes = (sizes: ComponentSizes) => {\n  const last = lastEmittedSizes.value;\n  if (\n    !last ||\n    last.mainHeight !== sizes.mainHeight ||\n    last.otherHeight !== sizes.otherHeight ||\n    last.mainWidth !== sizes.mainWidth ||\n    last.otherWidth !== sizes.otherWidth\n  ) {\n    lastEmittedSizes.value = { ...sizes };\n    props.updateComponentSizes({ ...sizes });\n  }\n};\n\nwatch(\n  [() => parentWidth.value, () => parentHeight.value, () => props.mainSize, () => props.doStack],\n  () => {\n    const dimensions = computeDimensions();\n    emitComponentSizes(dimensions);\n  },\n  { immediate: true }\n);\n\nonMounted(() => {\n  window.addEventListener('resize', updateViewportDimensions, { passive: true });\n  window.addEventListener('orientationchange', updateViewportDimensions);\n});\n\nonUnmounted(() => {\n  window.removeEventListener('resize', updateViewportDimensions);\n  window.removeEventListener('orientationchange', updateViewportDimensions);\n  if (resizeFrameId !== null) {\n    cancelAnimationFrame(resizeFrameId);\n  }\n});\n\n// Container node with UI overrides\nconst containerNode = computed(() => {\n  const {\n    class: containerClassName,\n    style: containerStyleOverrides,\n    ...restContainerProps\n  } = props.containerProps ?? {};\n\n  const containerClassNames = joinClassNames(\n    'mediasfu-main-screen',\n    containerClassName as string\n  );\n\n  const containerStyle = {\n    display: 'flex',\n    flex: 1,\n    flexDirection: isWideScreen.value ? 'row' : 'column',\n    width: `${parentWidth.value}px`,\n    height: `${parentHeight.value}px`,\n    padding: 0,\n    margin: 0,\n    position: 'relative',\n    ...(containerStyleOverrides && typeof containerStyleOverrides === 'object' ? containerStyleOverrides : {})\n  };\n\n  const dimensions = {\n    width: parentWidth.value,\n    height: parentHeight.value\n  };\n\n  // ✅ Get actual slot content with scoped props\n  const slotProps = {\n    mainSize: props.mainSize,\n    isWideScreen: isWideScreen.value,\n    mainHeight: props.componentSizes.mainHeight,\n    otherHeight: props.componentSizes.otherHeight,\n    mainWidth: props.componentSizes.mainWidth,\n    otherWidth: props.componentSizes.otherWidth,\n  };\n\n  const slotContent = slots.default ? slots.default(slotProps) : [];\n\n  const childrenNode = props.renderChildren\n    ? props.renderChildren({\n        defaultChildren: slotContent,\n        isWideScreen: isWideScreen.value,\n        doStack: props.doStack,\n        componentSizes: props.componentSizes\n      })\n    : slotContent;\n\n  const defaultContainer = h('div', {\n    class: containerClassNames,\n    style: containerStyle,\n    ...restContainerProps\n  }, Array.isArray(childrenNode) ? childrenNode : [childrenNode]);\n\n  return props.renderContainer\n    ? props.renderContainer({\n        defaultContainer,\n        isWideScreen: isWideScreen.value,\n        dimensions\n      })\n    : defaultContainer;\n});\n\n</script>\n","<!--\n/**\n * @fileoverview MainGridComponent - Main content grid with optional timer overlay\n * @component MainGridComponent\n * @module components/displayComponents/MainGridComponent\n * \n * @description\n * A flex-based grid container for main content with optional meeting timer overlay.\n * Supports horizontal (row) or vertical (column) stacking and provides size/dimension\n * props for child components. Used as the primary layout container for video grids\n * and main content areas.\n * \n * Features:\n * - Flex layout with configurable stack direction (row/column)\n * - Optional MeetingProgressTimer overlay\n * - Custom timer component injection\n * - Fixed dimensions (width/height)\n * - Main size prop for child components\n * - Background color customization\n * - Slot-based content projection\n * \n * Stack Directions:\n * - **row** (default): Horizontal layout, children side-by-side\n * - **column**: Vertical layout, children stacked top-to-bottom\n * \n * @example Basic Horizontal Grid\n * // <MainGridComponent\n *   // backgroundColor=\"#000000\"\n *   // :mainSize=\"1200\"\n *   // :height=\"800\"\n *   // :width=\"1200\"\n *   // :showTimer=\"true\"\n *   // meetingProgressTime=\"00:15:32\"\n * >\n *   <VideoGrid />\n * // </MainGridComponent>\n * \n * @example Vertical Stack Layout\n * // <MainGridComponent\n *   // backgroundColor=\"transparent\"\n *   // :mainSize=\"800\"\n *   // :height=\"1000\"\n *   // :width=\"800\"\n *   // stackDirection=\"column\"\n *   // :showTimer=\"false\"\n *   // meetingProgressTime=\"00:00:00\"\n * >\n *   <TopSection />\n *   <BottomSection />\n * // </MainGridComponent>\n * \n * @example Without Timer\n * // <MainGridComponent\n *   // backgroundColor=\"#1a1a1a\"\n *   // :mainSize=\"1920\"\n *   // :height=\"1080\"\n *   // :width=\"1920\"\n *   // :showTimer=\"false\"\n *   // :showAspect=\"true\"\n *   // meetingProgressTime=\"00:00:00\"\n * >\n *   <ScreenShare />\n * // </MainGridComponent>\n * \n * @example Custom Timer Component\n * // <MainGridComponent\n *   // backgroundColor=\"#000000\"\n *   // :mainSize=\"1000\"\n *   // :height=\"750\"\n *   // :width=\"1000\"\n *   // :showTimer=\"true\"\n *   // meetingProgressTime=\"01:23:45\"\n *   // :timerComponent=\"CustomTimerComponent\"\n *   // timeBackgroundColor=\"#3b82f6\"\n * >\n *   <MainContent />\n * // </MainGridComponent>\n * \n * @remarks\n * The timer overlay (MeetingProgressTimer) is positioned absolutely over the content\n * and doesn't affect layout. The mainSize prop is typically used by child components\n * to determine their own sizing. Width and height define the fixed container dimensions.\n * \n * Workflow:\n * 1. Component renders flex container with specified dimensions\n * 2. Stack direction determines flexDirection (row/column)\n * 3. Slot content rendered inside flex container\n * 4. If showTimer=true → MeetingProgressTimer rendered as overlay\n * 5. Timer receives meetingProgressTime and updates display\n * \n * @see {@link MeetingProgressTimer} - Default timer overlay component\n * @see {@link MainContainerComponent} - Main content container wrapper\n * @see {@link MainAspectComponent} - Responsive aspect ratio container\n */\n-->\n<template>\n  <RenderVNode :node=\"containerNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  computed,\n  defineComponent,\n  h,\n  isVNode,\n  useSlots,\n  type Component,\n  type CSSProperties,\n  type PropType,\n  type VNodeChild,\n} from 'vue';\nimport MeetingProgressTimer from './MeetingProgressTimer.vue';\n\n/**\n * Props for the MainGridComponent\n * @interface MainGridComponentProps\n * \n * @property {string} backgroundColor - Background color for the grid container\n * @property {number} mainSize - Main size value passed to context (typically for child sizing)\n * @property {number} height - Fixed height in pixels\n * @property {number} width - Fixed width in pixels\n * @property {boolean} [showAspect=true] - Whether to show aspect ratio content\n * @property {string} [timeBackgroundColor='transparent'] - Background color for timer\n * @property {boolean} [showTimer=true] - Whether to display the meeting timer overlay\n * @property {string} meetingProgressTime - Current meeting time in HH:MM:SS format\n * @property {'row' | 'column'} [stackDirection='row'] - Flex direction for content stacking\n * @property {Component} [timerComponent=MeetingProgressTimer] - Custom timer component to use\n * \n * @default showAspect - true\n * @default timeBackgroundColor - 'transparent'\n * @default showTimer - true\n * @default stackDirection - 'row'\n * @default timerComponent - MeetingProgressTimer\n * \n * @example\n * ```typescript\n * // <MainGridComponent\n *   // backgroundColor=\"#000000\"\n *   // :mainSize=\"1200\"\n *   // :height=\"800\"\n *   // :width=\"1200\"\n *   // :showTimer=\"true\"\n *   // meetingProgressTime=\"00:15:32\"\n *   // stackDirection=\"row\"\n * >\n *   <slot />\n * // </MainGridComponent>\n * ```\n */\nexport interface MainGridComponentProps {\n  backgroundColor: string;\n  mainSize: number;\n  height: number;\n  width: number;\n  showAspect?: boolean;\n  timeBackgroundColor?: string;\n  showTimer?: boolean;\n  meetingProgressTime: string;\n  stackDirection?: 'row' | 'column';\n  timerComponent?: Component;\n}\n\nconst props = withDefaults(defineProps<MainGridComponentProps>(), {\n  showAspect: true,\n  timeBackgroundColor: 'transparent',\n  showTimer: true,\n  stackDirection: 'row',\n  timerComponent: () => MeetingProgressTimer,\n});\n\nconst slots = useSlots();\n\n// RenderVNode wrapper component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Boolean, Array, Function] as PropType<VNodeChild>,\n      default: null,\n    },\n  },\n  render() {\n    if (!this.node) return null;\n    if (isVNode(this.node)) return this.node;\n    if (typeof this.node === 'function') {\n      const result = (this.node as () => VNodeChild)();\n      return isVNode(result) ? result : String(result);\n    }\n    return String(this.node);\n  },\n});\n\nconst BORDER_WIDTH = 4;\n\nconst maingridContainerStyle = computed<CSSProperties>(() => {\n  const { width, height, backgroundColor, stackDirection, showAspect } = props;\n\n  return {\n    display: showAspect ? 'flex' : 'none',\n    flexDirection: stackDirection === 'column' ? 'column' : 'row',\n    justifyContent: 'center',\n    alignItems: 'center',\n    height: `${height}px`,\n    width: `${width}px`,\n    backgroundColor,\n    borderStyle: 'solid',\n    borderColor: '#000',\n    borderWidth: `${BORDER_WIDTH}px`,\n    boxSizing: 'border-box',\n    overflow: 'hidden',\n  } as CSSProperties;\n});\n\n// Timer component to render\nconst TimerComponent = computed(() => props.timerComponent || MeetingProgressTimer);\n\n// Timer props\nconst timerProps = computed(() => ({\n  meetingProgressTime: props.meetingProgressTime,\n  initialBackgroundColor: props.timeBackgroundColor,\n  showTimer: props.showTimer,\n}));\n\n// Render timer node\nconst timerNode = computed(() => {\n  return h(TimerComponent.value, timerProps.value);\n});\n\n// Get children from slots\nconst children = computed(() => {\n  return slots.default?.() || [];\n});\n\n// Container node with timer and children\nconst containerNode = computed<VNodeChild>(() => {\n  return h(\n    'div',\n    { style: maingridContainerStyle.value },\n    [timerNode.value, ...children.value]\n  );\n});\n</script>\n\n\n","<!--\n/**\n * @fileoverview SubAspectComponent - Secondary control area container\n * @component SubAspectComponent\n * @module components/displayComponents/SubAspectComponent\n * \n * @description\n * A container component for secondary control areas (typically bottom control bars).\n * Automatically adjusts height based on showControls prop and provides responsive\n * width calculations. Used for control buttons, toolbars, and other secondary UI\n * elements that appear/disappear based on user interaction.\n * \n * Features:\n * - Conditional visibility based on showControls\n * - Default height of 40px when visible, 0px when hidden\n * - Responsive width based on viewport fraction\n * - Custom render functions for complete control\n * - Slot-based content projection\n * - Real-time window resize handling\n * \n * Typical Use Case:\n * - Bottom control bar in video conferencing\n * - Collapsible toolbar with mute/video/share buttons\n * - Secondary navigation or settings panel\n * \n * @example Basic Control Bar\n * // <SubAspectComponent\n *   // backgroundColor=\"#1a1a1a\"\n *   // :showControls=\"controlsVisible\"\n * >\n *   <ControlButtons />\n * // </SubAspectComponent>\n * \n * @example Custom Height (via defaultFractionSub)\n * // <SubAspectComponent\n *   // backgroundColor=\"transparent\"\n *   // :showControls=\"true\"\n *   // :defaultFractionSub=\"0.08\"\n * >\n *   <Toolbar />\n * // </SubAspectComponent>\n * \n * @example With Custom Width Fraction\n * // <SubAspectComponent\n *   // backgroundColor=\"#000000\"\n *   // :showControls=\"showToolbar\"\n *   // :containerWidthFraction=\"0.95\"\n *   // :containerHeightFraction=\"1\"\n * >\n *   <BottomPanel />\n * // </SubAspectComponent>\n * \n * @example Hidden Controls\n * // <SubAspectComponent\n *   // backgroundColor=\"#000000\"\n *   // :showControls=\"false\"\n * >\n *   <ControlButtons />\n * // </SubAspectComponent>\n * \n * @example Custom Container Renderer\n * // <SubAspectComponent\n *   // backgroundColor=\"#1a1a1a\"\n *   // :showControls=\"true\"\n *   // :renderContainer=\"({ defaultContainer, styles, showControls }) =>\n *     h('div', {\n *       class: 'custom-control-bar',\n *       style: {\n *         ...styles,\n *         borderTop: showControls ? '1px solid #333' : 'none'\n *       }\n *     }, [defaultContainer])\n *   \"\n * >\n *   <Controls />\n * // </SubAspectComponent>\n * \n * @remarks\n * The component automatically sets height to 0px when showControls=false, effectively\n * hiding the control area while maintaining the component in the DOM. The defaultFractionSub\n * prop controls the height fraction when visible (default 0.0 = 40px fixed height).\n * \n * Workflow:\n * 1. Component mounts → Calculates initial dimensions\n * 2. showControls=true → Height set to 40px (or calculated from fraction)\n * 3. User hides controls → showControls=false → Height becomes 0px\n * 4. Window resized → Recalculates width based on containerWidthFraction\n * 5. Component unmounts → Cleans up resize listeners\n * \n * @see {@link MainAspectComponent} - Main content area container\n * @see {@link ControlButtonsComponent} - Control buttons often used in this component\n */\n-->\n<template>\n  <component :is=\"containerNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted, onUnmounted, computed, h, useSlots, type CSSProperties, type VNodeChild, type HTMLAttributes } from 'vue';\n\nconst joinClassNames = (...classes: (string | undefined | null)[]): string | undefined => {\n  const filtered = classes.filter(Boolean).join(' ').trim();\n  return filtered.length > 0 ? filtered : undefined;\n};\n\n/**\n * Props for the SubAspectComponent\n * @interface SubAspectComponentProps\n * \n * @property {string} backgroundColor - Background color for the container\n * @property {boolean} [showControls=true] - Whether controls are visible (affects height)\n * @property {number} [containerWidthFraction] - Fraction of viewport width (0-1)\n * @property {number} [containerHeightFraction] - Fraction of viewport height (0-1)\n * @property {number} [defaultFractionSub=0.0] - Height fraction when controls visible (0 = 40px fixed)\n * @property {HTMLAttributes} [containerProps] - Additional HTML attributes for container\n * @property {(options: { defaultContainer: VNodeChild; styles: CSSProperties; showControls: boolean }) => VNodeChild} [renderContainer] - Custom render function for container\n * @property {(options: { defaultContent: VNodeChild; showControls: boolean }) => VNodeChild} [renderContent] - Custom render function for content\n * \n * @default showControls - true\n * @default defaultFractionSub - 0.0\n * \n * @example\n * ```typescript\n * // <SubAspectComponent\n *   // backgroundColor=\"#1a1a1a\"\n *   // :showControls=\"true\"\n *   // :containerWidthFraction=\"1\"\n *   // :defaultFractionSub=\"0.05\"\n * >\n *   <slot />\n * // </SubAspectComponent>\n * ```\n */\nexport interface SubAspectComponentProps {\n  backgroundColor: string;\n  showControls?: boolean;\n  containerWidthFraction?: number;\n  containerHeightFraction?: number;\n  defaultFractionSub?: number;\n  \n  // UI override props\n  containerProps?: HTMLAttributes;\n  renderContainer?: (options: {\n    defaultContainer: VNodeChild;\n    styles: CSSProperties;\n    showControls: boolean;\n  }) => VNodeChild;\n  renderContent?: (options: {\n    defaultContent: VNodeChild;\n    showControls: boolean;\n  }) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<SubAspectComponentProps>(), {\n  showControls: true,\n  defaultFractionSub: 0.0,\n  containerWidthFraction: undefined,\n  containerHeightFraction: undefined,\n  containerProps: undefined,\n  renderContainer: undefined,\n  renderContent: undefined,\n});\n\nconst slots = useSlots();\n\nconst subAspectFraction = !props.showControls ? 0 : props.defaultFractionSub;\n\nconst aspectStyles = ref<CSSProperties>({\n  height: props.showControls ? '40px' : '0px',\n  width: props.containerWidthFraction\n    ? `${props.containerWidthFraction * window.innerWidth}px`\n    : `${window.innerWidth}px`,\n});\n\nconst updateAspectStyles = () => {\n  const windowWidth = window.innerWidth;\n\n  aspectStyles.value = {\n    height: props.showControls ? '40px' : '0px',\n    width: props.containerWidthFraction\n      ? `${props.containerWidthFraction * windowWidth}px`\n      : `${windowWidth}px`,\n  };\n};\n\n// Watch for prop changes\nwatch(\n  [\n    () => props.showControls,\n    () => props.containerHeightFraction,\n    () => props.containerWidthFraction,\n    () => subAspectFraction,\n  ],\n  () => {\n    updateAspectStyles();\n  }\n);\n\nonMounted(() => {\n  updateAspectStyles();\n  window.addEventListener('resize', updateAspectStyles);\n  window.addEventListener('orientationchange', updateAspectStyles);\n});\n\nonUnmounted(() => {\n  window.removeEventListener('resize', updateAspectStyles);\n  window.removeEventListener('orientationchange', updateAspectStyles);\n});\n\n// Container node with UI overrides\nconst containerNode = computed(() => {\n  const {\n    class: containerClassName,\n    style: containerStyleOverrides,\n    ...restContainerProps\n  } = props.containerProps ?? {};\n\n  const containerClassNames = joinClassNames(\n    'mediasfu-sub-aspect',\n    props.showControls ? 'mediasfu-sub-aspect--visible' : 'mediasfu-sub-aspect--hidden',\n    containerClassName as string\n  );\n\n  const combinedStyles: CSSProperties = {\n    position: 'absolute',\n    bottom: 0,\n    margin: 0,\n    backgroundColor: props.backgroundColor,\n    display: props.showControls ? 'flex' : 'none',\n    ...(aspectStyles.value as CSSProperties),\n    ...(containerStyleOverrides && typeof containerStyleOverrides === 'object' ? containerStyleOverrides : {})\n  } as CSSProperties;\n\n  // ✅ Get actual slot content\n  const slotContent = slots.default ? slots.default() : [];\n\n  const contentNode = props.renderContent\n    ? props.renderContent({\n        defaultContent: slotContent,\n        showControls: props.showControls\n      })\n    : slotContent;\n\n  const defaultContainer = h('div', {\n    class: containerClassNames,\n    style: combinedStyles,\n    ...restContainerProps\n  }, Array.isArray(contentNode) ? contentNode : [contentNode]);\n\n  return props.renderContainer\n    ? props.renderContainer({\n        defaultContainer,\n        styles: combinedStyles,\n        showControls: props.showControls\n      })\n    : defaultContainer;\n});\n\n</script>\n","<!--\n/**\n * @fileoverview MainContainerComponent - Main content area container with dynamic sizing\n * @component MainContainerComponent\n * @module components/displayComponents/MainContainerComponent\n * \n * @description\n * A main content container that dynamically calculates dimensions based on viewport size\n * and fractional props. Provides margin and padding controls, tracks window resizing,\n * and supports custom render functions for complete layout control. Used as the primary\n * content wrapper in meeting layouts.\n * \n * Features:\n * - Dynamic width/height based on viewport and fractions\n * - Configurable margins (left, right, top, bottom)\n * - Configurable padding\n * - Real-time window resize tracking\n * - Custom render functions for content and container\n * - Slot-based content projection\n * - Automatic dimension recalculation\n * \n * Dimension Calculation:\n * - **Width**: (window.innerWidth * containerWidthFraction) - marginLeft - marginRight\n * - **Height**: (window.innerHeight * containerHeightFraction) - marginTop - marginBottom - padding\n * \n * @example Basic Main Container\n * // <MainContainerComponent\n *   // backgroundColor=\"#000000\"\n * >\n *   <VideoGrid />\n *   <ControlButtons />\n * // </MainContainerComponent>\n * \n * @example With Custom Margins\n * // <MainContainerComponent\n *   // backgroundColor=\"transparent\"\n *   // :containerWidthFraction=\"0.95\"\n *   // :containerHeightFraction=\"0.95\"\n *   // :marginLeft=\"20\"\n *   // :marginRight=\"20\"\n *   // :marginTop=\"10\"\n *   // :marginBottom=\"10\"\n *   // :padding=\"15\"\n * >\n *   <MainContent />\n * // </MainContainerComponent>\n * \n * @example Full Viewport\n * // <MainContainerComponent\n *   // :containerWidthFraction=\"1\"\n *   // :containerHeightFraction=\"1\"\n *   // :marginLeft=\"0\"\n *   // :marginRight=\"0\"\n *   // :marginTop=\"0\"\n *   // :marginBottom=\"0\"\n *   // :padding=\"0\"\n * >\n *   <ScreenShare />\n * // </MainContainerComponent>\n * \n * @example Custom Content Renderer\n * // <MainContainerComponent\n *   // backgroundColor=\"#1a1a1a\"\n *   // :renderContent=\"({ defaultContent, dimensions }) =>\n *     h('div', {\n *       class: 'custom-content',\n *       style: {\n *         width: `${dimensions.width}px`,\n *         height: `${dimensions.height}px`,\n *         display: 'grid',\n *         gridTemplateColumns: '1fr 1fr'\n *       }\n *     }, defaultContent)\n *   \"\n * >\n *   <LeftPanel />\n *   <RightPanel />\n * // </MainContainerComponent>\n * \n * @remarks\n * The component automatically recalculates dimensions on window resize and cleans up\n * event listeners on unmount. Dimensions are available to render functions for\n * advanced layout control. Padding is subtracted from height calculations only.\n * \n * Workflow:\n * 1. Component mounts → Attaches resize listener, calculates initial dimensions\n * 2. Dimensions calculated → width and height computed from viewport and fractions\n * 3. Window resized → Recalculates dimensions automatically\n * 4. Render functions receive dimension context\n * 5. Component unmounts → Cleans up resize listener\n * \n * @see {@link MainAspectComponent} - Responsive container with screen size tracking\n * @see {@link MainGridComponent} - Grid layout for main content\n */\n-->\n<template>\n  <RenderVNode :node=\"containerNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  ref,\n  computed,\n  onMounted,\n  onUnmounted,\n  defineComponent,\n  h,\n  isVNode,\n  useSlots,\n  type CSSProperties,\n  type HTMLAttributes,\n  type PropType,\n  type VNode,\n  type VNodeChild,\n} from 'vue';\n\n/**\n * Options passed to renderContent function\n * @interface RenderContentOptions\n * @property {VNode[]} defaultContent - Array of default slot content VNodes\n * @property {{ width: number; height: number }} dimensions - Current container dimensions\n */\ninterface RenderContentOptions {\n  defaultContent: VNode[];\n  dimensions: { width: number; height: number };\n}\n\n/**\n * Options passed to renderContainer function\n * @interface RenderContainerOptions\n * @property {VNode} defaultContainer - The default container VNode with content\n * @property {{ width: number; height: number }} dimensions - Current container dimensions\n */\ninterface RenderContainerOptions {\n  defaultContainer: VNode;\n  dimensions: { width: number; height: number };\n}\n\n/**\n * Props for the MainContainerComponent\n * @interface MainContainerComponentProps\n * \n * @property {string} [backgroundColor='transparent'] - Background color for the container\n * @property {number} [containerWidthFraction=1] - Fraction of viewport width (0-1)\n * @property {number} [containerHeightFraction=1] - Fraction of viewport height (0-1)\n * @property {number} [marginLeft=0] - Left margin in pixels\n * @property {number} [marginRight=0] - Right margin in pixels\n * @property {number} [marginTop=0] - Top margin in pixels\n * @property {number} [marginBottom=0] - Bottom margin in pixels\n * @property {number} [padding=0] - Internal padding in pixels (affects height only)\n * @property {HTMLAttributes} [containerProps] - Additional HTML attributes for container\n * @property {(options: RenderContentOptions) => VNodeChild} [renderContent] - Custom render function for content\n * @property {(options: RenderContainerOptions) => VNodeChild} [renderContainer] - Custom render function for container\n * \n * @default backgroundColor - 'transparent'\n * @default containerWidthFraction - 1\n * @default containerHeightFraction - 1\n * @default marginLeft - 0\n * @default marginRight - 0\n * @default marginTop - 0\n * @default marginBottom - 0\n * @default padding - 0\n * \n * @example\n * ```typescript\n * // <MainContainerComponent\n *   // backgroundColor=\"#000000\"\n *   // :containerWidthFraction=\"0.9\"\n *   // :containerHeightFraction=\"0.9\"\n *   // :marginLeft=\"10\"\n *   // :marginRight=\"10\"\n *   // :marginTop=\"5\"\n *   // :marginBottom=\"5\"\n *   // :padding=\"10\"\n * >\n *   <slot />\n * // </MainContainerComponent>\n * ```\n */\nexport interface MainContainerComponentProps {\n  backgroundColor?: string;\n  containerWidthFraction?: number;\n  containerHeightFraction?: number;\n  marginLeft?: number;\n  marginRight?: number;\n  marginTop?: number;\n  marginBottom?: number;\n  padding?: number;\n  containerProps?: HTMLAttributes;\n  renderContent?: (options: RenderContentOptions) => VNodeChild;\n  renderContainer?: (options: RenderContainerOptions) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<MainContainerComponentProps>(), {\n  backgroundColor: 'transparent',\n  containerWidthFraction: 1,\n  containerHeightFraction: 1,\n  marginLeft: 0,\n  marginRight: 0,\n  marginTop: 0,\n  marginBottom: 0,\n  padding: 0,\n  containerProps: undefined,\n  renderContent: undefined,\n  renderContainer: undefined,\n});\n\nconst slots = useSlots();\n\n// Helper: Join class names\nfunction joinClassNames(...classes: (string | undefined)[]): string {\n  return classes.filter(Boolean).join(' ');\n}\n\n// RenderVNode wrapper component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Boolean, Array, Function] as PropType<VNodeChild>,\n      default: null,\n    },\n  },\n  render() {\n    if (!this.node) return null;\n    if (isVNode(this.node)) return this.node;\n    if (typeof this.node === 'function') {\n      const result = (this.node as () => VNodeChild)();\n      return isVNode(result) ? result : String(result);\n    }\n    return String(this.node);\n  },\n});\n\nconst getWindowSize = () => {\n  if (typeof window === 'undefined') {\n    return { width: 0, height: 0 };\n  }\n  return { width: window.innerWidth, height: window.innerHeight };\n};\n\nconst computeDimensions = (size: { width: number; height: number }) => {\n  const { width, height } = size;\n  const computedHeight = Math.floor(props.containerHeightFraction * height);\n  const computedWidth = Math.floor(props.containerWidthFraction * width);\n\n  return {\n    height: computedHeight,\n    width: computedWidth,\n    maxHeight: computedHeight,\n    maxWidth: computedWidth,\n  };\n};\n\nconst dimensions = ref(computeDimensions(getWindowSize()));\n\nconst updateDimensions = () => {\n  dimensions.value = computeDimensions(getWindowSize());\n};\n\nonMounted(() => {\n  updateDimensions();\n  window.addEventListener('resize', updateDimensions);\n  window.addEventListener('orientationchange', updateDimensions);\n});\n\nonUnmounted(() => {\n  window.removeEventListener('resize', updateDimensions);\n  window.removeEventListener('orientationchange', updateDimensions);\n});\n\n// Container props merging\nconst containerRestAttrs = computed(() => {\n  const { class: _c, style: _s, ...rest } = props.containerProps || {};\n  return rest;\n});\n\nconst containerClassNames = computed(() =>\n  joinClassNames('mediasfu-main-container', props.containerProps?.class as string | undefined)\n);\n\nconst containerStyle = computed(() => {\n  const baseStyle: CSSProperties = {\n    backgroundColor: props.backgroundColor,\n    marginLeft: `${props.marginLeft}px`,\n    marginRight: `${props.marginRight}px`,\n    marginTop: `${props.marginTop}px`,\n    marginBottom: `${props.marginBottom}px`,\n    padding: `${props.padding}px`,\n    overflow: 'hidden',\n    height: `${dimensions.value.height}px`,\n    width: `${dimensions.value.width}px`,\n    maxHeight: `${dimensions.value.maxHeight}px`,\n    maxWidth: `${dimensions.value.maxWidth}px`,\n  };\n\n  return {\n    ...baseStyle,\n    ...(typeof props.containerProps?.style === 'object' ? props.containerProps.style : {}),\n  } as CSSProperties;\n});\n\n// Default content (slot)\nconst defaultContent = computed(() => (slots.default ? slots.default() : []));\n\n// Content node (with renderContent hook)\nconst contentNode = computed(() => {\n  if (props.renderContent) {\n    const custom = props.renderContent({\n      defaultContent: defaultContent.value,\n      dimensions: dimensions.value,\n    });\n    if (custom) {\n      if (isVNode(custom)) return [custom];\n      if (Array.isArray(custom)) return custom;\n      return [h(RenderVNode, { node: custom })];\n    }\n  }\n  return defaultContent.value;\n});\n\n// Default container\nconst defaultContainer = computed(() =>\n  h(\n    'div',\n    {\n      class: containerClassNames.value,\n      style: containerStyle.value,\n      ...containerRestAttrs.value,\n    },\n    contentNode.value\n  )\n);\n\n// Container node (with renderContainer hook)\nconst containerNode = computed(() => {\n  if (props.renderContainer) {\n    const custom = props.renderContainer({\n      defaultContainer: defaultContainer.value,\n      dimensions: dimensions.value,\n    });\n    if (custom) {\n      if (isVNode(custom)) return custom;\n      return h(RenderVNode, { node: custom });\n    }\n  }\n  return defaultContainer.value;\n});\n\n</script>\n","<!--\n/**\n * @fileoverview AlertComponent - Auto-dismissing toast notification overlay\n * @component AlertComponent\n * @module components/displayComponents/AlertComponent\n * \n * @description\n * A flexible toast notification component that displays temporary messages with auto-dismiss\n * functionality. Supports success/danger types with customizable colors, duration, and\n * completely custom render functions for message and container. Positioned as a fixed\n * overlay at the top of the viewport.\n * \n * Features:\n * - Two alert types: success (green) and danger (red)\n * - Auto-dismiss with configurable duration (default 4000ms)\n * - Manual dismiss on user click\n * - Custom render functions for complete UI control\n * - Full HTML attribute passthrough for styling\n * - Automatic timer cleanup on unmount\n * - Smooth visibility transitions\n * \n * Alert Types:\n * - **success**: Green background (#4BB543) - for confirmations, completions\n * - **danger**: Red background (#FF0000) - for errors, warnings\n * \n * @example Basic Success Alert\n * // <AlertComponent\n *   // :visible=\"showAlert\"\n *   // message=\"Action completed successfully!\"\n *   // type=\"success\"\n *   // :duration=\"3000\"\n *   // :onHide=\"() => { showAlert = false; }\"\n * // />\n * \n * @example Danger Alert with Custom Text Color\n * // <AlertComponent\n *   // :visible=\"errorVisible\"\n *   // message=\"An error occurred. Please try again.\"\n *   // type=\"danger\"\n *   // :duration=\"5000\"\n *   // textColor=\"#ffffff\"\n *   // :onHide=\"handleHideError\"\n * // />\n * \n * @example Custom Styled Alert\n * // <AlertComponent\n *   // :visible=\"notificationVisible\"\n *   // message=\"New message received\"\n *   // type=\"success\"\n *   // :duration=\"4000\"\n *   // :containerProps=\"{\n *     class: 'custom-alert-container',\n *     style: { borderRadius: '12px', padding: '20px' }\n *   }\"\n *   // :messageProps=\"{ class: 'custom-message', style: { fontSize: '16px' } }\"\n *   // :onHide=\"() => { notificationVisible = false; }\"\n * // />\n * \n * @example Custom Message Renderer\n * // <AlertComponent\n *   // :visible=\"visible\"\n *   // message=\"Custom alert\"\n *   // type=\"success\"\n *   // :renderMessage=\"({ defaultMessage }) =>\n *     h('div', { class: 'custom-alert-message' }, [\n *       h('i', { class: 'fa fa-check-circle' }),\n *       h('span', defaultMessage)\n *     ])\n *   \"\n *   // :onHide=\"handleHide\"\n * // />\n * \n * @example Custom Content Renderer (Full Control)\n * // <AlertComponent\n *   // :visible=\"visible\"\n *   // message=\"Full custom alert\"\n *   // :renderContent=\"({ defaultContent }) =>\n *     h('div', {\n *       class: 'fully-custom-alert',\n *       style: { background: 'linear-gradient(135deg, #667eea 0%, #764ba2 100%)' },\n *       onClick: handleCustomDismiss\n *     }, [\n *       h('div', { class: 'alert-icon' }, '🎉'),\n *       h('div', { class: 'alert-text' }, 'Custom Alert Content!'),\n *       h('button', { class: 'close-btn' }, '×')\n *     ])\n *   \"\n *   // :onHide=\"handleHide\"\n * // />\n * \n * @remarks\n * The alert automatically dismisses after the specified duration. Users can also\n * manually dismiss by clicking anywhere on the alert. The onHide callback is\n * triggered in both auto-dismiss and manual dismiss scenarios.\n * \n * Workflow:\n * 1. visible=true → Alert appears at top of viewport\n * 2. Auto-dismiss timer starts (if duration > 0)\n * 3. Timer expires OR user clicks → onHide() called\n * 4. Parent sets visible=false → Alert disappears\n * 5. Component unmounts → Timer automatically cleared\n * \n * @see {@link LoadingModal} - For blocking loading indicators\n */\n-->\n<template>\n  <RenderVNode :node=\"overlayNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  ref,\n  computed,\n  watch,\n  onMounted,\n  onUnmounted,\n  defineComponent,\n  h,\n  isVNode,\n  type CSSProperties,\n  type HTMLAttributes,\n  type PropType,\n  type VNode,\n  type VNodeChild,\n} from 'vue';\n\n/**\n * Options passed to renderMessage function\n * @interface RenderMessageOptions\n * @property {VNode} defaultMessage - The default message VNode with text content\n */\ninterface RenderMessageOptions {\n  defaultMessage: VNode;\n}\n\n/**\n * Options passed to renderContent function\n * @interface RenderContentOptions\n * @property {VNode} defaultContent - The default alert container VNode with message\n */\ninterface RenderContentOptions {\n  defaultContent: VNode;\n}\n\n/**\n * Props for the AlertComponent\n * @interface AlertComponentProps\n * \n * @property {boolean} visible - Whether the alert is currently visible\n * @property {string} message - Message text to display in the alert\n * @property {'success' | 'danger'} [type='success'] - Alert type (success=green, danger=red)\n * @property {number} [duration=4000] - Auto-dismiss duration in milliseconds (0 = no auto-dismiss)\n * @property {() => void} [onHide] - Callback when alert is dismissed (auto or manual)\n * @property {string} [textColor='black'] - Text color for the message\n * @property {HTMLAttributes} [overlayProps] - Additional HTML attributes for the overlay wrapper\n * @property {HTMLAttributes} [containerProps] - Additional HTML attributes for the alert container\n * @property {HTMLAttributes} [messageProps] - Additional HTML attributes for the message element\n * @property {(options: RenderMessageOptions) => VNodeChild} [renderMessage] - Custom render function for message content\n * @property {(options: RenderContentOptions) => VNodeChild} [renderContent] - Custom render function for entire alert (full control)\n * \n * @default type - 'success'\n * @default duration - 4000\n * @default textColor - 'black'\n * \n * @example\n * ```typescript\n * // <AlertComponent\n *   // :visible=\"isVisible\"\n *   // message=\"Operation successful\"\n *   // type=\"success\"\n *   // :duration=\"3000\"\n *   // textColor=\"#ffffff\"\n *   // :onHide=\"() => { isVisible = false; }\"\n *   // :containerProps=\"{ style: { borderRadius: '8px' } }\"\n * // />\n * ```\n */\nexport interface AlertComponentProps {\n  visible: boolean;\n  message: string;\n  type?: 'success' | 'danger';\n  duration?: number;\n  onHide?: () => void;\n  textColor?: string;\n  overlayProps?: HTMLAttributes;\n  containerProps?: HTMLAttributes;\n  messageProps?: HTMLAttributes;\n  renderMessage?: (options: RenderMessageOptions) => VNodeChild;\n  renderContent?: (options: RenderContentOptions) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<AlertComponentProps>(), {\n  type: 'success',\n  duration: 4000,\n  textColor: 'black',\n  onHide: undefined,\n  overlayProps: undefined,\n  containerProps: undefined,\n  messageProps: undefined,\n  renderMessage: undefined,\n  renderContent: undefined,\n});\n\nconst alertType = ref<'success' | 'danger'>(props.type);\nlet timer: ReturnType<typeof setTimeout> | null = null;\n\n// Helper: Join class names\nfunction joinClassNames(...classes: (string | undefined)[]): string {\n  return classes.filter(Boolean).join(' ');\n}\n\n// RenderVNode wrapper component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Boolean, Array, Function] as PropType<VNodeChild>,\n      default: null,\n    },\n  },\n  render() {\n    if (!this.node) return null;\n    if (isVNode(this.node)) return this.node;\n    if (typeof this.node === 'function') {\n      const result = (this.node as () => VNodeChild)();\n      return isVNode(result) ? result : String(result);\n    }\n    return String(this.node);\n  },\n});\n\nwatch(\n  () => props.type,\n  (newType) => {\n    if (newType) {\n      alertType.value = newType;\n    }\n  }\n);\n\nwatch(\n  () => props.visible,\n  (newVisible) => {\n    if (newVisible && props.duration > 0) {\n      if (timer) {\n        clearTimeout(timer);\n      }\n      timer = setTimeout(() => {\n        props.onHide?.();\n      }, props.duration);\n    }\n  }\n);\n\nonMounted(() => {\n  if (props.visible && props.duration > 0) {\n    timer = setTimeout(() => {\n      props.onHide?.();\n    }, props.duration);\n  }\n});\n\nonUnmounted(() => {\n  if (timer) {\n    clearTimeout(timer);\n  }\n});\n\n// Overlay props merging\nconst overlayRestAttrs = computed(() => {\n  const { class: _c, style: _s, onClick: _o, ...rest } = props.overlayProps || {};\n  return rest;\n});\n\nconst overlayClassNames = computed(() =>\n  joinClassNames('mediasfu-alert__overlay', props.overlayProps?.class as string | undefined)\n);\n\nconst overlayStyle = computed(() => {\n  const baseStyle: CSSProperties = {\n    display: props.visible ? 'flex' : 'none',\n    justifyContent: 'center',\n    alignItems: 'center',\n    position: 'fixed',\n    top: 0,\n    left: 0,\n    width: '100%',\n    height: '100%',\n    backgroundColor: 'rgba(0, 0, 0, 0.5)',\n    zIndex: 1000,\n    padding: '16px',\n  };\n\n  return {\n    ...baseStyle,\n    ...(typeof props.overlayProps?.style === 'object' ? props.overlayProps.style : {}),\n  } as CSSProperties;\n});\n\n// Container props merging\nconst containerRestAttrs = computed(() => {\n  const { class: _c, style: _s, onClick: _o, ...rest } = props.containerProps || {};\n  return rest;\n});\n\nconst containerClassNames = computed(() =>\n  joinClassNames(\n    'mediasfu-alert__container',\n    'modalView',\n    props.containerProps?.class as string | undefined\n  )\n);\n\nconst containerStyle = computed(() => {\n  const baseStyle: CSSProperties = {\n    backgroundColor: alertType.value === 'success' ? '#16a34a' : '#dc2626',\n    borderRadius: '12px',\n    padding: '20px 24px',\n    maxWidth: '420px',\n    width: '100%',\n    boxShadow: '0 20px 45px rgba(0,0,0,0.25)',\n    transition: 'transform 0.2s ease, opacity 0.2s ease',\n    color: props.textColor,\n    cursor: 'pointer',\n    display: 'flex',\n    justifyContent: 'center',\n    alignItems: 'center',\n    textAlign: 'center',\n  };\n\n  return {\n    ...baseStyle,\n    ...(typeof props.containerProps?.style === 'object' ? props.containerProps.style : {}),\n  } as CSSProperties;\n});\n\n// Message props merging\nconst messageRestAttrs = computed(() => {\n  const { class: _c, style: _s, ...rest } = props.messageProps || {};\n  return rest;\n});\n\nconst messageClassNames = computed(() =>\n  joinClassNames(\n    'mediasfu-alert__message',\n    'modalText',\n    props.messageProps?.class as string | undefined\n  )\n);\n\nconst messageStyle = computed(() => {\n  const baseStyle: CSSProperties = {\n    margin: 0,\n    color: props.textColor,\n    fontSize: '1rem',\n    fontWeight: 600,\n    lineHeight: 1.4,\n  };\n\n  return {\n    ...baseStyle,\n    ...(typeof props.messageProps?.style === 'object' ? props.messageProps.style : {}),\n  } as CSSProperties;\n});\n\n// Default message\nconst defaultMessage = computed(() =>\n  h(\n    'p',\n    {\n      class: messageClassNames.value,\n      style: messageStyle.value,\n      ...messageRestAttrs.value,\n    },\n    props.message\n  )\n);\n\n// Message node (with renderMessage hook)\nconst messageNode = computed(() => {\n  if (props.renderMessage) {\n    const customMessage = props.renderMessage({ defaultMessage: defaultMessage.value });\n    if (customMessage) {\n      if (isVNode(customMessage)) return customMessage;\n      return h(RenderVNode, { node: customMessage });\n    }\n  }\n  return defaultMessage.value;\n});\n\n// Container dismiss handler\nconst handleDismiss = (event: MouseEvent) => {\n  const containerOnClick = props.containerProps?.onClick as ((e: MouseEvent) => void) | undefined;\n  containerOnClick?.(event);\n  if (!event.defaultPrevented) {\n    props.onHide?.();\n  }\n};\n\n// Default content\nconst defaultContent = computed(() =>\n  h(\n    'div',\n    {\n      role: 'alert',\n      'aria-live': alertType.value === 'danger' ? 'assertive' : 'polite',\n      class: containerClassNames.value,\n      style: containerStyle.value,\n      onClick: handleDismiss,\n      ...containerRestAttrs.value,\n    },\n    [messageNode.value]\n  )\n);\n\n// Final content (with renderContent hook)\nconst contentNode = computed(() => {\n  if (props.renderContent) {\n    const customContent = props.renderContent({ defaultContent: defaultContent.value });\n    if (customContent) {\n      if (isVNode(customContent)) return customContent;\n      return h(RenderVNode, { node: customContent });\n    }\n  }\n  return defaultContent.value;\n});\n\n// Overlay click handler\nconst handleOverlayClick = (event: MouseEvent) => {\n  const overlayOnClick = props.overlayProps?.onClick as ((e: MouseEvent) => void) | undefined;\n  overlayOnClick?.(event);\n  if (!event.defaultPrevented && event.target === event.currentTarget) {\n    props.onHide?.();\n  }\n};\n\n// Overlay node\nconst overlayNode = computed(() =>\n  h(\n    'div',\n    {\n      class: overlayClassNames.value,\n      style: overlayStyle.value,\n      onClick: handleOverlayClick,\n      ...overlayRestAttrs.value,\n    },\n    [contentNode.value]\n  )\n);\n\n</script>\n\n<style scoped>\n/* Component-specific styles */\n</style>\n","<!--\n/**\n * @fileoverview MeetingIDComponent - Meeting/Event ID display with copy button\n * @component MeetingIDComponent\n * @module components/menuComponents/MeetingIDComponent\n * \n * @description\n * A read-only input field displaying the meeting/event ID with a one-click copy-to-clipboard\n * button. Features visual feedback when copied (icon turns green for 2 seconds). Used in\n * MenuModal and other contexts where users need to share the meeting ID.\n * \n * Features:\n * - Read-only input field with meeting ID\n * - One-click copy-to-clipboard button\n * - Visual feedback on copy (icon turns green)\n * - Auto-resets after 2 seconds\n * - Accessible with aria-labels\n * - Uses system clipboard API\n * \n * Copy States:\n * - **Default**: Black copy icon (#0F0F10FF)\n * - **Copied**: Green copy icon (#4CAF50) for 2 seconds\n * \n * @example Basic Meeting ID Display\n * // <MeetingIDComponent\n *   // meetingID=\"abc-123-xyz\"\n * // />\n * \n * @example Empty Meeting ID\n * // <MeetingIDComponent\n *   // meetingID=\"\"\n * // />\n * \n * @example Long Meeting ID\n * // <MeetingIDComponent\n *   // meetingID=\"meeting-room-2024-01-15-afternoon-session\"\n * // />\n * \n * @remarks\n * The component uses the modern navigator.clipboard.writeText() API which requires\n * HTTPS in production or localhost for development. The copy button provides immediate\n * visual feedback by changing color, then automatically resets after 2 seconds.\n * \n * Workflow:\n * 1. Component renders read-only input with meeting ID\n * 2. User clicks copy button\n * 3. Meeting ID copied to system clipboard via navigator.clipboard\n * 4. Icon color changes to green (#4CAF50)\n * 5. After 2 seconds → Icon color resets to black (#0F0F10FF)\n * 6. User can paste meeting ID anywhere\n * \n * @see {@link MeetingPasscodeComponent} - Companion component for displaying passcode\n * @see {@link MenuModal} - Modal that typically contains this component\n */\n-->\n<template>\n  <div class=\"form-group\">\n    <label class=\"label\">Event ID:</label>\n    <div class=\"input-container\">\n      <input\n        class=\"disabled-input\"\n        :value=\"props.meetingID\"\n        readonly\n        aria-label=\"Event ID\"\n      />\n      <button\n        class=\"copy-button\"\n        aria-label=\"Copy Event ID\"\n        @click=\"handleCopy\"\n      >\n        <font-awesome-icon\n          :icon=\"faCopy\"\n          :style=\"{ fontSize: '20px', color: isCopied ? '#4CAF50' : '#0F0F10FF' }\"\n        />\n      </button>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, defineOptions } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faCopy } from '@fortawesome/free-solid-svg-icons';\n\ndefineOptions({\n  name: 'MeetingIDComponent'\n});\n\n/**\n * Props for the MeetingIDComponent\n * @interface MeetingIdComponentProps\n * \n * @property {string} [meetingID=''] - Meeting/Event ID to display and copy\n * \n * @default meetingID - ''\n * \n * @example\n * ```typescript\n * // <MeetingIDComponent\n *   // meetingID=\"meeting-abc-123\"\n * // />\n * ```\n */\nexport interface MeetingIdComponentProps {\n  meetingID?: string;\n}\n\nconst props = withDefaults(defineProps<MeetingIdComponentProps>(), {\n  meetingID: '',\n});\n\nconst isCopied = ref(false);\n\nconst handleCopy = async () => {\n  try {\n    await navigator.clipboard.writeText(props.meetingID || '');\n    isCopied.value = true;\n    setTimeout(() => {\n      isCopied.value = false;\n    }, 2000);\n  } catch {\n    // do nothing\n  }\n};\n</script>\n\n<style scoped>\n.form-group {\n  margin-top: 10px;\n  max-width: 300px;\n  width: 100%;\n  margin-bottom: 10px;\n}\n\n.label {\n  font-weight: bold;\n  font-size: 16px;\n  color: #000000;\n  margin-bottom: 5px;\n  display: block;\n}\n\n.input-container {\n  display: flex;\n  align-items: center;\n}\n\n.disabled-input {\n  flex: 1;\n  border: 1px solid gray;\n  padding: 10px;\n  background-color: #f0f0f0;\n  color: black;\n  border-radius: 5px;\n  font-size: 16px;\n  margin-right: 5px;\n}\n\n.copy-button {\n  padding: 10px;\n  border: none;\n  background-color: transparent;\n  cursor: pointer;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n}\n\n.copy-button:hover {\n  opacity: 0.8;\n}\n</style>\n","<!--\n/**\n * @fileoverview MeetingPasscodeComponent - Admin passcode display field\n * @component MeetingPasscodeComponent\n * @module components/menuComponents/MeetingPasscodeComponent\n * \n * @description\n * A simple, read-only input field that displays the meeting's admin passcode.\n * Intended for hosts/admins to view their event passcode for sharing with\n * authorized participants. The field is styled with a disabled appearance to\n * indicate it's not editable.\n * \n * Features:\n * - Read-only passcode display\n * - Styled as disabled/readonly input\n * - \"Event Passcode (Host)\" label\n * - Gray background for visual distinction\n * - Fixed width (max 300px) for consistent layout\n * \n * @example Basic Usage\n * // <MeetingPasscodeComponent\n *   // meetingPasscode=\"admin123456\"\n * // />\n * \n * @example In Menu Modal\n * // <div v-if=\"islevel === '2'\">\n *   <MeetingPasscodeComponent\n *     :meetingPasscode=\"adminPasscode\"\n *   />\n * </div>\n * \n * @example Conditional Display (Host Only)\n * // <MeetingPasscodeComponent\n *   // v-if=\"isHost\"\n *   // :meetingPasscode=\"roomPasscode\"\n * // />\n * \n * @remarks\n * This component is intentionally simple with no interactivity. For copy-to-clipboard\n * functionality, use MeetingIDComponent which includes a copy button. This component\n * is typically shown only to hosts (islevel='2') in the MenuModal.\n * \n * Workflow:\n * 1. Component receives meetingPasscode prop\n * 2. Displays as read-only input with \"Event Passcode (Host)\" label\n * 3. Gray background indicates non-editable field\n * 4. No user interactions (display only)\n * \n * @see {@link MeetingIDComponent} - Similar component with copy button\n * @see {@link MenuModal} - Parent container that conditionally shows this component\n */\n-->\n<template>\n  <div class=\"form-group\">\n    <label class=\"label\">Event Passcode (Host):</label>\n    <input\n      class=\"disabled-input\"\n      :value=\"props.meetingPasscode\"\n      readonly\n    />\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { defineOptions } from 'vue';\n\ndefineOptions({\n  name: 'MeetingPasscodeComponent'\n});\n\n/**\n * Props for the MeetingPasscodeComponent\n * @interface MeetingPasscodeComponentProps\n * \n * @property {string} [meetingPasscode=''] - The admin/host passcode to display\n * \n * @example\n * ```typescript\n * <MeetingPasscodeComponent meetingPasscode=\"admin123\" />\n * ```\n */\nexport interface MeetingPasscodeComponentProps {\n  meetingPasscode?: string;\n}\n\nconst props = withDefaults(defineProps<MeetingPasscodeComponentProps>(), {\n  meetingPasscode: '',\n});\n</script>\n\n<style scoped>\n.form-group {\n  margin-top: 10px;\n  max-width: 300px;\n}\n\n.label {\n  font-weight: bold;\n  display: block;\n  margin-bottom: 5px;\n}\n\n.disabled-input {\n  border: 1px solid gray;\n  padding: 10px;\n  margin-top: 5px;\n  background-color: #f0f0f0;\n  color: black;\n  width: 100%;\n  border-radius: 5px;\n  box-sizing: border-box;\n}\n</style>\n","<!--\n/**\n * @fileoverview ShareButtonsComponent - Social sharing buttons for meeting links\n * @component ShareButtonsComponent\n * @module components/menuComponents/ShareButtonsComponent\n * \n * @description\n * A horizontal row of social sharing buttons for distributing meeting links via various\n * platforms. Provides default buttons (Copy, Email, Facebook, WhatsApp, Telegram) and\n * supports custom buttons. Automatically generates appropriate URLs based on event type\n * and local/cloud hosting. Used in MenuModal and other sharing contexts.\n * \n * Features:\n * - 5 default share methods: Copy, Email, Facebook, WhatsApp, Telegram\n * - Automatic URL generation based on eventType (chat, broadcast, meeting)\n * - Support for custom localLink or mediasfu.com URLs\n * - Custom button injection via shareButtons prop\n * - Filterable buttons (show/hide individual buttons)\n * - Customizable button colors and icon colors\n * - Responsive horizontal layout with spacing\n * \n * Default Share Buttons:\n * - **Copy** (faCopy): Copies meeting URL to clipboard\n * - **Email** (faEnvelope): Opens default email client with pre-filled meeting link\n * - **Facebook** (faFacebook): Opens Facebook share dialog\n * - **WhatsApp** (faWhatsapp): Opens WhatsApp share dialog\n * - **Telegram** (faTelegram): Opens Telegram share dialog\n * \n * Event Type URL Mapping:\n * - **chat**: https://chat.mediasfu.com/chat/{meetingID}\n * - **broadcast**: https://broadcast.mediasfu.com/broadcast/{meetingID}\n * - **conference/webinar**: https://meeting.mediasfu.com/meeting/{meetingID}\n * - **localLink provided**: {localLink}/meeting/{meetingID}\n * \n * @example Basic Share Buttons (Default)\n * // <ShareButtonsComponent\n *   // meetingID=\"abc-123-xyz\"\n *   // eventType=\"conference\"\n * // />\n * \n * @example With Local Link (Self-Hosted)\n * // <ShareButtonsComponent\n *   // meetingID=\"meeting-456\"\n *   // eventType=\"webinar\"\n *   // localLink=\"https://my-company.com\"\n * // />\n * \n * @example Chat Event Type\n * // <ShareButtonsComponent\n *   // meetingID=\"chat-789\"\n *   // eventType=\"chat\"\n * // />\n * \n * @example Custom Share Buttons\n * // <ShareButtonsComponent\n *   // meetingID=\"broadcast-123\"\n *   // eventType=\"broadcast\"\n *   // :shareButtons=\"[\n *     {\n *       icon: faTwitter,\n *       action: () => shareToTwitter(),\n *       show: true,\n *       color: '#1DA1F2',\n *       iconColor: '#ffffff'\n *     },\n *     {\n *       icon: faLinkedin,\n *       action: () => shareToLinkedIn(),\n *       show: true,\n *       color: '#0077B5'\n *     }\n *   ]\"\n * // />\n * \n * @example Hiding Specific Default Buttons\n * // <ShareButtonsComponent\n *   // meetingID=\"meeting-abc\"\n *   // eventType=\"conference\"\n *   // :shareButtons=\"[\n *     { icon: faCopy, action: copyHandler, show: true },\n *     { icon: faEnvelope, action: emailHandler, show: true },\n *     { icon: faFacebook, action: facebookHandler, show: false },\n *     { icon: faWhatsapp, action: whatsappHandler, show: true },\n *     { icon: faTelegram, action: telegramHandler, show: false }\n *   ]\"\n * // />\n * \n * @remarks\n * The component automatically handles URL encoding and opens social sharing dialogs\n * in new browser tabs. The Copy button uses the clipboard API which requires HTTPS\n * in production. Custom buttons can be added to the default set or replace them entirely.\n * \n * Workflow:\n * 1. Component generates meeting URL based on eventType and localLink\n * 2. Renders all share buttons with show=true\n * 3. User clicks button:\n *    - **Copy**: Copies URL to clipboard\n *    - **Email**: Opens mailto: link with pre-filled subject and body\n *    - **Facebook**: Opens Facebook share dialog in new tab\n *    - **WhatsApp**: Opens WhatsApp share with pre-filled text\n *    - **Telegram**: Opens Telegram share with pre-filled text\n * 4. Social platform opens → User completes share action\n * \n * @see {@link MenuModal} - Modal that typically contains this component\n * @see {@link MeetingIDComponent} - Companion component for displaying meeting ID\n */\n-->\n<template>\n  <div class=\"share-buttons-container\">\n    <div\n      v-for=\"(button, index) in filteredShareButtons\"\n      :key=\"index\"\n      class=\"share-button\"\n      :style=\"{\n        backgroundColor: button.color || 'black',\n        marginRight: index !== filteredShareButtons.length - 1 ? '10px' : '0',\n      }\"\n      @click=\"button.action\"\n    >\n      <FontAwesomeIcon\n        :icon=\"button.icon\"\n        :style=\"{ color: button.iconColor || '#ffffff', fontSize: '24px' }\"\n      />\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, defineOptions } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faCopy, faEnvelope, type IconDefinition } from '@fortawesome/free-solid-svg-icons';\nimport {\n  faFacebook,\n  faWhatsapp,\n  faTelegram,\n} from '@fortawesome/free-brands-svg-icons';\nimport type { EventType } from 'mediasfu-shared';\n\ndefineOptions({\n  name: 'ShareButtonsComponent'\n});\n\n/**\n * Interface for custom share button configuration\n * @interface ShareButton\n * \n * @property {IconDefinition} icon - FontAwesome icon to display\n * @property {() => void} action - Function to execute when button is clicked\n * @property {boolean} show - Whether to display this button\n * @property {string} [color] - Background color for button (default: 'black')\n * @property {string} [iconColor] - Icon color (default: '#ffffff')\n * \n * @example\n * ```ts\n * const customButton: ShareButton = {\n *   // icon: faTwitter,\n *   // action: () => shareToTwitter(),\n *   // show: true,\n *   // color: '#1DA1F2',\n *   // iconColor: '#ffffff'\n * };\n * ```\n */\nexport interface ShareButton {\n  icon: IconDefinition;\n  action: () => void;\n  show: boolean;\n  color?: string;\n  iconColor?: string;\n}\n\n/**\n * Props for the ShareButtonsComponent\n * @interface ShareButtonsComponentProps\n * \n * @property {string} meetingID - Meeting/Event ID to include in share URLs\n * @property {ShareButton[]} [shareButtons=[]] - Custom share buttons to display (replaces defaults if provided)\n * @property {EventType} eventType - Event type ('chat' | 'broadcast' | 'conference' | 'webinar')\n * @property {string} [localLink=''] - Custom domain for self-hosted instances (e.g., 'https://my-company.com')\n * \n * @default shareButtons - []\n * @default localLink - ''\n * \n * @example\n * ```typescript\n * // <ShareButtonsComponent\n *   // meetingID=\"meeting-abc-123\"\n *   // eventType=\"conference\"\n *   // localLink=\"https://my-company.com\"\n *   // :shareButtons=\"customButtons\"\n * // />\n * ```\n */\nexport interface ShareButtonsComponentProps {\n  meetingID: string;\n  shareButtons?: ShareButton[];\n  eventType: EventType;\n  localLink?: string;\n}\n\nconst props = withDefaults(defineProps<ShareButtonsComponentProps>(), {\n  shareButtons: () => [],\n  localLink: '',\n});\n\nconst shareName = computed(() => {\n  return props.eventType === 'chat'\n    ? 'chat'\n    : props.eventType === 'broadcast'\n    ? 'broadcast'\n    : 'meeting';\n});\n\nconst getShareUrl = (): string => {\n  if (props.localLink && !props.localLink.includes('mediasfu.com')) {\n    return `${props.localLink}/meeting/${props.meetingID}`;\n  }\n  return `https://${shareName.value}.mediasfu.com/${shareName.value}/${props.meetingID}`;\n};\n\nconst defaultShareButtons = computed<ShareButton[]>(() => [\n  {\n    icon: faCopy,\n    action: async () => {\n      try {\n        await navigator.clipboard.writeText(getShareUrl());\n      } catch (error) {\n        console.error('Failed to copy to clipboard', error);\n      }\n    },\n    show: true,\n  },\n  {\n    icon: faEnvelope,\n    action: () => {\n      const emailUrl = `mailto:?subject=Join my meeting&body=Here's the link to the meeting: ${getShareUrl()}`;\n      window.open(emailUrl, '_blank');\n    },\n    show: true,\n  },\n  {\n    icon: faFacebook,\n    action: () => {\n      const facebookUrl = `https://www.facebook.com/sharer/sharer.php?u=${encodeURIComponent(\n        getShareUrl()\n      )}`;\n      window.open(facebookUrl, '_blank');\n    },\n    show: true,\n  },\n  {\n    icon: faWhatsapp,\n    action: () => {\n      const whatsappUrl = `https://wa.me/?text=${encodeURIComponent(getShareUrl())}`;\n      window.open(whatsappUrl, '_blank');\n    },\n    show: true,\n  },\n  {\n    icon: faTelegram,\n    action: () => {\n      const telegramUrl = `https://t.me/share/url?url=${encodeURIComponent(getShareUrl())}`;\n      window.open(telegramUrl, '_blank');\n    },\n    show: true,\n  },\n]);\n\nconst filteredShareButtons = computed(() => {\n  return props.shareButtons.length > 0\n    ? props.shareButtons.filter((button) => button.show)\n    : defaultShareButtons.value.filter((button) => button.show);\n});\n</script>\n\n<style scoped>\n.share-buttons-container {\n  display: flex;\n  flex-direction: row;\n  margin: 10px 0;\n}\n\n.share-button {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 10px;\n  border-radius: 5px;\n  margin: 0 5px;\n  cursor: pointer;\n}\n</style>\n","<!--\n/**\n * @fileoverview CustomButtons - Flexible custom button container\n * @component CustomButtons\n * @module components/menuComponents/CustomButtons\n * \n * @description\n * A simple, flexible container for rendering custom action buttons. Each button can\n * display an icon, text label, or fully custom Vue component. Supports conditional\n * visibility, disabled states, and custom styling per button. Used for injecting\n * custom actions into menus, toolbars, and control panels.\n * \n * Features:\n * - FontAwesome icon support with custom sizing/styling\n * - Optional text labels alongside icons\n * - Custom Vue component injection per button\n * - Conditional visibility via show prop\n * - Disabled state support\n * - Custom background colors per button\n * - Fallback spinner for loading states\n * - Flexible layout via CSS (horizontal/vertical)\n * \n * @example Basic Icon Buttons\n * // <CustomButtons\n *   // :buttons=\"[\n *     {\n *       icon: faGear,\n *       text: 'Settings',\n *       show: true,\n *       disabled: false,\n *       backgroundColor: '#007bff',\n *       action: () => openSettings()\n *     },\n *     {\n *       icon: faSignOutAlt,\n *       text: 'Leave',\n *       show: true,\n *       disabled: false,\n *       backgroundColor: '#dc3545',\n *       action: () => leaveRoom()\n *     }\n *   ]\"\n * // />\n * \n * @example With Custom Component\n * // <CustomButtons\n *   // :buttons=\"[\n *     {\n *       customComponent: MyCustomButton,\n *       show: true,\n *       action: () => handleCustomAction()\n *     }\n *   ]\"\n * // />\n * \n * @example Loading State (No Icon)\n * // <CustomButtons\n *   // :buttons=\"[\n *     {\n *       text: 'Loading...',\n *       show: true,\n *       disabled: true,\n *       action: () => {}\n *     }\n *   ]\"\n * // />\n * \n * @remarks\n * This component is intentionally simple - it's a pure renderer for button data.\n * All logic (click handlers, visibility, styling) is defined in the buttons array.\n * When no icon or customComponent is provided, a spinner is shown as a fallback.\n * \n * Workflow:\n * 1. Receives buttons array via props\n * 2. Renders each button with conditional display based on show prop\n * 3. Applies custom backgroundColor when visible, transparent when hidden\n * 4. Shows icon + text, customComponent, or fallback spinner\n * 5. Calls button.action on click\n * 6. Respects disabled state\n * \n * @see {@link MenuModal} - Uses CustomButtons for custom menu actions\n * @see {@link ControlButtonsComponent} - Alternative for standard control buttons\n */\n-->\n<template>\n  <div class=\"mediasfu-customButtonsContainer\">\n    <button\n      v-for=\"(button, index) in buttons\"\n      :key=\"index\"\n      class=\"customButton\"\n      :style=\"{\n        backgroundColor: button.show ? button.backgroundColor : 'transparent',\n        display: button.show ? 'flex' : 'none',\n      }\"\n      :disabled=\"button.disabled\"\n      @click=\"button.action\"\n    >\n      <div class=\"buttonContent\">\n        <template v-if=\"button.icon\">\n          <font-awesome-icon\n            :icon=\"button.icon\"\n            :style=\"{ ...customButtonIconStyle, ...button.iconStyle }\"\n          />\n          <span\n            v-if=\"button.text\"\n            class=\"customButtonText\"\n            :style=\"button.textStyle\"\n          >\n            {{ button.text }}\n          </span>\n        </template>\n        <component\n          :is=\"button.customComponent\"\n          v-else-if=\"button.customComponent\"\n        />\n        <font-awesome-icon\n          v-else\n          :icon=\"faSpinner\"\n          spin\n        />\n      </div>\n    </button>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport type { Component, CSSProperties } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faSpinner, type IconDefinition } from '@fortawesome/free-solid-svg-icons';\n\n/**\n * Custom button definition\n * @interface CustomButton\n * \n * @property {function} action - Click handler function\n * @property {boolean} show - Whether button is visible\n * @property {string} [backgroundColor] - Custom background color (e.g., '#007bff')\n * @property {boolean} [disabled] - Whether button is disabled\n * @property {IconDefinition} [icon] - FontAwesome icon definition\n * @property {CSSProperties} [iconStyle] - Custom icon styles\n * @property {string} [text] - Text label to display alongside icon\n * @property {CSSProperties} [textStyle] - Custom text styles\n * @property {Component} [customComponent] - Custom Vue component to render instead of icon\n * \n * @example\n * ```typescript\n * const button: CustomButton = {\n *   // icon: faGear,\n *   // text: 'Settings',\n *   // show: true,\n *   // disabled: false,\n *   // backgroundColor: '#007bff',\n *   // action: () => openSettings()\n * }\n * ```\n */\nexport interface CustomButton {\n  action: () => void;\n  show: boolean;\n  backgroundColor?: string;\n  disabled?: boolean;\n  icon?: IconDefinition;\n  iconStyle?: CSSProperties;\n  text?: string;\n  textStyle?: CSSProperties;\n  customComponent?: Component;\n}\n\nexport interface CustomButtonsProps {\n  buttons: CustomButton[];\n}\n\ndefineProps<CustomButtonsProps>();\n\nconst customButtonIconStyle: CSSProperties = {\n  fontSize: '20px',\n  marginRight: '5px',\n};\n</script>\n\n<style scoped>\n@import './CustomButtons.css';\n</style>\n","<!--\n/**\n * @fileoverview MenuModal - Main menu modal for MediaSFU room navigation and settings\n * @component MenuModal\n * @module components/menuComponents/MenuModal\n * \n * @description\n * A comprehensive dropdown menu that provides access to essential room information and\n * actions. This is the central navigation hub displayed when users click the menu button.\n * The modal includes customizable action buttons, displays room credentials, and offers\n * quick sharing options for inviting participants.\n * \n * Key Features:\n * - Custom action buttons with icons and labels\n * - Room ID display with copy-to-clipboard functionality\n * - Admin passcode display (host only)\n * - Social media sharing buttons (optional)\n * - Flexible positioning (top/bottom, left/right)\n * - Customizable background and styling\n * - Scroll support for long button lists\n * - Render function support for all sections\n * - Role-based visibility controls\n * \n * Sections:\n * 1. Header - Title with menu icon and close button\n * 2. Custom buttons - Configurable action buttons (screen share, recording, etc.)\n * 3. Meeting passcode - Admin credentials display (host only)\n * 4. Meeting ID - Room identifier with copy function\n * 5. Share buttons - Social media and email sharing (optional)\n * \n * @example Basic Usage\n * // <MenuModal\n *   // :isVisible=\"isMenuModalVisible\"\n *   // :onClose=\"() => updateIsMenuModalVisible(false)\"\n *   // :customButtons=\"customMenuButtons\"\n *   // roomName=\"room123\"\n *   // adminPasscode=\"admin456\"\n *   // islevel=\"2\"\n *   // eventType=\"conference\"\n * // />\n * \n * @example With Custom Buttons\n * // <script setup>\n * import { ref, computed } from 'vue';\n * import { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\n * import { faDesktop, faRecordVinyl, faCog } from '@fortawesome/free-solid-svg-icons';\n * \n * const customButtons = computed(() => [\n *   {\n *     icon: h(FontAwesomeIcon, { icon: faDesktop }),\n *     text: 'Share Screen',\n *     action: () => launchScreenShare()\n *   },\n *   {\n *     icon: h(FontAwesomeIcon, { icon: faRecordVinyl }),\n *     text: 'Start Recording',\n *     action: () => launchRecording(),\n *     show: islevel.value === '2'\n *   },\n *   {\n *     icon: h(FontAwesomeIcon, { icon: faCog }),\n *     text: 'Settings',\n *     action: () => launchSettings()\n *   }\n * ]);\n * </script>\n * \n * // <template>\n *   <MenuModal\n *     :isVisible=\"isMenuVisible\"\n *     :onClose=\"closeMenu\"\n *     :customButtons=\"customButtons\"\n *     roomName=\"my-conference\"\n *     adminPasscode=\"secure123\"\n *     islevel=\"2\"\n *     eventType=\"conference\"\n *     backgroundColor=\"#2c3e50\"\n *   />\n * </template>\n * \n * @example Custom Position and No Sharing\n * // <MenuModal\n *   // :isVisible=\"showMenu\"\n *   // :onClose=\"hideMenu\"\n *   // :customButtons=\"menuActions\"\n *   // roomName=\"webinar-room\"\n *   // adminPasscode=\"host789\"\n *   // islevel=\"2\"\n *   // eventType=\"webinar\"\n *   // position=\"topLeft\"\n *   // :shareButtons=\"false\"\n *   // backgroundColor=\"#34495e\"\n * // />\n * \n * @example Custom Render Functions\n * // <script setup>\n * const renderCustomTitle = ({ defaultTitle, menuIcon, titleContent }) => {\n *   // return h('div', { style: { display: 'flex', alignItems: 'center', gap: '10px' } }, [\n *     menuIcon,\n *     h('span', { style: { fontSize: '20px', fontWeight: 'bold' } }, titleContent),\n *     h('span', { style: { fontSize: '12px', color: '#888' } }, '(Live)')\n *   ]);\n * };\n * \n * const renderCustomMeetingId = ({ defaultMeetingId, roomName }) => {\n *   // return h('div', { style: { padding: '10px', backgroundColor: '#f0f0f0', borderRadius: '5px' } }, [\n *     h('strong', 'Room Code: '),\n *     h('code', { style: { fontSize: '16px', letterSpacing: '2px' } }, roomName)\n *   ]);\n * };\n * </script>\n * \n * // <template>\n *   <MenuModal\n *     :isVisible=\"menuOpen\"\n *     :onClose=\"closeMenu\"\n *     :customButtons=\"buttons\"\n *     roomName=\"ABC123\"\n *     adminPasscode=\"host456\"\n *     islevel=\"2\"\n *     eventType=\"conference\"\n *     :renderTitle=\"renderCustomTitle\"\n *     :renderMeetingId=\"renderCustomMeetingId\"\n *   />\n * </template>\n * \n * @example Programmatic Control\n * // <script setup>\n * const isMenuOpen = ref(false);\n * \n * const openMenu = () => {\n *   // isMenuOpen.value = true;\n * };\n * \n * const closeMenu = () => {\n *   // isMenuOpen.value = false;\n *   // console.log('Menu closed');\n * };\n * \n * const menuButtons = [\n *   { icon: exitIcon, text: 'Leave Meeting', action: () => confirmExit() },\n *   { icon: settingsIcon, text: 'Settings', action: () => openSettings() }\n * ];\n * </script>\n * \n * // <template>\n *   <div>\n *     <button @click=\"openMenu\">Open Menu</button>\n *     <MenuModal\n *       :isVisible=\"isMenuOpen\"\n *       :onClose=\"closeMenu\"\n *       :customButtons=\"menuButtons\"\n *       roomName=\"meeting-xyz\"\n *       adminPasscode=\"admin\"\n *       islevel=\"2\"\n *       eventType=\"conference\"\n *     />\n *   </div>\n * </template>\n * \n * @see {@link CustomButton} for button configuration\n * @see {@link MeetingIDComponent} for room ID display\n * @see {@link MeetingPasscodeComponent} for passcode display\n * @see {@link ShareButtonsComponent} for sharing functionality\n */\n-->\n<template>\n  <RenderVNode :node=\"overlayNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, h, isVNode, defineComponent, type CSSProperties, type PropType, type VNodeChild, type HTMLAttributes, type ButtonHTMLAttributes } from 'vue'\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'\nimport { faBars, faTimes } from '@fortawesome/free-solid-svg-icons'\nimport MeetingIdComponent from './MeetingIDComponent.vue'\nimport MeetingPasscodeComponent from './MeetingPasscodeComponent.vue'\nimport ShareButtonsComponent from './ShareButtonsComponent.vue'\nimport CustomButtons from './CustomButtons.vue'\nimport type { EventType } from '../../../../SharedTypes'\nimport type { CustomButton } from './CustomButtons.vue'\n\n/**\n * Props for the MenuModal component\n * @interface MenuModalProps\n * \n * @property {string} [backgroundColor='#83c0e9'] - Background color of the modal content\n * @property {boolean} isVisible - Controls modal visibility (true = visible, false = hidden)\n * @property {Function} onClose - Callback when modal should close (user clicks close button or outside modal)\n * @property {CustomButton[]} [customButtons=[]] - Array of custom action buttons to display\n *   // @example\n *   ```ts\n *   [\n *     { icon: screenIcon, text: 'Share Screen', action: () => startScreenShare() },\n *     { icon: recordIcon, text: 'Record', action: () => startRecording(), show: isHost }\n *   ]\n *   ```\n * @property {boolean} [shareButtons=true] - Whether to display social media share buttons\n * @property {string} [position='bottomRight'] - Modal position on screen\n *   - Options: 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight'\n * @property {string} roomName - Meeting/room identifier (displayed as Meeting ID)\n * @property {string} adminPasscode - Host passcode (only shown when islevel === '2')\n * @property {string} islevel - User's privilege level\n *   - '2' = Host (sees admin passcode)\n *   - Other values = Regular participant\n * @property {EventType} eventType - Type of MediaSFU event (conference, webinar, broadcast, chat)\n * @property {string} [localLink] - Local server URL for self-hosted deployments (used in share buttons)\n * \n * @property {VNodeChild} [title='Menu'] - Custom title content (can be string or VNode)\n * @property {VNodeChild} [menuIcon] - Custom menu icon (default: faBars FontAwesome icon)\n * @property {VNodeChild} [closeIcon] - Custom close button icon (default: faTimes FontAwesome icon)\n * \n * @property {HTMLAttributes} [overlayProps] - Props for the overlay wrapper (backdrop)\n * @property {HTMLAttributes} [contentProps] - Props for the modal content container\n * @property {HTMLAttributes} [headerProps] - Props for the header section\n * @property {HTMLAttributes} [titleWrapperProps] - Props for the title wrapper div\n * @property {HTMLAttributes} [badgeWrapperProps] - Props for badge wrapper (if applicable)\n * @property {ButtonHTMLAttributes} [closeButtonProps] - Props for the close button element\n * @property {HTMLAttributes} [dividerProps] - Props for horizontal divider after header\n * @property {HTMLAttributes} [bodyProps] - Props for the body section container\n * @property {HTMLAttributes} [scrollWrapperProps] - Props for the scrollable content wrapper\n * @property {HTMLAttributes} [customButtonsWrapperProps] - Props for custom buttons section wrapper\n * @property {HTMLAttributes} [meetingPasscodeWrapperProps] - Props for meeting passcode section wrapper\n * @property {HTMLAttributes} [meetingIdWrapperProps] - Props for meeting ID section wrapper\n * @property {HTMLAttributes} [shareButtonsWrapperProps] - Props for share buttons section wrapper\n * @property {HTMLAttributes} [sectionsDividerProps] - Props for dividers between sections\n * \n * @property {Function} [renderHeader] - Custom render function for entire header section\n *   // @param {Object} options\n *   // @param {VNodeChild} options.defaultHeader - Default header VNode\n *   // @param {Function} options.onClose - Close handler function\n *   // @returns {VNodeChild} Custom header VNode\n *   // @example\n *   ```ts\n *   ({ defaultHeader, onClose }) => {\n *     return h('div', { class: 'custom-header' }, [\n *       h('h2', 'My Custom Menu'),\n *       h('button', { onClick: onClose }, 'X')\n *     ]);\n *   }\n *   ```\n * \n * @property {Function} [renderTitle] - Custom render function for title section\n *   // @param {Object} options\n *   // @param {VNodeChild} options.defaultTitle - Default title VNode\n *   // @param {VNodeChild} options.menuIcon - Menu icon VNode\n *   // @param {VNodeChild} options.titleContent - Title text/content\n *   // @returns {VNodeChild} Custom title VNode\n * \n * @property {Function} [renderCustomButtons] - Custom render function for custom buttons section\n *   // @param {Object} options\n *   // @param {VNodeChild} options.defaultCustomButtons - Default buttons VNode\n *   // @param {CustomButton[]} options.buttons - Array of button configurations\n *   // @returns {VNodeChild} Custom buttons VNode\n * \n * @property {Function} [renderMeetingPasscode] - Custom render function for meeting passcode section\n *   // @param {Object} options\n *   // @param {VNodeChild} options.defaultMeetingPasscode - Default passcode display VNode\n *   // @param {string} options.adminPasscode - The admin passcode string\n *   // @param {boolean} options.isHost - Whether current user is host (islevel === '2')\n *   // @returns {VNodeChild} Custom passcode VNode\n * \n * @property {Function} [renderMeetingId] - Custom render function for meeting ID section\n *   // @param {Object} options\n *   // @param {VNodeChild} options.defaultMeetingId - Default meeting ID display VNode\n *   // @param {string} options.roomName - The room name/ID string\n *   // @returns {VNodeChild} Custom meeting ID VNode\n * \n * @property {Function} [renderShareButtons] - Custom render function for share buttons section\n *   // @param {Object} options\n *   // @param {VNodeChild} options.defaultShareButtons - Default share buttons VNode\n *   // @param {boolean} options.hasShareButtons - Whether share buttons are enabled\n *   // @returns {VNodeChild} Custom share buttons VNode\n * \n * @property {Function} [renderBody] - Custom render function for entire body section\n *   // @param {Object} options\n *   // @param {VNodeChild} options.defaultBody - Default body VNode\n *   // @returns {VNodeChild} Custom body VNode\n * \n * @property {Function} [renderContent] - Custom render function for entire modal content\n *   // @param {Object} options\n *   // @param {VNodeChild} options.defaultContent - Default content VNode\n *   // @returns {VNodeChild} Custom content VNode\n */\nexport interface MenuModalProps {\n  backgroundColor?: string\n  isVisible: boolean\n  onClose: () => void\n  customButtons?: CustomButton[]\n  shareButtons?: boolean\n  position?: string\n  roomName: string\n  adminPasscode: string\n  islevel: string\n  eventType: EventType\n  localLink?: string\n  \n  // UI override props\n  title?: VNodeChild\n  menuIcon?: VNodeChild\n  closeIcon?: VNodeChild\n  overlayProps?: HTMLAttributes\n  contentProps?: HTMLAttributes\n  headerProps?: HTMLAttributes\n  titleWrapperProps?: HTMLAttributes\n  badgeWrapperProps?: HTMLAttributes\n  closeButtonProps?: ButtonHTMLAttributes\n  dividerProps?: HTMLAttributes\n  bodyProps?: HTMLAttributes\n  scrollWrapperProps?: HTMLAttributes\n  customButtonsWrapperProps?: HTMLAttributes\n  meetingPasscodeWrapperProps?: HTMLAttributes\n  meetingIdWrapperProps?: HTMLAttributes\n  shareButtonsWrapperProps?: HTMLAttributes\n  sectionsDividerProps?: HTMLAttributes\n  renderHeader?: (options: {\n    defaultHeader: VNodeChild\n    onClose: () => void\n  }) => VNodeChild\n  renderTitle?: (options: {\n    defaultTitle: VNodeChild\n    menuIcon: VNodeChild\n    titleContent: VNodeChild\n  }) => VNodeChild\n  renderCustomButtons?: (options: {\n    defaultCustomButtons: VNodeChild\n    buttons: CustomButton[]\n  }) => VNodeChild\n  renderMeetingPasscode?: (options: {\n    defaultMeetingPasscode: VNodeChild\n    adminPasscode: string\n    isHost: boolean\n  }) => VNodeChild\n  renderMeetingId?: (options: {\n    defaultMeetingId: VNodeChild\n    roomName: string\n  }) => VNodeChild\n  renderShareButtons?: (options: {\n    defaultShareButtons: VNodeChild\n    hasShareButtons: boolean\n  }) => VNodeChild\n  renderBody?: (options: { defaultBody: VNodeChild }) => VNodeChild\n  renderContent?: (options: { defaultContent: VNodeChild }) => VNodeChild\n}\n\nconst props = withDefaults(defineProps<MenuModalProps>(), {\n  backgroundColor: '#83c0e9',\n  customButtons: () => [],\n  shareButtons: true,\n  position: 'bottomRight',\n  title: () => 'Menu',\n  localLink: undefined,\n  overlayProps: undefined,\n  contentProps: undefined,\n  headerProps: undefined,\n  titleWrapperProps: undefined,\n  badgeWrapperProps: undefined,\n  closeButtonProps: undefined,\n  dividerProps: undefined,\n  bodyProps: undefined,\n  scrollWrapperProps: undefined,\n  customButtonsWrapperProps: undefined,\n  meetingPasscodeWrapperProps: undefined,\n  meetingIdWrapperProps: undefined,\n  shareButtonsWrapperProps: undefined,\n  sectionsDividerProps: undefined,\n  menuIcon: undefined,\n  closeIcon: undefined,\n  renderHeader: undefined,\n  renderTitle: undefined,\n  renderCustomButtons: undefined,\n  renderMeetingPasscode: undefined,\n  renderMeetingId: undefined,\n  renderShareButtons: undefined,\n  renderBody: undefined,\n  renderContent: undefined\n})\n\n// Inline RenderVNode component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Function] as PropType<VNodeChild>,\n      default: null\n    }\n  },\n  setup(props) {\n    return () => {\n      const node = props.node\n      if (isVNode(node)) {\n        return node\n      } else if (typeof node === 'function') {\n        return (node as () => VNodeChild)()\n      } else {\n        return node\n      }\n    }\n  }\n})\n\n// Helper function\nconst joinClassNames = (classes: (string | undefined)[]): string | undefined => {\n  const filtered = classes.filter(Boolean)\n  return filtered.length > 0 ? filtered.join(' ').trim() : undefined\n}\n\n// Computed properties\nconst overlayWidth = typeof window !== 'undefined' ? Math.min(window.innerWidth * 0.7, 400) : 320\n\n// Overlay styles\nconst overlayStyle = computed((): CSSProperties => ({\n  position: 'fixed' as const,\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  display: props.isVisible ? 'block' : 'none',\n  zIndex: 999,\n  ...(props.overlayProps?.style as CSSProperties || {})\n}))\n\nconst overlayClassName = computed(() => \n  joinClassNames(['mediasfu-menu-modal', props.overlayProps?.class as string])\n)\n\n// Content styles\nconst contentStyle = computed((): CSSProperties => ({\n  position: 'fixed' as const,\n  backgroundColor: props.backgroundColor,\n  borderRadius: '10px',\n  padding: '10px',\n  width: `${overlayWidth}px`,\n  maxHeight: '85%',\n  overflowY: 'auto' as const,\n  top: props.position.includes('top') ? '10px' : 'auto',\n  bottom: props.position.includes('bottom') ? '10px' : 'auto',\n  left: props.position.includes('Left') ? '10px' : 'auto',\n  right: props.position.includes('Right') ? '10px' : 'auto',\n  ...(props.contentProps?.style as CSSProperties || {})\n}))\n\nconst contentClassName = computed(() => \n  joinClassNames(['mediasfu-menu-modal__content', props.contentProps?.class as string])\n)\n\n// Header styles\nconst headerStyle = computed((): CSSProperties => ({\n  display: 'flex',\n  justifyContent: 'space-between',\n  alignItems: 'center',\n  marginBottom: '15px',\n  ...(props.headerProps?.style as CSSProperties || {})\n}))\n\nconst headerClassName = computed(() => \n  joinClassNames(['menu-modal__header', props.headerProps?.class as string])\n)\n\n// Title wrapper styles\nconst titleWrapperStyle = computed((): CSSProperties => ({\n  fontSize: '18px',\n  fontWeight: 'bold',\n  color: 'black',\n  ...(props.titleWrapperProps?.style as CSSProperties || {})\n}))\n\nconst titleWrapperClassName = computed(() => \n  joinClassNames(['menu-modal__title-wrapper', props.titleWrapperProps?.class as string])\n)\n\n// Close button styles\nconst closeButtonStyle = computed((): CSSProperties => ({\n  padding: '5px',\n  cursor: 'pointer',\n  background: 'none',\n  border: 'none',\n  ...(props.closeButtonProps?.style as CSSProperties || {})\n}))\n\nconst closeButtonClassName = computed(() => \n  joinClassNames(['btn-close-menu', props.closeButtonProps?.class as string])\n)\n\n// Divider styles\nconst dividerStyle = computed((): CSSProperties => ({\n  height: '1px',\n  backgroundColor: 'black',\n  marginTop: '5px',\n  marginBottom: '5px',\n  border: 'none',\n  ...(props.dividerProps?.style as CSSProperties || {})\n}))\n\n// Body styles\nconst bodyStyle = computed((): CSSProperties => ({\n  flex: 1,\n  ...(props.bodyProps?.style as CSSProperties || {})\n}))\n\nconst bodyClassName = computed(() => \n  joinClassNames(['menu-modal__body', props.bodyProps?.class as string])\n)\n\n// Scroll wrapper styles\nconst scrollWrapperStyle = computed((): CSSProperties => ({\n  maxHeight: 'calc(70% - 70px)',\n  overflowY: 'auto' as const,\n  ...(props.scrollWrapperProps?.style as CSSProperties || {})\n}))\n\nconst scrollWrapperClassName = computed(() => \n  joinClassNames(['menu-modal__scroll', props.scrollWrapperProps?.class as string])\n)\n\n// Sections divider styles\nconst sectionsDividerStyle = computed((): CSSProperties => ({\n  height: '1px',\n  backgroundColor: '#ffffff',\n  marginTop: '10px',\n  marginBottom: '10px',\n  ...(props.sectionsDividerProps?.style as CSSProperties || {})\n}))\n\n// Event handlers\nconst handleCloseClick = (event: MouseEvent) => {\n  if (props.closeButtonProps?.onClick) {\n    (props.closeButtonProps.onClick as (event: MouseEvent) => void)(event)\n  }\n  if (!event.defaultPrevented) {\n    props.onClose()\n  }\n}\n\n// Main overlay node\nconst overlayNode = computed(() => {\n  const defaultMenuIcon = props.menuIcon ?? h(FontAwesomeIcon, { \n    icon: faBars, \n    style: { fontSize: '20px', color: 'black' } \n  })\n  \n  const defaultCloseIcon = props.closeIcon ?? h(FontAwesomeIcon, { \n    icon: faTimes, \n    style: { fontSize: '20px', color: 'black' } \n  })\n  \n  const titleContent = typeof props.title === 'string' || typeof props.title === 'number' ? props.title : (props.title || '')\n  \n  const defaultTitleNode = h('div', {\n    class: titleWrapperClassName.value,\n    style: titleWrapperStyle.value,\n    ...(props.titleWrapperProps ? Object.fromEntries(\n      Object.entries(props.titleWrapperProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    defaultMenuIcon,\n    ' ',\n    titleContent\n  ])\n  \n  const titleNode = props.renderTitle\n    ? props.renderTitle({\n        defaultTitle: defaultTitleNode,\n        menuIcon: defaultMenuIcon,\n        titleContent: props.title\n      })\n    : defaultTitleNode\n  \n  const defaultHeaderNode = h('div', {\n    class: headerClassName.value,\n    style: headerStyle.value,\n    ...(props.headerProps ? Object.fromEntries(\n      Object.entries(props.headerProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    titleNode,\n    h('button', {\n      class: closeButtonClassName.value,\n      style: closeButtonStyle.value,\n      onClick: handleCloseClick,\n      ...(props.closeButtonProps ? Object.fromEntries(\n        Object.entries(props.closeButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {})\n    }, [defaultCloseIcon])\n  ])\n  \n  const headerNode = props.renderHeader\n    ? props.renderHeader({ defaultHeader: defaultHeaderNode, onClose: props.onClose })\n    : defaultHeaderNode\n  \n  const dividerNode = h('hr', {\n    style: dividerStyle.value,\n    ...(props.dividerProps ? Object.fromEntries(\n      Object.entries(props.dividerProps).filter(([key]) => key !== 'style')\n    ) : {})\n  })\n  \n  const defaultCustomButtonsNode = h('div', {\n    class: props.customButtonsWrapperProps?.class,\n    style: props.customButtonsWrapperProps?.style,\n    ...(props.customButtonsWrapperProps ? Object.fromEntries(\n      Object.entries(props.customButtonsWrapperProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    h(CustomButtons, { buttons: props.customButtons })\n  ])\n  \n  const customButtonsNode = props.renderCustomButtons\n    ? props.renderCustomButtons({\n        defaultCustomButtons: defaultCustomButtonsNode,\n        buttons: props.customButtons\n      })\n    : defaultCustomButtonsNode\n  \n  const sectionsDividerNode = h('div', {\n    style: sectionsDividerStyle.value,\n    ...(props.sectionsDividerProps ? Object.fromEntries(\n      Object.entries(props.sectionsDividerProps).filter(([key]) => key !== 'style')\n    ) : {})\n  })\n  \n  const isHost = props.islevel === '2'\n  \n  const defaultMeetingPasscodeNode = isHost ? h('div', {\n    class: props.meetingPasscodeWrapperProps?.class,\n    style: props.meetingPasscodeWrapperProps?.style,\n    ...(props.meetingPasscodeWrapperProps ? Object.fromEntries(\n      Object.entries(props.meetingPasscodeWrapperProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    h(MeetingPasscodeComponent, { meetingPasscode: props.adminPasscode })\n  ]) : null\n  \n  const meetingPasscodeNode = props.renderMeetingPasscode\n    ? props.renderMeetingPasscode({\n        defaultMeetingPasscode: defaultMeetingPasscodeNode,\n        adminPasscode: props.adminPasscode,\n        isHost\n      })\n    : defaultMeetingPasscodeNode\n  \n  const defaultMeetingIdNode = h('div', {\n    class: props.meetingIdWrapperProps?.class,\n    style: { marginBottom: '10px', ...(props.meetingIdWrapperProps?.style as CSSProperties || {}) },\n    ...(props.meetingIdWrapperProps ? Object.fromEntries(\n      Object.entries(props.meetingIdWrapperProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    h(MeetingIdComponent, { meetingID: props.roomName })\n  ])\n  \n  const meetingIdNode = props.renderMeetingId\n    ? props.renderMeetingId({\n        defaultMeetingId: defaultMeetingIdNode,\n        roomName: props.roomName\n      })\n    : defaultMeetingIdNode\n  \n  const defaultShareButtonsNode = props.shareButtons ? h('div', {\n    class: props.shareButtonsWrapperProps?.class,\n    style: props.shareButtonsWrapperProps?.style,\n    ...(props.shareButtonsWrapperProps ? Object.fromEntries(\n      Object.entries(props.shareButtonsWrapperProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    h(ShareButtonsComponent, {\n      meetingID: props.roomName,\n      eventType: props.eventType,\n      localLink: props.localLink\n    })\n  ]) : null\n  \n  const shareButtonsNode = props.renderShareButtons\n    ? props.renderShareButtons({\n        defaultShareButtons: defaultShareButtonsNode,\n        hasShareButtons: props.shareButtons\n      })\n    : defaultShareButtonsNode\n  \n  const defaultBodyNode = h('div', {\n    class: bodyClassName.value,\n    style: bodyStyle.value,\n    ...(props.bodyProps ? Object.fromEntries(\n      Object.entries(props.bodyProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    h('div', {\n      class: scrollWrapperClassName.value,\n      style: scrollWrapperStyle.value,\n      ...(props.scrollWrapperProps ? Object.fromEntries(\n        Object.entries(props.scrollWrapperProps).filter(([key]) => !['class', 'style'].includes(key))\n      ) : {})\n    }, [\n      h('div', { style: { margin: 0, padding: 0 } }, [\n        customButtonsNode,\n        sectionsDividerNode,\n        meetingPasscodeNode,\n        meetingIdNode,\n        shareButtonsNode\n      ].filter(Boolean))\n    ])\n  ])\n  \n  const bodyNode = props.renderBody\n    ? props.renderBody({ defaultBody: defaultBodyNode })\n    : defaultBodyNode\n  \n  const defaultContentNode = h('div', {\n    class: contentClassName.value,\n    style: contentStyle.value,\n    ...(props.contentProps ? Object.fromEntries(\n      Object.entries(props.contentProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    headerNode,\n    dividerNode,\n    bodyNode\n  ])\n  \n  const contentNode = props.renderContent\n    ? props.renderContent({ defaultContent: defaultContentNode })\n    : defaultContentNode\n  \n  return h('div', {\n    class: overlayClassName.value,\n    style: overlayStyle.value,\n    ...(props.overlayProps ? Object.fromEntries(\n      Object.entries(props.overlayProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [contentNode])\n})\n</script>\n\n\n","<!--\n/**\n * @fileoverview StandardPanelComponent - Basic recording configuration panel\n * @component StandardPanelComponent\n * @module components/recordingComponents/StandardPanelComponent\n * \n * @description\n * A basic recording configuration panel providing essential recording options for standard\n * use cases. Features dropdown selectors for media type (video/audio), specific audio sources\n * (all/onScreen/host), specific video sources (all/mainScreen), and HLS output option. Designed\n * for simple recording workflows without advanced customization needs.\n * \n * Key Features:\n * - **Media Options**: Record video or audio only\n * - **Specific Audios**: Select which audio sources to include (all/on-screen/host-only)\n * - **Specific Videos**: Select which video sources to include (all/main-screen)\n * - **Add HLS**: Enable/disable HLS (HTTP Live Streaming) output format\n * - Event type awareness (broadcast mode hides audio/video specific options)\n * - Dropdown selectors for easy configuration\n * - Immediate state updates on selection change\n * - Horizontal rule separators for visual organization\n * \n * Recording Options:\n * - **Media Options**:\n *   - `video`: Record both audio and video\n *   - `audio`: Record audio only (no video)\n * \n * - **Specific Audios** (hidden for broadcast events):\n *   - `all`: Include audio from all participants\n *   - `onScreen`: Include audio only from visible participants\n *   - `host`: Include only host audio\n * \n * - **Specific Videos** (hidden for broadcast events):\n *   - `all`: Include all participant videos\n *   - `mainScreen`: Include only main screen content (includes screenshare)\n * \n * - **Add HLS**:\n *   - `true`: Generate HLS output for streaming compatibility\n *   - `false`: Standard recording output only\n * \n * Workflow:\n * 1. Component displays dropdown selectors with current recording settings\n * 2. User selects media option (video/audio) → updateRecordingMediaOptions called\n * 3. User selects audio option (all/onScreen/host) → updateRecordingAudioOptions called\n * 4. User selects video option (all/mainScreen) → updateRecordingVideoOptions called\n * 5. User selects HLS option (true/false) → updateRecordingAddHLS called\n * 6. Parent component (RecordingModal) receives updated settings\n * 7. Settings applied when recording starts\n * \n * @example Basic Usage\n * ```typescript\n * // <StandardPanelComponent\n *   // :parameters=\"{\n *     recordingMediaOptions: 'video',\n *     recordingAudioOptions: 'all',\n *     recordingVideoOptions: 'all',\n *     recordingAddHLS: false,\n *     updateRecordingMediaOptions: setMediaOptions,\n *     updateRecordingAudioOptions: setAudioOptions,\n *     updateRecordingVideoOptions: setVideoOptions,\n *     updateRecordingAddHLS: setAddHLS,\n *     eventType: 'conference'\n *   }\"\n * // />\n * ```\n * \n * @example Broadcast Event (Audio/Video Options Hidden)\n * ```typescript\n * // <StandardPanelComponent\n *   // :parameters=\"{\n *     recordingMediaOptions: 'video',\n *     recordingAudioOptions: 'all',\n *     recordingVideoOptions: 'all',\n *     recordingAddHLS: true,\n *     updateRecordingMediaOptions: setMediaOptions,\n *     updateRecordingAudioOptions: setAudioOptions,\n *     updateRecordingVideoOptions: setVideoOptions,\n *     updateRecordingAddHLS: setAddHLS,\n *     eventType: 'broadcast'\n *   }\"\n * // />\n * ```\n * \n * @example With State Management\n * ```typescript\n * // <script setup>\n * import { ref } from 'vue';\n * \n * const recordingSettings = ref({\n *   // mediaOptions: 'video',\n *   // audioOptions: 'onScreen',\n *   // videoOptions: 'mainScreen',\n *   // addHLS: false\n * });\n * \n * const updateMediaOptions = (value) => {\n *   // recordingSettings.value.mediaOptions = value;\n *   // console.log('Media options:', value);\n * };\n * \n * const updateAudioOptions = (value) => {\n *   // recordingSettings.value.audioOptions = value;\n *   // console.log('Audio options:', value);\n * };\n * \n * const updateVideoOptions = (value) => {\n *   // recordingSettings.value.videoOptions = value;\n *   // console.log('Video options:', value);\n * };\n * \n * const updateAddHLS = (value) => {\n *   // recordingSettings.value.addHLS = value;\n *   // console.log('Add HLS:', value);\n * };\n * </script>\n * \n * // <template>\n *   <StandardPanelComponent\n *     :parameters=\"{\n *       recordingMediaOptions: recordingSettings.mediaOptions,\n *       recordingAudioOptions: recordingSettings.audioOptions,\n *       recordingVideoOptions: recordingSettings.videoOptions,\n *       recordingAddHLS: recordingSettings.addHLS,\n *       updateRecordingMediaOptions: updateMediaOptions,\n *       updateRecordingAudioOptions: updateAudioOptions,\n *       updateRecordingVideoOptions: updateVideoOptions,\n *       updateRecordingAddHLS: updateAddHLS,\n *       eventType: 'webinar'\n *     }\"\n *   />\n * </template>\n * ```\n * \n * @see {@link RecordingModal} for main recording interface\n * @see {@link AdvancedPanelComponent} for advanced recording options\n * @see {@link https://mediasfu.com/docs/recording} for recording documentation\n */\n-->\n<template>\n  <div>\n    <!-- Media Options -->\n    <div>\n      <label style=\"margin-right: 10px; font-weight: bold\">Media Options:</label>\n      <select\n        v-model=\"selectedRecordingMediaOptions\"\n        @change=\"handleMediaOptionsChange\"\n      >\n        <option value=\"video\">\n          Record Video\n        </option>\n        <option value=\"audio\">\n          Record Audio Only\n        </option>\n      </select>\n    </div>\n    <hr />\n\n    <!-- Specific Audios -->\n    <template v-if=\"eventType !== 'broadcast'\">\n      <div>\n        <label style=\"margin-right: 10px; font-weight: bold\">Specific Audios:</label>\n        <select\n          v-model=\"selectedRecordingAudioOptions\"\n          @change=\"handleAudioOptionsChange\"\n        >\n          <option value=\"all\">\n            Add All\n          </option>\n          <option value=\"onScreen\">\n            Add All On Screen\n          </option>\n          <option value=\"host\">\n            Add Host Only\n          </option>\n        </select>\n      </div>\n      <hr />\n\n      <!-- Specific Videos -->\n      <div id=\"conditionalConference\">\n        <label style=\"margin-right: 10px; font-weight: bold\">Specific Videos:</label>\n        <select\n          v-model=\"selectedRecordingVideoOptions\"\n          @change=\"handleVideoOptionsChange\"\n        >\n          <option value=\"all\">\n            Add All\n          </option>\n          <option value=\"mainScreen\">\n            Big Screen Only (includes screenshare)\n          </option>\n        </select>\n      </div>\n      <hr />\n    </template>\n\n    <!-- Add HLS -->\n    <div id=\"addHLSPart\">\n      <label style=\"margin-right: 10px; font-weight: bold\">Add HLS:</label>\n      <select\n        v-model=\"selectedRecordingAddHLSString\"\n        @change=\"handleAddHLSChange\"\n      >\n        <option value=\"true\">\n          True\n        </option>\n        <option value=\"false\">\n          False\n        </option>\n      </select>\n    </div>\n    <hr />\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, defineOptions } from 'vue'\nimport type { EventType } from 'mediasfu-shared'\n\ndefineOptions({\n  name: 'StandardPanelComponent'\n});\n\n/**\n * Parameters object for the StandardPanelComponent\n * @interface StandardPanelParameters\n * \n * @property {string} recordingMediaOptions - Current media recording option ('video' | 'audio')\n * @property {string} recordingAudioOptions - Current audio source option ('all' | 'onScreen' | 'host')\n * @property {string} recordingVideoOptions - Current video source option ('all' | 'mainScreen')\n * @property {boolean} recordingAddHLS - Whether to add HLS output format\n * @property {(value: string) => void} updateRecordingMediaOptions - Function to update media options\n * @property {(value: string) => void} updateRecordingAudioOptions - Function to update audio options\n * @property {(value: string) => void} updateRecordingVideoOptions - Function to update video options\n * @property {(value: boolean) => void} updateRecordingAddHLS - Function to update HLS option\n * @property {EventType} eventType - Event type ('conference' | 'webinar' | 'broadcast' | 'chat')\n * \n * @example\n * ```ts\n * const standardPanelParams = {\n *   // recordingMediaOptions: 'video',\n *   // recordingAudioOptions: 'onScreen',\n *   // recordingVideoOptions: 'mainScreen',\n *   // recordingAddHLS: false,\n *   // updateRecordingMediaOptions: (value) => {\n *     recordingMediaOptions.value = value;\n *   },\n *   // updateRecordingAudioOptions: (value) => {\n *     recordingAudioOptions.value = value;\n *   },\n *   // updateRecordingVideoOptions: (value) => {\n *     recordingVideoOptions.value = value;\n *   },\n *   // updateRecordingAddHLS: (value) => {\n *     recordingAddHLS.value = value;\n *   },\n *   // eventType: 'conference'\n * };\n * ```\n */\nexport interface StandardPanelParameters {\n  recordingMediaOptions: string\n  recordingAudioOptions: string\n  recordingVideoOptions: string\n  recordingAddHLS: boolean\n  updateRecordingMediaOptions: (value: string) => void\n  updateRecordingAudioOptions: (value: string) => void\n  updateRecordingVideoOptions: (value: string) => void\n  updateRecordingAddHLS: (value: boolean) => void\n  eventType: EventType\n}\n\n/**\n * Props for the StandardPanelComponent\n * @interface StandardPanelProps\n * \n * @property {StandardPanelParameters} parameters - Parameters object with recording settings and update functions\n * \n * @default parameters - No default (required)\n */\nexport interface StandardPanelProps {\n  parameters: StandardPanelParameters\n}\n\nconst props = defineProps<StandardPanelProps>()\n\nconst selectedRecordingMediaOptions = ref(props.parameters.recordingMediaOptions)\nconst selectedRecordingAudioOptions = ref(props.parameters.recordingAudioOptions)\nconst selectedRecordingVideoOptions = ref(props.parameters.recordingVideoOptions)\nconst selectedRecordingAddHLS = ref(props.parameters.recordingAddHLS)\n\nconst selectedRecordingAddHLSString = computed({\n  get: () => selectedRecordingAddHLS.value.toString(),\n  set: (value: string) => {\n    selectedRecordingAddHLS.value = value === 'true'\n  }\n})\n\nconst eventType = computed(() => props.parameters.eventType)\n\nconst handleMediaOptionsChange = () => {\n  props.parameters.updateRecordingMediaOptions(selectedRecordingMediaOptions.value)\n}\n\nconst handleAudioOptionsChange = () => {\n  props.parameters.updateRecordingAudioOptions(selectedRecordingAudioOptions.value)\n}\n\nconst handleVideoOptionsChange = () => {\n  props.parameters.updateRecordingVideoOptions(selectedRecordingVideoOptions.value)\n}\n\nconst handleAddHLSChange = () => {\n  props.parameters.updateRecordingAddHLS(selectedRecordingAddHLS.value)\n}\n</script>\n","<!--\n/**\n * @fileoverview AdvancedPanelComponent - Advanced recording customization panel\n * @component AdvancedPanelComponent\n * @module components/recordingComponents/AdvancedPanelComponent\n * \n * @description\n * An advanced recording configuration panel providing comprehensive customization options for\n * recording appearance and layout. Features include video type selection, display type filtering,\n * background color customization, custom text overlays with position/color controls, name tags,\n * name tag colors, and video orientation settings. Designed for users who need fine-grained\n * control over recording output aesthetics and layout.\n * \n * Key Features:\n * - **Video Type**: fullDisplay (no background), bestDisplay (full video), all\n * - **Display Type**: Filter participants by video/media/all (hidden for broadcast)\n * - **Background Color**: Color picker for recording background\n * - **Add Text**: Toggle custom text overlay on recording\n * - **Custom Text**: Input field for overlay text content\n * - **Text Position**: top, middle, bottom\n * - **Text Color**: Color picker for custom text\n * - **Add Name Tags**: Toggle participant name tags on video\n * - **Name Tag Color**: Color picker for name tag background\n * - **Video Orientation**: landscape, portrait, all\n * - Real-time color preview with hex value display\n * - Conditional UI (text options only show when text enabled)\n * - Event type awareness (display type hidden for broadcast)\n * \n * Configuration Options:\n * - **Video Type**:\n *   - `fullDisplay`: Record full display without background padding\n *   - `bestDisplay`: Record full video with optimal quality\n *   - `all`: Record all available video streams\n * \n * - **Display Type** (hidden for broadcast):\n *   - `video`: Only participants with video enabled\n *   - `videoOpt`: Only video participants (optimized layout)\n *   - `media`: Participants with any media (audio/video)\n *   - `all`: All participants regardless of media state\n * \n * - **Text Position**:\n *   - `top`: Overlay text at top of recording\n *   - `middle`: Overlay text in center\n *   - `bottom`: Overlay text at bottom\n * \n * - **Video Orientation**:\n *   - `landscape`: Horizontal orientation (16:9)\n *   - `portrait`: Vertical orientation (9:16)\n *   - `all`: Any orientation\n * \n * Workflow:\n * 1. User opens advanced settings in RecordingModal\n * 2. Component displays all customization options with current values\n * 3. User selects video type → updateRecordingVideoType called\n * 4. User selects display type → updateRecordingDisplayType called\n * 5. User picks background color → updateRecordingBackgroundColor called\n * 6. User enables text → text input, position, color options appear\n * 7. User enters custom text → updateRecordingCustomText called\n * 8. User selects text position → updateRecordingCustomTextPosition called\n * 9. User picks text color → updateRecordingCustomTextColor called\n * 10. User enables name tags → updateRecordingNameTags called\n * 11. User picks name tag color → updateRecordingNameTagsColor called\n * 12. User selects orientation → updateRecordingOrientationVideo called\n * 13. All settings applied when recording starts\n * \n * @example Basic Usage\n * ```typescript\n * // <AdvancedPanelComponent\n *   // :parameters=\"{\n *     recordingVideoType: 'bestDisplay',\n *     recordingDisplayType: 'video',\n *     recordingBackgroundColor: '#000000',\n *     recordingNameTagsColor: '#ffffff',\n *     recordingOrientationVideo: 'landscape',\n *     recordingNameTags: true,\n *     recordingAddText: false,\n *     recordingCustomText: '',\n *     recordingCustomTextPosition: 'top',\n *     recordingCustomTextColor: '#ffffff',\n *     updateRecordingVideoType: setVideoType,\n *     updateRecordingDisplayType: setDisplayType,\n *     updateRecordingBackgroundColor: setBgColor,\n *     updateRecordingNameTagsColor: setNameTagColor,\n *     updateRecordingOrientationVideo: setOrientation,\n *     updateRecordingNameTags: setNameTags,\n *     updateRecordingAddText: setAddText,\n *     updateRecordingCustomText: setCustomText,\n *     updateRecordingCustomTextPosition: setTextPosition,\n *     updateRecordingCustomTextColor: setTextColor,\n *     eventType: 'webinar'\n *   }\"\n * // />\n * ```\n * \n * @example With Custom Text Overlay\n * ```typescript\n * // <AdvancedPanelComponent\n *   // :parameters=\"{\n *     recordingVideoType: 'fullDisplay',\n *     recordingDisplayType: 'videoOpt',\n *     recordingBackgroundColor: '#1a1a1a',\n *     recordingNameTagsColor: '#0088ff',\n *     recordingOrientationVideo: 'landscape',\n *     recordingNameTags: true,\n *     recordingAddText: true,\n *     recordingCustomText: 'Company Webinar - Q1 2025',\n *     recordingCustomTextPosition: 'bottom',\n *     recordingCustomTextColor: '#ffcc00',\n *     updateRecordingVideoType: setVideoType,\n *     updateRecordingDisplayType: setDisplayType,\n *     updateRecordingBackgroundColor: setBgColor,\n *     updateRecordingNameTagsColor: setNameTagColor,\n *     updateRecordingOrientationVideo: setOrientation,\n *     updateRecordingNameTags: setNameTags,\n *     updateRecordingAddText: setAddText,\n *     updateRecordingCustomText: setCustomText,\n *     updateRecordingCustomTextPosition: setTextPosition,\n *     updateRecordingCustomTextColor: setTextColor,\n *     eventType: 'webinar'\n *   }\"\n * // />\n * ```\n * \n * @example Broadcast Mode (Display Type Hidden)\n * ```typescript\n * // <AdvancedPanelComponent\n *   // :parameters=\"{\n *     recordingVideoType: 'all',\n *     recordingDisplayType: 'all',\n *     recordingBackgroundColor: '#000000',\n *     recordingNameTagsColor: '#ffffff',\n *     recordingOrientationVideo: 'landscape',\n *     recordingNameTags: false,\n *     recordingAddText: false,\n *     recordingCustomText: '',\n *     recordingCustomTextPosition: 'top',\n *     recordingCustomTextColor: '#ffffff',\n *     updateRecordingVideoType: setVideoType,\n *     updateRecordingDisplayType: setDisplayType,\n *     updateRecordingBackgroundColor: setBgColor,\n *     updateRecordingNameTagsColor: setNameTagColor,\n *     updateRecordingOrientationVideo: setOrientation,\n *     updateRecordingNameTags: setNameTags,\n *     updateRecordingAddText: setAddText,\n *     updateRecordingCustomText: setCustomText,\n *     updateRecordingCustomTextPosition: setTextPosition,\n *     updateRecordingCustomTextColor: setTextColor,\n *     eventType: 'broadcast'\n *   }\"\n * // />\n * ```\n * \n * @see {@link RecordingModal} for main recording interface\n * @see {@link StandardPanelComponent} for basic recording options\n * @see {@link https://mediasfu.com/docs/recording-advanced} for advanced recording documentation\n */\n-->\n<template>\n  <div>\n    <!-- Video Type -->\n    <div>\n      <label style=\"margin-right: 10px; font-weight: bold\">Video Type:</label>\n      <select\n        v-model=\"selectedRecordingVideoType\"\n        @change=\"handleVideoTypeChange\"\n      >\n        <option value=\"fullDisplay\">\n          Full Display (no background)\n        </option>\n        <option value=\"bestDisplay\">\n          Full Video\n        </option>\n        <option value=\"all\">\n          All\n        </option>\n      </select>\n    </div>\n    <hr />\n\n    <!-- Display Type -->\n    <div v-if=\"eventType !== 'broadcast'\">\n      <label style=\"margin-right: 10px; font-weight: bold\">Display Type:</label>\n      <select\n        v-model=\"selectedRecordingDisplayType\"\n        @change=\"handleDisplayTypeChange\"\n      >\n        <option value=\"video\">\n          Only Video Participants\n        </option>\n        <option value=\"videoOpt\">\n          Only Video Participants (optimized)\n        </option>\n        <option value=\"media\">\n          Participants with media\n        </option>\n        <option value=\"all\">\n          All Participants\n        </option>\n      </select>\n    </div>\n    <hr />\n\n    <!-- Background Color -->\n    <div>\n      <label style=\"margin-right: 10px; font-weight: bold\">Background Color:</label>\n      <div\n        :style=\"{\n          backgroundColor: recordingBackgroundColor,\n          padding: '5px',\n          marginBottom: '10px'\n        }\"\n      >\n        {{ recordingBackgroundColor }}\n      </div>\n      <input\n        type=\"color\"\n        :value=\"recordingBackgroundColor\"\n        @input=\"handleColorChange('backgroundColor', ($event.target as HTMLInputElement).value)\"\n      />\n      <span style=\"margin-left: 10px; font-weight: bold\">Click to select color</span>\n    </div>\n    <hr />\n\n    <!-- Add Text -->\n    <div>\n      <label style=\"margin-right: 10px; font-weight: bold\">Add Text:</label>\n      <select\n        v-model=\"recordingTextString\"\n        @change=\"handleTextChange\"\n      >\n        <option value=\"true\">\n          True\n        </option>\n        <option value=\"false\">\n          False\n        </option>\n      </select>\n    </div>\n    <hr />\n\n    <!-- Custom Text -->\n    <template v-if=\"recordingText\">\n      <div>\n        <label style=\"margin-right: 10px; font-weight: bold\">Custom Text:</label>\n        <input\n          v-model=\"customText\"\n          type=\"text\"\n          @input=\"onChangeTextHandler\"\n        />\n        <hr />\n      </div>\n    </template>\n\n    <!-- Custom Text Position -->\n    <template v-if=\"recordingText\">\n      <div>\n        <label style=\"margin-right: 10px; font-weight: bold\">Custom Text Position:</label>\n        <select\n          v-model=\"recordingPosition\"\n          @change=\"handleTextPositionChange\"\n        >\n          <option value=\"top\">\n            Top\n          </option>\n          <option value=\"middle\">\n            Middle\n          </option>\n          <option value=\"bottom\">\n            Bottom\n          </option>\n        </select>\n        <hr />\n      </div>\n    </template>\n\n    <!-- Custom Text Color -->\n    <template v-if=\"recordingText\">\n      <div>\n        <label style=\"margin-right: 10px; font-weight: bold\">Custom Text Color:</label>\n        <div\n          :style=\"{\n            backgroundColor: recordingCustomTextColor,\n            padding: '5px',\n            marginBottom: '10px'\n          }\"\n        >\n          {{ recordingCustomTextColor }}\n        </div>\n        <input\n          type=\"color\"\n          :value=\"recordingCustomTextColor\"\n          @input=\"handleColorChange('customTextColor', ($event.target as HTMLInputElement).value)\"\n        />\n        <span style=\"margin-left: 10px; font-weight: bold\">Click to select color</span>\n        <hr />\n      </div>\n    </template>\n\n    <!-- Add Name Tags -->\n    <div>\n      <label style=\"margin-right: 10px; font-weight: bold\">Add Name Tags:</label>\n      <select\n        v-model=\"selectedRecordingNameTagsString\"\n        @change=\"handleNameTagsChange\"\n      >\n        <option value=\"true\">\n          True\n        </option>\n        <option value=\"false\">\n          False\n        </option>\n      </select>\n    </div>\n    <hr />\n\n    <!-- Name Tags Color -->\n    <div>\n      <label style=\"margin-right: 10px; font-weight: bold\">Name Tags Color:</label>\n      <div\n        :style=\"{\n          backgroundColor: recordingNameTagsColor,\n          padding: '5px',\n          marginBottom: '10px'\n        }\"\n      >\n        {{ recordingNameTagsColor }}\n      </div>\n      <input\n        type=\"color\"\n        :value=\"recordingNameTagsColor\"\n        @input=\"handleColorChange('nameTagsColor', ($event.target as HTMLInputElement).value)\"\n      />\n      <span style=\"margin-left: 10px; font-weight: bold\">Click to select color</span>\n    </div>\n    <hr />\n\n    <!-- Orientation (Video) -->\n    <div>\n      <label style=\"margin-right: 10px; font-weight: bold\">Orientation (Video):</label>\n      <select\n        v-model=\"selectedOrientationVideo\"\n        @change=\"handleOrientationChange\"\n      >\n        <option value=\"landscape\">\n          Landscape\n        </option>\n        <option value=\"portrait\">\n          Portrait\n        </option>\n        <option value=\"all\">\n          All\n        </option>\n      </select>\n    </div>\n    <hr />\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, defineOptions } from 'vue'\nimport type { EventType } from 'mediasfu-shared'\n\ndefineOptions({\n  name: 'AdvancedPanelComponent'\n});\n\n/**\n * Parameters object for the AdvancedPanelComponent\n * @interface AdvancedPanelParameters\n * \n * @property {string} recordingVideoType - Video recording type ('fullDisplay' | 'bestDisplay' | 'all')\n * @property {'video' | 'media' | 'all'} recordingDisplayType - Display filtering type\n * @property {string} recordingBackgroundColor - Background color hex value (e.g., '#000000')\n * @property {string} recordingNameTagsColor - Name tag background color hex value\n * @property {string} recordingOrientationVideo - Video orientation ('landscape' | 'portrait' | 'all')\n * @property {boolean} recordingNameTags - Whether to show participant name tags\n * @property {boolean} recordingAddText - Whether to add custom text overlay\n * @property {string} recordingCustomText - Custom text overlay content\n * @property {string} recordingCustomTextPosition - Text overlay position ('top' | 'middle' | 'bottom')\n * @property {string} recordingCustomTextColor - Text overlay color hex value\n * @property {(value: string) => void} updateRecordingVideoType - Function to update video type\n * @property {(value: 'video' | 'media' | 'all') => void} updateRecordingDisplayType - Function to update display type\n * @property {(value: string) => void} updateRecordingBackgroundColor - Function to update background color\n * @property {(value: string) => void} updateRecordingNameTagsColor - Function to update name tag color\n * @property {(value: string) => void} updateRecordingOrientationVideo - Function to update orientation\n * @property {(value: boolean) => void} updateRecordingNameTags - Function to toggle name tags\n * @property {(value: boolean) => void} updateRecordingAddText - Function to toggle text overlay\n * @property {(value: string) => void} updateRecordingCustomText - Function to update custom text\n * @property {(value: string) => void} updateRecordingCustomTextPosition - Function to update text position\n * @property {(value: string) => void} updateRecordingCustomTextColor - Function to update text color\n * @property {EventType} eventType - Event type ('conference' | 'webinar' | 'broadcast' | 'chat')\n * \n * @example\n * ```ts\n * const advancedPanelParams = {\n *   // recordingVideoType: 'bestDisplay',\n *   // recordingDisplayType: 'video',\n *   // recordingBackgroundColor: '#1a1a1a',\n *   // recordingNameTagsColor: '#0088ff',\n *   // recordingOrientationVideo: 'landscape',\n *   // recordingNameTags: true,\n *   // recordingAddText: true,\n *   // recordingCustomText: 'Company Training Session',\n *   // recordingCustomTextPosition: 'bottom',\n *   // recordingCustomTextColor: '#ffcc00',\n *   // updateRecordingVideoType: (value) => { videoType.value = value; },\n *   // updateRecordingDisplayType: (value) => { displayType.value = value; },\n *   // updateRecordingBackgroundColor: (value) => { bgColor.value = value; },\n *   // updateRecordingNameTagsColor: (value) => { nameTagColor.value = value; },\n *   // updateRecordingOrientationVideo: (value) => { orientation.value = value; },\n *   // updateRecordingNameTags: (value) => { nameTags.value = value; },\n *   // updateRecordingAddText: (value) => { addText.value = value; },\n *   // updateRecordingCustomText: (value) => { customText.value = value; },\n *   // updateRecordingCustomTextPosition: (value) => { textPosition.value = value; },\n *   // updateRecordingCustomTextColor: (value) => { textColor.value = value; },\n *   // eventType: 'webinar'\n * };\n * ```\n */\nexport interface AdvancedPanelParameters {\n  recordingVideoType: string\n  recordingDisplayType: 'video' | 'media' | 'all'\n  recordingBackgroundColor: string\n  recordingNameTagsColor: string\n  recordingOrientationVideo: string\n  recordingNameTags: boolean\n  recordingAddText: boolean\n  recordingCustomText: string\n  recordingCustomTextPosition: string\n  recordingCustomTextColor: string\n  updateRecordingVideoType: (value: string) => void\n  updateRecordingDisplayType: (value: 'video' | 'media' | 'all') => void\n  updateRecordingBackgroundColor: (value: string) => void\n  updateRecordingNameTagsColor: (value: string) => void\n  updateRecordingOrientationVideo: (value: string) => void\n  updateRecordingNameTags: (value: boolean) => void\n  updateRecordingAddText: (value: boolean) => void\n  updateRecordingCustomText: (value: string) => void\n  updateRecordingCustomTextPosition: (value: string) => void\n  updateRecordingCustomTextColor: (value: string) => void\n  eventType: EventType\n}\n\n/**\n * Props for the AdvancedPanelComponent\n * @interface AdvancedPanelProps\n * \n * @property {AdvancedPanelParameters} parameters - Parameters object with advanced recording settings and update functions\n * \n * @default parameters - No default (required)\n */\nexport interface AdvancedPanelProps {\n  parameters: AdvancedPanelParameters\n}\n\nconst props = defineProps<AdvancedPanelProps>()\n\nconst selectedOrientationVideo = ref(props.parameters.recordingOrientationVideo)\nconst selectedRecordingNameTags = ref(props.parameters.recordingNameTags)\nconst selectedRecordingVideoType = ref(props.parameters.recordingVideoType)\nconst selectedRecordingDisplayType = ref(props.parameters.recordingDisplayType)\nconst recordingText = ref(props.parameters.recordingAddText)\nconst customText = ref(props.parameters.recordingCustomText)\nconst recordingPosition = ref(props.parameters.recordingCustomTextPosition)\n\nconst recordingTextString = computed({\n  get: () => recordingText.value.toString(),\n  set: (value: string) => {\n    recordingText.value = value === 'true'\n  }\n})\n\nconst selectedRecordingNameTagsString = computed({\n  get: () => selectedRecordingNameTags.value.toString(),\n  set: (value: string) => {\n    selectedRecordingNameTags.value = value === 'true'\n  }\n})\n\nconst eventType = computed(() => props.parameters.eventType)\nconst recordingBackgroundColor = computed(() => props.parameters.recordingBackgroundColor)\nconst recordingNameTagsColor = computed(() => props.parameters.recordingNameTagsColor)\nconst recordingCustomTextColor = computed(() => props.parameters.recordingCustomTextColor)\n\n// Watch for external changes to orientation\nwatch(() => props.parameters.recordingOrientationVideo, (newValue) => {\n  selectedOrientationVideo.value = newValue\n})\n\nconst validateTextInput = (input: string): boolean => {\n  const regex = /^[a-zA-Z0-9\\s]{1,40}$/\n  return regex.test(input)\n}\n\nconst handleTextChange = () => {\n  props.parameters.updateRecordingAddText(recordingText.value)\n}\n\nconst onChangeTextHandler = () => {\n  const text = customText.value\n  if (text.length === 0 || validateTextInput(text)) {\n    props.parameters.updateRecordingCustomText(text)\n  } else {\n    // Revert to previous valid value\n    customText.value = props.parameters.recordingCustomText\n  }\n}\n\nconst handleColorChange = (selectedColor: string, color: string) => {\n  switch (selectedColor) {\n    case 'backgroundColor':\n      props.parameters.updateRecordingBackgroundColor(color)\n      break\n    case 'customTextColor':\n      props.parameters.updateRecordingCustomTextColor(color)\n      break\n    case 'nameTagsColor':\n      props.parameters.updateRecordingNameTagsColor(color)\n      break\n    default:\n      break\n  }\n}\n\nconst handleVideoTypeChange = () => {\n  props.parameters.updateRecordingVideoType(selectedRecordingVideoType.value)\n}\n\nconst handleDisplayTypeChange = () => {\n  props.parameters.updateRecordingDisplayType(selectedRecordingDisplayType.value)\n}\n\nconst handleTextPositionChange = () => {\n  props.parameters.updateRecordingCustomTextPosition(recordingPosition.value)\n}\n\nconst handleNameTagsChange = () => {\n  props.parameters.updateRecordingNameTags(selectedRecordingNameTags.value)\n}\n\nconst handleOrientationChange = () => {\n  props.parameters.updateRecordingOrientationVideo(selectedOrientationVideo.value)\n}\n</script>\n","<!--\n * RecordingModal - Event recording configuration and control modal\n *\n * @fileoverview\n * A comprehensive modal for configuring and controlling event recording. Provides\n * two-panel interface (Standard/Advanced) with extensive recording options including\n * video quality, display type, branding, HLS streaming, and more. Handles both\n * recording initiation and ongoing recording management.\n *\n * @component RecordingModal\n * @module components/recordingComponents/RecordingModal\n *\n * @description\n * This modal provides complete recording configuration with:\n * - Two-panel interface: Standard (basic options) and Advanced (detailed settings)\n * - Video quality settings (SD, HD, FHD)\n * - Display type (video-only, media, all participants)\n * - Recording orientation (landscape, portrait, all)\n * - Background color customization\n * - Name tags toggle and color\n * - Custom text overlay with positioning and color\n * - Media/audio/video participant options\n * - HLS streaming support\n * - Confirm configuration before starting\n * - Start/Stop recording controls\n * - Pause/Resume capability indicator\n * - Event-type-specific options\n *\n * @example\n * // Basic recording modal\n * // <RecordingModal\n *   // :is-recording-modal-visible=\"showRecordingModal\"\n *   // :on-close=\"() => setShowRecordingModal(false)\"\n *   // :start-recording=\"startRecording\"\n *   // :confirm-recording=\"confirmRecording\"\n *   // :parameters=\"{\n *     recordPaused,\n *     recordingVideoType,\n *     recordingDisplayType,\n *     recordingBackgroundColor,\n *     recordingNameTagsColor,\n *     recordingOrientationVideo,\n *     recordingNameTags,\n *     recordingAddText,\n *     recordingCustomText,\n *     recordingCustomTextPosition,\n *     recordingCustomTextColor,\n *     recordingMediaOptions,\n *     recordingAudioOptions,\n *     recordingVideoOptions,\n *     recordingAddHLS,\n *     eventType,\n *     updateRecordingVideoType,\n *     updateRecordingDisplayType,\n *     // ... other update functions\n *     getUpdatedAllParams\n *   }\"\n * // />\n *\n * @example\n * // Custom positioning and styling\n * // <RecordingModal\n *   // :is-recording-modal-visible=\"showRecording\"\n *   // :on-close=\"closeRecording\"\n *   // :start-recording=\"startRecording\"\n *   // :confirm-recording=\"confirmRecording\"\n *   // :parameters=\"recordingParams\"\n *   // position=\"topRight\"\n *   // background-color=\"#1a1a1a\"\n *   // title=\"Recording Configuration\"\n * // />\n *\n * @example\n * // Custom button labels\n * // <RecordingModal\n *   // :is-recording-modal-visible=\"showRecording\"\n *   // :on-close=\"closeRecording\"\n *   // :start-recording=\"startRecording\"\n *   // :confirm-recording=\"confirmRecording\"\n *   // :parameters=\"params\"\n *   // confirm-button-label=\"Save Settings\"\n *   // :start-button-label=\"h('span', ['Begin Recording ', h('i', { class: 'fa fa-circle' })])\"\n * // />\n *\n * @example\n * // Custom render functions for actions\n * // <RecordingModal\n *   // :is-recording-modal-visible=\"showRecording\"\n *   // :on-close=\"closeRecording\"\n *   // :start-recording=\"startRecording\"\n *   // :confirm-recording=\"confirmRecording\"\n *   // :parameters=\"params\"\n *   // :render-actions=\"(options) => {\n *     const { recordPaused, handleConfirm, handleStart } = options;\n *     return h('div', { class: 'custom-actions' }, [\n *       h('button', { onClick: handleConfirm, class: 'btn-primary' }, 'Apply'),\n *       h('button', { \n *         onClick: handleStart, \n *         class: recordPaused ? 'btn-resume' : 'btn-start',\n *         disabled: !canStartRecording\n *       }, recordPaused ? 'Resume' : 'Start')\n *     ]);\n *   }\"\n * // />\n *\n * @example\n * // Custom panels renderer\n * // <RecordingModal\n *   // :is-recording-modal-visible=\"showRecording\"\n *   // :on-close=\"closeRecording\"\n *   // :start-recording=\"startRecording\"\n *   // :confirm-recording=\"confirmRecording\"\n *   // :parameters=\"params\"\n *   // :render-panels=\"(options) => {\n *     const { parameters } = options;\n *     return h('div', { class: 'custom-panels' }, [\n *       h(CustomStandardPanel, { parameters }),\n *       h(CustomAdvancedPanel, { parameters })\n *     ]);\n *   }\"\n * // />\n-->\n<template>\n  <RenderVNode :node=\"overlayNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, h, isVNode, defineComponent, type CSSProperties, type PropType, type VNodeChild, type HTMLAttributes, type ButtonHTMLAttributes } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faTimes } from '@fortawesome/free-solid-svg-icons';\nimport StandardPanelComponent from './StandardPanelComponent.vue'\nimport AdvancedPanelComponent from './AdvancedPanelComponent.vue'\nimport type { EventType } from '../../../../SharedTypes'\nimport type {\n  ConfirmRecordingType,\n  ConfirmRecordingParameters\n} from 'mediasfu-shared'\nimport type {\n  StartRecordingType,\n  StartRecordingParameters\n} from 'mediasfu-shared'\n\n/**\n * Parameters required by RecordingModal for recording configuration\n * \n * @interface RecordingModalParameters\n * @extends ConfirmRecordingParameters\n * @extends StartRecordingParameters\n * @property {boolean} recordPaused - Whether recording is currently paused\n * @property {string} recordingVideoType - Video quality ('SD', 'HD', 'FHD')\n * @property {'video' | 'media' | 'all'} recordingDisplayType - Which participants to record\n * @property {string} recordingBackgroundColor - Background color for recording canvas\n * @property {string} recordingNameTagsColor - Color for participant name tags\n * @property {string} recordingOrientationVideo - Video orientation ('landscape', 'portrait', 'all')\n * @property {boolean} recordingNameTags - Whether to show participant name tags\n * @property {boolean} recordingAddText - Whether to add custom text overlay\n * @property {string} recordingCustomText - Custom text content for overlay\n * @property {string} recordingCustomTextPosition - Position of custom text ('top', 'middle', 'bottom')\n * @property {string} recordingCustomTextColor - Color of custom text\n * @property {string} recordingMediaOptions - Media participants recording option\n * @property {string} recordingAudioOptions - Audio-only participants recording option\n * @property {string} recordingVideoOptions - Video participants recording option\n * @property {boolean} recordingAddHLS - Whether to enable HLS streaming\n * @property {EventType} eventType - Type of event being recorded\n * @property {(value: string) => void} updateRecordingVideoType - Function to update video quality\n * @property {(value: 'video' | 'media' | 'all') => void} updateRecordingDisplayType - Function to update display type\n * @property {(value: string) => void} updateRecordingBackgroundColor - Function to update background color\n * @property {(value: string) => void} updateRecordingNameTagsColor - Function to update name tag color\n * @property {(value: string) => void} updateRecordingOrientationVideo - Function to update orientation\n * @property {(value: boolean) => void} updateRecordingNameTags - Function to toggle name tags\n * @property {(value: boolean) => void} updateRecordingAddText - Function to toggle custom text\n * @property {(value: string) => void} updateRecordingCustomText - Function to update custom text content\n * @property {(value: string) => void} updateRecordingCustomTextPosition - Function to update text position\n * @property {(value: string) => void} updateRecordingCustomTextColor - Function to update text color\n * @property {(value: string) => void} updateRecordingMediaOptions - Function to update media options\n * @property {(value: string) => void} updateRecordingAudioOptions - Function to update audio options\n * @property {(value: string) => void} updateRecordingVideoOptions - Function to update video options\n * @property {(value: boolean) => void} updateRecordingAddHLS - Function to toggle HLS streaming\n * @property {() => RecordingModalParameters} getUpdatedAllParams - Function to get fresh parameter state\n * @property {unknown} [key] - Additional dynamic parameters\n */\nexport interface RecordingModalParameters\n  extends ConfirmRecordingParameters,\n    StartRecordingParameters {\n  recordPaused: boolean\n  recordingVideoType: string\n  recordingDisplayType: 'video' | 'media' | 'all'\n  recordingBackgroundColor: string\n  recordingNameTagsColor: string\n  recordingOrientationVideo: string\n  recordingNameTags: boolean\n  recordingAddText: boolean\n  recordingCustomText: string\n  recordingCustomTextPosition: string\n  recordingCustomTextColor: string\n  recordingMediaOptions: string\n  recordingAudioOptions: string\n  recordingVideoOptions: string\n  recordingAddHLS: boolean\n  eventType: EventType\n  updateRecordingVideoType: (value: string) => void\n  updateRecordingDisplayType: (value: 'video' | 'media' | 'all') => void\n  updateRecordingBackgroundColor: (value: string) => void\n  updateRecordingNameTagsColor: (value: string) => void\n  updateRecordingOrientationVideo: (value: string) => void\n  updateRecordingNameTags: (value: boolean) => void\n  updateRecordingAddText: (value: boolean) => void\n  updateRecordingCustomText: (value: string) => void\n  updateRecordingCustomTextPosition: (value: string) => void\n  updateRecordingCustomTextColor: (value: string) => void\n  updateRecordingMediaOptions: (value: string) => void\n  updateRecordingAudioOptions: (value: string) => void\n  updateRecordingVideoOptions: (value: string) => void\n  updateRecordingAddHLS: (value: boolean) => void\n\n  // mediasfu functions\n  getUpdatedAllParams: () => RecordingModalParameters\n  [key: string]: unknown\n}\n\n/**\n * RecordingModal props interface\n * \n * @interface RecordingModalProps\n * @property {boolean} isRecordingModalVisible - Whether modal is visible\n * @property {() => void} onClose - Function to close the modal\n * @property {string} [backgroundColor='#83c0e9'] - Modal background color\n * @default '#83c0e9'\n * @property {string} [position='bottomRight'] - Modal position ('topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft')\n * @default 'bottomRight'\n * @property {ConfirmRecordingType} confirmRecording - Function to confirm recording settings\n * @property {StartRecordingType} startRecording - Function to start/resume recording\n * @property {RecordingModalParameters} parameters - All required parameters for recording configuration\n * @property {VNodeChild} [title='Recording Settings'] - Modal title text or VNode\n * @default 'Recording Settings'\n * @property {HTMLAttributes} [overlayProps] - HTML attributes for overlay backdrop\n * @property {HTMLAttributes} [contentProps] - HTML attributes for modal content container\n * @property {HTMLAttributes} [headerProps] - HTML attributes for header section\n * @property {HTMLAttributes} [titleProps] - HTML attributes for title element\n * @property {ButtonHTMLAttributes} [closeButtonProps] - HTML attributes for close button\n * @property {VNodeChild} [closeIconComponent] - Custom close icon component\n * @property {HTMLAttributes} [headerDividerProps] - HTML attributes for header divider\n * @property {HTMLAttributes} [bodyProps] - HTML attributes for modal body\n * @property {HTMLAttributes} [panelsWrapperProps] - HTML attributes for panels wrapper\n * @property {HTMLAttributes} [panelsScrollProps] - HTML attributes for scrollable panels container\n * @property {HTMLAttributes} [panelsContainerProps] - HTML attributes for panels inner container\n * @property {HTMLAttributes} [panelsActionsDividerProps] - HTML attributes for divider between panels and actions\n * @property {HTMLAttributes} [actionsWrapperProps] - HTML attributes for actions section wrapper\n * @property {ButtonHTMLAttributes} [confirmButtonProps] - HTML attributes for confirm button\n * @property {ButtonHTMLAttributes} [startButtonProps] - HTML attributes for start/resume button\n * @property {VNodeChild} [confirmButtonLabel='Confirm'] - Confirm button label\n * @default 'Confirm'\n * @property {VNodeChild} [startButtonLabel] - Start/Resume button label (includes play icon)\n * @property {(options: HeaderRenderOptions) => VNodeChild} [renderHeader] - Custom header renderer\n * @property {(options: PanelsRenderOptions) => VNodeChild} [renderPanels] - Custom panels renderer\n * @example\n * ```typescript\n * renderPanels: ({ parameters }) => {\n *   // return h('div', {}, [\n *     h(CustomStandardPanel, { parameters }),\n *     h(CustomAdvancedPanel, { parameters })\n *   ]);\n * }\n * ```\n * @property {(options: ActionsRenderOptions) => VNodeChild} [renderActions] - Custom actions renderer\n * @example\n * ```typescript\n * renderActions: ({ recordPaused, handleConfirm, handleStart }) => {\n *   // return h('div', { class: 'actions' }, [\n *     h('button', { onClick: handleConfirm }, 'Save'),\n *     h('button', { onClick: handleStart }, recordPaused ? 'Resume' : 'Start')\n *   ]);\n * }\n * ```\n * @property {(options: BodyRenderOptions) => VNodeChild} [renderBody] - Custom body renderer\n * @property {(options: ContentRenderOptions) => VNodeChild} [renderContent] - Custom content renderer\n */\nexport interface RecordingModalProps {\n  isRecordingModalVisible: boolean\n  onClose: () => void\n  backgroundColor?: string\n  position?: string\n  confirmRecording: ConfirmRecordingType\n  startRecording: StartRecordingType\n  parameters: RecordingModalParameters\n  \n  // UI override props\n  title?: VNodeChild\n  overlayProps?: HTMLAttributes\n  contentProps?: HTMLAttributes\n  headerProps?: HTMLAttributes\n  titleProps?: HTMLAttributes\n  closeButtonProps?: ButtonHTMLAttributes\n  closeIconComponent?: VNodeChild\n  headerDividerProps?: HTMLAttributes\n  bodyProps?: HTMLAttributes\n  panelsWrapperProps?: HTMLAttributes\n  panelsScrollProps?: HTMLAttributes\n  panelsContainerProps?: HTMLAttributes\n  panelsActionsDividerProps?: HTMLAttributes\n  actionsWrapperProps?: HTMLAttributes\n  confirmButtonProps?: ButtonHTMLAttributes\n  startButtonProps?: ButtonHTMLAttributes\n  confirmButtonLabel?: VNodeChild\n  startButtonLabel?: VNodeChild\n  renderHeader?: (options: {\n    defaultHeader: VNodeChild\n    onClose: () => void\n  }) => VNodeChild\n  renderPanels?: (options: {\n    defaultPanels: VNodeChild\n    parameters: RecordingModalParameters\n  }) => VNodeChild\n  renderActions?: (options: {\n    defaultActions: VNodeChild\n    recordPaused: boolean\n    handleConfirm: () => void\n    handleStart: () => void\n  }) => VNodeChild\n  renderBody?: (options: { defaultBody: VNodeChild }) => VNodeChild\n  renderContent?: (options: { defaultContent: VNodeChild }) => VNodeChild\n}\n\nconst props = withDefaults(defineProps<RecordingModalProps>(), {\n  backgroundColor: '#83c0e9',\n  position: 'bottomRight',\n  title: () => 'Recording Settings',\n  confirmButtonLabel: () => 'Confirm',\n  startButtonLabel: () => h('span', [\n    'Start ',\n    h('i', { class: 'fas fa-play' })\n  ]),\n  overlayProps: undefined,\n  contentProps: undefined,\n  headerProps: undefined,\n  titleProps: undefined,\n  closeButtonProps: undefined,\n  closeIconComponent: undefined,\n  headerDividerProps: undefined,\n  bodyProps: undefined,\n  panelsWrapperProps: undefined,\n  panelsScrollProps: undefined,\n  panelsContainerProps: undefined,\n  panelsActionsDividerProps: undefined,\n  actionsWrapperProps: undefined,\n  confirmButtonProps: undefined,\n  startButtonProps: undefined,\n  renderHeader: undefined,\n  renderPanels: undefined,\n  renderActions: undefined,\n  renderBody: undefined,\n  renderContent: undefined\n})\n\n// Inline RenderVNode component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Function] as PropType<VNodeChild>,\n      default: null\n    }\n  },\n  setup(props) {\n    return () => {\n      const node = props.node\n      if (isVNode(node)) {\n        return node\n      } else if (typeof node === 'function') {\n        return (node as () => VNodeChild)()\n      } else {\n        return node\n      }\n    }\n  }\n})\n\n// Helper function\nconst joinClassNames = (classes: (string | undefined)[]): string | undefined => {\n  const filtered = classes.filter(Boolean)\n  return filtered.length > 0 ? filtered.join(' ').trim() : undefined\n}\n\n// Computed properties\nconst recordPaused = computed(() => props.parameters.recordPaused)\n\nconst defaultOverlayWidth = typeof window !== 'undefined' ? Math.min(window.innerWidth * 0.8, 350) : 320\n\n// Overlay styles\nconst overlayStyle = computed((): CSSProperties => ({\n  position: 'fixed' as const,\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  display: props.isRecordingModalVisible ? 'block' : 'none',\n  zIndex: 999,\n  ...(props.overlayProps?.style as CSSProperties || {})\n}))\n\nconst overlayClassName = computed(() => \n  joinClassNames(['mediasfu-recording-modal', props.overlayProps?.class as string])\n)\n\n// Content styles\nconst contentStyle = computed((): CSSProperties => ({\n  position: 'fixed' as const,\n  backgroundColor: props.backgroundColor,\n  borderRadius: '10px',\n  padding: '16px',\n  width: `${defaultOverlayWidth}px`,\n  maxHeight: '85%',\n  overflow: 'hidden' as const,\n  top: props.position.includes('top') ? '10px' : 'auto',\n  bottom: props.position.includes('bottom') ? '10px' : 'auto',\n  left: props.position.includes('Left') ? '10px' : 'auto',\n  right: props.position.includes('Right') ? '10px' : 'auto',\n  display: 'flex',\n  flexDirection: 'column' as const,\n  gap: '12px',\n  boxShadow: '0 10px 30px rgba(0, 0, 0, 0.25)',\n  ...(props.contentProps?.style as CSSProperties || {})\n}))\n\nconst contentClassName = computed(() => \n  joinClassNames(['mediasfu-recording-modal__content', props.contentProps?.class as string])\n)\n\n// Header styles\nconst headerStyle = computed((): CSSProperties => ({\n  display: 'flex',\n  justifyContent: 'space-between',\n  alignItems: 'center',\n  gap: '12px',\n  ...(props.headerProps?.style as CSSProperties || {})\n}))\n\nconst headerClassName = computed(() => \n  joinClassNames(['modal-header', props.headerProps?.class as string])\n)\n\n// Title styles\nconst titleStyle = computed((): CSSProperties => ({\n  margin: 0,\n  fontSize: '1.25rem',\n  fontWeight: 700,\n  color: 'black',\n  ...(props.titleProps?.style as CSSProperties || {})\n}))\n\nconst titleClassName = computed(() => \n  joinClassNames(['modal-title', props.titleProps?.class as string])\n)\n\n// Close button styles\nconst closeButtonStyle = computed((): CSSProperties => ({\n  background: 'none',\n  border: 'none',\n  padding: '4px',\n  cursor: 'pointer',\n  display: 'inline-flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  color: 'black',\n  ...(props.closeButtonProps?.style as CSSProperties || {})\n}))\n\nconst closeButtonClassName = computed(() => \n  joinClassNames(['btn-close-recording', props.closeButtonProps?.class as string])\n)\n\n// Header divider styles\nconst headerDividerStyle = computed((): CSSProperties => ({\n  height: '1px',\n  backgroundColor: 'black',\n  marginTop: '5px',\n  marginBottom: '5px',\n  border: 'none',\n  ...(props.headerDividerProps?.style as CSSProperties || {})\n}))\n\n// Body styles\nconst bodyStyle = computed((): CSSProperties => ({\n  display: 'flex',\n  flexDirection: 'column' as const,\n  gap: '16px',\n  flex: 1,\n  minHeight: 0,\n  ...(props.bodyProps?.style as CSSProperties || {})\n}))\n\nconst bodyClassName = computed(() => \n  joinClassNames(['modal-body', props.bodyProps?.class as string])\n)\n\n// Panels wrapper styles\nconst panelsWrapperStyle = computed((): CSSProperties => ({\n  flex: 1,\n  display: 'flex',\n  flexDirection: 'column' as const,\n  minHeight: 0,\n  ...(props.panelsWrapperProps?.style as CSSProperties || {})\n}))\n\nconst panelsWrapperClassName = computed(() => \n  joinClassNames(['recording-modal__panels-wrapper', props.panelsWrapperProps?.class as string])\n)\n\n// Panels scroll styles\nconst panelsScrollStyle = computed((): CSSProperties => ({\n  overflowY: 'auto' as const,\n  maxHeight: 'calc(100% - 120px)',\n  padding: 0,\n  ...(props.panelsScrollProps?.style as CSSProperties || {})\n}))\n\nconst panelsScrollClassName = computed(() => \n  joinClassNames(['recording-modal__panels-scroll', props.panelsScrollProps?.class as string])\n)\n\n// Panels container styles\nconst panelsContainerStyle = computed((): CSSProperties => ({\n  margin: 0,\n  padding: 0,\n  display: 'flex',\n  flexDirection: 'column' as const,\n  gap: '12px',\n  ...(props.panelsContainerProps?.style as CSSProperties || {})\n}))\n\nconst panelsContainerClassName = computed(() => \n  joinClassNames(['recording-modal__panels', props.panelsContainerProps?.class as string])\n)\n\n// Panels/Actions divider styles\nconst panelsActionsDividerStyle = computed((): CSSProperties => ({\n  height: '1px',\n  backgroundColor: 'white',\n  marginTop: 0,\n  marginBottom: 0,\n  ...(props.panelsActionsDividerProps?.style as CSSProperties || {})\n}))\n\nconst panelsActionsDividerClassName = computed(() => \n  joinClassNames(['recording-modal__divider', props.panelsActionsDividerProps?.class as string])\n)\n\n// Actions wrapper styles\nconst actionsWrapperStyle = computed((): CSSProperties => ({\n  display: 'flex',\n  justifyContent: 'space-between',\n  marginTop: '20px',\n  gap: '16px',\n  flexWrap: 'wrap' as const,\n  ...(props.actionsWrapperProps?.style as CSSProperties || {})\n}))\n\nconst actionsWrapperClassName = computed(() => \n  joinClassNames(['recording-modal__actions', props.actionsWrapperProps?.class as string])\n)\n\n// Confirm button styles\nconst confirmButtonStyle = computed((): CSSProperties => ({\n  flex: 1,\n  padding: '8px',\n  borderRadius: '5px',\n  display: 'inline-flex',\n  justifyContent: 'center',\n  alignItems: 'center',\n  margin: '0 10px',\n  background: '#4CAF50',\n  cursor: 'pointer',\n  border: 'none',\n  color: 'black',\n  fontSize: '14px',\n  ...(props.confirmButtonProps?.style as CSSProperties || {})\n}))\n\nconst confirmButtonClassName = computed(() => \n  joinClassNames(['recording-modal__confirm', props.confirmButtonProps?.class as string])\n)\n\n// Start button styles\nconst startButtonStyle = computed((): CSSProperties => ({\n  flex: 1,\n  padding: '8px',\n  borderRadius: '5px',\n  display: 'inline-flex',\n  justifyContent: 'center',\n  alignItems: 'center',\n  margin: '0 10px',\n  background: '#f44336',\n  cursor: 'pointer',\n  border: 'none',\n  color: 'black',\n  fontSize: '14px',\n  ...(props.startButtonProps?.style as CSSProperties || {})\n}))\n\nconst startButtonClassName = computed(() => \n  joinClassNames(['recording-modal__start', props.startButtonProps?.class as string])\n)\n\n// Event handlers\nconst handleConfirm = () => {\n  props.confirmRecording({ parameters: { ...props.parameters } })\n}\n\nconst handleStart = () => {\n  props.startRecording({ parameters: { ...props.parameters } })\n}\n\nconst handleCloseClick = (event: MouseEvent) => {\n  if (props.closeButtonProps?.onClick) {\n    (props.closeButtonProps.onClick as (event: MouseEvent) => void)(event)\n  }\n  if (!event.defaultPrevented) {\n    props.onClose()\n  }\n}\n\nconst handleConfirmClick = (event: MouseEvent) => {\n  if (props.confirmButtonProps?.onClick) {\n    (props.confirmButtonProps.onClick as (event: MouseEvent) => void)(event)\n  }\n  if (!event.defaultPrevented) {\n    handleConfirm()\n  }\n}\n\nconst handleStartClick = (event: MouseEvent) => {\n  if (props.startButtonProps?.onClick) {\n    (props.startButtonProps.onClick as (event: MouseEvent) => void)(event)\n  }\n  if (!event.defaultPrevented) {\n    handleStart()\n  }\n}\n\n// Main overlay node\nconst overlayNode = computed(() => {\n  const defaultCloseIcon = props.closeIconComponent ?? h(FontAwesomeIcon, { icon: faTimes, class: 'icon' })\n  \n  const defaultHeaderNode = h('div', {\n    class: headerClassName.value,\n    style: headerStyle.value,\n    ...(props.headerProps ? Object.fromEntries(\n      Object.entries(props.headerProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    h('h2', {\n      class: titleClassName.value,\n      style: titleStyle.value,\n      ...(props.titleProps ? Object.fromEntries(\n        Object.entries(props.titleProps).filter(([key]) => !['class', 'style'].includes(key))\n      ) : {})\n    }, typeof props.title === 'string' || typeof props.title === 'number' ? [props.title] : (props.title || [])),\n    h('button', {\n      class: closeButtonClassName.value,\n      style: closeButtonStyle.value,\n      onClick: handleCloseClick,\n      ...(props.closeButtonProps ? Object.fromEntries(\n        Object.entries(props.closeButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {})\n    }, [defaultCloseIcon])\n  ])\n  \n  const headerNode = props.renderHeader\n    ? props.renderHeader({ defaultHeader: defaultHeaderNode, onClose: props.onClose })\n    : defaultHeaderNode\n  \n  const headerDividerNode = h('hr', {\n    style: headerDividerStyle.value,\n    ...(props.headerDividerProps ? Object.fromEntries(\n      Object.entries(props.headerDividerProps).filter(([key]) => key !== 'style')\n    ) : {})\n  })\n  \n  const defaultPanelsNode = h('div', {\n    class: panelsWrapperClassName.value,\n    style: panelsWrapperStyle.value,\n    ...(props.panelsWrapperProps ? Object.fromEntries(\n      Object.entries(props.panelsWrapperProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    h('div', {\n      class: panelsScrollClassName.value,\n      style: panelsScrollStyle.value,\n      ...(props.panelsScrollProps ? Object.fromEntries(\n        Object.entries(props.panelsScrollProps).filter(([key]) => !['class', 'style'].includes(key))\n      ) : {})\n    }, [\n      h('div', {\n        class: panelsContainerClassName.value,\n        style: panelsContainerStyle.value,\n        ...(props.panelsContainerProps ? Object.fromEntries(\n          Object.entries(props.panelsContainerProps).filter(([key]) => !['class', 'style'].includes(key))\n        ) : {})\n      }, [\n        h(StandardPanelComponent, { parameters: props.parameters }),\n        h(AdvancedPanelComponent, { parameters: props.parameters })\n      ])\n    ])\n  ])\n  \n  const panelsNode = props.renderPanels\n    ? props.renderPanels({ defaultPanels: defaultPanelsNode, parameters: props.parameters })\n    : defaultPanelsNode\n  \n  const panelsActionsDividerNode = h('div', {\n    class: panelsActionsDividerClassName.value,\n    style: panelsActionsDividerStyle.value,\n    ...(props.panelsActionsDividerProps ? Object.fromEntries(\n      Object.entries(props.panelsActionsDividerProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  })\n  \n  const defaultActionsNode = h('div', {\n    class: actionsWrapperClassName.value,\n    style: actionsWrapperStyle.value,\n    ...(props.actionsWrapperProps ? Object.fromEntries(\n      Object.entries(props.actionsWrapperProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    h('button', {\n      class: confirmButtonClassName.value,\n      style: confirmButtonStyle.value,\n      onClick: handleConfirmClick,\n      ...(props.confirmButtonProps ? Object.fromEntries(\n        Object.entries(props.confirmButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {})\n    }, typeof props.confirmButtonLabel === 'string' || typeof props.confirmButtonLabel === 'number' ? [props.confirmButtonLabel] : (props.confirmButtonLabel || [])),\n    !recordPaused.value ? h('button', {\n      class: startButtonClassName.value,\n      style: startButtonStyle.value,\n      onClick: handleStartClick,\n      ...(props.startButtonProps ? Object.fromEntries(\n        Object.entries(props.startButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {})\n    }, typeof props.startButtonLabel === 'string' || typeof props.startButtonLabel === 'number' ? [props.startButtonLabel] : (props.startButtonLabel || [])) : null\n  ].filter(Boolean))\n  \n  const actionsNode = props.renderActions\n    ? props.renderActions({\n        defaultActions: defaultActionsNode,\n        recordPaused: recordPaused.value,\n        handleConfirm,\n        handleStart\n      })\n    : defaultActionsNode\n  \n  const defaultBodyNode = h('div', {\n    class: bodyClassName.value,\n    style: bodyStyle.value,\n    ...(props.bodyProps ? Object.fromEntries(\n      Object.entries(props.bodyProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    panelsNode,\n    panelsActionsDividerNode,\n    actionsNode\n  ])\n  \n  const bodyNode = props.renderBody\n    ? props.renderBody({ defaultBody: defaultBodyNode })\n    : defaultBodyNode\n  \n  const defaultContentNode = h('div', {\n    class: contentClassName.value,\n    style: contentStyle.value,\n    ...(props.contentProps ? Object.fromEntries(\n      Object.entries(props.contentProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    headerNode,\n    headerDividerNode,\n    bodyNode\n  ])\n  \n  const contentNode = props.renderContent\n    ? props.renderContent({ defaultContent: defaultContentNode })\n    : defaultContentNode\n  \n  return h('div', {\n    class: overlayClassName.value,\n    style: overlayStyle.value,\n    ...(props.overlayProps ? Object.fromEntries(\n      Object.entries(props.overlayProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [contentNode])\n})\n</script>","<!--\n/**\n * @fileoverview RenderRequestComponent - Individual request item renderer\n * @component RenderRequestComponent\n * @module components/requestsComponents/RenderRequestComponent\n * \n * @description\n * A simple row component that displays a single media permission request with\n * approve and reject buttons. Shows participant name, request type icon (audio/video/\n * screenshare), and action buttons. Used within RequestsModal to render each request\n * item in the list.\n * \n * Features:\n * - Participant name display\n * - Request type icon (microphone, video, desktop, comments)\n * - Approve button (green checkmark)\n * - Reject button (red X)\n * - Flex layout with responsive sizing\n * - Icon mapping via keyMap\n * \n * Request Icon Mapping:\n * - **fa-microphone**: Audio/microphone request\n * - **fa-video**: Video/camera request\n * - **fa-desktop**: Screenshare request\n * - **fa-comments**: Chat/message request\n * \n * @example Basic Usage (Within RequestsModal)\n * // <RenderRequestComponent\n *   // :request=\"{ id: '123', name: 'John Doe', icon: 'fa-microphone' }\"\n *   // :onRequestItemPress=\"respondToRequests\"\n *   // :requestList=\"requestList\"\n *   // :updateRequestList=\"updateRequestList\"\n *   // roomName=\"my-room\"\n *   // :socket=\"socket\"\n * // />\n * \n * @example Audio Request\n * // <RenderRequestComponent\n *   // :request=\"{ id: '1', name: 'Jane Smith', icon: 'fa-microphone' }\"\n *   // :onRequestItemPress=\"handleRequest\"\n *   // :requestList=\"allRequests\"\n *   // :updateRequestList=\"setAllRequests\"\n *   // roomName=\"conference-room\"\n *   // :socket=\"socket\"\n * // />\n * \n * @example Video Request\n * // <RenderRequestComponent\n *   // :request=\"{ id: '2', name: 'Bob Johnson', icon: 'fa-video' }\"\n *   // :onRequestItemPress=\"handleRequest\"\n *   // :requestList=\"allRequests\"\n *   // :updateRequestList=\"setAllRequests\"\n *   // roomName=\"meeting-room\"\n *   // :socket=\"socket\"\n * // />\n * \n * @remarks\n * This component is a pure renderer with no internal state. All logic is handled\n * via the onRequestItemPress callback which receives the request, action ('accepted'\n * or 'rejected'), and necessary context. The component automatically removes itself\n * from the list after action is taken.\n * \n * Workflow:\n * 1. Component receives request data and callbacks\n * 2. Displays participant name and request type icon\n * 3. User clicks approve (green check) or reject (red X)\n * 4. Calls handleRequestAction with 'accepted' or 'rejected'\n * 5. onRequestItemPress handles Socket.io emission and list update\n * 6. Request is removed from list via updateRequestList\n * \n * @see {@link RequestsModal} - Parent container that uses this component\n * @see {@link RespondToRequestsType} - Handler for approve/reject actions\n */\n-->\n<template>\n  <div\n    :key=\"request.id\"\n    :style=\"{\n      display: 'flex',\n      flexDirection: 'row',\n      alignItems: 'center',\n      margin: '10px 0',\n      paddingBottom: '5px',\n    }\"\n  >\n    <div :style=\"{ flex: 5 }\">\n      <span>{{ request.name }}</span>\n    </div>\n    <div :style=\"{ flex: 2, alignItems: 'center' }\">\n      <font-awesome-icon\n        :icon=\"keyMap[request.icon]\"\n        size=\"lg\"\n        color=\"black\"\n      />\n    </div>\n    <div :style=\"{ flex: 2, alignItems: 'center', paddingRight: '10px' }\">\n      <button\n        :style=\"{ background: 'none', border: 'none', cursor: 'pointer' }\"\n        @click=\"handleRequestAction('accepted')\"\n      >\n        <font-awesome-icon\n          :icon=\"faCheck\"\n          size=\"lg\"\n          color=\"green\"\n        />\n      </button>\n    </div>\n    <div :style=\"{ flex: 2, alignItems: 'center' }\">\n      <button\n        :style=\"{ background: 'none', border: 'none', cursor: 'pointer' }\"\n        @click=\"handleRequestAction('rejected')\"\n      >\n        <font-awesome-icon\n          :icon=\"faTimes\"\n          size=\"lg\"\n          color=\"red\"\n        />\n      </button>\n    </div>\n    <div :style=\"{ flex: 1, marginBottom: '2px' }\"></div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { defineOptions } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport {\n  faMicrophone,\n  faDesktop,\n  faVideo,\n  faComments,\n  faCheck,\n  faTimes,\n} from '@fortawesome/free-solid-svg-icons';\n\ndefineOptions({\n  name: 'RenderRequestComponent'\n});\nimport type { MediaSFUSocket } from '../../types/socket';\nimport type { Request } from '../../../../SharedTypes';\nimport type { RespondToRequestsType } from 'mediasfu-shared';\n\n/**\n * Props for the RenderRequestComponent\n * @interface RenderRequestComponentProps\n * \n * @property {Request} request - The request object with id, name, and icon\n * @property {RespondToRequestsType} onRequestItemPress - Handler for approve/reject actions\n * @property {Request[]} requestList - Full list of current requests\n * @property {function} updateRequestList - Callback to update the request list\n * @property {string} roomName - The name of the room/event\n * @property {MediaSFUSocket} socket - Socket.io instance for server communication\n * \n * @example\n * ```typescript\n * // <RenderRequestComponent\n *   // :request=\"{ id: '123', name: 'John', icon: 'fa-microphone' }\"\n *   // :onRequestItemPress=\"respondToRequests\"\n *   // :requestList=\"allRequests\"\n *   // :updateRequestList=\"setRequests\"\n *   // roomName=\"my-room\"\n *   // :socket=\"socket\"\n * // />\n * ```\n */\nexport interface RenderRequestComponentProps {\n  request: Request;\n  onRequestItemPress: RespondToRequestsType;\n  requestList: Request[];\n  updateRequestList: (newRequestList: Request[]) => void;\n  roomName: string;\n  socket: MediaSFUSocket;\n}\n\nconst props = defineProps<RenderRequestComponentProps>();\n\nconst keyMap: { [key: string]: any } = {\n  'fa-microphone': faMicrophone,\n  'fa-desktop': faDesktop,\n  'fa-video': faVideo,\n  'fa-comments': faComments,\n};\n\nconst handleRequestAction = (action: string) => {\n  props.onRequestItemPress({\n    request: props.request,\n    updateRequestList: props.updateRequestList,\n    requestList: props.requestList,\n    action,\n    roomName: props.roomName,\n    socket: props.socket,\n  });\n};\n\n</script>\n","<!--\n/**\n * @fileoverview RequestsModal - Participant media requests management modal\n * @component RequestsModal\n * @module components/requestsComponents/RequestsModal\n * \n * @description\n * A host/co-host modal for managing participant requests to enable audio, video, or\n * screenshare. Displays a list of pending requests with approve/reject actions. Used\n * when event settings require approval for media permissions (approval mode). Includes\n * search/filter functionality, real-time counter badge, and Socket.io integration.\n * \n * Key Features:\n * - Participant media request list (audio/video/screenshare)\n * - Approve/reject actions for each request\n * - Search/filter functionality\n * - Real-time counter badge\n * - Socket.io integration for responses\n * - Host and co-host access (with permissions)\n * - Request type indicators (audio/video/screenshare icons)\n * - Responsive positioning (top/bottom, left/right)\n * - Empty state handling\n * - Custom request component rendering\n * - Render function support for all sections\n * \n * Request Types:\n * - **Audio Request** - Participant wants to unmute microphone\n * - **Video Request** - Participant wants to turn on camera\n * - **Screenshare Request** - Participant wants to share screen\n * \n * Workflow:\n * 1. Event settings set to \"approval required\" for audio/video/screenshare\n * 2. Participant clicks mic/camera/screenshare button\n * 3. Request sent to server, added to host's request list\n * 4. Host/co-host opens requests modal\n * 5. Host sees list of pending requests\n * 6. Host can search/filter requests\n * 7. Host clicks approve or reject\n * 8. Socket emits response to server\n * 9. Participant receives permission or denial\n * 10. Request removed from list\n * \n * @example Basic Usage\n * // <RequestsModal\n *   // :isRequestsModalVisible=\"isRequestsModalVisible\"\n *   // :onRequestClose=\"() => updateIsRequestsModalVisible(false)\"\n *   // :requestCounter=\"requestCounter\"\n *   // :onRequestFilterChange=\"onRequestFilterChange\"\n *   // :requestList=\"filteredRequestList\"\n *   // :updateRequestList=\"updateRequestList\"\n *   // roomName=\"my-room\"\n *   // :socket=\"socket\"\n *   // :parameters=\"{ filteredRequestList, getUpdatedAllParams }\"\n * // />\n * \n * @example With Search and Custom Background\n * // <RequestsModal\n *   // :isRequestsModalVisible=\"showRequests\"\n *   // :onRequestClose=\"closeRequests\"\n *   // :requestCounter=\"requestCount\"\n *   // :onRequestFilterChange=\"filterRequests\"\n *   // :requestList=\"requests\"\n *   // :updateRequestList=\"setRequests\"\n *   // roomName=\"conference-123\"\n *   // :socket=\"socketConnection\"\n *   // :parameters=\"requestParameters\"\n *   // position=\"topLeft\"\n *   // backgroundColor=\"#2c3e50\"\n * // />\n * \n * @example Custom Empty State\n * // <script setup>\n * const customEmptyState = ({ counter }) => {\n *   // return h('div', {\n *     style: {\n *       textAlign: 'center',\n *       padding: '40px 20px',\n *       color: '#666'\n *     }\n *   }, [\n *     h('p', { style: { fontSize: '18px', marginBottom: '10px' } }, 'No pending requests'),\n *     h('p', { style: { fontSize: '14px' } }, 'Requests will appear here when participants need approval')\n *   ]);\n * };\n * </script>\n * \n * // <template>\n *   <RequestsModal\n *     :isRequestsModalVisible=\"modalVisible\"\n *     :onRequestClose=\"closeModal\"\n *     :requestCounter=\"counter\"\n *     :onRequestFilterChange=\"handleFilter\"\n *     :requestList=\"list\"\n *     :updateRequestList=\"updateList\"\n *     roomName=\"room\"\n *     :socket=\"socket\"\n *     :parameters=\"params\"\n *     :emptyState=\"customEmptyState\"\n *   />\n * </template>\n * \n * @example Custom Request Renderer\n * // <script setup>\n * const renderCustomRequest = ({ request, handleRespond }) => {\n *   // const getRequestIcon = (type) => {\n *     if (type === 'fa-microphone') return '🎤';\n *     if (type === 'fa-video') return '📹';\n *     if (type === 'fa-desktop') return '🖥️';\n *     return '📢';\n *   };\n * \n *   // return h('div', {\n *     style: {\n *       display: 'flex',\n *       justifyContent: 'space-between',\n *       alignItems: 'center',\n *       padding: '12px',\n *       backgroundColor: '#f8f9fa',\n *       borderRadius: '8px',\n *       marginBottom: '8px'\n *     }\n *   }, [\n *     h('div', { style: { display: 'flex', alignItems: 'center', gap: '10px' } }, [\n *       h('span', { style: { fontSize: '24px' } }, getRequestIcon(request.icon)),\n *       h('div', [\n *         h('strong', request.name),\n *         h('div', { style: { fontSize: '12px', color: '#666' } }, `Requesting ${request.icon.replace('fa-', '')}`)\n *       ])\n *     ]),\n *     h('div', { style: { display: 'flex', gap: '8px' } }, [\n *       h('button', {\n *         onClick: () => handleRespond('accepted'),\n *         class: 'btn btn-success btn-sm'\n *       }, 'Approve'),\n *       h('button', {\n *         onClick: () => handleRespond('rejected'),\n *         class: 'btn btn-danger btn-sm'\n *       }, 'Reject')\n *     ])\n *   ]);\n * };\n * </script>\n * \n * // <template>\n *   <RequestsModal\n *     :isRequestsModalVisible=\"visible\"\n *     :onRequestClose=\"close\"\n *     :requestCounter=\"count\"\n *     :onRequestFilterChange=\"filter\"\n *     :requestList=\"list\"\n *     :updateRequestList=\"update\"\n *     roomName=\"room\"\n *     :socket=\"socket\"\n *     :parameters=\"params\"\n *     :renderRequest=\"renderCustomRequest\"\n *   />\n * </template>\n * \n * @example Custom Header with Badge\n * // <script setup>\n * const renderCustomHeader = ({ counter, onClose }) => {\n *   // return h('div', {\n *     style: {\n *       display: 'flex',\n *       justifyContent: 'space-between',\n *       alignItems: 'center',\n *       padding: '15px',\n *       background: 'linear-gradient(90deg, #f093fb 0%, #f5576c 100%)',\n *       borderRadius: '10px 10px 0 0'\n *     }\n *   }, [\n *     h('div', { style: { display: 'flex', alignItems: 'center', gap: '10px' } }, [\n *       h('h3', { style: { color: 'white', margin: 0 } }, 'Participant Requests'),\n *       counter > 0 && h('span', {\n *         style: {\n *           backgroundColor: 'white',\n *           color: '#f5576c',\n *           padding: '4px 12px',\n *           borderRadius: '12px',\n *           fontSize: '14px',\n *           fontWeight: 'bold'\n *         }\n *       }, counter)\n *     ]),\n *     h('button', { onClick: onClose, style: { background: 'none', border: 'none', color: 'white', cursor: 'pointer' } }, '✕')\n *   ]);\n * };\n * </script>\n * \n * // <template>\n *   <RequestsModal\n *     :isRequestsModalVisible=\"open\"\n *     :onRequestClose=\"close\"\n *     :requestCounter=\"count\"\n *     :onRequestFilterChange=\"filter\"\n *     :requestList=\"list\"\n *     :updateRequestList=\"update\"\n *     roomName=\"room\"\n *     :socket=\"socket\"\n *     :parameters=\"params\"\n *     :renderHeader=\"renderCustomHeader\"\n *   />\n * </template>\n * \n * @see {@link respondToRequests} for approve/reject logic\n * @see {@link Request} for request data structure\n * @see {@link RenderRequestComponent} for default request renderer\n * @see {@link Socket} for Socket.io integration\n */\n-->\n<template>\n  <RenderVNode :node=\"overlayNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, h, isVNode, defineComponent } from 'vue';\nimport type { PropType, VNodeChild, HTMLAttributes, ButtonHTMLAttributes, InputHTMLAttributes, CSSProperties } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faTimes } from '@fortawesome/free-solid-svg-icons';\nimport RenderRequestComponent from './RenderRequestComponent.vue';\nimport { respondToRequests } from 'mediasfu-shared';\nimport type { Request } from '../../../../SharedTypes';\nimport type { MediaSFUSocket } from '../../types/socket';\nimport type { Component } from 'vue';\n\n// Helper function\nfunction joinClassNames(...classes: Array<string | undefined | null | false>): string | undefined {\n  const result = classes.filter(Boolean).join(' ').trim();\n  return result || undefined;\n}\n\nexport interface RequestsModalParameters {\n  getUpdatedAllParams?: () => { filteredRequestList: Request[] };\n  filteredRequestList?: Request[];\n  [key: string]: unknown;\n}\n\n/**\n * Props for the RequestsModal component\n * @interface RequestsModalProps\n * \n * @property {boolean} isRequestsModalVisible - Controls modal visibility (true = visible, false = hidden)\n * @property {Function} onRequestClose - Callback when modal closes\n * @property {number} requestCounter - Number of pending requests (displayed in badge)\n * @property {Function} onRequestFilterChange - Callback when search filter changes\n *   // @param {string} text - Filter text entered by user\n * @property {Function} [onRequestItemPress=respondToRequests] - Custom function to handle approve/reject actions\n *   // @default respondToRequests from @react-shared/methods/requests\n * @property {Request[]} requestList - Array of pending media requests\n * @property {Function} updateRequestList - Updates request list state\n *   // @param {Request[]} newRequestList - New request list\n * @property {string} roomName - Room/meeting identifier for server updates\n * @property {MediaSFUSocket} socket - Socket.io connection for emitting approve/reject actions\n * @property {Component} [renderRequestComponent=RenderRequestComponent] - Custom component for rendering individual requests\n * @property {string} [backgroundColor='#83c0e9'] - Background color of the modal content\n * @property {string} [position='topRight'] - Modal position on screen\n *   - Options: 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight'\n * @property {RequestsModalParameters} parameters - Request state and update functions\n * \n * @property {VNodeChild} [title='Requests'] - Modal title content\n * @property {HTMLAttributes} [overlayProps] - Props for the overlay wrapper (backdrop)\n * @property {HTMLAttributes} [contentProps] - Props for the modal content container\n * @property {HTMLAttributes} [headerProps] - Props for the header section\n * @property {HTMLAttributes} [titleProps] - Props for the title element\n * @property {HTMLAttributes} [badgeWrapperProps] - Props for the counter badge wrapper\n * @property {HTMLAttributes} [badgeProps] - Props for the counter badge element\n * @property {ButtonHTMLAttributes} [closeButtonProps] - Props for the close button\n * @property {VNodeChild} [closeIconComponent] - Custom close icon (default: faTimes FontAwesome)\n * @property {HTMLAttributes} [bodyProps] - Props for the body section container\n * @property {HTMLAttributes} [searchWrapperProps] - Props for search input wrapper\n * @property {InputHTMLAttributes} [searchInputProps] - Props for search input element\n * @property {HTMLAttributes} [requestsWrapperProps] - Props for requests list container\n * @property {HTMLAttributes} [requestItemWrapperProps] - Props for individual request item wrapper\n * @property {VNodeChild | Function} [emptyState] - Custom empty state content or render function\n *   // @example\n *   ```ts\n *   ({ counter }) => h('p', 'No pending requests')\n *   ```\n * \n * @property {Function} [renderHeader] - Custom render function for entire header section\n *   // @param {Object} options\n *   // @param {VNodeChild} options.defaultHeader - Default header VNode\n *   // @param {number} options.counter - Request counter\n *   // @param {Function} options.onClose - Close handler function\n *   // @returns {VNodeChild} Custom header VNode\n *   // @example\n *   ```ts\n *   ({ counter, onClose }) => {\n *     return h('div', { class: 'custom-header' }, [\n *       h('h2', `Requests (${counter})`),\n *       h('button', { onClick: onClose }, 'Close')\n *     ]);\n *   }\n *   ```\n * \n * @property {Function} [renderSearch] - Custom render function for search input section\n *   // @param {Object} options\n *   // @param {VNodeChild} options.defaultSearch - Default search input VNode\n *   // @param {Function} options.onFilter - Filter handler function\n *   // @returns {VNodeChild} Custom search VNode\n * \n * @property {Function} [renderRequest] - Custom render function for individual request item\n *   // @param {Object} options\n *   // @param {Request} options.request - Request data (contains id, name, icon, username)\n *   // @param {number} options.index - Item index\n *   // @param {VNodeChild} options.defaultRequest - Default request item VNode\n *   // @param {Function} options.handleRespond - Response handler function\n *     @param {'accepted' | 'rejected'} action - Approve or reject action\n *   // @returns {VNodeChild} Custom request item VNode\n *   // @example\n *   ```ts\n *   ({ request, handleRespond }) => {\n *     return h('div', { style: { display: 'flex', justifyContent: 'space-between' } }, [\n *       h('span', `${request.name} - ${request.icon}`),\n *       h('div', [\n *         h('button', { onClick: () => handleRespond('accepted') }, 'Approve'),\n *         h('button', { onClick: () => handleRespond('rejected') }, 'Reject')\n *       ])\n *     ]);\n *   }\n *   ```\n * \n * @property {Function} [renderBody] - Custom render function for entire body section\n *   // @param {Object} options\n *   // @param {VNodeChild} options.defaultBody - Default body VNode\n *   // @param {number} options.counter - Request counter\n *   // @returns {VNodeChild} Custom body VNode\n * \n * @property {Function} [renderContent] - Custom render function for entire modal content\n *   // @param {Object} options\n *   // @param {VNodeChild} options.defaultContent - Default content VNode\n *   // @param {number} options.counter - Request counter\n *   // @returns {VNodeChild} Custom content VNode\n */\nexport interface RequestsModalProps {\n  isRequestsModalVisible: boolean;\n  onRequestClose: () => void;\n  requestCounter: number;\n  onRequestFilterChange: (text: string) => void;\n  onRequestItemPress?: typeof respondToRequests;\n  requestList: Request[];\n  updateRequestList: (newRequestList: Request[]) => void;\n  roomName: string;\n  socket: MediaSFUSocket;\n  renderRequestComponent?: Component;\n  backgroundColor?: string;\n  position?: string;\n  parameters: RequestsModalParameters;\n  title?: VNodeChild;\n  overlayProps?: HTMLAttributes;\n  contentProps?: HTMLAttributes;\n  headerProps?: HTMLAttributes;\n  titleProps?: HTMLAttributes;\n  badgeWrapperProps?: HTMLAttributes;\n  badgeProps?: HTMLAttributes;\n  closeButtonProps?: ButtonHTMLAttributes;\n  closeIconComponent?: VNodeChild;\n  bodyProps?: HTMLAttributes;\n  searchWrapperProps?: HTMLAttributes;\n  searchInputProps?: InputHTMLAttributes;\n  requestsWrapperProps?: HTMLAttributes;\n  requestItemWrapperProps?: HTMLAttributes;\n  emptyState?: VNodeChild | ((context: { counter: number }) => VNodeChild);\n  renderHeader?: (options: {\n    defaultHeader: VNodeChild;\n    counter: number;\n    onClose: () => void;\n  }) => VNodeChild;\n  renderSearch?: (options: {\n    defaultSearch: VNodeChild;\n    onFilter: (value: string) => void;\n  }) => VNodeChild;\n  renderRequest?: (options: {\n    request: Request;\n    index: number;\n    defaultRequest: VNodeChild;\n    handleRespond: (action: 'accepted' | 'rejected') => void;\n  }) => VNodeChild;\n  renderBody?: (options: {\n    defaultBody: VNodeChild;\n    counter: number;\n  }) => VNodeChild;\n  renderContent?: (options: {\n    defaultContent: VNodeChild;\n    counter: number;\n  }) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<RequestsModalProps>(), {\n  onRequestItemPress: () => respondToRequests,\n  renderRequestComponent: () => RenderRequestComponent,\n  backgroundColor: '#83c0e9',\n  position: 'topRight',\n  title: 'Requests',\n  closeIconComponent: undefined,\n  overlayProps: undefined,\n  contentProps: undefined,\n  headerProps: undefined,\n  titleProps: undefined,\n  badgeWrapperProps: undefined,\n  badgeProps: undefined,\n  closeButtonProps: undefined,\n  bodyProps: undefined,\n  searchWrapperProps: undefined,\n  searchInputProps: undefined,\n  requestsWrapperProps: undefined,\n  requestItemWrapperProps: undefined,\n  emptyState: undefined,\n  renderHeader: undefined,\n  renderSearch: undefined,\n  renderRequest: undefined,\n  renderBody: undefined,\n  renderContent: undefined,\n});\n\n// RenderVNode component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Function] as PropType<VNodeChild>,\n      required: true,\n    },\n  },\n  setup(props) {\n    return () => {\n      const node = props.node;\n      if (typeof node === 'function') {\n        return (node as () => VNodeChild)();\n      }\n      if (isVNode(node)) {\n        return node;\n      }\n      return node;\n    };\n  },\n});\n\n// State management\nconst initialList = computed(() => {\n  if (props.parameters?.getUpdatedAllParams) {\n    return props.parameters.getUpdatedAllParams().filteredRequestList;\n  }\n  if (props.parameters?.filteredRequestList) {\n    return props.parameters.filteredRequestList;\n  }\n  return props.requestList;\n});\n\nconst requestListState = ref<Request[]>(initialList.value);\nconst requestCounterState = ref<number>(\n  props.parameters?.filteredRequestList?.length ?? props.requestCounter\n);\nconst rerenderToggle = ref(false);\n\nwatch(\n  () => [props.parameters, props.requestList, rerenderToggle.value],\n  () => {\n    if (props.parameters?.getUpdatedAllParams) {\n      const updatedParams = props.parameters.getUpdatedAllParams();\n      requestListState.value = updatedParams.filteredRequestList;\n      requestCounterState.value = updatedParams.filteredRequestList.length;\n      return;\n    }\n    if (props.parameters?.filteredRequestList) {\n      requestListState.value = props.parameters.filteredRequestList;\n      requestCounterState.value = props.parameters.filteredRequestList.length;\n      return;\n    }\n    requestListState.value = props.requestList;\n    requestCounterState.value = props.requestList.length;\n  }\n);\n\n// Overlay styles\nconst defaultOverlayWidth = typeof window !== 'undefined' ? Math.min(window.innerWidth * 0.8, 350) : 320;\n\nconst overlayStyle = computed<CSSProperties>(() => ({\n  position: 'fixed',\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  display: props.isRequestsModalVisible ? 'block' : 'none',\n  zIndex: 999,\n  ...(props.overlayProps?.style as CSSProperties ?? {}),\n}));\n\nconst contentStyle = computed<CSSProperties>(() => ({\n  position: 'fixed',\n  backgroundColor: props.backgroundColor,\n  borderRadius: '10px',\n  padding: '16px',\n  width: `${defaultOverlayWidth}px`,\n  maxHeight: '65%',\n  overflowY: 'auto',\n  top: props.position.includes('top') ? '10px' : 'auto',\n  bottom: props.position.includes('bottom') ? '10px' : 'auto',\n  left: props.position.includes('Left') ? '10px' : 'auto',\n  right: props.position.includes('Right') ? '10px' : 'auto',\n  display: 'flex',\n  flexDirection: 'column',\n  gap: '12px',\n  boxShadow: '0 10px 30px rgba(0, 0, 0, 0.25)',\n  ...(props.contentProps?.style as CSSProperties ?? {}),\n}));\n\n// Event handlers\nconst handleFilterChange = (event: Event) => {\n  const changeHandler = props.searchInputProps?.onInput;\n  if (changeHandler) {\n    changeHandler(event as unknown as InputEvent);\n  }\n  if (!(event as Event & { defaultPrevented?: boolean }).defaultPrevented) {\n    const target = event.target as HTMLInputElement;\n    props.onRequestFilterChange(target.value);\n    rerenderToggle.value = !rerenderToggle.value;\n  }\n};\n\nconst handleCloseClick = (event: Event) => {\n  const clickHandler = props.closeButtonProps?.onClick;\n  if (clickHandler) {\n    clickHandler(event as unknown as PointerEvent);\n  }\n  if (!(event as Event & { defaultPrevented?: boolean }).defaultPrevented) {\n    props.onRequestClose();\n  }\n};\n\n// Build overlayNode\nconst overlayNode = computed(() => {\n  const { class: overlayClassName, ...restOverlayProps } = props.overlayProps ?? {};\n  const { class: contentClassName, ...restContentProps } = props.contentProps ?? {};\n  const { class: headerClassName, style: headerStyleOverrides, ...restHeaderProps } = props.headerProps ?? {};\n  const { class: titleClassName, style: titleStyleOverrides, ...restTitleProps } = props.titleProps ?? {};\n  const { class: badgeWrapperClassName, style: badgeWrapperStyleOverrides, ...restBadgeWrapperProps } = props.badgeWrapperProps ?? {};\n  const { class: badgeClassName, style: badgeStyleOverrides, ...restBadgeProps } = props.badgeProps ?? {};\n  const { class: closeButtonClassName, style: closeButtonStyleOverrides, onClick: _closeButtonOnClick, ...restCloseButtonProps } = props.closeButtonProps ?? {};\n  const { class: bodyClassName, style: bodyStyleOverrides, ...restBodyProps } = props.bodyProps ?? {};\n  const { class: searchWrapperClassName, style: searchWrapperStyleOverrides, ...restSearchWrapperProps } = props.searchWrapperProps ?? {};\n  const { class: searchInputClassName, style: searchInputStyleOverrides, onInput: _searchInputOnInput, ...restSearchInputProps } = props.searchInputProps ?? {};\n  const { class: requestsWrapperClassName, style: requestsWrapperStyleOverrides, ...restRequestsWrapperProps } = props.requestsWrapperProps ?? {};\n  const { class: requestItemWrapperClassName, style: requestItemWrapperStyleOverrides, ...restRequestItemWrapperProps } = props.requestItemWrapperProps ?? {};\n\n  const headerStyle: CSSProperties = {\n    display: 'flex',\n    justifyContent: 'space-between',\n    alignItems: 'center',\n    gap: '12px',\n    ...(headerStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const titleStyle: CSSProperties = {\n    display: 'flex',\n    alignItems: 'center',\n    gap: '8px',\n    margin: '0',\n    ...(titleStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const badgeWrapperStyle: CSSProperties = {\n    backgroundColor: '#fff',\n    color: '#000',\n    borderRadius: '10px',\n    padding: '5px',\n    display: 'inline-flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n    ...(badgeWrapperStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const badgeStyle: CSSProperties = {\n    ...(badgeStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const closeButtonStyle: CSSProperties = {\n    background: 'none',\n    border: 'none',\n    padding: '4px',\n    cursor: 'pointer',\n    display: 'inline-flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n    color: 'black',\n    ...(closeButtonStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const bodyStyle: CSSProperties = {\n    display: 'flex',\n    flexDirection: 'column',\n    gap: '12px',\n    ...(bodyStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const searchWrapperStyle: CSSProperties = {\n    ...(searchWrapperStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const searchInputStyle: CSSProperties = {\n    width: '90%',\n    padding: '10px',\n    borderRadius: '5px',\n    border: '1px solid #000',\n    fontSize: '16px',\n    marginBottom: '10px',\n    ...(searchInputStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const requestsWrapperStyle: CSSProperties = {\n    display: 'flex',\n    flexDirection: 'column',\n    gap: '8px',\n    maxHeight: 'calc(100% - 150px)',\n    overflowY: 'auto',\n    ...(requestsWrapperStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const defaultCloseIcon = props.closeIconComponent ?? h(FontAwesomeIcon, { icon: faTimes, class: 'icon' });\n\n  const defaultHeader = h(\n    'div',\n    {\n      class: joinClassNames('modal-header', headerClassName),\n      style: headerStyle,\n      ...restHeaderProps,\n    },\n    [\n      h(\n        'div',\n        {\n          class: joinClassNames('modal-title', titleClassName),\n          style: titleStyle,\n          ...restTitleProps,\n        },\n        [\n          props.title,\n          h(\n            'div',\n            {\n              class: joinClassNames('requests-counter', badgeWrapperClassName),\n              style: badgeWrapperStyle,\n              ...restBadgeWrapperProps,\n            },\n            [\n              h(\n                'span',\n                {\n                  class: joinClassNames('badge', badgeClassName),\n                  style: badgeStyle,\n                  ...restBadgeProps,\n                },\n                String(requestCounterState.value)\n              ),\n            ]\n          ),\n        ]\n      ),\n      h(\n        'button',\n        {\n          type: 'button',\n          class: joinClassNames('btn-close-requests', closeButtonClassName),\n          style: closeButtonStyle,\n          onClick: handleCloseClick,\n          ...restCloseButtonProps,\n        },\n        [defaultCloseIcon]\n      ),\n    ]\n  );\n\n  const headerNode = props.renderHeader\n    ? props.renderHeader({\n        defaultHeader,\n        counter: requestCounterState.value,\n        onClose: props.onRequestClose,\n      })\n    : defaultHeader;\n\n  const defaultSearchInput = h('input', {\n    placeholder: 'Search ...',\n    class: searchInputClassName,\n    style: searchInputStyle,\n    onInput: handleFilterChange,\n    ...restSearchInputProps,\n  });\n\n  const searchNode = props.renderSearch\n    ? props.renderSearch({\n        defaultSearch: defaultSearchInput,\n        onFilter: (value: string) => {\n          props.onRequestFilterChange(value);\n          rerenderToggle.value = !rerenderToggle.value;\n        },\n      })\n    : defaultSearchInput;\n\n  const renderRequestRow = (request: Request, index: number) => {\n    const handleRespond = (action: 'accepted' | 'rejected') => {\n      props.onRequestItemPress({\n        request,\n        updateRequestList: props.updateRequestList,\n        requestList: requestListState.value,\n        roomName: props.roomName,\n        socket: props.socket,\n        action,\n      });\n    };\n\n    const RequestComponent = props.renderRequestComponent;\n    const defaultRequest = h(\n      'div',\n      {\n        class: joinClassNames('request-item-wrapper', requestItemWrapperClassName as string | undefined),\n        style: { marginTop: '5px', ...(requestItemWrapperStyleOverrides as CSSProperties ?? {}) },\n        ...restRequestItemWrapperProps,\n      },\n      [\n        h(RequestComponent, {\n          request,\n          onRequestItemPress: props.onRequestItemPress,\n          requestList: requestListState.value,\n          updateRequestList: props.updateRequestList,\n          roomName: props.roomName,\n          socket: props.socket,\n        }),\n      ]\n    );\n\n    if (props.renderRequest) {\n      return props.renderRequest({\n        request,\n        index,\n        defaultRequest,\n        handleRespond,\n      });\n    }\n\n    return defaultRequest;\n  };\n\n  const requestsListContent =\n    requestListState.value.length > 0\n      ? requestListState.value.map((requestItem, index) => renderRequestRow(requestItem, index))\n      : props.emptyState\n      ? typeof props.emptyState === 'function'\n        ? (props.emptyState as (context: { counter: number }) => VNodeChild)({ counter: requestCounterState.value })\n        : props.emptyState\n      : null;\n\n  const defaultBody = h(\n    'div',\n    {\n      class: joinClassNames('modal-body', bodyClassName),\n      style: bodyStyle,\n      ...restBodyProps,\n    },\n    [\n      h(\n        'div',\n        {\n          class: joinClassNames('form-group', searchWrapperClassName),\n          style: searchWrapperStyle,\n          ...restSearchWrapperProps,\n        },\n        [searchNode]\n      ),\n      h(\n        'div',\n        {\n          class: joinClassNames('requests-list', requestsWrapperClassName),\n          style: requestsWrapperStyle,\n          ...restRequestsWrapperProps,\n        },\n        requestsListContent ? [requestsListContent] : []\n      ),\n    ]\n  );\n\n  const bodyNode = props.renderBody\n    ? props.renderBody({\n        defaultBody,\n        counter: requestCounterState.value,\n      })\n    : defaultBody;\n\n  const defaultContent = h(\n    'div',\n    {\n      class: joinClassNames('mediasfu-requests-modal__content', contentClassName),\n      style: contentStyle.value,\n      ...restContentProps,\n    },\n    [headerNode, h('hr', { class: 'hr' }), bodyNode]\n  );\n\n  const contentNode = props.renderContent\n    ? props.renderContent({\n        defaultContent,\n        counter: requestCounterState.value,\n      })\n    : defaultContent;\n\n  return h(\n    'div',\n    {\n      class: joinClassNames('mediasfu-requests-modal', overlayClassName),\n      style: overlayStyle.value,\n      ...restOverlayProps,\n    },\n    [contentNode]\n  );\n});\n</script>\n","<!--\n/**\n * @fileoverview WaitingModal - Waiting room participant management modal\n * @component WaitingModal\n * @module components/waitingComponents/WaitingModal\n * \n * @description\n * A host-only modal for managing participants in the waiting room. Displays a list of\n * participants waiting to join the event and provides accept/reject actions. Includes\n * search/filter functionality, real-time counter badge, and Socket.io integration for\n * immediate admission or rejection. Only visible to hosts (islevel === '2').\n * \n * Key Features:\n * - Waiting room participant list display\n * - Accept/reject actions for each participant\n * - Search/filter functionality\n * - Real-time counter badge\n * - Socket.io integration for admit/reject\n * - Host-only access control\n * - Responsive positioning (top/bottom, left/right)\n * - Empty state handling\n * - Customizable participant rows\n * - Render function support for all sections\n * \n * Workflow:\n * 1. Participant requests to join event\n * 2. Host opens waiting room modal\n * 3. Host sees list of waiting participants\n * 4. Host can search/filter participants\n * 5. Host clicks accept (admit) or reject button\n * 6. Socket emits response to server\n * 7. Participant is admitted or rejected\n * 8. List updates in real-time\n * \n * Actions:\n * - **Accept**: Admits participant to the event (emits 'updateWaiting' with action: 'accept')\n * - **Reject**: Denies participant entry (emits 'updateWaiting' with action: 'reject')\n * \n * @example Basic Usage\n * // <WaitingModal\n *   // :isWaitingModalVisible=\"isWaitingModalVisible\"\n *   // :onWaitingRoomClose=\"() => updateIsWaitingModalVisible(false)\"\n *   // :waitingRoomCounter=\"waitingRoomCounter\"\n *   // :onWaitingRoomFilterChange=\"onWaitingRoomFilterChange\"\n *   // :waitingRoomList=\"filteredWaitingRoomList\"\n *   // :updateWaitingList=\"updateWaitingRoomList\"\n *   // roomName=\"my-room\"\n *   // :socket=\"socket\"\n *   // :parameters=\"{ filteredWaitingRoomList, getUpdatedAllParams }\"\n * // />\n * \n * @example With Search and Custom Background\n * // <WaitingModal\n *   // :isWaitingModalVisible=\"showWaitingRoom\"\n *   // :onWaitingRoomClose=\"closeWaitingRoom\"\n *   // :waitingRoomCounter=\"waitingCount\"\n *   // :onWaitingRoomFilterChange=\"filterWaitingParticipants\"\n *   // :waitingRoomList=\"waitingList\"\n *   // :updateWaitingList=\"setWaitingList\"\n *   // roomName=\"conference-123\"\n *   // :socket=\"socketConnection\"\n *   // :parameters=\"waitingParameters\"\n *   // position=\"topLeft\"\n *   // backgroundColor=\"#2c3e50\"\n * // />\n * \n * @example Custom Empty State\n * // <script setup>\n * const customEmptyState = ({ counter }) => {\n *   // return h('div', {\n *     style: {\n *       textAlign: 'center',\n *       padding: '40px 20px',\n *       color: '#666'\n *     }\n *   }, [\n *     h('p', { style: { fontSize: '18px', marginBottom: '10px' } }, 'No one waiting'),\n *     h('p', { style: { fontSize: '14px' } }, 'Participants will appear here when they request to join')\n *   ]);\n * };\n * </script>\n * \n * // <template>\n *   <WaitingModal\n *     :isWaitingModalVisible=\"modalVisible\"\n *     :onWaitingRoomClose=\"closeModal\"\n *     :waitingRoomCounter=\"counter\"\n *     :onWaitingRoomFilterChange=\"handleFilter\"\n *     :waitingRoomList=\"participants\"\n *     :updateWaitingList=\"updateParticipants\"\n *     roomName=\"room\"\n *     :socket=\"socket\"\n *     :parameters=\"params\"\n *     :emptyState=\"customEmptyState\"\n *   />\n * </template>\n * \n * @example Custom Participant Render\n * // <script setup>\n * const renderCustomParticipant = ({ participant, handleAccept, handleReject }) => {\n *   // return h('div', {\n *     style: {\n *       display: 'flex',\n *       justifyContent: 'space-between',\n *       alignItems: 'center',\n *       padding: '12px',\n *       backgroundColor: '#f8f9fa',\n *       borderRadius: '8px',\n *       marginBottom: '8px'\n *     }\n *   }, [\n *     h('div', [\n *       h('strong', { style: { fontSize: '16px' } }, participant.name),\n *       h('div', { style: { fontSize: '12px', color: '#666' } }, `Waiting since ${new Date(participant.timestamp).toLocaleTimeString()}`)\n *     ]),\n *     h('div', { style: { display: 'flex', gap: '8px' } }, [\n *       h('button', {\n *         onClick: handleAccept,\n *         class: 'btn btn-success btn-sm',\n *         style: { minWidth: '80px' }\n *       }, 'Admit'),\n *       h('button', {\n *         onClick: handleReject,\n *         class: 'btn btn-danger btn-sm',\n *         style: { minWidth: '80px' }\n *       }, 'Deny')\n *     ])\n *   ]);\n * };\n * </script>\n * \n * // <template>\n *   <WaitingModal\n *     :isWaitingModalVisible=\"visible\"\n *     :onWaitingRoomClose=\"close\"\n *     :waitingRoomCounter=\"count\"\n *     :onWaitingRoomFilterChange=\"filter\"\n *     :waitingRoomList=\"list\"\n *     :updateWaitingList=\"update\"\n *     roomName=\"room\"\n *     :socket=\"socket\"\n *     :parameters=\"params\"\n *     :renderParticipant=\"renderCustomParticipant\"\n *   />\n * </template>\n * \n * @example Custom Header with Badge\n * // <script setup>\n * const renderCustomHeader = ({ defaultHeader, counter, onClose }) => {\n *   // return h('div', {\n *     style: {\n *       display: 'flex',\n *       justifyContent: 'space-between',\n *       alignItems: 'center',\n *       padding: '15px',\n *       background: 'linear-gradient(90deg, #667eea 0%, #764ba2 100%)',\n *       borderRadius: '10px 10px 0 0',\n *       marginBottom: '10px'\n *     }\n *   }, [\n *     h('div', { style: { display: 'flex', alignItems: 'center', gap: '10px' } }, [\n *       h('h3', { style: { color: 'white', margin: 0 } }, 'Waiting Room'),\n *       h('span', {\n *         style: {\n *           backgroundColor: 'white',\n *           color: '#667eea',\n *           padding: '4px 12px',\n *           borderRadius: '12px',\n *           fontSize: '14px',\n *           fontWeight: 'bold'\n *         }\n *       }, counter)\n *     ]),\n *     h('button', {\n *       onClick: onClose,\n *       style: { background: 'none', border: 'none', color: 'white', cursor: 'pointer' }\n *     }, '✕')\n *   ]);\n * };\n * </script>\n * \n * // <template>\n *   <WaitingModal\n *     :isWaitingModalVisible=\"open\"\n *     :onWaitingRoomClose=\"close\"\n *     :waitingRoomCounter=\"count\"\n *     :onWaitingRoomFilterChange=\"filter\"\n *     :waitingRoomList=\"list\"\n *     :updateWaitingList=\"update\"\n *     roomName=\"room\"\n *     :socket=\"socket\"\n *     :parameters=\"params\"\n *     :renderHeader=\"renderCustomHeader\"\n *   />\n * </template>\n * \n * @see {@link respondToWaiting} for accept/reject logic\n * @see {@link WaitingRoomParticipant} for participant data structure\n * @see {@link Socket} for Socket.io integration\n */\n-->\n<template>\n  <RenderVNode :node=\"overlayNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  ref,\n  computed,\n  watch,\n  defineComponent,\n  h,\n  isVNode,\n  type PropType,\n  type VNodeChild,\n  type CSSProperties,\n  type HTMLAttributes,\n  type ButtonHTMLAttributes,\n  type InputHTMLAttributes,\n} from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faTimes, faCheck } from '@fortawesome/free-solid-svg-icons';\nimport { respondToWaiting } from 'mediasfu-shared';\nimport type { WaitingRoomParticipant } from '../../../../SharedTypes';\nimport type { Socket } from 'socket.io-client';\n\n// Helper function to join class names\nfunction joinClassNames(...classes: Array<string | undefined | null | false>): string | undefined {\n  const filtered = classes.filter(Boolean) as string[];\n  return filtered.length > 0 ? filtered.join(' ') : undefined;\n}\n\nexport interface WaitingRoomModalParameters {\n  filteredWaitingRoomList: WaitingRoomParticipant[];\n  getUpdatedAllParams: () => WaitingRoomModalParameters;\n  [key: string]: unknown;\n}\n\n/**\n * Props for the WaitingModal component\n * @interface WaitingRoomModalProps\n * \n * @property {boolean} isWaitingModalVisible - Controls modal visibility (true = visible, false = hidden)\n * @property {Function} onWaitingRoomClose - Callback when modal closes\n * @property {number} waitingRoomCounter - Number of participants in waiting room (displayed in badge)\n * @property {Function} onWaitingRoomFilterChange - Callback when search filter changes\n *   // @param {string} filter - Filter text entered by user\n * @property {WaitingRoomParticipant[]} waitingRoomList - Array of participants in waiting room\n * @property {Function} updateWaitingList - Updates waiting room list state\n *   // @param {WaitingRoomParticipant[]} updatedList - New waiting room list\n * @property {string} roomName - Room/meeting identifier for server updates\n * @property {Socket} socket - Socket.io connection for emitting accept/reject actions\n * @property {string} [position='topRight'] - Modal position on screen\n *   - Options: 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight'\n * @property {string} [backgroundColor='#83c0e9'] - Background color of the modal content\n * @property {WaitingRoomModalParameters} parameters - Waiting room state and update functions\n * @property {Function} [onWaitingRoomItemPress=respondToWaiting] - Custom function to handle accept/reject actions\n *   // @default respondToWaiting from @react-shared/methods/waiting\n * \n * @property {VNodeChild} [title='Waiting'] - Modal title content\n * @property {HTMLAttributes} [overlayProps] - Props for the overlay wrapper (backdrop)\n * @property {HTMLAttributes} [contentProps] - Props for the modal content container\n * @property {HTMLAttributes} [headerProps] - Props for the header section\n * @property {HTMLAttributes} [titleProps] - Props for the title element\n * @property {HTMLAttributes} [badgeWrapperProps] - Props for the counter badge wrapper\n * @property {HTMLAttributes} [badgeProps] - Props for the counter badge element\n * @property {ButtonHTMLAttributes} [closeButtonProps] - Props for the close button\n * @property {VNodeChild} [closeIconComponent] - Custom close icon (default: faTimes FontAwesome)\n * @property {HTMLAttributes} [bodyProps] - Props for the body section container\n * @property {HTMLAttributes} [searchWrapperProps] - Props for search input wrapper\n * @property {InputHTMLAttributes} [searchInputProps] - Props for search input element\n * @property {HTMLAttributes} [waitingListProps] - Props for waiting list container\n * @property {HTMLAttributes} [participantRowProps] - Props for individual participant row\n * @property {ButtonHTMLAttributes} [acceptButtonProps] - Props for accept button\n * @property {ButtonHTMLAttributes} [rejectButtonProps] - Props for reject button\n * @property {VNodeChild} [acceptIconComponent] - Custom accept icon (default: faCheck FontAwesome)\n * @property {VNodeChild} [rejectIconComponent] - Custom reject icon (default: faTimes FontAwesome)\n * @property {VNodeChild | Function} [emptyState] - Custom empty state content or render function\n *   // @example\n *   ```ts\n *   ({ counter }) => h('p', 'No participants waiting')\n *   ```\n * \n * @property {Function} [renderHeader] - Custom render function for entire header section\n *   // @param {Object} options\n *   // @param {VNodeChild} options.defaultHeader - Default header VNode\n *   // @param {number} options.counter - Waiting room counter\n *   // @param {Function} options.onClose - Close handler function\n *   // @returns {VNodeChild} Custom header VNode\n *   // @example\n *   ```ts\n *   ({ counter, onClose }) => {\n *     return h('div', { class: 'custom-header' }, [\n *       h('h2', `Waiting Room (${counter})`),\n *       h('button', { onClick: onClose }, 'Close')\n *     ]);\n *   }\n *   ```\n * \n * @property {Function} [renderSearch] - Custom render function for search input section\n *   // @param {Object} options\n *   // @param {VNodeChild} options.defaultSearch - Default search input VNode\n *   // @param {Function} options.onFilter - Filter handler function\n *   // @returns {VNodeChild} Custom search VNode\n * \n * @property {Function} [renderParticipant] - Custom render function for individual participant row\n *   // @param {Object} options\n *   // @param {WaitingRoomParticipant} options.participant - Participant data\n *   // @param {number} options.index - Row index\n *   // @param {VNodeChild} options.defaultParticipant - Default participant row VNode\n *   // @param {Function} options.handleAccept - Accept handler function\n *   // @param {Function} options.handleReject - Reject handler function\n *   // @returns {VNodeChild} Custom participant row VNode\n *   // @example\n *   ```ts\n *   ({ participant, handleAccept, handleReject }) => {\n *     return h('div', { style: { display: 'flex', justifyContent: 'space-between' } }, [\n *       h('span', participant.name),\n *       h('div', [\n *         h('button', { onClick: handleAccept }, 'Admit'),\n *         h('button', { onClick: handleReject }, 'Deny')\n *       ])\n *     ]);\n *   }\n *   ```\n * \n * @property {Function} [renderBody] - Custom render function for entire body section\n *   // @param {Object} options\n *   // @param {VNodeChild} options.defaultBody - Default body VNode\n *   // @param {number} options.counter - Waiting room counter\n *   // @returns {VNodeChild} Custom body VNode\n */\nexport interface WaitingRoomModalProps {\n  isWaitingModalVisible: boolean;\n  onWaitingRoomClose: () => void;\n  waitingRoomCounter: number;\n  onWaitingRoomFilterChange: (filter: string) => void;\n  waitingRoomList: WaitingRoomParticipant[];\n  updateWaitingList: (updatedList: WaitingRoomParticipant[]) => void;\n  roomName: string;\n  socket: Socket;\n  position?: string;\n  backgroundColor?: string;\n  parameters: WaitingRoomModalParameters;\n  onWaitingRoomItemPress?: typeof respondToWaiting;\n  title?: VNodeChild;\n  overlayProps?: HTMLAttributes;\n  contentProps?: HTMLAttributes;\n  headerProps?: HTMLAttributes;\n  titleProps?: HTMLAttributes;\n  badgeWrapperProps?: HTMLAttributes;\n  badgeProps?: HTMLAttributes;\n  closeButtonProps?: ButtonHTMLAttributes;\n  closeIconComponent?: VNodeChild;\n  bodyProps?: HTMLAttributes;\n  searchWrapperProps?: HTMLAttributes;\n  searchInputProps?: InputHTMLAttributes;\n  waitingListProps?: HTMLAttributes;\n  participantRowProps?: HTMLAttributes;\n  acceptButtonProps?: ButtonHTMLAttributes;\n  rejectButtonProps?: ButtonHTMLAttributes;\n  acceptIconComponent?: VNodeChild;\n  rejectIconComponent?: VNodeChild;\n  emptyState?: VNodeChild | ((context: { counter: number }) => VNodeChild);\n  renderHeader?: (options: {\n    defaultHeader: VNodeChild;\n    counter: number;\n    onClose: () => void;\n  }) => VNodeChild;\n  renderSearch?: (options: {\n    defaultSearch: VNodeChild;\n    onFilter: (value: string) => void;\n  }) => VNodeChild;\n  renderParticipant?: (options: {\n    participant: WaitingRoomParticipant;\n    index: number;\n    defaultParticipant: VNodeChild;\n    handleAccept: () => void;\n    handleReject: () => void;\n  }) => VNodeChild;\n  renderBody?: (options: {\n    defaultBody: VNodeChild;\n    counter: number;\n  }) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<WaitingRoomModalProps>(), {\n  position: 'topRight',\n  backgroundColor: '#83c0e9',\n  onWaitingRoomItemPress: undefined,\n  title: () => 'Waiting',\n  overlayProps: undefined,\n  contentProps: undefined,\n  headerProps: undefined,\n  titleProps: undefined,\n  badgeWrapperProps: undefined,\n  badgeProps: undefined,\n  closeButtonProps: undefined,\n  closeIconComponent: undefined,\n  bodyProps: undefined,\n  searchWrapperProps: undefined,\n  searchInputProps: undefined,\n  waitingListProps: undefined,\n  participantRowProps: undefined,\n  acceptButtonProps: undefined,\n  rejectButtonProps: undefined,\n  acceptIconComponent: undefined,\n  rejectIconComponent: undefined,\n  emptyState: undefined,\n  renderHeader: undefined,\n  renderSearch: undefined,\n  renderParticipant: undefined,\n  renderBody: undefined,\n});\n\n// RenderVNode wrapper component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Boolean, Array, Function] as PropType<VNodeChild>,\n      default: null,\n    },\n  },\n  render() {\n    if (!this.node) return null;\n    if (isVNode(this.node)) return this.node;\n    if (typeof this.node === 'function') {\n      const result = (this.node as () => VNodeChild)();\n      return isVNode(result) ? result : String(result);\n    }\n    return String(this.node);\n  },\n});\n\nconst initialList = computed(() => \n  props.parameters?.filteredWaitingRoomList ?? props.waitingRoomList\n);\n\nconst waitingRoomListState = ref<WaitingRoomParticipant[]>(initialList.value);\nconst waitingRoomCounterState = ref<number>(props.parameters?.filteredWaitingRoomList?.length ?? props.waitingRoomCounter);\nconst rerenderToggle = ref(false);\n\nwatch(\n  () => [props.parameters, props.waitingRoomList, rerenderToggle.value],\n  () => {\n    if (props.parameters?.getUpdatedAllParams) {\n      const latestParams = props.parameters.getUpdatedAllParams();\n      waitingRoomListState.value = latestParams.filteredWaitingRoomList;\n      waitingRoomCounterState.value = latestParams.filteredWaitingRoomList.length;\n    } else if (props.parameters?.filteredWaitingRoomList) {\n      waitingRoomListState.value = props.parameters.filteredWaitingRoomList;\n      waitingRoomCounterState.value = props.parameters.filteredWaitingRoomList.length;\n    } else {\n      waitingRoomListState.value = props.waitingRoomList;\n      waitingRoomCounterState.value = props.waitingRoomList.length;\n    }\n  },\n  { immediate: true }\n);\n\nconst defaultOverlayWidth = typeof window !== 'undefined' ? Math.min(window.innerWidth * 0.8, 350) : 320;\n\n// Overlay props\nconst overlayAttrs = computed(() => {\n  const overlayProps = props.overlayProps || {};\n  const { class: cls, style, ...rest } = overlayProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst overlayClassNames = computed(() => \n  joinClassNames('mediasfu-waiting-modal', overlayAttrs.value.className)\n);\n\nconst overlayStyle = computed<CSSProperties>(() => ({\n  position: 'fixed',\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  display: props.isWaitingModalVisible ? 'block' : 'none',\n  zIndex: 999,\n  ...overlayAttrs.value.style,\n}));\n\n// Content props\nconst contentAttrs = computed(() => {\n  const contentProps = props.contentProps || {};\n  const { class: cls, style, ...rest } = contentProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst contentClassNames = computed(() => \n  joinClassNames('waiting-modal-content', contentAttrs.value.className)\n);\n\nconst contentPositionStyle = computed<CSSProperties>(() => ({\n  top: props.position.includes('top') ? '10px' : 'auto',\n  bottom: props.position.includes('bottom') ? '10px' : 'auto',\n  left: props.position.includes('Left') ? '10px' : 'auto',\n  right: props.position.includes('Right') ? '10px' : 'auto',\n}));\n\nconst contentStyle = computed<CSSProperties>(() => ({\n  position: 'fixed',\n  backgroundColor: props.backgroundColor,\n  borderRadius: '10px',\n  padding: '10px',\n  width: `${defaultOverlayWidth}px`,\n  maxHeight: '65%',\n  overflowY: 'auto',\n  boxShadow: '0 12px 36px rgba(0,0,0,0.25)',\n  display: 'flex',\n  flexDirection: 'column',\n  gap: '8px',\n  ...contentPositionStyle.value,\n  ...contentAttrs.value.style,\n}));\n\nconst handleFilterChange = (event: Event) => {\n  const target = event.target as HTMLInputElement;\n  const inputProps = props.searchInputProps as Record<string, unknown> | undefined;\n  const inputOnChange = inputProps?.onChange as ((event: Event) => void) | undefined;\n  \n  if (inputOnChange) {\n    inputOnChange(event);\n  }\n  \n  if (!(event as Event & { defaultPrevented?: boolean }).defaultPrevented) {\n    props.onWaitingRoomFilterChange(target.value);\n    rerenderToggle.value = !rerenderToggle.value;\n  }\n};\n\nconst onWaitingRoomItemPressHandler = props.onWaitingRoomItemPress ?? respondToWaiting;\n\n// Simplified node building - createOverlayNode that contains everything\nconst overlayNode = computed<VNodeChild>(() => {\n  if (!props.isWaitingModalVisible) return null;\n\n  return h(\n    'div',\n    {\n      class: overlayClassNames.value,\n      style: overlayStyle.value,\n      ...overlayAttrs.value.rest,\n    },\n    [\n      h(\n        'div',\n        {\n          class: contentClassNames.value,\n          style: contentStyle.value,\n          ...contentAttrs.value.rest,\n        },\n        [\n          // Header with title and badge\n          h('div', { class: 'modal-header', style: { display: 'flex', justifyContent: 'space-between', alignItems: 'center', marginBottom: '15px' } }, [\n            h('div', { class: 'modal-title', style: { fontSize: '18px', fontWeight: 'bold', color: 'black', display: 'flex', alignItems: 'center', gap: '8px' } }, [\n              isVNode(props.title) ? props.title : String(props.title),\n              h('span', {\n                style: {\n                  backgroundColor: '#fff',\n                  color: '#000',\n                  borderRadius: '10px',\n                  padding: '5px',\n                },\n                class: 'badge',\n              }, String(waitingRoomCounterState.value)),\n            ]),\n            h('button', {\n              type: 'button',\n              onClick: props.onWaitingRoomClose,\n              style: { background: 'none', border: 'none', cursor: 'pointer', padding: '4px', color: 'black' },\n              class: 'btn-close-waitings',\n            }, [\n              props.closeIconComponent ?? h(FontAwesomeIcon, { icon: faTimes, style: { fontSize: '20px', color: 'black' } }),\n            ]),\n          ]),\n          \n          // Divider\n          h('hr', { style: { height: '1px', backgroundColor: 'black', margin: '5px 0', border: 'none' } }),\n          \n          // Body\n          h('div', { class: 'modal-body' }, [\n            // Search input\n            h('div', { class: 'form-group' }, [\n              h('input', {\n                type: 'text',\n                placeholder: 'Search ...',\n                onInput: handleFilterChange,\n                style: {\n                  width: '90%',\n                  padding: '10px',\n                  borderRadius: '5px',\n                  border: '1px solid #000',\n                  fontSize: '16px',\n                  marginBottom: '10px',\n                },\n                ...props.searchInputProps,\n              }),\n            ]),\n            \n            // Waiting list\n            h('div', { class: 'waiting-list', style: { display: 'flex', flexDirection: 'column' } }, \n              waitingRoomListState.value.length === 0\n                ? [\n                    typeof props.emptyState === 'function'\n                      ? props.emptyState({ counter: waitingRoomCounterState.value })\n                      : props.emptyState ?? h('p', { style: { textAlign: 'center', color: 'black' } }, 'No participants waiting')\n                  ]\n                : waitingRoomListState.value.map((participant, index) =>\n                    h('div', {\n                      key: participant.id || index,\n                      class: 'waiting-item',\n                      style: { marginTop: '5px', flexDirection: 'row', flex: 1, display: 'flex' },\n                    }, [\n                      h('div', { class: 'col7', style: { flex: 5, justifyContent: 'center' } }, participant.name),\n                      h('div', { class: 'col2', style: { flex: 2, alignItems: 'center', justifyContent: 'center' } }, [\n                        h('button', {\n                          type: 'button',\n                          style: { background: 'none', border: 'none', cursor: 'pointer' },\n                          onClick: () => {\n                            onWaitingRoomItemPressHandler({\n                              participantId: participant.id,\n                              participantName: participant.name,\n                              updateWaitingList: props.updateWaitingList,\n                              waitingList: waitingRoomListState.value,\n                              roomName: props.roomName,\n                              type: true,\n                              socket: props.socket,\n                            });\n                          },\n                        }, [\n                          props.acceptIconComponent ?? h(FontAwesomeIcon, { icon: faCheck, size: 'lg', color: 'green' }),\n                        ]),\n                      ]),\n                      h('div', { class: 'col2', style: { flex: 2, alignItems: 'center', justifyContent: 'center' } }, [\n                        h('button', {\n                          type: 'button',\n                          style: { background: 'none', border: 'none', cursor: 'pointer' },\n                          onClick: () => {\n                            onWaitingRoomItemPressHandler({\n                              participantId: participant.id,\n                              participantName: participant.name,\n                              updateWaitingList: props.updateWaitingList,\n                              waitingList: waitingRoomListState.value,\n                              roomName: props.roomName,\n                              type: false,\n                              socket: props.socket,\n                            });\n                          },\n                        }, [\n                          props.rejectIconComponent ?? h(FontAwesomeIcon, { icon: faTimes, size: 'lg', color: 'red' }),\n                        ]),\n                      ]),\n                      h('div', { class: 'col1', style: { flex: 1 } }),\n                    ])\n                  )\n            ),\n          ]),\n        ]\n      ),\n    ]\n  );\n});\n</script>\n","<!--\n * DisplaySettingsModal - Participant display configuration modal\n *\n * @fileoverview\n * A modal component for configuring how participants are displayed in the event.\n * Provides options for filtering visible participants (video-only, media-only, all),\n * toggling audio waveforms, and forcing full display mode for all participants.\n *\n * @component DisplaySettingsModal\n * @module components/displaySettingsComponents/DisplaySettingsModal\n *\n * @description\n * This modal provides display configuration options with:\n * - Display type filter (video participants only, media participants only, all participants)\n * - Audio waveform toggle (show/hide audiographs)\n * - Force full display toggle (show all participants regardless of active speaker)\n * - Real-time updates to grid layout\n * - Automatic re-rendering of participant grids\n * - Event-type-specific settings\n * - Positioned modal with backdrop\n *\n * @example\n * // Basic display settings modal\n * // <DisplaySettingsModal\n *   // :is-display-settings-modal-visible=\"showDisplaySettings\"\n *   // :on-display-settings-close=\"() => setShowDisplaySettings(false)\"\n *   // :parameters=\"{\n *     meetingDisplayType,\n *     autoWave,\n *     forceFullDisplay,\n *     meetingVideoOptimized,\n *     islevel,\n *     participants,\n *     updateMeetingDisplayType,\n *     updateAutoWave,\n *     updateForceFullDisplay,\n *     updateUpdateMainWindow,\n *     updateUpdateActiveMinicardsGrid,\n *     getUpdatedAllParams\n *   }\"\n * // />\n *\n * @example\n * // Custom background color\n * // <DisplaySettingsModal\n *   // :is-display-settings-modal-visible=\"showSettings\"\n *   // :on-display-settings-close=\"closeSettings\"\n *   // :parameters=\"params\"\n *   // background-color=\"#1a1a1a\"\n * // />\n *\n * @example\n * // Different positioning\n * // <DisplaySettingsModal\n *   // :is-display-settings-modal-visible=\"showSettings\"\n *   // :on-display-settings-close=\"closeSettings\"\n *   // :parameters=\"params\"\n *   // position=\"bottomLeft\"\n * // />\n *\n * @example\n * // Programmatic control\n * // <DisplaySettingsModal\n *   // :is-display-settings-modal-visible=\"showSettings\"\n *   // :on-display-settings-close=\"() => {\n *     // Custom close logic\n *     saveDisplayPreferences();\n *     setShowSettings(false);\n *   }\"\n *   // :parameters=\"params\"\n * // />\n-->\n<template>\n  <div :style=\"modalContainerStyle\">\n    <div :style=\"modalContentStyle\">\n      <div\n        style=\"\n          display: flex;\n          flex-direction: row;\n          justify-content: space-between;\n          align-items: center;\n          margin-bottom: 15px;\n        \"\n      >\n        <h2 style=\"font-size: 18px; font-weight: bold; color: black\">\n          Display Settings\n        </h2>\n        <button \n          class=\"btn-close-media-settings\" \n          style=\"\n            background: none;\n            border: none;\n            cursor: pointer;\n            font-size: 24px;\n            color: black;\n            padding: 4px 8px;\n            line-height: 1;\n          \"\n          @click=\"onDisplaySettingsClose\"\n        >\n          <span style=\"display: block\">&times;</span>\n        </button>\n      </div>\n      <hr style=\"height: 1px; background-color: black; margin-top: 5px; margin-bottom: 5px\" />\n      <div style=\"flex: 1\">\n        <div style=\"margin-bottom: 10px\">\n          <label\n            style=\"\n              font-size: medium;\n              color: black;\n              margin-bottom: 5px;\n              font-weight: bold;\n            \"\n          >\n            Display Option:\n          </label>\n          <select\n            v-model=\"meetingDisplayTypeState\"\n            style=\"\n              font-size: medium;\n              padding: 12px 10px;\n              border: 1px solid gray;\n              border-radius: 4px;\n              color: black;\n              padding-right: 30px;\n              background-color: white;\n            \"\n          >\n            <option value=\"video\">\n              Video Participants Only\n            </option>\n            <option value=\"media\">\n              Media Participants Only\n            </option>\n            <option value=\"all\">\n              Show All Participants\n            </option>\n          </select>\n        </div>\n        <div style=\"height: 1px; background-color: #ffffff; margin-top: 2px; margin-bottom: 2px\" />\n        <div style=\"margin-bottom: 10px\">\n          <div\n            style=\"\n              display: flex;\n              flex-direction: row;\n              justify-content: space-between;\n              align-items: center;\n              margin-bottom: 10px;\n            \"\n          >\n            <label style=\"font-size: medium; color: black; font-weight: bold\">\n              Display Audiographs\n            </label>\n            <button @click=\"autoWaveState = !autoWaveState\">\n              <span\n                :style=\"{\n                  fontSize: 'large',\n                  color: autoWaveState ? 'green' : 'red',\n                  fontWeight: 'bolder'\n                }\"\n              >\n                &#10003;\n              </span>\n            </button>\n          </div>\n          <div\n            style=\"height: 1px; background-color: #ffffff; margin-top: 2px; margin-bottom: 2px\"\n          />\n          <div\n            style=\"\n              display: flex;\n              flex-direction: row;\n              justify-content: space-between;\n              align-items: center;\n              margin-bottom: 10px;\n            \"\n          >\n            <label style=\"font-size: medium; color: black; font-weight: bold\">\n              Force Full Display\n            </label>\n            <button @click=\"forceFullDisplayState = !forceFullDisplayState\">\n              <span\n                :style=\"{\n                  fontSize: 'large',\n                  color: forceFullDisplayState ? 'green' : 'red',\n                  fontWeight: 'bolder'\n                }\"\n              >\n                &#10003;\n              </span>\n            </button>\n          </div>\n          <div\n            style=\"height: 1px; background-color: #ffffff; margin-top: 2px; margin-bottom: 2px\"\n          />\n          <div\n            style=\"\n              display: flex;\n              flex-direction: row;\n              justify-content: space-between;\n              align-items: center;\n              margin-bottom: 10px;\n            \"\n          >\n            <label style=\"font-size: medium; color: black; font-weight: bold\">\n              Force Video Participants\n            </label>\n            <button @click=\"meetingVideoOptimizedState = !meetingVideoOptimizedState\">\n              <span\n                :style=\"{\n                  fontSize: 'large',\n                  color: meetingVideoOptimizedState ? 'green' : 'red',\n                  fontWeight: 'bolder'\n                }\"\n              >\n                &#10003;\n              </span>\n            </button>\n          </div>\n          <div\n            style=\"height: 1px; background-color: #ffffff; margin-top: 2px; margin-bottom: 2px\"\n          />\n        </div>\n      </div>\n      <div style=\"margin-top: 10px; flex-direction: row; justify-content: flex-end\">\n        <button\n          style=\"\n            flex: 1;\n            padding: 5px;\n            border-radius: 5px;\n            justify-content: center;\n            align-items: center;\n            background-color: black;\n            border: none;\n            cursor: pointer;\n          \"\n          @click=\"handleSaveSettings\"\n        >\n          <span style=\"color: white; font-size: medium\">Save</span>\n        </button>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, type CSSProperties } from 'vue'\nimport {\n  modifyDisplaySettings,\n  type ModifyDisplaySettingsOptions,\n  type ModifyDisplaySettingsParameters\n} from 'mediasfu-shared'\n\nexport interface DisplaySettingsModalParameters extends ModifyDisplaySettingsParameters {\n  meetingDisplayType: string\n  autoWave: boolean\n  forceFullDisplay: boolean\n  meetingVideoOptimized: boolean\n}\n\nexport interface DisplaySettingsModalProps {\n  isDisplaySettingsModalVisible: boolean\n  onDisplaySettingsClose: () => void\n  onModifyDisplaySettings?: (options: ModifyDisplaySettingsOptions) => Promise<void>\n  parameters: DisplaySettingsModalParameters\n  position?: 'topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft'\n  backgroundColor?: string\n}\n\nconst props = defineProps<DisplaySettingsModalProps>();\n\n// Manually provide defaults for optional props\nconst onModifyDisplaySettings = computed(() => props.onModifyDisplaySettings ?? modifyDisplaySettings);\nconst position = computed(() => props.position ?? 'topRight');\nconst backgroundColor = computed(() => props.backgroundColor ?? '#83c0e9');\n\nconst screenWidth = window.innerWidth\nlet modalWidth = 0.8 * screenWidth\nif (modalWidth > 350) {\n  modalWidth = 350\n}\n\nconst meetingDisplayTypeState = ref(props.parameters.meetingDisplayType)\nconst autoWaveState = ref(props.parameters.autoWave)\nconst forceFullDisplayState = ref(props.parameters.forceFullDisplay)\nconst meetingVideoOptimizedState = ref(props.parameters.meetingVideoOptimized)\n\nconst modalContainerStyle = computed((): CSSProperties => ({\n  position: 'fixed',\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  display: props.isDisplaySettingsModalVisible ? 'block' : 'none',\n  zIndex: 999\n}))\n\nconst modalContentStyle = computed((): CSSProperties => ({\n  position: 'fixed',\n  backgroundColor: backgroundColor.value,\n  borderRadius: '10px',\n  padding: '10px',\n  width: `${modalWidth}px`,\n  maxHeight: '65%',\n  overflowY: 'auto',\n  top: position.value.includes('top') ? '10px' : 'auto',\n  bottom: position.value.includes('bottom') ? '10px' : 'auto',\n  left: position.value.includes('Left') ? '10px' : 'auto',\n  right: position.value.includes('Right') ? '10px' : 'auto'\n}))\n\nconst handleSaveSettings = async () => {\n  await onModifyDisplaySettings.value({\n    parameters: {\n      ...props.parameters,\n      meetingDisplayType: meetingDisplayTypeState.value,\n      autoWave: autoWaveState.value,\n      forceFullDisplay: forceFullDisplayState.value,\n      meetingVideoOptimized: meetingVideoOptimizedState.value\n    }\n  })\n}\n</script>\n\n<script lang=\"ts\">\nexport default {\n  name: 'DisplaySettingsModal'\n}\n</script>\n\n<style scoped>\n.btn-close-media-settings {\n  cursor: pointer;\n}\n</style>\n","<!--\n/**\n * @fileoverview EventSettingsModal - Event-wide media permissions and settings modal\n * @component EventSettingsModal\n * @module components/eventSettingsComponents/EventSettingsModal\n * \n * @description\n * A host/admin-only modal for configuring event-wide media permissions. Controls whether\n * participants can use audio, video, screen sharing, and chat features. Each setting has\n * three modes: disallow (completely blocked), allow (freely enabled), and approval required\n * (participants must request permission). These settings apply globally to all participants\n * and are enforced by the server.\n * \n * Key Features:\n * - Four permission categories: Audio, Video, Screenshare, Chat\n * - Three permission levels: Disallow, Allow, Approval Required\n * - Real-time updates via Socket.io\n * - Host-only access (islevel check on server)\n * - Dropdown selects for each setting\n * - Save button to apply changes\n * - Role-based permission enforcement\n * - Socket emission to update server state\n * - Alert feedback on save\n * - Flexible positioning (top/bottom, left/right)\n * \n * Permission Modes:\n * - **Disallow**: Participants cannot use the feature at all\n * - **Allow**: Participants can use the feature freely\n * - **Approval Required**: Participants must request permission from host\n * \n * Settings:\n * 1. **Audio Setting** - Controls microphone usage\n * 2. **Video Setting** - Controls camera usage\n * 3. **Screenshare Setting** - Controls screen sharing\n * 4. **Chat Setting** - Controls text chat (Disallow or Allow only)\n * \n * @example Basic Usage\n * // <EventSettingsModal\n *   // :isEventSettingsModalVisible=\"isSettingsModalVisible\"\n *   // :onEventSettingsClose=\"() => updateIsSettingsModalVisible(false)\"\n *   // audioSetting=\"allow\"\n *   // videoSetting=\"approval\"\n *   // screenshareSetting=\"disallow\"\n *   // chatSetting=\"allow\"\n *   // :updateAudioSetting=\"updateAudioSetting\"\n *   // :updateVideoSetting=\"updateVideoSetting\"\n *   // :updateScreenshareSetting=\"updateScreenshareSetting\"\n *   // :updateChatSetting=\"updateChatSetting\"\n *   // :updateIsSettingsModalVisible=\"updateIsSettingsModalVisible\"\n *   // roomName=\"my-room\"\n *   // :socket=\"socket\"\n *   // :showAlert=\"showAlert\"\n * // />\n * \n * @example Conference with Flexible Permissions\n * // <script setup>\n * const eventSettings = reactive({\n *   // audio: 'allow',\n *   // video: 'allow',\n *   // screenshare: 'approval',\n *   // chat: 'allow'\n * });\n * \n * const openSettings = () => {\n *   // updateIsSettingsModalVisible(true);\n * };\n * </script>\n * \n * // <template>\n *   <EventSettingsModal\n *     :isEventSettingsModalVisible=\"isSettingsOpen\"\n *     :onEventSettingsClose=\"closeSettings\"\n *     :audioSetting=\"eventSettings.audio\"\n *     :videoSetting=\"eventSettings.video\"\n *     :screenshareSetting=\"eventSettings.screenshare\"\n *     :chatSetting=\"eventSettings.chat\"\n *     :updateAudioSetting=\"(val) => eventSettings.audio = val\"\n *     :updateVideoSetting=\"(val) => eventSettings.video = val\"\n *     :updateScreenshareSetting=\"(val) => eventSettings.screenshare = val\"\n *     :updateChatSetting=\"(val) => eventSettings.chat = val\"\n *     :updateIsSettingsModalVisible=\"updateModalVisibility\"\n *     roomName=\"conference-123\"\n *     :socket=\"socketConnection\"\n *   />\n * </template>\n * \n * @example Webinar Mode (Restrictive Defaults)\n * // <EventSettingsModal\n *   // :isEventSettingsModalVisible=\"settingsVisible\"\n *   // :onEventSettingsClose=\"hideSettings\"\n *   // audioSetting=\"approval\"\n *   // videoSetting=\"approval\"\n *   // screenshareSetting=\"disallow\"\n *   // chatSetting=\"allow\"\n *   // :updateAudioSetting=\"updateAudio\"\n *   // :updateVideoSetting=\"updateVideo\"\n *   // :updateScreenshareSetting=\"updateScreenshare\"\n *   // :updateChatSetting=\"updateChat\"\n *   // :updateIsSettingsModalVisible=\"updateVisibility\"\n *   // roomName=\"webinar-room\"\n *   // :socket=\"socket\"\n *   // position=\"topLeft\"\n *   // backgroundColor=\"#2c3e50\"\n * // />\n * \n * @example Custom Labels and Options\n * // <script setup>\n * const customAudioOptions = [\n *   { value: 'disallow', label: '🔇 Mute All' },\n *   { value: 'allow', label: '🎤 Unmute All' },\n *   { value: 'approval', label: '✋ Request to Speak' }\n * ];\n * \n * const customChatOptions = [\n *   { value: 'disallow', label: '🚫 Chat Off' },\n *   { value: 'allow', label: '💬 Chat On' }\n * ];\n * </script>\n * \n * // <template>\n *   <EventSettingsModal\n *     :isEventSettingsModalVisible=\"modalOpen\"\n *     :onEventSettingsClose=\"closeModal\"\n *     audioSetting=\"allow\"\n *     videoSetting=\"allow\"\n *     screenshareSetting=\"approval\"\n *     chatSetting=\"allow\"\n *     :updateAudioSetting=\"setAudio\"\n *     :updateVideoSetting=\"setVideo\"\n *     :updateScreenshareSetting=\"setScreenshare\"\n *     :updateChatSetting=\"setChat\"\n *     :updateIsSettingsModalVisible=\"setVisibility\"\n *     roomName=\"custom-room\"\n *     :socket=\"socket\"\n *     :audioOptions=\"customAudioOptions\"\n *     :chatOptions=\"customChatOptions\"\n *     audioLabel=\"Participant Audio:\"\n *     chatLabel=\"Text Chat:\"\n *     saveButtonLabel=\"Apply Settings\"\n *   />\n * </template>\n * \n * @example Custom Render Functions\n * // <script setup>\n * const renderCustomHeader = ({ defaultHeader }) => {\n *   // return h('div', { style: { background: 'linear-gradient(90deg, #667eea 0%, #764ba2 100%)', padding: '15px' } }, [\n *     h('h2', { style: { color: 'white', margin: 0 } }, 'Event Permissions'),\n *     h('p', { style: { color: '#e0e0e0', fontSize: '12px', margin: '5px 0 0 0' } }, 'Control participant access')\n *   ]);\n * };\n * \n * const renderCustomFooter = ({ defaultFooter }) => {\n *   // return h('div', { style: { display: 'flex', gap: '10px', justifyContent: 'flex-end' } }, [\n *     h('button', { onClick: closeModal, class: 'btn btn-secondary' }, 'Cancel'),\n *     h('button', { onClick: saveSettings, class: 'btn btn-primary' }, 'Save & Close')\n *   ]);\n * };\n * </script>\n * \n * // <template>\n *   <EventSettingsModal\n *     :isEventSettingsModalVisible=\"visible\"\n *     :onEventSettingsClose=\"close\"\n *     audioSetting=\"allow\"\n *     videoSetting=\"allow\"\n *     screenshareSetting=\"approval\"\n *     chatSetting=\"allow\"\n *     :updateAudioSetting=\"updateAudio\"\n *     :updateVideoSetting=\"updateVideo\"\n *     :updateScreenshareSetting=\"updateScreenshare\"\n *     :updateChatSetting=\"updateChat\"\n *     :updateIsSettingsModalVisible=\"updateVisibility\"\n *     roomName=\"room\"\n *     :socket=\"socket\"\n *     :renderHeader=\"renderCustomHeader\"\n *     :renderFooter=\"renderCustomFooter\"\n *   />\n * </template>\n * \n * @see {@link modifySettings} for server update logic\n * @see {@link EventSettingOption} for option configuration\n * @see {@link Socket} for Socket.io integration\n */\n-->\n<template>\n  <RenderVNode :node=\"overlayNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { h, isVNode, defineComponent, ref, computed, watch, type PropType, type VNodeChild, type HTMLAttributes, type ButtonHTMLAttributes, type SelectHTMLAttributes, type LabelHTMLAttributes, type CSSProperties } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faTimes } from '@fortawesome/free-solid-svg-icons';\nimport { modifySettings } from 'mediasfu-shared';\nimport type { ModifySettingsOptions } from 'mediasfu-shared';\nimport type { Socket } from 'socket.io-client';\nimport type { ShowAlert } from '../../../../SharedTypes';\n\nexport interface EventSettingOption {\n  value: string;\n  label: VNodeChild;\n}\n\nexport interface EventSettingSectionRenderInfo {\n  key: 'audio' | 'video' | 'screenshare' | 'chat' | string;\n  label: VNodeChild;\n  value: string;\n  options: EventSettingOption[];\n}\n\nexport interface RenderSettingSectionParams {\n  defaultSection: VNodeChild;\n  defaultSelect: VNodeChild;\n  section: EventSettingSectionRenderInfo;\n  index: number;\n  onChange: (value: string) => void;\n}\n\n/**\n * Props for the EventSettingsModal component\n * @interface EventSettingsModalProps\n * \n * @property {boolean} isEventSettingsModalVisible - Controls modal visibility (true = visible, false = hidden)\n * @property {Function} onEventSettingsClose - Callback when modal closes\n * @property {Function} [onModifyEventSettings=modifySettings] - Custom function to modify event settings on server\n *   // @default modifySettings from @react-shared/methods/settings/modifySettings\n * @property {string} [position='topRight'] - Modal position on screen\n *   - Options: 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight'\n * @property {string} [backgroundColor='#83c0e9'] - Background color of the modal content\n * \n * @property {string} audioSetting - Current audio permission setting\n *   - Values: 'disallow' | 'allow' | 'approval'\n * @property {string} videoSetting - Current video permission setting\n *   - Values: 'disallow' | 'allow' | 'approval'\n * @property {string} screenshareSetting - Current screenshare permission setting\n *   - Values: 'disallow' | 'allow' | 'approval'\n * @property {string} chatSetting - Current chat permission setting\n *   - Values: 'disallow' | 'allow'\n * \n * @property {Function} updateAudioSetting - Updates audio setting state\n *   // @param {string} setting - New audio setting value\n * @property {Function} updateVideoSetting - Updates video setting state\n *   // @param {string} setting - New video setting value\n * @property {Function} updateScreenshareSetting - Updates screenshare setting state\n *   // @param {string} setting - New screenshare setting value\n * @property {Function} updateChatSetting - Updates chat setting state\n *   // @param {string} setting - New chat setting value\n * @property {Function} updateIsSettingsModalVisible - Updates modal visibility state\n *   // @param {boolean} isVisible - New visibility value\n * \n * @property {string} roomName - Room/meeting identifier for server updates\n * @property {Socket} socket - Socket.io connection for emitting setting changes\n * @property {ShowAlert} [showAlert] - Alert function for displaying save confirmation/errors\n * \n * @property {VNodeChild} [title='Event Settings'] - Modal title content\n * @property {VNodeChild} [saveButtonLabel='Save'] - Save button label\n * @property {VNodeChild} [audioLabel='User audio:'] - Audio setting label\n * @property {VNodeChild} [videoLabel='User video:'] - Video setting label\n * @property {VNodeChild} [screenshareLabel='User screenshare:'] - Screenshare setting label\n * @property {VNodeChild} [chatLabel='User chat:'] - Chat setting label\n * @property {VNodeChild} [disallowOptionLabel='Disallow'] - Disallow option label\n * @property {VNodeChild} [allowOptionLabel='Allow'] - Allow option label\n * @property {VNodeChild} [approvalOptionLabel='Upon approval'] - Approval option label\n * @property {VNodeChild} [chatDisallowOptionLabel='Disallow'] - Chat disallow label\n * @property {VNodeChild} [chatAllowOptionLabel='Allow'] - Chat allow label\n * \n * @property {EventSettingOption[]} [audioOptions] - Custom audio setting options\n *   // @example [{ value: 'disallow', label: 'Mute All' }, { value: 'allow', label: 'Unmute All' }, { value: 'approval', label: 'Request' }]\n * @property {EventSettingOption[]} [videoOptions] - Custom video setting options\n * @property {EventSettingOption[]} [screenshareOptions] - Custom screenshare setting options\n * @property {EventSettingOption[]} [chatOptions] - Custom chat setting options\n * \n * @property {HTMLAttributes} [overlayProps] - Props for the overlay wrapper (backdrop)\n * @property {HTMLAttributes} [contentProps] - Props for the modal content container\n * @property {HTMLAttributes} [headerProps] - Props for the header section\n * @property {HTMLAttributes} [titleProps] - Props for the title element\n * @property {ButtonHTMLAttributes} [closeButtonProps] - Props for the close button\n * @property {VNodeChild} [closeIconComponent] - Custom close icon (default: faTimes FontAwesome)\n * @property {HTMLAttributes} [headerDividerProps] - Props for divider after header\n * @property {HTMLAttributes} [bodyProps] - Props for the body section container\n * @property {HTMLAttributes} [settingFieldProps] - Props for setting field wrappers\n * @property {HTMLAttributes} [audioFieldProps] - Props for audio field wrapper\n * @property {HTMLAttributes} [videoFieldProps] - Props for video field wrapper\n * @property {HTMLAttributes} [screenshareFieldProps] - Props for screenshare field wrapper\n * @property {HTMLAttributes} [chatFieldProps] - Props for chat field wrapper\n * @property {LabelHTMLAttributes} [settingLabelProps] - Props for setting labels\n * @property {LabelHTMLAttributes} [audioLabelProps] - Props for audio label\n * @property {LabelHTMLAttributes} [videoLabelProps] - Props for video label\n * @property {LabelHTMLAttributes} [screenshareLabelProps] - Props for screenshare label\n * @property {LabelHTMLAttributes} [chatLabelProps] - Props for chat label\n * @property {SelectHTMLAttributes} [settingSelectProps] - Props for setting select elements\n * @property {SelectHTMLAttributes} [audioSelectProps] - Props for audio select\n * @property {SelectHTMLAttributes} [videoSelectProps] - Props for video select\n * @property {SelectHTMLAttributes} [screenshareSelectProps] - Props for screenshare select\n * @property {SelectHTMLAttributes} [chatSelectProps] - Props for chat select\n * @property {HTMLAttributes} [separatorProps] - Props for separator dividers between settings\n * @property {HTMLAttributes} [footerProps] - Props for the footer section\n * @property {ButtonHTMLAttributes} [saveButtonProps] - Props for the save button\n * \n * @property {Function} [renderHeader] - Custom render function for entire header section\n *   // @param {Object} params\n *   // @param {VNodeChild} params.defaultHeader - Default header VNode\n *   // @returns {VNodeChild} Custom header VNode\n * \n * @property {Function} [renderBody] - Custom render function for entire body section\n *   // @param {Object} params\n *   // @param {VNodeChild} params.defaultBody - Default body VNode\n *   // @returns {VNodeChild} Custom body VNode\n * \n * @property {Function} [renderSettings] - Custom render function for all settings sections\n *   // @param {Object} params\n *   // @param {VNodeChild} params.defaultSettings - Default settings VNode\n *   // @param {EventSettingSectionRenderInfo[]} params.sections - Array of setting section data\n *   // @returns {VNodeChild} Custom settings VNode\n * \n * @property {Function} [renderSettingSection] - Custom render function for individual setting section\n *   // @param {RenderSettingSectionParams} params - Section render parameters\n *   // @returns {VNodeChild} Custom section VNode\n *   // @example\n *   ```ts\n *   ({ defaultSection, section, onChange }) => {\n *     return h('div', { style: { marginBottom: '15px' } }, [\n *       h('label', { style: { fontWeight: 'bold' } }, section.label),\n *       h('select', {\n *         value: section.value,\n *         onChange: (e) => onChange(e.target.value)\n *       }, section.options.map(opt => h('option', { value: opt.value }, opt.label)))\n *     ]);\n *   }\n *   ```\n * \n * @property {Function} [renderSeparator] - Custom render function for separator between settings\n *   // @param {Object} params\n *   // @param {VNodeChild} params.defaultSeparator - Default separator VNode\n *   // @param {number} params.index - Section index\n *   // @returns {VNodeChild} Custom separator VNode\n * \n * @property {Function} [renderFooter] - Custom render function for entire footer section\n *   // @param {Object} params\n *   // @param {VNodeChild} params.defaultFooter - Default footer VNode\n *   // @returns {VNodeChild} Custom footer VNode\n * \n * @property {Function} [renderContent] - Custom render function for entire modal content\n *   // @param {Object} params\n *   // @param {VNodeChild} params.defaultContent - Default content VNode\n *   // @returns {VNodeChild} Custom content VNode\n */\nexport interface EventSettingsModalProps {\n  isEventSettingsModalVisible: boolean;\n  onEventSettingsClose: () => void;\n  onModifyEventSettings?: (options: ModifySettingsOptions) => Promise<void>;\n  position?: 'topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight';\n  backgroundColor?: string;\n  audioSetting: string;\n  videoSetting: string;\n  screenshareSetting: string;\n  chatSetting: string;\n  updateAudioSetting: (setting: string) => void;\n  updateVideoSetting: (setting: string) => void;\n  updateScreenshareSetting: (setting: string) => void;\n  updateChatSetting: (setting: string) => void;\n  updateIsSettingsModalVisible: (isVisible: boolean) => void;\n  roomName: string;\n  socket: Socket;\n  showAlert?: ShowAlert;\n  title?: VNodeChild | string | number;\n  overlayProps?: HTMLAttributes;\n  contentProps?: HTMLAttributes;\n  headerProps?: HTMLAttributes;\n  titleProps?: HTMLAttributes;\n  closeButtonProps?: ButtonHTMLAttributes;\n  closeIconComponent?: VNodeChild;\n  headerDividerProps?: HTMLAttributes;\n  bodyProps?: HTMLAttributes;\n  settingFieldProps?: HTMLAttributes;\n  audioFieldProps?: HTMLAttributes;\n  videoFieldProps?: HTMLAttributes;\n  screenshareFieldProps?: HTMLAttributes;\n  chatFieldProps?: HTMLAttributes;\n  settingLabelProps?: LabelHTMLAttributes;\n  audioLabelProps?: LabelHTMLAttributes;\n  videoLabelProps?: LabelHTMLAttributes;\n  screenshareLabelProps?: LabelHTMLAttributes;\n  chatLabelProps?: LabelHTMLAttributes;\n  settingSelectProps?: SelectHTMLAttributes;\n  audioSelectProps?: SelectHTMLAttributes;\n  videoSelectProps?: SelectHTMLAttributes;\n  screenshareSelectProps?: SelectHTMLAttributes;\n  chatSelectProps?: SelectHTMLAttributes;\n  separatorProps?: HTMLAttributes;\n  footerProps?: HTMLAttributes;\n  saveButtonProps?: ButtonHTMLAttributes;\n  saveButtonLabel?: VNodeChild | string | number;\n  audioLabel?: VNodeChild | string | number;\n  videoLabel?: VNodeChild | string | number;\n  screenshareLabel?: VNodeChild | string | number;\n  chatLabel?: VNodeChild | string | number;\n  disallowOptionLabel?: VNodeChild | string | number;\n  allowOptionLabel?: VNodeChild | string | number;\n  approvalOptionLabel?: VNodeChild | string | number;\n  chatDisallowOptionLabel?: VNodeChild | string | number;\n  chatAllowOptionLabel?: VNodeChild | string | number;\n  audioOptions?: EventSettingOption[];\n  videoOptions?: EventSettingOption[];\n  screenshareOptions?: EventSettingOption[];\n  chatOptions?: EventSettingOption[];\n  renderHeader?: (params: { defaultHeader: VNodeChild }) => VNodeChild;\n  renderBody?: (params: { defaultBody: VNodeChild }) => VNodeChild;\n  renderSettings?: (params: {\n    defaultSettings: VNodeChild;\n    sections: EventSettingSectionRenderInfo[];\n  }) => VNodeChild;\n  renderSettingSection?: (params: RenderSettingSectionParams) => VNodeChild;\n  renderSeparator?: (params: {\n    defaultSeparator: VNodeChild;\n    index: number;\n  }) => VNodeChild;\n  renderFooter?: (params: { defaultFooter: VNodeChild }) => VNodeChild;\n  renderContent?: (params: { defaultContent: VNodeChild }) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<EventSettingsModalProps>(), {\n  onModifyEventSettings: modifySettings,\n  position: 'topRight',\n  backgroundColor: '#83c0e9',\n  title: 'Event Settings',\n  saveButtonLabel: 'Save',\n  audioLabel: 'User audio:',\n  videoLabel: 'User video:',\n  screenshareLabel: 'User screenshare:',\n  chatLabel: 'User chat:',\n  disallowOptionLabel: 'Disallow',\n  allowOptionLabel: 'Allow',\n  approvalOptionLabel: 'Upon approval',\n  chatDisallowOptionLabel: 'Disallow',\n  chatAllowOptionLabel: 'Allow',\n  overlayProps: undefined,\n  contentProps: undefined,\n  headerProps: undefined,\n  titleProps: undefined,\n  closeButtonProps: undefined,\n  closeIconComponent: undefined,\n  headerDividerProps: undefined,\n  bodyProps: undefined,\n  settingFieldProps: undefined,\n  audioFieldProps: undefined,\n  videoFieldProps: undefined,\n  screenshareFieldProps: undefined,\n  chatFieldProps: undefined,\n  settingLabelProps: undefined,\n  audioLabelProps: undefined,\n  videoLabelProps: undefined,\n  screenshareLabelProps: undefined,\n  chatLabelProps: undefined,\n  settingSelectProps: undefined,\n  audioSelectProps: undefined,\n  videoSelectProps: undefined,\n  screenshareSelectProps: undefined,\n  chatSelectProps: undefined,\n  separatorProps: undefined,\n  footerProps: undefined,\n  saveButtonProps: undefined,\n  audioOptions: undefined,\n  videoOptions: undefined,\n  screenshareOptions: undefined,\n  chatOptions: undefined,\n  renderHeader: undefined,\n  renderBody: undefined,\n  renderSettings: undefined,\n  renderSettingSection: undefined,\n  renderSeparator: undefined,\n  renderFooter: undefined,\n  renderContent: undefined,\n  showAlert: undefined,\n});\n\nconst audioState = ref(props.audioSetting);\nconst videoState = ref(props.videoSetting);\nconst screenshareState = ref(props.screenshareSetting);\nconst chatState = ref(props.chatSetting);\n\nwatch(\n  () => props.isEventSettingsModalVisible,\n  (newValue) => {\n    if (newValue) {\n      audioState.value = props.audioSetting;\n      videoState.value = props.videoSetting;\n      screenshareState.value = props.screenshareSetting;\n      chatState.value = props.chatSetting;\n    }\n  }\n);\n\nconst closeModal = () => {\n  props.onEventSettingsClose();\n};\n\nconst handleSaveSettings = async () => {\n  await props.onModifyEventSettings({\n    audioSet: audioState.value,\n    videoSet: videoState.value,\n    screenshareSet: screenshareState.value,\n    chatSet: chatState.value,\n    updateAudioSetting: props.updateAudioSetting,\n    updateVideoSetting: props.updateVideoSetting,\n    updateScreenshareSetting: props.updateScreenshareSetting,\n    updateChatSetting: props.updateChatSetting,\n    updateIsSettingsModalVisible: props.updateIsSettingsModalVisible,\n    roomName: props.roomName,\n    socket: props.socket as Socket,\n    showAlert: props.showAlert,\n  });\n};\n\n// Inline RenderVNode component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Function] as PropType<VNodeChild>,\n      default: null\n    }\n  },\n  setup(props) {\n    return () => {\n      const node = props.node\n      if (isVNode(node)) {\n        return node\n      } else if (typeof node === 'function') {\n        return (node as () => VNodeChild)()\n      } else {\n        return node\n      }\n    }\n  }\n})\n\n// Helper function\nconst joinClassNames = (classes: (string | undefined)[]): string | undefined => {\n  const filtered = classes.filter(Boolean)\n  return filtered.length > 0 ? filtered.join(' ').trim() : undefined\n}\n\n// Computed properties for styles\nconst defaultOverlayWidth = typeof window !== 'undefined' ? Math.min(window.innerWidth * 0.8, 350) : 320\n\nconst overlayStyle = computed((): CSSProperties => ({\n  position: 'fixed' as const,\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  display: props.isEventSettingsModalVisible ? 'block' : 'none',\n  zIndex: 999,\n  ...(props.overlayProps?.style as CSSProperties || {})\n}))\n\nconst overlayClassName = computed(() => \n  joinClassNames(['mediasfu-event-modal', props.overlayProps?.class as string])\n)\n\nconst contentStyle = computed((): CSSProperties => ({\n  position: 'fixed' as const,\n  backgroundColor: props.backgroundColor,\n  borderRadius: '10px',\n  padding: '16px',\n  width: `${defaultOverlayWidth}px`,\n  maxHeight: '65%',\n  overflow: 'hidden' as const,\n  top: props.position.includes('top') ? '10px' : 'auto',\n  bottom: props.position.includes('bottom') ? '10px' : 'auto',\n  left: props.position.includes('Left') ? '10px' : 'auto',\n  right: props.position.includes('Right') ? '10px' : 'auto',\n  display: 'flex',\n  flexDirection: 'column' as const,\n  gap: '16px',\n  boxShadow: '0 10px 30px rgba(0, 0, 0, 0.25)',\n  ...(props.contentProps?.style as CSSProperties || {})\n}))\n\nconst contentClassName = computed(() => \n  joinClassNames(['mediasfu-event-modal__content', props.contentProps?.class as string])\n)\n\n// Main overlay node\nconst overlayNode = computed(() => {\n  const defaultCloseIcon = props.closeIconComponent ?? h(FontAwesomeIcon, { icon: faTimes, size: 'xl' })\n  \n  const defaultTitleNode = h('div', {\n    class: joinClassNames(['modal-title', props.titleProps?.class as string]),\n    style: {\n      margin: 0,\n      fontSize: '1.25rem',\n      fontWeight: 'bold',\n      ...(props.titleProps?.style as CSSProperties || {})\n    },\n    ...(props.titleProps ? Object.fromEntries(\n      Object.entries(props.titleProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, typeof props.title === 'string' || typeof props.title === 'number' ? [props.title] : (props.title || []))\n  \n  const defaultHeaderNode = h('div', {\n    class: joinClassNames(['modal-header', props.headerProps?.class as string]),\n    style: {\n      display: 'flex',\n      justifyContent: 'space-between',\n      alignItems: 'center',\n      gap: '12px',\n      ...(props.headerProps?.style as CSSProperties || {})\n    },\n    ...(props.headerProps ? Object.fromEntries(\n      Object.entries(props.headerProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    defaultTitleNode,\n    h('button', {\n      class: joinClassNames(['btn-close-settings', props.closeButtonProps?.class as string]),\n      style: {\n        padding: '5px',\n        cursor: 'pointer',\n        border: 'none',\n        background: 'transparent',\n        ...(props.closeButtonProps?.style as CSSProperties || {})\n      },\n      onClick: (event: MouseEvent) => {\n        if (props.closeButtonProps?.onClick) {\n          (props.closeButtonProps.onClick as (event: MouseEvent) => void)(event)\n        }\n        if (!event.defaultPrevented) {\n          closeModal()\n        }\n      },\n      ...(props.closeButtonProps ? Object.fromEntries(\n        Object.entries(props.closeButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {})\n    }, [defaultCloseIcon])\n  ])\n  \n  const headerNode = props.renderHeader\n    ? props.renderHeader({ defaultHeader: defaultHeaderNode })\n    : defaultHeaderNode\n  \n  const dividerNode = h('hr', {\n    class: joinClassNames(['hr', props.headerDividerProps?.class as string]),\n    style: {\n      height: '1px',\n      backgroundColor: 'black',\n      border: 'none',\n      ...(props.headerDividerProps?.style as CSSProperties || {})\n    },\n    ...(props.headerDividerProps ? Object.fromEntries(\n      Object.entries(props.headerDividerProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  })\n  \n  // Build default options\n  const defaultAudioOptions: EventSettingOption[] = props.audioOptions ?? [\n    { value: 'disallow', label: props.disallowOptionLabel || 'Disallow' },\n    { value: 'allow', label: props.allowOptionLabel || 'Allow' },\n    { value: 'approval', label: props.approvalOptionLabel || 'Upon approval' }\n  ]\n  \n  const defaultVideoOptions: EventSettingOption[] = props.videoOptions ?? [\n    { value: 'disallow', label: props.disallowOptionLabel || 'Disallow' },\n    { value: 'allow', label: props.allowOptionLabel || 'Allow' },\n    { value: 'approval', label: props.approvalOptionLabel || 'Upon approval' }\n  ]\n  \n  const defaultScreenshareOptions: EventSettingOption[] = props.screenshareOptions ?? [\n    { value: 'disallow', label: props.disallowOptionLabel || 'Disallow' },\n    { value: 'allow', label: props.allowOptionLabel || 'Allow' },\n    { value: 'approval', label: props.approvalOptionLabel || 'Upon approval' }\n  ]\n  \n  const defaultChatOptions: EventSettingOption[] = props.chatOptions ?? [\n    { value: 'disallow', label: props.chatDisallowOptionLabel || 'Disallow' },\n    { value: 'allow', label: props.chatAllowOptionLabel || 'Allow' }\n  ]\n  \n  const sections: EventSettingSectionRenderInfo[] = [\n    {\n      key: 'audio',\n      label: props.audioLabel || 'User audio:',\n      value: audioState.value,\n      options: defaultAudioOptions\n    },\n    {\n      key: 'video',\n      label: props.videoLabel || 'User video:',\n      value: videoState.value,\n      options: defaultVideoOptions\n    },\n    {\n      key: 'screenshare',\n      label: props.screenshareLabel || 'User screenshare:',\n      value: screenshareState.value,\n      options: defaultScreenshareOptions\n    },\n    {\n      key: 'chat',\n      label: props.chatLabel || 'User chat:',\n      value: chatState.value,\n      options: defaultChatOptions\n    }\n  ]\n  \n  const createSettingSection = (section: EventSettingSectionRenderInfo, index: number) => {\n    const onChange = (value: string) => {\n      if (section.key === 'audio') audioState.value = value\n      else if (section.key === 'video') videoState.value = value\n      else if (section.key === 'screenshare') screenshareState.value = value\n      else if (section.key === 'chat') chatState.value = value\n    }\n    \n    const fieldPropsMap: Record<string, HTMLAttributes | undefined> = {\n      audio: props.audioFieldProps,\n      video: props.videoFieldProps,\n      screenshare: props.screenshareFieldProps,\n      chat: props.chatFieldProps\n    }\n    \n    const labelPropsMap: Record<string, LabelHTMLAttributes | undefined> = {\n      audio: props.audioLabelProps,\n      video: props.videoLabelProps,\n      screenshare: props.screenshareLabelProps,\n      chat: props.chatLabelProps\n    }\n    \n    const selectPropsMap: Record<string, SelectHTMLAttributes | undefined> = {\n      audio: props.audioSelectProps,\n      video: props.videoSelectProps,\n      screenshare: props.screenshareSelectProps,\n      chat: props.chatSelectProps\n    }\n    \n    const fieldProps = fieldPropsMap[section.key] || props.settingFieldProps\n    const labelProps = labelPropsMap[section.key] || props.settingLabelProps\n    const selectProps = selectPropsMap[section.key] || props.settingSelectProps\n    \n    const defaultSelect = h('select', {\n      class: joinClassNames(['picker-select', selectProps?.class as string]),\n      style: { ...(selectProps?.style as CSSProperties || {}) },\n      value: section.value,\n      onChange: (event: Event) => {\n        if (selectProps?.onChange) {\n          (selectProps.onChange as (event: Event) => void)(event)\n        }\n        if (!event.defaultPrevented) {\n          onChange((event.target as HTMLSelectElement).value)\n        }\n      },\n      ...(selectProps ? Object.fromEntries(\n        Object.entries(selectProps).filter(([key]) => !['class', 'style', 'value', 'onChange'].includes(key))\n      ) : {})\n    }, section.options.map(opt => \n      h('option', { value: opt.value }, \n        typeof opt.label === 'string' || typeof opt.label === 'number' ? [opt.label] : (opt.label || [])\n      )\n    ))\n    \n    const defaultSection = h('div', {\n      class: joinClassNames(['form-group', fieldProps?.class as string]),\n      style: { ...(fieldProps?.style as CSSProperties || {}) },\n      ...(fieldProps ? Object.fromEntries(\n        Object.entries(fieldProps).filter(([key]) => !['class', 'style'].includes(key))\n      ) : {})\n    }, [\n      h('label', {\n        class: joinClassNames(['label', labelProps?.class as string]),\n        style: { ...(labelProps?.style as CSSProperties || {}) },\n        ...(labelProps ? Object.fromEntries(\n          Object.entries(labelProps).filter(([key]) => !['class', 'style'].includes(key))\n        ) : {})\n      }, typeof section.label === 'string' || typeof section.label === 'number' ? [section.label] : (section.label || [])),\n      defaultSelect\n    ])\n    \n    return props.renderSettingSection\n      ? props.renderSettingSection({ defaultSection, defaultSelect, section, index, onChange })\n      : defaultSection\n  }\n  \n  const settingSections = sections.map((section, index) => {\n    const sectionNode = createSettingSection(section, index)\n    \n    if (index < sections.length - 1) {\n      const defaultSeparator = h('div', {\n        class: joinClassNames(['sep', props.separatorProps?.class as string]),\n        style: { ...(props.separatorProps?.style as CSSProperties || {}) },\n        ...(props.separatorProps ? Object.fromEntries(\n          Object.entries(props.separatorProps).filter(([key]) => !['class', 'style'].includes(key))\n        ) : {})\n      })\n      \n      const separator = props.renderSeparator\n        ? props.renderSeparator({ defaultSeparator, index })\n        : defaultSeparator\n      \n      return [sectionNode, separator]\n    }\n    \n    return sectionNode\n  }).flat()\n  \n  const defaultSettingsNode = h('div', {\n    class: 'settings-wrapper'\n  }, settingSections)\n  \n  const settingsNode = props.renderSettings\n    ? props.renderSettings({ defaultSettings: defaultSettingsNode, sections })\n    : defaultSettingsNode\n  \n  const defaultBodyNode = h('div', {\n    class: joinClassNames(['modal-body', props.bodyProps?.class as string]),\n    style: {\n      overflowY: 'auto' as const,\n      flex: 1,\n      ...(props.bodyProps?.style as CSSProperties || {})\n    },\n    ...(props.bodyProps ? Object.fromEntries(\n      Object.entries(props.bodyProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [settingsNode])\n  \n  const bodyNode = props.renderBody\n    ? props.renderBody({ defaultBody: defaultBodyNode })\n    : defaultBodyNode\n  \n  const defaultFooterNode = h('div', {\n    class: joinClassNames(['modal-footer', props.footerProps?.class as string]),\n    style: { ...(props.footerProps?.style as CSSProperties || {}) },\n    ...(props.footerProps ? Object.fromEntries(\n      Object.entries(props.footerProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    h('button', {\n      class: joinClassNames(['btn-apply-settings', props.saveButtonProps?.class as string]),\n      style: { ...(props.saveButtonProps?.style as CSSProperties || {}) },\n      onClick: (event: MouseEvent) => {\n        if (props.saveButtonProps?.onClick) {\n          (props.saveButtonProps.onClick as (event: MouseEvent) => void)(event)\n        }\n        if (!event.defaultPrevented) {\n          handleSaveSettings()\n        }\n      },\n      ...(props.saveButtonProps ? Object.fromEntries(\n        Object.entries(props.saveButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {})\n    }, typeof props.saveButtonLabel === 'string' || typeof props.saveButtonLabel === 'number' \n      ? [props.saveButtonLabel] \n      : (props.saveButtonLabel || []))\n  ])\n  \n  const footerNode = props.renderFooter\n    ? props.renderFooter({ defaultFooter: defaultFooterNode })\n    : defaultFooterNode\n  \n  const defaultContentNode = h('div', {\n    class: contentClassName.value,\n    style: contentStyle.value,\n    ...(props.contentProps ? Object.fromEntries(\n      Object.entries(props.contentProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    headerNode,\n    dividerNode,\n    bodyNode,\n    footerNode\n  ])\n  \n  const contentNode = props.renderContent\n    ? props.renderContent({ defaultContent: defaultContentNode })\n    : defaultContentNode\n  \n  return h('div', {\n    class: overlayClassName.value,\n    style: overlayStyle.value,\n    ...(props.overlayProps ? Object.fromEntries(\n      Object.entries(props.overlayProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [contentNode])\n})\n</script>\n\n<style scoped>\n@import '@legacy/components/eventSettingsComponents/EventSettingsModal.css';\n</style>\n","<!--\n/**\n * @fileoverview CoHostModal - Co-host assignment and permissions management modal\n * @component CoHostModal\n * @module components/coHostComponents/CoHostModal\n * \n * @description\n * A host-only modal for assigning co-host privileges and managing co-host responsibilities.\n * Allows the host to select a participant as co-host and configure granular permissions for\n * various event management tasks. Each responsibility can be toggled and set as \"dedicated\"\n * (co-host only) or shared (host and co-host). Socket integration ensures real-time updates.\n * \n * Key Features:\n * - Co-host selection from participant dropdown\n * - Current co-host display (read-only)\n * - Granular responsibility management (8 categories)\n * - Toggle responsibility on/off\n * - Set responsibilities as dedicated (co-host exclusive)\n * - Real-time Socket.io updates\n * - Host-only access control\n * - Responsive positioning (top/bottom, left/right)\n * - Custom responsibility labels\n * - Render function support for all sections\n * \n * Responsibilities:\n * 1. **Media Control** - Manage participant audio/video\n * 2. **Participants** - View and manage participant list\n * 3. **Chat** - Access messaging and chat features\n * 4. **Waiting Room** - Manage waiting room participants\n * 5. **Settings** - Access event settings\n * 6. **Recording** - Control recording start/stop/pause\n * 7. **Requests** - Handle participant media requests\n * 8. **Screen Share** - Approve screenshare requests\n * \n * Permission Modes:\n * - **Selected**: Co-host has this permission\n * - **Not Selected**: Co-host does not have this permission\n * - **Dedicated**: Only co-host has permission (host cannot use)\n * - **Shared**: Both host and co-host have permission\n * \n * @example Basic Usage\n * // <CoHostModal\n *   // :isCoHostModalVisible=\"isCoHostModalVisible\"\n *   // :onCoHostClose=\"() => updateIsCoHostModalVisible(false)\"\n *   // :coHostResponsibility=\"coHostResponsibility\"\n *   // :participants=\"participants\"\n *   // :currentCohost=\"coHost\"\n *   // roomName=\"my-room\"\n *   // :showAlert=\"showAlert\"\n *   // :updateCoHostResponsibility=\"updateCoHostResponsibility\"\n *   // :updateCoHost=\"updateCoHost\"\n *   // :updateIsCoHostModalVisible=\"updateIsCoHostModalVisible\"\n *   // :socket=\"socket\"\n * // />\n * \n * @example With Custom Position and Background\n * // <CoHostModal\n *   // :isCoHostModalVisible=\"showCoHostModal\"\n *   // :onCoHostClose=\"closeCoHostModal\"\n *   // :coHostResponsibility=\"responsibilities\"\n *   // :participants=\"participantsList\"\n *   // :currentCohost=\"currentCoHost\"\n *   // roomName=\"conference-123\"\n *   // :showAlert=\"showAlert\"\n *   // :updateCoHostResponsibility=\"updateResponsibilities\"\n *   // :updateCoHost=\"setCoHost\"\n *   // :updateIsCoHostModalVisible=\"setModalVisibility\"\n *   // :socket=\"socketConnection\"\n *   // position=\"topLeft\"\n *   // backgroundColor=\"#2c3e50\"\n * // />\n * \n * @example Custom Responsibility Labels\n * // <script setup>\n * const customResponsibilityItems = [\n *   { name: 'media', label: '🎤 Media Management' },\n *   { name: 'participants', label: '👥 Participant Control' },\n *   { name: 'chat', label: '💬 Chat Moderation' },\n *   { name: 'waiting', label: '⏱️ Waiting Room' },\n *   { name: 'settings', label: '⚙️ Event Settings' },\n *   { name: 'recording', label: '⏺️ Recording Control' },\n *   { name: 'requests', label: '✋ Media Requests' },\n *   { name: 'screenshare', label: '🖥️ Screen Share Approval' }\n * ];\n * </script>\n * \n * // <template>\n *   <CoHostModal\n *     :isCoHostModalVisible=\"modalOpen\"\n *     :onCoHostClose=\"closeModal\"\n *     :coHostResponsibility=\"responsibilities\"\n *     :participants=\"participants\"\n *     :currentCohost=\"coHost\"\n *     roomName=\"room\"\n *     :showAlert=\"showAlert\"\n *     :updateCoHostResponsibility=\"updateResp\"\n *     :updateCoHost=\"updateCoHost\"\n *     :updateIsCoHostModalVisible=\"updateVisibility\"\n *     :socket=\"socket\"\n *     :responsibilityItems=\"customResponsibilityItems\"\n *   />\n * </template>\n * \n * @example Custom Responsibility Renderer\n * // <script setup>\n * const renderCustomResponsibilityRow = ({ item, isSelected, isDedicated, toggleSelect, toggleDedicated }) => {\n *   // return h('div', {\n *     style: {\n *       display: 'flex',\n *       justifyContent: 'space-between',\n *       alignItems: 'center',\n *       padding: '12px',\n *       backgroundColor: isSelected ? '#e8f5e9' : '#f8f9fa',\n *       borderRadius: '8px',\n *       marginBottom: '8px',\n *       border: isDedicated ? '2px solid #4caf50' : '1px solid #dee2e6'\n *     }\n *   }, [\n *     h('span', { style: { fontWeight: isSelected ? 'bold' : 'normal' } }, item.label),\n *     h('div', { style: { display: 'flex', gap: '15px' } }, [\n *       h('label', { style: { display: 'flex', alignItems: 'center', gap: '5px' } }, [\n *         h('input', { type: 'checkbox', checked: isSelected, onChange: toggleSelect }),\n *         h('span', 'Enable')\n *       ]),\n *       h('label', {\n *         style: {\n *           display: 'flex',\n *           alignItems: 'center',\n *           gap: '5px',\n *           opacity: isSelected ? 1 : 0.5\n *         }\n *       }, [\n *         h('input', {\n *           type: 'checkbox',\n *           checked: isDedicated,\n *           disabled: !isSelected,\n *           onChange: toggleDedicated\n *         }),\n *         h('span', 'Exclusive')\n *       ])\n *     ])\n *   ]);\n * };\n * </script>\n * \n * // <template>\n *   <CoHostModal\n *     :isCoHostModalVisible=\"visible\"\n *     :onCoHostClose=\"close\"\n *     :coHostResponsibility=\"resp\"\n *     :participants=\"parts\"\n *     :currentCohost=\"cohost\"\n *     roomName=\"room\"\n *     :showAlert=\"alert\"\n *     :updateCoHostResponsibility=\"updateResp\"\n *     :updateCoHost=\"updateHost\"\n *     :updateIsCoHostModalVisible=\"updateVis\"\n *     :socket=\"socket\"\n *     :renderResponsibilityRow=\"renderCustomResponsibilityRow\"\n *   />\n * </template>\n * \n * @example Programmatic Co-Host Management\n * // <script setup>\n * const assignCoHost = (participantName: string) => {\n *   // updateCoHost(participantName);\n *   // updateIsCoHostModalVisible(false);\n *   // showAlert({ message: `${participantName} is now co-host`, type: 'success', duration: 3000 });\n * };\n * \n * const grantAllPermissions = () => {\n *   // const allEnabled = coHostResponsibility.map(r => ({\n *     ...r,\n *     value: true,\n *     dedicated: false\n *   }));\n *   // updateCoHostResponsibility(allEnabled);\n * };\n * \n * const revokeAllPermissions = () => {\n *   // const allDisabled = coHostResponsibility.map(r => ({\n *     ...r,\n *     value: false,\n *     dedicated: false\n *   }));\n *   // updateCoHostResponsibility(allDisabled);\n * };\n * </script>\n * \n * // <template>\n *   <div>\n *     <button @click=\"() => updateIsCoHostModalVisible(true)\">Manage Co-Host</button>\n *     <CoHostModal\n *       :isCoHostModalVisible=\"isCoHostModalVisible\"\n *       :onCoHostClose=\"() => updateIsCoHostModalVisible(false)\"\n *       :coHostResponsibility=\"coHostResponsibility\"\n *       :participants=\"participants\"\n *       :currentCohost=\"coHost\"\n *       roomName=\"room\"\n *       :showAlert=\"showAlert\"\n *       :updateCoHostResponsibility=\"updateCoHostResponsibility\"\n *       :updateCoHost=\"updateCoHost\"\n *       :updateIsCoHostModalVisible=\"updateIsCoHostModalVisible\"\n *       :socket=\"socket\"\n *     />\n *   </div>\n * </template>\n * \n * @see {@link modifyCoHostSettings} for server update logic\n * @see {@link CoHostResponsibility} for responsibility data structure\n * @see {@link Socket} for Socket.io integration\n */\n-->\n<template>\n  <RenderVNode :node=\"overlayNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, h, isVNode, defineComponent } from 'vue';\nimport type { PropType, VNodeChild, HTMLAttributes, ButtonHTMLAttributes, InputHTMLAttributes, SelectHTMLAttributes, LabelHTMLAttributes, CSSProperties } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faTimes } from '@fortawesome/free-solid-svg-icons';\nimport { modifyCoHostSettings } from 'mediasfu-shared';\nimport type { Socket } from 'socket.io-client';\n\n// Helper function\nfunction joinClassNames(...classes: Array<string | undefined | null | false>): string | undefined {\n  const result = classes.filter(Boolean).join(' ').trim();\n  return result || undefined;\n}\n\nexport interface CoHostResponsibility {\n  name: string;\n  value: boolean;\n  dedicated: boolean;\n}\n\nexport interface Participant {\n  name: string;\n  islevel?: string;\n  [key: string]: unknown;\n}\n\nexport type ShowAlert = (alert: { message: string; type: 'success' | 'danger'; duration?: number }) => void;\n\nexport interface ModifyCoHostSettingsOptions {\n  roomName: string;\n  showAlert?: ShowAlert;\n  selectedParticipant: string;\n  coHost: string;\n  coHostResponsibility: CoHostResponsibility[];\n  updateCoHostResponsibility: (coHostResponsibility: CoHostResponsibility[]) => void;\n  updateCoHost: (coHost: string) => void;\n  updateIsCoHostModalVisible: (isCoHostModalVisible: boolean) => void;\n  socket: Socket;\n}\n\nexport interface CoHostModalProps {\n  isCoHostModalVisible: boolean;\n  currentCohost?: string;\n  participants: Participant[];\n  coHostResponsibility: CoHostResponsibility[];\n  position?: string;\n  backgroundColor?: string;\n  roomName: string;\n  showAlert?: ShowAlert;\n  updateCoHostResponsibility: (coHostResponsibility: CoHostResponsibility[]) => void;\n  updateCoHost: (coHost: string) => void;\n  updateIsCoHostModalVisible: (isCoHostModalVisible: boolean) => void;\n  socket: Socket;\n  onCoHostClose: () => void;\n  onModifyEventSettings?: (settings: ModifyCoHostSettingsOptions) => void;\n  title?: VNodeChild;\n  overlayProps?: HTMLAttributes;\n  contentProps?: HTMLAttributes;\n  headerProps?: HTMLAttributes;\n  titleProps?: HTMLAttributes;\n  closeButtonProps?: ButtonHTMLAttributes;\n  closeIconComponent?: VNodeChild;\n  headerDividerProps?: HTMLAttributes;\n  bodyProps?: HTMLAttributes;\n  currentCoHostFieldProps?: HTMLAttributes;\n  currentCoHostLabelProps?: LabelHTMLAttributes;\n  currentCoHostInputProps?: InputHTMLAttributes;\n  selectCoHostFieldProps?: HTMLAttributes;\n  selectCoHostLabelProps?: LabelHTMLAttributes;\n  selectCoHostSelectProps?: SelectHTMLAttributes;\n  responsibilitiesWrapperProps?: HTMLAttributes;\n  responsibilitiesHeaderRowProps?: HTMLAttributes;\n  responsibilityHeaderLabelProps?: LabelHTMLAttributes;\n  responsibilitySelectHeaderProps?: LabelHTMLAttributes;\n  responsibilityDedicatedHeaderProps?: LabelHTMLAttributes;\n  responsibilityRowProps?: HTMLAttributes;\n  responsibilityNameProps?: HTMLAttributes;\n  responsibilitySelectProps?: HTMLAttributes;\n  responsibilityDedicatedProps?: HTMLAttributes;\n  responsibilitySelectCheckboxProps?: InputHTMLAttributes;\n  responsibilityDedicatedCheckboxProps?: InputHTMLAttributes;\n  footerProps?: HTMLAttributes;\n  saveButtonProps?: ButtonHTMLAttributes;\n  currentCoHostLabel?: VNodeChild;\n  selectCoHostLabel?: VNodeChild;\n  responsibilityHeaderLabel?: VNodeChild;\n  responsibilitySelectLabel?: VNodeChild;\n  responsibilityDedicatedLabel?: VNodeChild;\n  saveButtonLabel?: VNodeChild;\n  responsibilityItems?: { name: string; label: VNodeChild }[];\n  renderHeader?: (options: { defaultHeader: VNodeChild }) => VNodeChild;\n  renderBody?: (options: { defaultBody: VNodeChild }) => VNodeChild;\n  renderResponsibilities?: (options: {\n    defaultResponsibilities: VNodeChild;\n    items: { name: string; label: VNodeChild }[];\n    responsibilities: Record<string, boolean>;\n    toggleSelect: (name: string) => void;\n    toggleDedicated: (name: string) => void;\n  }) => VNodeChild;\n  renderResponsibilityRow?: (options: {\n    defaultRow: VNodeChild;\n    item: { name: string; label: VNodeChild };\n    index: number;\n    isSelected: boolean;\n    isDedicated: boolean;\n    toggleSelect: () => void;\n    toggleDedicated: () => void;\n  }) => VNodeChild;\n  renderFooter?: (options: { defaultFooter: VNodeChild }) => VNodeChild;\n  renderContent?: (options: { defaultContent: VNodeChild }) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<CoHostModalProps>(), {\n  currentCohost: 'No coHost',\n  position: 'topRight',\n  backgroundColor: '#83c0e9',\n  showAlert: undefined,\n  onModifyEventSettings: undefined,\n  title: 'Manage Co-Host',\n  overlayProps: undefined,\n  contentProps: undefined,\n  headerProps: undefined,\n  titleProps: undefined,\n  closeButtonProps: undefined,\n  closeIconComponent: undefined,\n  headerDividerProps: undefined,\n  bodyProps: undefined,\n  currentCoHostFieldProps: undefined,\n  currentCoHostLabelProps: undefined,\n  currentCoHostInputProps: undefined,\n  selectCoHostFieldProps: undefined,\n  selectCoHostLabelProps: undefined,\n  selectCoHostSelectProps: undefined,\n  responsibilitiesWrapperProps: undefined,\n  responsibilitiesHeaderRowProps: undefined,\n  responsibilityHeaderLabelProps: undefined,\n  responsibilitySelectHeaderProps: undefined,\n  responsibilityDedicatedHeaderProps: undefined,\n  responsibilityRowProps: undefined,\n  responsibilityNameProps: undefined,\n  responsibilitySelectProps: undefined,\n  responsibilityDedicatedProps: undefined,\n  responsibilitySelectCheckboxProps: undefined,\n  responsibilityDedicatedCheckboxProps: undefined,\n  footerProps: undefined,\n  saveButtonProps: undefined,\n  currentCoHostLabel: 'Current Co-host:',\n  selectCoHostLabel: 'Select New Co-host:',\n  responsibilityHeaderLabel: 'Responsibility',\n  responsibilitySelectLabel: 'Select',\n  responsibilityDedicatedLabel: 'Dedicated',\n  saveButtonLabel: 'Save',\n  responsibilityItems: undefined,\n  renderHeader: undefined,\n  renderBody: undefined,\n  renderResponsibilities: undefined,\n  renderResponsibilityRow: undefined,\n  renderFooter: undefined,\n  renderContent: undefined,\n});\n\n// RenderVNode component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Function] as PropType<VNodeChild>,\n      required: true,\n    },\n  },\n  setup(props) {\n    return () => {\n      const node = props.node;\n      if (typeof node === 'function') {\n        return (node as () => VNodeChild)();\n      }\n      if (isVNode(node)) {\n        return node;\n      }\n      return node;\n    };\n  },\n});\n\n// State management\nconst selectedCohost = ref<string>(props.currentCohost || '');\nconst CoHostResponsibilityCopy = ref<CoHostResponsibility[]>([...props.coHostResponsibility]);\nconst CoHostResponsibilityCopyAlt = ref<CoHostResponsibility[]>([...props.coHostResponsibility]);\nconst responsibilities = ref<Record<string, boolean>>({});\n\n// Responsibility items list\nconst defaultResponsibilityItems = [\n  { name: 'manageParticipants', label: 'Manage Participants' },\n  { name: 'manageMedia', label: 'Manage Media' },\n  { name: 'manageWaiting', label: 'Manage Waiting Room' },\n  { name: 'manageChat', label: 'Manage Chat' },\n];\n\nconst responsibilityItemsList = computed(() => props.responsibilityItems ?? defaultResponsibilityItems);\n\n// Filtered participants (exclude current co-host and level '2' participants)\nconst filteredParticipants = computed(() => {\n  return props.participants?.filter(\n    (participant) => participant.name !== props.currentCohost && participant.islevel !== '2'\n  );\n});\n\n// Initialize responsibilities\nconst populateResponsibilities = () => {\n  CoHostResponsibilityCopyAlt.value = [...props.coHostResponsibility];\n  CoHostResponsibilityCopy.value = [...props.coHostResponsibility];\n  \n  const initialResponsibilities = CoHostResponsibilityCopyAlt.value.reduce<Record<string, boolean>>(\n    (acc, item) => {\n      const str2 = item.name.charAt(0).toUpperCase() + item.name.slice(1);\n      const keyed = `manage${str2}`;\n      acc[keyed] = item.value;\n      acc[`dedicateTo${keyed}`] = item.dedicated;\n      return acc;\n    },\n    {}\n  );\n  \n  responsibilities.value = initialResponsibilities;\n};\n\n// Handle toggle\nconst handleToggleSwitch = (responsibility: string) => {\n  responsibilities.value[responsibility] = !responsibilities.value[responsibility];\n\n  if (responsibility.startsWith('dedicateTo')) {\n    const responsibilityName = responsibility.replace('dedicateTomanage', '').toLowerCase();\n    const item = CoHostResponsibilityCopy.value.find((item) => item.name === responsibilityName);\n    if (item) {\n      item.dedicated = !item.dedicated;\n    }\n  } else if (responsibility.startsWith('manage')) {\n    const responsibilityName = responsibility.replace('manage', '').toLowerCase();\n    const item = CoHostResponsibilityCopy.value.find((item) => item.name === responsibilityName);\n    if (item) {\n      item.value = !item.value;\n    }\n  }\n};\n\n// Handle save\nconst handleSave = () => {\n  const modifyFunction = props.onModifyEventSettings || modifyCoHostSettings;\n  modifyFunction({\n    roomName: props.roomName,\n    showAlert: props.showAlert,\n    selectedParticipant: selectedCohost.value,\n    coHost: props.currentCohost || 'No coHost',\n    coHostResponsibility: CoHostResponsibilityCopy.value,\n    updateCoHostResponsibility: props.updateCoHostResponsibility,\n    updateCoHost: props.updateCoHost,\n    updateIsCoHostModalVisible: props.updateIsCoHostModalVisible,\n    socket: props.socket,\n  });\n};\n\n// Watchers\nwatch(\n  () => props.isCoHostModalVisible,\n  (isVisible) => {\n    if (isVisible) {\n      populateResponsibilities();\n    }\n  },\n  { immediate: true }\n);\n\nwatch(\n  () => props.coHostResponsibility,\n  () => {\n    if (props.isCoHostModalVisible) {\n      populateResponsibilities();\n    }\n  },\n  { deep: true }\n);\n\n// Styles computation\nconst defaultOverlayWidth = typeof window !== 'undefined' ? Math.min(window.innerWidth * 0.8, 400) : 320;\n\nconst overlayStyle = computed<CSSProperties>(() => ({\n  position: 'fixed',\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  display: props.isCoHostModalVisible ? 'block' : 'none',\n  zIndex: 999,\n  ...(props.overlayProps?.style as CSSProperties ?? {}),\n}));\n\nconst contentStyle = computed<CSSProperties>(() => ({\n  position: 'fixed',\n  backgroundColor: props.backgroundColor,\n  borderRadius: '10px',\n  padding: '16px',\n  width: `${defaultOverlayWidth}px`,\n  maxHeight: '65%',\n  maxWidth: `${defaultOverlayWidth}px`,\n  overflow: 'hidden',\n  top: props.position.includes('top') ? '10px' : 'auto',\n  bottom: props.position.includes('bottom') ? '10px' : 'auto',\n  left: props.position.includes('Left') ? '10px' : 'auto',\n  right: props.position.includes('Right') ? '10px' : 'auto',\n  display: 'flex',\n  flexDirection: 'column',\n  gap: '12px',\n  boxShadow: '0 10px 30px rgba(0, 0, 0, 0.25)',\n  ...(props.contentProps?.style as CSSProperties ?? {}),\n}));\n\n// Event handlers\nconst handleCloseClick = (event: Event) => {\n  const clickHandler = props.closeButtonProps?.onClick;\n  if (clickHandler) {\n    clickHandler(event as unknown as PointerEvent);\n  }\n  if (!(event as Event & { defaultPrevented?: boolean }).defaultPrevented) {\n    props.onCoHostClose();\n  }\n};\n\nconst handleSaveClick = (event: Event) => {\n  const clickHandler = props.saveButtonProps?.onClick;\n  if (clickHandler) {\n    clickHandler(event as unknown as PointerEvent);\n  }\n  if (!(event as Event & { defaultPrevented?: boolean }).defaultPrevented) {\n    handleSave();\n  }\n};\n\n// Build overlayNode\nconst overlayNode = computed(() => {\n  const { class: overlayClassName, ...restOverlayProps } = props.overlayProps ?? {};\n  const { class: contentClassName, ...restContentProps } = props.contentProps ?? {};\n  const { class: headerClassName, style: headerStyleOverrides, ...restHeaderProps } = props.headerProps ?? {};\n  const { class: titleClassName, style: titleStyleOverrides, ...restTitleProps } = props.titleProps ?? {};\n  const { class: closeButtonClassName, style: closeButtonStyleOverrides, onClick: _closeButtonOnClick, ...restCloseButtonProps } = props.closeButtonProps ?? {};\n  const { style: headerDividerStyleOverrides, ...restHeaderDividerProps } = props.headerDividerProps ?? {};\n  const { class: bodyClassName, style: bodyStyleOverrides, ...restBodyProps } = props.bodyProps ?? {};\n  \n  // Styles\n  const headerStyle: CSSProperties = {\n    display: 'flex',\n    justifyContent: 'space-between',\n    alignItems: 'center',\n    gap: '12px',\n    ...(headerStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const titleStyle: CSSProperties = {\n    margin: 0,\n    fontSize: '1.25rem',\n    fontWeight: 700,\n    color: 'black',\n    ...(titleStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const closeButtonStyle: CSSProperties = {\n    background: 'none',\n    border: 'none',\n    padding: '4px',\n    cursor: 'pointer',\n    display: 'inline-flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n    color: 'black',\n    ...(closeButtonStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const headerDividerStyle: CSSProperties = {\n    height: '1px',\n    backgroundColor: 'black',\n    marginTop: '5px',\n    marginBottom: '5px',\n    border: 'none',\n    ...(headerDividerStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const bodyStyle: CSSProperties = {\n    display: 'flex',\n    flexDirection: 'column',\n    gap: '16px',\n    overflowY: 'auto',\n    ...(bodyStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const defaultCloseIcon = props.closeIconComponent ?? h(FontAwesomeIcon, { icon: faTimes, class: 'icon' });\n\n  const defaultHeader = h(\n    'div',\n    {\n      class: joinClassNames('modal-header', headerClassName as string | undefined),\n      style: headerStyle,\n      ...restHeaderProps,\n    },\n    [\n      h(\n        'div',\n        {\n          class: joinClassNames('modal-title', titleClassName as string | undefined),\n          style: titleStyle,\n          ...restTitleProps,\n        },\n        [props.title]\n      ),\n      h(\n        'button',\n        {\n          type: 'button',\n          class: joinClassNames('btn-close-settings', closeButtonClassName as string | undefined),\n          style: closeButtonStyle,\n          onClick: handleCloseClick,\n          ...restCloseButtonProps,\n        },\n        [defaultCloseIcon]\n      ),\n    ]\n  );\n\n  const headerNode = props.renderHeader\n    ? props.renderHeader({ defaultHeader })\n    : defaultHeader;\n\n  // Body fields and responsibilities\n  const { class: currentCoHostFieldClassName, style: currentCoHostFieldStyleOverrides, ...restCurrentCoHostFieldProps } = props.currentCoHostFieldProps ?? {};\n  const { class: currentCoHostLabelClassName, style: currentCoHostLabelStyleOverrides, ...restCurrentCoHostLabelProps } = props.currentCoHostLabelProps ?? {};\n  const { class: currentCoHostInputClassName, style: currentCoHostInputStyleOverrides, ...restCurrentCoHostInputProps } = props.currentCoHostInputProps ?? {};\n  const { class: selectCoHostFieldClassName, style: selectCoHostFieldStyleOverrides, ...restSelectCoHostFieldProps } = props.selectCoHostFieldProps ?? {};\n  const { class: selectCoHostLabelClassName, style: selectCoHostLabelStyleOverrides, ...restSelectCoHostLabelProps } = props.selectCoHostLabelProps ?? {};\n  const { class: selectCoHostSelectClassName, style: selectCoHostSelectStyleOverrides, ...restSelectCoHostSelectProps } = props.selectCoHostSelectProps ?? {};\n\n  const currentCoHostField = h(\n    'div',\n    {\n      class: joinClassNames('form-group', currentCoHostFieldClassName as string | undefined),\n      style: currentCoHostFieldStyleOverrides as CSSProperties ?? {},\n      ...restCurrentCoHostFieldProps,\n    },\n    [\n      h(\n        'label',\n        {\n          class: joinClassNames('font-weight-bold', currentCoHostLabelClassName as string | undefined),\n          style: currentCoHostLabelStyleOverrides as CSSProperties ?? {},\n          ...restCurrentCoHostLabelProps,\n        },\n        [props.currentCoHostLabel]\n      ),\n      h('input', {\n        class: joinClassNames('form-control', currentCoHostInputClassName as string | undefined),\n        style: currentCoHostInputStyleOverrides as CSSProperties ?? {},\n        value: props.currentCohost,\n        readonly: true,\n        ...restCurrentCoHostInputProps,\n      }),\n    ]\n  );\n\n  const handleSelectChange = (event: Event) => {\n    const target = event.target as HTMLSelectElement;\n    selectedCohost.value = target.value;\n  };\n\n  const selectCoHostField = h(\n    'div',\n    {\n      class: joinClassNames('form-group', selectCoHostFieldClassName as string | undefined),\n      style: selectCoHostFieldStyleOverrides as CSSProperties ?? {},\n      ...restSelectCoHostFieldProps,\n    },\n    [\n      h(\n        'label',\n        {\n          class: joinClassNames('font-weight-bold', selectCoHostLabelClassName as string | undefined),\n          style: selectCoHostLabelStyleOverrides as CSSProperties ?? {},\n          ...restSelectCoHostLabelProps,\n        },\n        [props.selectCoHostLabel]\n      ),\n      h(\n        'select',\n        {\n          class: joinClassNames('form-control', selectCoHostSelectClassName as string | undefined),\n          style: selectCoHostSelectStyleOverrides as CSSProperties ?? {},\n          onChange: handleSelectChange,\n          ...restSelectCoHostSelectProps,\n        },\n        [\n          h('option', { value: '' }, 'Select a participant'),\n          ...(filteredParticipants.value?.map((participant: Participant) =>\n            h('option', { value: participant.name, key: participant.name }, participant.name)\n          ) ?? []),\n        ]\n      ),\n    ]\n  );\n\n  // Responsibilities rendering\n  const renderResponsibilitiesContent = () => {\n    const { class: responsibilitiesWrapperClassName, style: responsibilitiesWrapperStyleOverrides, ...restResponsibilitiesWrapperProps } = props.responsibilitiesWrapperProps ?? {};\n    const { class: responsibilitiesHeaderRowClassName, style: responsibilitiesHeaderRowStyleOverrides, ...restResponsibilitiesHeaderRowProps } = props.responsibilitiesHeaderRowProps ?? {};\n    \n    const responsibilitiesHeader = h(\n      'div',\n      {\n        class: joinClassNames('responsibility-header', responsibilitiesHeaderRowClassName as string | undefined),\n        style: {\n          display: 'flex',\n          alignItems: 'center',\n          marginBottom: '10px',\n          borderBottom: '1px solid #ccc',\n          paddingBottom: '5px',\n          ...(responsibilitiesHeaderRowStyleOverrides as CSSProperties ?? {}),\n        },\n        ...restResponsibilitiesHeaderRowProps,\n      },\n      [\n        h('div', { class: 'col-5', style: { width: '41.67%' } }, [\n          h('label', { class: 'font-weight-bold' }, [props.responsibilityHeaderLabel]),\n        ]),\n        h('div', { class: 'col-3', style: { width: '25%', justifyContent: 'center', display: 'flex' } }, [\n          h('label', { class: 'font-weight-bold' }, [props.responsibilitySelectLabel]),\n        ]),\n        h('div', { class: 'col-4', style: { width: '33.33%', justifyContent: 'center', display: 'flex' } }, [\n          h('label', { class: 'font-weight-bold' }, [props.responsibilityDedicatedLabel]),\n        ]),\n      ]\n    );\n\n    const responsibilityRows = responsibilityItemsList.value.map((item, index) => {\n      const isSelected = responsibilities.value[item.name] ?? false;\n      const isDedicated = (responsibilities.value[item.name] && responsibilities.value[`dedicateTo${item.name}`]) ?? false;\n      \n      const toggleSelect = () => handleToggleSwitch(item.name);\n      const toggleDedicated = () => handleToggleSwitch(`dedicateTo${item.name}`);\n\n      const defaultRow = h(\n        'div',\n        {\n          key: item.name,\n          class: 'responsibility-row',\n          style: {\n            display: 'flex',\n            alignItems: 'center',\n            marginBottom: '10px',\n          },\n        },\n        [\n          h('div', { class: 'col-5 font-weight-bold', style: { width: '41.67%' } }, [item.label]),\n          h('div', { class: 'col-3', style: { width: '25%', justifyContent: 'center', display: 'flex' } }, [\n            h('input', {\n              type: 'checkbox',\n              checked: isSelected,\n              onChange: toggleSelect,\n              style: { width: '18px', height: '18px', cursor: 'pointer' },\n            }),\n          ]),\n          h('div', { class: 'col-4', style: { width: '33.33%', justifyContent: 'center', display: 'flex' } }, [\n            h('input', {\n              type: 'checkbox',\n              checked: isDedicated,\n              disabled: !isSelected,\n              onChange: toggleDedicated,\n              style: { width: '18px', height: '18px', cursor: !isSelected ? 'not-allowed' : 'pointer', opacity: !isSelected ? 0.5 : 1 },\n            }),\n          ]),\n        ]\n      );\n\n      if (props.renderResponsibilityRow) {\n        return props.renderResponsibilityRow({\n          defaultRow,\n          item,\n          index,\n          isSelected,\n          isDedicated,\n          toggleSelect,\n          toggleDedicated,\n        });\n      }\n\n      return defaultRow;\n    });\n\n    const defaultResponsibilities = h(\n      'div',\n      {\n        class: joinClassNames('responsibilities-wrapper', responsibilitiesWrapperClassName as string | undefined),\n        style: responsibilitiesWrapperStyleOverrides as CSSProperties ?? {},\n        ...restResponsibilitiesWrapperProps,\n      },\n      [responsibilitiesHeader, ...responsibilityRows]\n    );\n\n    if (props.renderResponsibilities) {\n      return props.renderResponsibilities({\n        defaultResponsibilities,\n        items: responsibilityItemsList.value,\n        responsibilities: responsibilities.value,\n        toggleSelect: handleToggleSwitch,\n        toggleDedicated: (name: string) => handleToggleSwitch(`dedicateTo${name}`),\n      });\n    }\n\n    return defaultResponsibilities;\n  };\n\n  const defaultBody = h(\n    'div',\n    {\n      class: joinClassNames('modal-body', bodyClassName as string | undefined),\n      style: bodyStyle,\n      ...restBodyProps,\n    },\n    [currentCoHostField, selectCoHostField, renderResponsibilitiesContent()]\n  );\n\n  const bodyNode = props.renderBody\n    ? props.renderBody({ defaultBody })\n    : defaultBody;\n\n  // Footer\n  const { class: footerClassName, style: footerStyleOverrides, ...restFooterProps } = props.footerProps ?? {};\n  const { class: saveButtonClassName, style: saveButtonStyleOverrides, onClick: _saveButtonOnClick, ...restSaveButtonProps } = props.saveButtonProps ?? {};\n\n  const footerStyle: CSSProperties = {\n    display: 'flex',\n    justifyContent: 'flex-end',\n    gap: '8px',\n    ...(footerStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const saveButtonStyle: CSSProperties = {\n    ...(saveButtonStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const defaultFooter = h(\n    'div',\n    {\n      class: joinClassNames('modal-footer', footerClassName as string | undefined),\n      style: footerStyle,\n      ...restFooterProps,\n    },\n    [\n      h(\n        'button',\n        {\n          class: joinClassNames('btn-apply-settings', saveButtonClassName as string | undefined),\n          style: saveButtonStyle,\n          onClick: handleSaveClick,\n          ...restSaveButtonProps,\n        },\n        [props.saveButtonLabel]\n      ),\n    ]\n  );\n\n  const footerNode = props.renderFooter\n    ? props.renderFooter({ defaultFooter })\n    : defaultFooter;\n\n  const defaultContent = h(\n    'div',\n    {\n      class: joinClassNames('mediasfu-cohost-modal__content', contentClassName as string | undefined),\n      style: contentStyle.value,\n      ...restContentProps,\n    },\n    [\n      headerNode,\n      h('hr', { style: headerDividerStyle, ...restHeaderDividerProps }),\n      bodyNode,\n      footerNode,\n    ]\n  );\n\n  const contentNode = props.renderContent\n    ? props.renderContent({ defaultContent })\n    : defaultContent;\n\n  return h(\n    'div',\n    {\n      class: joinClassNames('mediasfu-cohost-modal', overlayClassName as string | undefined),\n      style: overlayStyle.value,\n      ...restOverlayProps,\n    },\n    [contentNode]\n  );\n});\n</script>\n\n<style scoped>\n.modal-overlay {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background-color: rgba(0, 0, 0, 0.5);\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  z-index: 999;\n}\n\n.modal-container {\n  display: flex;\n  flex-direction: column;\n}\n\n.modal-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-bottom: 10px;\n}\n\n.modal-title {\n  font-size: 1.25rem;\n  font-weight: bold;\n  color: black;\n}\n\n.btn-close {\n  border: none;\n  background: none;\n  cursor: pointer;\n  padding: 0;\n  color: black;\n  font-size: 1.2rem;\n}\n\n.btn-close:hover {\n  opacity: 0.7;\n}\n\n.divider {\n  height: 1px;\n  background-color: black;\n  border: none;\n  margin: 10px 0;\n}\n\n.modal-body {\n  flex: 1;\n  overflow-y: auto;\n}\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n.form-group label {\n  display: block;\n  margin-bottom: 5px;\n  font-size: 0.95rem;\n}\n\n.font-weight-bold {\n  font-weight: bold;\n}\n\n.form-control {\n  width: 100%;\n  padding: 8px 12px;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  font-size: 1rem;\n  background-color: white;\n}\n\n.form-control:read-only {\n  background-color: #e9ecef;\n}\n\n.responsibility-header,\n.responsibility-row {\n  display: flex;\n  align-items: center;\n  margin-bottom: 10px;\n}\n\n.responsibility-header {\n  border-bottom: 1px solid #ccc;\n  padding-bottom: 5px;\n}\n\n.col-3,\n.col-4,\n.col-5 {\n  display: flex;\n  align-items: center;\n}\n\n.col-3 {\n  width: 25%;\n  justify-content: center;\n}\n\n.col-4 {\n  width: 33.33%;\n  justify-content: center;\n}\n\n.col-5 {\n  width: 41.67%;\n}\n\n.modal-footer {\n  display: flex;\n  justify-content: flex-end;\n  margin-top: 15px;\n  padding-top: 10px;\n  border-top: 1px solid #ccc;\n}\n\n.btn-save {\n  background-color: #007bff;\n  color: white;\n  border: none;\n  border-radius: 4px;\n  padding: 8px 16px;\n  cursor: pointer;\n  font-size: 1rem;\n  transition: background-color 0.2s;\n}\n\n.btn-save:hover {\n  background-color: #0056b3;\n}\n\ninput[type='checkbox'] {\n  width: 18px;\n  height: 18px;\n  cursor: pointer;\n}\n\ninput[type='checkbox']:disabled {\n  cursor: not-allowed;\n  opacity: 0.5;\n}\n</style>\n","<!--\n/**\n * @fileoverview ParticipantListItem - Individual participant row with controls\n * @component ParticipantListItem\n * @module components/participantsComponents/ParticipantListItem\n * \n * @description\n * A single participant row displaying name, mute status, and action buttons (mute, message, remove).\n * Handles permission checks for hosts/co-hosts and provides interactive controls for participant\n * management. Shows \"(host)\" label for hosts and displays appropriate icons based on mute state.\n * \n * Features:\n * - Participant name display with host indicator\n * - Mute status indicator (red=muted, green=unmuted)\n * - Mute/unmute button (permission-based)\n * - Direct message button\n * - Remove participant button (permission-based)\n * - Co-host permission checks\n * - Broadcast mode support (hides controls)\n * - Permission validation with alerts\n * \n * Control Buttons:\n * - **Mute Button** (blue): Toggle participant's audio (faMicrophone/faMicrophoneSlash icon)\n * - **Message Button** (blue): Start direct message with participant (faComment icon)\n * - **Remove Button** (red): Remove participant from meeting (faTrash icon)\n * \n * Permission Levels:\n * - **islevel='2'** (Host): Full control over all participants\n * - **islevel='1'** (Co-host): Control based on coHostResponsibility array\n * - **islevel='0'** (Participant): No control buttons (except in some contexts)\n * \n * @example Basic Participant Item (Host View)\n * // <ParticipantListItem\n *   // :participant=\"participant\"\n *   // :isBroadcast=\"false\"\n *   // :socket=\"socket\"\n *   // member=\"host_user\"\n *   // islevel=\"2\"\n *   // coHost=\"\"\n *   // roomName=\"meeting-123\"\n *   // :coHostResponsibility=\"[]\"\n *   // :onMuteParticipants=\"muteHandler\"\n *   // :onMessageParticipants=\"messageHandler\"\n *   // :onRemoveParticipants=\"removeHandler\"\n *   // :showAlert=\"alertFunction\"\n *   // :updateIsMessagesModalVisible=\"setModalVisible\"\n *   // :updateDirectMessageDetails=\"setMessageDetails\"\n *   // :updateStartDirectMessage=\"setStartMessage\"\n *   // :participants=\"allParticipants\"\n *   // :updateParticipants=\"setParticipants\"\n * // />\n * \n * @example Co-host with Limited Permissions\n * // <ParticipantListItem\n *   // :participant=\"participant\"\n *   // :isBroadcast=\"false\"\n *   // :socket=\"socket\"\n *   // member=\"cohost_user\"\n *   // islevel=\"1\"\n *   // coHost=\"cohost_user\"\n *   // roomName=\"meeting-456\"\n *   // :coHostResponsibility=\"[{ name: 'participants', value: true, dedicated: true }]\"\n *   // :onMuteParticipants=\"muteHandler\"\n *   // :onMessageParticipants=\"messageHandler\"\n *   // :onRemoveParticipants=\"removeHandler\"\n *   // :showAlert=\"alertFunction\"\n *   // :updateIsMessagesModalVisible=\"setModalVisible\"\n *   // :updateDirectMessageDetails=\"setMessageDetails\"\n *   // :updateStartDirectMessage=\"setStartMessage\"\n *   // :participants=\"allParticipants\"\n *   // :updateParticipants=\"setParticipants\"\n * // />\n * \n * @example Broadcast Mode (No Controls)\n * // <ParticipantListItem\n *   // :participant=\"viewer\"\n *   // :isBroadcast=\"true\"\n *   // :socket=\"socket\"\n *   // member=\"broadcaster\"\n *   // islevel=\"2\"\n *   // coHost=\"\"\n *   // roomName=\"broadcast-789\"\n *   // :coHostResponsibility=\"[]\"\n *   // :onMuteParticipants=\"() => {}\"\n *   // :onMessageParticipants=\"() => {}\"\n *   // :onRemoveParticipants=\"() => {}\"\n *   // :showAlert=\"alertFunction\"\n *   // :updateIsMessagesModalVisible=\"() => {}\"\n *   // :updateDirectMessageDetails=\"() => {}\"\n *   // :updateStartDirectMessage=\"() => {}\"\n *   // :participants=\"[]\"\n *   // :updateParticipants=\"() => {}\"\n * // />\n * \n * @remarks\n * Permission checks are performed before each action. If the current user doesn't have\n * permission, an alert is shown explaining why. Co-hosts must have the \"participants\"\n * responsibility with `value: true` and `dedicated: true` to control other participants.\n * \n * Workflow:\n * 1. Renders participant name (appends \"(host)\" if islevel='2')\n * 2. If not broadcast mode → Shows mute indicator (faDotCircle: red/green)\n * 3. User clicks Mute button → Checks permission → Calls onMuteParticipants\n * 4. User clicks Message button → Opens direct message UI\n * 5. User clicks Remove button → Checks permission → Calls onRemoveParticipants\n * 6. Permission denied → Shows alert with explanation\n * \n * @see {@link ParticipantList} - Container that renders multiple ParticipantListItems\n * @see {@link ParticipantsModal} - Modal containing the full participant list\n */\n-->\n<template>\n  <div\n    class=\"container\"\n    :style=\"{\n      display: 'flex',\n      flexDirection: 'row',\n      alignItems: 'center',\n      marginBottom: '0px',\n      marginTop: '0px',\n      gap: '8px',\n    }\"\n  >\n    <div\n      class=\"nameContainer\"\n      :style=\"{ flex: '4' }\"\n    >\n      <p\n        class=\"nameText\"\n        :style=\"{ fontSize: '16px', margin: '0' }\"\n      >\n        {{\n          participant.islevel === '2'\n            ? `${participant.name} (host)`\n            : participant.name\n        }}\n      </p>\n    </div>\n    <template v-if=\"!isBroadcast\">\n      <div\n        class=\"iconContainer\"\n        :style=\"{ flex: '1', alignItems: 'center' }\"\n      >\n        <font-awesome-icon\n          :icon=\"faDotCircle\"\n          :style=\"{\n            fontSize: '20px',\n            color: participant.muted ? 'red' : 'green',\n          }\"\n        />\n      </div>\n      <div\n        class=\"buttonContainer\"\n        :style=\"{ flex: '2', alignItems: 'flex-end' }\"\n      >\n        <button\n          :style=\"{\n            padding: '5px',\n            borderRadius: '5px',\n            display: 'inline-flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n            backgroundColor: '#007bff',\n            color: 'white',\n            border: 'none',\n            cursor: 'pointer',\n          }\"\n          @click=\"handleMute\"\n        >\n          <font-awesome-icon\n            :icon=\"muteIcon\"\n            :style=\"{ fontSize: '20px' }\"\n          />\n        </button>\n      </div>\n      <div\n        class=\"buttonContainer\"\n        :style=\"{ flex: '2', alignItems: 'flex-end' }\"\n      >\n        <button\n          :style=\"{\n            padding: '5px',\n            borderRadius: '5px',\n            display: 'inline-flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n            backgroundColor: '#007bff',\n            color: 'white',\n            border: 'none',\n            cursor: 'pointer',\n          }\"\n          @click=\"handleMessage\"\n        >\n          <font-awesome-icon\n            :icon=\"faComment\"\n            :style=\"{ fontSize: '20px', color: 'white' }\"\n          />\n        </button>\n      </div>\n    </template>\n    <div\n      class=\"buttonContainer\"\n      :style=\"{ flex: '2', alignItems: 'flex-end' }\"\n    >\n      <button\n        :style=\"{\n          padding: '5px',\n          borderRadius: '5px',\n          display: 'inline-flex',\n          alignItems: 'center',\n          justifyContent: 'center',\n          backgroundColor: '#dc3545',\n          color: 'white',\n          border: 'none',\n          cursor: 'pointer',\n        }\"\n        @click=\"handleRemove\"\n      >\n        <font-awesome-icon\n          :icon=\"faTrash\"\n          :style=\"{ fontSize: '20px', color: 'white' }\"\n        />\n      </button>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport {\n  faMicrophone,\n  faMicrophoneSlash,\n  faComment,\n  faTrash,\n  faDotCircle,\n} from '@fortawesome/free-solid-svg-icons';\nimport type {\n  Participant,\n  MuteParticipantsType,\n  MessageParticipantsType,\n  RemoveParticipantsType,\n  ShowAlert,\n  CoHostResponsibility,\n} from '../../../../SharedTypes';\nimport type { Socket } from 'socket.io-client';\n\n/**\n * Props for the ParticipantListItem component\n * @interface ParticipantListItemProps\n * \n * @property {Participant} participant - Participant object with name, islevel, muted status\n * @property {boolean} isBroadcast - Whether in broadcast mode (hides mute/message buttons)\n * @property {MuteParticipantsType} onMuteParticipants - Function to mute/unmute participants\n * @property {MessageParticipantsType} onMessageParticipants - Function to send direct messages\n * @property {RemoveParticipantsType} onRemoveParticipants - Function to remove participants\n * @property {Socket} socket - Socket.io client instance\n * @property {CoHostResponsibility[]} coHostResponsibility - Co-host permissions array\n * @property {string} member - Current user's username\n * @property {string} islevel - Current user's level ('0'=participant, '1'=co-host, '2'=host)\n * @property {ShowAlert} [showAlert] - Function to display alert messages\n * @property {string} coHost - Username of the co-host\n * @property {string} roomName - Current room name\n * @property {(isVisible: boolean) => void} updateIsMessagesModalVisible - Function to toggle messages modal\n * @property {(details: any) => void} updateDirectMessageDetails - Function to set direct message details\n * @property {(value: boolean) => void} updateStartDirectMessage - Function to start direct messaging\n * @property {Participant[]} participants - Full participants array\n * @property {(participants: Participant[]) => void} updateParticipants - Function to update participants list\n * \n * @example\n * ```typescript\n * // <ParticipantListItem\n *   // :participant=\"{ name: 'John', islevel: '0', muted: false }\"\n *   // :isBroadcast=\"false\"\n *   // :socket=\"socket\"\n *   // member=\"host_user\"\n *   // islevel=\"2\"\n *   // coHost=\"\"\n *   // roomName=\"meeting-123\"\n *   // :coHostResponsibility=\"[]\"\n *   // :onMuteParticipants=\"muteHandler\"\n *   // :onMessageParticipants=\"messageHandler\"\n *   // :onRemoveParticipants=\"removeHandler\"\n *   // :showAlert=\"alertFunction\"\n *   // :updateIsMessagesModalVisible=\"setModalVisible\"\n *   // :updateDirectMessageDetails=\"setDetails\"\n *   // :updateStartDirectMessage=\"setStartMessage\"\n *   // :participants=\"allParticipants\"\n *   // :updateParticipants=\"setParticipants\"\n * // />\n * ```\n */\nexport interface ParticipantListItemProps {\n  participant: Participant;\n  isBroadcast: boolean;\n  onMuteParticipants: MuteParticipantsType;\n  onMessageParticipants: MessageParticipantsType;\n  onRemoveParticipants: RemoveParticipantsType;\n  socket: Socket;\n  coHostResponsibility: CoHostResponsibility[];\n  member: string;\n  islevel: string;\n  showAlert?: ShowAlert;\n  coHost: string;\n  roomName: string;\n  updateIsMessagesModalVisible: (isVisible: boolean) => void;\n  updateDirectMessageDetails: (participant: Participant | null) => void;\n  updateStartDirectMessage: (start: boolean) => void;\n  participants: Participant[];\n  updateParticipants: (participants: Participant[]) => void;\n}\n\nconst props = defineProps<ParticipantListItemProps>();\n\n\nconst muteIcon = computed(() =>\n  props.participant.muted ? faMicrophoneSlash : faMicrophone\n);\n\nconst handleMute = () => {\n  props.onMuteParticipants({\n    socket: props.socket,\n    coHostResponsibility: props.coHostResponsibility,\n    participant: props.participant,\n    member: props.member,\n    islevel: props.islevel,\n    showAlert: props.showAlert,\n    coHost: props.coHost,\n    roomName: props.roomName,\n  });\n};\n\nconst handleMessage = () => {\n  props.onMessageParticipants({\n    coHostResponsibility: props.coHostResponsibility,\n    participant: props.participant,\n    member: props.member,\n    islevel: props.islevel,\n    showAlert: props.showAlert,\n    coHost: props.coHost,\n    updateIsMessagesModalVisible: props.updateIsMessagesModalVisible,\n    updateDirectMessageDetails: props.updateDirectMessageDetails,\n    updateStartDirectMessage: props.updateStartDirectMessage,\n  });\n};\n\nconst handleRemove = () => {\n  props.onRemoveParticipants({\n    coHostResponsibility: props.coHostResponsibility,\n    participant: props.participant,\n    member: props.member,\n    islevel: props.islevel,\n    showAlert: props.showAlert,\n    coHost: props.coHost,\n    participants: props.participants,\n  socket: props.socket,\n    roomName: props.roomName,\n    updateParticipants: props.updateParticipants,\n  });\n};\n</script>\n","<!--\n/**\n * @fileoverview ParticipantList - Container for rendering all participant list items\n * @component ParticipantList\n * @module components/participantsComponents/ParticipantList\n * \n * @description\n * A container component that renders a list of all participants with separators between\n * each item. Passes all necessary props to individual ParticipantListItem components\n * for rendering participant controls (mute, message, remove). Used in ParticipantsModal\n * to display the full participant roster with host/co-host controls.\n * \n * Features:\n * - Renders array of participants with ParticipantListItem\n * - Horizontal rule separators between items\n * - Passes socket and control functions to children\n * - Supports broadcast mode (disables certain controls)\n * - Co-host responsibility checks for permissions\n * - Direct messaging integration\n * \n * @example Basic Participant List\n * // <ParticipantList\n *   // :participants=\"allParticipants\"\n *   // :isBroadcast=\"false\"\n *   // :socket=\"socketInstance\"\n *   // :member=\"currentUsername\"\n *   // :islevel=\"'1'\"\n *   // :coHost=\"coHostName\"\n *   // roomName=\"meeting-room-123\"\n *   // :coHostResponsibility=\"coHostPermissions\"\n *   // :onMuteParticipants=\"handleMute\"\n *   // :onMessageParticipants=\"handleMessage\"\n *   // :onRemoveParticipants=\"handleRemove\"\n *   // :showAlert=\"showAlertFunction\"\n *   // :updateIsMessagesModalVisible=\"setMessagesModalVisible\"\n *   // :updateDirectMessageDetails=\"setDirectMessageDetails\"\n *   // :updateStartDirectMessage=\"setStartDirectMessage\"\n *   // :updateParticipants=\"setParticipants\"\n * // />\n * \n * @example Broadcast Mode (No Controls)\n * // <ParticipantList\n *   // :participants=\"viewers\"\n *   // :isBroadcast=\"true\"\n *   // :socket=\"socket\"\n *   // member=\"host\"\n *   // islevel=\"2\"\n *   // coHost=\"\"\n *   // roomName=\"broadcast-123\"\n *   // :coHostResponsibility=\"[]\"\n *   // :onMuteParticipants=\"() => {}\"\n *   // :onMessageParticipants=\"() => {}\"\n *   // :onRemoveParticipants=\"() => {}\"\n *   // :showAlert=\"showAlert\"\n *   // :updateIsMessagesModalVisible=\"() => {}\"\n *   // :updateDirectMessageDetails=\"() => {}\"\n *   // :updateStartDirectMessage=\"() => {}\"\n *   // :updateParticipants=\"() => {}\"\n * // />\n * \n * @remarks\n * This is a simple container component that handles the layout and iteration.\n * All participant-specific logic (mute button, message button, etc.) is handled\n * by the ParticipantListItem child component.\n * \n * Workflow:\n * 1. Receives array of participants from ParticipantsModal\n * 2. Iterates through participants array\n * 3. Renders ParticipantListItem for each participant\n * 4. Adds <hr> separator between items (except after last item)\n * 5. ParticipantListItem handles all user interactions\n * \n * @see {@link ParticipantListItem} - Individual participant item with controls\n * @see {@link ParticipantsModal} - Modal container for participant lists\n */\n-->\n<template>\n  <div>\n    <template\n      v-for=\"(participant, index) in participants\"\n      :key=\"participant.name\"\n    >\n      <ParticipantListItem\n        :participant=\"participant\"\n        :is-broadcast=\"isBroadcast\"\n        :on-mute-participants=\"onMuteParticipants\"\n        :on-message-participants=\"onMessageParticipants\"\n        :on-remove-participants=\"onRemoveParticipants\"\n        :socket=\"socket\"\n        :co-host-responsibility=\"coHostResponsibility\"\n        :member=\"member\"\n        :islevel=\"islevel\"\n        :show-alert=\"showAlert\"\n        :co-host=\"coHost\"\n        :room-name=\"roomName\"\n        :update-is-messages-modal-visible=\"updateIsMessagesModalVisible\"\n        :update-direct-message-details=\"updateDirectMessageDetails\"\n        :update-start-direct-message=\"updateStartDirectMessage\"\n        :participants=\"participants\"\n        :update-participants=\"updateParticipants\"\n      />\n      <hr\n        v-if=\"index < participants.length - 1\"\n        :key=\"`separator-${index}`\"\n        class=\"separator\"\n      />\n    </template>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport ParticipantListItem from './ParticipantListItem.vue';\nimport type {\n  Participant,\n  MuteParticipantsType,\n  MessageParticipantsType,\n  RemoveParticipantsType,\n  CoHostResponsibility,\n  ShowAlert,\n} from '../../../../SharedTypes';\nimport type { Socket } from 'socket.io-client';\n\n/**\n * Props for the ParticipantList component\n * @interface ParticipantListProps\n * \n * @property {Participant[]} participants - Array of all participants to display\n * @property {boolean} isBroadcast - Whether in broadcast mode (hides controls)\n * @property {MuteParticipantsType} onMuteParticipants - Function to mute/unmute participants\n * @property {MessageParticipantsType} onMessageParticipants - Function to send direct messages\n * @property {RemoveParticipantsType} onRemoveParticipants - Function to remove participants\n * @property {Socket} socket - Socket.io client instance for real-time communication\n * @property {CoHostResponsibility[]} coHostResponsibility - Array of permissions for co-hosts\n * @property {string} member - Current user's username\n * @property {string} islevel - Current user's level ('0'=participant, '1'=co-host, '2'=host)\n * @property {ShowAlert} showAlert - Function to display alert messages\n * @property {string} coHost - Username of the co-host\n * @property {string} roomName - Current room/meeting name\n * @property {(value: boolean) => void} updateIsMessagesModalVisible - Function to toggle messages modal\n * @property {(details: any) => void} updateDirectMessageDetails - Function to set direct message details\n * @property {(value: boolean) => void} updateStartDirectMessage - Function to start direct messaging\n * @property {Participant[]} participants - Participants array (for updates)\n * @property {(participants: Participant[]) => void} updateParticipants - Function to update participants list\n * \n * @example\n * ```typescript\n * // <ParticipantList\n *   // :participants=\"participants\"\n *   // :isBroadcast=\"false\"\n *   // :socket=\"socket\"\n *   // member=\"john_doe\"\n *   // islevel=\"1\"\n *   // coHost=\"jane_admin\"\n *   // roomName=\"meeting-123\"\n *   // :coHostResponsibility=\"['participants']\"\n *   // :onMuteParticipants=\"muteHandler\"\n *   // :onMessageParticipants=\"messageHandler\"\n *   // :onRemoveParticipants=\"removeHandler\"\n *   // :showAlert=\"alertFunction\"\n *   // :updateIsMessagesModalVisible=\"setModalVisible\"\n *   // :updateDirectMessageDetails=\"setMessageDetails\"\n *   // :updateStartDirectMessage=\"setStartMessage\"\n *   // :updateParticipants=\"setParticipants\"\n * // />\n * ```\n */\nexport interface ParticipantListProps {\n  participants: Participant[];\n  isBroadcast: boolean;\n  onMuteParticipants: MuteParticipantsType;\n  onMessageParticipants: MessageParticipantsType;\n  onRemoveParticipants: RemoveParticipantsType;\n  socket: Socket;\n  coHostResponsibility: CoHostResponsibility[];\n  member: string;\n  islevel: string;\n  showAlert?: ShowAlert;\n  coHost: string;\n  roomName: string;\n  updateIsMessagesModalVisible: (isVisible: boolean) => void;\n  updateDirectMessageDetails: (participant: Participant | null) => void;\n  updateStartDirectMessage: (start: boolean) => void;\n  updateParticipants: (participants: Participant[]) => void;\n}\n\ndefineProps<ParticipantListProps>();\n\n</script>\n","<!--\n/**\n * @fileoverview ParticipantListOthersItem - Read-only participant display item\n * @component ParticipantListOthersItem\n * @module components/participantsComponents/ParticipantListOthersItem\n * \n * @description\n * A simple, read-only participant item that displays name and mute status indicator.\n * Shows special labels for hosts, co-hosts, and current user. No action buttons -\n * purely for display purposes. Used in ParticipantListOthers for viewing participants\n * without management controls.\n * \n * Features:\n * - Participant name with role indicators\n * - Mute status indicator (red=muted, green=unmuted)\n * - Special labels: \"(host)\", \"(co-host)\", \"(you)\"\n * - No interactive controls\n * - Simple flex layout\n * \n * Display Labels:\n * - **Host**: \"Name (host)\" or \"Name (you)\" if current user\n * - **Co-host**: \"Name (co-host)\" or \"Name (you)\" if current user\n * - **Current User**: \"Name (you)\"\n * - **Others**: Just the name\n * \n * @example Basic Participant Display\n * // <ParticipantListOthersItem\n *   // :participant=\"{ name: 'John Doe', islevel: '0', muted: false }\"\n *   // member=\"current_user\"\n *   // coHost=\"jane_admin\"\n * // />\n * \n * @example Host Display\n * // <ParticipantListOthersItem\n *   // :participant=\"{ name: 'Jane Admin', islevel: '2', muted: false }\"\n *   // member=\"current_user\"\n *   // coHost=\"\"\n * // />\n * \n * @example Current User (Co-host)\n * // <ParticipantListOthersItem\n *   // :participant=\"{ name: 'current_user', islevel: '1', muted: true }\"\n *   // member=\"current_user\"\n *   // coHost=\"current_user\"\n * // />\n * \n * @example Muted Participant\n * // <ParticipantListOthersItem\n *   // :participant=\"{ name: 'Bob Smith', islevel: '0', muted: true }\"\n *   // member=\"alice\"\n *   // coHost=\"admin\"\n * // />\n * \n * @remarks\n * This component is intentionally simple with no interactive elements. For participant\n * management with mute/message/remove buttons, use ParticipantListItem instead.\n * The mute indicator uses a solid circle icon (faCircle) colored red or green.\n * \n * Workflow:\n * 1. Component receives participant data\n * 2. Computes display name based on islevel and member/coHost props\n * 3. Renders name with appropriate label\n * 4. Shows mute indicator (red if muted, green if unmuted)\n * 5. No user interactions - display only\n * \n * @see {@link ParticipantListOthers} - Container that renders multiple of these items\n * @see {@link ParticipantListItem} - Interactive version with controls\n */\n-->\n<template>\n  <div\n    class=\"container\"\n    :style=\"styles.container\"\n  >\n    <div\n      class=\"name-container\"\n      :style=\"styles.nameContainer\"\n    >\n      <span\n        class=\"name-text\"\n        :style=\"styles.nameText\"\n      >\n        {{ displayName }}\n      </span>\n    </div>\n    <div\n      class=\"icon-container\"\n      :style=\"styles.iconContainer\"\n    >\n      <font-awesome-icon\n        :icon=\"faCircle\"\n        :style=\"{ color: participant.muted ? 'red' : 'green' }\"\n      />\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faCircle } from '@fortawesome/free-solid-svg-icons';\nimport type { Participant } from '../../../../SharedTypes';\n\n/**\n * Props for the ParticipantListOthersItem component\n * @interface ParticipantListOthersItemProps\n * \n * @property {Participant} participant - Participant object with name, islevel, muted status\n * @property {string} member - Current user's username (for \"you\" label)\n * @property {string} coHost - Username of the co-host (for \"co-host\" label)\n * \n * @example\n * ```typescript\n * // <ParticipantListOthersItem\n *   // :participant=\"{ name: 'John', islevel: '0', muted: false }\"\n *   // member=\"current_user\"\n *   // coHost=\"admin\"\n * // />\n * ```\n */\nexport interface ParticipantListOthersItemProps {\n  participant: Participant;\n  member: string;\n  coHost: string;\n}\n\nconst props = defineProps<ParticipantListOthersItemProps>();\n\n\nconst displayName = computed(() => {\n  if (props.participant.islevel === '2') {\n    return props.participant.name === props.member\n      ? `${props.participant.name} (you)`\n      : `${props.participant.name} (host)`;\n  } else {\n    if (props.participant.name === props.member) {\n      return `${props.participant.name} (you)`;\n    }\n    return props.coHost === props.participant.name\n      ? `${props.participant.name} (co-host)`\n      : props.participant.name;\n  }\n});\n\nconst styles = {\n  container: {\n    display: 'flex',\n    flexDirection: 'row' as const,\n    alignItems: 'center',\n    marginBottom: '10px',\n  },\n  nameContainer: {\n    flex: 8,\n  },\n  nameText: {\n    fontSize: '16px',\n  },\n  iconContainer: {\n    flex: 4,\n    alignItems: 'center',\n  },\n};\n</script>\n","<!--\n/**\n * @fileoverview ParticipantListOthers - Read-only participant list without controls\n * @component ParticipantListOthers\n * @module components/participantsComponents/ParticipantListOthers\n * \n * @description\n * A simplified participant list container that displays participants without any action buttons.\n * Used for displaying \"Other Participants\" in contexts where users only need to view the list\n * without mute/message/remove controls. Renders ParticipantListOthersItem components with\n * separators between each item.\n * \n * Features:\n * - Simple read-only participant display\n * - No action buttons (mute, message, remove)\n * - Horizontal rule separators between items\n * - Minimal props (participants, coHost, member)\n * - Lightweight alternative to ParticipantList\n * \n * Use Cases:\n * - Viewing participants without management controls\n * - \"Other Participants\" section in ParticipantsModal\n * - Participant lists for non-privileged users\n * - Display-only participant rosters\n * \n * @example Basic Read-Only List\n * // <ParticipantListOthers\n *   // :participants=\"otherParticipants\"\n *   // coHost=\"jane_admin\"\n *   // member=\"john_doe\"\n * // />\n * \n * @example Empty List\n * // <ParticipantListOthers\n *   // :participants=\"[]\"\n *   // coHost=\"\"\n *   // member=\"current_user\"\n * // />\n * \n * @example With Multiple Participants\n * // <ParticipantListOthers\n *   // :participants=\"[\n *     { name: 'Alice', islevel: '0', muted: false },\n *     { name: 'Bob', islevel: '0', muted: true },\n *     { name: 'Charlie', islevel: '0', muted: false }\n *   ]\"\n *   // coHost=\"admin\"\n *   // member=\"current_user\"\n * // />\n * \n * @remarks\n * This component is intentionally minimal - it only displays participant names and basic\n * information without any interactive controls. For lists with mute/message/remove buttons,\n * use ParticipantList instead.\n * \n * Workflow:\n * 1. Receives array of participants\n * 2. Iterates through participants\n * 3. Renders ParticipantListOthersItem for each (name + visual indicator only)\n * 4. Adds <hr> separator between items (except after last item)\n * 5. No user interactions beyond viewing\n * \n * @see {@link ParticipantListOthersItem} - Individual read-only participant item\n * @see {@link ParticipantList} - Full participant list with controls\n * @see {@link ParticipantsModal} - Modal containing both participant lists\n */\n-->\n<template>\n  <div>\n    <div\n      v-for=\"(participant, index) in participants\"\n      :key=\"participant.name\"\n    >\n      <ParticipantListOthersItem\n        :participant=\"participant\"\n        :co-host=\"coHost\"\n        :member=\"member\"\n      />\n      <hr\n        v-if=\"index < participants.length - 1\"\n        class=\"separator\"\n      />\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport ParticipantListOthersItem from './ParticipantListOthersItem.vue';\nimport type { Participant } from '../../../../SharedTypes';\n\n/**\n * Props for the ParticipantListOthers component\n * @interface ParticipantListOthersProps\n * \n * @property {Participant[]} participants - Array of participants to display (read-only)\n * @property {string} coHost - Username of the co-host\n * @property {string} member - Current user's username\n * \n * @example\n * ```typescript\n * // <ParticipantListOthers\n *   // :participants=\"otherParticipants\"\n *   // coHost=\"admin_user\"\n *   // member=\"current_user\"\n * // />\n * ```\n */\nexport interface ParticipantListOthersProps {\n  participants: Participant[];\n  coHost: string;\n  member: string;\n}\n\ndefineProps<ParticipantListOthersProps>();\n\n</script>\n","<!--\n * ParticipantsModal - Participant management modal\n *\n * @fileoverview\n * A comprehensive modal component for viewing and managing event participants.\n * Displays participant lists separated by role (moderators/attendees), provides\n * search/filter capabilities, and enables host/co-host actions (mute, message, remove).\n * Includes real-time participant count badge and role-based permission controls.\n *\n * @component ParticipantsModal\n * @module components/participantsComponents/ParticipantsModal\n *\n * @description\n * This modal provides a complete participant management interface with:\n * - Real-time participant count badge\n * - Search/filter participants by name\n * - Separate lists for moderators and attendees\n * - Role-based controls (mute, direct message, remove)\n * - Co-host permission checks\n * - Customizable positioning (topRight, topLeft, bottomRight, bottomLeft)\n * - Empty state when no participants\n * - Fully customizable render functions for header, search, lists, body\n * - Integration with MediaSFU participant methods\n *\n * @example\n * // Basic participants modal\n * // <ParticipantsModal\n *   // :is-participants-modal-visible=\"showParticipants\"\n *   // :on-participants-close=\"() => setShowParticipants(false)\"\n *   // :on-participants-filter-change=\"(filter) => handleFilterChange(filter)\"\n *   // :participants-counter=\"participantCount\"\n *   // :parameters=\"{\n *     coHostResponsibility,\n *     coHost,\n *     member,\n *     islevel,\n *     participants,\n *     eventType,\n *     filteredParticipants,\n *     socket,\n *     roomName,\n *     updateIsMessagesModalVisible,\n *     updateDirectMessageDetails,\n *     updateStartDirectMessage,\n *     updateParticipants,\n *     getUpdatedAllParams\n *   }\"\n * // />\n *\n * @example\n * // Custom styled with position and color\n * // <ParticipantsModal\n *   // :is-participants-modal-visible=\"showParticipants\"\n *   // :on-participants-close=\"closeParticipants\"\n *   // :on-participants-filter-change=\"filterParticipants\"\n *   // :participants-counter=\"totalParticipants\"\n *   // :parameters=\"participantsParams\"\n *   // position=\"bottomRight\"\n *   // background-color=\"#1a1a1a\"\n *   // title=\"Event Participants\"\n * // />\n *\n * @example\n * // Custom render functions\n * // <ParticipantsModal\n *   // :is-participants-modal-visible=\"showParticipants\"\n *   // :on-participants-close=\"closeParticipants\"\n *   // :on-participants-filter-change=\"filterParticipants\"\n *   // :participants-counter=\"participantCount\"\n *   // :parameters=\"params\"\n *   // :render-header=\"(options) => {\n *     const { defaultHeader, counter, onClose } = options;\n *     return h('div', { class: 'custom-header' }, [\n *       h('h2', {}, `Participants (${counter})`),\n *       h('button', { onClick: onClose }, 'Close')\n *     ]);\n *   }\"\n *   // :render-search=\"(options) => {\n *     const { defaultSearch, onFilter } = options;\n *     return h('input', {\n *       placeholder: 'Search participants...',\n *       onInput: (e) => onFilter(e.target.value)\n *     });\n *   }\"\n * // />\n *\n * @example\n * // Custom participant lists with overrides\n * // <ParticipantsModal\n *   // :is-participants-modal-visible=\"showParticipants\"\n *   // :on-participants-close=\"closeParticipants\"\n *   // :on-participants-filter-change=\"filterParticipants\"\n *   // :participants-counter=\"participantCount\"\n *   // :parameters=\"params\"\n *   // :render-participant-list=\"CustomModeratorList\"\n *   // :render-participant-list-others=\"CustomAttendeeList\"\n *   // :empty-state=\"(context) => {\n *     return h('div', { class: 'no-participants' }, \n *       `No participants found (Total: ${context.counter})`\n *     );\n *   }\"\n * // />\n *\n * @example\n * // Override participant action methods\n * // <ParticipantsModal\n *   // :is-participants-modal-visible=\"showParticipants\"\n *   // :on-participants-close=\"closeParticipants\"\n *   // :on-participants-filter-change=\"filterParticipants\"\n *   // :participants-counter=\"participantCount\"\n *   // :parameters=\"params\"\n *   // :on-mute-participants=\"customMuteHandler\"\n *   // :on-message-participants=\"customMessageHandler\"\n *   // :on-remove-participants=\"customRemoveHandler\"\n * // />\n-->\n<template>\n  <RenderVNode :node=\"overlayNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { h, isVNode, defineComponent, ref, computed, watch, type PropType, type VNodeChild, type HTMLAttributes, type ButtonHTMLAttributes, type InputHTMLAttributes, type CSSProperties, type Component } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faTimes } from '@fortawesome/free-solid-svg-icons';\nimport ParticipantList from './ParticipantList.vue';\nimport ParticipantListOthers from './ParticipantListOthers.vue';\nimport {\n  muteParticipants,\n  messageParticipants,\n  removeParticipants,\n} from 'mediasfu-shared';\nimport type {\n  CoHostResponsibility,\n  EventType,\n  Participant,\n  ShowAlert,\n} from '../../../../SharedTypes';\nimport type { Socket } from 'socket.io-client';\n\n/**\n * Parameters required by ParticipantsModal for participant management\n * \n * @interface ParticipantsModalParameters\n * @property {string} [position] - Modal position on screen\n * @property {string} [backgroundColor] - Modal background color\n * @property {CoHostResponsibility[]} coHostResponsibility - Array of co-host permissions\n * @property {string} coHost - Co-host identifier\n * @property {string} member - Current user's member ID\n * @property {string} islevel - Current user's permission level ('0'=host, '1'=co-host, '2'=attendee)\n * @property {Participant[]} participants - Full list of event participants\n * @property {EventType} eventType - Type of event (broadcast, conference, webinar, chat)\n * @property {Participant[]} filteredParticipants - Filtered list based on search\n * @property {Socket} socket - Socket.io instance for real-time communication\n * @property {ShowAlert} [showAlert] - Function to show alert messages\n * @property {string} roomName - Event room name/ID\n * @property {(isVisible: boolean) => void} updateIsMessagesModalVisible - Function to toggle messages modal\n * @property {(participant: Participant | null) => void} updateDirectMessageDetails - Function to set direct message target\n * @property {(start: boolean) => void} updateStartDirectMessage - Function to initiate direct messaging\n * @property {(participants: Participant[]) => void} updateParticipants - Function to update participants list\n * @property {() => ParticipantsModalParameters} getUpdatedAllParams - Function to get fresh parameter state\n * @property {unknown} [key] - Additional dynamic parameters\n */\nexport interface ParticipantsModalParameters {\n  position?: string;\n  backgroundColor?: string;\n  coHostResponsibility: CoHostResponsibility[];\n  coHost: string;\n  member: string;\n  islevel: string;\n  participants: Participant[];\n  eventType: EventType;\n  filteredParticipants: Participant[];\n  socket: Socket;\n  showAlert?: ShowAlert;\n  roomName: string;\n  updateIsMessagesModalVisible: (isVisible: boolean) => void;\n  updateDirectMessageDetails: (participant: Participant | null) => void;\n  updateStartDirectMessage: (start: boolean) => void;\n  updateParticipants: (participants: Participant[]) => void;\n  getUpdatedAllParams: () => ParticipantsModalParameters;\n  [key: string]: unknown;\n}\n\n/**\n * ParticipantsModal props interface\n * \n * @interface ParticipantsModalProps\n * @property {boolean} isParticipantsModalVisible - Whether modal is visible\n * @property {() => void} onParticipantsClose - Function to close the modal\n * @property {(filter: string) => void} onParticipantsFilterChange - Function called when search filter changes\n * @property {number} participantsCounter - Total number of participants (for badge display)\n * @property {typeof muteParticipants} [onMuteParticipants=muteParticipants] - Function to mute a participant\n * @default muteParticipants\n * @property {typeof messageParticipants} [onMessageParticipants=messageParticipants] - Function to send direct message to participant\n * @default messageParticipants\n * @property {typeof removeParticipants} [onRemoveParticipants=removeParticipants] - Function to remove a participant from event\n * @default removeParticipants\n * @property {Component} [renderParticipantList=ParticipantList] - Custom component for moderator list rendering\n * @default ParticipantList\n * @property {Component} [renderParticipantListOthers=ParticipantListOthers] - Custom component for attendee list rendering\n * @default ParticipantListOthers\n * @property {ParticipantsModalParameters} parameters - All required parameters for participant operations\n * @property {string} [backgroundColor='#83c0e9'] - Modal background color\n * @default '#83c0e9'\n * @property {string} [position='topRight'] - Modal position ('topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft')\n * @default 'topRight'\n * @property {VNodeChild | string | number} [title='Participants'] - Modal title text or VNode\n * @default 'Participants'\n * @property {HTMLAttributes} [overlayProps] - HTML attributes for overlay backdrop\n * @property {HTMLAttributes} [contentProps] - HTML attributes for modal content container\n * @property {HTMLAttributes} [headerProps] - HTML attributes for header section\n * @property {HTMLAttributes} [titleProps] - HTML attributes for title element\n * @property {HTMLAttributes} [badgeWrapperProps] - HTML attributes for badge wrapper\n * @property {HTMLAttributes} [badgeProps] - HTML attributes for counter badge element\n * @property {ButtonHTMLAttributes} [closeButtonProps] - HTML attributes for close button\n * @property {VNodeChild} [closeIconComponent] - Custom close icon component\n * @property {HTMLAttributes} [bodyProps] - HTML attributes for modal body\n * @property {HTMLAttributes} [searchWrapperProps] - HTML attributes for search wrapper\n * @property {InputHTMLAttributes} [searchInputProps] - HTML attributes for search input\n * @property {HTMLAttributes} [listsWrapperProps] - HTML attributes for lists container\n * @property {HTMLAttributes} [moderatorListProps] - HTML attributes for moderator list section\n * @property {HTMLAttributes} [attendeeListProps] - HTML attributes for attendee list section\n * @property {VNodeChild | ((context: { counter: number }) => VNodeChild)} [emptyState] - Custom empty state when no participants\n * @property {(options: HeaderRenderOptions) => VNodeChild} [renderHeader] - Custom header renderer\n * @example\n * ```typescript\n * renderHeader: ({ defaultHeader, counter, onClose }) => {\n *   // return h('div', { class: 'custom-header' }, [\n *     h('h3', {}, `Participants: ${counter}`),\n *     h('button', { onClick: onClose }, '×')\n *   ]);\n * }\n * ```\n * @property {(options: SearchRenderOptions) => VNodeChild} [renderSearch] - Custom search renderer\n * @property {(options: ListsRenderOptions) => VNodeChild} [renderLists] - Custom lists renderer\n * @property {(options: BodyRenderOptions) => VNodeChild} [renderBody] - Custom body renderer\n * @property {(options: ContentRenderOptions) => VNodeChild} [renderContent] - Custom content renderer\n */\nexport interface ParticipantsModalProps {\n  isParticipantsModalVisible: boolean;\n  onParticipantsClose: () => void;\n  onParticipantsFilterChange: (filter: string) => void;\n  participantsCounter: number;\n  onMuteParticipants?: typeof muteParticipants;\n  onMessageParticipants?: typeof messageParticipants;\n  onRemoveParticipants?: typeof removeParticipants;\n  renderParticipantList?: Component;\n  renderParticipantListOthers?: Component;\n  parameters: ParticipantsModalParameters;\n  backgroundColor?: string;\n  position?: string;\n  title?: VNodeChild | string | number;\n  overlayProps?: HTMLAttributes;\n  contentProps?: HTMLAttributes;\n  headerProps?: HTMLAttributes;\n  titleProps?: HTMLAttributes;\n  badgeWrapperProps?: HTMLAttributes;\n  badgeProps?: HTMLAttributes;\n  closeButtonProps?: ButtonHTMLAttributes;\n  closeIconComponent?: VNodeChild;\n  bodyProps?: HTMLAttributes;\n  searchWrapperProps?: HTMLAttributes;\n  searchInputProps?: InputHTMLAttributes;\n  listsWrapperProps?: HTMLAttributes;\n  moderatorListProps?: HTMLAttributes;\n  attendeeListProps?: HTMLAttributes;\n  emptyState?: VNodeChild | ((context: { counter: number }) => VNodeChild);\n  renderHeader?: (options: {\n    defaultHeader: VNodeChild;\n    counter: number;\n    onClose: () => void;\n  }) => VNodeChild;\n  renderSearch?: (options: {\n    defaultSearch: VNodeChild;\n    onFilter: (value: string) => void;\n  }) => VNodeChild;\n  renderLists?: (options: {\n    defaultLists: VNodeChild;\n    participants: Participant[];\n    hasModeratorControls: boolean;\n  }) => VNodeChild;\n  renderBody?: (options: {\n    defaultBody: VNodeChild;\n    counter: number;\n  }) => VNodeChild;\n  renderContent?: (options: {\n    defaultContent: VNodeChild;\n    counter: number;\n  }) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<ParticipantsModalProps>(), {\n  title: 'Participants',\n  backgroundColor: '#83c0e9',\n  position: 'topRight',\n  onMuteParticipants: () => muteParticipants,\n  onMessageParticipants: () => messageParticipants,\n  onRemoveParticipants: () => removeParticipants,\n  renderParticipantList: () => ParticipantList,\n  renderParticipantListOthers: () => ParticipantListOthers,\n  overlayProps: undefined,\n  contentProps: undefined,\n  headerProps: undefined,\n  titleProps: undefined,\n  badgeWrapperProps: undefined,\n  badgeProps: undefined,\n  closeButtonProps: undefined,\n  closeIconComponent: undefined,\n  bodyProps: undefined,\n  searchWrapperProps: undefined,\n  searchInputProps: undefined,\n  listsWrapperProps: undefined,\n  moderatorListProps: undefined,\n  attendeeListProps: undefined,\n  emptyState: undefined,\n  renderHeader: undefined,\n  renderSearch: undefined,\n  renderLists: undefined,\n  renderBody: undefined,\n  renderContent: undefined,\n});\n\nconst parameters = computed(() => props.parameters);\nconst coHostResponsibility = computed<CoHostResponsibility[]>(\n  () => parameters.value.coHostResponsibility ?? []\n);\nconst coHost = computed(() => parameters.value.coHost ?? '');\nconst member = computed(() => parameters.value.member ?? '');\nconst islevel = computed(() => parameters.value.islevel ?? '');\nconst eventType = computed<EventType | undefined>(() => parameters.value.eventType);\nconst participants = computed<Participant[]>(() => parameters.value.participants ?? []);\nconst filteredParticipants = computed<Participant[]>(\n  () => parameters.value.filteredParticipants ?? []\n);\nconst socket = computed<Socket | undefined>(() => parameters.value.socket);\nconst showAlert = computed(() => parameters.value.showAlert);\nconst roomName = computed(() => parameters.value.roomName ?? '');\nconst updateIsMessagesModalVisible = computed(\n  () => parameters.value.updateIsMessagesModalVisible\n);\nconst updateDirectMessageDetails = computed(\n  () => parameters.value.updateDirectMessageDetails\n);\nconst updateStartDirectMessage = computed(\n  () => parameters.value.updateStartDirectMessage\n);\nconst updateParticipants = computed(() => parameters.value.updateParticipants);\n\nconst participant_s = ref<Participant[]>([]);\nconst participantsCounter_s = ref(props.participantsCounter);\nconst reRender = ref(false);\n\nconst participantsValue = computed(() =>\n  coHostResponsibility.value.some(\n    (item) => item.name === 'participants' && item.value\n  )\n);\n\nconst showFullControls = computed(\n  () =>\n    (participants.value.length > 0 && islevel.value === '2') ||\n    (coHost.value === member.value && participantsValue.value)\n);\n\nconst handleFilterChange = (event: Event) => {\n  const target = event.target as HTMLInputElement;\n  props.onParticipantsFilterChange(target.value);\n  reRender.value = !reRender.value;\n};\n\nwatch(\n  [filteredParticipants, participants, () => props.participantsCounter, reRender],\n  ([filtered, all, counter]) => {\n    const source = filtered.length > 0 ? filtered : all;\n    participant_s.value = [...source];\n\n    const fallbackCount =\n      counter ?? (filtered.length > 0 ? filtered.length : all.length ?? 0);\n    participantsCounter_s.value = filtered.length > 0 ? filtered.length : fallbackCount;\n  },\n  { immediate: true, deep: true }\n);\n\n// Inline RenderVNode component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Function] as PropType<VNodeChild>,\n      default: null\n    }\n  },\n  setup(props) {\n    return () => {\n      const node = props.node\n      if (isVNode(node)) {\n        return node\n      } else if (typeof node === 'function') {\n        return (node as () => VNodeChild)()\n      } else {\n        return node\n      }\n    }\n  }\n})\n\n// Helper function\nconst joinClassNames = (classes: (string | undefined)[]): string | undefined => {\n  const filtered = classes.filter(Boolean)\n  return filtered.length > 0 ? filtered.join(' ').trim() : undefined\n}\n\n// Computed properties for styles\nconst defaultOverlayWidth = typeof window !== 'undefined' ? Math.min(window.innerWidth * 0.8, 400) : 360\n\nconst overlayStyle = computed((): CSSProperties => ({\n  position: 'fixed' as const,\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  display: props.isParticipantsModalVisible ? 'block' : 'none',\n  zIndex: 999,\n  ...(props.overlayProps?.style as CSSProperties || {})\n}))\n\nconst overlayClassName = computed(() => \n  joinClassNames(['mediasfu-participants-modal', props.overlayProps?.class as string])\n)\n\nconst contentStyle = computed((): CSSProperties => ({\n  position: 'fixed' as const,\n  backgroundColor: props.backgroundColor,\n  borderRadius: '10px',\n  padding: '16px',\n  width: `${defaultOverlayWidth}px`,\n  maxHeight: '75%',\n  overflowY: 'auto' as const,\n  top: props.position.includes('top') ? '10px' : 'auto',\n  bottom: props.position.includes('bottom') ? '10px' : 'auto',\n  left: props.position.includes('Left') ? '10px' : 'auto',\n  right: props.position.includes('Right') ? '10px' : 'auto',\n  display: 'flex',\n  flexDirection: 'column' as const,\n  gap: '12px',\n  boxShadow: '0 10px 30px rgba(0, 0, 0, 0.25)',\n  ...(props.contentProps?.style as CSSProperties || {})\n}))\n\nconst contentClassName = computed(() => \n  joinClassNames(['mediasfu-participants-modal__content', props.contentProps?.class as string])\n)\n\n// Main overlay node\nconst overlayNode = computed(() => {\n  const defaultCloseIcon = props.closeIconComponent ?? h(FontAwesomeIcon, { icon: faTimes, size: 'xl' })\n  \n  const defaultTitleNode = h('h2', {\n    class: joinClassNames(['modal-title', props.titleProps?.class as string]),\n    style: {\n      display: 'flex',\n      alignItems: 'center',\n      gap: '8px',\n      margin: 0,\n      ...(props.titleProps?.style as CSSProperties || {})\n    },\n    ...(props.titleProps ? Object.fromEntries(\n      Object.entries(props.titleProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    typeof props.title === 'string' || typeof props.title === 'number' ? props.title : props.title,\n    h('div', {\n      class: joinClassNames(['participants-counter', props.badgeWrapperProps?.class as string]),\n      style: {\n        backgroundColor: '#fff',\n        color: '#000',\n        borderRadius: '10px',\n        padding: '5px',\n        display: 'inline-flex',\n        alignItems: 'center',\n        justifyContent: 'center',\n        ...(props.badgeWrapperProps?.style as CSSProperties || {})\n      },\n      ...(props.badgeWrapperProps ? Object.fromEntries(\n        Object.entries(props.badgeWrapperProps).filter(([key]) => !['class', 'style'].includes(key))\n      ) : {})\n    }, [\n      h('span', {\n        class: joinClassNames(['badge', props.badgeProps?.class as string]),\n        style: { ...(props.badgeProps?.style as CSSProperties || {}) },\n        ...(props.badgeProps ? Object.fromEntries(\n          Object.entries(props.badgeProps).filter(([key]) => !['class', 'style'].includes(key))\n        ) : {})\n      }, String(participantsCounter_s.value))\n    ])\n  ])\n  \n  const defaultHeaderNode = h('div', {\n    class: joinClassNames(['modal-header', props.headerProps?.class as string]),\n    style: {\n      display: 'flex',\n      justifyContent: 'space-between',\n      alignItems: 'center',\n      gap: '12px',\n      ...(props.headerProps?.style as CSSProperties || {})\n    },\n    ...(props.headerProps ? Object.fromEntries(\n      Object.entries(props.headerProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    defaultTitleNode,\n    h('button', {\n      class: joinClassNames(['btn-close-participants', props.closeButtonProps?.class as string]),\n      style: {\n        padding: '5px',\n        cursor: 'pointer',\n        border: 'none',\n        background: 'transparent',\n        ...(props.closeButtonProps?.style as CSSProperties || {})\n      },\n      onClick: (event: MouseEvent) => {\n        if (props.closeButtonProps?.onClick) {\n          (props.closeButtonProps.onClick as (event: MouseEvent) => void)(event)\n        }\n        if (!event.defaultPrevented) {\n          props.onParticipantsClose()\n        }\n      },\n      ...(props.closeButtonProps ? Object.fromEntries(\n        Object.entries(props.closeButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {})\n    }, [defaultCloseIcon])\n  ])\n  \n  const headerNode = props.renderHeader\n    ? props.renderHeader({\n        defaultHeader: defaultHeaderNode,\n        counter: participantsCounter_s.value,\n        onClose: props.onParticipantsClose\n      })\n    : defaultHeaderNode\n  \n  const defaultSearchNode = h('div', {\n    class: joinClassNames(['search-wrapper', props.searchWrapperProps?.class as string]),\n    style: {\n      display: 'flex',\n      justifyContent: 'center',\n      width: '100%',\n      marginBottom: '10px',\n      ...(props.searchWrapperProps?.style as CSSProperties || {})\n    },\n    ...(props.searchWrapperProps ? Object.fromEntries(\n      Object.entries(props.searchWrapperProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    h('input', {\n      type: 'text',\n      class: joinClassNames(['form-control', props.searchInputProps?.class as string]),\n      style: {\n        width: '90%',\n        maxWidth: '320px',\n        padding: '10px',\n        borderRadius: '5px',\n        border: '1px solid #000',\n        fontSize: '16px',\n        boxSizing: 'border-box',\n        ...(props.searchInputProps?.style as CSSProperties || {})\n      },\n      placeholder: 'Search ...',\n      onInput: (event: Event) => {\n        if (props.searchInputProps?.onInput) {\n          (props.searchInputProps.onInput as (event: Event) => void)(event)\n        }\n        if (!event.defaultPrevented) {\n          handleFilterChange(event)\n        }\n      },\n      ...(props.searchInputProps ? Object.fromEntries(\n        Object.entries(props.searchInputProps).filter(([key]) => !['class', 'style', 'onInput', 'type', 'placeholder'].includes(key))\n      ) : {})\n    })\n  ])\n  \n  const searchNode = props.renderSearch\n    ? props.renderSearch({\n        defaultSearch: defaultSearchNode,\n        onFilter: (value: string) => {\n          const event = new Event('input')\n          Object.defineProperty(event, 'target', {\n            value: { value },\n            writable: false\n          })\n          handleFilterChange(event)\n        }\n      })\n    : defaultSearchNode\n  \n  const defaultListsNode = h('div', {\n    class: joinClassNames(['lists-wrapper', props.listsWrapperProps?.class as string]),\n    style: { ...(props.listsWrapperProps?.style as CSSProperties || {}) },\n    ...(props.listsWrapperProps ? Object.fromEntries(\n      Object.entries(props.listsWrapperProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    showFullControls.value\n      ? h(props.renderParticipantList, {\n          class: joinClassNames([props.moderatorListProps?.class as string]),\n          style: { ...(props.moderatorListProps?.style as CSSProperties || {}) },\n          participants: participant_s.value,\n          isBroadcast: eventType.value === 'broadcast',\n          onMuteParticipants: props.onMuteParticipants,\n          onMessageParticipants: props.onMessageParticipants,\n          onRemoveParticipants: props.onRemoveParticipants,\n          socket: socket.value,\n          coHostResponsibility: coHostResponsibility.value,\n          member: member.value,\n          islevel: islevel.value,\n          showAlert: showAlert.value,\n          coHost: coHost.value,\n          roomName: roomName.value,\n          updateIsMessagesModalVisible: updateIsMessagesModalVisible.value,\n          updateDirectMessageDetails: updateDirectMessageDetails.value,\n          updateStartDirectMessage: updateStartDirectMessage.value,\n          updateParticipants: updateParticipants.value,\n          ...(props.moderatorListProps ? Object.fromEntries(\n            Object.entries(props.moderatorListProps).filter(([key]) => !['class', 'style'].includes(key))\n          ) : {})\n        })\n      : participant_s.value.length > 0\n        ? h(props.renderParticipantListOthers, {\n            class: joinClassNames([props.attendeeListProps?.class as string]),\n            style: { ...(props.attendeeListProps?.style as CSSProperties || {}) },\n            participants: participant_s.value,\n            coHost: coHost.value,\n            member: member.value,\n            ...(props.attendeeListProps ? Object.fromEntries(\n              Object.entries(props.attendeeListProps).filter(([key]) => !['class', 'style'].includes(key))\n            ) : {})\n          })\n        : h('div', {\n            class: 'empty-state',\n            style: { textAlign: 'center', padding: '20px', color: '#666' }\n          }, [\n            typeof props.emptyState === 'function'\n              ? (props.emptyState as (context: { counter: number }) => VNodeChild)({ counter: participantsCounter_s.value })\n              : (props.emptyState || 'No participants')\n          ])\n  ])\n  \n  const listsNode = props.renderLists\n    ? props.renderLists({\n        defaultLists: defaultListsNode,\n        participants: participant_s.value,\n        hasModeratorControls: showFullControls.value\n      })\n    : defaultListsNode\n  \n  const defaultBodyNode = h('div', {\n    class: joinClassNames(['modal-body', props.bodyProps?.class as string]),\n    style: { ...(props.bodyProps?.style as CSSProperties || {}) },\n    ...(props.bodyProps ? Object.fromEntries(\n      Object.entries(props.bodyProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    headerNode,\n    searchNode,\n    listsNode\n  ])\n  \n  const bodyNode = props.renderBody\n    ? props.renderBody({\n        defaultBody: defaultBodyNode,\n        counter: participantsCounter_s.value\n      })\n    : defaultBodyNode\n  \n  const defaultContentNode = h('div', {\n    class: contentClassName.value,\n    style: contentStyle.value,\n    ...(props.contentProps ? Object.fromEntries(\n      Object.entries(props.contentProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [bodyNode])\n  \n  const contentNode = props.renderContent\n    ? props.renderContent({\n        defaultContent: defaultContentNode,\n        counter: participantsCounter_s.value\n      })\n    : defaultContentNode\n  \n  return h('div', {\n    class: overlayClassName.value,\n    style: overlayStyle.value,\n    ...(props.overlayProps ? Object.fromEntries(\n      Object.entries(props.overlayProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [contentNode])\n})\n</script>\n","<!--\n/**\n * @fileoverview MessagePanel - Chat message display and input panel\n * @component MessagePanel\n * @module components/messageComponents/MessagePanel\n * \n * @description\n * A comprehensive chat panel that displays message history and provides input controls\n * for sending messages. Supports both group chat and direct messaging modes with reply\n * functionality. Displays messages with sender info, timestamps, and handles message\n * alignment based on sender (right for own messages, left for others).\n * \n * Features:\n * - Group chat and direct messaging modes\n * - Message display with sender name and timestamp\n * - Reply functionality with reply indicators\n * - Direct message \"Reply\" button for incoming DMs\n * - Character limit (350 chars)\n * - Auto-focus on input when focusedInput=true\n * - Send button with FontAwesome icon\n * - Chat setting restrictions (allow, disallow)\n * - Permission checks for messaging\n * - Scrollable message history\n * \n * Message Types:\n * - **Group Messages**: Displayed to all participants, no \"Reply\" button\n * - **Direct Messages**: One-on-one messages with \"Reply\" button\n * - **Replies**: Show \"Replying to: [username]\" indicator above input\n * \n * Alignment:\n * - **Own messages**: Aligned to right, show \"To: [recipients]\" for direct messages\n * - **Others' messages**: Aligned to left, show sender name\n * \n * @example Basic Group Chat\n * // <MessagePanel\n *   // :messages=\"groupMessages\"\n *   // :messagesLength=\"groupMessages.length\"\n *   // type=\"group\"\n *   // username=\"john_doe\"\n *   // :onSendMessagePress=\"sendMessageHandler\"\n *   // :focusedInput=\"true\"\n *   // eventType=\"conference\"\n *   // member=\"john_doe\"\n *   // islevel=\"0\"\n *   // :startDirectMessage=\"false\"\n *   // :updateStartDirectMessage=\"() => {}\"\n *   // :directMessageDetails=\"null\"\n *   // :updateDirectMessageDetails=\"() => {}\"\n *   // :coHostResponsibility=\"[]\"\n *   // coHost=\"\"\n *   // roomName=\"meeting-123\"\n *   // :socket=\"socket\"\n *   // chatSetting=\"allow\"\n * // />\n * \n * @example Direct Message Mode\n * // <MessagePanel\n *   // :messages=\"directMessages\"\n *   // :messagesLength=\"directMessages.length\"\n *   // type=\"direct\"\n *   // username=\"john_doe\"\n *   // :onSendMessagePress=\"sendMessageHandler\"\n *   // backgroundColor=\"#e8f5e9\"\n *   // :focusedInput=\"true\"\n *   // eventType=\"webinar\"\n *   // member=\"john_doe\"\n *   // islevel=\"1\"\n *   // :startDirectMessage=\"true\"\n *   // :updateStartDirectMessage=\"setStartDM\"\n *   // :directMessageDetails=\"targetUser\"\n *   // :updateDirectMessageDetails=\"setTargetUser\"\n *   // :coHostResponsibility=\"[]\"\n *   // coHost=\"\"\n *   // roomName=\"webinar-456\"\n *   // :socket=\"socket\"\n *   // chatSetting=\"allow\"\n * // />\n * \n * @example With Chat Disabled\n * // <MessagePanel\n *   // :messages=\"messages\"\n *   // :messagesLength=\"messages.length\"\n *   // type=\"group\"\n *   // username=\"participant\"\n *   // :onSendMessagePress=\"() => {}\"\n *   // :focusedInput=\"false\"\n *   // eventType=\"broadcast\"\n *   // member=\"participant\"\n *   // islevel=\"0\"\n *   // :startDirectMessage=\"false\"\n *   // :updateStartDirectMessage=\"() => {}\"\n *   // :directMessageDetails=\"null\"\n *   // :updateDirectMessageDetails=\"() => {}\"\n *   // :coHostResponsibility=\"[]\"\n *   // coHost=\"\"\n *   // roomName=\"broadcast-789\"\n *   // :socket=\"socket\"\n *   // chatSetting=\"disallow\"\n * // />\n * \n * @remarks\n * The component handles permission checks internally - if chat is disabled or the user\n * doesn't have permission to send messages, an alert is shown. For direct messages,\n * clicking \"Reply\" on an incoming message automatically switches to direct message mode\n * and targets the sender.\n * \n * Workflow:\n * 1. Component mounts → Auto-focuses input if focusedInput=true\n * 2. Messages displayed → Own messages right-aligned, others left-aligned\n * 3. User clicks \"Reply\" on DM → Sets directMessageDetails to sender, switches to DM mode\n * 4. User types message → Updates messageText state\n * 5. User clicks Send → Checks permissions → Calls onSendMessagePress\n * 6. Message sent successfully → Clears input, resets reply state\n * 7. Permission denied → Shows alert explaining restriction\n * \n * @see {@link MessagesModal} - Modal container for the message panel\n */\n-->\n<template>\n  <div :style=\"{ maxHeight: '100%', backgroundColor, overflowY: 'auto' }\">\n    <!-- Message rendering -->\n    <div\n      v-for=\"(message, index) in messages\"\n      :key=\"index\"\n      :style=\"{ marginBottom: '10px' }\"\n    >\n      <div\n        :style=\"{\n          display: 'flex',\n          flexDirection: 'column',\n          alignItems: message.sender === username ? 'flex-end' : 'flex-start',\n          marginBottom: '10px',\n        }\"\n      >\n        <div\n          :style=\"{\n            display: 'flex',\n            flexDirection: 'row',\n            justifyContent: 'space-between',\n            marginBottom: '3px',\n          }\"\n        >\n          <span\n            v-if=\"message.sender === username && !message.group\"\n            :style=\"{\n              fontWeight: 'bold',\n              color: 'black',\n              fontSize: '8px',\n              marginLeft: '6px',\n            }\"\n          >\n            To: {{ message.receivers.join(', ') }}\n          </span>\n          <span\n            :style=\"{\n              fontWeight: 'bold',\n              color: 'black',\n              fontSize: '8px',\n              marginRight: '10px',\n            }\"\n          >\n            {{ message.sender === username ? '' : message.sender }}\n          </span>\n          <span :style=\"{ fontSize: '8px', color: '#999999' }\">\n            {{ message.timestamp }}\n          </span>\n          <div\n            v-if=\"message.sender !== username && !message.group\"\n            :style=\"{\n              padding: '1px',\n              marginLeft: '5px',\n              borderRadius: '2px',\n              backgroundColor: 'transparent',\n              cursor: 'pointer',\n            }\"\n            @click=\"openReplyInput(message.sender)\"\n          >\n            <font-awesome-icon\n              :icon=\"faReply\"\n              size=\"xs\"\n              color=\"black\"\n            />\n          </div>\n        </div>\n        <div\n          :style=\"{\n            backgroundColor: message.sender === member ? '#DCF8C6' : '#1ce5c7',\n            padding: '10px',\n            borderRadius: '10px',\n          }\"\n        >\n          <span :style=\"{ color: 'black' }\">{{ message.message }}</span>\n        </div>\n      </div>\n    </div>\n\n    <!-- Reply info -->\n    <div\n      v-if=\"replyInfo\"\n      :style=\"{\n        flexDirection: 'row',\n        alignItems: 'center',\n        padding: '2px',\n        backgroundColor: '#e6e6e6',\n        borderRadius: '5px',\n        marginBottom: '1px',\n      }\"\n    >\n      <span :style=\"{ fontWeight: 'bold', marginRight: '2px', fontSize: '8px' }\">\n        Replying to:\n      </span>\n      <span :style=\"{ color: 'red', fontSize: '8px' }\">\n        {{ replyInfo.username }}\n      </span>\n    </div>\n\n    <!-- Input area -->\n    <div :style=\"styles.inputContainer\">\n      <input\n        ref=\"inputRef\"\n        type=\"text\"\n        :style=\"styles.input\"\n        :placeholder=\"placeholderText\"\n        maxlength=\"350\"\n        :value=\"messageText\"\n        @input=\"handleTextInputChange\"\n      />\n      <button\n        :style=\"styles.sendButton\"\n        @click=\"handleSendButton\"\n      >\n        <font-awesome-icon\n          :icon=\"faPaperPlane\"\n          size=\"sm\"\n          color=\"white\"\n        />\n      </button>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, nextTick } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faPaperPlane, faReply } from '@fortawesome/free-solid-svg-icons';\nimport type { SendMessageOptions } from 'mediasfu-shared';\nimport type {\n  CoHostResponsibility,\n  EventType,\n  Message,\n  Participant,\n  ShowAlert,\n} from '../../../../SharedTypes';\nimport type { Socket } from 'socket.io-client';\n\nexport interface MessagePanelProps {\n  messages: Message[];\n  messagesLength: number;\n  type: 'direct' | 'group';\n  username: string;\n  onSendMessagePress: (options: SendMessageOptions) => Promise<void>;\n  backgroundColor?: string;\n  focusedInput: boolean;\n  showAlert?: ShowAlert;\n  eventType: EventType;\n  member: string;\n  islevel: string;\n  startDirectMessage: boolean;\n  updateStartDirectMessage: (start: boolean) => void;\n  directMessageDetails: Participant | null;\n  updateDirectMessageDetails: (participant: Participant | null) => void;\n  coHostResponsibility: CoHostResponsibility[];\n  coHost: string;\n  roomName: string;\n  socket: Socket;\n  chatSetting: string;\n}\n\nconst props = withDefaults(defineProps<MessagePanelProps>(), {\n  backgroundColor: '#f5f5f5',\n});\n\nconst inputRef = ref<HTMLInputElement | null>(null);\nconst replyInfo = ref<{ text: string; username: string } | null>(null);\nconst senderId = ref<string | null>(null);\nconst directMessageText = ref('');\nconst groupMessageText = ref('');\n\nconst messageText = computed(() => {\n  return props.type === 'direct' ? directMessageText.value : groupMessageText.value;\n});\n\nconst placeholderText = computed(() => {\n  if (props.type === 'direct') {\n    if (props.focusedInput && props.startDirectMessage && props.directMessageDetails) {\n      return `Send a direct message to ${props.directMessageDetails.name}`;\n    }\n    return 'Select a message to reply to';\n  }\n  return props.eventType === 'chat' ? 'Send a message' : 'Send a message to everyone';\n});\n\nconst styles = {\n  inputContainer: {\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'space-between',\n    marginBottom: '10px',\n    marginTop: 'auto',\n  },\n  input: {\n    flex: 1,\n    minHeight: '40px',\n    maxHeight: '80px',\n    resize: 'vertical' as const,\n    border: '1px solid gray',\n    borderRadius: '5px',\n    padding: '10px',\n    overflowY: 'auto' as const,\n  },\n  sendButton: {\n    backgroundColor: '#83c0e9',\n    padding: '10px',\n    borderRadius: '5px',\n    display: 'flex',\n    alignItems: 'center',\n    border: 'none',\n    cursor: 'pointer',\n  },\n};\n\nconst handleTextInputChange = (event: Event) => {\n  const text = (event.target as HTMLInputElement).value;\n  if (props.type === 'direct') {\n    directMessageText.value = text;\n  } else {\n    groupMessageText.value = text;\n  }\n};\n\nconst openReplyInput = (sender: string) => {\n  replyInfo.value = {\n    text: 'Replying to: ',\n    username: sender,\n  };\n  senderId.value = sender;\n};\n\nconst handleSendButton = async () => {\n  const message = props.type === 'direct' ? directMessageText.value : groupMessageText.value;\n\n  if (!message) {\n    props.showAlert?.({\n      message: 'Please enter a message',\n      type: 'danger',\n      duration: 3000,\n    });\n    return;\n  }\n\n  if (message.length > 350) {\n    props.showAlert?.({\n      message: 'Message is too long',\n      type: 'danger',\n      duration: 3000,\n    });\n    return;\n  }\n\n  if (message.trim() === '') {\n    props.showAlert?.({\n      message: 'Message is not valid.',\n      type: 'danger',\n      duration: 3000,\n    });\n    return;\n  }\n\n  if (props.type === 'direct' && !senderId.value && props.islevel === '2') {\n    props.showAlert?.({\n      message: 'Please select a message to reply to',\n      type: 'danger',\n      duration: 3000,\n    });\n    return;\n  }\n\n  await props.onSendMessagePress({\n    message,\n    receivers: props.type === 'direct' ? [senderId.value!] : [],\n    group: props.type === 'group',\n    messagesLength: props.messagesLength,\n    member: props.member,\n    sender: props.username,\n    islevel: props.islevel,\n    showAlert: props.showAlert,\n    coHostResponsibility: props.coHostResponsibility,\n    coHost: props.coHost,\n    roomName: props.roomName,\n    socket: props.socket as any,\n    chatSetting: props.chatSetting,\n  });\n\n  if (props.type === 'direct') {\n    directMessageText.value = '';\n  } else {\n    groupMessageText.value = '';\n  }\n\n  if (inputRef.value) {\n    inputRef.value.value = '';\n  }\n\n  if (replyInfo.value) {\n    replyInfo.value = null;\n    senderId.value = null;\n  }\n\n  if (props.focusedInput) {\n    props.updateDirectMessageDetails(null);\n    props.updateStartDirectMessage(false);\n  }\n};\n\nwatch(\n  () => [props.startDirectMessage, props.directMessageDetails, props.focusedInput],\n  async () => {\n    if (props.startDirectMessage && props.directMessageDetails && props.focusedInput) {\n      await nextTick();\n      inputRef.value?.focus();\n      replyInfo.value = {\n        text: 'Replying to: ',\n        username: props.directMessageDetails.name,\n      };\n      senderId.value = props.directMessageDetails.name;\n    } else {\n      replyInfo.value = null;\n      if (inputRef.value) {\n        inputRef.value.value = '';\n      }\n    }\n  },\n  { immediate: true }\n);\n\n</script>\n","<!--\n * MessagesModal - Messaging modal with direct and group chat\n *\n * @fileoverview\n * A dual-tab messaging modal for handling both direct (1-on-1) and group chat messages.\n * Provides tabbed interface to switch between direct messages and group chat, with\n * message history display, send capabilities, and event-type-specific features.\n *\n * @component MessagesModal\n * @module components/messageComponents/MessagesModal\n *\n * @description\n * This modal provides a complete messaging interface with:\n * - Tabbed interface (Direct Messages / Group Chat)\n * - Direct messaging for webinars and conferences\n * - Group chat for all event types\n * - Message history display via MessagePanel component\n * - Real-time message sending via Socket.io\n * - Chat setting enforcement (public/private messaging rules)\n * - Role-based messaging permissions\n * - Automatic tab visibility based on event type\n * - Custom positioning (topRight, topLeft, bottomRight, bottomLeft)\n * - Fully customizable render functions for all UI sections\n *\n * @example\n * // Basic messages modal\n * // <MessagesModal\n *   // :is-messages-modal-visible=\"showMessages\"\n *   // :on-messages-close=\"() => setShowMessages(false)\"\n *   // :messages=\"messageHistory\"\n *   // :event-type=\"eventType\"\n *   // :member=\"currentUser\"\n *   // :islevel=\"userLevel\"\n *   // :co-host-responsibility=\"coHostPerms\"\n *   // :co-host=\"coHostId\"\n *   // :start-direct-message=\"directMessageActive\"\n *   // :direct-message-details=\"directMessageTarget\"\n *   // :update-start-direct-message=\"setDirectMessageActive\"\n *   // :update-direct-message-details=\"setDirectMessageTarget\"\n *   // :room-name=\"roomName\"\n *   // :socket=\"socket\"\n *   // :chat-setting=\"chatSetting\"\n * // />\n *\n * @example\n * // Custom styled with position and colors\n * // <MessagesModal\n *   // :is-messages-modal-visible=\"showMessages\"\n *   // :on-messages-close=\"closeMessages\"\n *   // :messages=\"messages\"\n *   // event-type=\"conference\"\n *   // :member=\"member\"\n *   // :islevel=\"islevel\"\n *   // :co-host-responsibility=\"coHostResponsibility\"\n *   // :co-host=\"coHost\"\n *   // :start-direct-message=\"startDirectMessage\"\n *   // :direct-message-details=\"directMessageDetails\"\n *   // :update-start-direct-message=\"updateStartDirectMessage\"\n *   // :update-direct-message-details=\"updateDirectMessageDetails\"\n *   // :room-name=\"roomName\"\n *   // :socket=\"socket\"\n *   // chat-setting=\"allow\"\n *   // position=\"bottomLeft\"\n *   // background-color=\"#2a2a2a\"\n *   // active-tab-background-color=\"#00a8ff\"\n *   // title=\"Event Chat\"\n * // />\n *\n * @example\n * // Custom render functions\n * // <MessagesModal\n *   // :is-messages-modal-visible=\"showMessages\"\n *   // :on-messages-close=\"closeMessages\"\n *   // :messages=\"messages\"\n *   // event-type=\"webinar\"\n *   // :member=\"member\"\n *   // :islevel=\"islevel\"\n *   // :co-host-responsibility=\"coHostResponsibility\"\n *   // :co-host=\"coHost\"\n *   // :start-direct-message=\"startDirectMessage\"\n *   // :direct-message-details=\"directMessageDetails\"\n *   // :update-start-direct-message=\"updateStartDirectMessage\"\n *   // :update-direct-message-details=\"updateDirectMessageDetails\"\n *   // :room-name=\"roomName\"\n *   // :socket=\"socket\"\n *   // chat-setting=\"allow\"\n *   // :render-tabs=\"(options) => {\n *     const { activeTab, switchToDirect, switchToGroup } = options;\n *     return h('div', { class: 'custom-tabs' }, [\n *       h('button', { \n *         class: activeTab === 'direct' ? 'active' : '',\n *         onClick: switchToDirect \n *       }, 'Direct'),\n *       h('button', { \n *         class: activeTab === 'group' ? 'active' : '',\n *         onClick: switchToGroup \n *       }, 'Group')\n *     ]);\n *   }\"\n * // />\n *\n * @example\n * // Custom send message handler\n * // <MessagesModal\n *   // :is-messages-modal-visible=\"showMessages\"\n *   // :on-messages-close=\"closeMessages\"\n *   // :messages=\"messages\"\n *   // event-type=\"broadcast\"\n *   // :member=\"member\"\n *   // :islevel=\"islevel\"\n *   // :co-host-responsibility=\"coHostResponsibility\"\n *   // :co-host=\"coHost\"\n *   // :start-direct-message=\"false\"\n *   // :direct-message-details=\"null\"\n *   // :update-start-direct-message=\"() => {}\"\n *   // :update-direct-message-details=\"() => {}\"\n *   // :room-name=\"roomName\"\n *   // :socket=\"socket\"\n *   // chat-setting=\"allow\"\n *   // :on-send-message-press=\"async (options) => {\n *     // Custom message validation/processing\n *     await customSendMessage(options);\n *   }\"\n * // />\n *\n * @example\n * // Custom empty state per tab\n * // <MessagesModal\n *   // :is-messages-modal-visible=\"showMessages\"\n *   // :on-messages-close=\"closeMessages\"\n *   // :messages=\"messages\"\n *   // event-type=\"conference\"\n *   // :member=\"member\"\n *   // :islevel=\"islevel\"\n *   // :co-host-responsibility=\"coHostResponsibility\"\n *   // :co-host=\"coHost\"\n *   // :start-direct-message=\"startDirectMessage\"\n *   // :direct-message-details=\"directMessageDetails\"\n *   // :update-start-direct-message=\"updateStartDirectMessage\"\n *   // :update-direct-message-details=\"updateDirectMessageDetails\"\n *   // :room-name=\"roomName\"\n *   // :socket=\"socket\"\n *   // chat-setting=\"allow\"\n *   // :empty-state=\"(context) => {\n *     const message = context.type === 'direct' \n *       ? 'No direct messages yet' \n *       : 'No group messages yet';\n *     return h('div', { class: 'empty-chat' }, message);\n *   }\"\n * // />\n-->\n<template>\n  <RenderVNode :node=\"overlayNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { h, isVNode, defineComponent, ref, computed, watch, type PropType, type VNodeChild, type HTMLAttributes, type ButtonHTMLAttributes, type CSSProperties } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faTimes } from '@fortawesome/free-solid-svg-icons';\nimport MessagePanel from './MessagePanel.vue';\nimport { sendMessage, type SendMessageOptions } from 'mediasfu-shared';\nimport type {\n  CoHostResponsibility,\n  EventType,\n  Message,\n  Participant,\n  ShowAlert,\n} from '../../../../SharedTypes';\nimport type { Socket } from 'socket.io-client';\n\n/**\n * MessagesModal props interface\n * \n * @interface MessagesModalProps\n * @property {boolean} isMessagesModalVisible - Whether modal is visible\n * @property {() => void} onMessagesClose - Function to close the modal\n * @property {(options: SendMessageOptions) => Promise<void>} [onSendMessagePress=sendMessage] - Function to send a message\n * @default sendMessage\n * @property {Message[]} messages - Array of all messages (direct and group)\n * @property {EventType} eventType - Type of event (determines direct message availability)\n * @property {string} member - Current user's member ID\n * @property {string} islevel - Current user's permission level ('0'=host, '1'=co-host, '2'=attendee)\n * @property {CoHostResponsibility[]} coHostResponsibility - Array of co-host permissions\n * @property {string} coHost - Co-host identifier\n * @property {boolean} startDirectMessage - Whether direct messaging is active/initiated\n * @property {Participant | null} directMessageDetails - Target participant for direct message\n * @property {(start: boolean) => void} updateStartDirectMessage - Function to set direct message mode\n * @property {(participant: Participant | null) => void} updateDirectMessageDetails - Function to set direct message target\n * @property {ShowAlert} [showAlert] - Function to show alert messages\n * @property {string} roomName - Event room name/ID\n * @property {Socket} socket - Socket.io instance for real-time messaging\n * @property {string} chatSetting - Chat permission setting ('allow', 'disallow', 'approval')\n * @property {string} [position='topRight'] - Modal position ('topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft')\n * @default 'topRight'\n * @property {string} [backgroundColor='#f5f5f5'] - Modal background color\n * @default '#f5f5f5'\n * @property {string} [activeTabBackgroundColor='#2b7ce5'] - Active tab background color\n * @default '#2b7ce5'\n * @property {VNodeChild | string | number} [title='Messages'] - Modal title text or VNode\n * @default 'Messages'\n * @property {HTMLAttributes} [overlayProps] - HTML attributes for overlay backdrop\n * @property {HTMLAttributes} [contentProps] - HTML attributes for modal content container\n * @property {HTMLAttributes} [headerProps] - HTML attributes for header section\n * @property {HTMLAttributes} [titleProps] - HTML attributes for title element\n * @property {HTMLAttributes} [tabListProps] - HTML attributes for tab list container\n * @property {ButtonHTMLAttributes} [tabButtonProps] - HTML attributes for tab buttons\n * @property {ButtonHTMLAttributes} [closeButtonProps] - HTML attributes for close button\n * @property {VNodeChild} [closeIconComponent] - Custom close icon component\n * @property {HTMLAttributes} [bodyProps] - HTML attributes for modal body\n * @property {HTMLAttributes} [directPanelWrapperProps] - HTML attributes for direct messages panel wrapper\n * @property {HTMLAttributes} [groupPanelWrapperProps] - HTML attributes for group messages panel wrapper\n * @property {VNodeChild | ((context: { type: 'direct' | 'group' }) => VNodeChild)} [emptyState] - Custom empty state when no messages\n * @property {(options: HeaderRenderOptions) => VNodeChild} [renderHeader] - Custom header renderer\n * @example\n * ```typescript\n * renderHeader: ({ defaultHeader, activeTab, onClose }) => {\n *   // return h('div', { class: 'custom-header' }, [\n *     h('h3', {}, activeTab === 'direct' ? 'Direct Messages' : 'Group Chat'),\n *     h('button', { onClick: onClose }, '×')\n *   ]);\n * }\n * ```\n * @property {(options: TabsRenderOptions) => VNodeChild} [renderTabs] - Custom tabs renderer\n * @example\n * ```typescript\n * renderTabs: ({ activeTab, switchToDirect, switchToGroup }) => {\n *   // return h('div', { class: 'tabs' }, [\n *     h('button', { onClick: switchToDirect, class: activeTab === 'direct' ? 'active' : '' }, 'Direct'),\n *     h('button', { onClick: switchToGroup, class: activeTab === 'group' ? 'active' : '' }, 'Group')\n *   ]);\n * }\n * ```\n * @property {(options: TabButtonRenderOptions) => VNodeChild} [renderTabButton] - Custom tab button renderer\n * @property {(options: PanelsRenderOptions) => VNodeChild} [renderPanels] - Custom panels renderer\n * @property {(options: BodyRenderOptions) => VNodeChild} [renderBody] - Custom body renderer\n * @property {(options: ContentRenderOptions) => VNodeChild} [renderContent] - Custom content renderer\n */\nexport interface MessagesModalProps {\n  isMessagesModalVisible: boolean;\n  onMessagesClose: () => void;\n  onSendMessagePress?: (options: SendMessageOptions) => Promise<void>;\n  messages: Message[];\n  eventType: EventType;\n  member: string;\n  islevel: string;\n  coHostResponsibility: CoHostResponsibility[];\n  coHost: string;\n  startDirectMessage: boolean;\n  directMessageDetails: Participant | null;\n  updateStartDirectMessage: (start: boolean) => void;\n  updateDirectMessageDetails: (participant: Participant | null) => void;\n  showAlert?: ShowAlert;\n  roomName: string;\n  socket: Socket;\n  chatSetting: string;\n  position?: string;\n  backgroundColor?: string;\n  activeTabBackgroundColor?: string;\n  title?: VNodeChild | string | number;\n  overlayProps?: HTMLAttributes;\n  contentProps?: HTMLAttributes;\n  headerProps?: HTMLAttributes;\n  titleProps?: HTMLAttributes;\n  tabListProps?: HTMLAttributes;\n  tabButtonProps?: ButtonHTMLAttributes;\n  closeButtonProps?: ButtonHTMLAttributes;\n  closeIconComponent?: VNodeChild;\n  bodyProps?: HTMLAttributes;\n  directPanelWrapperProps?: HTMLAttributes;\n  groupPanelWrapperProps?: HTMLAttributes;\n  emptyState?: VNodeChild | ((context: { type: 'direct' | 'group' }) => VNodeChild);\n  renderHeader?: (options: {\n    defaultHeader: VNodeChild;\n    activeTab: 'direct' | 'group';\n    onClose: () => void;\n  }) => VNodeChild;\n  renderTabs?: (options: {\n    defaultTabs: VNodeChild;\n    activeTab: 'direct' | 'group';\n    switchToDirect: () => void;\n    switchToGroup: () => void;\n  }) => VNodeChild;\n  renderTabButton?: (options: {\n    type: 'direct' | 'group';\n    isActive: boolean;\n    defaultButton: VNodeChild;\n    switchTo: () => void;\n  }) => VNodeChild;\n  renderPanels?: (options: {\n    defaultPanels: VNodeChild;\n    activeTab: 'direct' | 'group';\n  }) => VNodeChild;\n  renderBody?: (options: {\n    defaultBody: VNodeChild;\n    activeTab: 'direct' | 'group';\n  }) => VNodeChild;\n  renderContent?: (options: {\n    defaultContent: VNodeChild;\n    activeTab: 'direct' | 'group';\n  }) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<MessagesModalProps>(), {\n  position: 'topRight',\n  backgroundColor: '#f5f5f5',\n  activeTabBackgroundColor: '#2b7ce5',\n  title: 'Messages',\n  showAlert: undefined,\n  onSendMessagePress: sendMessage,\n  overlayProps: undefined,\n  contentProps: undefined,\n  headerProps: undefined,\n  titleProps: undefined,\n  tabListProps: undefined,\n  tabButtonProps: undefined,\n  closeButtonProps: undefined,\n  closeIconComponent: undefined,\n  bodyProps: undefined,\n  directPanelWrapperProps: undefined,\n  groupPanelWrapperProps: undefined,\n  emptyState: undefined,\n  renderHeader: undefined,\n  renderTabs: undefined,\n  renderTabButton: undefined,\n  renderPanels: undefined,\n  renderBody: undefined,\n  renderContent: undefined,\n});\n\nconst screenWidth = window.innerWidth;\nlet modalWidth = 0.8 * screenWidth;\nif (modalWidth > 400) {\n  modalWidth = 400;\n}\n\nconst enableDirectTab = computed(() => props.eventType === 'webinar' || props.eventType === 'conference');\n\nconst activeTab = ref<'direct' | 'group'>(enableDirectTab.value ? 'direct' : 'group');\nconst focusedInput = ref(false);\n\nconst hasChatModerationPrivilege = computed(() =>\n  (props.coHostResponsibility ?? []).some((item) => item.name === 'chat' && item.value === true)\n);\n\nconst directMessages = computed(() => {\n  const isHost = props.islevel === '2';\n  const memberName = props.member;\n  const receiversIncludeMember = (receivers: Message['receivers']) =>\n    Array.isArray(receivers) && receivers.includes(memberName);\n  const isChatModerator = props.coHost === memberName && hasChatModerationPrivilege.value;\n\n  return props.messages.filter((message: Message) => {\n    if (message.group) {\n      return false;\n    }\n\n    const participantInvolved =\n      message.sender === memberName || receiversIncludeMember(message.receivers);\n\n    return participantInvolved || isHost || isChatModerator;\n  });\n});\n\nconst groupMessages = computed(() => {\n  return props.messages.filter((message: Message) => message.group);\n});\n\nconst onClose = () => {\n  props.onMessagesClose();\n};\n\nwatch(enableDirectTab, (canShowDirect) => {\n  if (!canShowDirect && activeTab.value !== 'group') {\n    activeTab.value = 'group';\n    focusedInput.value = false;\n  }\n});\n\nwatch(\n  () => props.startDirectMessage,\n  (newValue) => {\n    if (newValue && props.directMessageDetails && enableDirectTab.value) {\n      activeTab.value = 'direct';\n      focusedInput.value = true;\n    } else {\n      focusedInput.value = false;\n    }\n  }\n);\n\nwatch(\n  () => props.directMessageDetails,\n  (newValue) => {\n    if (!newValue) {\n      focusedInput.value = false;\n    }\n  }\n);\n\n// Inline RenderVNode component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Function] as PropType<VNodeChild>,\n      default: null\n    }\n  },\n  setup(props) {\n    return () => {\n      const node = props.node\n      if (isVNode(node)) {\n        return node\n      } else if (typeof node === 'function') {\n        return (node as () => VNodeChild)()\n      } else {\n        return node\n      }\n    }\n  }\n})\n\n// Helper function\nconst joinClassNames = (classes: (string | undefined)[]): string | undefined => {\n  const filtered = classes.filter(Boolean)\n  return filtered.length > 0 ? filtered.join(' ').trim() : undefined\n}\n\n// Computed properties for styles\nconst defaultOverlayWidth = typeof window !== 'undefined' ? Math.min(window.innerWidth * 0.8, 400) : 360\n\nconst overlayStyle = computed((): CSSProperties => ({\n  position: 'fixed' as const,\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  display: props.isMessagesModalVisible ? 'block' : 'none',\n  zIndex: 999,\n  ...(props.overlayProps?.style as CSSProperties || {})\n}))\n\nconst overlayClassName = computed(() => \n  joinClassNames(['mediasfu-messages-modal', props.overlayProps?.class as string])\n)\n\nconst contentStyle = computed((): CSSProperties => ({\n  position: 'fixed' as const,\n  backgroundColor: props.backgroundColor,\n  borderRadius: '10px',\n  padding: '16px',\n  width: `${defaultOverlayWidth}px`,\n  maxHeight: '75%',\n  overflowY: 'auto' as const,\n  top: props.position.includes('top') ? '10px' : 'auto',\n  bottom: props.position.includes('bottom') ? '10px' : 'auto',\n  left: props.position.includes('Left') ? '10px' : 'auto',\n  right: props.position.includes('Right') ? '10px' : 'auto',\n  display: 'flex',\n  flexDirection: 'column' as const,\n  gap: '12px',\n  ...(props.contentProps?.style as CSSProperties || {})\n}))\n\nconst contentClassName = computed(() => \n  joinClassNames(['mediasfu-messages-modal__content', props.contentProps?.class as string])\n)\n\n// Main overlay node\nconst overlayNode = computed(() => {\n  const defaultCloseIcon = props.closeIconComponent ?? h(FontAwesomeIcon, { icon: faTimes, size: 'xl' })\n  \n  const defaultTitleNode = h('div', {\n    class: joinClassNames(['modal-title', props.titleProps?.class as string]),\n    style: {\n      fontSize: '18px',\n      fontWeight: 'bold',\n      color: 'black',\n      ...(props.titleProps?.style as CSSProperties || {})\n    },\n    ...(props.titleProps ? Object.fromEntries(\n      Object.entries(props.titleProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, typeof props.title === 'string' || typeof props.title === 'number' ? [props.title] : (props.title || []))\n  \n  const defaultHeaderNode = h('div', {\n    class: joinClassNames(['modal-header', props.headerProps?.class as string]),\n    style: {\n      display: 'flex',\n      justifyContent: 'space-between',\n      alignItems: 'center',\n      marginBottom: '15px',\n      ...(props.headerProps?.style as CSSProperties || {})\n    },\n    ...(props.headerProps ? Object.fromEntries(\n      Object.entries(props.headerProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    defaultTitleNode,\n    h('button', {\n      class: joinClassNames(['btn-close-messages', props.closeButtonProps?.class as string]),\n      style: {\n        padding: '5px',\n        cursor: 'pointer',\n        border: 'none',\n        background: 'transparent',\n        ...(props.closeButtonProps?.style as CSSProperties || {})\n      },\n      onClick: (event: MouseEvent) => {\n        if (props.closeButtonProps?.onClick) {\n          (props.closeButtonProps.onClick as (event: MouseEvent) => void)(event)\n        }\n        if (!event.defaultPrevented) {\n          onClose()\n        }\n      },\n      ...(props.closeButtonProps ? Object.fromEntries(\n        Object.entries(props.closeButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {})\n    }, [defaultCloseIcon])\n  ])\n  \n  const headerNode = props.renderHeader\n    ? props.renderHeader({\n        defaultHeader: defaultHeaderNode,\n        activeTab: activeTab.value,\n        onClose\n      })\n    : defaultHeaderNode\n  \n  const dividerNode = h('hr', {\n    style: {\n      height: '1px',\n      backgroundColor: 'black',\n      marginTop: '5px',\n      marginBottom: '5px',\n      border: 'none'\n    }\n  })\n  \n  const switchToDirect = () => { activeTab.value = 'direct' }\n  const switchToGroup = () => { activeTab.value = 'group' }\n  \n  const defaultDirectTabButton = h('button', {\n    class: joinClassNames(['tab-button', 'tab-button-direct', props.tabButtonProps?.class as string]),\n    style: {\n      flex: 1,\n      padding: '10px',\n      backgroundColor: activeTab.value === 'direct' ? props.activeTabBackgroundColor : 'transparent',\n      color: activeTab.value === 'direct' ? 'white' : 'black',\n      border: 'none',\n      cursor: 'pointer',\n      fontWeight: activeTab.value === 'direct' ? 'bold' : 'normal',\n      ...(props.tabButtonProps?.style as CSSProperties || {})\n    },\n    onClick: (event: MouseEvent) => {\n      if (props.tabButtonProps?.onClick) {\n        (props.tabButtonProps.onClick as (event: MouseEvent) => void)(event)\n      }\n      if (!event.defaultPrevented) {\n        switchToDirect()\n      }\n    },\n    ...(props.tabButtonProps ? Object.fromEntries(\n      Object.entries(props.tabButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n    ) : {})\n  }, ['Direct'])\n  \n  const directTabButtonNode = props.renderTabButton\n    ? props.renderTabButton({\n        type: 'direct',\n        isActive: activeTab.value === 'direct',\n        defaultButton: defaultDirectTabButton,\n        switchTo: switchToDirect\n      })\n    : defaultDirectTabButton\n  \n  const defaultGroupTabButton = h('button', {\n    class: joinClassNames(['tab-button', 'tab-button-group', props.tabButtonProps?.class as string]),\n    style: {\n      flex: 1,\n      padding: '10px',\n      backgroundColor: activeTab.value === 'group' ? props.activeTabBackgroundColor : 'transparent',\n      color: activeTab.value === 'group' ? 'white' : 'black',\n      border: 'none',\n      cursor: 'pointer',\n      fontWeight: activeTab.value === 'group' ? 'bold' : 'normal',\n      ...(props.tabButtonProps?.style as CSSProperties || {})\n    },\n    onClick: (event: MouseEvent) => {\n      if (props.tabButtonProps?.onClick) {\n        (props.tabButtonProps.onClick as (event: MouseEvent) => void)(event)\n      }\n      if (!event.defaultPrevented) {\n        switchToGroup()\n      }\n    },\n    ...(props.tabButtonProps ? Object.fromEntries(\n      Object.entries(props.tabButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n    ) : {})\n  }, ['Group'])\n  \n  const groupTabButtonNode = props.renderTabButton\n    ? props.renderTabButton({\n        type: 'group',\n        isActive: activeTab.value === 'group',\n        defaultButton: defaultGroupTabButton,\n        switchTo: switchToGroup\n      })\n    : defaultGroupTabButton\n  \n  const defaultTabsNode = enableDirectTab.value ? h('div', {\n    class: joinClassNames(['tab-list', props.tabListProps?.class as string]),\n    style: {\n      display: 'flex',\n      flexDirection: 'row',\n      marginBottom: '10px',\n      ...(props.tabListProps?.style as CSSProperties || {})\n    },\n    ...(props.tabListProps ? Object.fromEntries(\n      Object.entries(props.tabListProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    directTabButtonNode,\n    groupTabButtonNode\n  ]) : null\n  \n  const tabsNode = props.renderTabs\n    ? props.renderTabs({\n        defaultTabs: defaultTabsNode,\n        activeTab: activeTab.value,\n        switchToDirect,\n        switchToGroup\n      })\n    : defaultTabsNode\n  \n  const defaultPanelsNode = h('div', {\n    class: 'panels-wrapper'\n  }, [\n    enableDirectTab.value && activeTab.value === 'direct'\n      ? h('div', {\n          class: joinClassNames(['direct-panel-wrapper', props.directPanelWrapperProps?.class as string]),\n          style: { ...(props.directPanelWrapperProps?.style as CSSProperties || {}) },\n          ...(props.directPanelWrapperProps ? Object.fromEntries(\n            Object.entries(props.directPanelWrapperProps).filter(([key]) => !['class', 'style'].includes(key))\n          ) : {})\n        }, [\n          h(MessagePanel, {\n            messages: directMessages.value,\n            messagesLength: props.messages.length,\n            type: 'direct',\n            username: props.member,\n            onSendMessagePress: props.onSendMessagePress,\n            backgroundColor: props.backgroundColor,\n            focusedInput: focusedInput.value,\n            showAlert: props.showAlert,\n            eventType: props.eventType,\n            member: props.member,\n            islevel: props.islevel,\n            startDirectMessage: props.startDirectMessage,\n            updateStartDirectMessage: props.updateStartDirectMessage,\n            directMessageDetails: props.directMessageDetails,\n            updateDirectMessageDetails: props.updateDirectMessageDetails,\n            coHostResponsibility: props.coHostResponsibility,\n            coHost: props.coHost,\n            roomName: props.roomName,\n            socket: props.socket,\n            chatSetting: props.chatSetting\n          })\n        ])\n      : null,\n    activeTab.value === 'group'\n      ? h('div', {\n          class: joinClassNames(['group-panel-wrapper', props.groupPanelWrapperProps?.class as string]),\n          style: { ...(props.groupPanelWrapperProps?.style as CSSProperties || {}) },\n          ...(props.groupPanelWrapperProps ? Object.fromEntries(\n            Object.entries(props.groupPanelWrapperProps).filter(([key]) => !['class', 'style'].includes(key))\n          ) : {})\n        }, [\n          h(MessagePanel, {\n            messages: groupMessages.value,\n            messagesLength: props.messages.length,\n            type: 'group',\n            username: props.member,\n            onSendMessagePress: props.onSendMessagePress,\n            backgroundColor: props.backgroundColor,\n            focusedInput: false,\n            showAlert: props.showAlert,\n            eventType: props.eventType,\n            member: props.member,\n            islevel: props.islevel,\n            startDirectMessage: props.startDirectMessage,\n            updateStartDirectMessage: props.updateStartDirectMessage,\n            directMessageDetails: props.directMessageDetails,\n            updateDirectMessageDetails: props.updateDirectMessageDetails,\n            coHostResponsibility: props.coHostResponsibility,\n            coHost: props.coHost,\n            roomName: props.roomName,\n            socket: props.socket,\n            chatSetting: props.chatSetting\n          })\n        ])\n      : null\n  ].filter(Boolean))\n  \n  const panelsNode = props.renderPanels\n    ? props.renderPanels({\n        defaultPanels: defaultPanelsNode,\n        activeTab: activeTab.value\n      })\n    : defaultPanelsNode\n  \n  const defaultBodyNode = h('div', {\n    class: joinClassNames(['modal-body', props.bodyProps?.class as string]),\n    style: { ...(props.bodyProps?.style as CSSProperties || {}) },\n    ...(props.bodyProps ? Object.fromEntries(\n      Object.entries(props.bodyProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    headerNode,\n    dividerNode,\n    tabsNode,\n    panelsNode\n  ].filter(Boolean))\n  \n  const bodyNode = props.renderBody\n    ? props.renderBody({\n        defaultBody: defaultBodyNode,\n        activeTab: activeTab.value\n      })\n    : defaultBodyNode\n  \n  const defaultContentNode = h('div', {\n    class: contentClassName.value,\n    style: contentStyle.value,\n    ...(props.contentProps ? Object.fromEntries(\n      Object.entries(props.contentProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [bodyNode])\n  \n  const contentNode = props.renderContent\n    ? props.renderContent({\n        defaultContent: defaultContentNode,\n        activeTab: activeTab.value\n      })\n    : defaultContentNode\n  \n  return h('div', {\n    class: overlayClassName.value,\n    style: overlayStyle.value,\n    ...(props.overlayProps ? Object.fromEntries(\n      Object.entries(props.overlayProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [contentNode])\n})\n</script>\n","<!--\n * MediaSettingsModal - Media device configuration modal\n *\n * @fileoverview\n * A comprehensive media settings modal for selecting and configuring audio/video devices.\n * Provides dropdowns for camera and microphone selection, quick camera switching,\n * and virtual background access. Integrates with MediaSFU device management methods.\n *\n * @component MediaSettingsModal\n * @module components/mediaSettingsComponents/MediaSettingsModal\n *\n * @description\n * This modal provides a complete media device configuration interface with:\n * - Camera device selection dropdown (front/back/external cameras)\n * - Microphone device selection dropdown\n * - Quick switch camera button (for mobile devices)\n * - Virtual background button (opens background modal)\n * - Real-time device enumeration and updates\n * - Automatic device labeling (Camera 1, Camera 2, etc.)\n * - Permission handling and error messaging\n * - Customizable positioning (topRight, topLeft, bottomRight, bottomLeft)\n * - Fully customizable render functions for header and body\n *\n * @example\n * // Basic media settings modal\n * // <MediaSettingsModal\n *   // :is-media-settings-modal-visible=\"showMediaSettings\"\n *   // :on-media-settings-close=\"() => setShowMediaSettings(false)\"\n *   // :parameters=\"{\n *     userDefaultVideoInputDevice,\n *     videoInputs,\n *     audioInputs,\n *     userDefaultAudioInputDevice,\n *     isBackgroundModalVisible,\n *     updateIsBackgroundModalVisible,\n *     getUpdatedAllParams\n *   }\"\n * // />\n *\n * @example\n * // Custom styled with position and color\n * // <MediaSettingsModal\n *   // :is-media-settings-modal-visible=\"showSettings\"\n *   // :on-media-settings-close=\"closeSettings\"\n *   // :parameters=\"settingsParams\"\n *   // position=\"bottomLeft\"\n *   // background-color=\"#1a1a1a\"\n *   // title=\"Device Settings\"\n * // />\n *\n * @example\n * // Custom switch handlers\n * // <MediaSettingsModal\n *   // :is-media-settings-modal-visible=\"showSettings\"\n *   // :on-media-settings-close=\"closeSettings\"\n *   // :parameters=\"params\"\n *   // :switch-camera-on-press=\"async (options) => {\n *     // Custom camera switching logic\n *     await customSwitchCamera(options);\n *   }\"\n *   // :switch-video-on-press=\"async (options) => {\n *     // Custom video device switching\n *     await customSwitchVideo(options);\n *   }\"\n *   // :switch-audio-on-press=\"async (options) => {\n *     // Custom audio device switching\n *     await customSwitchAudio(options);\n *   }\"\n * // />\n *\n * @example\n * // Custom render function\n * // <MediaSettingsModal\n *   // :is-media-settings-modal-visible=\"showSettings\"\n *   // :on-media-settings-close=\"closeSettings\"\n *   // :parameters=\"params\"\n *   // :render-body=\"(options) => {\n *     const { defaultBody } = options;\n *     return h('div', { class: 'custom-settings-body' }, [\n *       h('div', { class: 'settings-hint' }, 'Select your devices:'),\n *       defaultBody\n *     ]);\n *   }\"\n * // />\n *\n * @example\n * // Custom labels and icons\n * // <MediaSettingsModal\n *   // :is-media-settings-modal-visible=\"showSettings\"\n *   // :on-media-settings-close=\"closeSettings\"\n *   // :parameters=\"params\"\n *   // camera-label=\"Video Source\"\n *   // microphone-label=\"Audio Source\"\n *   // switch-camera-button-label=\"Flip Camera\"\n *   // virtual-background-button-label=\"Backgrounds\"\n *   // :camera-icon-component=\"h(FontAwesomeIcon, { icon: faVideoCustom })\"\n *   // :microphone-icon-component=\"h(FontAwesomeIcon, { icon: faMicrophoneCustom })\"\n * // />\n-->\n<template>\n  <RenderVNode :node=\"overlayNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, defineComponent, h, isVNode, type PropType, type VNodeChild, type HTMLAttributes, type ButtonHTMLAttributes, type SelectHTMLAttributes, type LabelHTMLAttributes, type StyleValue } from 'vue'\nimport { faTimes, faCamera, faMicrophone, faSyncAlt, faPhotoFilm } from '@fortawesome/free-solid-svg-icons'\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'\nimport {\n  switchAudio,\n  type SwitchAudioOptions,\n  type SwitchAudioParameters,\n  switchVideo,\n  type SwitchVideoOptions,\n  type SwitchVideoParameters,\n  switchVideoAlt,\n  type SwitchVideoAltOptions,\n  type SwitchVideoAltParameters\n} from 'mediasfu-shared'\n\n/**\n * Parameters required by MediaSettingsModal for device management\n * \n * @interface MediaSettingsModalParameters\n * @extends SwitchAudioParameters\n * @extends SwitchVideoParameters\n * @extends SwitchVideoAltParameters\n * @property {string} userDefaultVideoInputDevice - Currently selected video device ID\n * @property {MediaDeviceInfo[]} videoInputs - Array of available video input devices\n * @property {MediaDeviceInfo[]} audioInputs - Array of available audio input devices\n * @property {string} userDefaultAudioInputDevice - Currently selected audio device ID\n * @property {boolean} isBackgroundModalVisible - Whether background modal is open\n * @property {(visible: boolean) => void} updateIsBackgroundModalVisible - Function to toggle background modal\n * @property {() => MediaSettingsModalParameters} getUpdatedAllParams - Function to get fresh parameter state\n */\nexport interface MediaSettingsModalParameters\n  extends SwitchAudioParameters,\n    SwitchVideoParameters,\n    SwitchVideoAltParameters {\n  userDefaultVideoInputDevice: string\n  videoInputs: MediaDeviceInfo[]\n  audioInputs: MediaDeviceInfo[]\n  userDefaultAudioInputDevice: string\n  isBackgroundModalVisible: boolean\n  updateIsBackgroundModalVisible: (visible: boolean) => void\n\n  // mediasfu functions\n  getUpdatedAllParams: () => MediaSettingsModalParameters\n}\n\n/**\n * MediaSettingsModal props interface\n * \n * @interface MediaSettingsModalProps\n * @property {boolean} isMediaSettingsModalVisible - Whether modal is visible\n * @property {() => void} onMediaSettingsClose - Function to close the modal\n * @property {(options: SwitchVideoAltOptions) => Promise<void>} [switchCameraOnPress] - Function for quick camera switch (mobile)\n * @property {(options: SwitchVideoOptions) => Promise<void>} [switchVideoOnPress] - Function to switch video device\n * @property {(options: SwitchAudioOptions) => Promise<void>} [switchAudioOnPress] - Function to switch audio device\n * @property {MediaSettingsModalParameters} parameters - All required parameters for device operations\n * @property {'topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft'} [position='topRight'] - Modal position\n * @default 'topRight'\n * @property {string} [backgroundColor='#83c0e9'] - Modal background color\n * @default '#83c0e9'\n * @property {VNodeChild} [title='Media Settings'] - Modal title text or VNode\n * @default 'Media Settings'\n * @property {HTMLAttributes} [overlayProps] - HTML attributes for overlay backdrop\n * @property {HTMLAttributes} [contentProps] - HTML attributes for modal content container\n * @property {HTMLAttributes} [headerProps] - HTML attributes for header section\n * @property {HTMLAttributes} [titleProps] - HTML attributes for title element\n * @property {ButtonHTMLAttributes} [closeButtonProps] - HTML attributes for close button\n * @property {VNodeChild} [closeIconComponent] - Custom close icon component\n * @property {HTMLAttributes} [headerDividerProps] - HTML attributes for header divider\n * @property {HTMLAttributes} [bodyProps] - HTML attributes for modal body\n * @property {HTMLAttributes} [cameraFieldProps] - HTML attributes for camera field wrapper\n * @property {LabelHTMLAttributes} [cameraLabelProps] - HTML attributes for camera label\n * @property {VNodeChild} [cameraLabel] - Custom camera label text or VNode\n * @property {VNodeChild} [cameraIconComponent] - Custom camera icon component\n * @property {SelectHTMLAttributes} [cameraSelectProps] - HTML attributes for camera select dropdown\n * @property {HTMLAttributes} [microphoneFieldProps] - HTML attributes for microphone field wrapper\n * @property {LabelHTMLAttributes} [microphoneLabelProps] - HTML attributes for microphone label\n * @property {VNodeChild} [microphoneLabel] - Custom microphone label text or VNode\n * @property {VNodeChild} [microphoneIconComponent] - Custom microphone icon component\n * @property {SelectHTMLAttributes} [microphoneSelectProps] - HTML attributes for microphone select dropdown\n * @property {ButtonHTMLAttributes} [switchCameraButtonProps] - HTML attributes for switch camera button\n * @property {VNodeChild} [switchCameraButtonLabel='Switch Camera'] - Switch camera button label\n * @default 'Switch Camera'\n * @property {VNodeChild} [switchCameraIconComponent] - Custom switch camera icon component\n * @property {HTMLAttributes} [middleDividerProps] - HTML attributes for middle divider\n * @property {ButtonHTMLAttributes} [virtualBackgroundButtonProps] - HTML attributes for virtual background button\n * @property {VNodeChild} [virtualBackgroundButtonLabel='Virtual Background'] - Virtual background button label\n * @default 'Virtual Background'\n * @property {VNodeChild} [virtualBackgroundIconComponent] - Custom virtual background icon component\n * @property {(options: HeaderRenderOptions) => VNodeChild} [renderHeader] - Custom header renderer\n * @example\n * ```typescript\n * renderHeader: ({ defaultHeader, onClose }) => {\n *   // return h('div', { class: 'custom-header' }, [\n *     h('h3', {}, 'Device Configuration'),\n *     h('button', { onClick: onClose }, '×')\n *   ]);\n * }\n * ```\n * @property {(options: BodyRenderOptions) => VNodeChild} [renderBody] - Custom body renderer\n * @example\n * ```typescript\n * renderBody: ({ defaultBody }) => {\n *   // return h('div', { class: 'custom-body' }, [\n *     h('p', {}, 'Select your devices below:'),\n *     defaultBody\n *   ]);\n * }\n * ```\n * @property {(options: ContentRenderOptions) => VNodeChild} [renderContent] - Custom content renderer\n */\nexport interface MediaSettingsModalProps {\n  isMediaSettingsModalVisible: boolean\n  onMediaSettingsClose: () => void\n  switchCameraOnPress?: (options: SwitchVideoAltOptions) => Promise<void>\n  switchVideoOnPress?: (options: SwitchVideoOptions) => Promise<void>\n  switchAudioOnPress?: (options: SwitchAudioOptions) => Promise<void>\n  parameters: MediaSettingsModalParameters\n  position?: 'topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft'\n  backgroundColor?: string\n  // UI Override Props\n  title?: VNodeChild\n  overlayProps?: HTMLAttributes\n  contentProps?: HTMLAttributes\n  headerProps?: HTMLAttributes\n  titleProps?: HTMLAttributes\n  closeButtonProps?: ButtonHTMLAttributes\n  closeIconComponent?: VNodeChild\n  headerDividerProps?: HTMLAttributes\n  bodyProps?: HTMLAttributes\n  cameraFieldProps?: HTMLAttributes\n  cameraLabelProps?: LabelHTMLAttributes\n  cameraLabel?: VNodeChild\n  cameraIconComponent?: VNodeChild\n  cameraSelectProps?: SelectHTMLAttributes\n  microphoneFieldProps?: HTMLAttributes\n  microphoneLabelProps?: LabelHTMLAttributes\n  microphoneLabel?: VNodeChild\n  microphoneIconComponent?: VNodeChild\n  microphoneSelectProps?: SelectHTMLAttributes\n  switchCameraButtonProps?: ButtonHTMLAttributes\n  switchCameraButtonLabel?: VNodeChild\n  switchCameraIconComponent?: VNodeChild\n  middleDividerProps?: HTMLAttributes\n  virtualBackgroundButtonProps?: ButtonHTMLAttributes\n  virtualBackgroundButtonLabel?: VNodeChild\n  virtualBackgroundIconComponent?: VNodeChild\n  renderHeader?: (options: {\n    defaultHeader: VNodeChild\n    onClose: () => void\n  }) => VNodeChild\n  renderBody?: (options: {\n    defaultBody: VNodeChild\n  }) => VNodeChild\n  renderContent?: (options: {\n    defaultContent: VNodeChild\n  }) => VNodeChild\n}\n\nconst props = withDefaults(defineProps<MediaSettingsModalProps>(), {\n  switchCameraOnPress: undefined,\n  switchVideoOnPress: undefined,\n  switchAudioOnPress: undefined,\n  position: 'topRight',\n  backgroundColor: '#83c0e9',\n  title: 'Media Settings',\n  overlayProps: undefined,\n  contentProps: undefined,\n  headerProps: undefined,\n  titleProps: undefined,\n  closeButtonProps: undefined,\n  closeIconComponent: undefined,\n  headerDividerProps: undefined,\n  bodyProps: undefined,\n  cameraFieldProps: undefined,\n  cameraLabelProps: undefined,\n  cameraLabel: undefined,\n  cameraIconComponent: undefined,\n  cameraSelectProps: undefined,\n  microphoneFieldProps: undefined,\n  microphoneLabelProps: undefined,\n  microphoneLabel: undefined,\n  microphoneIconComponent: undefined,\n  microphoneSelectProps: undefined,\n  switchCameraButtonProps: undefined,\n  switchCameraButtonLabel: 'Switch Camera',\n  switchCameraIconComponent: undefined,\n  middleDividerProps: undefined,\n  virtualBackgroundButtonProps: undefined,\n  virtualBackgroundButtonLabel: 'Virtual Background',\n  virtualBackgroundIconComponent: undefined,\n  renderHeader: undefined,\n  renderBody: undefined,\n  renderContent: undefined,\n});\n\n// Manually provide defaults for optional props\nconst switchCameraOnPress = computed(() => props.switchCameraOnPress ?? switchVideoAlt);\nconst switchVideoOnPress = computed(() => props.switchVideoOnPress ?? switchVideo);\nconst switchAudioOnPress = computed(() => props.switchAudioOnPress ?? switchAudio);\n\nconst videoInputs = computed(() => props.parameters.videoInputs)\nconst audioInputs = computed(() => props.parameters.audioInputs)\n\nconst resolveSelection = (\n  preferred: string,\n  inputs: MediaDeviceInfo[]\n): string => {\n  const match = preferred\n    ? inputs.find((input) => input.deviceId === preferred)\n    : undefined\n  if (match) {\n    return match.deviceId\n  }\n  const [first] = inputs\n  return first ? first.deviceId : ''\n}\n\nconst lastAppliedVideoInput = ref('')\nconst lastAppliedAudioInput = ref('')\n\nconst selectedVideoInput = ref('')\nconst selectedAudioInput = ref('')\n\nconst syncVideoSelection = (candidate: string) => {\n  const resolved = resolveSelection(candidate || lastAppliedVideoInput.value, videoInputs.value)\n  if (resolved !== selectedVideoInput.value) {\n    selectedVideoInput.value = resolved\n  }\n  lastAppliedVideoInput.value = resolved\n}\n\nconst syncAudioSelection = (candidate: string) => {\n  const resolved = resolveSelection(candidate || lastAppliedAudioInput.value, audioInputs.value)\n  if (resolved !== selectedAudioInput.value) {\n    selectedAudioInput.value = resolved\n  }\n  lastAppliedAudioInput.value = resolved\n}\n\nwatch(\n  () => props.parameters.userDefaultVideoInputDevice,\n  (preferred) => {\n    syncVideoSelection(preferred ?? '')\n  },\n  { immediate: true }\n)\n\nwatch(\n  videoInputs,\n  () => {\n    syncVideoSelection(lastAppliedVideoInput.value || selectedVideoInput.value)\n  },\n  { deep: true }\n)\n\nwatch(\n  () => props.parameters.userDefaultAudioInputDevice,\n  (preferred) => {\n    syncAudioSelection(preferred ?? '')\n  },\n  { immediate: true }\n)\n\nwatch(\n  audioInputs,\n  () => {\n    syncAudioSelection(lastAppliedAudioInput.value || selectedAudioInput.value)\n  },\n  { deep: true }\n)\n\nconst handleSwitchCamera = async () => {\n  await switchCameraOnPress.value({ parameters: props.parameters })\n}\n\nconst handleVideoSwitch = async () => {\n  const value = selectedVideoInput.value\n  if (!value || value === lastAppliedVideoInput.value) {\n    return\n  }\n  await switchVideoOnPress.value({\n    videoPreference: value,\n    parameters: props.parameters\n  })\n  lastAppliedVideoInput.value = value\n}\n\nconst handleAudioSwitch = async () => {\n  const value = selectedAudioInput.value\n  if (!value || value === lastAppliedAudioInput.value) {\n    return\n  }\n  await switchAudioOnPress.value({\n    audioPreference: value,\n    parameters: props.parameters\n  })\n  lastAppliedAudioInput.value = value\n}\n\nconst showVirtual = () => {\n  props.parameters.updateIsBackgroundModalVisible(\n    !props.parameters.isBackgroundModalVisible\n  )\n}\n\n// Inline RenderVNode component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Function] as PropType<VNodeChild>,\n      default: null\n    }\n  },\n  setup(props) {\n    return () => {\n      const node = props.node\n      if (isVNode(node)) {\n        return node\n      } else if (typeof node === 'function') {\n        return (node as () => VNodeChild)()\n      } else {\n        return node\n      }\n    }\n  }\n})\n\n// Helper functions\nconst joinClassNames = (...classes: (string | undefined | null)[]): string => {\n  return classes.filter(Boolean).join(' ')\n}\n\nconst safeSpreadStyle = (style: StyleValue | undefined) => {\n  return style && typeof style === 'object' ? style : {}\n}\n\n// Computed properties for styles\nconst defaultOverlayWidth = typeof window !== 'undefined' ? Math.min(window.innerWidth * 0.8, 350) : 320\n\nconst overlayStyle = computed(() => ({\n  position: 'fixed' as const,\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  display: props.isMediaSettingsModalVisible ? 'block' : 'none',\n  zIndex: 999,\n  ...safeSpreadStyle(props.overlayProps?.style)\n}))\n\nconst overlayClassName = computed(() =>\n  joinClassNames('mediasfu-media-settings-modal', props.overlayProps?.class as string)\n)\n\nconst contentStyle = computed(() => ({\n  position: 'fixed' as const,\n  backgroundColor: props.backgroundColor,\n  borderRadius: '10px',\n  padding: '16px',\n  width: `${defaultOverlayWidth}px`,\n  maxHeight: '65%',\n  overflow: 'hidden' as const,\n  top: props.position.includes('top') ? '10px' : 'auto',\n  bottom: props.position.includes('bottom') ? '10px' : 'auto',\n  left: props.position.includes('Left') ? '10px' : 'auto',\n  right: props.position.includes('Right') ? '10px' : 'auto',\n  display: 'flex',\n  flexDirection: 'column' as const,\n  gap: '12px',\n  boxShadow: '0 10px 30px rgba(0, 0, 0, 0.25)',\n  ...safeSpreadStyle(props.contentProps?.style)\n}))\n\nconst contentClassName = computed(() => \n  joinClassNames('mediasfu-media-settings-modal__content', props.contentProps?.class as string)\n)\n\n// Main overlay node\nconst overlayNode = computed(() => {\n  const defaultCloseIcon = props.closeIconComponent ?? h(FontAwesomeIcon, { icon: faTimes, size: 'xl' })\n  \n  const defaultTitleNode = h('div', {\n    class: joinClassNames('modal-title', props.titleProps?.class as string),\n    style: {\n      margin: 0,\n      fontSize: '1.25rem',\n      fontWeight: 'bold',\n      color: 'black',\n      ...safeSpreadStyle(props.titleProps?.style)\n    },\n    ...(props.titleProps ? Object.fromEntries(\n      Object.entries(props.titleProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, typeof props.title === 'string' || typeof props.title === 'number' ? [props.title] : (props.title || []))\n  \n  const defaultHeaderNode = h('div', {\n    class: joinClassNames('modal-header', props.headerProps?.class as string),\n    style: {\n      display: 'flex',\n      justifyContent: 'space-between',\n      alignItems: 'center',\n      gap: '12px',\n      ...safeSpreadStyle(props.headerProps?.style)\n    },\n    ...(props.headerProps ? Object.fromEntries(\n      Object.entries(props.headerProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    defaultTitleNode,\n    h('button', {\n      class: joinClassNames('btn-close-media-settings', props.closeButtonProps?.class as string),\n      style: {\n        background: 'none',\n        border: 'none',\n        padding: '4px',\n        cursor: 'pointer',\n        display: 'inline-flex',\n        alignItems: 'center',\n        justifyContent: 'center',\n        color: 'black',\n        marginLeft: 'auto',\n        marginRight: '10px',\n        ...safeSpreadStyle(props.closeButtonProps?.style)\n      },\n      onClick: (event: MouseEvent) => {\n        if (props.closeButtonProps?.onClick) {\n          (props.closeButtonProps.onClick as (event: MouseEvent) => void)(event)\n        }\n        if (!event.defaultPrevented) {\n          props.onMediaSettingsClose()\n        }\n      },\n      ...(props.closeButtonProps ? Object.fromEntries(\n        Object.entries(props.closeButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {})\n    }, [defaultCloseIcon])\n  ])\n  \n  const headerNode = props.renderHeader\n    ? props.renderHeader({ defaultHeader: defaultHeaderNode, onClose: props.onMediaSettingsClose })\n    : defaultHeaderNode\n  \n  const dividerNode = h('hr', {\n    class: 'hr',\n    style: {\n      height: '1px',\n      backgroundColor: 'black',\n      marginTop: '5px',\n      marginBottom: '5px',\n      border: 'none',\n      ...safeSpreadStyle(props.headerDividerProps?.style)\n    },\n    ...(props.headerDividerProps ? Object.fromEntries(\n      Object.entries(props.headerDividerProps).filter(([key]) => !['style'].includes(key))\n    ) : {})\n  })\n  \n  // Camera field\n  const defaultCameraIcon = props.cameraIconComponent ?? h(FontAwesomeIcon, { icon: faCamera })\n  const defaultCameraLabel = props.cameraLabel ?? [defaultCameraIcon, ' Select Camera:']\n  \n  const cameraSelectNode = h('select', {\n    class: joinClassNames('form-control', props.cameraSelectProps?.class as string),\n    value: selectedVideoInput.value,\n    onChange: (event: Event) => {\n      const target = event.target as HTMLSelectElement | null\n      if (target && target.value) {\n        selectedVideoInput.value = target.value\n      }\n      if (props.cameraSelectProps?.onChange) {\n        (props.cameraSelectProps.onChange as (event: Event) => void)(event)\n      }\n      if (!event.defaultPrevented) {\n        handleVideoSwitch()\n      }\n    },\n    ...(props.cameraSelectProps ? Object.fromEntries(\n      Object.entries(props.cameraSelectProps).filter(([key]) => !['class', 'value', 'onChange'].includes(key))\n    ) : {})\n  }, videoInputs.value.map(input =>\n    h('option', { value: input.deviceId, key: input.deviceId }, [input.label])\n  ))\n  \n  const cameraFieldNode = h('div', {\n    class: joinClassNames('form-group', props.cameraFieldProps?.class as string),\n    style: { ...safeSpreadStyle(props.cameraFieldProps?.style) },\n    ...(props.cameraFieldProps ? Object.fromEntries(\n      Object.entries(props.cameraFieldProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    h('label', {\n      ...(props.cameraLabelProps || {})\n    }, typeof defaultCameraLabel === 'string' || typeof defaultCameraLabel === 'number' \n      ? [defaultCameraLabel] \n      : (defaultCameraLabel || [])\n    ),\n    cameraSelectNode\n  ])\n  \n  // Microphone field\n  const defaultMicrophoneIcon = props.microphoneIconComponent ?? h(FontAwesomeIcon, { icon: faMicrophone })\n  const defaultMicrophoneLabel = props.microphoneLabel ?? [defaultMicrophoneIcon, ' Select Microphone:']\n  \n  const microphoneSelectNode = h('select', {\n    class: joinClassNames('form-control', props.microphoneSelectProps?.class as string),\n    value: selectedAudioInput.value,\n    onChange: (event: Event) => {\n      const target = event.target as HTMLSelectElement | null\n      if (target && target.value) {\n        selectedAudioInput.value = target.value\n      }\n      if (props.microphoneSelectProps?.onChange) {\n        (props.microphoneSelectProps.onChange as (event: Event) => void)(event)\n      }\n      if (!event.defaultPrevented) {\n        handleAudioSwitch()\n      }\n    },\n    ...(props.microphoneSelectProps ? Object.fromEntries(\n      Object.entries(props.microphoneSelectProps).filter(([key]) => !['class', 'value', 'onChange'].includes(key))\n    ) : {})\n  }, audioInputs.value.map(input =>\n    h('option', { value: input.deviceId, key: input.deviceId }, [input.label])\n  ))\n  \n  const microphoneFieldNode = h('div', {\n    class: joinClassNames('form-group', props.microphoneFieldProps?.class as string),\n    style: {\n      marginTop: '10px',\n      ...safeSpreadStyle(props.microphoneFieldProps?.style)\n    },\n    ...(props.microphoneFieldProps ? Object.fromEntries(\n      Object.entries(props.microphoneFieldProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    h('label', {\n      ...(props.microphoneLabelProps || {})\n    }, typeof defaultMicrophoneLabel === 'string' || typeof defaultMicrophoneLabel === 'number' \n      ? [defaultMicrophoneLabel] \n      : (defaultMicrophoneLabel || [])\n    ),\n    microphoneSelectNode\n  ])\n  \n  // Switch Camera button\n  const defaultSwitchCameraIcon = props.switchCameraIconComponent ?? h(FontAwesomeIcon, { icon: faSyncAlt })\n  const defaultSwitchCameraLabel = props.switchCameraButtonLabel ?? 'Switch Camera'\n  \n  const switchCameraButtonNode = h('div', {\n    class: 'form-group'\n  }, [\n    h('button', {\n      class: joinClassNames('btn-switch-camera', props.switchCameraButtonProps?.class as string),\n      style: {\n        backgroundColor: '#83c0e9',\n        color: 'black',\n        padding: '10px',\n        borderRadius: '5px',\n        border: 'none',\n        cursor: 'pointer',\n        width: '100%',\n        marginTop: '20px',\n        ...safeSpreadStyle(props.switchCameraButtonProps?.style)\n      },\n      onClick: (event: MouseEvent) => {\n        if (props.switchCameraButtonProps?.onClick) {\n          (props.switchCameraButtonProps.onClick as (event: MouseEvent) => void)(event)\n        }\n        if (!event.defaultPrevented) {\n          void handleSwitchCamera()\n        }\n      },\n      ...(props.switchCameraButtonProps ? Object.fromEntries(\n        Object.entries(props.switchCameraButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {})\n    }, [\n      defaultSwitchCameraIcon,\n      ' ',\n      defaultSwitchCameraLabel\n    ])\n  ])\n  \n  // Middle divider\n  const middleDividerNode = h('hr', {\n    style: {\n      height: '1px',\n      backgroundColor: 'black',\n      marginTop: '10px',\n      marginBottom: '10px',\n      border: 'none',\n      ...safeSpreadStyle(props.middleDividerProps?.style)\n    },\n    ...(props.middleDividerProps ? Object.fromEntries(\n      Object.entries(props.middleDividerProps).filter(([key]) => !['style'].includes(key))\n    ) : {})\n  })\n  \n  // Virtual Background button\n  const defaultVirtualBackgroundIcon = props.virtualBackgroundIconComponent ?? h(FontAwesomeIcon, { icon: faPhotoFilm })\n  const defaultVirtualBackgroundLabel = props.virtualBackgroundButtonLabel ?? 'Virtual Background'\n  \n  const virtualBackgroundButtonNode = h('div', {\n    class: 'form-group'\n  }, [\n    h('button', {\n      class: joinClassNames('btn-virtual-background', props.virtualBackgroundButtonProps?.class as string),\n      style: {\n        backgroundColor: '#83c0e9',\n        color: 'black',\n        padding: '10px',\n        borderRadius: '5px',\n        border: 'none',\n        cursor: 'pointer',\n        width: '100%',\n        ...safeSpreadStyle(props.virtualBackgroundButtonProps?.style)\n      },\n      onClick: (event: MouseEvent) => {\n        if (props.virtualBackgroundButtonProps?.onClick) {\n          (props.virtualBackgroundButtonProps.onClick as (event: MouseEvent) => void)(event)\n        }\n        if (!event.defaultPrevented) {\n          showVirtual()\n        }\n      },\n      ...(props.virtualBackgroundButtonProps ? Object.fromEntries(\n        Object.entries(props.virtualBackgroundButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {})\n    }, [\n      defaultVirtualBackgroundIcon,\n      ' ',\n      defaultVirtualBackgroundLabel\n    ])\n  ])\n  \n  // Body content\n  const defaultBodyNode = h('div', {\n    class: joinClassNames('modal-body', props.bodyProps?.class as string),\n    style: {\n      overflowY: 'auto',\n      flex: 1,\n      ...safeSpreadStyle(props.bodyProps?.style)\n    },\n    ...(props.bodyProps ? Object.fromEntries(\n      Object.entries(props.bodyProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    cameraFieldNode,\n    microphoneFieldNode,\n    switchCameraButtonNode,\n    middleDividerNode,\n    virtualBackgroundButtonNode\n  ])\n  \n  const bodyNode = props.renderBody\n    ? props.renderBody({ defaultBody: defaultBodyNode })\n    : defaultBodyNode\n  \n  // Content\n  const defaultContentNode = h('div', {\n    class: contentClassName.value,\n    style: contentStyle.value,\n    ...(props.contentProps ? Object.fromEntries(\n      Object.entries(props.contentProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    headerNode,\n    dividerNode,\n    bodyNode\n  ])\n  \n  const contentNode = props.renderContent\n    ? props.renderContent({ defaultContent: defaultContentNode })\n    : defaultContentNode\n  \n  return h('div', {\n    class: overlayClassName.value,\n    style: overlayStyle.value,\n    ...(props.overlayProps ? Object.fromEntries(\n      Object.entries(props.overlayProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [contentNode])\n})\n</script>\n\n<style scoped>\n.modal-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-bottom: 15px;\n}\n\n.modal-title {\n  font-size: 18px;\n  font-weight: bold;\n  color: black;\n}\n\n.hr {\n  height: 1px;\n  background-color: black;\n  margin-top: 5px;\n  margin-bottom: 5px;\n  border: none;\n}\n\n.modal-body {\n  padding: 10px 0;\n}\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n.form-group label {\n  display: block;\n  font-size: 14px;\n  font-weight: bold;\n  color: black;\n  margin-bottom: 5px;\n}\n\n.form-control {\n  width: 100%;\n  padding: 8px 10px;\n  font-size: 14px;\n  border: 1px solid gray;\n  border-radius: 4px;\n  background-color: white;\n  color: black;\n}\n\n.btn-close-media-settings {\n  cursor: pointer;\n}\n</style>\n","<!--\n * ConfirmExitModal - Event exit confirmation modal\n *\n * @fileoverview\n * A confirmation modal for exiting/leaving the event. Provides different exit options\n * based on user role (host vs participant), with options to end event for all or just\n * leave personally. Includes optional ban functionality for removing problematic users.\n *\n * @component ConfirmExitModal\n * @module components/exitComponents/ConfirmExitModal\n *\n * @description\n * This modal provides exit confirmation with:\n * - Role-based exit options (host can end event for all, participants just leave)\n * - Customizable confirmation messages based on user level\n * - Optional ban parameter for removing users\n * - Socket.io integration for notifying server\n * - Customizable positioning and styling\n * - Fully customizable render functions for all sections\n * - Confirm/Cancel buttons with custom labels\n *\n * @example\n * // Basic exit confirmation - participant\n * // <ConfirmExitModal\n *   // :is-confirm-exit-modal-visible=\"showExitConfirm\"\n *   // :on-confirm-exit-close=\"() => setShowExitConfirm(false)\"\n *   // :member=\"currentUser\"\n *   // :room-name=\"roomName\"\n *   // :socket=\"socket\"\n *   // islevel=\"2\"\n * // />\n *\n * @example\n * // Host exit with custom message\n * // <ConfirmExitModal\n *   // :is-confirm-exit-modal-visible=\"showExitConfirm\"\n *   // :on-confirm-exit-close=\"closeExitModal\"\n *   // :member=\"hostName\"\n *   // :room-name=\"roomName\"\n *   // :socket=\"socket\"\n *   // islevel=\"2\"\n *   // :message=\"(context) => {\n *     return context.islevel === '2'\n *       ? 'Are you sure you want to end the event for everyone?'\n *       : 'Are you sure you want to leave the event?';\n *   }\"\n * // />\n *\n * @example\n * // Custom exit handler with analytics\n * // <ConfirmExitModal\n *   // :is-confirm-exit-modal-visible=\"showExitConfirm\"\n *   // :on-confirm-exit-close=\"closeExitModal\"\n *   // :member=\"member\"\n *   // :room-name=\"roomName\"\n *   // :socket=\"socket\"\n *   // :islevel=\"islevel\"\n *   // :exit-event-on-confirm=\"async (options) => {\n *     // Track exit event\n *     await trackAnalytics('user_exit', { member: options.member });\n *     // Execute default exit\n *     await confirmExit(options);\n *   }\"\n * // />\n *\n * @example\n * // Ban user (moderator action)\n * // <ConfirmExitModal\n *   // :is-confirm-exit-modal-visible=\"showBanConfirm\"\n *   // :on-confirm-exit-close=\"closeBanModal\"\n *   // :member=\"targetUser\"\n *   // :room-name=\"roomName\"\n *   // :socket=\"socket\"\n *   // islevel=\"1\"\n *   // :ban=\"true\"\n *   // title=\"Ban User\"\n *   // confirm-label=\"Ban & Remove\"\n *   // :message=\"`Are you sure you want to ban ${targetUser}?`\"\n * // />\n *\n * @example\n * // Custom render functions\n * // <ConfirmExitModal\n *   // :is-confirm-exit-modal-visible=\"showExitConfirm\"\n *   // :on-confirm-exit-close=\"closeExitModal\"\n *   // :member=\"member\"\n *   // :room-name=\"roomName\"\n *   // :socket=\"socket\"\n *   // :islevel=\"islevel\"\n *   // :render-footer=\"(options) => {\n *     const { onCancel, onConfirm } = options;\n *     return h('div', { class: 'custom-footer' }, [\n *       h('button', { onClick: onCancel, class: 'btn-cancel' }, 'Stay'),\n *       h('button', { onClick: onConfirm, class: 'btn-confirm-danger' }, 'Leave Event')\n *     ]);\n *   }\"\n * // />\n-->\n<template>\n  <RenderVNode :node=\"overlayNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  computed,\n  defineComponent,\n  h,\n  isVNode,\n  type ButtonHTMLAttributes,\n  type CSSProperties,\n  type HTMLAttributes,\n  type PropType,\n  type VNodeChild,\n} from 'vue';\nimport type { MediaSFUSocket } from '../../types/socket';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faTimes } from '@fortawesome/free-solid-svg-icons';\nimport { confirmExit, type ConfirmExitOptions } from 'mediasfu-shared';\n\n// Helper to join class names\nfunction joinClassNames(...classes: Array<string | undefined | null | false>): string | undefined {\n  const filtered = classes.filter(Boolean) as string[];\n  return filtered.length > 0 ? filtered.join(' ').trim() : undefined;\n}\n\n/**\n * ConfirmExitModal props interface\n * \n * @interface ConfirmExitModalProps\n * @property {boolean} isConfirmExitModalVisible - Whether modal is visible\n * @property {() => void} onConfirmExitClose - Function to close the modal\n * @property {'topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft'} [position='topRight'] - Modal position\n * @default 'topRight'\n * @property {string} [backgroundColor='#83c0e9'] - Modal background color\n * @default '#83c0e9'\n * @property {(options: ConfirmExitOptions) => void} [exitEventOnConfirm=confirmExit] - Function to execute exit\n * @default confirmExit\n * @property {string} member - Member/user name exiting the event\n * @property {boolean} [ban=false] - Whether this is a ban action (removes user from event)\n * @default false\n * @property {string} roomName - Event room name/ID\n * @property {MediaSFUSocket} socket - Socket.io instance for server communication\n * @property {string} islevel - User permission level ('0'=host, '1'=co-host, '2'=participant)\n * @property {VNodeChild} [title='Confirm Exit'] - Modal title text or VNode\n * @default 'Confirm Exit'\n * @property {VNodeChild} [confirmLabel] - Confirm button label (auto-generated if not provided)\n * @property {VNodeChild} [cancelLabel='Cancel'] - Cancel button label\n * @default 'Cancel'\n * @property {VNodeChild | ((context: { islevel: string }) => VNodeChild)} [message] - Confirmation message (auto-generated if not provided)\n * @example\n * ```typescript\n * // Static message\n * message: \"Are you sure you want to leave?\"\n * \n * // Dynamic message based on role\n * message: (context) => {\n *   // return context.islevel === '2' \n *     ? 'End event for all?' \n *     : 'Leave event?';\n * }\n * ```\n * @property {HTMLAttributes} [overlayProps] - HTML attributes for overlay backdrop\n * @property {HTMLAttributes} [contentProps] - HTML attributes for modal content container\n * @property {HTMLAttributes} [headerProps] - HTML attributes for header section\n * @property {HTMLAttributes} [titleProps] - HTML attributes for title element\n * @property {ButtonHTMLAttributes} [closeButtonProps] - HTML attributes for close button\n * @property {VNodeChild} [closeIconComponent] - Custom close icon component\n * @property {HTMLAttributes} [headerDividerProps] - HTML attributes for header divider\n * @property {HTMLAttributes} [bodyProps] - HTML attributes for modal body\n * @property {HTMLAttributes} [messageProps] - HTML attributes for message text\n * @property {HTMLAttributes} [footerProps] - HTML attributes for footer section\n * @property {ButtonHTMLAttributes} [cancelButtonProps] - HTML attributes for cancel button\n * @property {ButtonHTMLAttributes} [confirmButtonProps] - HTML attributes for confirm button\n * @property {HTMLAttributes} [bodyDividerProps] - HTML attributes for body divider\n * @property {(options: HeaderRenderOptions) => VNodeChild} [renderHeader] - Custom header renderer\n * @property {(options: BodyRenderOptions) => VNodeChild} [renderBody] - Custom body renderer\n * @property {(options: FooterRenderOptions) => VNodeChild} [renderFooter] - Custom footer renderer\n * @property {(options: DividerRenderOptions) => VNodeChild} [renderHeaderDivider] - Custom header divider renderer\n * @property {(options: DividerRenderOptions) => VNodeChild} [renderBodyDivider] - Custom body divider renderer\n * @property {(options: MessageRenderOptions) => VNodeChild} [renderMessage] - Custom message renderer\n * @property {(options: ContentRenderOptions) => VNodeChild} [renderContent] - Custom content renderer\n */\nexport interface ConfirmExitModalProps {\n  isConfirmExitModalVisible: boolean;\n  onConfirmExitClose: () => void;\n  position?: 'topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft';\n  backgroundColor?: string;\n  exitEventOnConfirm?: (options: ConfirmExitOptions) => void;\n  member: string;\n  ban?: boolean;\n  roomName: string;\n  socket: MediaSFUSocket;\n  islevel: string;\n  title?: VNodeChild;\n  confirmLabel?: VNodeChild;\n  cancelLabel?: VNodeChild;\n  message?: VNodeChild | ((context: { islevel: string }) => VNodeChild);\n  overlayProps?: HTMLAttributes;\n  contentProps?: HTMLAttributes;\n  headerProps?: HTMLAttributes;\n  titleProps?: HTMLAttributes;\n  closeButtonProps?: ButtonHTMLAttributes;\n  closeIconComponent?: VNodeChild;\n  headerDividerProps?: HTMLAttributes;\n  bodyProps?: HTMLAttributes;\n  messageProps?: HTMLAttributes;\n  footerProps?: HTMLAttributes;\n  cancelButtonProps?: ButtonHTMLAttributes;\n  confirmButtonProps?: ButtonHTMLAttributes;\n  bodyDividerProps?: HTMLAttributes;\n  renderHeader?: (options: {\n    defaultHeader: VNodeChild;\n    title: VNodeChild;\n    onClose: () => void;\n  }) => VNodeChild;\n  renderBody?: (options: {\n    defaultBody: VNodeChild;\n    message: VNodeChild;\n  }) => VNodeChild;\n  renderFooter?: (options: {\n    defaultFooter: VNodeChild;\n    onCancel: () => void;\n    onConfirm: () => void;\n  }) => VNodeChild;\n  renderHeaderDivider?: (options: { defaultDivider: VNodeChild }) => VNodeChild;\n  renderBodyDivider?: (options: { defaultDivider: VNodeChild }) => VNodeChild;\n  renderMessage?: (options: {\n    defaultMessage: VNodeChild;\n    resolvedMessage: VNodeChild;\n  }) => VNodeChild;\n  renderContent?: (options: { defaultContent: VNodeChild }) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<ConfirmExitModalProps>(), {\n  position: 'topRight',\n  backgroundColor: '#83c0e9',\n  exitEventOnConfirm: confirmExit,\n  title: 'Confirm Exit',\n  confirmLabel: undefined,\n  cancelLabel: 'Cancel',\n  message: undefined,\n  overlayProps: undefined,\n  contentProps: undefined,\n  headerProps: undefined,\n  titleProps: undefined,\n  closeButtonProps: undefined,\n  closeIconComponent: undefined,\n  headerDividerProps: undefined,\n  bodyProps: undefined,\n  messageProps: undefined,\n  footerProps: undefined,\n  cancelButtonProps: undefined,\n  confirmButtonProps: undefined,\n  bodyDividerProps: undefined,\n  renderHeader: undefined,\n  renderBody: undefined,\n  renderFooter: undefined,\n  renderHeaderDivider: undefined,\n  renderBodyDivider: undefined,\n  renderMessage: undefined,\n  renderContent: undefined,\n});\n\n// RenderVNode wrapper component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Boolean, Array, Function] as PropType<VNodeChild>,\n      default: null,\n    },\n  },\n  render() {\n    if (!this.node) return null;\n    if (isVNode(this.node)) return this.node;\n    if (typeof this.node === 'function') {\n      const result = (this.node as () => VNodeChild)();\n      return isVNode(result) ? result : String(result);\n    }\n    return String(this.node);\n  },\n});\n\n// Default labels and message\nconst defaultConfirmLabel = computed(() => \n  props.confirmLabel ?? (props.islevel === '2' ? 'End Event' : 'Exit')\n);\n\nconst defaultCancelLabel = computed(() => \n  props.cancelLabel ?? 'Cancel'\n);\n\nconst resolvedMessage = computed(() => {\n  if (typeof props.message === 'function') {\n    return props.message({ islevel: props.islevel });\n  }\n  if (props.message !== undefined) {\n    return props.message;\n  }\n  return props.islevel === '2'\n    ? 'This will end the event for all. Confirm exit.'\n    : 'Are you sure you want to exit?';\n});\n\n// Modal dimensions\nconst defaultModalWidth = typeof window !== 'undefined' ? window.innerWidth * 0.8 : 320;\nconst modalWidth = Math.min(defaultModalWidth, 350);\n\n// Overlay props\nconst overlayAttrs = computed(() => {\n  const overlayProps = props.overlayProps || {};\n  const { class: cls, style, ...rest } = overlayProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst overlayClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-exit__overlay', overlayAttrs.value.className)\n);\n\nconst overlayStyle = computed<CSSProperties>(() => ({\n  position: 'fixed',\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  display: props.isConfirmExitModalVisible ? 'block' : 'none',\n  zIndex: 999,\n  ...overlayAttrs.value.style,\n}));\n\n// Content props\nconst contentAttrs = computed(() => {\n  const contentProps = props.contentProps || {};\n  const { class: cls, style, ...rest } = contentProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst contentClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-exit__content', contentAttrs.value.className)\n);\n\nconst contentStyle = computed<CSSProperties>(() => ({\n  position: 'fixed',\n  backgroundColor: props.backgroundColor,\n  borderRadius: '10px',\n  padding: '10px',\n  width: `${modalWidth}px`,\n  maxHeight: '65%',\n  overflowY: 'auto',\n  top: props.position.includes('top') ? '10px' : 'auto',\n  bottom: props.position.includes('bottom') ? '10px' : 'auto',\n  left: props.position.includes('Left') ? '10px' : 'auto',\n  right: props.position.includes('Right') ? '10px' : 'auto',\n  ...contentAttrs.value.style,\n}));\n\n// Header props\nconst headerAttrs = computed(() => {\n  const headerProps = props.headerProps || {};\n  const { class: cls, style, ...rest } = headerProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst headerClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-exit__header', headerAttrs.value.className)\n);\n\nconst headerStyle = computed<CSSProperties>(() => ({\n  display: 'flex',\n  justifyContent: 'space-between',\n  alignItems: 'center',\n  ...headerAttrs.value.style,\n}));\n\n// Title props\nconst titleAttrs = computed(() => {\n  const titleProps = props.titleProps || {};\n  const { class: cls, style, ...rest } = titleProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst titleClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-exit__title', titleAttrs.value.className)\n);\n\nconst titleStyle = computed<CSSProperties>(() => ({\n  margin: 0,\n  fontSize: '1.1rem',\n  ...titleAttrs.value.style,\n}));\n\n// Close button props\nconst closeButtonAttrs = computed(() => {\n  const closeButtonProps = props.closeButtonProps || {};\n  const { class: cls, style, onClick, ...rest } = closeButtonProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    onClick: onClick as ((event: MouseEvent) => void) | undefined,\n    rest,\n  };\n});\n\nconst closeButtonClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-exit__close', closeButtonAttrs.value.className)\n);\n\nconst closeButtonStyle = computed<CSSProperties>(() => ({\n  background: 'none',\n  border: 'none',\n  padding: '4px',\n  cursor: 'pointer',\n  color: 'black',\n  display: 'inline-flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  ...closeButtonAttrs.value.style,\n}));\n\nconst defaultCloseIcon = computed(() => \n  props.closeIconComponent ?? h(FontAwesomeIcon, { icon: faTimes, size: 'lg' })\n);\n\nconst handleCloseClick = (event: MouseEvent) => {\n  if (closeButtonAttrs.value.onClick) {\n    closeButtonAttrs.value.onClick(event);\n  }\n  if (!event.defaultPrevented) {\n    props.onConfirmExitClose();\n  }\n};\n\n// Divider props (header)\nconst headerDividerAttrs = computed(() => {\n  const dividerProps = props.headerDividerProps || {};\n  const { class: cls, style, ...rest } = dividerProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst headerDividerClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-exit__divider', headerDividerAttrs.value.className)\n);\n\nconst headerDividerStyle = computed<CSSProperties>(() => ({\n  margin: '6px 0',\n  height: '1px',\n  border: 'none',\n  backgroundColor: 'rgba(0,0,0,0.15)',\n  ...headerDividerAttrs.value.style,\n}));\n\n// Body props\nconst bodyAttrs = computed(() => {\n  const bodyProps = props.bodyProps || {};\n  const { class: cls, style, ...rest } = bodyProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst bodyClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-exit__body', bodyAttrs.value.className)\n);\n\nconst bodyStyle = computed<CSSProperties>(() => ({\n  fontSize: '0.95rem',\n  ...bodyAttrs.value.style,\n}));\n\n// Message props\nconst messageAttrs = computed(() => {\n  const messageProps = props.messageProps || {};\n  const { class: cls, style, ...rest } = messageProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst messageClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-exit__message', messageAttrs.value.className)\n);\n\nconst messageStyle = computed<CSSProperties>(() => ({\n  margin: 0,\n  ...messageAttrs.value.style,\n}));\n\n// Body divider props\nconst bodyDividerAttrs = computed(() => {\n  const dividerProps = props.bodyDividerProps || {};\n  const { class: cls, style, ...rest } = dividerProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst bodyDividerClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-exit__divider', bodyDividerAttrs.value.className)\n);\n\nconst bodyDividerStyle = computed<CSSProperties>(() => ({\n  margin: '6px 0',\n  height: '1px',\n  border: 'none',\n  backgroundColor: 'rgba(0,0,0,0.15)',\n  ...bodyDividerAttrs.value.style,\n}));\n\n// Footer props\nconst footerAttrs = computed(() => {\n  const footerProps = props.footerProps || {};\n  const { class: cls, style, ...rest } = footerProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst footerClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-exit__footer', footerAttrs.value.className)\n);\n\nconst footerStyle = computed<CSSProperties>(() => ({\n  display: 'flex',\n  justifyContent: 'flex-end',\n  gap: '12px',\n  flexWrap: 'wrap',\n  ...footerAttrs.value.style,\n}));\n\n// Cancel button props\nconst cancelButtonAttrs = computed(() => {\n  const cancelButtonProps = props.cancelButtonProps || {};\n  const { class: cls, style, onClick, ...rest } = cancelButtonProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    onClick: onClick as ((event: MouseEvent) => void) | undefined,\n    rest,\n  };\n});\n\nconst cancelButtonClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-exit__cancel', cancelButtonAttrs.value.className)\n);\n\nconst cancelButtonStyle = computed<CSSProperties>(() => ({\n  borderRadius: '6px',\n  backgroundColor: 'black',\n  color: 'white',\n  padding: '6px 14px',\n  border: 'none',\n  cursor: 'pointer',\n  ...cancelButtonAttrs.value.style,\n}));\n\nconst handleCancelClick = (event: MouseEvent) => {\n  if (cancelButtonAttrs.value.onClick) {\n    cancelButtonAttrs.value.onClick(event);\n  }\n  if (!event.defaultPrevented) {\n    props.onConfirmExitClose();\n  }\n};\n\n// Confirm button props\nconst confirmButtonAttrs = computed(() => {\n  const confirmButtonProps = props.confirmButtonProps || {};\n  const { class: cls, style, onClick, ...rest } = confirmButtonProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    onClick: onClick as ((event: MouseEvent) => void) | undefined,\n    rest,\n  };\n});\n\nconst confirmButtonClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-exit__confirm', confirmButtonAttrs.value.className)\n);\n\nconst confirmButtonStyle = computed<CSSProperties>(() => ({\n  borderRadius: '6px',\n  backgroundColor: 'red',\n  color: 'white',\n  padding: '6px 14px',\n  border: 'none',\n  cursor: 'pointer',\n  ...confirmButtonAttrs.value.style,\n}));\n\nconst handleConfirmExit = () => {\n  props.exitEventOnConfirm({\n    socket: props.socket,\n    member: props.member,\n    roomName: props.roomName,\n    ban: props.ban,\n  });\n  props.onConfirmExitClose();\n};\n\nconst handleConfirmClick = (event: MouseEvent) => {\n  if (confirmButtonAttrs.value.onClick) {\n    confirmButtonAttrs.value.onClick(event);\n  }\n  if (event.defaultPrevented) {\n    return;\n  }\n  handleConfirmExit();\n};\n\n// Build VNodes\nconst defaultHeader = computed(() => \n  h(\n    'div',\n    {\n      class: headerClassNames.value,\n      style: headerStyle.value,\n      ...headerAttrs.value.rest,\n    },\n    [\n      h(\n        'h2',\n        {\n          class: titleClassNames.value,\n          style: titleStyle.value,\n          ...titleAttrs.value.rest,\n        },\n        isVNode(props.title) ? props.title : String(props.title)\n      ),\n      h(\n        'button',\n        {\n          type: 'button',\n          onClick: handleCloseClick,\n          class: closeButtonClassNames.value,\n          style: closeButtonStyle.value,\n          'aria-label': 'Close confirm exit modal',\n          ...closeButtonAttrs.value.rest,\n        },\n        [defaultCloseIcon.value]\n      ),\n    ]\n  )\n);\n\nconst headerNode = computed(() => {\n  if (props.renderHeader) {\n    return props.renderHeader({\n      defaultHeader: defaultHeader.value,\n      title: props.title,\n      onClose: props.onConfirmExitClose,\n    });\n  }\n  return defaultHeader.value;\n});\n\nconst defaultMessageNode = computed(() => \n  h(\n    'p',\n    {\n      class: messageClassNames.value,\n      style: messageStyle.value,\n      ...messageAttrs.value.rest,\n    },\n    isVNode(resolvedMessage.value) ? resolvedMessage.value : String(resolvedMessage.value)\n  )\n);\n\nconst messageNode = computed(() => {\n  if (props.renderMessage) {\n    return props.renderMessage({\n      defaultMessage: defaultMessageNode.value,\n      resolvedMessage: resolvedMessage.value,\n    });\n  }\n  return defaultMessageNode.value;\n});\n\nconst defaultBody = computed(() => \n  h(\n    'div',\n    {\n      class: bodyClassNames.value,\n      style: bodyStyle.value,\n      ...bodyAttrs.value.rest,\n    },\n    [messageNode.value]\n  )\n);\n\nconst bodyNode = computed(() => {\n  if (props.renderBody) {\n    return props.renderBody({\n      defaultBody: defaultBody.value,\n      message: resolvedMessage.value,\n    });\n  }\n  return defaultBody.value;\n});\n\nconst defaultFooter = computed(() => \n  h(\n    'div',\n    {\n      class: footerClassNames.value,\n      style: footerStyle.value,\n      ...footerAttrs.value.rest,\n    },\n    [\n      h(\n        'button',\n        {\n          type: 'button',\n          onClick: handleCancelClick,\n          class: cancelButtonClassNames.value,\n          style: cancelButtonStyle.value,\n          ...cancelButtonAttrs.value.rest,\n        },\n        isVNode(defaultCancelLabel.value) ? defaultCancelLabel.value : String(defaultCancelLabel.value)\n      ),\n      h(\n        'button',\n        {\n          type: 'button',\n          onClick: handleConfirmClick,\n          class: confirmButtonClassNames.value,\n          style: confirmButtonStyle.value,\n          ...confirmButtonAttrs.value.rest,\n        },\n        isVNode(defaultConfirmLabel.value) ? defaultConfirmLabel.value : String(defaultConfirmLabel.value)\n      ),\n    ]\n  )\n);\n\nconst footerNode = computed(() => {\n  if (props.renderFooter) {\n    return props.renderFooter({\n      defaultFooter: defaultFooter.value,\n      onCancel: props.onConfirmExitClose,\n      onConfirm: handleConfirmExit,\n    });\n  }\n  return defaultFooter.value;\n});\n\nconst defaultHeaderDivider = computed(() => \n  h('hr', {\n    class: headerDividerClassNames.value,\n    style: headerDividerStyle.value,\n    ...headerDividerAttrs.value.rest,\n  })\n);\n\nconst headerDividerNode = computed(() => {\n  if (props.renderHeaderDivider) {\n    return props.renderHeaderDivider({ defaultDivider: defaultHeaderDivider.value });\n  }\n  return defaultHeaderDivider.value;\n});\n\nconst defaultBodyDivider = computed(() => \n  h('hr', {\n    class: bodyDividerClassNames.value,\n    style: bodyDividerStyle.value,\n    ...bodyDividerAttrs.value.rest,\n  })\n);\n\nconst bodyDividerNode = computed(() => {\n  if (props.renderBodyDivider) {\n    return props.renderBodyDivider({ defaultDivider: defaultBodyDivider.value });\n  }\n  return defaultBodyDivider.value;\n});\n\nconst defaultContent = computed(() => \n  h(\n    'div',\n    {\n      class: contentClassNames.value,\n      style: contentStyle.value,\n      ...contentAttrs.value.rest,\n    },\n    [\n      headerNode.value,\n      headerDividerNode.value,\n      bodyNode.value,\n      bodyDividerNode.value,\n      footerNode.value,\n    ]\n  )\n);\n\nconst contentNode = computed(() => {\n  if (props.renderContent) {\n    return props.renderContent({ defaultContent: defaultContent.value });\n  }\n  return defaultContent.value;\n});\n\nconst overlayNode = computed<VNodeChild>(() => {\n  return h(\n    'div',\n    {\n      class: overlayClassNames.value,\n      style: overlayStyle.value,\n      ...overlayAttrs.value.rest,\n    },\n    [contentNode.value]\n  );\n});\n</script>\n","<!--\n/**\n * @fileoverview ConfirmHereModal - Presence confirmation modal with countdown\n * @component ConfirmHereModal\n * @module components/miscComponents/ConfirmHereModal\n * \n * @description\n * A modal dialog that prompts the user to confirm their presence with a countdown timer.\n * If the user doesn't confirm within the countdown duration, they may be removed from\n * the meeting or face other consequences. Features real-time countdown, Socket.io\n * communication, and customizable messaging. Used to prevent inactive participants\n * from occupying meeting slots.\n * \n * Features:\n * - Countdown timer with real-time updates (default 120 seconds)\n * - \"Yes, I'm here\" confirmation button\n * - Socket.io event emission on confirmation\n * - Auto-timeout handler if countdown reaches zero\n * - Customizable title, message, and labels\n * - Dynamic message function with counter context\n * - Loading spinner during confirmation\n * - Complete render function customization\n * - Responsive positioning\n * \n * @example Basic Confirmation Modal\n * // <ConfirmHereModal\n *   // :isConfirmHereModalVisible=\"showConfirmModal\"\n *   // :onConfirmHereClose=\"() => { showConfirmModal = false; }\"\n *   // :socket=\"socketInstance\"\n *   // roomName=\"meeting-123\"\n *   // member=\"john_doe\"\n * // />\n * \n * @example Custom Countdown Duration\n * // <ConfirmHereModal\n *   // :isConfirmHereModalVisible=\"true\"\n *   // :onConfirmHereClose=\"handleClose\"\n *   // :socket=\"socket\"\n *   // roomName=\"meeting-456\"\n *   // member=\"jane_smith\"\n *   // :countdownDuration=\"60\"\n *   // title=\"Are you still there?\"\n *   // :onTimeout=\"() => handleTimeout()\"\n * // />\n * \n * @example Dynamic Message with Counter\n * // <ConfirmHereModal\n *   // :isConfirmHereModalVisible=\"visible\"\n *   // :onConfirmHereClose=\"close\"\n *   // :socket=\"socket\"\n *   // roomName=\"webinar-789\"\n *   // member=\"participant_1\"\n *   // :countdownDuration=\"90\"\n *   // :message=\"({ counter, countdownDuration }) =>\n *     `You will be removed in ${counter} seconds if you don't confirm. (${countdownDuration}s total)`\n *   \"\n * // />\n * \n * @example Custom Styling\n * // <ConfirmHereModal\n *   // :isConfirmHereModalVisible=\"true\"\n *   // :onConfirmHereClose=\"handleClose\"\n *   // :socket=\"socket\"\n *   // roomName=\"meeting-abc\"\n *   // member=\"user_123\"\n *   // backgroundColor=\"rgba(255,59,48,0.95)\"\n *   // title=\"Inactivity Detected\"\n *   // confirmButtonLabel=\"I'm Active!\"\n *   // :onTimeout=\"handleInactiveTimeout\"\n * // />\n * \n * @remarks\n * The modal emits a Socket.io event 'confirmHere' when the user clicks the confirm button.\n * The countdown timer automatically starts when the modal becomes visible and cleans up\n * when hidden or unmounted. If the countdown reaches zero, the onTimeout callback is\n * triggered (if provided).\n * \n * Workflow:\n * 1. Modal becomes visible → Countdown starts from countdownDuration (default 120s)\n * 2. Counter decrements every second\n * 3. User clicks \"Yes, I'm here\" → Emits 'confirmHere' event via Socket.io\n * 4. Confirmation accepted → onConfirmHereClose() called, modal closes\n * 5. Alternative: Counter reaches 0 → onTimeout() called, user may be removed\n * 6. Modal hidden → Countdown timer cleaned up\n * \n * @see {@link WelcomePage} - May trigger this modal for inactive users\n * @see {@link PreJoinPage} - Pre-join page before entering meeting\n */\n-->\n<template>\n  <RenderVNode :node=\"overlayNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  ref,\n  computed,\n  watch,\n  onUnmounted,\n  defineComponent,\n  h,\n  isVNode,\n  type PropType,\n  type VNodeChild,\n  type CSSProperties,\n  type HTMLAttributes,\n  type ButtonHTMLAttributes,\n} from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faSpinner } from '@fortawesome/free-solid-svg-icons';\nimport type { Socket } from 'socket.io-client';\nimport type { FontAwesomeIconProps } from '@fortawesome/vue-fontawesome';\n\n// Helper function to join class names\nfunction joinClassNames(...classes: Array<string | undefined | null | false>): string | undefined {\n  const filtered = classes.filter(Boolean) as string[];\n  return filtered.length > 0 ? filtered.join(' ') : undefined;\n}\n\n/**\n * Props for the ConfirmHereModal component\n * @interface ConfirmHereModalProps\n * \n * @property {boolean} isConfirmHereModalVisible - Whether the modal is currently visible\n * @property {() => void} onConfirmHereClose - Callback when modal should close (after confirmation)\n * @property {string} [backgroundColor='rgba(0, 0, 0, 0.5)'] - Background overlay color\n * @property {number} [countdownDuration=120] - Countdown duration in seconds\n * @property {Socket} socket - Socket.io client instance for emitting confirmation\n * @property {Socket} [localSocket] - Optional local socket instance\n * @property {string} roomName - Room name to include in Socket.io event\n * @property {string} member - Username/member name to include in Socket.io event\n * @property {VNodeChild} [title='Confirm Your Presence'] - Modal title\n * @property {VNodeChild | ((context: { counter: number; countdownDuration: number }) => VNodeChild)} [message] - Message text or function\n * @property {VNodeChild} [countdownLabel] - Label for countdown display\n * @property {VNodeChild} [confirmButtonLabel='Yes, I am here'] - Confirmation button text\n * @property {() => void} [onTimeout] - Callback when countdown reaches zero\n * @property {HTMLAttributes} [overlayProps] - Additional HTML attributes for overlay\n * @property {HTMLAttributes} [contentProps] - Additional HTML attributes for content container\n * @property {HTMLAttributes} [containerProps] - Additional HTML attributes for inner container\n * @property {HTMLAttributes} [spinnerWrapperProps] - Additional HTML attributes for spinner wrapper\n * @property {VNodeChild} [spinnerIcon] - Custom spinner icon/component\n * @property {Partial<FontAwesomeIconProps>} [spinnerIconProps] - Props for spinner icon\n * \n * @default backgroundColor - 'rgba(0, 0, 0, 0.5)'\n * @default countdownDuration - 120\n * @default title - 'Confirm Your Presence'\n * @default confirmButtonLabel - 'Yes, I am here'\n * \n * @example\n * ```typescript\n * // <ConfirmHereModal\n *   // :isConfirmHereModalVisible=\"showModal\"\n *   // :onConfirmHereClose=\"handleClose\"\n *   // :socket=\"socket\"\n *   // roomName=\"meeting-123\"\n *   // member=\"john_doe\"\n *   // :countdownDuration=\"90\"\n *   // title=\"Are you still active?\"\n *   // :message=\"({ counter }) => `Confirming in ${counter}s...`\"\n *   // :onTimeout=\"handleTimeout\"\n * // />\n * ```\n */\nexport interface ConfirmHereModalProps {\n  isConfirmHereModalVisible: boolean;\n  onConfirmHereClose: () => void;\n  backgroundColor?: string;\n  countdownDuration?: number;\n  socket: Socket;\n  localSocket?: Socket;\n  roomName: string;\n  member: string;\n  title?: VNodeChild;\n  message?: VNodeChild | ((context: { counter: number; countdownDuration: number }) => VNodeChild);\n  countdownLabel?: VNodeChild;\n  confirmButtonLabel?: VNodeChild;\n  onTimeout?: () => void;\n  overlayProps?: HTMLAttributes;\n  contentProps?: HTMLAttributes;\n  containerProps?: HTMLAttributes;\n  spinnerWrapperProps?: HTMLAttributes;\n  spinnerIcon?: VNodeChild;\n  spinnerIconProps?: Partial<FontAwesomeIconProps>;\n  titleProps?: HTMLAttributes;\n  messageProps?: HTMLAttributes;\n  countdownWrapperProps?: HTMLAttributes;\n  countdownValueProps?: HTMLAttributes;\n  confirmButtonProps?: ButtonHTMLAttributes;\n  renderSpinner?: (options: { defaultSpinner: VNodeChild }) => VNodeChild;\n  renderTitle?: (options: { defaultTitle: VNodeChild }) => VNodeChild;\n  renderMessage?: (options: { \n    defaultMessage: VNodeChild; \n    counter: number; \n    countdownDuration: number;\n  }) => VNodeChild;\n  renderCountdown?: (options: { \n    defaultCountdown: VNodeChild; \n    counter: number; \n    countdownLabel: VNodeChild;\n  }) => VNodeChild;\n  renderConfirmButton?: (options: { defaultButton: VNodeChild }) => VNodeChild;\n  renderBody?: (options: {\n    defaultBody: VNodeChild;\n    spinner: VNodeChild;\n    title: VNodeChild;\n    message: VNodeChild;\n    countdown: VNodeChild;\n    confirmButton: VNodeChild;\n  }) => VNodeChild;\n  renderContent?: (options: { defaultContent: VNodeChild }) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<ConfirmHereModalProps>(), {\n  backgroundColor: '#83c0e9',\n  countdownDuration: 120,\n  localSocket: undefined,\n  title: () => 'Are you still there?',\n  message: () => 'Please confirm if you are still present.',\n  countdownLabel: () => 'Time remaining:',\n  confirmButtonLabel: () => 'Yes',\n  onTimeout: undefined,\n  overlayProps: undefined,\n  contentProps: undefined,\n  containerProps: undefined,\n  spinnerWrapperProps: undefined,\n  spinnerIcon: undefined,\n  spinnerIconProps: undefined,\n  titleProps: undefined,\n  messageProps: undefined,\n  countdownWrapperProps: undefined,\n  countdownValueProps: undefined,\n  confirmButtonProps: undefined,\n  renderSpinner: undefined,\n  renderTitle: undefined,\n  renderMessage: undefined,\n  renderCountdown: undefined,\n  renderConfirmButton: undefined,\n  renderBody: undefined,\n  renderContent: undefined,\n});\n\n// RenderVNode wrapper component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Boolean, Array, Function] as PropType<VNodeChild>,\n      default: null,\n    },\n  },\n  render() {\n    if (!this.node) return null;\n    if (isVNode(this.node)) return this.node;\n    if (typeof this.node === 'function') {\n      const result = (this.node as () => VNodeChild)();\n      return isVNode(result) ? result : String(result);\n    }\n    return String(this.node);\n  },\n});\n\nconst counter = ref<number>(props.countdownDuration);\nlet countdownInterval: ReturnType<typeof setInterval> | null = null;\n\nconst initialDuration = computed(() => Math.max(0, props.countdownDuration ?? 120));\n\nconst clearCountdown = () => {\n  if (countdownInterval) {\n    clearInterval(countdownInterval);\n    countdownInterval = null;\n  }\n};\n\nconst emitDisconnect = () => {\n  props.socket.emit('disconnectUser', {\n    member: props.member,\n    roomName: props.roomName,\n    ban: false,\n  });\n\n  if (props.localSocket && props.localSocket.id) {\n    try {\n      props.localSocket.emit('disconnectUser', {\n        member: props.member,\n        roomName: props.roomName,\n        ban: false,\n      });\n    } catch {\n      // Ignore local socket errors silently\n    }\n  }\n};\n\nconst confirmAndClose = () => {\n  clearCountdown();\n  props.onConfirmHereClose();\n};\n\nconst handleTimeout = () => {\n  emitDisconnect();\n  props.onTimeout?.();\n  confirmAndClose();\n};\n\nconst startCountdown = () => {\n  clearCountdown();\n\n  let timeRemaining = initialDuration.value;\n  counter.value = initialDuration.value;\n\n  countdownInterval = setInterval(() => {\n    timeRemaining--;\n    counter.value = Math.max(timeRemaining, 0);\n\n    if (timeRemaining <= 0) {\n      clearCountdown();\n      handleTimeout();\n    }\n  }, 1000);\n};\n\n// Watch for modal visibility and duration changes\nwatch(\n  () => [props.isConfirmHereModalVisible, initialDuration.value] as const,\n  ([isVisible, duration]) => {\n    counter.value = duration;\n    \n    if (isVisible) {\n      startCountdown();\n    } else {\n      clearCountdown();\n    }\n  },\n  { immediate: true }\n);\n\n// Cleanup on unmount\nonUnmounted(() => {\n  clearCountdown();\n});\n\n// Resolved message\nconst resolvedMessage = computed(() => {\n  if (typeof props.message === 'function') {\n    return props.message({ counter: counter.value, countdownDuration: initialDuration.value });\n  }\n  return props.message ?? 'Please confirm if you are still present.';\n});\n\n// Overlay props and styles\nconst overlayAttrs = computed(() => {\n  const overlayProps = props.overlayProps || {};\n  const { class: cls, style, ...rest } = overlayProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst overlayClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-here__overlay', overlayAttrs.value.className)\n);\n\nconst overlayStyle = computed<CSSProperties>(() => ({\n  position: 'fixed',\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  backgroundColor: props.backgroundColor ?? 'rgba(0, 0, 0, 0.5)',\n  display: props.isConfirmHereModalVisible ? 'flex' : 'none',\n  alignItems: 'center',\n  justifyContent: 'center',\n  padding: '16px',\n  zIndex: 999,\n  ...overlayAttrs.value.style,\n}));\n\n// Content props and styles\nconst contentAttrs = computed(() => {\n  const contentProps = props.contentProps || {};\n  const { class: cls, style, ...rest } = contentProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst overlayWidth = typeof window !== 'undefined' ? Math.min(window.innerWidth * 0.9, 400) : 320;\n\nconst contentClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-here__content', contentAttrs.value.className)\n);\n\nconst contentStyle = computed<CSSProperties>(() => ({\n  backgroundColor: props.backgroundColor,\n  borderRadius: '12px',\n  padding: '24px',\n  width: '100%',\n  maxWidth: `${overlayWidth}px`,\n  boxShadow: '0 15px 45px rgba(0,0,0,0.25)',\n  display: 'flex',\n  flexDirection: 'column',\n  ...contentAttrs.value.style,\n}));\n\n// Container props and styles\nconst containerAttrs = computed(() => {\n  const containerProps = props.containerProps || {};\n  const { class: cls, style, ...rest } = containerProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst containerClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-here__inner', containerAttrs.value.className)\n);\n\nconst containerStyle = computed<CSSProperties>(() => ({\n  textAlign: 'center',\n  display: 'flex',\n  flexDirection: 'column',\n  alignItems: 'center',\n  gap: '16px',\n  ...containerAttrs.value.style,\n}));\n\n// Spinner wrapper props and styles\nconst spinnerWrapperAttrs = computed(() => {\n  const spinnerWrapperProps = props.spinnerWrapperProps || {};\n  const { class: cls, style, ...rest} = spinnerWrapperProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst spinnerWrapperClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-here__spinner', spinnerWrapperAttrs.value.className)\n);\n\nconst spinnerWrapperStyle = computed<CSSProperties>(() => ({\n  fontSize: '3rem',\n  color: 'black',\n  ...spinnerWrapperAttrs.value.style,\n}));\n\n// Spinner icon props and styles\nconst spinnerIconAttrs = computed(() => {\n  const spinnerIconProps = props.spinnerIconProps || {};\n  const { style, ...rest } = spinnerIconProps as Record<string, unknown>;\n  return {\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst spinnerIconStyle = computed<CSSProperties>(() => ({\n  fontSize: 'inherit',\n  color: 'inherit',\n  ...spinnerIconAttrs.value.style,\n}));\n\n// Title props and styles\nconst titleAttrs = computed(() => {\n  const titleProps = props.titleProps || {};\n  const { class: cls, style, ...rest } = titleProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst titleClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-here__title', titleAttrs.value.className)\n);\n\nconst titleStyle = computed<CSSProperties>(() => ({\n  fontSize: '1.5rem',\n  fontWeight: 700,\n  margin: 0,\n  color: 'black',\n  ...titleAttrs.value.style,\n}));\n\n// Message props and styles\nconst messageAttrs = computed(() => {\n  const messageProps = props.messageProps || {};\n  const { class: cls, style, ...rest } = messageProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst messageClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-here__message', messageAttrs.value.className)\n);\n\nconst messageStyle = computed<CSSProperties>(() => ({\n  fontSize: '1rem',\n  color: 'black',\n  margin: 0,\n  ...messageAttrs.value.style,\n}));\n\n// Countdown wrapper props and styles\nconst countdownWrapperAttrs = computed(() => {\n  const countdownWrapperProps = props.countdownWrapperProps || {};\n  const { class: cls, style, ...rest } = countdownWrapperProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst countdownWrapperClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-here__countdown', countdownWrapperAttrs.value.className)\n);\n\nconst countdownWrapperStyle = computed<CSSProperties>(() => ({\n  fontSize: '0.95rem',\n  color: 'black',\n  margin: 0,\n  ...countdownWrapperAttrs.value.style,\n}));\n\n// Countdown value props and styles\nconst countdownValueAttrs = computed(() => {\n  const countdownValueProps = props.countdownValueProps || {};\n  const { class: cls, style, ...rest } = countdownValueProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst countdownValueClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-here__countdown-value', countdownValueAttrs.value.className)\n);\n\nconst countdownValueStyle = computed<CSSProperties>(() => ({\n  fontWeight: 700,\n  ...countdownValueAttrs.value.style,\n}));\n\n// Confirm button props and styles\nconst confirmButtonAttrs = computed(() => {\n  const confirmButtonProps = props.confirmButtonProps || {};\n  const { class: cls, style, onClick, ...rest } = confirmButtonProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    onClick: onClick as ((event: MouseEvent) => void) | undefined,\n    rest,\n  };\n});\n\nconst confirmButtonClassNames = computed(() => \n  joinClassNames('mediasfu-confirm-here__confirm', confirmButtonAttrs.value.className)\n);\n\nconst confirmButtonStyle = computed<CSSProperties>(() => ({\n  backgroundColor: '#dc3545',\n  color: 'white',\n  padding: '0.5rem 1rem',\n  borderRadius: '6px',\n  border: 'none',\n  cursor: 'pointer',\n  fontWeight: 600,\n  fontSize: '1rem',\n  minWidth: '120px',\n  ...confirmButtonAttrs.value.style,\n}));\n\nconst handleConfirmHereClick = (event: MouseEvent) => {\n  if (confirmButtonAttrs.value.onClick) {\n    confirmButtonAttrs.value.onClick(event);\n  }\n  if (!event.defaultPrevented) {\n    confirmAndClose();\n  }\n};\n\n// Build VNodes\nconst defaultSpinner = computed(() => \n  h(\n    'div',\n    {\n      class: spinnerWrapperClassNames.value,\n      style: spinnerWrapperStyle.value,\n      ...spinnerWrapperAttrs.value.rest,\n    },\n    [\n      props.spinnerIcon ?? h(FontAwesomeIcon, {\n        icon: faSpinner,\n        spin: true,\n        style: spinnerIconStyle.value,\n        ...spinnerIconAttrs.value.rest,\n      })\n    ]\n  )\n);\n\nconst spinnerNode = computed(() => {\n  if (props.renderSpinner) {\n    return props.renderSpinner({ defaultSpinner: defaultSpinner.value });\n  }\n  return defaultSpinner.value;\n});\n\nconst defaultTitle = computed(() => \n  h(\n    'h2',\n    {\n      class: titleClassNames.value,\n      style: titleStyle.value,\n      ...titleAttrs.value.rest,\n    },\n    isVNode(props.title) ? props.title : String(props.title)\n  )\n);\n\nconst titleNode = computed(() => {\n  if (props.renderTitle) {\n    return props.renderTitle({ defaultTitle: defaultTitle.value });\n  }\n  return defaultTitle.value;\n});\n\nconst defaultMessageNode = computed(() => \n  h(\n    'p',\n    {\n      class: messageClassNames.value,\n      style: messageStyle.value,\n      ...messageAttrs.value.rest,\n    },\n    isVNode(resolvedMessage.value) ? resolvedMessage.value : String(resolvedMessage.value)\n  )\n);\n\nconst messageNode = computed(() => {\n  if (props.renderMessage) {\n    return props.renderMessage({\n      defaultMessage: defaultMessageNode.value,\n      counter: counter.value,\n      countdownDuration: initialDuration.value,\n    });\n  }\n  return defaultMessageNode.value;\n});\n\nconst defaultCountdownNode = computed(() => \n  h(\n    'p',\n    {\n      class: countdownWrapperClassNames.value,\n      style: countdownWrapperStyle.value,\n      ...countdownWrapperAttrs.value.rest,\n    },\n    [\n      isVNode(props.countdownLabel) ? props.countdownLabel : String(props.countdownLabel),\n      ' ',\n      h(\n        'span',\n        {\n          class: countdownValueClassNames.value,\n          style: countdownValueStyle.value,\n          ...countdownValueAttrs.value.rest,\n        },\n        String(counter.value)\n      ),\n    ]\n  )\n);\n\nconst countdownNode = computed(() => {\n  if (props.renderCountdown) {\n    return props.renderCountdown({\n      defaultCountdown: defaultCountdownNode.value,\n      counter: counter.value,\n      countdownLabel: props.countdownLabel ?? 'Time remaining:',\n    });\n  }\n  return defaultCountdownNode.value;\n});\n\nconst defaultConfirmButton = computed(() => \n  h(\n    'button',\n    {\n      type: 'button',\n      class: confirmButtonClassNames.value,\n      style: confirmButtonStyle.value,\n      onClick: handleConfirmHereClick,\n      ...confirmButtonAttrs.value.rest,\n    },\n    isVNode(props.confirmButtonLabel) ? props.confirmButtonLabel : String(props.confirmButtonLabel)\n  )\n);\n\nconst confirmButtonNode = computed(() => {\n  if (props.renderConfirmButton) {\n    return props.renderConfirmButton({ defaultButton: defaultConfirmButton.value });\n  }\n  return defaultConfirmButton.value;\n});\n\nconst defaultBody = computed(() => \n  h(\n    'div',\n    {\n      class: containerClassNames.value,\n      style: containerStyle.value,\n      ...containerAttrs.value.rest,\n    },\n    [\n      spinnerNode.value,\n      titleNode.value,\n      messageNode.value,\n      countdownNode.value,\n      confirmButtonNode.value,\n    ]\n  )\n);\n\nconst bodyNode = computed(() => {\n  if (props.renderBody) {\n    return props.renderBody({\n      defaultBody: defaultBody.value,\n      spinner: spinnerNode.value,\n      title: titleNode.value,\n      message: messageNode.value,\n      countdown: countdownNode.value,\n      confirmButton: confirmButtonNode.value,\n    });\n  }\n  return defaultBody.value;\n});\n\nconst defaultContent = computed(() => \n  h(\n    'div',\n    {\n      class: contentClassNames.value,\n      style: contentStyle.value,\n      ...contentAttrs.value.rest,\n    },\n    [bodyNode.value]\n  )\n);\n\nconst contentNode = computed(() => {\n  if (props.renderContent) {\n    return props.renderContent({ defaultContent: defaultContent.value });\n  }\n  return defaultContent.value;\n});\n\nconst overlayNode = computed<VNodeChild>(() => {\n  return h(\n    'div',\n    {\n      class: overlayClassNames.value,\n      style: overlayStyle.value,\n      ...overlayAttrs.value.rest,\n    },\n    [contentNode.value]\n  );\n});\n</script>\n","<!--\n/**\n * @fileoverview ShareEventModal - Meeting details sharing modal\n * @component ShareEventModal\n * @module components/miscComponents/ShareEventModal\n * \n * @description\n * A modal dialog that displays meeting details (ID, passcode) and provides social sharing\n * buttons. Positioned in one of four corners and features copy-to-clipboard functionality\n * for meeting credentials. Used to help hosts/co-hosts share meeting information with\n * participants via various communication channels.\n * \n * Features:\n * - Meeting ID display with copy button (via MeetingIdComponent)\n * - Admin passcode display with copy button (via MeetingPasscodeComponent)\n * - Social sharing buttons (via ShareButtonsComponent)\n * - Four corner positioning options (topRight, topLeft, bottomRight, bottomLeft)\n * - Optional shareButtons visibility toggle\n * - Close button with FontAwesome icon\n * - Responsive design\n * - Complete render function customization\n * \n * Position Options:\n * - **topRight**: Top-right corner (15px from top, 15px from right)\n * - **topLeft**: Top-left corner (15px from top, 15px from left)\n * - **bottomRight**: Bottom-right corner (15px from bottom, 15px from right)\n * - **bottomLeft**: Bottom-left corner (15px from bottom, 15px from left)\n * \n * @example Basic Share Modal (Host)\n * // <ShareEventModal\n *   // :isShareEventModalVisible=\"showShareModal\"\n *   // :onShareEventClose=\"() => { showShareModal = false; }\"\n *   // roomName=\"meeting-123\"\n *   // adminPasscode=\"admin456\"\n *   // islevel=\"2\"\n *   // eventType=\"conference\"\n * // />\n * \n * @example Without Share Buttons\n * // <ShareEventModal\n *   // :isShareEventModalVisible=\"true\"\n *   // :onShareEventClose=\"handleClose\"\n *   // roomName=\"webinar-789\"\n *   // adminPasscode=\"secure123\"\n *   // islevel=\"2\"\n *   // eventType=\"webinar\"\n *   // :shareButtons=\"false\"\n * // />\n * \n * @example Custom Position (Bottom Left)\n * // <ShareEventModal\n *   // :isShareEventModalVisible=\"visible\"\n *   // :onShareEventClose=\"close\"\n *   // roomName=\"broadcast-456\"\n *   // eventType=\"broadcast\"\n *   // position=\"bottomLeft\"\n * // />\n * \n * @example With Local Link (Self-Hosted)\n * // <ShareEventModal\n *   // :isShareEventModalVisible=\"true\"\n *   // :onShareEventClose=\"handleClose\"\n *   // roomName=\"meeting-abc\"\n *   // adminPasscode=\"admin789\"\n *   // islevel=\"2\"\n *   // eventType=\"conference\"\n *   // localLink=\"https://my-company.com\"\n * // />\n * \n * @example Custom Styling\n * // <ShareEventModal\n *   // :isShareEventModalVisible=\"true\"\n *   // :onShareEventClose=\"handleClose\"\n *   // roomName=\"meeting-xyz\"\n *   // eventType=\"webinar\"\n *   // backgroundColor=\"rgba(30,30,30,0.95)\"\n *   // position=\"topLeft\"\n * // />\n * \n * @remarks\n * The admin passcode is only displayed if the current user is a host (islevel='2').\n * The modal composes three child components: MeetingIdComponent, MeetingPasscodeComponent,\n * and ShareButtonsComponent, each handling their specific functionality. Social share\n * buttons can be hidden by setting shareButtons=false.\n * \n * Workflow:\n * 1. Host opens share modal → Meeting ID and admin passcode displayed\n * 2. User clicks copy buttons → Credentials copied to clipboard\n * 3. User clicks social share button → Opens share dialog in new tab\n * 4. User clicks close button → onShareEventClose() called, modal hides\n * 5. Modal repositions based on position prop\n * \n * @see {@link MeetingIdComponent} - Meeting ID display with copy button\n * @see {@link MeetingPasscodeComponent} - Passcode display with copy button\n * @see {@link ShareButtonsComponent} - Social sharing buttons\n * @see {@link MenuModal} - Alternative menu for sharing\n */\n-->\n<template>\n  <RenderVNode :node=\"overlayNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  computed,\n  defineComponent,\n  h,\n  isVNode,\n  type PropType,\n  type VNodeChild,\n  type CSSProperties,\n  type HTMLAttributes,\n  type ButtonHTMLAttributes,\n} from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faTimes } from '@fortawesome/free-solid-svg-icons';\nimport type { FontAwesomeIconProps } from '@fortawesome/vue-fontawesome';\nimport MeetingIdComponent from '../menuComponents/MeetingIDComponent.vue';\nimport MeetingPasscodeComponent from '../menuComponents/MeetingPasscodeComponent.vue';\nimport ShareButtonsComponent from '../menuComponents/ShareButtonsComponent.vue';\nimport type { EventType } from '../../../../SharedTypes';\nimport type { MeetingIdComponentProps } from '../menuComponents/MeetingIDComponent.vue';\nimport type { MeetingPasscodeComponentProps } from '../menuComponents/MeetingPasscodeComponent.vue';\nimport type { ShareButtonsComponentProps } from '../menuComponents/ShareButtonsComponent.vue';\n\n// Helper function to join class names\nfunction joinClassNames(...classes: Array<string | undefined | null | false>): string | undefined {\n  const filtered = classes.filter(Boolean) as string[];\n  return filtered.length > 0 ? filtered.join(' ') : undefined;\n}\n\n/**\n * Props for the ShareEventModal component\n * @interface ShareEventModalProps\n * \n * @property {string} [backgroundColor='rgba(255, 255, 255, 0.25)'] - Background color for modal\n * @property {boolean} isShareEventModalVisible - Whether the modal is currently visible\n * @property {() => void} onShareEventClose - Callback when modal is closed\n * @property {boolean} [shareButtons=true] - Whether to show social sharing buttons\n * @property {'topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft'} [position='topRight'] - Corner position for modal\n * @property {string} roomName - Meeting/Event ID to display and share\n * @property {string} [adminPasscode] - Admin passcode to display (only for hosts)\n * @property {string} [islevel='0'] - User level ('0'=participant, '1'=co-host, '2'=host)\n * @property {EventType} eventType - Event type ('conference' | 'webinar' | 'broadcast' | 'chat')\n * @property {string} [localLink] - Custom domain for self-hosted instances\n * @property {HTMLAttributes} [overlayProps] - Additional HTML attributes for overlay\n * @property {HTMLAttributes} [contentProps] - Additional HTML attributes for content container\n * @property {HTMLAttributes} [headerProps] - Additional HTML attributes for header\n * @property {ButtonHTMLAttributes} [closeButtonProps] - Additional HTML attributes for close button\n * @property {VNodeChild} [closeIcon] - Custom close icon/component\n * @property {Partial<FontAwesomeIconProps>} [closeIconProps] - Props for close icon\n * \n * @default backgroundColor - 'rgba(255, 255, 255, 0.25)'\n * @default shareButtons - true\n * @default position - 'topRight'\n * @default islevel - '0'\n * \n * @example\n * ```typescript\n * // <ShareEventModal\n *   // :isShareEventModalVisible=\"showModal\"\n *   // :onShareEventClose=\"handleClose\"\n *   // roomName=\"meeting-123\"\n *   // adminPasscode=\"admin456\"\n *   // islevel=\"2\"\n *   // eventType=\"conference\"\n *   // position=\"topRight\"\n *   // :shareButtons=\"true\"\n *   // localLink=\"https://my-company.com\"\n * // />\n * ```\n */\nexport interface ShareEventModalProps {\n  backgroundColor?: string;\n  isShareEventModalVisible: boolean;\n  onShareEventClose: () => void;\n  shareButtons?: boolean;\n  position?: 'topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft';\n  roomName: string;\n  adminPasscode?: string;\n  islevel?: string;\n  eventType: EventType;\n  localLink?: string;\n  overlayProps?: HTMLAttributes;\n  contentProps?: HTMLAttributes;\n  headerProps?: HTMLAttributes;\n  closeButtonProps?: ButtonHTMLAttributes;\n  closeIcon?: VNodeChild;\n  closeIconProps?: Partial<FontAwesomeIconProps>;\n  dividerProps?: HTMLAttributes;\n  bodyProps?: HTMLAttributes;\n  meetingPasscodeWrapperProps?: HTMLAttributes;\n  meetingPasscodeComponentProps?: Partial<MeetingPasscodeComponentProps>;\n  meetingIdWrapperProps?: HTMLAttributes;\n  meetingIdComponentProps?: Partial<MeetingIdComponentProps>;\n  shareButtonsWrapperProps?: HTMLAttributes;\n  shareButtonsComponentProps?: Partial<ShareButtonsComponentProps>;\n  renderHeader?: (options: {\n    defaultHeader: VNodeChild;\n    closeButton: VNodeChild;\n  }) => VNodeChild;\n  renderCloseButton?: (options: {\n    defaultCloseButton: VNodeChild;\n    onClose: () => void;\n  }) => VNodeChild;\n  renderDivider?: (options: { defaultDivider: VNodeChild }) => VNodeChild;\n  renderMeetingPasscode?: (options: {\n    defaultMeetingPasscode: VNodeChild;\n    adminPasscode?: string;\n    isHost: boolean;\n  }) => VNodeChild;\n  renderMeetingId?: (options: {\n    defaultMeetingId: VNodeChild;\n    roomName: string;\n  }) => VNodeChild;\n  renderShareButtons?: (options: {\n    defaultShareButtons: VNodeChild;\n    hasShareButtons: boolean;\n  }) => VNodeChild;\n  renderBody?: (options: {\n    defaultBody: VNodeChild;\n    meetingPasscode: VNodeChild | null;\n    meetingId: VNodeChild;\n    shareButtons: VNodeChild | null;\n  }) => VNodeChild;\n  renderContent?: (options: { defaultContent: VNodeChild }) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<ShareEventModalProps>(), {\n  backgroundColor: 'rgba(255, 255, 255, 0.25)',\n  shareButtons: true,\n  position: 'topRight',\n  adminPasscode: undefined,\n  islevel: undefined,\n  localLink: undefined,\n  overlayProps: undefined,\n  contentProps: undefined,\n  headerProps: undefined,\n  closeButtonProps: undefined,\n  closeIcon: undefined,\n  closeIconProps: undefined,\n  dividerProps: undefined,\n  bodyProps: undefined,\n  meetingPasscodeWrapperProps: undefined,\n  meetingPasscodeComponentProps: undefined,\n  meetingIdWrapperProps: undefined,\n  meetingIdComponentProps: undefined,\n  shareButtonsWrapperProps: undefined,\n  shareButtonsComponentProps: undefined,\n  renderHeader: undefined,\n  renderCloseButton: undefined,\n  renderDivider: undefined,\n  renderMeetingPasscode: undefined,\n  renderMeetingId: undefined,\n  renderShareButtons: undefined,\n  renderBody: undefined,\n  renderContent: undefined,\n});\n\n// RenderVNode wrapper component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Boolean, Array, Function] as PropType<VNodeChild>,\n      default: null,\n    },\n  },\n  render() {\n    if (!this.node) return null;\n    if (isVNode(this.node)) return this.node;\n    if (typeof this.node === 'function') {\n      const result = (this.node as () => VNodeChild)();\n      return isVNode(result) ? result : String(result);\n    }\n    return String(this.node);\n  },\n});\n\nconst handleClose = () => {\n  props.onShareEventClose();\n};\n\nconst screenWidth = typeof window !== 'undefined' ? window.innerWidth : 420;\nconst modalWidth = Math.min(screenWidth * 0.8, 350);\n\n// Overlay props and styles\nconst overlayAttrs = computed(() => {\n  const overlayProps = props.overlayProps || {};\n  const { class: cls, style, ...rest } = overlayProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst overlayClassNames = computed(() => \n  joinClassNames('mediasfu-share-event__overlay', overlayAttrs.value.className)\n);\n\nconst overlayStyle = computed<CSSProperties>(() => ({\n  position: 'fixed',\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  display: props.isShareEventModalVisible ? 'block' : 'none',\n  zIndex: 999,\n  ...overlayAttrs.value.style,\n}));\n\n// Content props and styles\nconst contentAttrs = computed(() => {\n  const contentProps = props.contentProps || {};\n  const { class: cls, style, ...rest } = contentProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst contentClassNames = computed(() => \n  joinClassNames('mediasfu-share-event__content', contentAttrs.value.className)\n);\n\nconst contentPositionStyle = computed<CSSProperties>(() => ({\n  top: props.position.includes('top') ? '10px' : 'auto',\n  bottom: props.position.includes('bottom') ? '10px' : 'auto',\n  left: props.position.includes('Left') ? '10px' : 'auto',\n  right: props.position.includes('Right') ? '10px' : 'auto',\n}));\n\nconst contentStyle = computed<CSSProperties>(() => ({\n  position: 'fixed',\n  backgroundColor: props.backgroundColor,\n  borderRadius: '10px',\n  padding: '16px',\n  width: `${modalWidth}px`,\n  maxHeight: '65%',\n  overflowY: 'auto',\n  boxShadow: '0 12px 36px rgba(0,0,0,0.25)',\n  display: 'flex',\n  flexDirection: 'column',\n  gap: '12px',\n  ...contentPositionStyle.value,\n  ...contentAttrs.value.style,\n}));\n\n// Header props and styles\nconst headerAttrs = computed(() => {\n  const headerProps = props.headerProps || {};\n  const { class: cls, style, ...rest } = headerProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst headerClassNames = computed(() => \n  joinClassNames('mediasfu-share-event__header', headerAttrs.value.className)\n);\n\nconst headerStyle = computed<CSSProperties>(() => ({\n  display: 'flex',\n  flexDirection: 'row-reverse',\n  alignItems: 'center',\n  marginBottom: '4px',\n  ...headerAttrs.value.style,\n}));\n\n// Close button props and styles\nconst closeButtonAttrs = computed(() => {\n  const closeButtonProps = props.closeButtonProps || {};\n  const { class: cls, style, onClick, ...rest } = closeButtonProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    onClick: onClick as ((event: MouseEvent) => void) | undefined,\n    rest,\n  };\n});\n\nconst closeButtonClassNames = computed(() => \n  joinClassNames('mediasfu-share-event__close', closeButtonAttrs.value.className)\n);\n\nconst closeButtonStyle = computed<CSSProperties>(() => ({\n  background: 'none',\n  border: 'none',\n  padding: '6px',\n  cursor: 'pointer',\n  display: 'inline-flex',\n  alignItems: 'center',\n  justifyContent: 'center',\n  color: 'black',\n  ...closeButtonAttrs.value.style,\n}));\n\n// Close icon\nconst closeIconAttrs = computed(() => {\n  const closeIconProps = props.closeIconProps || {};\n  const { style, ...rest } = closeIconProps as Record<string, unknown>;\n  return {\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst resolvedCloseIcon = computed(() => \n  props.closeIcon ?? h(FontAwesomeIcon, {\n    icon: faTimes,\n    size: 'lg',\n    style: { fontSize: '20px', color: 'black', ...closeIconAttrs.value.style },\n    ...closeIconAttrs.value.rest,\n  })\n);\n\nconst handleCloseClick = (event: MouseEvent) => {\n  if (closeButtonAttrs.value.onClick) {\n    closeButtonAttrs.value.onClick(event);\n  }\n  if (!event.defaultPrevented) {\n    handleClose();\n  }\n};\n\n// Build close button node\nconst defaultCloseButton = computed(() => \n  h(\n    'button',\n    {\n      type: 'button',\n      class: closeButtonClassNames.value,\n      style: closeButtonStyle.value,\n      onClick: handleCloseClick,\n      'aria-label': 'Close share event modal',\n      ...closeButtonAttrs.value.rest,\n    },\n    [resolvedCloseIcon.value]\n  )\n);\n\nconst closeButtonNode = computed(() => {\n  if (props.renderCloseButton) {\n    return props.renderCloseButton({\n      defaultCloseButton: defaultCloseButton.value,\n      onClose: handleClose,\n    });\n  }\n  return defaultCloseButton.value;\n});\n\n// Build header node\nconst defaultHeader = computed(() => \n  h(\n    'div',\n    {\n      class: headerClassNames.value,\n      style: headerStyle.value,\n      ...headerAttrs.value.rest,\n    },\n    [closeButtonNode.value]\n  )\n);\n\nconst headerNode = computed(() => {\n  if (props.renderHeader) {\n    return props.renderHeader({\n      defaultHeader: defaultHeader.value,\n      closeButton: closeButtonNode.value,\n    });\n  }\n  return defaultHeader.value;\n});\n\n// Divider props and styles\nconst dividerAttrs = computed(() => {\n  const dividerProps = props.dividerProps || {};\n  const { class: cls, style, ...rest } = dividerProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst dividerClassNames = computed(() => \n  joinClassNames('mediasfu-share-event__divider', dividerAttrs.value.className)\n);\n\nconst dividerStyle = computed<CSSProperties>(() => ({\n  border: 'none',\n  height: '1px',\n  backgroundColor: 'rgba(0,0,0,0.2)',\n  margin: '4px 0',\n  ...dividerAttrs.value.style,\n}));\n\nconst defaultDivider = computed(() => \n  h('hr', {\n    class: dividerClassNames.value,\n    style: dividerStyle.value,\n    ...dividerAttrs.value.rest,\n  })\n);\n\nconst dividerNode = computed(() => {\n  if (props.renderDivider) {\n    return props.renderDivider({ defaultDivider: defaultDivider.value });\n  }\n  return defaultDivider.value;\n});\n\n// Body props and styles\nconst bodyAttrs = computed(() => {\n  const bodyProps = props.bodyProps || {};\n  const { class: cls, style, ...rest } = bodyProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst bodyClassNames = computed(() => \n  joinClassNames('mediasfu-share-event__body', bodyAttrs.value.className)\n);\n\nconst bodyStyle = computed<CSSProperties>(() => ({\n  flex: 1,\n  display: 'flex',\n  flexDirection: 'column',\n  gap: '10px',\n  ...bodyAttrs.value.style,\n}));\n\n// Meeting Passcode component\nconst meetingPasscodeWrapperAttrs = computed(() => {\n  const wrapperProps = props.meetingPasscodeWrapperProps || {};\n  const { class: cls, style, ...rest } = wrapperProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst meetingPasscodeWrapperClassNames = computed(() => \n  joinClassNames('mediasfu-share-event__meeting-passcode', meetingPasscodeWrapperAttrs.value.className)\n);\n\nconst meetingPasscodeWrapperStyle = computed<CSSProperties>(() => ({\n  marginBottom: '10px',\n  ...meetingPasscodeWrapperAttrs.value.style,\n}));\n\nconst isHost = computed(() => props.islevel === '2');\n\nconst defaultMeetingPasscode = computed(() => {\n  if (!isHost.value) return null;\n  \n  return h(\n    'div',\n    {\n      class: meetingPasscodeWrapperClassNames.value,\n      style: meetingPasscodeWrapperStyle.value,\n      ...meetingPasscodeWrapperAttrs.value.rest,\n    },\n    [\n      h(MeetingPasscodeComponent, {\n        meetingPasscode: props.adminPasscode,\n        ...props.meetingPasscodeComponentProps,\n      })\n    ]\n  );\n});\n\nconst meetingPasscodeNode = computed(() => {\n  if (!isHost.value) return null;\n  \n  if (props.renderMeetingPasscode) {\n    return props.renderMeetingPasscode({\n      defaultMeetingPasscode: defaultMeetingPasscode.value!,\n      adminPasscode: props.adminPasscode,\n      isHost: isHost.value,\n    });\n  }\n  return defaultMeetingPasscode.value;\n});\n\n// Meeting ID component\nconst meetingIdWrapperAttrs = computed(() => {\n  const wrapperProps = props.meetingIdWrapperProps || {};\n  const { class: cls, style, ...rest } = wrapperProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst meetingIdWrapperClassNames = computed(() => \n  joinClassNames('mediasfu-share-event__meeting-id', meetingIdWrapperAttrs.value.className)\n);\n\nconst meetingIdWrapperStyle = computed<CSSProperties>(() => ({\n  marginBottom: '10px',\n  ...meetingIdWrapperAttrs.value.style,\n}));\n\nconst defaultMeetingId = computed(() => \n  h(\n    'div',\n    {\n      class: meetingIdWrapperClassNames.value,\n      style: meetingIdWrapperStyle.value,\n      ...meetingIdWrapperAttrs.value.rest,\n    },\n    [\n      h(MeetingIdComponent, {\n        meetingID: props.roomName,\n        ...props.meetingIdComponentProps,\n      })\n    ]\n  )\n);\n\nconst meetingIdNode = computed(() => {\n  if (props.renderMeetingId) {\n    return props.renderMeetingId({\n      defaultMeetingId: defaultMeetingId.value,\n      roomName: props.roomName,\n    });\n  }\n  return defaultMeetingId.value;\n});\n\n// Share Buttons component\nconst shareButtonsWrapperAttrs = computed(() => {\n  const wrapperProps = props.shareButtonsWrapperProps || {};\n  const { class: cls, style, ...rest } = wrapperProps as Record<string, unknown>;\n  return {\n    className: cls as string | undefined,\n    style: style as CSSProperties | undefined,\n    rest,\n  };\n});\n\nconst shareButtonsWrapperClassNames = computed(() => \n  joinClassNames('mediasfu-share-event__share-buttons', shareButtonsWrapperAttrs.value.className)\n);\n\nconst shareButtonsWrapperStyle = computed<CSSProperties>(() => ({\n  marginBottom: '10px',\n  ...shareButtonsWrapperAttrs.value.style,\n}));\n\nconst defaultShareButtons = computed(() => {\n  if (!props.shareButtons) return null;\n  \n  return h(\n    'div',\n    {\n      class: shareButtonsWrapperClassNames.value,\n      style: shareButtonsWrapperStyle.value,\n      ...shareButtonsWrapperAttrs.value.rest,\n    },\n    [\n      h(ShareButtonsComponent, {\n        meetingID: props.roomName,\n        eventType: props.eventType,\n        localLink: props.localLink,\n        ...props.shareButtonsComponentProps,\n      })\n    ]\n  );\n});\n\nconst shareButtonsNode = computed(() => {\n  if (!props.shareButtons) return null;\n  \n  if (props.renderShareButtons) {\n    return props.renderShareButtons({\n      defaultShareButtons: defaultShareButtons.value!,\n      hasShareButtons: props.shareButtons,\n    });\n  }\n  return defaultShareButtons.value;\n});\n\n// Build body node\nconst defaultBody = computed(() => \n  h(\n    'div',\n    {\n      class: bodyClassNames.value,\n      style: bodyStyle.value,\n      ...bodyAttrs.value.rest,\n    },\n    [\n      meetingPasscodeNode.value,\n      meetingIdNode.value,\n      shareButtonsNode.value,\n    ].filter(Boolean)\n  )\n);\n\nconst bodyNode = computed(() => {\n  if (props.renderBody) {\n    return props.renderBody({\n      defaultBody: defaultBody.value,\n      meetingPasscode: meetingPasscodeNode.value,\n      meetingId: meetingIdNode.value,\n      shareButtons: shareButtonsNode.value,\n    });\n  }\n  return defaultBody.value;\n});\n\n// Build content node\nconst defaultContent = computed(() => \n  h(\n    'div',\n    {\n      class: contentClassNames.value,\n      style: contentStyle.value,\n      ...contentAttrs.value.rest,\n    },\n    [\n      headerNode.value,\n      dividerNode.value,\n      bodyNode.value,\n    ]\n  )\n);\n\nconst contentNode = computed(() => {\n  if (props.renderContent) {\n    return props.renderContent({ defaultContent: defaultContent.value });\n  }\n  return defaultContent.value;\n});\n\n// Build overlay node\nconst overlayNode = computed<VNodeChild>(() => {\n  return h(\n    'div',\n    {\n      class: overlayClassNames.value,\n      style: overlayStyle.value,\n      ...overlayAttrs.value.rest,\n    },\n    [contentNode.value]\n  );\n});\n</script>\n","<!--\n/**\n * @fileoverview WelcomePage Component - Event authentication and entry interface\n * @component WelcomePage\n * @module components/miscComponents/WelcomePage\n * \n * @description\n * The welcome page provides a secure entry interface for joining MediaSFU events.\n * Users enter their display name, event ID, and secret token to authenticate and\n * join an ongoing event. Supports manual entry and QR code scanning for autofill.\n * \n * Features:\n * - Event authentication with name, ID, and secret token\n * - Input validation (alphanumeric, length limits)\n * - QR code scanning support for autofill\n * - Link to MediaSFU portal for obtaining credentials\n * - Secure token handling\n * - Fully customizable via `uiOverrides.welcomePage`\n * \n * @example Basic Usage\n * <WelcomePage :parameters=\"parameters\" />\n * \n * @example Custom Logo\n * // <WelcomePage\n *   // :parameters=\"{\n *     ...parameters,\n *     imgSrc: 'https://example.com/custom-logo.png'\n *   }\"\n * // />\n * \n * @example Complete Replacement via UI Overrides\n * const uiOverrides = computed(() => ({\n *   // welcomePage: {\n *     component: CustomWelcomePage\n *   }\n * }));\n */\n-->\n<template>\n  <div :style=\"styles.container\">\n    <div :style=\"styles.logoContainer\">\n      <img\n        :src=\"parameters.imgSrc || 'https://mediasfu.com/images/logo192.png'\"\n        :style=\"styles.logoImage\"\n        alt=\"Logo\"\n      />\n    </div>\n    <div :style=\"styles.inputContainer\">\n      <input\n        type=\"text\"\n        placeholder=\"Event Display Name\"\n        :value=\"name\"\n        :style=\"styles.inputField\"\n        @input=\"handleNameChange\"\n      />\n      <input\n        type=\"text\"\n        placeholder=\"Event Token (Secret)\"\n        :value=\"secret\"\n        :style=\"styles.inputField\"\n        @input=\"handleSecretChange\"\n      />\n      <input\n        type=\"text\"\n        placeholder=\"Event ID\"\n        :value=\"eventID\"\n        :style=\"styles.inputField\"\n        @input=\"handleEventIDChange\"\n      />\n      <input\n        v-model=\"link\"\n        type=\"text\"\n        placeholder=\"Event Link\"\n        :style=\"styles.inputField\"\n      />\n    </div>\n    <button\n      :style=\"styles.confirmButton\"\n      @click=\"handleConfirm\"\n    >\n      Confirm\n    </button>\n\n    <div :style=\"styles.additionalOptionsContainer\">\n      <p>\n        Provide the event details either by typing manually or scanning the QR-code to autofill.\n      </p>\n      <p>Do not have a secret?</p>\n      <a\n        href=\"https://meeting.mediasfu.com/meeting/start/\"\n        target=\"_blank\"\n        rel=\"noreferrer\"\n        :style=\"styles.link\"\n      >\n        Get one from mediasfu.com\n      </a>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, type CSSProperties } from 'vue';\nimport {\n  validateAlphanumeric,\n  validateWelcomeInputs,\n  handleWelcomeRequest,\n} from 'mediasfu-shared';\nimport type { WelcomePageParameters } from '../../../../SharedTypes';\n\n/**\n * Props for the WelcomePage component\n * @interface WelcomePageProps\n */\nexport interface WelcomePageProps {\n  /**\n   * MediaSFU parameters object containing event state and callbacks\n   * Includes imgSrc for custom logo and socket connection configuration\n   */\n  parameters: WelcomePageParameters;\n}\n\nconst props = defineProps<WelcomePageProps>();\n\nconst name = ref('');\nconst secret = ref('');\nconst eventID = ref('');\nconst link = ref('');\n\nconst handleNameChange = (e: Event) => {\n  const text = (e.target as HTMLInputElement).value;\n  if (text.length <= 12 && validateAlphanumeric(text)) {\n    name.value = text;\n  }\n};\n\nconst handleSecretChange = (e: Event) => {\n  const text = (e.target as HTMLInputElement).value;\n  if (text.length <= 64 && validateAlphanumeric(text)) {\n    secret.value = text;\n  }\n};\n\nconst handleEventIDChange = (e: Event) => {\n  const text = (e.target as HTMLInputElement).value;\n  if (text.length <= 32 && validateAlphanumeric(text)) {\n    eventID.value = text;\n  }\n};\n\nconst handleConfirm = async () => {\n  props.parameters.updateIsLoadingModalVisible(true);\n\n  const validation = validateWelcomeInputs({\n    name: name.value,\n    secret: secret.value,\n    eventID: eventID.value,\n    link: link.value,\n  });\n\n  if (!validation.valid) {\n    props.parameters.showAlert?.({\n      message: validation.message || 'Please enter valid details.',\n      type: 'danger',\n      duration: 3000,\n    });\n\n    props.parameters.updateIsLoadingModalVisible(false);\n    return;\n  }\n\n  await handleWelcomeRequest({\n    apiUserName: eventID.value,\n    apiToken: secret.value,\n    link: link.value,\n    userName: name.value,\n    parameters: props.parameters as any, // Cast to resolve socket type incompatibility\n  });\n\n  props.parameters.updateIsLoadingModalVisible(false);\n};\n\nconst styles = computed<{ [key: string]: CSSProperties }>(() => ({\n  container: {\n    display: 'flex',\n    flexDirection: 'column',\n    alignItems: 'center',\n    justifyContent: 'center',\n    height: '100vh',\n    width: '100vw',\n    backgroundColor: '#53C6E0',\n    overflow: 'auto',\n  },\n  logoContainer: {\n    marginTop: '30px',\n    paddingTop: '10px',\n    marginBottom: '10px',\n  },\n  logoImage: {\n    width: '100px',\n    height: '100px',\n    borderRadius: '50%',\n  },\n  inputContainer: {\n    marginBottom: '10px',\n    flexDirection: 'column',\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  inputField: {\n    height: '30px',\n    borderColor: 'gray',\n    borderWidth: '1px',\n    marginBottom: '10px',\n    padding: '0 5px',\n    borderRadius: '5px',\n  },\n  confirmButton: {\n    backgroundColor: 'black',\n    color: 'white',\n    padding: '5px 5px',\n    borderRadius: '5px',\n    marginBottom: '10px',\n  },\n  additionalOptionsContainer: {\n    textAlign: 'center',\n  },\n  link: {\n    color: 'blue',\n    textDecoration: 'none',\n    fontWeight: 'bold',\n    marginLeft: '5px',\n  },\n}));\n</script>\n\n<style scoped>\n/* Component-specific styles */\n</style>\n","<!--\n/**\n * @fileoverview PreJoinPage Component - Room creation and join interface\n * @component PreJoinPage\n * @module components/miscComponents/PreJoinPage\n * \n * @description\n * The pre-join page allows users to either create a new MediaSFU room or join an existing one.\n * It provides a form-based interface with toggle between create and join modes, handles\n * socket connection setup, and manages the initial connection flow.\n * \n * Features:\n * - Create new rooms with configurable event type, duration, and capacity\n * - Join existing rooms with display name and event ID\n * - Toggle between create and join modes\n * - Automatic MediaSFU API integration with credentials\n * - Local server connection support for development\n * - Error handling and validation\n * - Fully customizable via `uiOverrides.preJoinPage`\n * \n * @example Basic Usage (Join Mode)\n * // <PreJoinPage\n *   // :parameters=\"parameters\"\n *   // :credentials=\"{ apiUserName: 'user123', apiKey: 'key456' }\"\n *   // connectMediaSFU\n * // />\n * \n * @example Create Mode with Local Server\n * // <PreJoinPage\n *   // :parameters=\"parameters\"\n *   // localLink=\"http://localhost:3000\"\n *   // :connectMediaSFU=\"false\"\n * // />\n * \n * @example No-UI Mode (Programmatic Join)\n * // <PreJoinPage\n *   // :parameters=\"parameters\"\n *   // :returnUI=\"false\"\n *   // :noUIPreJoinOptions=\"{\n *     action: 'join',\n *     userName: 'John Doe',\n *     meetingID: 'room123'\n *   }\"\n *   // :credentials=\"credentials\"\n * // />\n * \n * @example Complete Replacement via UI Overrides\n * const uiOverrides = computed(() => ({\n *   // preJoinPage: {\n *     component: CustomPreJoinPage\n *   }\n * }));\n */\n-->\n<template>\n  <div :style=\"styles.container\">\n    <div :style=\"styles.logoContainer\">\n      <img\n        :src=\"parameters.imgSrc || 'https://mediasfu.com/images/logo192.png'\"\n        :style=\"styles.logoImage\"\n        alt=\"Logo\"\n      />\n    </div>\n    <div :style=\"styles.inputContainer\">\n      <template v-if=\"isCreateMode\">\n        <input\n          v-model=\"name\"\n          type=\"text\"\n          placeholder=\"Display Name\"\n          :style=\"styles.inputField\"\n        />\n        <input\n          v-model=\"duration\"\n          type=\"text\"\n          placeholder=\"Duration (minutes)\"\n          :style=\"styles.inputField\"\n        />\n        <select\n          v-model=\"eventType\"\n          :style=\"styles.selectField\"\n        >\n          <option value=\"\">\n            Select Event Type\n          </option>\n          <option value=\"chat\">\n            Chat\n          </option>\n          <option value=\"broadcast\">\n            Broadcast\n          </option>\n          <option value=\"webinar\">\n            Webinar\n          </option>\n          <option value=\"conference\">\n            Conference\n          </option>\n        </select>\n        <input\n          v-model=\"capacity\"\n          type=\"text\"\n          placeholder=\"Room Capacity\"\n          :style=\"styles.inputField\"\n        />\n        <button\n          :style=\"styles.actionButton\"\n          @click=\"onCreateRoom\"\n        >\n          Create Room\n        </button>\n      </template>\n      <template v-else>\n        <input\n          v-model=\"name\"\n          type=\"text\"\n          placeholder=\"Display Name\"\n          :style=\"styles.inputField\"\n        />\n        <input\n          v-model=\"eventID\"\n          type=\"text\"\n          placeholder=\"Event ID\"\n          :style=\"styles.inputField\"\n        />\n        <button\n          :style=\"styles.actionButton\"\n          @click=\"onJoinRoom\"\n        >\n          Join Room\n        </button>\n      </template>\n      <p\n        v-if=\"error\"\n        :style=\"styles.error\"\n      >\n        {{ error }}\n      </p>\n    </div>\n    <div :style=\"styles.orContainer\">\n      <span :style=\"styles.orText\">OR</span>\n    </div>\n    <div :style=\"styles.toggleContainer\">\n      <button\n        :style=\"styles.toggleButton\"\n        @click=\"handleToggleMode\"\n      >\n        {{ isCreateMode ? 'Switch to Join Mode' : 'Switch to Create Mode' }}\n      </button>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, onMounted, markRaw, type CSSProperties } from 'vue';\nimport type { MediaSFUSocket } from '../../types/socket';\nimport { handleCreateRoom } from 'mediasfu-shared';\nimport { handleJoinRoom } from 'mediasfu-shared';\nimport { createRoomOnMediaSFU } from '@legacy/methods/utils/createRoomOnMediaSFU';\nimport {\n  joinRoomOnMediaSFU,\n  type CreateRoomOnMediaSFUType,\n  type JoinRoomOnMediaSFUType,\n} from '@legacy/methods/utils/joinRoomOnMediaSFU';\nimport type {\n  ResponseLocalConnection,\n  ResponseLocalConnectionData,\n  CreateMediaSFURoomOptions,\n  JoinMediaSFURoomOptions,\n  PreJoinPageParameters,\n  Credentials,\n} from '../../../../SharedTypes';\n\n/**\n * Props for the PreJoinPage component\n * @interface PreJoinPageProps\n */\nexport interface PreJoinPageProps {\n  /**\n   * Local server URL for development/self-hosted deployments\n   * @default \"\"\n   * @example \"http://localhost:3000\"\n   */\n  localLink?: string;\n  \n  /**\n   * Whether to connect to MediaSFU cloud service\n   * Set to false for local-only deployments\n   * @default true\n   */\n  connectMediaSFU?: boolean;\n  \n  /**\n   * MediaSFU parameters object containing room state and callbacks\n   */\n  parameters: PreJoinPageParameters;\n  \n  /**\n   * API credentials for MediaSFU cloud service\n   * Required when connectMediaSFU is true\n   * @default { apiUserName: 'yourAPIUSERNAME', apiKey: 'yourAPIKEY' }\n   * @example { apiUserName: 'user123', apiKey: 'sk_1234567890abcdef' }\n   */\n  credentials?: Credentials;\n  \n  /**\n   * Whether to render the UI or use programmatic mode\n   * When false, uses noUIPreJoinOptions for automatic join/create\n   * @default false\n   */\n  returnUI?: boolean;\n  \n  /**\n   * Configuration for programmatic (no-UI) join/create mode\n   * Used when returnUI is false\n   * @example { action: 'join', userName: 'John Doe', meetingID: 'room123' }\n   * @example { action: 'create', userName: 'Host', duration: 30, eventType: 'conference', capacity: 100 }\n   */\n  noUIPreJoinOptions?: CreateMediaSFURoomOptions | JoinMediaSFURoomOptions;\n  \n  /**\n   * Custom function for creating a room on MediaSFU\n   * @default createRoomOnMediaSFU\n   */\n  createMediaSFURoom?: CreateRoomOnMediaSFUType;\n  \n  /**\n   * Custom function for joining a room on MediaSFU\n   * @default joinRoomOnMediaSFU\n   */\n  joinMediaSFURoom?: JoinRoomOnMediaSFUType;\n}\n\nconst props = withDefaults(defineProps<PreJoinPageProps>(), {\n  localLink: '',\n  connectMediaSFU: true,\n  credentials: () => ({ apiUserName: 'yourAPIUSERNAME', apiKey: 'yourAPIKEY' }),\n  returnUI: false,\n  noUIPreJoinOptions: undefined,\n  createMediaSFURoom: () => createRoomOnMediaSFU,\n  joinMediaSFURoom: () => joinRoomOnMediaSFU,\n});\n\nconst isCreateMode = ref(false);\nconst name = ref('');\nconst duration = ref('');\nconst eventType = ref('');\nconst capacity = ref('');\nconst eventID = ref('');\nconst error = ref('');\nconst pending = ref(false);\n\nconst localConnected = ref(false);\nconst localData = ref<ResponseLocalConnectionData | undefined>(undefined);\nconst initSocket = ref<MediaSFUSocket | undefined>(undefined);\n\nconst handleToggleMode = () => {\n  isCreateMode.value = !isCreateMode.value;\n  error.value = '';\n};\n\nconst onCreateRoom = async () => {\n  if (pending.value) {\n    return;\n  }\n  pending.value = true;\n\n  let payload = {} as CreateMediaSFURoomOptions;\n\n  if (props.returnUI) {\n    if (!name.value || !duration.value || !eventType.value || !capacity.value) {\n      error.value = 'Please fill all the fields.';\n      pending.value = false;\n      return;\n    }\n    payload = {\n      action: 'create',\n      duration: parseInt(duration.value),\n      capacity: parseInt(capacity.value),\n      eventType: eventType.value as 'chat' | 'broadcast' | 'webinar' | 'conference',\n      userName: name.value,\n      recordOnly: false,\n    };\n  } else {\n    if (\n      props.noUIPreJoinOptions &&\n      'action' in props.noUIPreJoinOptions &&\n      props.noUIPreJoinOptions.action === 'create'\n    ) {\n      payload = props.noUIPreJoinOptions as CreateMediaSFURoomOptions;\n    } else {\n      pending.value = false;\n      throw new Error('Invalid options provided for creating a room without UI.');\n    }\n  }\n\n  try {\n    await handleCreateRoom({\n      payload,\n      localLink: props.localLink,\n      connectMediaSFU: props.connectMediaSFU,\n      apiUserName: props.credentials?.apiUserName || '',\n      apiKey: props.credentials?.apiKey || '',\n      parameters: props.parameters,\n      initSocket: initSocket.value as unknown as MediaSFUSocket | undefined,\n      localData: localData.value,\n      createMediaSFURoom: props.createMediaSFURoom!,\n    });\n  } catch (err) {\n    const message = err instanceof Error ? err.message : 'Unable to create room.';\n    error.value = message;\n  } finally {\n    pending.value = false;\n    props.parameters.updateIsLoadingModalVisible?.(false);\n  }\n};\n\nconst onJoinRoom = async () => {\n  if (pending.value) {\n    return;\n  }\n  pending.value = true;\n\n  let payload = {} as JoinMediaSFURoomOptions;\n\n  if (props.returnUI) {\n    if (!name.value || !eventID.value) {\n      error.value = 'Please fill all the fields.';\n      pending.value = false;\n      return;\n    }\n\n    payload = {\n      action: 'join',\n      meetingID: eventID.value,\n      userName: name.value,\n    };\n  } else {\n    if (\n      props.noUIPreJoinOptions &&\n      'action' in props.noUIPreJoinOptions &&\n      props.noUIPreJoinOptions.action === 'join'\n    ) {\n      payload = props.noUIPreJoinOptions as JoinMediaSFURoomOptions;\n    } else {\n      pending.value = false;\n      throw new Error('Invalid options provided for joining a room without UI.');\n    }\n  }\n\n  try {\n    await handleJoinRoom({\n      payload,\n      localLink: props.localLink,\n      apiUserName: props.credentials?.apiUserName || '',\n      apiKey: props.credentials?.apiKey || '',\n      parameters: props.parameters,\n      initSocket: initSocket.value as unknown as MediaSFUSocket | undefined,\n      localData: localData.value,\n      joinMediaSFURoom: props.joinMediaSFURoom!,\n    });\n  } catch (err) {\n    const message = err instanceof Error ? err.message : 'Unable to join room.';\n    error.value = message;\n  } finally {\n    pending.value = false;\n    props.parameters.updateIsLoadingModalVisible?.(false);\n  }\n};\n\nconst checkProceed = async ({\n  returnUI,\n  noUIPreJoinOptions,\n}: {\n  returnUI: boolean;\n  noUIPreJoinOptions?: CreateMediaSFURoomOptions | JoinMediaSFURoomOptions;\n}) => {\n  if (!returnUI && noUIPreJoinOptions) {\n    if ('action' in noUIPreJoinOptions && noUIPreJoinOptions.action === 'create') {\n      const createOptions: CreateMediaSFURoomOptions = noUIPreJoinOptions as CreateMediaSFURoomOptions;\n      if (\n        !createOptions.userName ||\n        !createOptions.duration ||\n        !createOptions.eventType ||\n        !createOptions.capacity\n      ) {\n        throw new Error(\n          'Please provide all the required parameters: userName, duration, eventType, capacity'\n        );\n      }\n\n      await onCreateRoom();\n    } else if ('action' in noUIPreJoinOptions && noUIPreJoinOptions.action === 'join') {\n      const joinOptions: JoinMediaSFURoomOptions = noUIPreJoinOptions as JoinMediaSFURoomOptions;\n      if (!joinOptions.userName || !joinOptions.meetingID) {\n        throw new Error('Please provide all the required parameters: userName, meetingID');\n      }\n\n      await onJoinRoom();\n    } else {\n      throw new Error('Invalid options provided for creating/joining a room without UI.');\n    }\n  }\n};\n\nonMounted(() => {\n  if (props.localLink.length > 0 && !localConnected.value && !initSocket.value) {\n    try {\n      props.parameters.connectLocalSocket?.({ link: props.localLink })\n        .then((response: ResponseLocalConnection | undefined) => {\n          if (!response) {\n            return;\n          }\n\n          const { data, socket } = response;\n          if (data) {\n            if (!data.meetingRoomParams_) {\n              (data as unknown as Record<string, unknown>).meetingRoomParams_ = {};\n            }\n            if (!data.recordingParams_) {\n              (data as unknown as Record<string, unknown>).recordingParams_ = {};\n            }\n            if (data.socketId == null) {\n              (data as unknown as Record<string, unknown>).socketId = '';\n            }\n            if (data.mode == null) {\n              (data as unknown as Record<string, unknown>).mode = '';\n            }\n            if (data.allowRecord == null) {\n              (data as unknown as Record<string, unknown>).allowRecord = false;\n            }\n          }\n\n          localData.value = data;\n          initSocket.value = socket ? (markRaw(socket) as unknown as MediaSFUSocket) : undefined;\n          localConnected.value = true;\n\n          if (!props.returnUI && props.noUIPreJoinOptions) {\n            checkProceed({ returnUI: props.returnUI, noUIPreJoinOptions: props.noUIPreJoinOptions });\n          }\n        })\n        .catch((error: unknown) => {\n          props.parameters.showAlert?.({\n            message: `Unable to connect to ${props.localLink}. ${error}`,\n            type: 'danger',\n            duration: 3000,\n          });\n        });\n    } catch {\n      props.parameters.showAlert?.({\n        message: `Unable to connect to ${props.localLink}. Something went wrong.`,\n        type: 'danger',\n        duration: 3000,\n      });\n    }\n  } else if (props.localLink.length === 0 && !initSocket.value) {\n    if (!props.returnUI && props.noUIPreJoinOptions) {\n      checkProceed({ returnUI: props.returnUI, noUIPreJoinOptions: props.noUIPreJoinOptions });\n    }\n  }\n});\n\nconst styles = computed<{ [key: string]: CSSProperties }>(() => ({\n  container: {\n    display: 'flex',\n    flexDirection: 'column',\n    alignItems: 'center',\n    justifyContent: 'center',\n    padding: '20px',\n    minHeight: '100vh',\n    width: '100%',\n    backgroundColor: '#53C6E0',\n    overflow: 'auto',\n    boxSizing: 'border-box',\n  },\n  inputContainer: {\n    marginBottom: '20px',\n    display: 'flex',\n    flexDirection: 'column',\n    alignItems: 'center',\n    justifyContent: 'center',\n  },\n  inputField: {\n    height: '30px',\n    borderColor: 'gray',\n    borderWidth: '1px',\n    marginBottom: '10px',\n    padding: '0 5px',\n    borderRadius: '5px',\n  },\n  selectField: {\n    height: '30px',\n    borderColor: 'gray',\n    borderWidth: '1px',\n    marginBottom: '10px',\n    padding: '0 5px',\n    borderRadius: '5px',\n  },\n  actionButton: {\n    backgroundColor: 'black',\n    color: 'white',\n    padding: '5px 20px',\n    borderRadius: '5px',\n    marginBottom: '10px',\n    marginTop: '10px',\n  },\n  toggleContainer: {\n    display: 'flex',\n    justifyContent: 'center',\n    alignItems: 'center',\n  },\n  toggleButton: {\n    backgroundColor: 'black',\n    color: 'white',\n    padding: '5px 20px',\n    borderRadius: '5px',\n  },\n  error: {\n    color: 'red',\n    marginBottom: '10px',\n  },\n  logoContainer: {\n    marginTop: '30px',\n    paddingTop: '10px',\n    marginBottom: '10px',\n  },\n  logoImage: {\n    width: '100px',\n    height: '100px',\n    borderRadius: '50%',\n  },\n  orContainer: {\n    display: 'flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n    margin: '10px 0',\n  },\n  orText: {\n    color: 'black',\n    fontSize: 'medium',\n    fontWeight: 'bold',\n  },\n}));\n</script>\n\n<script lang=\"ts\">\nexport default {\n  name: 'PreJoinPage'\n}\n</script>\n\n<style scoped>\n/* Component-specific styles */\n</style>\n","<!--\n/**\n * @fileoverview PollModal - Interactive polling system for real-time audience engagement\n * @component PollModal\n * @module components/pollsComponents/PollModal\n * \n * @description\n * A comprehensive polling modal that enables hosts to create polls (Yes/No, True/False, or\n * custom options) and allows participants to vote in real-time. Displays active polls with\n * live vote counts, percentage breakdowns, and visual progress bars. Includes poll history\n * viewer showing all previous polls and their results. Host-only controls for poll creation\n * and termination with automatic cleanup of inactive polls.\n * \n * Key Features:\n * - Poll creation with 3 types: True/False, Yes/No, Custom (up to N options)\n * - Real-time voting with Socket.io integration\n * - Live vote counting and percentage calculation\n * - Visual progress bars for each poll option\n * - Poll history viewer with previous results\n * - Host-only poll creation and termination controls\n * - Participant vote validation (one vote per poll)\n * - Automatic poll status updates (active/inactive)\n * - Responsive modal with configurable positioning\n * - Custom render functions for complete UI control\n * - Empty state messages for no polls/no active poll\n * \n * Poll Types:\n * - **True/False**: Binary choice poll with \"True\" and \"False\" options\n * - **Yes/No**: Binary choice poll with \"Yes\" and \"No\" options\n * - **Custom**: Multi-option poll with user-defined options (host enters option text)\n * \n * User Roles:\n * - **Host (islevel='2')**: Can create polls, end polls, view all results\n * - **Participants**: Can vote on active polls, view results, see poll history\n * \n * Workflow:\n * 1. Host opens poll modal and creates new poll (question + type)\n * 2. For custom polls, host adds option text for each choice\n * 3. Host submits poll → Socket.io emits \"createPoll\" → poll becomes active\n * 4. Participants see active poll → select option → Socket.io emits \"votePoll\"\n * 5. All users see live vote counts and percentages update in real-time\n * 6. Host ends poll → Socket.io emits \"endPoll\" → poll moves to history\n * 7. Poll history shows all previous polls with final results and percentages\n * \n * @example Basic Usage - Host Creates Poll\n * ```typescript\n * // <PollModal\n *   // :isPollModalVisible=\"showPollModal\"\n *   // :onClose=\"() => showPollModal = false\"\n *   // member=\"HostUser\"\n *   // islevel=\"2\"\n *   // :polls=\"allPolls\"\n *   // :poll=\"currentActivePoll\"\n *   // :socket=\"socketConnection\"\n *   // roomName=\"room123\"\n *   // :showAlert=\"alertFunction\"\n *   // :updateIsPollModalVisible=\"setShowPollModal\"\n *   // :handleCreatePoll=\"createPollHandler\"\n *   // :handleEndPoll=\"endPollHandler\"\n *   // :handleVotePoll=\"votePollHandler\"\n * // />\n * ```\n * \n * @example Participant View - Vote on Active Poll\n * ```typescript\n * // Participant sees active poll with vote buttons\n * // <PollModal\n * //   :isPollModalVisible=\"true\"\n * //   :onClose=\"closePollModal\"\n * //   member=\"ParticipantUser\"\n * //   islevel=\"1\"\n * //   :polls=\"polls\"\n * //   :poll=\"activePoll\"\n * //   :socket=\"socket\"\n * //   roomName=\"room456\"\n * //   :handleVotePoll=\"handleVote\"\n * // />\n * ```\n * \n * @example Custom Position and Styling\n * ```typescript\n * // <PollModal\n *   // :isPollModalVisible=\"true\"\n *   // :onClose=\"closeModal\"\n *   // position=\"topLeft\"\n *   // backgroundColor=\"#ffffff\"\n *   // member=\"Host\"\n *   // islevel=\"2\"\n *   // :polls=\"polls\"\n *   // :poll=\"activePoll\"\n *   // :socket=\"socket\"\n *   // roomName=\"room789\"\n * // />\n * ```\n * \n * @example Custom Empty States\n * ```typescript\n * // <PollModal\n *   // :isPollModalVisible=\"true\"\n *   // :onClose=\"closeModal\"\n *   // emptyPreviousPolls=\"No polls have been created yet\"\n *   // emptyActivePoll=\"Waiting for host to start a poll...\"\n *   // member=\"User\"\n *   // islevel=\"1\"\n *   // :polls=\"[]\"\n *   // :poll=\"null\"\n *   // :socket=\"socket\"\n *   // roomName=\"room\"\n * // />\n * ```\n * \n * @example Custom Poll Creation Form Renderer\n * ```typescript\n * // <script setup>\n * const customCreatePollRenderer = ({ defaultCreatePoll, newPoll, setNewPoll }) => {\n *   // return h('div', { class: 'custom-poll-form' }, [\n *     h('h3', 'Create Your Poll'),\n *     h('input', {\n *       placeholder: 'Enter question...',\n *       value: newPoll.question,\n *       onInput: (e) => setNewPoll({ ...newPoll, question: e.target.value })\n *     }),\n *     h('select', {\n *       value: newPoll.type,\n *       onChange: (e) => {\n *         const type = e.target.value;\n *         const options = type === 'yesNo' ? ['Yes', 'No'] : \n *                        type === 'trueFalse' ? ['True', 'False'] : [];\n *         setNewPoll({ ...newPoll, type, options });\n *       }\n *     }, [\n *       h('option', { value: '' }, 'Select type'),\n *       h('option', { value: 'yesNo' }, 'Yes/No'),\n *       h('option', { value: 'trueFalse' }, 'True/False'),\n *       h('option', { value: 'custom' }, 'Custom Options')\n *     ]),\n *     // Custom options input if type is 'custom'\n *     newPoll.type === 'custom' && h('div', [\n *       newPoll.options.map((opt, idx) => \n *         h('input', {\n *           placeholder: `Option ${idx + 1}`,\n *           value: opt,\n *           onInput: (e) => {\n *             const newOptions = [...newPoll.options];\n *             newOptions[idx] = e.target.value;\n *             setNewPoll({ ...newPoll, options: newOptions });\n *           }\n *         })\n *       )\n *     ])\n *   ]);\n * };\n * </script>\n * \n * // <template>\n *   <PollModal\n *     :renderCreatePoll=\"customCreatePollRenderer\"\n *     member=\"Host\"\n *     islevel=\"2\"\n *     :polls=\"polls\"\n *     :poll=\"activePoll\"\n *     :socket=\"socket\"\n *     roomName=\"room\"\n *   />\n * </template>\n * ```\n * \n * @example Custom Active Poll Renderer with Progress Bars\n * ```typescript\n * // <script setup>\n * const customActivePollRenderer = ({ defaultActivePoll, activePoll }) => {\n *   // if (!activePoll) return h('div', 'No active poll');\n *   \n *   // const totalVotes = activePoll.votes.reduce((a, b) => a + b, 0);\n *   \n *   // return h('div', { class: 'custom-active-poll' }, [\n *     h('h3', activePoll.question),\n *     h('div', { class: 'options' }, \n *       activePoll.options.map((option, idx) => {\n *         const votes = activePoll.votes[idx] || 0;\n *         const percentage = totalVotes > 0 ? (votes / totalVotes * 100).toFixed(1) : '0';\n *         \n *         return h('div', { class: 'option-card', key: idx }, [\n *           h('button', {\n *             class: 'vote-btn',\n *             onClick: () => handleVote(idx),\n *             disabled: hasVoted\n *           }, option),\n *           h('div', { class: 'progress-bar' }, [\n *             h('div', {\n *               class: 'progress-fill',\n *               style: { width: `${percentage}%`, backgroundColor: '#4CAF50' }\n *             })\n *           ]),\n *           h('span', { class: 'vote-stats' }, `${votes} votes (${percentage}%)`)\n *         ]);\n *       })\n *     )\n *   ]);\n * };\n * </script>\n * \n * // <template>\n *   <PollModal\n *     :renderActivePoll=\"customActivePollRenderer\"\n *     member=\"User\"\n *     islevel=\"1\"\n *     :polls=\"polls\"\n *     :poll=\"activePoll\"\n *     :socket=\"socket\"\n *     roomName=\"room\"\n *   />\n * </template>\n * ```\n * \n * @see {@link handleCreatePoll} for poll creation logic\n * @see {@link handleVotePoll} for voting mechanism\n * @see {@link handleEndPoll} for poll termination\n * @see {@link Poll} for poll data structure\n * @see {@link https://mediasfu.com/docs/polls} for comprehensive polling documentation\n */\n-->\n<template>\n  <RenderVNode :node=\"overlayNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, h, isVNode, defineComponent } from 'vue';\nimport type { PropType, VNodeChild, HTMLAttributes, ButtonHTMLAttributes, InputHTMLAttributes, SelectHTMLAttributes, FormHTMLAttributes, CSSProperties } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faTimes } from '@fortawesome/free-solid-svg-icons';\nimport {\n  handleCreatePoll as handleCreatePollUtil,\n  handleEndPoll as handleEndPollUtil,\n  handleVotePoll as handleVotePollUtil,\n} from 'mediasfu-shared';\nimport type { Poll, ShowAlert } from '../../../../SharedTypes';\nimport type { Socket } from 'socket.io-client';\n\n// Helper function\nfunction joinClassNames(...classes: Array<string | undefined | null | false>): string | undefined {\n  const result = classes.filter(Boolean).join(' ').trim();\n  return result || undefined;\n}\n\n/**\n * Internal state interface for the new poll creation form\n * @interface NewPollFormState\n * @property {string} question - The poll question text entered by the host\n * @property {'' | 'trueFalse' | 'yesNo' | 'custom'} type - The poll type selection\n * @property {string[]} options - Array of option text (auto-populated for trueFalse/yesNo, manual for custom)\n */\ninterface NewPollFormState {\n  question: string;\n  type: '' | 'trueFalse' | 'yesNo' | 'custom';\n  options: string[];\n}\n\n/**\n * Props for the PollModal component\n * @interface PollModalProps\n * \n * @property {boolean} isPollModalVisible - Controls modal visibility\n * @property {() => void} onClose - Callback when modal close is requested\n * @property {string} [position='topRight'] - Modal position on screen ('topLeft' | 'topRight' | 'bottomLeft' | 'bottomRight')\n * @property {string} [backgroundColor='#f5f5f5'] - Background color of the modal content area\n * @property {string} member - Current user's name/identifier\n * @property {string} islevel - User's permission level ('2' = host, '1' = participant, '0' = guest)\n * @property {Poll[]} polls - Array of all polls (active and previous)\n * @property {Poll | null} poll - The currently active poll (null if none active)\n * @property {Socket} socket - Socket.io connection for real-time poll updates\n * @property {string} roomName - Room identifier for socket emissions\n * @property {ShowAlert} [showAlert] - Alert function for user feedback messages\n * @property {(isVisible: boolean) => void} updateIsPollModalVisible - Function to update modal visibility state\n * @property {typeof handleCreatePollUtil} handleCreatePoll - Function to handle poll creation\n * @property {typeof handleEndPollUtil} handleEndPoll - Function to handle poll termination\n * @property {typeof handleVotePollUtil} handleVotePoll - Function to handle vote submission\n * \n * @property {VNodeChild} [title='Polls'] - Modal title text or VNode\n * \n * @property {HTMLAttributes} [overlayProps] - Props for the overlay backdrop element\n * @property {HTMLAttributes} [contentProps] - Props for the modal content container\n * @property {HTMLAttributes} [headerProps] - Props for the header section wrapper\n * @property {HTMLAttributes} [titleProps] - Props for the title text element\n * @property {ButtonHTMLAttributes} [closeButtonProps] - Props for the close button\n * @property {VNodeChild} [closeIconComponent] - Custom close icon (default: FontAwesome faTimes)\n * @property {HTMLAttributes} [bodyProps] - Props for the body content wrapper\n * \n * @property {HTMLAttributes} [sectionsWrapperProps] - Props for the sections container (previous polls + create + active)\n * @property {HTMLAttributes} [previousPollsWrapperProps] - Props for the previous polls section wrapper\n * @property {HTMLAttributes} [previousPollsHeaderProps] - Props for the \"Previous Polls\" header element\n * @property {HTMLAttributes} [createPollWrapperProps] - Props for the poll creation form wrapper\n * @property {FormHTMLAttributes} [createPollFormProps] - Props for the poll creation form element\n * @property {HTMLAttributes} [activePollWrapperProps] - Props for the active poll section wrapper\n * \n * @property {InputHTMLAttributes} [pollQuestionInputProps] - Props for the poll question input field\n * @property {SelectHTMLAttributes} [pollTypeSelectProps] - Props for the poll type dropdown select\n * @property {InputHTMLAttributes} [pollOptionInputProps] - Props for custom poll option input fields\n * @property {ButtonHTMLAttributes} [voteButtonProps] - Props for vote buttons in active poll\n * @property {ButtonHTMLAttributes} [endPollButtonProps] - Props for the \"End Poll\" button (host only)\n * @property {ButtonHTMLAttributes} [submitPollButtonProps] - Props for the \"Create Poll\" submit button (host only)\n * \n * @property {VNodeChild} [emptyPreviousPolls='No polls available'] - Message/VNode shown when no previous polls exist\n * @property {VNodeChild} [emptyActivePoll='No active poll'] - Message/VNode shown when no active poll exists\n * \n * @property {(options: { defaultHeader: VNodeChild }) => VNodeChild} [renderHeader] - Custom renderer for modal header\n * @property {(options: { defaultPreviousPolls: VNodeChild; previousPolls: Poll[] }) => VNodeChild} [renderPreviousPolls] - Custom renderer for previous polls section\n * @property {(options: { defaultCreatePoll: VNodeChild; newPoll: NewPollFormState; setNewPoll: (poll: NewPollFormState) => void }) => VNodeChild} [renderCreatePoll] - Custom renderer for poll creation form (host only)\n * @property {(options: { defaultActivePoll: VNodeChild; activePoll: Poll | null }) => VNodeChild} [renderActivePoll] - Custom renderer for active poll section\n * @property {(options: { defaultBody: VNodeChild }) => VNodeChild} [renderBody] - Custom renderer for entire body content\n * @property {(options: { defaultContent: VNodeChild }) => VNodeChild} [renderContent] - Custom renderer for entire modal content\n * \n * @example Poll Data Structure\n * ```ts\n * interface Poll {\n *   // id: string;                    // Unique poll identifier\n *   // question: string;              // Poll question text\n *   // type: 'trueFalse' | 'yesNo' | 'custom';  // Poll type\n *   // options: string[];             // Array of option text\n *   // votes: number[];               // Array of vote counts per option\n *   // status: 'active' | 'inactive'; // Poll status\n *   // voters?: string[];             // Array of member names who voted\n * }\n * ```\n * \n * @example handleCreatePoll Function Signature\n * ```ts\n * handleCreatePoll({\n *   // poll: { question: string, type: string, options: string[] },\n *   // socket: Socket,\n *   // roomName: string,\n *   // showAlert?: ShowAlert,\n *   // updateIsPollModalVisible: (visible: boolean) => void\n * }): void\n * ```\n * \n * @example handleVotePoll Function Signature\n * ```ts\n * handleVotePoll({\n *   // pollId: string,\n *   // optionIndex: number,\n *   // socket: Socket,\n *   // showAlert?: ShowAlert,\n *   // member: string,\n *   // roomName: string,\n *   // updateIsPollModalVisible: (visible: boolean) => void\n * }): void\n * ```\n * \n * @example handleEndPoll Function Signature\n * ```ts\n * handleEndPoll({\n *   // pollId: string,\n *   // socket: Socket,\n *   // showAlert?: ShowAlert,\n *   // roomName: string,\n *   // updateIsPollModalVisible: (visible: boolean) => void\n * }): void\n * ```\n */\nexport interface PollModalProps {\n  isPollModalVisible: boolean;\n  onClose: () => void;\n  position?: string;\n  backgroundColor?: string;\n  member: string;\n  islevel: string;\n  polls: Poll[];\n  poll: Poll | null;\n  socket: Socket;\n  roomName: string;\n  showAlert?: ShowAlert;\n  updateIsPollModalVisible: (isVisible: boolean) => void;\n  handleCreatePoll: typeof handleCreatePollUtil;\n  handleEndPoll: typeof handleEndPollUtil;\n  handleVotePoll: typeof handleVotePollUtil;\n  title?: VNodeChild;\n  overlayProps?: HTMLAttributes;\n  contentProps?: HTMLAttributes;\n  headerProps?: HTMLAttributes;\n  titleProps?: HTMLAttributes;\n  closeButtonProps?: ButtonHTMLAttributes;\n  closeIconComponent?: VNodeChild;\n  bodyProps?: HTMLAttributes;\n  sectionsWrapperProps?: HTMLAttributes;\n  previousPollsWrapperProps?: HTMLAttributes;\n  previousPollsHeaderProps?: HTMLAttributes;\n  createPollWrapperProps?: HTMLAttributes;\n  createPollFormProps?: FormHTMLAttributes;\n  activePollWrapperProps?: HTMLAttributes;\n  pollQuestionInputProps?: InputHTMLAttributes;\n  pollTypeSelectProps?: SelectHTMLAttributes;\n  pollOptionInputProps?: InputHTMLAttributes;\n  voteButtonProps?: ButtonHTMLAttributes;\n  endPollButtonProps?: ButtonHTMLAttributes;\n  submitPollButtonProps?: ButtonHTMLAttributes;\n  emptyPreviousPolls?: VNodeChild;\n  emptyActivePoll?: VNodeChild;\n  renderHeader?: (options: { defaultHeader: VNodeChild }) => VNodeChild;\n  renderPreviousPolls?: (options: {\n    defaultPreviousPolls: VNodeChild;\n    previousPolls: Poll[];\n  }) => VNodeChild;\n  renderCreatePoll?: (options: {\n    defaultCreatePoll: VNodeChild;\n    newPoll: NewPollFormState;\n    setNewPoll: (poll: NewPollFormState) => void;\n  }) => VNodeChild;\n  renderActivePoll?: (options: {\n    defaultActivePoll: VNodeChild;\n    activePoll: Poll | null;\n  }) => VNodeChild;\n  renderBody?: (options: { defaultBody: VNodeChild }) => VNodeChild;\n  renderContent?: (options: { defaultContent: VNodeChild }) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<PollModalProps>(), {\n  position: 'topRight',\n  backgroundColor: '#f5f5f5',\n  showAlert: undefined,\n  handleCreatePoll: () => handleCreatePollUtil,\n  handleEndPoll: () => handleEndPollUtil,\n  handleVotePoll: () => handleVotePollUtil,\n  title: 'Polls',\n  overlayProps: undefined,\n  contentProps: undefined,\n  headerProps: undefined,\n  titleProps: undefined,\n  closeButtonProps: undefined,\n  closeIconComponent: undefined,\n  bodyProps: undefined,\n  sectionsWrapperProps: undefined,\n  previousPollsWrapperProps: undefined,\n  previousPollsHeaderProps: undefined,\n  createPollWrapperProps: undefined,\n  createPollFormProps: undefined,\n  activePollWrapperProps: undefined,\n  pollQuestionInputProps: undefined,\n  pollTypeSelectProps: undefined,\n  pollOptionInputProps: undefined,\n  voteButtonProps: undefined,\n  endPollButtonProps: undefined,\n  submitPollButtonProps: undefined,\n  emptyPreviousPolls: 'No polls available',\n  emptyActivePoll: 'No active poll',\n  renderHeader: undefined,\n  renderPreviousPolls: undefined,\n  renderCreatePoll: undefined,\n  renderActivePoll: undefined,\n  renderBody: undefined,\n  renderContent: undefined,\n});\n\n// RenderVNode component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Function] as PropType<VNodeChild>,\n      required: true,\n    },\n  },\n  setup(props) {\n    return () => {\n      const node = props.node;\n      if (typeof node === 'function') {\n        return (node as () => VNodeChild)();\n      }\n      if (isVNode(node)) {\n        return node;\n      }\n      return node;\n    };\n  },\n});\n\n// State\nconst newPoll = ref<NewPollFormState>({\n  question: '',\n  type: '',\n  options: [],\n});\n\nconst activePoll = computed(() => props.poll ?? null);\n\nconst previousPolls = computed(() => {\n  return props.polls.filter((polled) => {\n    if (!props.poll) return true;\n    return props.poll.status !== 'active' || polled.id !== props.poll.id;\n  });\n});\n\n// Styles\nconst defaultOverlayWidth = typeof window !== 'undefined' ? Math.min(window.innerWidth * 0.7, 350) : 320;\n\nconst overlayStyle = computed<CSSProperties>(() => ({\n  position: 'fixed',\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  display: props.isPollModalVisible ? 'block' : 'none',\n  zIndex: 999,\n  ...(props.overlayProps?.style as CSSProperties ?? {}),\n}));\n\nconst contentStyle = computed<CSSProperties>(() => ({\n  position: 'fixed',\n  backgroundColor: props.backgroundColor,\n  borderRadius: '10px',\n  padding: '16px',\n  width: `${defaultOverlayWidth}px`,\n  maxWidth: `${defaultOverlayWidth}px`,\n  maxHeight: '75%',\n  overflow: 'hidden',\n  top: props.position.includes('top') ? '10px' : 'auto',\n  bottom: props.position.includes('bottom') ? '10px' : 'auto',\n  left: props.position.includes('Left') ? '10px' : 'auto',\n  right: props.position.includes('Right') ? '10px' : 'auto',\n  display: 'flex',\n  flexDirection: 'column',\n  gap: '12px',\n  boxShadow: '0 10px 30px rgba(0, 0, 0, 0.25)',\n  ...(props.contentProps?.style as CSSProperties ?? {}),\n}));\n\n// Helper functions\nconst calculatePercentage = (votes: number[], optionIndex: number) => {\n  const totalVotes = votes.reduce((a, b) => a + b, 0);\n  const voteCount = votes?.[optionIndex] ?? 0;\n  return totalVotes > 0 ? ((voteCount / totalVotes) * 100).toFixed(2) : '0';\n};\n\nconst handlePollTypeChange = (event: Event) => {\n  const target = event.target as HTMLSelectElement;\n  const type = target.value as NewPollFormState['type'];\n  let options: string[] = [];\n\n  switch (type) {\n    case 'trueFalse':\n      options = ['True', 'False'];\n      break;\n    case 'yesNo':\n      options = ['Yes', 'No'];\n      break;\n    case 'custom':\n      options = [];\n      break;\n    default:\n      options = [];\n      break;\n  }\n\n  newPoll.value = { ...newPoll.value, type, options };\n};\n\nconst handleCustomOptionChange = (index: number, value: string) => {\n  const newOptions = [...newPoll.value.options];\n  if (index < newOptions.length) {\n    newOptions[index] = value;\n  } else {\n    newOptions.push(value);\n  }\n  newPoll.value = { ...newPoll.value, options: newOptions };\n};\n\nconst handleCreatePollSubmit = (event: Event) => {\n  event.preventDefault();\n  props.handleCreatePoll({\n    poll: newPoll.value,\n    socket: props.socket,\n    roomName: props.roomName,\n    showAlert: props.showAlert,\n    updateIsPollModalVisible: props.updateIsPollModalVisible,\n  });\n};\n\nconst handleEndPollForPrevious = (pollId: string) => {\n  props.handleEndPoll({\n    pollId,\n    socket: props.socket,\n    showAlert: props.showAlert,\n    roomName: props.roomName,\n    updateIsPollModalVisible: props.updateIsPollModalVisible,\n  });\n};\n\nconst handleVotePollForCurrent = (optionIndex: number) => {\n  props.handleVotePoll({\n    pollId: props.poll!.id,\n    optionIndex,\n    socket: props.socket,\n    showAlert: props.showAlert,\n    member: props.member,\n    roomName: props.roomName,\n    updateIsPollModalVisible: props.updateIsPollModalVisible,\n  });\n};\n\nconst handleEndPollForCurrent = () => {\n  props.handleEndPoll({\n    pollId: props.poll!.id,\n    socket: props.socket,\n    showAlert: props.showAlert,\n    roomName: props.roomName,\n    updateIsPollModalVisible: props.updateIsPollModalVisible,\n  });\n};\n\n// Watchers\nconst renderPolls = () => {\n  let activePollCount = 0;\n\n  props.polls.forEach((polled) => {\n    if (polled.status === 'active' && props.poll && polled.id === props.poll.id) {\n      activePollCount++;\n    }\n  });\n\n  if (props.islevel == '2' && activePollCount === 0) {\n    if (props.poll && props.poll.status === 'active') {\n      handleEndPollForCurrent();\n    }\n  }\n};\n\nwatch(\n  () => [props.isPollModalVisible, props.polls, props.poll],\n  () => {\n    if (props.isPollModalVisible) {\n      renderPolls();\n    }\n  },\n  { immediate: true }\n);\n\n// Event handlers\nconst handleCloseClick = (event: Event) => {\n  const clickHandler = props.closeButtonProps?.onClick;\n  if (clickHandler) {\n    clickHandler(event as unknown as PointerEvent);\n  }\n  if (!(event as Event & { defaultPrevented?: boolean }).defaultPrevented) {\n    props.onClose();\n  }\n};\n\n// Build overlayNode\nconst overlayNode = computed(() => {\n  const { class: overlayClassName, ...restOverlayProps } = props.overlayProps ?? {};\n  const { class: contentClassName, ...restContentProps } = props.contentProps ?? {};\n  const { class: headerClassName, style: headerStyleOverrides, ...restHeaderProps } = props.headerProps ?? {};\n  const { class: titleClassName, style: titleStyleOverrides, ...restTitleProps } = props.titleProps ?? {};\n  const { class: closeButtonClassName, style: closeButtonStyleOverrides, onClick: _closeButtonOnClick, ...restCloseButtonProps } = props.closeButtonProps ?? {};\n  const { class: bodyClassName, style: bodyStyleOverrides, ...restBodyProps } = props.bodyProps ?? {};\n  const {\n    class: endPollButtonClassName,\n    style: endPollButtonStyleOverrides,\n    onClick: endPollButtonOnClick,\n    type: endPollButtonType,\n    ...restEndPollButtonProps\n  } = props.endPollButtonProps ?? {};\n\n  const headerStyle: CSSProperties = {\n    display: 'flex',\n    justifyContent: 'space-between',\n    alignItems: 'center',\n    gap: '12px',\n    ...(headerStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const titleStyle: CSSProperties = {\n    margin: 0,\n    fontSize: '1.25rem',\n    fontWeight: 700,\n    color: 'black',\n    ...(titleStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const closeButtonStyle: CSSProperties = {\n    background: 'none',\n    border: 'none',\n    padding: '4px',\n    cursor: 'pointer',\n    display: 'inline-flex',\n    alignItems: 'center',\n    justifyContent: 'center',\n    color: 'black',\n    ...(closeButtonStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const bodyStyle: CSSProperties = {\n    display: 'flex',\n    flexDirection: 'column',\n    gap: '16px',\n    flex: 1,\n    minHeight: 0,\n    overflow: 'hidden',\n    ...(bodyStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const endPollButtonStyle: CSSProperties = {\n    backgroundColor: '#d9534f',\n    color: 'white',\n    border: 'none',\n    borderRadius: '4px',\n    padding: '8px 12px',\n    cursor: 'pointer',\n    fontWeight: 600,\n    ...(endPollButtonStyleOverrides as CSSProperties ?? {}),\n  };\n\n  const createEndPollButton = (action: () => void) =>\n    h(\n      'button',\n      {\n        type: endPollButtonType ?? 'button',\n        class: joinClassNames('btn btn-danger btn-block', endPollButtonClassName as string | undefined),\n        style: endPollButtonStyle,\n        onClick: (event: Event) => {\n          if (endPollButtonOnClick) {\n            endPollButtonOnClick(event as unknown as PointerEvent);\n          }\n          if (!(event as Event & { defaultPrevented?: boolean }).defaultPrevented) {\n            action();\n          }\n        },\n        ...restEndPollButtonProps,\n      },\n      'End Poll'\n    );\n\n  const defaultCloseIcon = props.closeIconComponent ?? h(FontAwesomeIcon, { icon: faTimes, class: 'icon' });\n\n  const defaultHeader = h(\n    'div',\n    {\n      class: joinClassNames('modal-header', headerClassName as string | undefined),\n      style: headerStyle,\n      ...restHeaderProps,\n    },\n    [\n      h(\n        'h2',\n        {\n          class: joinClassNames('modal-title', titleClassName as string | undefined),\n          style: titleStyle,\n          ...restTitleProps,\n        },\n        [props.title]\n      ),\n      h(\n        'button',\n        {\n          type: 'button',\n          class: joinClassNames('btn-close-poll', closeButtonClassName as string | undefined),\n          style: closeButtonStyle,\n          onClick: handleCloseClick,\n          ...restCloseButtonProps,\n        },\n        [defaultCloseIcon]\n      ),\n    ]\n  );\n\n  const headerNode = props.renderHeader ? props.renderHeader({ defaultHeader }) : defaultHeader;\n\n  // Build sections\n  const { class: sectionsWrapperClassName, style: sectionsWrapperStyleOverrides, ...restSectionsWrapperProps } = props.sectionsWrapperProps ?? {};\n\n  const sectionsWrapperStyle: CSSProperties = {\n    display: 'flex',\n    flexDirection: 'column',\n    gap: '16px',\n    overflowY: 'auto',\n    ...(sectionsWrapperStyleOverrides as CSSProperties ?? {}),\n  };\n\n  // Previous Polls Section (only for host)\n  const previousPollsSection = props.islevel === '2' ? (() => {\n    const defaultPreviousPolls = h(\n      'div',\n      { style: { overflowY: 'auto', maxHeight: '20%' } },\n      [\n        h('h5', {}, 'Previous Polls'),\n        previousPolls.value.length === 0\n          ? h('div', {}, [props.emptyPreviousPolls, h('hr')])\n          : previousPolls.value.map((polled, index) =>\n              h('div', { key: index, class: 'poll' }, [\n                h('h6', {}, 'Question:'),\n                h('textarea', { class: 'form-control', rows: 3, disabled: true, value: polled.question }),\n                h('br'),\n                h('h6', {}, 'Options:'),\n                ...polled.options.map((option, i) =>\n                  h('div', { key: i }, `${option}: ${polled.votes[i]} votes (${calculatePercentage(polled.votes, i)}%)`)\n                ),\n                polled.status === 'active'\n                  ? createEndPollButton(() => handleEndPollForPrevious(polled.id))\n                  : null,\n              ])\n            ),\n      ]\n    );\n\n    return props.renderPreviousPolls\n      ? props.renderPreviousPolls({ defaultPreviousPolls, previousPolls: previousPolls.value })\n      : defaultPreviousPolls;\n  })() : null;\n\n  // Create Poll Section (only for host)\n  const createPollSection = props.islevel === '2' ? (() => {\n    const renderPollOptions = () => {\n      switch (newPoll.value.type) {\n        case 'trueFalse':\n        case 'yesNo':\n          return newPoll.value.options.map((option, index) =>\n            h('div', { key: index, class: 'form-check poll-choice-item' }, [\n              h('input', {\n                class: 'form-check-input poll-choice-input',\n                type: 'radio',\n                name: 'pollOption',\n                value: option.toLowerCase(),\n                id: `option${option}`,\n              }),\n              h('label', { class: 'form-check-label poll-choice-label', for: `option${option}` }, option),\n            ])\n          );\n        case 'custom': {\n          const existingOptions = newPoll.value.options.map((option, index) =>\n            h('div', { key: index, class: 'poll-custom-option' }, [\n              h('input', {\n                type: 'text',\n                class: 'form-control poll-custom-option__input',\n                placeholder: `Option ${index + 1}`,\n                maxlength: 50,\n                value: option || '',\n                onInput: (e: Event) => handleCustomOptionChange(index, (e.target as HTMLInputElement).value),\n              }),\n            ])\n          );\n\n          const emptyOptions = Array.from({ length: 5 - newPoll.value.options.length }, (_, index) =>\n            h('div', { key: newPoll.value.options.length + index, class: 'poll-custom-option' }, [\n              h('input', {\n                type: 'text',\n                class: 'form-control poll-custom-option__input',\n                placeholder: `Option ${newPoll.value.options.length + index + 1}`,\n                maxlength: 50,\n                value: '',\n                onInput: (e: Event) => {\n                  const value = (e.target as HTMLInputElement).value;\n                  if (value) {\n                    handleCustomOptionChange(newPoll.value.options.length + index, value);\n                  }\n                },\n              }),\n            ])\n          );\n\n          return [...existingOptions, ...emptyOptions];\n        }\n        default:\n          return null;\n      }\n    };\n\n    const defaultCreatePoll = h(\n      'div',\n      { style: { overflowY: 'auto', maxHeight: '20%' } },\n      [\n        h('h5', {}, 'Create a New Poll'),\n        h(\n          'form',\n          { onSubmit: handleCreatePollSubmit },\n          [\n            h('div', { class: 'form-group', style: { maxWidth: '80%', overflowX: 'auto' } }, [\n              h('label', { for: 'pollQuestion' }, 'Poll Question'),\n              h('textarea', {\n                id: 'pollQuestion',\n                class: 'form-control',\n                rows: 3,\n                maxlength: 300,\n                required: true,\n                value: newPoll.value.question,\n                onInput: (e: Event) => {\n                  newPoll.value = { ...newPoll.value, question: (e.target as HTMLTextAreaElement).value };\n                },\n              }),\n            ]),\n            h('div', { class: 'form-group', style: { maxWidth: '80%', overflowX: 'auto' } }, [\n              h('label', { for: 'pollType' }, 'Select Poll Answer Type'),\n              h(\n                'select',\n                {\n                  id: 'pollType',\n                  class: 'form-control',\n                  required: true,\n                  value: newPoll.value.type,\n                  onChange: handlePollTypeChange,\n                },\n                [\n                  h('option', { value: '' }, 'Choose...'),\n                  h('option', { value: 'trueFalse' }, 'True/False'),\n                  h('option', { value: 'yesNo' }, 'Yes/No'),\n                  h('option', { value: 'custom' }, 'Custom'),\n                ]\n              ),\n            ]),\n            h('div', { class: 'poll-custom-options' }, renderPollOptions() || []),\n            h(\n              'button',\n              {\n                type: 'submit',\n                style: {\n                  flex: 1,\n                  padding: '5px',\n                  borderRadius: '5px',\n                  justifyContent: 'center',\n                  alignItems: 'center',\n                  backgroundColor: 'black',\n                  color: 'white',\n                  border: 'none',\n                  cursor: 'pointer',\n                },\n              },\n              [h('span', { style: { color: 'white', fontSize: 'medium' } }, 'Create Poll')]\n            ),\n          ]\n        ),\n        h('hr'),\n      ]\n    );\n\n    return props.renderCreatePoll\n      ? props.renderCreatePoll({\n          defaultCreatePoll,\n          newPoll: newPoll.value,\n          setNewPoll: (poll: NewPollFormState) => {\n            newPoll.value = poll;\n          },\n        })\n      : defaultCreatePoll;\n  })() : null;\n\n  // Active Poll Section\n  const activePollSection = (() => {\n    const defaultActivePoll = h(\n      'div',\n      { style: { overflowY: 'auto', maxHeight: '20%' } },\n      [\n        h('h5', {}, 'Current Poll'),\n        activePoll.value && activePoll.value.status === 'active'\n          ? h('div', { style: { maxWidth: '80%', overflowX: 'auto' } }, [\n              h('h6', {}, 'Question:'),\n              h('textarea', { class: 'form-control', rows: 3, disabled: true, value: activePoll.value.question }),\n              h('br'),\n              h('h6', {}, 'Options:'),\n              ...activePoll.value.options.map((option, i) =>\n                h('div', { key: i, class: 'form-check' }, [\n                  h('input', {\n                    id: `pollOption${i}`,\n                    class: 'form-check-input poll-option',\n                    type: 'radio',\n                    name: 'pollOption',\n                    value: i,\n                    checked: activePoll.value!.voters && activePoll.value!.voters[props.member] === i,\n                    onChange: () => handleVotePollForCurrent(i),\n                  }),\n                  h('label', { class: 'form-check-label', for: `pollOption${i}` }, option),\n                ])\n              ),\n              activePoll.value.status === 'active' && props.islevel === '2'\n                ? createEndPollButton(handleEndPollForCurrent)\n                : null,\n            ])\n          : h('div', {}, [h('hr'), props.emptyActivePoll]),\n      ]\n    );\n\n    return props.renderActivePoll\n      ? props.renderActivePoll({ defaultActivePoll, activePoll: activePoll.value })\n      : defaultActivePoll;\n  })();\n\n  const sectionsContent = [\n    previousPollsSection,\n    previousPollsSection ? h('hr') : null,\n    createPollSection,\n    activePollSection,\n  ].filter(Boolean);\n\n  const defaultBody = h(\n    'div',\n    {\n      class: joinClassNames('modal-body', bodyClassName as string | undefined),\n      style: bodyStyle,\n      ...restBodyProps,\n    },\n    [\n      h(\n        'div',\n        {\n          class: joinClassNames('poll-modal-sections', sectionsWrapperClassName as string | undefined),\n          style: sectionsWrapperStyle,\n          ...restSectionsWrapperProps,\n        },\n        sectionsContent\n      ),\n    ]\n  );\n\n  const bodyNode = props.renderBody ? props.renderBody({ defaultBody }) : defaultBody;\n\n  const defaultContent = h(\n    'div',\n    {\n      class: joinClassNames('mediasfu-poll-modal__content', contentClassName as string | undefined),\n      style: contentStyle.value,\n      ...restContentProps,\n    },\n    [headerNode, h('hr', { style: { height: '1px', backgroundColor: 'black', marginTop: '5px', marginBottom: '5px' } }), bodyNode]\n  );\n\n  const contentNode = props.renderContent ? props.renderContent({ defaultContent }) : defaultContent;\n\n  return h(\n    'div',\n    {\n      class: joinClassNames('mediasfu-poll-modal', overlayClassName as string | undefined),\n      style: overlayStyle.value,\n      ...restOverlayProps,\n    },\n    [contentNode]\n  );\n});\n</script>\n\n<style scoped>\n.poll-custom-options {\n  display: flex;\n  flex-direction: column;\n  gap: 12px;\n  margin: 12px 0 16px;\n}\n\n.poll-custom-option {\n  background-color: rgba(255, 255, 255, 0.9);\n  border: 1px solid #d1d9e6;\n  border-radius: 8px;\n  padding: 8px 10px;\n  box-shadow: 0 1px 2px rgba(15, 23, 42, 0.06);\n}\n\n.poll-custom-option__input {\n  width: 100%;\n  border: none;\n  background: transparent;\n  font-size: 0.95rem;\n  color: #1f2937;\n  padding: 0;\n}\n\n.poll-custom-option__input:focus {\n  outline: none;\n  box-shadow: none;\n}\n\n.poll-custom-option__input::placeholder {\n  color: #94a3b8;\n}\n\n.poll-choice-item {\n  display: flex;\n  align-items: center;\n  gap: 10px;\n  padding: 8px 10px;\n  border-radius: 8px;\n  background-color: rgba(255, 255, 255, 0.75);\n  border: 1px solid transparent;\n  transition: border-color 0.2s ease, background-color 0.2s ease;\n  margin-bottom: 6px;\n}\n\n.poll-choice-item:last-of-type {\n  margin-bottom: 0;\n}\n\n.poll-choice-item:hover {\n  border-color: #4c6ef5;\n  background-color: rgba(76, 110, 245, 0.08);\n}\n\n.poll-choice-input {\n  width: 18px;\n  height: 18px;\n}\n\n.poll-choice-label {\n  font-weight: 500;\n  color: #1f2937;\n}\n</style>\n","<!--\n/**\n * @fileoverview BackgroundModal - Virtual background selection and configuration modal\n * @component BackgroundModal\n * @module components/backgroundComponents/BackgroundModal\n * \n * @description\n * A sophisticated modal for selecting and applying virtual backgrounds to video streams.\n * Uses MediaPipe Selfie Segmentation for real-time person segmentation and background\n * replacement. Supports default backgrounds, custom image uploads, and \"no background\" mode.\n * Provides real-time preview and apply/save workflow.\n * \n * Key Features:\n * - MediaPipe-powered person segmentation\n * - Default background image gallery (6 presets)\n * - Custom image upload support\n * - Real-time video preview with applied background\n * - \"No background\" option (removes segmentation)\n * - Resolution-aware image loading (thumbnail/small/large/full)\n * - Two-step workflow: Preview → Apply → Save\n * - Background state persistence\n * - Loading indicators during processing\n * - Canvas-based rendering pipeline\n * - MediaStream API integration\n * \n * Workflow:\n * 1. User selects background (default or custom upload)\n * 2. Click \"Preview Background\" to see effect\n * 3. Click \"Apply Background\" to apply to video stream\n * 4. Click \"Save Background\" to persist settings\n * 5. Background is applied to outgoing video stream\n * \n * Technical Details:\n * - Uses SelfieSegmentation from @mediapipe/selfie_segmentation\n * - Creates virtual MediaStream with segmented video + background\n * - Replaces original video track with processed track\n * - Canvas-based compositing (person mask + background image)\n * - Frame-by-frame processing in requestAnimationFrame loop\n * - Resolution-adaptive (thumbnail preview, full quality for HD)\n * \n * @example Basic Usage\n * // <BackgroundModal\n *   // :isVisible=\"isBackgroundModalVisible\"\n *   // :onClose=\"() => updateIsBackgroundModalVisible(false)\"\n *   // :parameters=\"allParameters\"\n * // />\n * \n * @example Custom Positioning and Styling\n * // <BackgroundModal\n *   // :isVisible=\"showBackgroundSettings\"\n *   // :onClose=\"closeBackgroundModal\"\n *   // :parameters=\"backgroundParameters\"\n *   // position=\"topRight\"\n *   // backgroundColor=\"#2c3e50\"\n *   // title=\"Choose Your Background\"\n * // />\n * \n * @example With Custom Button Labels\n * // <BackgroundModal\n *   // :isVisible=\"backgroundModalOpen\"\n *   // :onClose=\"closeModal\"\n *   // :parameters=\"parameters\"\n *   // applyButtonLabel=\"Test Background\"\n *   // applyButtonAppliedLabel=\"Use This Background\"\n *   // saveButtonLabel=\"Confirm & Save\"\n * // />\n * \n * @example Custom Render Functions\n * // <script setup>\n * const renderCustomHeader = ({ defaultHeader, onClose }) => {\n *   // return h('div', { style: { background: 'linear-gradient(90deg, #667eea 0%, #764ba2 100%)' } }, [\n *     h('h3', { style: { color: 'white', padding: '15px' } }, 'Virtual Backgrounds'),\n *     h('button', { onClick: onClose, style: { color: 'white' } }, 'Close')\n *   ]);\n * };\n * \n * const renderCustomButtons = ({ defaultButtons, applyButtonRef, saveButtonRef }) => {\n *   // return h('div', { style: { display: 'flex', gap: '10px', justifyContent: 'center' } }, [\n *     h('button', {\n *       ref: applyButtonRef,\n *       class: 'btn btn-primary',\n *       style: { minWidth: '150px' }\n *     }, 'Preview'),\n *     h('button', {\n *       ref: saveButtonRef,\n *       class: 'btn btn-success d-none',\n *       style: { minWidth: '150px' }\n *     }, 'Confirm')\n *   ]);\n * };\n * </script>\n * \n * // <template>\n *   <BackgroundModal\n *     :isVisible=\"modalVisible\"\n *     :onClose=\"closeModal\"\n *     :parameters=\"params\"\n *     :renderHeader=\"renderCustomHeader\"\n *     :renderButtons=\"renderCustomButtons\"\n *   />\n * </template>\n * \n * @example Programmatic Background Control\n * // <script setup>\n * const backgroundSettings = reactive({\n *   // selectedImage: '',\n *   // customImage: '',\n *   // keepBackground: false,\n *   // appliedBackground: false\n * });\n * \n * const openBackgroundModal = () => {\n *   // updateIsBackgroundModalVisible(true);\n * };\n * \n * const closeBackgroundModal = () => {\n *   // updateIsBackgroundModalVisible(false);\n *   // if (backgroundSettings.appliedBackground) {\n *     console.log('Background applied:', backgroundSettings.selectedImage);\n *   }\n * };\n * \n * // Auto-apply background on room join\n * onMounted(() => {\n *   // if (backgroundSettings.selectedImage) {\n *     backgroundSettings.autoClickBackground = true;\n *   }\n * });\n * </script>\n * \n * // <template>\n *   <div>\n *     <button @click=\"openBackgroundModal\">Change Background</button>\n *     <BackgroundModal\n *       :isVisible=\"isBackgroundModalVisible\"\n *       :onClose=\"closeBackgroundModal\"\n *       :parameters=\"backgroundParameters\"\n *     />\n *   </div>\n * </template>\n * \n * @see {@link BackgroundModalParameters} for parameter configuration\n * @see {@link https://google.github.io/mediapipe/solutions/selfie_segmentation.html} for MediaPipe Selfie Segmentation\n * @see {@link SelfieSegmentation} for segmentation API\n */\n-->\n<script setup lang=\"ts\">\nimport { computed, defineComponent, defineOptions, h, isVNode, nextTick, onMounted, ref, shallowRef, toRaw, watch } from 'vue'\nimport type { CSSProperties, PropType, VNodeChild } from 'vue'\nimport { faTimes } from '@fortawesome/free-solid-svg-icons'\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome'\nimport { SelfieSegmentation } from '@mediapipe/selfie_segmentation'\nimport type { BackgroundModalProps } from '../../types/background'\n\ninterface SegmentationResults {\n  segmentationMask: HTMLCanvasElement | HTMLVideoElement | HTMLImageElement | ImageBitmap\n  image: HTMLCanvasElement | HTMLVideoElement | HTMLImageElement | ImageBitmap\n}\n\nconst props = withDefaults(defineProps<BackgroundModalProps>(), {\n  position: 'topLeft',\n  backgroundColor: '#f5f5f5',\n  title: 'Background Settings',\n  overlayProps: undefined,\n  contentProps: undefined,\n  headerProps: undefined,\n  titleProps: undefined,\n  closeButtonProps: undefined,\n  closeIconComponent: undefined,\n  headerDividerProps: undefined,\n  bodyProps: undefined,\n  defaultImagesContainerProps: undefined,\n  uploadWrapperProps: undefined,\n  uploadLabelProps: undefined,\n  uploadLabel: 'Upload Custom Image',\n  uploadInputProps: undefined,\n  mainCanvasProps: undefined,\n  backgroundCanvasProps: undefined,\n  captureVideoProps: undefined,\n  previewVideoProps: undefined,\n  loadingOverlayProps: undefined,\n  loadingSpinner: undefined,\n  buttonsWrapperProps: undefined,\n  applyButtonProps: undefined,\n  saveButtonProps: undefined,\n  applyButtonLabel: 'Preview Background',\n  applyButtonAppliedLabel: 'Apply Background',\n  saveButtonLabel: 'Save Background',\n  renderHeader: undefined,\n  renderButtons: undefined,\n  renderBody: undefined,\n  renderContent: undefined,\n})\n\ndefineOptions({\n  components: { FontAwesomeIcon },\n})\n\nconst customImage = ref(props.parameters.customImage ?? '')\nconst selectedImage = ref(props.parameters.selectedImage ?? '')\nconst segmentVideo = ref<MediaStream | null>(props.parameters.segmentVideo ?? null)\nconst selfieSegmentation = shallowRef<SelfieSegmentation | null>(props.parameters.selfieSegmentation ?? null)\nconst pauseSegmentation = ref(props.parameters.pauseSegmentation ?? false)\nconst processedStream = ref<MediaStream | null>(props.parameters.processedStream ?? null)\nconst keepBackground = ref(props.parameters.keepBackground ?? false)\nconst backgroundHasChanged = ref(props.parameters.backgroundHasChanged ?? false)\nconst virtualStream = ref<MediaStream | null>(props.parameters.virtualStream ?? null)\nconst prevKeepBackground = ref(props.parameters.prevKeepBackground ?? false)\nconst appliedBackground = ref(props.parameters.appliedBackground ?? false)\nconst autoClickBackground = ref(props.parameters.autoClickBackground ?? false)\n\nwatch(\n  () => props.parameters.customImage,\n  (value) => {\n    customImage.value = value ?? ''\n  }\n)\n\nwatch(\n  () => props.parameters.selectedImage,\n  (value) => {\n    selectedImage.value = value ?? ''\n  }\n)\n\nwatch(\n  () => props.parameters.segmentVideo,\n  (value) => {\n    segmentVideo.value = value ?? null\n  }\n)\n\nwatch(\n  () => props.parameters.selfieSegmentation,\n  (value) => {\n    selfieSegmentation.value = value ? toRaw(value) : null\n  }\n)\n\nwatch(\n  () => props.parameters.pauseSegmentation,\n  (value) => {\n    pauseSegmentation.value = value ?? false\n  }\n)\n\nwatch(\n  () => props.parameters.processedStream,\n  (value) => {\n    processedStream.value = value ?? null\n  }\n)\n\nwatch(\n  () => props.parameters.keepBackground,\n  (value) => {\n    keepBackground.value = value ?? false\n  }\n)\n\nwatch(\n  () => props.parameters.backgroundHasChanged,\n  (value) => {\n    backgroundHasChanged.value = value ?? false\n  }\n)\n\nwatch(\n  () => props.parameters.virtualStream,\n  (value) => {\n    virtualStream.value = value ?? null\n  }\n)\n\nwatch(\n  () => props.parameters.prevKeepBackground,\n  (value) => {\n    prevKeepBackground.value = value ?? false\n  }\n)\n\nwatch(\n  () => props.parameters.appliedBackground,\n  (value) => {\n    appliedBackground.value = value ?? false\n  }\n)\n\nwatch(\n  () => props.parameters.autoClickBackground,\n  (value) => {\n    autoClickBackground.value = value ?? false\n  }\n)\n\nconst defaultImagesContainerRef = ref<HTMLDivElement | null>(null)\nconst uploadImageInputRef = ref<HTMLInputElement | null>(null)\nconst backgroundCanvasRef = ref<HTMLCanvasElement | null>(null)\nconst videoPreviewRef = ref<HTMLVideoElement | null>(null)\nconst captureVideoRef = ref<HTMLVideoElement | null>(null)\nconst loadingOverlayRef = ref<HTMLDivElement | null>(null)\nconst applyBackgroundButtonRef = ref<HTMLButtonElement | null>(null)\nconst saveBackgroundButtonRef = ref<HTMLButtonElement | null>(null)\nconst mainCanvasRef = ref<HTMLCanvasElement | null>(null)\n\nconst clonedStream = ref<MediaStream | null>(null)\nconst clonedTrack = ref<MediaStreamTrack | null>(null)\n\nconst showLoading = () => {\n  loadingOverlayRef.value?.classList.remove('d-none')\n}\n\nconst hideLoading = () => {\n  loadingOverlayRef.value?.classList.add('d-none')\n}\n\nconst clearCanvas = () => {\n  const ctx = backgroundCanvasRef.value?.getContext('2d')\n  if (!ctx || !backgroundCanvasRef.value) return\n\n  ctx.clearRect(0, 0, backgroundCanvasRef.value.width, backgroundCanvasRef.value.height)\n  ctx.font = '30px Arial'\n  ctx.fillStyle = '#000'\n  ctx.textAlign = 'center'\n  ctx.textBaseline = 'middle'\n  ctx.fillText(\n    'No Background',\n    backgroundCanvasRef.value.width / 2,\n    backgroundCanvasRef.value.height / 2\n  )\n\n  saveBackgroundButtonRef.value?.classList.add('d-none')\n  if (saveBackgroundButtonRef.value) {\n    saveBackgroundButtonRef.value.disabled = true\n  }\n  applyBackgroundButtonRef.value?.classList.remove('d-none')\n  if (applyBackgroundButtonRef.value) {\n    applyBackgroundButtonRef.value.disabled = false\n    if (\n      processedStream.value &&\n      prevKeepBackground.value === keepBackground.value &&\n      keepBackground.value &&\n      appliedBackground.value\n    ) {\n      applyBackgroundButtonRef.value.innerText = 'Apply Background'\n    } else {\n      applyBackgroundButtonRef.value.innerText = 'Preview Background'\n    }\n  }\n}\n\nconst renderDefaultImages = () => {\n  const defaultImages = ['wall', 'wall2', 'shelf', 'clock', 'desert', 'flower']\n  const container = defaultImagesContainerRef.value\n  if (!container) return\n\n  container.innerHTML = ''\n\n  defaultImages.forEach((baseName) => {\n    const thumb = `https://mediasfu.com/images/backgrounds/${baseName}_thumbnail.jpg`\n    const small = `https://mediasfu.com/images/backgrounds/${baseName}_small.jpg`\n    const large = `https://mediasfu.com/images/backgrounds/${baseName}_large.jpg`\n    const full = `https://mediasfu.com/images/backgrounds/${baseName}.jpg`\n    const img = document.createElement('img')\n    img.src = thumb\n    img.classList.add('img-thumbnail', 'm-1')\n    img.style.width = '80px'\n    img.style.cursor = 'pointer'\n    img.addEventListener('click', async () => {\n      if (props.parameters.targetResolution === 'fhd' || props.parameters.targetResolution === 'qhd') {\n        await loadImageToCanvas(small, large)\n      } else {\n        await loadImageToCanvas(small, full)\n      }\n    })\n    container.appendChild(img)\n  })\n\n  const noBackground = document.createElement('div')\n  noBackground.classList.add('img-thumbnail', 'm-1', 'd-flex', 'align-items-center', 'justify-content-center')\n  noBackground.style.width = '76px'\n  noBackground.style.minHeight = '60px'\n  noBackground.style.cursor = 'pointer'\n  noBackground.style.backgroundColor = '#f8f9fa'\n  noBackground.style.border = '1px solid #dee2e6'\n  noBackground.style.position = 'relative'\n  noBackground.innerHTML = '<span style=\"position:absolute; top:50%; left:50%; transform:translate(-50%, -50%); color:#000;\">None</span>'\n  noBackground.addEventListener('click', () => {\n    selectedImage.value = ''\n    props.parameters.updateSelectedImage?.('')\n    customImage.value = ''\n    props.parameters.updateCustomImage?.('')\n    showLoading()\n    videoPreviewRef.value?.classList.add('d-none')\n    backgroundCanvasRef.value?.classList.remove('d-none')\n    clearCanvas()\n    hideLoading()\n  })\n  container.appendChild(noBackground)\n\n  if (customImage.value) {\n    const customImg = document.createElement('img')\n    customImg.src = customImage.value\n    customImg.classList.add('img-thumbnail', 'm-1')\n    customImg.style.width = '80px'\n    customImg.style.cursor = 'pointer'\n    customImg.addEventListener('click', () => {\n      if (customImage.value) {\n        void loadImageToCanvas(customImage.value, customImage.value)\n      }\n    })\n    container.appendChild(customImg)\n  }\n}\n\nconst handleImageUpload = (event: Event) => {\n  try {\n    const input = event.target as HTMLInputElement | null\n    const file = input?.files?.[0]\n    if (!file) return\n\n    if (file.size > 2048 * 2048) {\n      props.parameters.showAlert?.({\n        message: 'File size must be less than 2MB.',\n        type: 'danger',\n      })\n      return\n    }\n\n    let minWidth = 1280\n    let minHeight = 1280\n    const maxWidth = 2560\n    const maxHeight = 2560\n\n    if (props.parameters.targetResolution === 'fhd') {\n      minWidth = 1920\n      minHeight = 1920\n    } else if (props.parameters.targetResolution === 'qhd') {\n      minWidth = 2560\n      minHeight = 2560\n    }\n\n    const img = new Image()\n    img.crossOrigin = 'anonymous'\n    img.onload = () => {\n      if (\n        img.width < minWidth ||\n        img.height < minHeight ||\n        img.width > maxWidth ||\n        img.height > maxHeight\n      ) {\n        props.parameters.showAlert?.({\n          message: `Image dimensions must be at least ${minWidth}x${minHeight}.`,\n          type: 'danger',\n        })\n        return\n      }\n\n      customImage.value = img.src\n      props.parameters.updateCustomImage?.(customImage.value)\n      void loadImageToCanvas(img.src, img.src)\n    }\n\n    const reader = new FileReader()\n    reader.onload = (e) => {\n      if (e.target && typeof e.target.result === 'string') {\n        img.src = e.target.result\n      }\n    }\n    reader.readAsDataURL(file)\n  } catch {\n    // Handle error silently\n  }\n}\n\nconst loadImageToCanvas = async (src: string, fullSrc: string) => {\n  showLoading()\n  backgroundCanvasRef.value?.classList.remove('d-none')\n  videoPreviewRef.value?.classList.add('d-none')\n\n  const img = new Image()\n  img.crossOrigin = 'anonymous'\n  img.onload = async () => {\n    const ctx = backgroundCanvasRef.value?.getContext('2d')\n    if (!ctx || !backgroundCanvasRef.value) return\n    backgroundCanvasRef.value.width = img.width\n    backgroundCanvasRef.value.height = img.height\n    ctx.drawImage(img, 0, 0)\n    removeBackground(img)\n    hideLoading()\n  }\n  img.src = src\n  selectedImage.value = fullSrc\n  props.parameters.updateSelectedImage?.(selectedImage.value)\n\n  saveBackgroundButtonRef.value?.classList.add('d-none')\n  if (saveBackgroundButtonRef.value) {\n    saveBackgroundButtonRef.value.disabled = true\n  }\n  applyBackgroundButtonRef.value?.classList.remove('d-none')\n  if (applyBackgroundButtonRef.value) {\n    applyBackgroundButtonRef.value.disabled = false\n    if (\n      processedStream.value &&\n      prevKeepBackground.value === keepBackground.value &&\n      keepBackground.value &&\n      appliedBackground.value\n    ) {\n      applyBackgroundButtonRef.value.innerText = 'Apply Background'\n    } else {\n      applyBackgroundButtonRef.value.innerText = 'Preview Background'\n    }\n  }\n}\n\nconst removeBackground = (img: HTMLImageElement) => {\n  const ctx = backgroundCanvasRef.value?.getContext('2d')\n  if (!ctx || !backgroundCanvasRef.value) return\n  ctx.clearRect(0, 0, backgroundCanvasRef.value.width, backgroundCanvasRef.value.height)\n  ctx.drawImage(img, 0, 0)\n}\n\nconst preloadModel = async () => {\n  const segmentation = new SelfieSegmentation({\n    locateFile: (file: string) => `https://cdn.jsdelivr.net/npm/@mediapipe/selfie_segmentation/${file}`,\n  })\n\n  segmentation.setOptions({\n    modelSelection: 1,\n    selfieMode: false,\n  })\n\n  await segmentation.initialize()\n  selfieSegmentation.value = segmentation\n  props.parameters.updateSelfieSegmentation?.(segmentation)\n}\n\nconst selfieSegmentationPreview = async (doSegmentation: boolean) => {\n  const refVideo = captureVideoRef.value\n  const previewVideo = videoPreviewRef.value\n  const virtualImage = new Image()\n  virtualImage.crossOrigin = 'anonymous'\n  virtualImage.src = selectedImage.value || ''\n\n  const mainCanvasFromProps = props.parameters.mainCanvas ?? null\n  let mainCanvas: HTMLCanvasElement | null = mainCanvasFromProps\n  if (!mainCanvas) {\n    mainCanvas = mainCanvasRef.value\n  }\n\n  if (!mainCanvas || !refVideo || !previewVideo) return\n\n  const mediaCanvas = mainCanvas\n  mediaCanvas.width = refVideo.videoWidth\n  mediaCanvas.height = refVideo.videoHeight\n  let ctx = mediaCanvas.getContext('2d')\n\n  backgroundHasChanged.value = true\n  props.parameters.updateBackgroundHasChanged?.(true)\n  prevKeepBackground.value = keepBackground.value\n  props.parameters.updatePrevKeepBackground?.(keepBackground.value)\n\n  if (!doSegmentation) {\n    processedStream.value?.getVideoTracks().forEach((track: MediaStreamTrack) => track.stop())\n    processedStream.value = null\n    props.parameters.updateProcessedStream?.(null)\n    keepBackground.value = false\n    props.parameters.updateKeepBackground?.(false)\n    previewVideo.classList.remove('d-none')\n  }\n\n  const segmentImage = async (videoElement: HTMLVideoElement) => {\n    try {\n      const processFrame = () => {\n        if (\n          !selfieSegmentation.value ||\n          pauseSegmentation.value ||\n          !videoElement ||\n          videoElement.videoWidth === 0 ||\n          videoElement.videoHeight === 0\n        ) {\n          return\n        }\n\n        selfieSegmentation.value.send({ image: videoElement })\n        requestAnimationFrame(processFrame)\n      }\n\n      videoElement.onloadeddata = () => {\n        processFrame()\n      }\n\n      setTimeout(async () => {\n        processedStream.value = mediaCanvas.captureStream(props.parameters.frameRate || 5)\n        previewVideo.srcObject = processedStream.value\n        props.parameters.updateProcessedStream?.(processedStream.value)\n        previewVideo.classList.remove('d-none')\n        keepBackground.value = true\n        props.parameters.updateKeepBackground?.(keepBackground.value)\n\n        if (previewVideo.paused) {\n          try {\n            await previewVideo.play()\n          } catch {\n            // Handle play error silently\n          }\n        }\n      }, 100)\n    } catch {\n      // Handle segmentation error silently\n    }\n  }\n\n  if (props.parameters.videoAlreadyOn) {\n    const localStreamVideo = props.parameters.localStreamVideo\n    if (\n      clonedTrack.value &&\n      clonedTrack.value.readyState === 'live' &&\n      localStreamVideo?.getVideoTracks()[0]?.label === clonedTrack.value.label\n    ) {\n      // Reuse cloned track\n    } else {\n      const localTrack = localStreamVideo?.getVideoTracks()[0]\n      if (localTrack) {\n        clonedTrack.value = localTrack.clone()\n        if (clonedTrack.value) {\n          clonedStream.value = new MediaStream([clonedTrack.value])\n        }\n        segmentVideo.value = clonedStream.value\n        props.parameters.updateSegmentVideo?.(segmentVideo.value)\n      }\n    }\n\n    refVideo.srcObject = segmentVideo.value ?? null\n    if (refVideo.paused) {\n      refVideo.play().catch(() => {})\n    }\n\n    const currentSegmentVideo = segmentVideo.value\n    refVideo.width = currentSegmentVideo?.getVideoTracks()[0]?.getSettings().width || 0\n    refVideo.height = currentSegmentVideo?.getVideoTracks()[0]?.getSettings().height || 0\n    mediaCanvas.width = refVideo.width\n    mediaCanvas.height = refVideo.height\n    ctx = mediaCanvas.getContext('2d')\n\n    try {\n      if (doSegmentation) {\n        await segmentImage(refVideo)\n      } else {\n        previewVideo.srcObject = clonedStream.value || localStreamVideo || null\n      }\n    } catch (error) {\n      console.log('Error segmenting image:', error)\n    }\n  } else {\n    if (\n      segmentVideo.value &&\n      segmentVideo.value.getVideoTracks()[0]?.readyState === 'live'\n    ) {\n      // Reuse existing segment stream\n    } else {\n      const mediaDevices = props.parameters.mediaDevices ?? navigator.mediaDevices\n      if (!mediaDevices) {\n        console.log('MediaDevices API not available')\n        return\n      }\n\n      try {\n        const stream = await mediaDevices.getUserMedia({\n          video: { ...props.parameters.vidCons, frameRate: { ideal: props.parameters.frameRate } },\n          audio: false,\n        })\n        segmentVideo.value = stream\n        props.parameters.updateSegmentVideo?.(segmentVideo.value)\n        refVideo.srcObject = segmentVideo.value\n        if (refVideo.paused) {\n          refVideo.play().catch(() => {})\n        }\n      } catch {\n        try {\n          const stream = await mediaDevices.getUserMedia({\n            video: { ...props.parameters.vidCons },\n            audio: false,\n          })\n          segmentVideo.value = stream\n          props.parameters.updateSegmentVideo?.(segmentVideo.value)\n          refVideo.srcObject = segmentVideo.value\n          if (refVideo.paused) {\n            refVideo.play().catch(() => {})\n          }\n        } catch (error) {\n          console.log('Error getting user media:', error)\n        }\n      }\n    }\n\n    const currentSegmentVideo = segmentVideo.value\n    refVideo.width = currentSegmentVideo?.getVideoTracks()[0]?.getSettings().width || 0\n    refVideo.height = currentSegmentVideo?.getVideoTracks()[0]?.getSettings().height || 0\n    mediaCanvas.width = refVideo.width\n    mediaCanvas.height = refVideo.height\n    ctx = mediaCanvas.getContext('2d')\n\n    try {\n      if (doSegmentation) {\n        await segmentImage(refVideo)\n      } else {\n        previewVideo.srcObject = refVideo.srcObject\n      }\n    } catch {\n      // Handle error silently\n    }\n  }\n\n  let repeatMode: 'repeat' | 'repeat-x' | 'repeat-y' | 'no-repeat' = 'no-repeat'\n  try {\n    if (virtualImage.width < mediaCanvas.width || virtualImage.height < mediaCanvas.height) {\n      repeatMode = 'repeat'\n    }\n  } catch {\n    // Handle error silently\n  }\n\n  const onResults = (results: SegmentationResults) => {\n    try {\n      if (\n        !pauseSegmentation.value &&\n        mediaCanvas &&\n        mediaCanvas.width > 0 &&\n        mediaCanvas.height > 0 &&\n        virtualImage &&\n        virtualImage.width > 0 &&\n        virtualImage.height > 0\n      ) {\n        ctx?.save()\n        ctx?.clearRect(0, 0, mediaCanvas.width, mediaCanvas.height)\n        ctx?.drawImage(results.segmentationMask, 0, 0, mediaCanvas.width, mediaCanvas.height)\n\n        if (ctx) {\n          ctx.globalCompositeOperation = 'source-out'\n          const pattern = ctx.createPattern(virtualImage, repeatMode)\n          if (pattern) {\n            ctx.fillStyle = pattern\n          } else {\n            ctx.fillStyle = ''\n          }\n          ctx.fillRect(0, 0, mediaCanvas.width, mediaCanvas.height)\n\n          ctx.globalCompositeOperation = 'destination-atop'\n          ctx.drawImage(results.image, 0, 0, mediaCanvas.width, mediaCanvas.height)\n\n          ctx.restore()\n        }\n      }\n    } catch (error) {\n      console.log('Error applying background:', error)\n    }\n  }\n\n  if (!selfieSegmentation.value) {\n    try {\n      await preloadModel()\n    } catch {\n      console.log('Error preloading model:')\n    }\n  }\n\n  try {\n    selfieSegmentation.value?.onResults(onResults)\n  } catch {\n    // Handle error silently\n  }\n}\n\nconst applyBackground = async () => {\n  if (props.parameters.audioOnlyRoom) {\n    props.parameters.showAlert?.({\n      message: 'You cannot use a background in an audio only event.',\n      type: 'danger',\n    })\n    return\n  }\n\n  showLoading()\n\n  videoPreviewRef.value?.classList.remove('d-none')\n  backgroundCanvasRef.value?.classList.add('d-none')\n\n  const doSegmentation = !!selectedImage.value\n  pauseSegmentation.value = false\n  props.parameters.updatePauseSegmentation?.(false)\n  await selfieSegmentationPreview(doSegmentation)\n  hideLoading()\n\n  applyBackgroundButtonRef.value?.classList.add('d-none')\n  if (applyBackgroundButtonRef.value) {\n    applyBackgroundButtonRef.value.disabled = true\n  }\n\n  if (\n    processedStream.value &&\n    prevKeepBackground.value === keepBackground.value &&\n    keepBackground.value &&\n    appliedBackground.value\n  ) {\n    saveBackgroundButtonRef.value?.classList.add('d-none')\n    if (saveBackgroundButtonRef.value) {\n      saveBackgroundButtonRef.value.disabled = true\n    }\n  } else {\n    saveBackgroundButtonRef.value?.classList.remove('d-none')\n    if (saveBackgroundButtonRef.value) {\n      saveBackgroundButtonRef.value.disabled = false\n    }\n  }\n}\n\nconst saveBackground = async () => {\n  if (props.parameters.audioOnlyRoom) {\n    props.parameters.showAlert?.({\n      message: 'You cannot use a background in an audio only event.',\n      type: 'danger',\n    })\n    return\n  }\n\n  if (backgroundHasChanged.value) {\n    if (props.parameters.videoAlreadyOn) {\n      if (\n        props.parameters.islevel === '2' &&\n        (props.parameters.recordStarted || props.parameters.recordResumed)\n      ) {\n        if (!(props.parameters.recordPaused || props.parameters.recordStopped)) {\n          if (props.parameters.recordingMediaOptions === 'video') {\n            props.parameters.showAlert?.({\n              message: 'Please pause the recording before changing the background.',\n              type: 'danger',\n            })\n            return\n          }\n        }\n      }\n\n      let videoParams = props.parameters.videoParams\n\n      if (keepBackground.value && selectedImage.value && processedStream.value) {\n        virtualStream.value = processedStream.value\n        props.parameters.updateVirtualStream?.(virtualStream.value)\n        videoParams = { track: virtualStream.value.getVideoTracks()[0] }\n        props.parameters.updateVideoParams?.(videoParams)\n      } else {\n        if (\n          props.parameters.localStreamVideo &&\n          props.parameters.localStreamVideo.getVideoTracks()[0]?.readyState === 'live'\n        ) {\n          videoParams = { track: props.parameters.localStreamVideo.getVideoTracks()[0] }\n          props.parameters.updateVideoParams?.(videoParams)\n        } else {\n          try {\n            if (\n              props.parameters.localStreamVideo &&\n              props.parameters.localStreamVideo.getVideoTracks()[0]?.readyState !== 'live'\n            ) {\n              const localStreamVideo = props.parameters.localStreamVideo\n              const originalTrack = localStreamVideo?.getVideoTracks()[0]\n              if (localStreamVideo && originalTrack) {\n                localStreamVideo.removeTrack(originalTrack)\n              }\n              const clonedTrackVal = segmentVideo.value?.getVideoTracks()[0]?.clone()\n              if (localStreamVideo && clonedTrackVal) {\n                localStreamVideo.addTrack(clonedTrackVal)\n              }\n            }\n          } catch (error) {\n            console.log('Error handling local stream video:', error)\n          }\n\n          videoParams = {\n            track: clonedStream.value?.getVideoTracks()[0] || undefined,\n          }\n          props.parameters.updateVideoParams?.(videoParams)\n        }\n      }\n\n      if (keepBackground.value) {\n        appliedBackground.value = true\n        props.parameters.updateAppliedBackground?.(true)\n      } else {\n        appliedBackground.value = false\n        props.parameters.updateAppliedBackground?.(false)\n      }\n\n      if (!props.parameters.transportCreated) {\n        await props.parameters.createSendTransport?.({\n          option: 'video',\n          parameters: { ...props.parameters, videoParams },\n        })\n      } else {\n        try {\n          if (props.parameters.videoProducer?.id) {\n            const videoParamsTrackId = (videoParams as { track?: { id?: string } }).track?.id;\n            if (props.parameters.videoProducer.track?.id !== videoParamsTrackId) {\n              await props.parameters.disconnectSendTransportVideo?.({ parameters: props.parameters })\n              await props.parameters.sleep?.({ ms: 500 })\n            }\n          }\n          await props.parameters.connectSendTransportVideo?.({ videoParams, parameters: props.parameters })\n        } catch {\n          // Handle error silently\n        }\n      }\n      await props.parameters.onScreenChanges?.({ changed: true, parameters: props.parameters })\n    }\n  }\n\n  if (keepBackground.value) {\n    appliedBackground.value = true\n    props.parameters.updateAppliedBackground?.(true)\n  } else {\n    appliedBackground.value = false\n    props.parameters.updateAppliedBackground?.(false)\n  }\n\n  saveBackgroundButtonRef.value?.classList.add('d-none')\n  if (saveBackgroundButtonRef.value) {\n    saveBackgroundButtonRef.value.disabled = true\n  }\n}\n\nconst handleAutoClickBackground = async () => {\n  if (!autoClickBackground.value || !props.isVisible) return\n  try {\n    await applyBackground()\n    await saveBackground()\n  } finally {\n    autoClickBackground.value = false\n    props.parameters.updateAutoClickBackground?.(false)\n  }\n}\n\nwatch(\n  () => props.isVisible,\n  async (visible) => {\n    await nextTick()\n    if (visible) {\n      if (!selfieSegmentation.value) {\n        try {\n          await preloadModel()\n        } catch {\n          console.log('Error preloading model:')\n        }\n      }\n      renderDefaultImages()\n      if (selectedImage.value) {\n        await loadImageToCanvas(selectedImage.value, selectedImage.value)\n      } else {\n        clearCanvas()\n      }\n\n      saveBackgroundButtonRef.value?.classList.add('d-none')\n      if (saveBackgroundButtonRef.value) {\n        saveBackgroundButtonRef.value.disabled = true\n      }\n      applyBackgroundButtonRef.value?.classList.remove('d-none')\n      if (applyBackgroundButtonRef.value) {\n        applyBackgroundButtonRef.value.disabled = false\n        if (\n          processedStream.value &&\n          prevKeepBackground.value === keepBackground.value &&\n          keepBackground.value &&\n          appliedBackground.value\n        ) {\n          applyBackgroundButtonRef.value.innerText = 'Apply Background'\n        } else {\n          applyBackgroundButtonRef.value.innerText = 'Preview Background'\n        }\n      }\n\n      await handleAutoClickBackground()\n    } else {\n      try {\n        const refVideo = captureVideoRef.value\n        if (\n          !appliedBackground.value ||\n          (appliedBackground.value && !keepBackground.value) ||\n          (appliedBackground.value && !props.parameters.videoAlreadyOn)\n        ) {\n          pauseSegmentation.value = true\n          props.parameters.updatePauseSegmentation?.(true)\n          if (!props.parameters.videoAlreadyOn) {\n            try {\n              if (refVideo) {\n                if (refVideo.srcObject instanceof MediaStream) {\n                  refVideo.srcObject.getTracks().forEach((track) => track.stop())\n                }\n                refVideo.srcObject = null\n              }\n\n              if (segmentVideo.value) {\n                segmentVideo.value.getTracks().forEach((track) => track.stop())\n                segmentVideo.value = null\n                props.parameters.updateSegmentVideo?.(null)\n              }\n\n              if (virtualStream.value) {\n                virtualStream.value.getTracks().forEach((track) => track.stop())\n                virtualStream.value = null\n                props.parameters.updateVirtualStream?.(null)\n              }\n            } catch {\n              // Handle cleanup error silently\n            }\n          }\n        }\n\n        videoPreviewRef.value?.classList.add('d-none')\n        backgroundCanvasRef.value?.classList.remove('d-none')\n      } catch {\n        // Handle error silently\n      }\n    }\n  }\n)\n\nonMounted(() => {\n  if (props.isVisible) {\n    void handleAutoClickBackground()\n  }\n})\n\n// Inline RenderVNode component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Function] as PropType<VNodeChild>,\n      default: null\n    }\n  },\n  setup(props) {\n    return () => {\n      const node = props.node\n      if (isVNode(node)) {\n        return node\n      } else if (typeof node === 'function') {\n        return (node as () => VNodeChild)()\n      } else {\n        return node\n      }\n    }\n  }\n})\n\n// Helper function\nconst joinClassNames = (classes: (string | undefined)[]): string | undefined => {\n  const filtered = classes.filter(Boolean)\n  return filtered.length > 0 ? filtered.join(' ').trim() : undefined\n}\n\n// Computed properties for styles\nconst defaultOverlayWidth = typeof window !== 'undefined' ? Math.min(window.innerWidth * 0.8, 500) : 360\n\nconst overlayStyle = computed((): CSSProperties => ({\n  position: 'fixed' as const,\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  display: props.isVisible ? 'block' : 'none',\n  zIndex: 999,\n  ...(props.overlayProps?.style as CSSProperties || {})\n}))\n\nconst overlayClassName = computed(() => \n  joinClassNames(['mediasfu-background-modal', props.overlayProps?.class as string])\n)\n\nconst contentStyle = computed((): CSSProperties => ({\n  position: 'fixed' as const,\n  backgroundColor: props.backgroundColor,\n  borderRadius: '10px',\n  padding: '16px',\n  width: `${defaultOverlayWidth}px`,\n  maxWidth: `${defaultOverlayWidth}px`,\n  maxHeight: '75%',\n  overflow: 'hidden' as const,\n  top: props.position.includes('top') ? '10px' : 'auto',\n  bottom: props.position.includes('bottom') ? '10px' : 'auto',\n  left: props.position.includes('Left') ? '10px' : 'auto',\n  right: props.position.includes('Right') ? '10px' : 'auto',\n  display: 'flex',\n  flexDirection: 'column' as const,\n  gap: '12px',\n  boxShadow: '0 10px 30px rgba(0, 0, 0, 0.25)',\n  ...(props.contentProps?.style as CSSProperties || {})\n}))\n\nconst contentClassName = computed(() => \n  joinClassNames(['mediasfu-background-modal__content', props.contentProps?.class as string])\n)\n\n// Main overlay node\nconst overlayNode = computed(() => {\n  const defaultCloseIcon = props.closeIconComponent ?? h(FontAwesomeIcon, { icon: faTimes, size: 'xl' })\n  \n  const defaultTitleNode = h('div', {\n    class: joinClassNames(['modal-title', props.titleProps?.class as string]),\n    style: {\n      margin: 0,\n      fontSize: '1.25rem',\n      fontWeight: 'bold',\n      color: 'black',\n      ...(props.titleProps?.style as CSSProperties || {})\n    },\n    ...(props.titleProps ? Object.fromEntries(\n      Object.entries(props.titleProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, typeof props.title === 'string' || typeof props.title === 'number' ? [props.title] : (props.title || []))\n  \n  const defaultHeaderNode = h('div', {\n    class: joinClassNames(['modal-header', props.headerProps?.class as string]),\n    style: {\n      display: 'flex',\n      justifyContent: 'space-between',\n      alignItems: 'center',\n      gap: '12px',\n      ...(props.headerProps?.style as CSSProperties || {})\n    },\n    ...(props.headerProps ? Object.fromEntries(\n      Object.entries(props.headerProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    defaultTitleNode,\n    h('button', {\n      class: joinClassNames(['btn-close-background', props.closeButtonProps?.class as string]),\n      style: {\n        background: 'none',\n        border: 'none',\n        padding: '4px',\n        cursor: 'pointer',\n        display: 'inline-flex',\n        alignItems: 'center',\n        justifyContent: 'center',\n        color: 'black',\n        ...(props.closeButtonProps?.style as CSSProperties || {})\n      },\n      onClick: (event: MouseEvent) => {\n        if (props.closeButtonProps?.onClick) {\n          (props.closeButtonProps.onClick as (event: MouseEvent) => void)(event)\n        }\n        if (!event.defaultPrevented) {\n          props.onClose()\n        }\n      },\n      ...(props.closeButtonProps ? Object.fromEntries(\n        Object.entries(props.closeButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {})\n    }, [defaultCloseIcon])\n  ])\n  \n  const headerNode = props.renderHeader\n    ? props.renderHeader({ defaultHeader: defaultHeaderNode, onClose: props.onClose })\n    : defaultHeaderNode\n  \n  const dividerNode = h('hr', {\n    style: {\n      height: '1px',\n      backgroundColor: 'black',\n      marginTop: '5px',\n      marginBottom: '5px',\n      ...(props.headerDividerProps?.style as CSSProperties || {})\n    },\n    ...(props.headerDividerProps ? Object.fromEntries(\n      Object.entries(props.headerDividerProps).filter(([key]) => !['style'].includes(key))\n    ) : {})\n  })\n  \n  // Default images container\n  const defaultImagesNode = h('div', {\n    id: 'defaultImages',\n    ref: defaultImagesContainerRef,\n    ...(props.defaultImagesContainerProps || {})\n  })\n  \n  // Upload section\n  const uploadSectionNode = h('div', {\n    class: joinClassNames(['form-group', props.uploadWrapperProps?.class as string]),\n    style: {\n      maxWidth: '70%',\n      overflowX: 'auto',\n      ...(props.uploadWrapperProps?.style as CSSProperties || {})\n    },\n    ...(props.uploadWrapperProps ? Object.fromEntries(\n      Object.entries(props.uploadWrapperProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    h('label', {\n      for: 'uploadImage',\n      ...(props.uploadLabelProps || {})\n    }, typeof props.uploadLabel === 'string' || typeof props.uploadLabel === 'number' \n      ? [props.uploadLabel] \n      : (props.uploadLabel || [])\n    ),\n    h('input', {\n      id: 'uploadImage',\n      ref: uploadImageInputRef,\n      type: 'file',\n      class: 'form-control',\n      onChange: handleImageUpload,\n      ...(props.uploadInputProps || {})\n    })\n  ])\n  \n  // Canvas elements (hidden)\n  const mainCanvasNode = h('canvas', {\n    id: 'mainCanvas',\n    ref: mainCanvasRef,\n    class: 'd-none',\n    ...(props.mainCanvasProps || {})\n  })\n  \n  const backgroundCanvasNode = h('canvas', {\n    id: 'backgroundCanvas',\n    ref: backgroundCanvasRef,\n    class: 'd-none',\n    style: {\n      width: '100%',\n      maxHeight: '500px',\n      ...(props.backgroundCanvasProps?.style as CSSProperties || {})\n    },\n    ...(props.backgroundCanvasProps ? Object.fromEntries(\n      Object.entries(props.backgroundCanvasProps).filter(([key]) => !['style'].includes(key))\n    ) : {})\n  })\n  \n  // Video elements (hidden)\n  const captureVideoNode = h('video', {\n    id: 'captureVideo',\n    ref: captureVideoRef,\n    class: 'd-none',\n    muted: true,\n    autoplay: true,\n    playsinline: true,\n    ...(props.captureVideoProps || {})\n  })\n  \n  const previewVideoNode = h('video', {\n    id: 'previewVideo',\n    ref: videoPreviewRef,\n    class: 'd-none',\n    muted: true,\n    autoplay: true,\n    playsinline: true,\n    style: {\n      width: '100%',\n      maxHeight: '500px',\n      ...(props.previewVideoProps?.style as CSSProperties || {})\n    },\n    ...(props.previewVideoProps ? Object.fromEntries(\n      Object.entries(props.previewVideoProps).filter(([key]) => !['style'].includes(key))\n    ) : {})\n  })\n  \n  // Loading overlay\n  const defaultLoadingSpinner = props.loadingSpinner ?? h('div', {\n    style: {\n      width: '50px',\n      height: '50px',\n      border: '5px solid #f3f3f3',\n      borderTop: '5px solid #3498db',\n      borderRadius: '50%',\n      animation: 'spin 1s linear infinite'\n    }\n  })\n  \n  const loadingOverlayNode = h('div', {\n    id: 'loadingOverlay',\n    ref: loadingOverlayRef,\n    class: 'd-none',\n    style: {\n      position: 'absolute',\n      top: 0,\n      left: 0,\n      width: '100%',\n      height: '100%',\n      backgroundColor: 'rgba(0, 0, 0, 0.5)',\n      display: 'none',\n      justifyContent: 'center',\n      alignItems: 'center',\n      zIndex: 10,\n      ...(props.loadingOverlayProps?.style as CSSProperties || {})\n    },\n    ...(props.loadingOverlayProps ? Object.fromEntries(\n      Object.entries(props.loadingOverlayProps).filter(([key]) => !['style'].includes(key))\n    ) : {})\n  }, [defaultLoadingSpinner])\n  \n  // Buttons\n  const defaultButtonsNode = h('div', {\n    style: {\n      display: 'flex',\n      gap: '8px',\n      ...(props.buttonsWrapperProps?.style as CSSProperties || {})\n    },\n    ...(props.buttonsWrapperProps ? Object.fromEntries(\n      Object.entries(props.buttonsWrapperProps).filter(([key]) => !['style'].includes(key))\n    ) : {})\n  }, [\n    h('button', {\n      id: 'applyBackgroundButton',\n      ref: applyBackgroundButtonRef,\n      class: joinClassNames(['btn btn-primary', props.applyButtonProps?.class as string]),\n      type: 'button',\n      style: { ...(props.applyButtonProps?.style as CSSProperties || {}) },\n      onClick: (event: MouseEvent) => {\n        if (props.applyButtonProps?.onClick) {\n          (props.applyButtonProps.onClick as (event: MouseEvent) => void)(event)\n        }\n        if (!event.defaultPrevented) {\n          void applyBackground()\n        }\n      },\n      ...(props.applyButtonProps ? Object.fromEntries(\n        Object.entries(props.applyButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {})\n    }, typeof props.applyButtonLabel === 'string' || typeof props.applyButtonLabel === 'number'\n      ? [props.applyButtonLabel]\n      : (props.applyButtonLabel || [])\n    ),\n    h('button', {\n      id: 'saveBackgroundButton',\n      ref: saveBackgroundButtonRef,\n      class: joinClassNames(['btn btn-success d-none', props.saveButtonProps?.class as string]),\n      type: 'button',\n      style: { ...(props.saveButtonProps?.style as CSSProperties || {}) },\n      onClick: (event: MouseEvent) => {\n        if (props.saveButtonProps?.onClick) {\n          (props.saveButtonProps.onClick as (event: MouseEvent) => void)(event)\n        }\n        if (!event.defaultPrevented) {\n          void saveBackground()\n        }\n      },\n      ...(props.saveButtonProps ? Object.fromEntries(\n        Object.entries(props.saveButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {})\n    }, typeof props.saveButtonLabel === 'string' || typeof props.saveButtonLabel === 'number'\n      ? [props.saveButtonLabel]\n      : (props.saveButtonLabel || [])\n    )\n  ])\n  \n  const buttonsNode = props.renderButtons\n    ? props.renderButtons({ \n        defaultButtons: defaultButtonsNode,\n        applyButtonRef: applyBackgroundButtonRef,\n        saveButtonRef: saveBackgroundButtonRef\n      })\n    : defaultButtonsNode\n  \n  // Body content\n  const defaultBodyNode = h('div', {\n    style: {\n      maxWidth: '95%',\n      overflowX: 'auto',\n      ...(props.bodyProps?.style as CSSProperties || {})\n    },\n    ...(props.bodyProps ? Object.fromEntries(\n      Object.entries(props.bodyProps).filter(([key]) => !['style'].includes(key))\n    ) : {})\n  }, [\n    defaultImagesNode,\n    uploadSectionNode,\n    mainCanvasNode,\n    backgroundCanvasNode,\n    captureVideoNode,\n    previewVideoNode,\n    loadingOverlayNode,\n    h('br'),\n    buttonsNode\n  ])\n  \n  const bodyNode = props.renderBody\n    ? props.renderBody({ defaultBody: defaultBodyNode })\n    : defaultBodyNode\n  \n  // Content\n  const defaultContentNode = h('div', {\n    class: contentClassName.value,\n    style: contentStyle.value,\n    ...(props.contentProps ? Object.fromEntries(\n      Object.entries(props.contentProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    headerNode,\n    dividerNode,\n    bodyNode\n  ])\n  \n  const contentNode = props.renderContent\n    ? props.renderContent({ defaultContent: defaultContentNode })\n    : defaultContentNode\n  \n  return h('div', {\n    class: overlayClassName.value,\n    style: overlayStyle.value,\n    ...(props.overlayProps ? Object.fromEntries(\n      Object.entries(props.overlayProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [contentNode])\n})\n</script>\n\n<template>\n  <Teleport to=\"body\">\n    <RenderVNode :node=\"overlayNode\" />\n  </Teleport>\n</template>\n\n<style scoped>\n@keyframes spin {\n  0% {\n    transform: rotate(0deg);\n  }\n  100% {\n    transform: rotate(360deg);\n  }\n}\n\n.d-none {\n  display: none !important;\n}\n</style>","<!--\n/**\n * @fileoverview RoomList - Breakout room display and management component\n * @component RoomList\n * @module components/breakoutComponents/RoomList\n * \n * @description\n * A display component for breakout rooms showing room cards with participant lists and\n * management actions. Each room card displays the room number, assigned participants,\n * and action buttons (Edit, Delete, Remove participant). Designed to be used within\n * BreakoutRoomsModal for comprehensive breakout room management.\n * \n * Key Features:\n * - Room card display with room number and participant list\n * - Edit button to open EditRoomModal for participant assignment\n * - Delete button to remove entire room\n * - Remove participant button (× icon) for each participant\n * - Visual room numbering (Room 1, Room 2, etc.)\n * - Scrollable participant lists for rooms with many participants\n * - Styled card layout with headers and bodies\n * - FontAwesome icons for actions (door, edit, trash, times)\n * - Responsive design for various screen sizes\n * \n * Actions:\n * - **Edit Room**: Opens EditRoomModal to add/remove participants\n * - **Delete Room**: Removes entire room and unassigns all participants\n * - **Remove Participant**: Removes specific participant from room (× button)\n * \n * Workflow:\n * 1. Component receives array of rooms (each room is array of participants)\n * 2. Renders room card for each room with room number\n * 3. Lists all participants in each room with remove buttons\n * 4. Host clicks \"Edit\" → triggers handleEditRoom callback\n * 5. Host clicks \"Delete\" → triggers handleDeleteRoom callback\n * 6. Host clicks \"×\" on participant → triggers handleRemoveParticipant callback\n * 7. Parent component (BreakoutRoomsModal) handles all state updates\n * \n * @example Basic Usage\n * ```vue\n * <RoomList\n *   :rooms=\"breakoutRooms\"\n *   :handleEditRoom=\"openEditModal\"\n *   :handleDeleteRoom=\"deleteRoom\"\n *   :handleRemoveParticipant=\"removeParticipantFromRoom\"\n * />\n * ```\n * \n * @example With Breakout Rooms Data\n * ```vue\n * <script setup>\n * const breakoutRooms = ref([\n *   [\n *     { name: 'Alice', breakRoom: 0 },\n *     { name: 'Bob', breakRoom: 0 }\n *   ],\n *   [\n *     { name: 'Charlie', breakRoom: 1 },\n *     { name: 'Diana', breakRoom: 1 },\n *     { name: 'Eve', breakRoom: 1 }\n *   ]\n * ]);\n * \n * const editRoom = (roomIndex) => {\n *   console.log(`Editing Room ${roomIndex + 1}`);\n *   currentRoomIndex.value = roomIndex;\n *   isEditModalVisible.value = true;\n * };\n * \n * const deleteRoom = (roomIndex) => {\n *   console.log(`Deleting Room ${roomIndex + 1}`);\n *   const room = breakoutRooms.value[roomIndex];\n *   room.forEach(p => p.breakRoom = null);\n *   breakoutRooms.value.splice(roomIndex, 1);\n * };\n * \n * const removeParticipant = (roomIndex, participant) => {\n *   console.log(`Removing ${participant.name} from Room ${roomIndex + 1}`);\n *   participant.breakRoom = null;\n *   const idx = breakoutRooms.value[roomIndex].findIndex(p => p.name === participant.name);\n *   if (idx !== -1) breakoutRooms.value[roomIndex].splice(idx, 1);\n * };\n * </script>\n * \n * <template>\n *   <RoomList\n *     :rooms=\"breakoutRooms\"\n *     :handleEditRoom=\"editRoom\"\n *     :handleDeleteRoom=\"deleteRoom\"\n *     :handleRemoveParticipant=\"removeParticipant\"\n *   />\n * </template>\n * ```\n * \n * @example Empty Room Display\n * ```vue\n * <RoomList\n *   :rooms=\"[\n *     [],\n *     [{ name: 'Alice', breakRoom: 1 }],\n *     []\n *   ]\"\n *   :handleEditRoom=\"editRoom\"\n *   :handleDeleteRoom=\"deleteRoom\"\n *   :handleRemoveParticipant=\"removeParticipant\"\n * />\n * Room 1: empty, Room 2: 1 participant, Room 3: empty\n * ```\n * \n * @see {@link BreakoutRoomsModal} for main breakout rooms management interface\n * @see {@link EditRoomModal} for participant assignment editor\n * @see {@link https://mediasfu.com/docs/breakout-rooms} for breakout rooms documentation\n */\n-->\n<template>\n  <div\n    v-for=\"(room, roomIndex) in rooms\"\n    :key=\"roomIndex\"\n    class=\"room-card\"\n  >\n    <div class=\"card-header\">\n      <h5 class=\"room-title\">\n        Room {{ roomIndex + 1 }} <font-awesome-icon :icon=\"faDoorOpen\" />\n      </h5>\n      <div class=\"room-actions\">\n        <button\n          class=\"btn btn-sm btn-primary mr-2\"\n          @click=\"props.handleEditRoom(roomIndex)\"\n        >\n          <font-awesome-icon :icon=\"faEdit\" /> Edit\n        </button>\n        <button\n          class=\"btn btn-sm btn-danger\"\n          @click=\"props.handleDeleteRoom(roomIndex)\"\n        >\n          <font-awesome-icon :icon=\"faTrash\" /> Delete\n        </button>\n      </div>\n    </div>\n    <div class=\"card-body\">\n      <ul class=\"participant-list\">\n        <li\n          v-for=\"(participant, participantIndex) in room\"\n          :key=\"participantIndex\"\n          class=\"participant-item\"\n        >\n          <span>{{ participant.name }}</span>\n          <button\n            class=\"btn btn-sm btn-danger ml-2\"\n            @click=\"props.handleRemoveParticipant(roomIndex, participant)\"\n          >\n            <font-awesome-icon :icon=\"faTimes\" />\n          </button>\n        </li>\n      </ul>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { defineOptions } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faDoorOpen, faEdit, faTrash, faTimes } from '@fortawesome/free-solid-svg-icons';\nimport type { BreakoutParticipant } from 'mediasfu-shared';\n\ndefineOptions({\n  name: 'RoomList'\n});\n\n/**\n * Props for the RoomList component\n * @interface RoomListProps\n * \n * @property {BreakoutParticipant[][]} rooms - Array of rooms, where each room is an array of participants\n * @property {(roomIndex: number) => void} handleEditRoom - Callback when Edit button is clicked\n * @property {(roomIndex: number) => void} handleDeleteRoom - Callback when Delete button is clicked\n * @property {(roomIndex: number, participant: BreakoutParticipant) => void} handleRemoveParticipant - Callback when participant × button is clicked\n * \n * @example RoomListProps Usage\n * ```ts\n * const roomListProps = {\n *   rooms: [\n *     [\n *       { name: 'Alice', breakRoom: 0 },\n *       { name: 'Bob', breakRoom: 0 }\n *     ],\n *     [\n *       { name: 'Charlie', breakRoom: 1 }\n *     ]\n *   ],\n *   handleEditRoom: (roomIndex) => {\n *     console.log(`Opening edit modal for Room ${roomIndex + 1}`);\n *     currentRoomIndex.value = roomIndex;\n *     isEditModalVisible.value = true;\n *   },\n *   handleDeleteRoom: (roomIndex) => {\n *     console.log(`Deleting Room ${roomIndex + 1}`);\n *     // Unassign all participants from this room\n *     rooms[roomIndex].forEach(p => p.breakRoom = null);\n *     // Remove room from array\n *     rooms.splice(roomIndex, 1);\n *   },\n *   handleRemoveParticipant: (roomIndex, participant) => {\n *     console.log(`Removing ${participant.name} from Room ${roomIndex + 1}`);\n *     // Unassign participant\n *     participant.breakRoom = null;\n *     // Remove from room array\n *     const idx = rooms[roomIndex].findIndex(p => p.name === participant.name);\n *     if (idx !== -1) rooms[roomIndex].splice(idx, 1);\n *   }\n * };\n * ```\n * \n * @default rooms - No default (required)\n * @default handleEditRoom - No default (required)\n * @default handleDeleteRoom - No default (required)\n * @default handleRemoveParticipant - No default (required)\n */\nexport interface RoomListProps {\n  rooms: BreakoutParticipant[][];\n  handleEditRoom: (roomIndex: number) => void;\n  handleDeleteRoom: (roomIndex: number) => void;\n  handleRemoveParticipant: (roomIndex: number, participant: BreakoutParticipant) => void;\n}\n\nconst props = defineProps<RoomListProps>();\n</script>\n\n<style scoped>\n.room-card {\n  border: 1px solid #ddd;\n  border-radius: 8px;\n  margin-bottom: 15px;\n  overflow: hidden;\n  background-color: #f9f9f9;\n}\n\n.card-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 15px;\n  background-color: #e9ecef;\n  border-bottom: 1px solid #ddd;\n}\n\n.room-title {\n  margin: 0;\n  font-size: 1.1rem;\n  font-weight: bold;\n  color: #333;\n}\n\n.room-actions {\n  display: flex;\n  gap: 8px;\n}\n\n.card-body {\n  padding: 15px;\n}\n\n.participant-list {\n  list-style: none;\n  padding: 0;\n  margin: 0;\n}\n\n.participant-item {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 8px 12px;\n  margin-bottom: 8px;\n  background-color: white;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n}\n\n.participant-item:last-child {\n  margin-bottom: 0;\n}\n\n.btn {\n  padding: 6px 12px;\n  border: none;\n  border-radius: 4px;\n  cursor: pointer;\n  font-size: 0.875rem;\n  transition: background-color 0.2s;\n}\n\n.btn-sm {\n  padding: 4px 8px;\n  font-size: 0.75rem;\n}\n\n.btn-primary {\n  background-color: #007bff;\n  color: white;\n}\n\n.btn-primary:hover {\n  background-color: #0056b3;\n}\n\n.btn-danger {\n  background-color: #dc3545;\n  color: white;\n}\n\n.btn-danger:hover {\n  background-color: #a71d2a;\n}\n\n.mr-2 {\n  margin-right: 8px;\n}\n\n.ml-2 {\n  margin-left: 8px;\n}\n</style>\n","<!--\n/**\n * @fileoverview EditRoomModal - Breakout room participant assignment editor\n * @component EditRoomModal\n * @module components/breakoutComponents/EditRoomModal\n * \n * @description\n * A modal for editing breakout room participant assignments. Allows hosts to add/remove\n * participants from a specific breakout room with dual-list interface showing assigned\n * (in room) and unassigned (not in any room) participants. Features one-click add/remove\n * buttons for easy participant management during breakout room configuration.\n * \n * Key Features:\n * - Edit specific breakout room assignments\n * - Dual-list UI: Assigned (in this room) vs Unassigned (available)\n * - One-click add/remove participant buttons\n * - Room number display in header\n * - Visual participant count indicators\n * - Scrollable lists for large participant counts\n * - Close button to save changes and exit\n * - Responsive modal design\n * - FontAwesome icons for visual clarity\n * \n * Workflow:\n * 1. Host clicks \"Edit\" on a breakout room in BreakoutRoomsModal\n * 2. EditRoomModal opens showing room number and participants\n * 3. Assigned Participants list shows who is currently in this room\n * 4. Unassigned Participants list shows who is available to add\n * 5. Host clicks \"Add\" on unassigned participant → moves to assigned list\n * 6. Host clicks \"Remove\" on assigned participant → moves to unassigned list\n * 7. Changes are applied immediately via handleAddParticipant/handleRemoveParticipant\n * 8. Host closes modal → returns to BreakoutRoomsModal with updated assignments\n * \n * @example Basic Usage\n * ```typescript\n * // <EditRoomModal\n *   // :editRoomModalVisible=\"isEditRoomModalVisible\"\n *   // :setEditRoomModalVisible=\"setIsEditRoomModalVisible\"\n *   // :currentRoom=\"selectedRoomParticipants\"\n *   // :participantsRef=\"{ value: allParticipants }\"\n *   // :handleAddParticipant=\"addParticipantToRoom\"\n *   // :handleRemoveParticipant=\"removeParticipantFromRoom\"\n *   // :currentRoomIndex=\"selectedRoomIndex\"\n * // />\n * ```\n * \n * @example With Custom Handlers\n * ```typescript\n * // <script setup>\n * const handleAdd = (roomIndex, participant) => {\n *   // console.log(`Adding ${participant.name} to room ${roomIndex + 1}`);\n *   // Update breakout room assignments\n *   // participant.breakRoom = roomIndex;\n *   // rooms[roomIndex].push(participant);\n * };\n * \n * const handleRemove = (roomIndex, participant) => {\n *   // console.log(`Removing ${participant.name} from room ${roomIndex + 1}`);\n *   // Remove from room assignments\n *   // participant.breakRoom = null;\n *   // const index = rooms[roomIndex].findIndex(p => p.name === participant.name);\n *   // if (index !== -1) rooms[roomIndex].splice(index, 1);\n * };\n * </script>\n * \n * // <template>\n *   <EditRoomModal\n *     :editRoomModalVisible=\"true\"\n *     :setEditRoomModalVisible=\"setModalVisible\"\n *     :currentRoom=\"room2Participants\"\n *     :participantsRef=\"{ value: participants }\"\n *     :handleAddParticipant=\"handleAdd\"\n *     :handleRemoveParticipant=\"handleRemove\"\n *     :currentRoomIndex=\"1\"\n *   />\n * </template>\n * ```\n * \n * @example Programmatic Room Editing\n * ```typescript\n * // <script setup>\n * import { ref } from 'vue';\n * \n * const isEditModalVisible = ref(false);\n * const currentRoomIndex = ref(null);\n * const currentRoomParticipants = ref([]);\n * \n * const openEditModal = (roomIndex) => {\n *   // currentRoomIndex.value = roomIndex;\n *   // currentRoomParticipants.value = breakoutRooms[roomIndex];\n *   // isEditModalVisible.value = true;\n * };\n * \n * const addToRoom = (roomIdx, participant) => {\n *   // participant.breakRoom = roomIdx;\n *   // breakoutRooms[roomIdx].push(participant);\n * };\n * \n * const removeFromRoom = (roomIdx, participant) => {\n *   // participant.breakRoom = null;\n *   // const idx = breakoutRooms[roomIdx].findIndex(p => p.name === participant.name);\n *   // if (idx !== -1) breakoutRooms[roomIdx].splice(idx, 1);\n * };\n * </script>\n * \n * // <template>\n *   <button @click=\"openEditModal(0)\">Edit Room 1</button>\n *   \n *   <EditRoomModal\n *     :editRoomModalVisible=\"isEditModalVisible\"\n *     :setEditRoomModalVisible=\"(v) => isEditModalVisible = v\"\n *     :currentRoom=\"currentRoomParticipants\"\n *     :participantsRef=\"{ value: allParticipants }\"\n *     :handleAddParticipant=\"addToRoom\"\n *     :handleRemoveParticipant=\"removeFromRoom\"\n *     :currentRoomIndex=\"currentRoomIndex\"\n *   />\n * </template>\n * ```\n * \n * @see {@link BreakoutRoomsModal} for main breakout rooms management interface\n * @see {@link RoomList} for breakout room list display component\n * @see {@link https://mediasfu.com/docs/breakout-rooms} for breakout rooms documentation\n */\n-->\n<template>\n  <div :style=\"modalContainerStyle\">\n    <div :style=\"modalContentStyle\">\n      <div class=\"modal-header\">\n        <h3 class=\"modal-title\">\n          Edit Room {{ (props.currentRoomIndex ?? 0) + 1 }} <font-awesome-icon :icon=\"faEdit\" />\n        </h3>\n        <button\n          class=\"close-button\"\n          @click=\"closeModal\"\n        >\n          <font-awesome-icon\n            :icon=\"faTimes\"\n            size=\"xl\"\n          />\n        </button>\n      </div>\n      <hr class=\"divider\" />\n        \n      <div class=\"participants-section\">\n        <h4 class=\"section-title\">\n          Assigned Participants <font-awesome-icon :icon=\"faUsers\" />\n        </h4>\n        <ul class=\"participants-list\">\n          <li\n            v-for=\"(participant, index) in props.currentRoom\"\n            :key=\"index\"\n            class=\"participant-item\"\n          >\n            <span>{{ participant.name }}</span>\n            <button\n              class=\"btn btn-sm btn-danger\"\n              @click=\"handleRemove(participant)\"\n            >\n              <font-awesome-icon :icon=\"faMinus\" /> Remove\n            </button>\n          </li>\n        </ul>\n      </div>\n\n      <div class=\"participants-section\">\n        <h4 class=\"section-title\">\n          Unassigned Participants <font-awesome-icon :icon=\"faUserFriends\" />\n        </h4>\n        <ul class=\"participants-list\">\n          <li\n            v-for=\"(participant, index) in unassignedParticipants\"\n            :key=\"index\"\n            class=\"participant-item\"\n          >\n            <span>{{ participant.name }}</span>\n            <button\n              class=\"btn btn-sm btn-success\"\n              @click=\"handleAdd(participant)\"\n            >\n              <font-awesome-icon :icon=\"faPlus\" /> Add\n            </button>\n          </li>\n        </ul>\n      </div>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { computed, defineOptions } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport {\n  faEdit,\n  faTimes,\n  faUsers,\n  faUserFriends,\n  faPlus,\n  faMinus,\n} from '@fortawesome/free-solid-svg-icons';\nimport type { Participant, BreakoutParticipant } from 'mediasfu-shared';\n\ndefineOptions({\n  name: 'EditRoomModal'\n});\n\n/**\n * Props for the EditRoomModal component\n * @interface EditRoomModalProps\n * \n * @property {boolean} editRoomModalVisible - Controls modal visibility\n * @property {(visible: boolean) => void} setEditRoomModalVisible - Function to update modal visibility state\n * @property {BreakoutParticipant[]} currentRoom - Array of participants currently assigned to this room\n * @property {{ value: Participant[] }} participantsRef - Ref object containing all participants in the session\n * @property {(roomIndex: number, participant: Participant | BreakoutParticipant) => void} handleAddParticipant - Function to add participant to room\n * @property {(roomIndex: number, participant: Participant | BreakoutParticipant) => void} handleRemoveParticipant - Function to remove participant from room\n * @property {number | null} currentRoomIndex - Index of the room being edited (0-based, null if none)\n * \n * @example EditRoomModalProps Usage\n * ```ts\n * const editRoomProps = {\n *   // editRoomModalVisible: true,\n *   // setEditRoomModalVisible: (visible) => {\n *     isEditModalVisible.value = visible;\n *   },\n *   // currentRoom: [\n *     { name: 'Alice', breakRoom: 0 },\n *     { name: 'Bob', breakRoom: 0 }\n *   ],\n *   // participantsRef: {\n *     value: [\n *       { name: 'Alice', breakRoom: 0 },\n *       { name: 'Bob', breakRoom: 0 },\n *       { name: 'Charlie', breakRoom: null },\n *       { name: 'Diana', breakRoom: null }\n *     ]\n *   },\n *   // handleAddParticipant: (roomIdx, participant) => {\n *     participant.breakRoom = roomIdx;\n *     breakoutRooms[roomIdx].push(participant);\n *     console.log(`Added ${participant.name} to Room ${roomIdx + 1}`);\n *   },\n *   // handleRemoveParticipant: (roomIdx, participant) => {\n *     participant.breakRoom = null;\n *     const idx = breakoutRooms[roomIdx].findIndex(p => p.name === participant.name);\n *     if (idx !== -1) breakoutRooms[roomIdx].splice(idx, 1);\n *     console.log(`Removed ${participant.name} from Room ${roomIdx + 1}`);\n *   },\n *   // currentRoomIndex: 0\n * };\n * ```\n * \n * @default editRoomModalVisible - No default (required)\n * @default setEditRoomModalVisible - No default (required)\n * @default currentRoom - No default (required)\n * @default participantsRef - No default (required)\n * @default handleAddParticipant - No default (required)\n * @default handleRemoveParticipant - No default (required)\n * @default currentRoomIndex - No default (required)\n */\nexport interface EditRoomModalProps {\n  editRoomModalVisible: boolean;\n  setEditRoomModalVisible: (visible: boolean) => void;\n  currentRoom: BreakoutParticipant[];\n  participantsRef: { value: Participant[] };\n  handleAddParticipant: (roomIndex: number, participant: Participant | BreakoutParticipant) => void;\n  handleRemoveParticipant: (roomIndex: number, participant: Participant | BreakoutParticipant) => void;\n  currentRoomIndex: number | null;\n}\n\nconst props = defineProps<EditRoomModalProps>();\n\n// Modal styles\nconst modalContainerStyle = computed(() => ({\n  position: 'fixed' as const,\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  zIndex: 1000,\n  display: props.editRoomModalVisible ? 'flex' : 'none',\n  justifyContent: 'center',\n  alignItems: 'center',\n}));\n\nconst modalContentStyle = computed(() => ({\n  backgroundColor: '#fff',\n  borderRadius: '10px',\n  padding: '20px',\n  width: '80%',\n  maxWidth: '500px',\n  maxHeight: '80%',\n  overflowY: 'auto' as const,\n}));\n\nconst unassignedParticipants = computed(() => {\n  return props.participantsRef.value.filter((participant) => participant.breakRoom == null);\n});\n\nconst closeModal = () => {\n  props.setEditRoomModalVisible(false);\n};\n\nconst handleAdd = (participant: Participant | BreakoutParticipant) => {\n  if (props.currentRoomIndex != null) {\n    props.handleAddParticipant(props.currentRoomIndex, participant);\n  }\n};\n\nconst handleRemove = (participant: BreakoutParticipant) => {\n  if (props.currentRoomIndex != null) {\n    props.handleRemoveParticipant(props.currentRoomIndex, participant);\n  }\n};\n</script>\n\n<style scoped>\n.modal-overlay {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background-color: rgba(0, 0, 0, 0.5);\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  z-index: 999;\n}\n\n.modal-container {\n  background-color: #f5f5f5;\n  border-radius: 10px;\n  padding: 0;\n  max-width: 600px;\n  width: 90%;\n  max-height: 80vh;\n  overflow-y: auto;\n  box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n}\n\n.modal-content {\n  padding: 20px;\n}\n\n.modal-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-bottom: 15px;\n}\n\n.modal-title {\n  font-size: 1.5rem;\n  font-weight: bold;\n  color: black;\n  margin: 0;\n}\n\n.close-button {\n  border: none;\n  background: none;\n  cursor: pointer;\n  padding: 0;\n  color: black;\n  font-size: 20px;\n}\n\n.close-button:hover {\n  opacity: 0.7;\n}\n\n.divider {\n  height: 1px;\n  background-color: black;\n  border: none;\n  margin: 15px 0;\n}\n\n.participants-section {\n  margin-bottom: 20px;\n}\n\n.section-title {\n  font-size: 1.1rem;\n  font-weight: bold;\n  margin-bottom: 10px;\n  color: #333;\n}\n\n.participants-list {\n  list-style: none;\n  padding: 0;\n  margin: 0;\n}\n\n.participant-item {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 10px 15px;\n  margin-bottom: 8px;\n  background-color: white;\n  border: 1px solid #ddd;\n  border-radius: 4px;\n}\n\n.participant-item:last-child {\n  margin-bottom: 0;\n}\n\n.btn {\n  padding: 6px 12px;\n  border: none;\n  border-radius: 4px;\n  cursor: pointer;\n  font-size: 0.875rem;\n  transition: background-color 0.2s;\n}\n\n.btn-sm {\n  padding: 4px 8px;\n  font-size: 0.75rem;\n}\n\n.btn-success {\n  background-color: #28a745;\n  color: white;\n}\n\n.btn-success:hover {\n  background-color: #1e7e34;\n}\n\n.btn-danger {\n  background-color: #dc3545;\n  color: white;\n}\n\n.btn-danger:hover {\n  background-color: #a71d2a;\n}\n</style>\n","<!--\n/**\n * @fileoverview BreakoutRoomsModal - Comprehensive breakout rooms management interface\n * @component BreakoutRoomsModal\n * @module components/breakoutComponents/BreakoutRoomsModal\n * \n * @description\n * A full-featured modal for creating, managing, and controlling breakout rooms. Allows\n * hosts to divide participants into multiple rooms, assign participants manually or randomly,\n * start/stop breakout sessions, and monitor active rooms. Integrates with Socket.io for\n * real-time synchronization and includes EditRoomModal for detailed room management.\n * \n * Key Features:\n * - **Room Creation**: Set number of rooms (1-N) and create them instantly\n * - **Manual Assignment**: Drag participants into rooms via dropdown selects\n * - **Random Assignment**: Auto-distribute participants evenly across rooms\n * - **Edit Rooms**: Click \"Edit\" to manage individual room participants (EditRoomModal)\n * - **Add/Delete Rooms**: Add new rooms or delete existing ones dynamically\n * - **Save Rooms**: Persist room assignments before starting session\n * - **Start/Stop Session**: Launch breakout rooms or end active sessions\n * - **Real-time Sync**: Socket.io integration for instant updates\n * - **Host Controls**: Host-only access for all management functions\n * - **Empty State Handling**: Guides for creating first room\n * - **Responsive Modal**: Configurable positioning and styling\n * \n * User Roles:\n * - **Host (islevel='2')**: Full control - create/edit/start/stop breakout rooms\n * - **Participants**: Cannot open this modal - auto-assigned to rooms by host\n * \n * Workflow:\n * 1. Host opens BreakoutRoomsModal from menu or whiteboard controls\n * 2. Host enters number of rooms (e.g., 3) in \"Number of Rooms\" input\n * 3. Host clicks \"Random Assign\" → participants auto-distributed evenly OR\n *    Host clicks \"Manual Assign\" → participant dropdowns appear for each room\n * 4. Host assigns participants manually via \"Select Participant\" dropdowns\n * 5. Host clicks \"Edit\" on a room → EditRoomModal opens for detailed management\n * 6. Host clicks \"+\" to add more rooms or trash icon to delete rooms\n * 7. Host clicks \"Save\" → room assignments persisted to state\n * 8. Host clicks \"Start\" → Socket.io emits 'startBreakoutRooms' → sessions begin\n * 9. Participants auto-navigated to their assigned rooms\n * 10. Host clicks \"Stop\" → Socket.io emits 'stopBreakoutRooms' → sessions end\n * 11. All participants return to main room\n * \n * Socket Events:\n * - **startBreakoutRooms**: Launches breakout session for all rooms\n * - **stopBreakoutRooms**: Ends breakout session and returns participants to main room\n * - **breakoutRoomUpdated**: Real-time updates when assignments change\n * \n * Assignment Modes:\n * - **Random**: Evenly distributes participants across rooms (auto-balance)\n * - **Manual**: Host selects participants via dropdowns for each room\n * \n * @example Basic Usage - Random Assignment\n * ```typescript\n * // <BreakoutRoomsModal\n *   // :isVisible=\"isBreakoutRoomsModalVisible\"\n *   // :parameters=\"{\n *     participants: allParticipants,\n *     showAlert: alertFunction,\n *     socket: socketConnection,\n *     roomName: 'main-room',\n *     breakoutRooms: currentBreakoutRooms,\n *     breakOutRoomStarted: isBreakoutActive,\n *     canStartBreakout: hostCanStart,\n *     updateBreakoutRooms: setBreakoutRooms,\n *     updateBreakOutRoomStarted: setBreakoutStarted,\n *     updateCanStartBreakout: setCanStart,\n *     updateCurrentRoomIndex: setCurrentRoomIndex,\n *     getUpdatedAllParams: getAllParams\n *   }\"\n *   // :onBreakoutRoomsClose=\"() => setIsBreakoutRoomsModalVisible(false)\"\n *   // position=\"topRight\"\n *   // backgroundColor=\"#f8f9fa\"\n * // />\n * ```\n * \n * @remarks\n * This component requires Socket.io for real-time synchronization. Host must save room\n * assignments before starting sessions. Participants cannot create or manage rooms - only\n * hosts have access to this modal. EditRoomModal opens as a child modal for detailed\n * per-room management. Screen sharing and certain display modes may be disabled during\n * active breakout sessions.\n * \n * @see {@link EditRoomModal} - Child modal for detailed room participant management\n * @see {@link RoomList} - Sub-component that renders room cards\n */\n-->\n<template>\n  <div>\n    <RenderVNode :node=\"overlayNode\" />\n    <!-- Edit Room Modal -->\n    <EditRoomModal\n      :edit-room-modal-visible=\"editRoomModalVisible\"\n      :set-edit-room-modal-visible=\"setEditRoomModalVisible\"\n      :current-room=\"currentRoom\"\n      :participants-ref=\"{ value: participantsRef }\"\n      :handle-add-participant=\"handleAddParticipant\"\n      :handle-remove-participant=\"handleRemoveParticipant\"\n      :current-room-index=\"currentRoomIndex\"\n    />\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, watch, onMounted, computed, withDefaults, h, isVNode, defineComponent, type PropType, type VNodeChild, type HTMLAttributes, type ButtonHTMLAttributes, type InputHTMLAttributes, type SelectHTMLAttributes, type LabelHTMLAttributes, type CSSProperties } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport {\n  faDoorOpen,\n  faTimes,\n  faUsers,\n  faRandom,\n  faHandPointer,\n  faPlus,\n  faSave,\n  faSyncAlt,\n  faPlay,\n  faStop,\n} from '@fortawesome/free-solid-svg-icons';\nimport RoomList from './RoomList.vue';\nimport EditRoomModal from './EditRoomModal.vue';\nimport { Socket } from 'socket.io-client';\nimport { handleStartBreakout } from 'mediasfu-shared';\nimport { handleStopBreakout } from 'mediasfu-shared';\nimport type { Participant, BreakoutParticipant } from 'mediasfu-shared';\n\nexport type ShowAlert = (alert: { message: string; type: 'success' | 'danger'; duration?: number }) => void;\n\n/**\n * Parameters interface for BreakoutRoomsModal\n * @interface BreakoutRoomsModalParameters\n * \n * @property {Participant[]} participants - All event participants\n * @property {ShowAlert} [showAlert] - Alert function for user feedback\n * @property {Socket} socket - Socket.io instance for real-time updates\n * @property {Socket} [localSocket] - Optional local socket instance\n * @property {number} itemPageLimit - Max items per page\n * @property {string} meetingDisplayType - Current display mode\n * @property {string} prevMeetingDisplayType - Previous display mode\n * @property {string} roomName - Main room name\n * @property {boolean} shareScreenStarted - Whether screen sharing is active\n * @property {boolean} shared - Whether content is shared\n * @property {boolean} breakOutRoomStarted - Whether breakout session is active\n * @property {boolean} breakOutRoomEnded - Whether breakout session ended\n * @property {boolean} isBreakoutRoomsModalVisible - Modal visibility state\n * @property {number|null} currentRoomIndex - Currently selected room index\n * @property {boolean} canStartBreakout - Whether host can start breakout session\n * @property {BreakoutParticipant[][]} breakoutRooms - Array of room participant arrays\n * @property {function} updateBreakOutRoomStarted - Update breakout started state\n * @property {function} updateBreakOutRoomEnded - Update breakout ended state\n * @property {function} updateCurrentRoomIndex - Update selected room index\n * @property {function} updateCanStartBreakout - Update start permission\n * @property {function} updateBreakoutRooms - Update all room assignments\n * @property {function} updateMeetingDisplayType - Update display mode\n * @property {function} getUpdatedAllParams - Get latest parameters\n */\nexport interface BreakoutRoomsModalParameters {\n  participants: Participant[];\n  showAlert?: ShowAlert;\n  socket: Socket;\n  localSocket?: Socket;\n  itemPageLimit: number;\n  meetingDisplayType: string;\n  prevMeetingDisplayType: string;\n  roomName: string;\n  shareScreenStarted: boolean;\n  shared: boolean;\n  breakOutRoomStarted: boolean;\n  breakOutRoomEnded: boolean;\n  isBreakoutRoomsModalVisible: boolean;\n  currentRoomIndex: number | null;\n  canStartBreakout: boolean;\n  breakoutRooms: BreakoutParticipant[][];\n  updateBreakOutRoomStarted: (started: boolean) => void;\n  updateBreakOutRoomEnded: (ended: boolean) => void;\n  updateCurrentRoomIndex: (roomIndex: number) => void;\n  updateCanStartBreakout: (canStart: boolean) => void;\n  updateBreakoutRooms: (rooms: BreakoutParticipant[][]) => void;\n  updateMeetingDisplayType: (displayType: string) => void;\n  getUpdatedAllParams: () => BreakoutRoomsModalParameters;\n  [key: string]: unknown;\n}\n\nexport interface BreakoutRoomsModalOptions {\n  isVisible: boolean;\n  parameters: BreakoutRoomsModalParameters;\n  onBreakoutRoomsClose: () => void;\n  position?: 'topRight' | 'topLeft' | 'bottomRight' | 'bottomLeft';\n  backgroundColor?: string;\n  \n  // UI override props\n  title?: VNodeChild\n  overlayProps?: HTMLAttributes\n  contentProps?: HTMLAttributes\n  headerProps?: HTMLAttributes\n  titleProps?: HTMLAttributes\n  closeButtonProps?: ButtonHTMLAttributes\n  closeIconComponent?: VNodeChild\n  headerDividerProps?: HTMLAttributes\n  bodyProps?: HTMLAttributes\n  controlsWrapperProps?: HTMLAttributes\n  numRoomsFieldProps?: HTMLAttributes\n  numRoomsLabelProps?: LabelHTMLAttributes\n  numRoomsInputProps?: InputHTMLAttributes\n  actionsWrapperProps?: HTMLAttributes\n  randomAssignButtonProps?: ButtonHTMLAttributes\n  manualAssignButtonProps?: ButtonHTMLAttributes\n  addRoomButtonProps?: ButtonHTMLAttributes\n  saveRoomsButtonProps?: ButtonHTMLAttributes\n  newParticipantFieldProps?: HTMLAttributes\n  newParticipantLabelProps?: LabelHTMLAttributes\n  newParticipantSelectProps?: SelectHTMLAttributes\n  roomsContainerProps?: HTMLAttributes\n  startButtonProps?: ButtonHTMLAttributes\n  stopButtonProps?: ButtonHTMLAttributes\n  numRoomsLabel?: VNodeChild\n  newParticipantActionLabel?: VNodeChild\n  randomAssignButtonLabel?: VNodeChild\n  manualAssignButtonLabel?: VNodeChild\n  addRoomButtonLabel?: VNodeChild\n  saveRoomsButtonLabel?: VNodeChild\n  startBreakoutButtonLabel?: VNodeChild\n  updateBreakoutButtonLabel?: VNodeChild\n  stopBreakoutButtonLabel?: VNodeChild\n  renderHeader?: (options: { defaultHeader: VNodeChild }) => VNodeChild\n  renderControls?: (options: { defaultControls: VNodeChild }) => VNodeChild\n  renderRoomList?: (options: {\n    defaultRoomList: VNodeChild\n    rooms: BreakoutParticipant[][]\n  }) => VNodeChild\n  renderStartButton?: (options: {\n    defaultStartButton: VNodeChild\n    isUpdating: boolean\n  }) => VNodeChild\n  renderStopButton?: (options: { defaultStopButton: VNodeChild }) => VNodeChild\n  renderBody?: (options: { defaultBody: VNodeChild }) => VNodeChild\n  renderContent?: (options: { defaultContent: VNodeChild }) => VNodeChild\n}\n\nconst props = withDefaults(defineProps<BreakoutRoomsModalOptions>(), {\n  backgroundColor: '#83c0e9',\n  position: 'topRight',\n  title: () => h('span', [\n    'Breakout Rooms ',\n    h(FontAwesomeIcon, { icon: faDoorOpen })\n  ]),\n  overlayProps: undefined,\n  contentProps: undefined,\n  headerProps: undefined,\n  titleProps: undefined,\n  closeButtonProps: undefined,\n  closeIconComponent: undefined,\n  headerDividerProps: undefined,\n  bodyProps: undefined,\n  controlsWrapperProps: undefined,\n  numRoomsFieldProps: undefined,\n  numRoomsLabelProps: undefined,\n  numRoomsInputProps: undefined,\n  actionsWrapperProps: undefined,\n  randomAssignButtonProps: undefined,\n  manualAssignButtonProps: undefined,\n  addRoomButtonProps: undefined,\n  saveRoomsButtonProps: undefined,\n  newParticipantFieldProps: undefined,\n  newParticipantLabelProps: undefined,\n  newParticipantSelectProps: undefined,\n  roomsContainerProps: undefined,\n  startButtonProps: undefined,\n  stopButtonProps: undefined,\n  numRoomsLabel: undefined,\n  newParticipantActionLabel: undefined,\n  randomAssignButtonLabel: undefined,\n  manualAssignButtonLabel: undefined,\n  addRoomButtonLabel: undefined,\n  saveRoomsButtonLabel: undefined,\n  startBreakoutButtonLabel: undefined,\n  updateBreakoutButtonLabel: undefined,\n  stopBreakoutButtonLabel: undefined,\n  renderHeader: undefined,\n  renderControls: undefined,\n  renderRoomList: undefined,\n  renderStartButton: undefined,\n  renderStopButton: undefined,\n  renderBody: undefined,\n  renderContent: undefined\n});\n\n// State\nconst numRooms = ref<string>('');\nconst newParticipantAction = ref<string>('autoAssignNewRoom');\nconst currentRoom = ref<BreakoutParticipant[]>([]);\nconst currentRoomIndex = ref<number | null>(null);\nconst editRoomModalVisible = ref<boolean>(false);\nconst startBreakoutButtonVisible = ref<boolean>(false);\nconst stopBreakoutButtonVisible = ref<boolean>(false);\n\n// Refs\nconst participantsRef = ref<Participant[]>([]);\nconst breakoutRoomsRef = ref<BreakoutParticipant[][]>([]);\n\n// Reactive computed access to parameters\nconst participants = computed(() => props.parameters.participants);\nconst showAlert = computed(() => props.parameters.showAlert);\nconst socket = computed(() => props.parameters.socket);\nconst itemPageLimit = computed(() => props.parameters.itemPageLimit);\nconst meetingDisplayType = computed(() => props.parameters.meetingDisplayType);\nconst prevMeetingDisplayType = computed(() => props.parameters.prevMeetingDisplayType);\nconst roomName = computed(() => props.parameters.roomName);\nconst shareScreenStarted = computed(() => props.parameters.shareScreenStarted);\nconst shared = computed(() => props.parameters.shared);\nconst breakOutRoomStarted = computed(() => props.parameters.breakOutRoomStarted);\nconst breakOutRoomEnded = computed(() => props.parameters.breakOutRoomEnded);\nconst breakoutRooms = computed(() => props.parameters.breakoutRooms);\nconst canStartBreakout = computed(() => props.parameters.canStartBreakout);\nconst localSocket = computed(() => props.parameters.localSocket);\nconst updateBreakOutRoomStarted = computed(() => props.parameters.updateBreakOutRoomStarted);\nconst updateBreakOutRoomEnded = computed(() => props.parameters.updateBreakOutRoomEnded);\nconst updateBreakoutRooms = computed(() => props.parameters.updateBreakoutRooms);\nconst updateMeetingDisplayType = computed(() => props.parameters.updateMeetingDisplayType);\n\nconst normalizeBreakoutAssignment = <T extends { breakRoom?: number | null }>(\n  participant: T,\n  fallback: number | null\n): T => (\n  participant.breakRoom === undefined\n    ? ({ ...participant, breakRoom: fallback } as T)\n    : participant\n);\n\nconst sanitizeParticipants = (people: Participant[]): Participant[] =>\n  people\n    .filter((p) => p.name !== 'screenShare' && p.name !== 'screen')\n    .map((participant) => normalizeBreakoutAssignment(participant, null));\n\nconst sanitizeRooms = (rooms: BreakoutParticipant[][]): BreakoutParticipant[][] =>\n  rooms.map((room, index) =>\n    room.map((participant) => normalizeBreakoutAssignment(participant, index))\n  );\n\n// Initialize refs\nonMounted(() => {\n  if (props.isVisible) {\n    // Filter out host (islevel = '2') and screen participants\n    const filteredParticipants = participants.value.filter((participant: Participant) => participant.islevel != '2');\n    participantsRef.value = sanitizeParticipants(filteredParticipants);\n    breakoutRoomsRef.value = breakoutRooms.value && breakoutRooms.value.length > 0 ? sanitizeRooms(breakoutRooms.value) : [];\n    checkCanStartBreakout();\n  }\n});\n\n// Watch for visibility changes\nwatch(\n  () => props.isVisible,\n  (newVisible) => {\n    if (newVisible) {\n      const filteredParticipants = participants.value.filter((participant: Participant) => participant.islevel != '2');\n      participantsRef.value = sanitizeParticipants(filteredParticipants);\n      breakoutRoomsRef.value = breakoutRooms.value && breakoutRooms.value.length > 0 ? sanitizeRooms(breakoutRooms.value) : [];\n      checkCanStartBreakout();\n    }\n  }\n);\n\n// Watch for changes\nwatch(\n  () => props.parameters.participants,\n  (newParticipants) => {\n    if (props.isVisible) {\n      const filteredParticipants = newParticipants.filter((participant: Participant) => participant.islevel != '2');\n      participantsRef.value = sanitizeParticipants(filteredParticipants);\n    }\n  }\n);\n\nwatch(\n  () => props.parameters.breakoutRooms,\n  (newRooms) => {\n    if (props.isVisible) {\n      breakoutRoomsRef.value = newRooms && newRooms.length > 0 ? sanitizeRooms(newRooms) : [];\n    }\n  }\n);\n\nwatch(\n  () => props.parameters.canStartBreakout,\n  () => {\n    checkCanStartBreakout();\n  }\n);\n\n// Check if can start breakout\nconst checkCanStartBreakout = () => {\n  if (canStartBreakout.value) {\n    startBreakoutButtonVisible.value = true;\n    stopBreakoutButtonVisible.value = breakOutRoomStarted.value && !breakOutRoomEnded.value;\n  } else {\n    startBreakoutButtonVisible.value = false;\n    stopBreakoutButtonVisible.value = false;\n  }\n};\n\n// Validate rooms\nconst validateRooms = (): boolean => {\n  if (breakoutRoomsRef.value.length === 0) {\n    showAlert.value?.({ message: 'There must be at least one room', type: 'danger' });\n    return false;\n  }\n\n  for (let room of breakoutRoomsRef.value) {\n    if (room.length === 0) {\n      showAlert.value?.({ message: 'Rooms must not be empty', type: 'danger' });\n      return false;\n    }\n\n    const participantNames = room.map((p) => p.name);\n    const uniqueNames = new Set(participantNames);\n    if (participantNames.length !== uniqueNames.size) {\n      showAlert.value?.({ message: 'Duplicate participant names in a room', type: 'danger' });\n      return false;\n    }\n\n    if (room.length > itemPageLimit.value) {\n      showAlert.value?.({ message: 'A room exceeds the participant limit', type: 'danger' });\n      return false;\n    }\n  }\n\n  return true;\n};\n\n// Random assign\nconst handleRandomAssign = () => {\n  const numRoomsInt = parseInt(numRooms.value);\n  if (isNaN(numRoomsInt) || numRoomsInt <= 0) {\n    showAlert.value?.({ message: 'Please enter a valid number of rooms', type: 'danger' });\n    return;\n  }\n\n  const newBreakoutRooms: BreakoutParticipant[][] = Array.from({ length: numRoomsInt }, () => []);\n  const shuffledParticipants = [...participantsRef.value].sort(() => 0.5 - Math.random());\n\n  shuffledParticipants.forEach((participant, index) => {\n    const roomIndex = index % numRoomsInt;\n    const targetRoom = newBreakoutRooms[roomIndex];\n    if (targetRoom && targetRoom.length < itemPageLimit.value) {\n      const participant_: BreakoutParticipant = { name: participant.name, breakRoom: roomIndex };\n      targetRoom.push(participant_);\n      participant.breakRoom = roomIndex;\n    } else {\n      for (let i = 0; i < numRoomsInt; i++) {\n        const room = newBreakoutRooms[i];\n        if (room && room.length < itemPageLimit.value) {\n          room.push(participant);\n          participant.breakRoom = i;\n          break;\n        }\n      }\n    }\n  });\n\n  breakoutRoomsRef.value = newBreakoutRooms;\n  checkCanStartBreakout();\n};\n\n// Manual assign\nconst handleManualAssign = () => {\n  const numRoomsInt = parseInt(numRooms.value);\n  if (isNaN(numRoomsInt) || numRoomsInt <= 0) {\n    showAlert.value?.({ message: 'Please enter a valid number of rooms', type: 'danger' });\n    return;\n  }\n\n  breakoutRoomsRef.value = Array.from({ length: numRoomsInt }, () => []);\n  props.parameters.updateCanStartBreakout(false);\n  checkCanStartBreakout();\n};\n\n// Add room\nconst handleAddRoom = () => {\n  breakoutRoomsRef.value = [...breakoutRoomsRef.value, []];\n  props.parameters.updateCanStartBreakout(false);\n  checkCanStartBreakout();\n};\n\n// Save rooms\nconst handleSaveRooms = () => {\n  if (validateRooms()) {\n    updateBreakoutRooms.value(breakoutRoomsRef.value);\n    props.parameters.updateCanStartBreakout(true);\n    checkCanStartBreakout();\n    showAlert.value?.({ message: 'Rooms saved successfully', type: 'success' });\n  } else {\n    showAlert.value?.({ message: 'Rooms validation failed', type: 'danger' });\n  }\n};\n\n// Edit room\nconst handleEditRoom = (roomIndex: number) => {\n  currentRoomIndex.value = roomIndex;\n  const room = breakoutRoomsRef.value[roomIndex];\n  if (room) {\n    currentRoom.value = room;\n  }\n  editRoomModalVisible.value = true;\n  props.parameters.updateCanStartBreakout(false);\n  checkCanStartBreakout();\n};\n\n// Delete room\nconst handleDeleteRoom = (roomIndex: number) => {\n  const room = breakoutRoomsRef.value[roomIndex];\n  if (room) {\n    room.forEach((participant) => (participant.breakRoom = null));\n  }\n  const newBreakoutRooms = [...breakoutRoomsRef.value];\n  newBreakoutRooms.splice(roomIndex, 1);\n\n  newBreakoutRooms.forEach((room, index) => {\n    room.forEach((participant) => (participant.breakRoom = index));\n  });\n\n  breakoutRoomsRef.value = newBreakoutRooms;\n  checkCanStartBreakout();\n};\n\n// Add participant to room\nconst handleAddParticipant = (roomIndex: number, participant: Participant | BreakoutParticipant) => {\n  const room = breakoutRoomsRef.value[roomIndex];\n  if (room && room.length < itemPageLimit.value) {\n    const newBreakoutRooms = [...breakoutRoomsRef.value];\n    const participant_: BreakoutParticipant = { name: participant.name, breakRoom: roomIndex };\n    newBreakoutRooms[roomIndex]?.push(participant_);\n    breakoutRoomsRef.value = newBreakoutRooms;\n    participant.breakRoom = roomIndex;\n    if (currentRoomIndex.value != null) {\n      handleEditRoom(currentRoomIndex.value);\n    }\n  } else {\n    showAlert.value?.({ message: 'Room is full', type: 'danger' });\n  }\n};\n\n// Remove participant from room\nconst handleRemoveParticipant = (roomIndex: number, participant: Participant | BreakoutParticipant) => {\n  const newBreakoutRooms = [...breakoutRoomsRef.value];\n  const room = newBreakoutRooms[roomIndex];\n  if (room) {\n    newBreakoutRooms[roomIndex] = room.filter((p) => p !== participant);\n  }\n  breakoutRoomsRef.value = newBreakoutRooms;\n  participant.breakRoom = null;\n  if (currentRoomIndex.value != null) {\n    handleEditRoom(currentRoomIndex.value);\n  }\n};\n\n// Start breakout\nconst handleStartBreakoutClick = () => {\n  if (shareScreenStarted.value || shared.value) {\n    showAlert.value?.({ message: 'You cannot start breakout rooms while screen sharing is active', type: 'danger' });\n    return;\n  }\n\n  if (canStartBreakout.value) {\n    handleStartBreakout({\n      socket: socket.value as Socket,\n      localSocket: localSocket.value as Socket | undefined,\n      breakoutRooms: breakoutRoomsRef.value,\n      newParticipantAction: newParticipantAction.value,\n      roomName: roomName.value,\n      breakOutRoomStarted: breakOutRoomStarted.value,\n      breakOutRoomEnded: breakOutRoomEnded.value,\n      showAlert: showAlert.value,\n      updateBreakOutRoomStarted: updateBreakOutRoomStarted.value,\n      updateBreakOutRoomEnded: updateBreakOutRoomEnded.value,\n      onBreakoutRoomsClose: props.onBreakoutRoomsClose,\n      meetingDisplayType: meetingDisplayType.value,\n      updateMeetingDisplayType: updateMeetingDisplayType.value,\n    });\n  }\n};\n\n// Stop breakout\nconst handleStopBreakoutClick = () => {\n  handleStopBreakout({\n    socket: socket.value as Socket,\n    localSocket: localSocket.value as Socket | undefined,\n    roomName: roomName.value,\n    showAlert: showAlert.value,\n    updateBreakOutRoomStarted: updateBreakOutRoomStarted.value,\n    updateBreakOutRoomEnded: updateBreakOutRoomEnded.value,\n    onBreakoutRoomsClose: props.onBreakoutRoomsClose,\n    meetingDisplayType: meetingDisplayType.value,\n    prevMeetingDisplayType: prevMeetingDisplayType.value,\n    updateMeetingDisplayType: updateMeetingDisplayType.value,\n  });\n};\n\n// Set edit room modal visibility\nconst setEditRoomModalVisible = (visible: boolean) => {\n  editRoomModalVisible.value = visible;\n};\n\n// Inline RenderVNode component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Function] as PropType<VNodeChild>,\n      default: null\n    }\n  },\n  setup(props) {\n    return () => {\n      const node = props.node\n      if (isVNode(node)) {\n        return node\n      } else if (typeof node === 'function') {\n        return (node as () => VNodeChild)()\n      } else {\n        return node\n      }\n    }\n  }\n})\n\n// Helper function\nconst joinClassNames = (classes: (string | undefined)[]): string | undefined => {\n  const filtered = classes.filter(Boolean)\n  return filtered.length > 0 ? filtered.join(' ').trim() : undefined\n}\n\n// Computed properties for styles\nconst defaultOverlayWidth = typeof window !== 'undefined' ? Math.min(window.innerWidth * 0.9, 600) : 360\n\nconst overlayStyle = computed((): CSSProperties => ({\n  position: 'fixed' as const,\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  display: props.isVisible ? 'block' : 'none',\n  zIndex: 999,\n  ...(props.overlayProps?.style as CSSProperties || {})\n}))\n\nconst overlayClassName = computed(() => \n  joinClassNames(['mediasfu-breakout-modal', props.overlayProps?.class as string])\n)\n\nconst contentStyle = computed((): CSSProperties => ({\n  position: 'fixed' as const,\n  backgroundColor: props.backgroundColor,\n  borderRadius: '10px',\n  padding: '10px',\n  width: `${defaultOverlayWidth}px`,\n  maxHeight: '65%',\n  overflowY: 'auto' as const,\n  top: props.position.includes('top') ? '10px' : 'auto',\n  bottom: props.position.includes('bottom') ? '10px' : 'auto',\n  left: props.position.includes('Left') ? '10px' : 'auto',\n  right: props.position.includes('Right') ? '10px' : 'auto',\n  ...(props.contentProps?.style as CSSProperties || {})\n}))\n\nconst contentClassName = computed(() => \n  joinClassNames(['mediasfu-breakout-modal__content', props.contentProps?.class as string])\n)\n\n// Main overlay node\nconst overlayNode = computed(() => {\n  const defaultCloseIcon = props.closeIconComponent ?? h(FontAwesomeIcon, { icon: faTimes, size: 'xl' })\n  \n  const defaultHeaderNode = h('div', {\n    class: joinClassNames(['modal-header', props.headerProps?.class as string]),\n    style: { ...(props.headerProps?.style as CSSProperties || {}) },\n    ...(props.headerProps ? Object.fromEntries(\n      Object.entries(props.headerProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    h('h2', {\n      class: joinClassNames(['modal-title', props.titleProps?.class as string]),\n      style: { ...(props.titleProps?.style as CSSProperties || {}) },\n      ...(props.titleProps ? Object.fromEntries(\n        Object.entries(props.titleProps).filter(([key]) => !['class', 'style'].includes(key))\n      ) : {})\n    }, typeof props.title === 'string' || typeof props.title === 'number' ? [props.title] : (props.title || [])),\n    h('button', {\n      class: joinClassNames(['close-button', props.closeButtonProps?.class as string]),\n      style: { ...(props.closeButtonProps?.style as CSSProperties || {}) },\n      onClick: (event: MouseEvent) => {\n        if (props.closeButtonProps?.onClick) {\n          (props.closeButtonProps.onClick as (event: MouseEvent) => void)(event)\n        }\n        if (!event.defaultPrevented) {\n          props.onBreakoutRoomsClose()\n        }\n      },\n      ...(props.closeButtonProps ? Object.fromEntries(\n        Object.entries(props.closeButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {})\n    }, [defaultCloseIcon])\n  ])\n  \n  const headerNode = props.renderHeader\n    ? props.renderHeader({ defaultHeader: defaultHeaderNode })\n    : defaultHeaderNode\n  \n  const dividerNode = h('hr', {\n    class: 'divider',\n    style: { ...(props.headerDividerProps?.style as CSSProperties || {}) },\n    ...(props.headerDividerProps ? Object.fromEntries(\n      Object.entries(props.headerDividerProps).filter(([key]) => key !== 'style')\n    ) : {})\n  })\n  \n  // Controls section\n  const defaultControlsNode = h('div', { style: { display: 'flex', flexDirection: 'column', gap: '10px' } }, [\n    // Number of Rooms Input\n    h('div', {\n      class: joinClassNames(['form-group', props.numRoomsFieldProps?.class as string]),\n      style: { ...(props.numRoomsFieldProps?.style as CSSProperties || {}) },\n      ...(props.numRoomsFieldProps ? Object.fromEntries(\n        Object.entries(props.numRoomsFieldProps).filter(([key]) => !['class', 'style'].includes(key))\n      ) : {})\n    }, [\n      h('label', {\n        for: 'numRooms',\n        class: props.numRoomsLabelProps?.class,\n        style: { ...(props.numRoomsLabelProps?.style as CSSProperties || {}) },\n        ...(props.numRoomsLabelProps ? Object.fromEntries(\n          Object.entries(props.numRoomsLabelProps).filter(([key]) => !['class', 'style', 'for'].includes(key))\n        ) : {})\n      }, [\n        props.numRoomsLabel || 'Number of Rooms ',\n        h(FontAwesomeIcon, { icon: faUsers })\n      ]),\n      h('input', {\n        id: 'numRooms',\n        type: 'number',\n        class: joinClassNames(['form-control', props.numRoomsInputProps?.class as string]),\n        style: { ...(props.numRoomsInputProps?.style as CSSProperties || {}) },\n        value: numRooms.value,\n        onInput: (event: Event) => {\n          numRooms.value = (event.target as HTMLInputElement).value\n          if (props.numRoomsInputProps?.onInput) {\n            (props.numRoomsInputProps.onInput as (event: Event) => void)(event)\n          }\n        },\n        ...(props.numRoomsInputProps ? Object.fromEntries(\n          Object.entries(props.numRoomsInputProps).filter(([key]) => !['class', 'style', 'value', 'onInput'].includes(key))\n        ) : {})\n      })\n    ]),\n    \n    // Action Buttons\n    h('div', {\n      class: joinClassNames(['action-buttons', props.actionsWrapperProps?.class as string]),\n      style: { ...(props.actionsWrapperProps?.style as CSSProperties || {}) },\n      ...(props.actionsWrapperProps ? Object.fromEntries(\n        Object.entries(props.actionsWrapperProps).filter(([key]) => !['class', 'style'].includes(key))\n      ) : {})\n    }, [\n      h('button', {\n        class: joinClassNames(['btn btn-primary', props.randomAssignButtonProps?.class as string]),\n        style: { ...(props.randomAssignButtonProps?.style as CSSProperties || {}) },\n        onClick: (event: MouseEvent) => {\n          if (props.randomAssignButtonProps?.onClick) {\n            (props.randomAssignButtonProps.onClick as (event: MouseEvent) => void)(event)\n          }\n          if (!event.defaultPrevented) {\n            handleRandomAssign()\n          }\n        },\n        ...(props.randomAssignButtonProps ? Object.fromEntries(\n          Object.entries(props.randomAssignButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n        ) : {})\n      }, [\n        props.randomAssignButtonLabel || 'Random Assign ',\n        h(FontAwesomeIcon, { icon: faRandom })\n      ]),\n      h('button', {\n        class: joinClassNames(['btn btn-secondary', props.manualAssignButtonProps?.class as string]),\n        style: { ...(props.manualAssignButtonProps?.style as CSSProperties || {}) },\n        onClick: (event: MouseEvent) => {\n          if (props.manualAssignButtonProps?.onClick) {\n            (props.manualAssignButtonProps.onClick as (event: MouseEvent) => void)(event)\n          }\n          if (!event.defaultPrevented) {\n            handleManualAssign()\n          }\n        },\n        ...(props.manualAssignButtonProps ? Object.fromEntries(\n          Object.entries(props.manualAssignButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n        ) : {})\n      }, [\n        props.manualAssignButtonLabel || 'Manual Assign ',\n        h(FontAwesomeIcon, { icon: faHandPointer })\n      ]),\n      h('button', {\n        class: joinClassNames(['btn btn-success', props.addRoomButtonProps?.class as string]),\n        style: { ...(props.addRoomButtonProps?.style as CSSProperties || {}) },\n        onClick: (event: MouseEvent) => {\n          if (props.addRoomButtonProps?.onClick) {\n            (props.addRoomButtonProps.onClick as (event: MouseEvent) => void)(event)\n          }\n          if (!event.defaultPrevented) {\n            handleAddRoom()\n          }\n        },\n        ...(props.addRoomButtonProps ? Object.fromEntries(\n          Object.entries(props.addRoomButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n        ) : {})\n      }, [\n        props.addRoomButtonLabel || 'Add Room ',\n        h(FontAwesomeIcon, { icon: faPlus })\n      ]),\n      h('button', {\n        class: joinClassNames(['btn btn-info', props.saveRoomsButtonProps?.class as string]),\n        style: { ...(props.saveRoomsButtonProps?.style as CSSProperties || {}) },\n        onClick: (event: MouseEvent) => {\n          if (props.saveRoomsButtonProps?.onClick) {\n            (props.saveRoomsButtonProps.onClick as (event: MouseEvent) => void)(event)\n          }\n          if (!event.defaultPrevented) {\n            handleSaveRooms()\n          }\n        },\n        ...(props.saveRoomsButtonProps ? Object.fromEntries(\n          Object.entries(props.saveRoomsButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n        ) : {})\n      }, [\n        props.saveRoomsButtonLabel || 'Save Rooms ',\n        h(FontAwesomeIcon, { icon: faSave })\n      ])\n    ]),\n    \n    // New Participant Action\n    h('div', {\n      class: joinClassNames(['form-group', props.newParticipantFieldProps?.class as string]),\n      style: { ...(props.newParticipantFieldProps?.style as CSSProperties || {}) },\n      ...(props.newParticipantFieldProps ? Object.fromEntries(\n        Object.entries(props.newParticipantFieldProps).filter(([key]) => !['class', 'style'].includes(key))\n      ) : {})\n    }, [\n      h('label', {\n        for: 'newParticipantAction',\n        class: props.newParticipantLabelProps?.class,\n        style: { ...(props.newParticipantLabelProps?.style as CSSProperties || {}) },\n        ...(props.newParticipantLabelProps ? Object.fromEntries(\n          Object.entries(props.newParticipantLabelProps).filter(([key]) => !['class', 'style', 'for'].includes(key))\n        ) : {})\n      }, [\n        props.newParticipantActionLabel || 'New Participant Action ',\n        h(FontAwesomeIcon, { icon: faUsers })\n      ]),\n      h('select', {\n        id: 'newParticipantAction',\n        class: joinClassNames(['form-control', props.newParticipantSelectProps?.class as string]),\n        style: { ...(props.newParticipantSelectProps?.style as CSSProperties || {}) },\n        value: newParticipantAction.value,\n        onChange: (event: Event) => {\n          newParticipantAction.value = (event.target as HTMLSelectElement).value\n          if (props.newParticipantSelectProps?.onChange) {\n            (props.newParticipantSelectProps.onChange as (event: Event) => void)(event)\n          }\n        },\n        ...(props.newParticipantSelectProps ? Object.fromEntries(\n          Object.entries(props.newParticipantSelectProps).filter(([key]) => !['class', 'style', 'value', 'onChange'].includes(key))\n        ) : {})\n      }, [\n        h('option', { value: 'autoAssignNewRoom' }, 'Add to new room'),\n        h('option', { value: 'autoAssignAvailableRoom' }, 'Add to open room'),\n        h('option', { value: 'manualAssign' }, 'No action')\n      ])\n    ])\n  ])\n  \n  const controlsNode = props.renderControls\n    ? props.renderControls({ defaultControls: defaultControlsNode })\n    : defaultControlsNode\n  \n  // Room List\n  const defaultRoomListNode = h('div', {\n    class: props.roomsContainerProps?.class,\n    style: { ...(props.roomsContainerProps?.style as CSSProperties || {}) },\n    ...(props.roomsContainerProps ? Object.fromEntries(\n      Object.entries(props.roomsContainerProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    h(RoomList, {\n      rooms: breakoutRoomsRef.value,\n      handleEditRoom: handleEditRoom,\n      handleDeleteRoom: handleDeleteRoom,\n      handleRemoveParticipant: handleRemoveParticipant\n    })\n  ])\n  \n  const roomListNode = props.renderRoomList\n    ? props.renderRoomList({\n        defaultRoomList: defaultRoomListNode,\n        rooms: breakoutRoomsRef.value\n      })\n    : defaultRoomListNode\n  \n  const isUpdating = breakOutRoomStarted.value && !breakOutRoomEnded.value\n  \n  // Start/Update Button\n  const defaultStartButtonNode = startBreakoutButtonVisible.value ? h('button', {\n    class: joinClassNames(['btn btn-primary mr-2 mb-2', props.startButtonProps?.class as string]),\n    style: { ...(props.startButtonProps?.style as CSSProperties || {}) },\n    onClick: (event: MouseEvent) => {\n      if (props.startButtonProps?.onClick) {\n        (props.startButtonProps.onClick as (event: MouseEvent) => void)(event)\n      }\n      if (!event.defaultPrevented) {\n        handleStartBreakoutClick()\n      }\n    },\n    ...(props.startButtonProps ? Object.fromEntries(\n      Object.entries(props.startButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n    ) : {})\n  }, [\n    isUpdating\n      ? (props.updateBreakoutButtonLabel || 'Update Breakout ')\n      : (props.startBreakoutButtonLabel || 'Start Breakout '),\n    h(FontAwesomeIcon, { icon: isUpdating ? faSyncAlt : faPlay })\n  ]) : null\n  \n  const startButtonNode = props.renderStartButton\n    ? props.renderStartButton({\n        defaultStartButton: defaultStartButtonNode,\n        isUpdating\n      })\n    : defaultStartButtonNode\n  \n  // Stop Button\n  const defaultStopButtonNode = stopBreakoutButtonVisible.value ? h('button', {\n    class: joinClassNames(['btn btn-danger mr-2 mb-2', props.stopButtonProps?.class as string]),\n    style: { ...(props.stopButtonProps?.style as CSSProperties || {}) },\n    onClick: (event: MouseEvent) => {\n      if (props.stopButtonProps?.onClick) {\n        (props.stopButtonProps.onClick as (event: MouseEvent) => void)(event)\n      }\n      if (!event.defaultPrevented) {\n        handleStopBreakoutClick()\n      }\n    },\n    ...(props.stopButtonProps ? Object.fromEntries(\n      Object.entries(props.stopButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n    ) : {})\n  }, [\n    props.stopBreakoutButtonLabel || 'Stop Breakout ',\n    h(FontAwesomeIcon, { icon: faStop })\n  ]) : null\n  \n  const stopButtonNode = props.renderStopButton\n    ? props.renderStopButton({ defaultStopButton: defaultStopButtonNode })\n    : defaultStopButtonNode\n  \n  const defaultBodyNode = h('div', {\n    class: joinClassNames(['modal-content', props.bodyProps?.class as string]),\n    style: { ...(props.bodyProps?.style as CSSProperties || {}) },\n    ...(props.bodyProps ? Object.fromEntries(\n      Object.entries(props.bodyProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    headerNode,\n    dividerNode,\n    controlsNode,\n    roomListNode,\n    startButtonNode,\n    stopButtonNode\n  ].filter(Boolean))\n  \n  const bodyNode = props.renderBody\n    ? props.renderBody({ defaultBody: defaultBodyNode })\n    : defaultBodyNode\n  \n  const defaultContentNode = h('div', {\n    class: contentClassName.value,\n    style: contentStyle.value,\n    ...(props.contentProps ? Object.fromEntries(\n      Object.entries(props.contentProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [bodyNode])\n  \n  const contentNode = props.renderContent\n    ? props.renderContent({ defaultContent: defaultContentNode })\n    : defaultContentNode\n  \n  return h('div', {\n    class: overlayClassName.value,\n    style: overlayStyle.value,\n    ...(props.overlayProps ? Object.fromEntries(\n      Object.entries(props.overlayProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [contentNode])\n})\n</script>\n\n<style scoped>\n.modal-overlay {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background-color: rgba(0, 0, 0, 0.5);\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  z-index: 999;\n}\n\n.modal-container {\n  background-color: #f5f5f5;\n  border-radius: 10px;\n  padding: 0;\n  max-width: 700px;\n  width: 90%;\n  max-height: 85vh;\n  overflow-y: auto;\n  box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n}\n\n.modal-content {\n  padding: 20px;\n}\n\n.modal-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-bottom: 15px;\n}\n\n.modal-title {\n  font-size: 1.75rem;\n  font-weight: bold;\n  color: black;\n  margin: 0;\n}\n\n.close-button {\n  border: none;\n  background: none;\n  cursor: pointer;\n  padding: 0;\n  color: black;\n  font-size: 20px;\n}\n\n.close-button:hover {\n  opacity: 0.7;\n}\n\n.divider {\n  height: 1px;\n  background-color: black;\n  border: none;\n  margin: 5px 0 15px 0;\n}\n\n.form-group {\n  margin-bottom: 15px;\n}\n\n.form-group label {\n  display: block;\n  font-weight: bold;\n  margin-bottom: 5px;\n  color: #333;\n}\n\n.form-control {\n  width: 100%;\n  padding: 8px 12px;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  font-size: 1rem;\n}\n\n.action-buttons {\n  display: flex;\n  justify-content: space-between;\n  gap: 10px;\n  margin-bottom: 15px;\n  flex-wrap: wrap;\n}\n\n.btn {\n  padding: 8px 16px;\n  border: none;\n  border-radius: 4px;\n  cursor: pointer;\n  font-size: 0.9rem;\n  transition: background-color 0.2s;\n  flex: 1;\n  min-width: 120px;\n}\n\n.btn-primary {\n  background-color: #007bff;\n  color: white;\n}\n\n.btn-primary:hover {\n  background-color: #0056b3;\n}\n\n.btn-secondary {\n  background-color: #6c757d;\n  color: white;\n}\n\n.btn-secondary:hover {\n  background-color: #545b62;\n}\n\n.btn-success {\n  background-color: #28a745;\n  color: white;\n}\n\n.btn-success:hover {\n  background-color: #1e7e34;\n}\n\n.btn-info {\n  background-color: #17a2b8;\n  color: white;\n}\n\n.btn-info:hover {\n  background-color: #117a8b;\n}\n\n.btn-danger {\n  background-color: #dc3545;\n  color: white;\n}\n\n.btn-danger:hover {\n  background-color: #a71d2a;\n}\n\n.mr-2 {\n  margin-right: 8px;\n}\n\n.mb-2 {\n  margin-bottom: 8px;\n}\n</style>\n","<!--\n/**\n * @fileoverview ConfigureWhiteboardModal - Whiteboard participant permissions management\n * @component ConfigureWhiteboardModal\n * @module components/whiteboardComponents/ConfigureWhiteboardModal\n * \n * @description\n * A modal for configuring whiteboard permissions and managing participant access. Allows\n * hosts to assign/revoke whiteboard privileges, start/stop whiteboard sessions, and control\n * which participants can draw on the shared whiteboard. Features dual-list interface with\n * assigned (can draw) and pending (cannot draw) participants, one-click permission toggles,\n * and real-time synchronization via Socket.io. Integrates with canvas streaming for recording\n * and screen sharing workflows.\n * \n * Key Features:\n * - Dual-list UI: Assigned participants (can draw) vs Pending (cannot draw)\n * - One-click add/remove permissions with visual feedback\n * - Start/Update/Stop whiteboard session controls\n * - Real-time permission sync via Socket.io 'whiteboardUpdated' event\n * - Automatic canvas stream capture on whiteboard start/update\n * - Integration with recording and screenshare workflows\n * - Empty state messages for both lists\n * - Save button to persist permission changes\n * - Host-only access control\n * - Responsive modal with configurable positioning\n * \n * User Roles:\n * - **Host (islevel='2')**: Full control - start/stop whiteboard, assign/revoke permissions\n * - **Participants**: Cannot open this modal - permissions managed by host\n * \n * Workflow:\n * 1. Host opens ConfigureWhiteboardModal from menu or whiteboard controls\n * 2. Modal displays two lists: Assigned (users with drawing rights) and Pending (users without)\n * 3. Host clicks \"+\" on pending user → moves to assigned list (can now draw)\n * 4. Host clicks \"−\" on assigned user → moves to pending list (loses drawing rights)\n * 5. Host clicks \"Save\" → Socket.io emits 'updateWhiteboard' with new permissions\n * 6. All clients receive 'whiteboardUpdated' event → UI updates in real-time\n * 7. Host clicks \"Start\" → whiteboard activates, canvas stream captured for recording/sharing\n * 8. Host clicks \"Update\" → re-captures canvas stream with current state\n * 9. Host clicks \"Stop\" → whiteboard deactivates, canvas stream stopped\n * \n * @example Basic Usage - Start Whiteboard Session\n * ```typescript\n * // <ConfigureWhiteboardModal\n *   // :isVisible=\"isWhiteboardConfigModalVisible\"\n *   // :onConfigureWhiteboardClose=\"() => setIsWhiteboardConfigModalVisible(false)\"\n *   // :parameters=\"{\n *     participants: allParticipants,\n *     showAlert: alertFunction,\n *     socket: socketConnection,\n *     roomName: 'room123',\n *     islevel: '2',\n *     eventType: 'conference',\n *     whiteboardStarted: false,\n *     whiteboardEnded: false,\n *     canStartWhiteboard: true,\n *     updateWhiteboardStarted: setWhiteboardStarted,\n *     updateWhiteboardEnded: setWhiteboardEnded,\n *     updateWhiteboardUsers: setWhiteboardUsers,\n *     onScreenChanges: handleScreenChanges,\n *     captureCanvasStream: captureCanvas,\n *     getUpdatedAllParams: getAllParams\n *   }\"\n * // />\n * ```\n * \n * @example With Custom Position and Background\n * ```typescript\n * // <ConfigureWhiteboardModal\n *   // :isVisible=\"true\"\n *   // :onConfigureWhiteboardClose=\"closeModal\"\n *   // position=\"topLeft\"\n *   // backgroundColor=\"#ffffff\"\n *   // :parameters=\"whiteboardParams\"\n * // />\n * ```\n * \n * @example Custom Empty States\n * ```typescript\n * // <ConfigureWhiteboardModal\n *   // :isVisible=\"true\"\n *   // :onConfigureWhiteboardClose=\"closeModal\"\n *   // emptyAssignedState=\"No participants have whiteboard access yet\"\n *   // emptyPendingState=\"All participants have whiteboard access\"\n *   // :parameters=\"whiteboardParams\"\n * // />\n * ```\n * \n * @example Custom List Renderers\n * ```typescript\n * // <script setup>\n * const customAssignedListRenderer = ({ defaultAssignedList, participants, removeParticipant }) => {\n *   // return h('div', { class: 'custom-assigned-list' }, [\n *     h('h4', `${participants.length} users can draw`),\n *     h('ul', participants.map(p => \n *       h('li', { key: p.name, class: 'assigned-item' }, [\n *         h('span', p.name),\n *         h('button', {\n *           class: 'remove-btn',\n *           onClick: () => removeParticipant(p)\n *         }, '✕ Remove')\n *       ])\n *     ))\n *   ]);\n * };\n * \n * const customPendingListRenderer = ({ defaultPendingList, participants, addParticipant }) => {\n *   // return h('div', { class: 'custom-pending-list' }, [\n *     h('h4', `${participants.length} users waiting for access`),\n *     h('ul', participants.map(p => \n *       h('li', { key: p.name, class: 'pending-item' }, [\n *         h('span', p.name),\n *         h('button', {\n *           class: 'add-btn',\n *           onClick: () => addParticipant(p)\n *         }, '+ Add')\n *       ])\n *     ))\n *   ]);\n * };\n * </script>\n * \n * // <template>\n *   <ConfigureWhiteboardModal\n *     :isVisible=\"true\"\n *     :onConfigureWhiteboardClose=\"closeModal\"\n *     :renderAssignedList=\"customAssignedListRenderer\"\n *     :renderPendingList=\"customPendingListRenderer\"\n *     :parameters=\"whiteboardParams\"\n *   />\n * </template>\n * ```\n * \n * @example Programmatic Whiteboard Control\n * ```typescript\n * // <script setup>\n * const startWhiteboardSession = async () => {\n *   // await handleStartWhiteboard({\n *     updateWhiteboardStarted: setWhiteboardStarted,\n *     updateWhiteboardEnded: setWhiteboardEnded,\n *     updateWhiteboardUsers: setWhiteboardUsers,\n *     updateCanStartWhiteboard: setCanStartWhiteboard,\n *     parameters: {\n *       ...whiteboardParams,\n *       canStartWhiteboard: true\n *     }\n *   });\n * };\n * \n * const stopWhiteboardSession = async () => {\n *   // await handleStopWhiteboard({\n *     whiteboardUsers: assignedUsers,\n *     socket: socket,\n *     roomName: 'room123',\n *     updateWhiteboardStarted: setWhiteboardStarted,\n *     updateWhiteboardEnded: setWhiteboardEnded,\n *     updateCanStartWhiteboard: setCanStartWhiteboard\n *   });\n * };\n * </script>\n * \n * // <template>\n *   <ConfigureWhiteboardModal\n *     :isVisible=\"true\"\n *     :onConfigureWhiteboardClose=\"closeModal\"\n *     :parameters=\"whiteboardParams\"\n *   />\n *   <button @click=\"startWhiteboardSession\">Start Whiteboard</button>\n *   <button @click=\"stopWhiteboardSession\">Stop Whiteboard</button>\n * </template>\n * ```\n * \n * @see {@link Whiteboard} for the main whiteboard canvas component\n * @see {@link handleStartWhiteboard} for whiteboard session start logic\n * @see {@link handleStopWhiteboard} for whiteboard session stop logic\n * @see {@link https://mediasfu.com/docs/whiteboard-config} for configuration documentation\n */\n-->\n<template>\n  <RenderVNode :node=\"overlayNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onUnmounted, h, isVNode, defineComponent, type PropType, type VNodeChild, type HTMLAttributes, type ButtonHTMLAttributes, type LiHTMLAttributes, type CSSProperties } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faTimes, faCheck, faSyncAlt, faPlay, faSave } from '@fortawesome/free-solid-svg-icons';\nimport { handleStartWhiteboard } from 'mediasfu-shared';\nimport { handleStopWhiteboard } from 'mediasfu-shared';\nimport type { Socket } from 'socket.io-client';\n\nexport interface Participant {\n  name: string;\n  islevel?: string;\n  useBoard?: boolean;\n  isBanned?: boolean;\n  [key: string]: unknown;\n}\n\nexport interface WhiteboardUser {\n  name: string;\n  useBoard: boolean;\n}\n\nexport interface WhiteboardUpdatedData {\n  members?: Participant[];\n  whiteboardUsers: WhiteboardUser[];\n  status: string;\n}\n\nexport type ShowAlert = (alert: { message: string; type: 'success' | 'danger'; duration?: number }) => void;\n\nexport interface OnScreenChangesOptions {\n  changed: boolean;\n  parameters: unknown;\n}\n\nexport interface CaptureCanvasStreamOptions {\n  parameters: unknown;\n}\n\nexport interface PrepopulateUserMediaOptions {\n  name: string;\n  parameters: unknown;\n}\n\nexport interface RePortOptions {\n  restart: boolean;\n  parameters: unknown;\n}\n\nexport type PrepopulateUserMediaResult = void | unknown[];\n\n/**\n * Parameters object for the ConfigureWhiteboardModal component\n * @interface ConfigureWhiteboardModalParameters\n * \n * @property {Participant[]} participants - Array of all participants in the room\n * @property {ShowAlert} [showAlert] - Alert function for user feedback messages\n * @property {Socket} socket - Socket.io connection for whiteboard permission updates\n * @property {number} itemPageLimit - Maximum items per page (pagination limit)\n * @property {string} islevel - User's permission level ('2' = host, '1' = participant)\n * @property {string} roomName - Room identifier for socket emissions\n * @property {string} eventType - Event type ('conference' | 'webinar' | 'broadcast' | 'chat')\n * @property {boolean} shareScreenStarted - Whether screen sharing is active\n * @property {boolean} shared - Whether any content is currently being shared\n * @property {boolean} breakOutRoomStarted - Whether breakout rooms are active\n * @property {boolean} breakOutRoomEnded - Whether breakout rooms have ended\n * @property {boolean} recordStarted - Whether recording has started\n * @property {boolean} recordResumed - Whether recording has resumed\n * @property {boolean} recordPaused - Whether recording is paused\n * @property {boolean} recordStopped - Whether recording has stopped\n * @property {string} recordingMediaOptions - Recording media type ('video' | 'audio' | 'all')\n * @property {boolean} canStartWhiteboard - Whether whiteboard can be started (permission check)\n * @property {boolean} whiteboardStarted - Whether whiteboard session has started\n * @property {boolean} whiteboardEnded - Whether whiteboard session has ended\n * @property {string} hostLabel - Label for the host user (default: 'Host')\n * \n * @property {(started: boolean) => void} updateWhiteboardStarted - Function to update whiteboard started state\n * @property {(ended: boolean) => void} updateWhiteboardEnded - Function to update whiteboard ended state\n * @property {(users: WhiteboardUser[]) => void} updateWhiteboardUsers - Function to update whiteboard users array\n * @property {(canStart: boolean) => void} updateCanStartWhiteboard - Function to update whiteboard start permission\n * @property {(isVisible: boolean) => void} updateIsConfigureWhiteboardModalVisible - Function to control modal visibility\n * \n * @property {Function} onScreenChanges - Function to handle screen orientation/size changes\n * @property {Function} captureCanvasStream - Function to capture whiteboard canvas as MediaStream\n * @property {Function} prepopulateUserMedia - Function to prepare user media for streaming\n * @property {Function} rePort - Function to restart media producers after changes\n * @property {() => ConfigureWhiteboardModalParameters} getUpdatedAllParams - Function to retrieve updated parameters\n * \n * @example\n * ```ts\n * const configureWhiteboardParams = {\n *   // participants: allParticipants,\n *   // showAlert: (alert) => console.log(alert.message),\n *   // socket: socketConnection,\n *   // itemPageLimit: 10,\n *   // islevel: '2',\n *   // roomName: 'room123',\n *   // eventType: 'conference',\n *   // shareScreenStarted: false,\n *   // shared: false,\n *   // breakOutRoomStarted: false,\n *   // breakOutRoomEnded: false,\n *   // recordStarted: true,\n *   // recordResumed: false,\n *   // recordPaused: false,\n *   // recordStopped: false,\n *   // recordingMediaOptions: 'video',\n *   // canStartWhiteboard: true,\n *   // whiteboardStarted: false,\n *   // whiteboardEnded: false,\n *   // hostLabel: 'Host',\n *   // updateWhiteboardStarted: (started) => { whiteboardStarted.value = started; },\n *   // updateWhiteboardEnded: (ended) => { whiteboardEnded.value = ended; },\n *   // updateWhiteboardUsers: (users) => { whiteboardUsers.value = users; },\n *   // updateCanStartWhiteboard: (canStart) => { canStartWb.value = canStart; },\n *   // updateIsConfigureWhiteboardModalVisible: (visible) => { modalVisible.value = visible; },\n *   // onScreenChanges: async ({ changed, parameters }) => {\n *     if (changed) await adjustForOrientation(parameters);\n *   },\n *   // captureCanvasStream: async ({ parameters }) => {\n *     await streamWhiteboardCanvas(parameters);\n *   },\n *   // prepopulateUserMedia: async ({ name, parameters }) => {\n *     return await setupUserMedia(name, parameters);\n *   },\n *   // rePort: async ({ restart, parameters }) => {\n *     if (restart) await restartProducers(parameters);\n *   },\n *   // getUpdatedAllParams: () => ({ ...configureWhiteboardParams })\n * };\n * ```\n */\nexport interface ConfigureWhiteboardModalParameters {\n  participants: Participant[];\n  showAlert?: ShowAlert;\n  socket: Socket;\n  itemPageLimit: number;\n  islevel: string;\n  roomName: string;\n  eventType: string;\n  shareScreenStarted: boolean;\n  shared: boolean;\n  breakOutRoomStarted: boolean;\n  breakOutRoomEnded: boolean;\n  recordStarted: boolean;\n  recordResumed: boolean;\n  recordPaused: boolean;\n  recordStopped: boolean;\n  recordingMediaOptions: string;\n  canStartWhiteboard: boolean;\n  whiteboardStarted: boolean;\n  whiteboardEnded: boolean;\n  hostLabel: string;\n  updateWhiteboardStarted: (started: boolean) => void;\n  updateWhiteboardEnded: (ended: boolean) => void;\n  updateWhiteboardUsers: (users: WhiteboardUser[]) => void;\n  updateCanStartWhiteboard: (canStart: boolean) => void;\n  updateIsConfigureWhiteboardModalVisible: (isVisible: boolean) => void;\n  onScreenChanges: (options: OnScreenChangesOptions) => Promise<void>;\n  captureCanvasStream: (options: CaptureCanvasStreamOptions) => Promise<void>;\n  prepopulateUserMedia: (options: PrepopulateUserMediaOptions) => Promise<PrepopulateUserMediaResult>;\n  rePort: (options: RePortOptions) => Promise<void>;\n  getUpdatedAllParams: () => ConfigureWhiteboardModalParameters;\n  [key: string]: unknown;\n}\n\nexport interface ConfigureWhiteboardModalProps {\n  isVisible: boolean;\n  onConfigureWhiteboardClose: () => void;\n  parameters: ConfigureWhiteboardModalParameters;\n  backgroundColor?: string;\n  position?: string;\n  \n  // UI override props\n  title?: VNodeChild\n  overlayProps?: HTMLAttributes\n  contentProps?: HTMLAttributes\n  headerProps?: HTMLAttributes\n  titleProps?: HTMLAttributes\n  closeButtonProps?: ButtonHTMLAttributes\n  closeIconComponent?: VNodeChild\n  headerDividerProps?: HTMLAttributes\n  bodyProps?: HTMLAttributes\n  listsWrapperProps?: HTMLAttributes\n  assignedSectionProps?: HTMLAttributes\n  pendingSectionProps?: HTMLAttributes\n  assignedTitleProps?: HTMLAttributes\n  pendingTitleProps?: HTMLAttributes\n  assignedListProps?: HTMLAttributes\n  pendingListProps?: HTMLAttributes\n  assignedItemProps?: LiHTMLAttributes\n  pendingItemProps?: LiHTMLAttributes\n  assignedActionButtonProps?: ButtonHTMLAttributes\n  pendingActionButtonProps?: ButtonHTMLAttributes\n  footerProps?: HTMLAttributes\n  saveButtonProps?: ButtonHTMLAttributes\n  actionsWrapperProps?: HTMLAttributes\n  startButtonProps?: ButtonHTMLAttributes\n  updateButtonProps?: ButtonHTMLAttributes\n  stopButtonProps?: ButtonHTMLAttributes\n  sectionDividerProps?: HTMLAttributes\n  assignedTitle?: VNodeChild\n  pendingTitle?: VNodeChild\n  saveButtonLabel?: VNodeChild\n  startButtonLabel?: VNodeChild\n  updateButtonLabel?: VNodeChild\n  stopButtonLabel?: VNodeChild\n  addIcon?: VNodeChild\n  removeIcon?: VNodeChild\n  saveIcon?: VNodeChild\n  startIcon?: VNodeChild\n  updateIcon?: VNodeChild\n  stopIcon?: VNodeChild\n  emptyAssignedState?: VNodeChild | ((context: { participants: Participant[] }) => VNodeChild)\n  emptyPendingState?: VNodeChild | ((context: { participants: Participant[] }) => VNodeChild)\n  renderTitle?: (options: { defaultTitle: VNodeChild }) => VNodeChild\n  renderHeader?: (options: { defaultHeader: VNodeChild }) => VNodeChild\n  renderLists?: (options: {\n    defaultLists: VNodeChild\n    assignedParticipants: Participant[]\n    pendingParticipants: Participant[]\n  }) => VNodeChild\n  renderAssignedList?: (options: {\n    defaultAssignedList: VNodeChild\n    participants: Participant[]\n    removeParticipant: (participant: Participant) => void\n  }) => VNodeChild\n  renderPendingList?: (options: {\n    defaultPendingList: VNodeChild\n    participants: Participant[]\n    addParticipant: (participant: Participant) => void\n  }) => VNodeChild\n  renderAssignedItem?: (options: {\n    defaultItem: VNodeChild\n    participant: Participant\n    remove: () => void\n    index: number\n  }) => VNodeChild\n  renderPendingItem?: (options: {\n    defaultItem: VNodeChild\n    participant: Participant\n    add: () => void\n    index: number\n  }) => VNodeChild\n  renderFooter?: (options: {\n    defaultFooter: VNodeChild\n    isEditing: boolean\n    canStartWhiteboard: boolean\n  }) => VNodeChild\n  renderActions?: (options: {\n    defaultActions: VNodeChild\n    isEditing: boolean\n    canStartWhiteboard: boolean\n    whiteboardStarted: boolean\n    whiteboardEnded: boolean\n  }) => VNodeChild\n  renderBody?: (options: {\n    defaultBody: VNodeChild\n    isEditing: boolean\n    assignedParticipants: Participant[]\n    pendingParticipants: Participant[]\n  }) => VNodeChild\n  renderContent?: (options: { defaultContent: VNodeChild }) => VNodeChild\n}\n\nconst props = withDefaults(defineProps<ConfigureWhiteboardModalProps>(), {\n  backgroundColor: '#83c0e9',\n  position: 'topRight',\n  title: () => 'Configure Whiteboard',\n  overlayProps: undefined,\n  contentProps: undefined,\n  headerProps: undefined,\n  titleProps: undefined,\n  closeButtonProps: undefined,\n  closeIconComponent: undefined,\n  headerDividerProps: undefined,\n  bodyProps: undefined,\n  listsWrapperProps: undefined,\n  assignedSectionProps: undefined,\n  pendingSectionProps: undefined,\n  assignedTitleProps: undefined,\n  pendingTitleProps: undefined,\n  assignedListProps: undefined,\n  pendingListProps: undefined,\n  assignedItemProps: undefined,\n  pendingItemProps: undefined,\n  assignedActionButtonProps: undefined,\n  pendingActionButtonProps: undefined,\n  footerProps: undefined,\n  saveButtonProps: undefined,\n  actionsWrapperProps: undefined,\n  startButtonProps: undefined,\n  updateButtonProps: undefined,\n  stopButtonProps: undefined,\n  sectionDividerProps: undefined,\n  assignedTitle: () => 'Assigned',\n  pendingTitle: () => 'Pending',\n  saveButtonLabel: undefined,\n  startButtonLabel: undefined,\n  updateButtonLabel: undefined,\n  stopButtonLabel: undefined,\n  addIcon: undefined,\n  removeIcon: undefined,\n  saveIcon: undefined,\n  startIcon: undefined,\n  updateIcon: undefined,\n  stopIcon: undefined,\n  emptyAssignedState: undefined,\n  emptyPendingState: undefined,\n  renderTitle: undefined,\n  renderHeader: undefined,\n  renderLists: undefined,\n  renderAssignedList: undefined,\n  renderPendingList: undefined,\n  renderAssignedItem: undefined,\n  renderPendingItem: undefined,\n  renderFooter: undefined,\n  renderActions: undefined,\n  renderBody: undefined,\n  renderContent: undefined\n});\n\n// Reactive computed access to parameters (read-only)\nconst participants = computed(() => props.parameters.participants);\nconst showAlert = computed(() => props.parameters.showAlert);\nconst itemPageLimit = computed(() => props.parameters.itemPageLimit);\nconst islevel = computed(() => props.parameters.islevel);\nconst roomName = computed(() => props.parameters.roomName);\nconst shareScreenStarted = computed(() => props.parameters.shareScreenStarted);\nconst shared = computed(() => props.parameters.shared);\nconst breakOutRoomStarted = computed(() => props.parameters.breakOutRoomStarted);\nconst breakOutRoomEnded = computed(() => props.parameters.breakOutRoomEnded);\nconst recordStarted = computed(() => props.parameters.recordStarted);\nconst recordResumed = computed(() => props.parameters.recordResumed);\nconst recordPaused = computed(() => props.parameters.recordPaused);\nconst recordStopped = computed(() => props.parameters.recordStopped);\nconst recordingMediaOptions = computed(() => props.parameters.recordingMediaOptions);\nconst hostLabel = computed(() => props.parameters.hostLabel);\nconst updateWhiteboardStarted = computed(() => props.parameters.updateWhiteboardStarted);\nconst updateWhiteboardEnded = computed(() => props.parameters.updateWhiteboardEnded);\nconst updateWhiteboardUsers = computed(() => props.parameters.updateWhiteboardUsers);\nconst updateCanStartWhiteboard = computed(() => props.parameters.updateCanStartWhiteboard);\nconst updateIsConfigureWhiteboardModalVisible = computed(() => props.parameters.updateIsConfigureWhiteboardModalVisible);\nconst onScreenChanges = computed(() => props.parameters.onScreenChanges);\nconst captureCanvasStream = computed(() => props.parameters.captureCanvasStream);\nconst prepopulateUserMedia = computed(() => props.parameters.prepopulateUserMedia);\nconst rePort = computed(() => props.parameters.rePort);\nconst getUpdatedAllParams = computed(() => props.parameters.getUpdatedAllParams);\n\n// Socket reference (special handling)\nconst initialSocket = computed(() => props.parameters.socket);\n\n// State (mutable refs initialized from parameters)\nconst participantsCopy = ref<Participant[]>([]);\nconst whiteboardLimit = ref(itemPageLimit.value);\nconst isEditing = ref(false);\nconst canStartWhiteboard = ref(props.parameters.canStartWhiteboard);\nconst whiteboardStarted = ref(props.parameters.whiteboardStarted);\nconst whiteboardEnded = ref(props.parameters.whiteboardEnded);\n\nconst socketRef = computed(() => props.parameters.socket as Socket | undefined);\n\nconst isSocketLike = (candidate: unknown): candidate is Socket => {\n  if (!candidate) {\n    return false;\n  }\n\n  const socketCandidate = candidate as {\n    on?: unknown;\n    off?: unknown;\n    emit?: unknown;\n  };\n\n  return (\n    typeof socketCandidate.on === 'function' &&\n    typeof socketCandidate.off === 'function' &&\n    typeof socketCandidate.emit === 'function'\n  );\n};\n\nconst getActiveSocket = (): Socket | undefined => {\n  const latestSocket = socketRef.value;\n  if (isSocketLike(latestSocket)) {\n    return latestSocket;\n  }\n\n  if (isSocketLike(initialSocket)) {\n    return initialSocket as Socket;\n  }\n\n  return undefined;\n};\n\nconst attachWhiteboardListener = (socketInstance?: Socket) => {\n  if (isSocketLike(socketInstance)) {\n    socketInstance.on('whiteboardUpdated', handleWhiteboardUpdated);\n  }\n};\n\nconst detachWhiteboardListener = (socketInstance?: Socket) => {\n  if (isSocketLike(socketInstance)) {\n    socketInstance.off('whiteboardUpdated', handleWhiteboardUpdated);\n  }\n};\n\nwatch(\n  socketRef,\n  (newSocket, oldSocket) => {\n    detachWhiteboardListener(oldSocket);\n    attachWhiteboardListener(newSocket);\n  },\n  { immediate: true }\n);\n\n// Refs\n// Computed participants lists\nconst assignedParticipants = computed(() => {\n  return participantsCopy.value.filter((participant) => participant.useBoard);\n});\n\n// Validate whiteboard\nconst validateWhiteboard = (): boolean => {\n  const selectedParticipants = participantsCopy.value.filter((participant) => participant.useBoard);\n\n  if (selectedParticipants.length > whiteboardLimit.value) {\n    showAlert.value?.({ message: 'Participant limit exceeded', type: 'danger' });\n    return false;\n  }\n\n  return true;\n};\n\n// Check if can start whiteboard\nconst checkCanStartWhiteboard = () => {\n  const isValid = validateWhiteboard();\n  canStartWhiteboard.value = isValid;\n  updateCanStartWhiteboard.value(isValid);\n};\n\n// Toggle participant\nconst toggleParticipant = (participant: Participant, add: boolean) => {\n  isEditing.value = true;\n  const selectedParticipants = participantsCopy.value.filter((p) => p.useBoard);\n  \n  if (add && selectedParticipants.length >= whiteboardLimit.value - 1) {\n    showAlert.value?.({\n      message: `Participant limit exceeded - you can only add ${whiteboardLimit.value - 1} other participants`,\n      type: 'danger',\n    });\n    return;\n  }\n\n  const updatedParticipants = participantsCopy.value.map((p) =>\n    p.name === participant.name ? { ...p, useBoard: add } : p\n  );\n\n  participantsCopy.value = updatedParticipants;\n};\n\n// Handle save whiteboard\nconst handleSaveWhiteboard = () => {\n  if (validateWhiteboard()) {\n    isEditing.value = false;\n    canStartWhiteboard.value = true;\n    updateCanStartWhiteboard.value(true);\n    checkCanStartWhiteboard();\n    showAlert.value?.({ message: 'Whiteboard saved successfully', type: 'success' });\n  } else {\n    showAlert.value?.({ message: 'Whiteboard validation failed', type: 'danger' });\n  }\n};\n\n// Handle start whiteboard\nconst handleStartWhiteboardClick = async () => {\n  if ((shareScreenStarted.value || shared.value) && !whiteboardStarted.value) {\n    showAlert.value?.({\n      message: 'You cannot start whiteboard while screen sharing is active',\n      type: 'danger',\n    });\n    return;\n  }\n\n  if (breakOutRoomStarted.value && !breakOutRoomEnded.value) {\n    showAlert.value?.({\n      message: 'You cannot start whiteboard while breakout rooms are active',\n      type: 'danger',\n    });\n    return;\n  }\n\n  if (canStartWhiteboard.value) {\n    const filteredWhiteboardUsers = participantsCopy.value\n      .filter((participant) => participant.useBoard)\n      .map(({ name, useBoard }) => ({ name, useBoard: useBoard || false }));\n\n    const activeSocket = getActiveSocket();\n    if (!activeSocket) {\n      console.warn('[ConfigureWhiteboardModal] Socket is not ready to start the whiteboard.');\n      showAlert.value?.({ message: 'Connection not ready. Please try again in a moment.', type: 'danger' });\n      return;\n    }\n\n    const startSucceeded = await handleStartWhiteboard({\n      socket: activeSocket,\n      whiteboardUsers: filteredWhiteboardUsers,\n      roomName: roomName.value,\n      whiteboardStarted: whiteboardStarted.value,\n      whiteboardEnded: whiteboardEnded.value,\n      showAlert: showAlert.value,\n      updateWhiteboardStarted: updateWhiteboardStarted.value,\n      updateWhiteboardEnded: updateWhiteboardEnded.value,\n      updateIsConfigureWhiteboardModalVisible: updateIsConfigureWhiteboardModalVisible.value,\n    });\n\n    if (!startSucceeded) {\n      return;\n    }\n\n    whiteboardStarted.value = true;\n    whiteboardEnded.value = false;\n\n    // Additional logic for screen changes\n    if (islevel.value !== '2') {\n      const updatedParams = getUpdatedAllParams.value();\n      await onScreenChanges.value({ changed: true, parameters: updatedParams });\n    }\n\n    // Handle recording capture\n    if (islevel.value === '2' && (recordStarted.value || recordResumed.value)) {\n      if (!(recordPaused.value || recordStopped.value) && recordingMediaOptions.value === 'video') {\n        const updatedParams = getUpdatedAllParams.value();\n        await captureCanvasStream.value({ parameters: updatedParams });\n      }\n    }\n  }\n};\n\n// Handle stop whiteboard\nconst handleStopWhiteboardClick = async () => {\n  const activeSocket = getActiveSocket();\n  if (!activeSocket) {\n    console.warn('[ConfigureWhiteboardModal] Socket is not ready to stop the whiteboard.');\n    showAlert.value?.({ message: 'Connection not ready. Please try again in a moment.', type: 'danger' });\n    return;\n  }\n\n  const stopSucceeded = await handleStopWhiteboard({\n    socket: activeSocket,\n    roomName: roomName.value,\n    showAlert: showAlert.value,\n    updateWhiteboardStarted: updateWhiteboardStarted.value,\n    updateWhiteboardEnded: updateWhiteboardEnded.value,\n    updateIsConfigureWhiteboardModalVisible: updateIsConfigureWhiteboardModalVisible.value,\n  });\n\n  if (!stopSucceeded) {\n    return;\n  }\n\n  whiteboardEnded.value = true;\n  whiteboardStarted.value = false;\n\n  // Additional cleanup logic\n  const updatedParams = getUpdatedAllParams.value();\n  await onScreenChanges.value({ changed: true, parameters: updatedParams });\n  await prepopulateUserMedia.value({ name: hostLabel.value, parameters: updatedParams });\n  await rePort.value({ restart: true, parameters: updatedParams });\n};\n\n// Socket event handler for whiteboard updates\nconst handleWhiteboardUpdated = async (data: WhiteboardUpdatedData) => {\n  if (islevel.value === '2' && data.members) {\n    const filteredParticipants = data.members.filter((participant) => !participant.isBanned);\n    participantsCopy.value = filteredParticipants;\n  }\n\n  updateWhiteboardUsers.value(data.whiteboardUsers);\n\n  if (data.status === 'started') {\n    whiteboardStarted.value = true;\n    whiteboardEnded.value = false;\n    updateWhiteboardStarted.value(true);\n    updateWhiteboardEnded.value(false);\n\n    if (islevel.value !== '2') {\n      const updatedParams = getUpdatedAllParams.value();\n      await onScreenChanges.value({ changed: true, parameters: updatedParams });\n    }\n  } else if (data.status === 'ended') {\n    whiteboardEnded.value = true;\n    whiteboardStarted.value = false;\n    updateWhiteboardStarted.value(false);\n    updateWhiteboardEnded.value(true);\n\n    const updatedParams = getUpdatedAllParams.value();\n    await onScreenChanges.value({ changed: true, parameters: updatedParams });\n    await prepopulateUserMedia.value({ name: hostLabel.value, parameters: updatedParams });\n    await rePort.value({ restart: true, parameters: updatedParams });\n  }\n};\n\n// Initialize participants on mount and visibility change\nwatch(\n  () => props.isVisible,\n  (isVisible) => {\n    if (isVisible) {\n      const filteredParticipants = participants.value.filter((participant) => participant.islevel !== '2');\n      participantsCopy.value = filteredParticipants;\n      checkCanStartWhiteboard();\n    }\n  },\n  { immediate: true }\n);\n\n// Cleanup socket listener on component unmount\nonUnmounted(() => {\n  const activeSocket = getActiveSocket();\n  detachWhiteboardListener(activeSocket);\n});\n\n// Watch for parameter changes\nwatch(\n  () => props.parameters.canStartWhiteboard,\n  (newVal) => {\n    canStartWhiteboard.value = newVal;\n  }\n);\n\nwatch(\n  () => props.parameters.whiteboardStarted,\n  (newVal) => {\n    whiteboardStarted.value = newVal;\n  }\n);\n\nwatch(\n  () => props.parameters.whiteboardEnded,\n  (newVal) => {\n    whiteboardEnded.value = newVal;\n  }\n);\n\n// Inline RenderVNode component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Function] as PropType<VNodeChild>,\n      default: null\n    }\n  },\n  setup(props) {\n    return () => {\n      const node = props.node\n      if (isVNode(node)) {\n        return node\n      } else if (typeof node === 'function') {\n        return (node as () => VNodeChild)()\n      } else {\n        return node\n      }\n    }\n  }\n})\n\n// Helper function\nconst joinClassNames = (classes: (string | undefined)[]): string | undefined => {\n  const filtered = classes.filter(Boolean)\n  return filtered.length > 0 ? filtered.join(' ').trim() : undefined\n}\n\n// Computed properties for styles\nconst defaultOverlayWidth = typeof window !== 'undefined' ? Math.min(window.innerWidth * 0.85, 500) : 400\n\nconst overlayStyle = computed((): CSSProperties => ({\n  position: 'fixed' as const,\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  display: props.isVisible ? 'block' : 'none',\n  zIndex: 999,\n  ...(props.overlayProps?.style as CSSProperties || {})\n}))\n\nconst overlayClassName = computed(() => \n  joinClassNames(['mediasfu-configure-whiteboard-modal', props.overlayProps?.class as string])\n)\n\nconst contentStyle = computed((): CSSProperties => ({\n  position: 'fixed' as const,\n  backgroundColor: props.backgroundColor,\n  borderRadius: '10px',\n  padding: '10px',\n  width: `${defaultOverlayWidth}px`,\n  maxHeight: '85%',\n  overflowY: 'auto' as const,\n  top: props.position.includes('top') ? '10px' : 'auto',\n  bottom: props.position.includes('bottom') ? '10px' : 'auto',\n  left: props.position.includes('Left') ? '10px' : 'auto',\n  right: props.position.includes('Right') ? '10px' : 'auto',\n  ...(props.contentProps?.style as CSSProperties || {})\n}))\n\nconst contentClassName = computed(() => \n  joinClassNames(['mediasfu-configure-whiteboard-modal__content', props.contentProps?.class as string])\n)\n\n// Main overlay node\nconst overlayNode = computed(() => {\n  const defaultCloseIcon = props.closeIconComponent ?? h(FontAwesomeIcon, { icon: faTimes, size: 'xl' })\n  const defaultAddIcon = props.addIcon ?? h(FontAwesomeIcon, { icon: faCheck })\n  const defaultRemoveIcon = props.removeIcon ?? h(FontAwesomeIcon, { icon: faTimes })\n  const defaultSaveIcon = props.saveIcon ?? h(FontAwesomeIcon, { icon: faSave })\n  const defaultStartIcon = props.startIcon ?? h(FontAwesomeIcon, { icon: faPlay })\n  const defaultUpdateIcon = props.updateIcon ?? h(FontAwesomeIcon, { icon: faSyncAlt })\n  const defaultStopIcon = props.stopIcon ?? h(FontAwesomeIcon, { icon: faTimes })\n  \n  const defaultTitleNode = h('h2', {\n    class: joinClassNames(['modal-title', props.titleProps?.class as string]),\n    style: { ...(props.titleProps?.style as CSSProperties || {}) },\n    ...(props.titleProps ? Object.fromEntries(\n      Object.entries(props.titleProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, typeof props.title === 'string' || typeof props.title === 'number' ? [props.title] : (props.title || []))\n  \n  const titleNode = props.renderTitle\n    ? props.renderTitle({ defaultTitle: defaultTitleNode })\n    : defaultTitleNode\n  \n  const defaultHeaderNode = h('div', {\n    class: joinClassNames(['modal-header', props.headerProps?.class as string]),\n    style: { ...(props.headerProps?.style as CSSProperties || {}) },\n    ...(props.headerProps ? Object.fromEntries(\n      Object.entries(props.headerProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    titleNode,\n    h('button', {\n      class: joinClassNames(['close-button', props.closeButtonProps?.class as string]),\n      style: { ...(props.closeButtonProps?.style as CSSProperties || {}) },\n      onClick: (event: MouseEvent) => {\n        if (props.closeButtonProps?.onClick) {\n          (props.closeButtonProps.onClick as (event: MouseEvent) => void)(event)\n        }\n        if (!event.defaultPrevented) {\n          props.onConfigureWhiteboardClose()\n        }\n      },\n      ...(props.closeButtonProps ? Object.fromEntries(\n        Object.entries(props.closeButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {})\n    }, [defaultCloseIcon])\n  ])\n  \n  const headerNode = props.renderHeader\n    ? props.renderHeader({ defaultHeader: defaultHeaderNode })\n    : defaultHeaderNode\n  \n  // Assigned List\n  const assignedItems = assignedParticipants.value.length > 0\n    ? assignedParticipants.value.map((participant, index) => {\n        const defaultItem = h('li', {\n          key: participant.name,\n          class: joinClassNames(['participant-item', props.assignedItemProps?.class as string]),\n          style: { ...(props.assignedItemProps?.style as CSSProperties || {}) },\n          ...(props.assignedItemProps ? Object.fromEntries(\n            Object.entries(props.assignedItemProps).filter(([key]) => !['class', 'style', 'key'].includes(key))\n          ) : {})\n        }, [\n          h('span', participant.name),\n          h('button', {\n            class: joinClassNames(['btn btn-danger btn-sm', props.assignedActionButtonProps?.class as string]),\n            style: { ...(props.assignedActionButtonProps?.style as CSSProperties || {}) },\n            onClick: (event: MouseEvent) => {\n              if (props.assignedActionButtonProps?.onClick) {\n                (props.assignedActionButtonProps.onClick as (event: MouseEvent) => void)(event)\n              }\n              if (!event.defaultPrevented) {\n                toggleParticipant(participant, false)\n              }\n            },\n            ...(props.assignedActionButtonProps ? Object.fromEntries(\n              Object.entries(props.assignedActionButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n            ) : {})\n          }, [defaultRemoveIcon])\n        ])\n        \n        return props.renderAssignedItem\n          ? props.renderAssignedItem({\n              defaultItem,\n              participant,\n              remove: () => toggleParticipant(participant, false),\n              index\n            })\n          : defaultItem\n      })\n    : [h('li', { class: 'participant-item' }, [\n        typeof props.emptyAssignedState === 'function'\n          ? (props.emptyAssignedState as (context: { participants: Participant[] }) => VNodeChild)({ participants: participants.value })\n          : (props.emptyAssignedState || 'None')\n      ])]\n  \n  const defaultAssignedListNode = h('div', {\n    class: joinClassNames(['list-section', props.assignedSectionProps?.class as string]),\n    style: { ...(props.assignedSectionProps?.style as CSSProperties || {}) },\n    ...(props.assignedSectionProps ? Object.fromEntries(\n      Object.entries(props.assignedSectionProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    h('h6', {\n      class: joinClassNames(['list-title', props.assignedTitleProps?.class as string]),\n      style: { ...(props.assignedTitleProps?.style as CSSProperties || {}) },\n      ...(props.assignedTitleProps ? Object.fromEntries(\n        Object.entries(props.assignedTitleProps).filter(([key]) => !['class', 'style'].includes(key))\n      ) : {})\n    }, typeof props.assignedTitle === 'string' || typeof props.assignedTitle === 'number' ? [props.assignedTitle] : (props.assignedTitle || [])),\n    h('ul', {\n      class: joinClassNames(['participant-list', props.assignedListProps?.class as string]),\n      style: { ...(props.assignedListProps?.style as CSSProperties || {}) },\n      ...(props.assignedListProps ? Object.fromEntries(\n        Object.entries(props.assignedListProps).filter(([key]) => !['class', 'style'].includes(key))\n      ) : {})\n    }, assignedItems)\n  ])\n  \n  const assignedListNode = props.renderAssignedList\n    ? props.renderAssignedList({\n        defaultAssignedList: defaultAssignedListNode,\n        participants: assignedParticipants.value,\n        removeParticipant: (p) => toggleParticipant(p, false)\n      })\n    : defaultAssignedListNode\n  \n  // Pending List\n  const unassignedParticipants = computed(() => {\n    return participantsCopy.value.filter((participant) => !participant.useBoard);\n  })\n  \n  const pendingItems = unassignedParticipants.value.length > 0\n    ? unassignedParticipants.value.map((participant, index) => {\n        const defaultItem = h('li', {\n          key: participant.name,\n          class: joinClassNames(['participant-item', props.pendingItemProps?.class as string]),\n          style: { ...(props.pendingItemProps?.style as CSSProperties || {}) },\n          ...(props.pendingItemProps ? Object.fromEntries(\n            Object.entries(props.pendingItemProps).filter(([key]) => !['class', 'style', 'key'].includes(key))\n          ) : {})\n        }, [\n          h('span', participant.name),\n          h('button', {\n            class: joinClassNames(['btn btn-primary btn-sm', props.pendingActionButtonProps?.class as string]),\n            style: { ...(props.pendingActionButtonProps?.style as CSSProperties || {}) },\n            onClick: (event: MouseEvent) => {\n              if (props.pendingActionButtonProps?.onClick) {\n                (props.pendingActionButtonProps.onClick as (event: MouseEvent) => void)(event)\n              }\n              if (!event.defaultPrevented) {\n                toggleParticipant(participant, true)\n              }\n            },\n            ...(props.pendingActionButtonProps ? Object.fromEntries(\n              Object.entries(props.pendingActionButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n            ) : {})\n          }, [defaultAddIcon])\n        ])\n        \n        return props.renderPendingItem\n          ? props.renderPendingItem({\n              defaultItem,\n              participant,\n              add: () => toggleParticipant(participant, true),\n              index\n            })\n          : defaultItem\n      })\n    : [h('li', { class: 'participant-item' }, [\n        typeof props.emptyPendingState === 'function'\n          ? (props.emptyPendingState as (context: { participants: Participant[] }) => VNodeChild)({ participants: participants.value })\n          : (props.emptyPendingState || 'None')\n      ])]\n  \n  const defaultPendingListNode = h('div', {\n    class: joinClassNames(['list-section', props.pendingSectionProps?.class as string]),\n    style: { ...(props.pendingSectionProps?.style as CSSProperties || {}) },\n    ...(props.pendingSectionProps ? Object.fromEntries(\n      Object.entries(props.pendingSectionProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    h('h6', {\n      class: joinClassNames(['list-title', props.pendingTitleProps?.class as string]),\n      style: { ...(props.pendingTitleProps?.style as CSSProperties || {}) },\n      ...(props.pendingTitleProps ? Object.fromEntries(\n        Object.entries(props.pendingTitleProps).filter(([key]) => !['class', 'style'].includes(key))\n      ) : {})\n    }, typeof props.pendingTitle === 'string' || typeof props.pendingTitle === 'number' ? [props.pendingTitle] : (props.pendingTitle || [])),\n    h('ul', {\n      class: joinClassNames(['participant-list', props.pendingListProps?.class as string]),\n      style: { ...(props.pendingListProps?.style as CSSProperties || {}) },\n      ...(props.pendingListProps ? Object.fromEntries(\n        Object.entries(props.pendingListProps).filter(([key]) => !['class', 'style'].includes(key))\n      ) : {})\n    }, pendingItems)\n  ])\n  \n  const pendingListNode = props.renderPendingList\n    ? props.renderPendingList({\n        defaultPendingList: defaultPendingListNode,\n        participants: unassignedParticipants.value,\n        addParticipant: (p) => toggleParticipant(p, true)\n      })\n    : defaultPendingListNode\n  \n  const defaultListsNode = h('div', {\n    class: joinClassNames(['modal-body', 'lists-container', props.listsWrapperProps?.class as string]),\n    style: { ...(props.listsWrapperProps?.style as CSSProperties || {}) },\n    ...(props.listsWrapperProps ? Object.fromEntries(\n      Object.entries(props.listsWrapperProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    assignedListNode,\n    pendingListNode\n  ])\n  \n  const listsNode = props.renderLists\n    ? props.renderLists({\n        defaultLists: defaultListsNode,\n        assignedParticipants: assignedParticipants.value,\n        pendingParticipants: unassignedParticipants.value\n      })\n    : defaultListsNode\n  \n  const defaultFooterNode = h('div', {\n    class: joinClassNames(['modal-footer', props.footerProps?.class as string]),\n    style: { ...(props.footerProps?.style as CSSProperties || {}) },\n    ...(props.footerProps ? Object.fromEntries(\n      Object.entries(props.footerProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    h('button', {\n      class: joinClassNames(['btn btn-info', props.saveButtonProps?.class as string]),\n      style: { ...(props.saveButtonProps?.style as CSSProperties || {}) },\n      onClick: (event: MouseEvent) => {\n        if (props.saveButtonProps?.onClick) {\n          (props.saveButtonProps.onClick as (event: MouseEvent) => void)(event)\n        }\n        if (!event.defaultPrevented) {\n          handleSaveWhiteboard()\n        }\n      },\n      ...(props.saveButtonProps ? Object.fromEntries(\n        Object.entries(props.saveButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {})\n    }, [\n      props.saveButtonLabel || 'Save ',\n      defaultSaveIcon\n    ])\n  ])\n  \n  const footerNode = props.renderFooter\n    ? props.renderFooter({\n        defaultFooter: defaultFooterNode,\n        isEditing: isEditing.value,\n        canStartWhiteboard: canStartWhiteboard.value\n      })\n    : defaultFooterNode\n  \n  const sectionDividerNode = h('hr', {\n    class: 'divider',\n    style: { ...(props.sectionDividerProps?.style as CSSProperties || {}) },\n    ...(props.sectionDividerProps ? Object.fromEntries(\n      Object.entries(props.sectionDividerProps).filter(([key]) => key !== 'style')\n    ) : {})\n  })\n  \n  const isUpdating = whiteboardStarted.value && !whiteboardEnded.value\n  \n  const defaultActionsNode = !isEditing.value ? h('div', {\n    class: joinClassNames(['action-buttons', props.actionsWrapperProps?.class as string]),\n    style: { ...(props.actionsWrapperProps?.style as CSSProperties || {}) },\n    ...(props.actionsWrapperProps ? Object.fromEntries(\n      Object.entries(props.actionsWrapperProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    canStartWhiteboard.value ? h('button', {\n      class: joinClassNames([\n        'btn',\n        isUpdating ? 'btn-warning' : 'btn-success',\n        isUpdating ? (props.updateButtonProps?.class as string) : (props.startButtonProps?.class as string)\n      ]),\n      style: { ...(isUpdating ? (props.updateButtonProps?.style as CSSProperties || {}) : (props.startButtonProps?.style as CSSProperties || {})) },\n      onClick: (event: MouseEvent) => {\n        const buttonProps = isUpdating ? props.updateButtonProps : props.startButtonProps\n        if (buttonProps?.onClick) {\n          (buttonProps.onClick as (event: MouseEvent) => void)(event)\n        }\n        if (!event.defaultPrevented) {\n          handleStartWhiteboardClick()\n        }\n      },\n      ...(isUpdating ? (props.updateButtonProps ? Object.fromEntries(\n        Object.entries(props.updateButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {}) : (props.startButtonProps ? Object.fromEntries(\n        Object.entries(props.startButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {}))\n    }, [\n      isUpdating\n        ? (props.updateButtonLabel || 'Update ')\n        : (props.startButtonLabel || 'Start '),\n      isUpdating ? defaultUpdateIcon : defaultStartIcon\n    ]) : null,\n    whiteboardStarted.value && !whiteboardEnded.value ? h('button', {\n      class: joinClassNames(['btn btn-danger mt-2', props.stopButtonProps?.class as string]),\n      style: { ...(props.stopButtonProps?.style as CSSProperties || {}) },\n      onClick: (event: MouseEvent) => {\n        if (props.stopButtonProps?.onClick) {\n          (props.stopButtonProps.onClick as (event: MouseEvent) => void)(event)\n        }\n        if (!event.defaultPrevented) {\n          handleStopWhiteboardClick()\n        }\n      },\n      ...(props.stopButtonProps ? Object.fromEntries(\n        Object.entries(props.stopButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n      ) : {})\n    }, [\n      props.stopButtonLabel || 'Stop ',\n      defaultStopIcon\n    ]) : null\n  ].filter(Boolean)) : null\n  \n  const actionsNode = props.renderActions\n    ? props.renderActions({\n        defaultActions: defaultActionsNode,\n        isEditing: isEditing.value,\n        canStartWhiteboard: canStartWhiteboard.value,\n        whiteboardStarted: whiteboardStarted.value,\n        whiteboardEnded: whiteboardEnded.value\n      })\n    : defaultActionsNode\n  \n  const defaultBodyNode = h('div', {\n    class: joinClassNames(['modal-content-wrapper', props.bodyProps?.class as string]),\n    style: { ...(props.bodyProps?.style as CSSProperties || {}) },\n    ...(props.bodyProps ? Object.fromEntries(\n      Object.entries(props.bodyProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [\n    headerNode,\n    listsNode,\n    footerNode,\n    sectionDividerNode,\n    actionsNode\n  ].filter(Boolean))\n  \n  const bodyNode = props.renderBody\n    ? props.renderBody({\n        defaultBody: defaultBodyNode,\n        isEditing: isEditing.value,\n        assignedParticipants: assignedParticipants.value,\n        pendingParticipants: unassignedParticipants.value\n      })\n    : defaultBodyNode\n  \n  const defaultContentNode = h('div', {\n    class: contentClassName.value,\n    style: contentStyle.value,\n    ...(props.contentProps ? Object.fromEntries(\n      Object.entries(props.contentProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [bodyNode])\n  \n  const contentNode = props.renderContent\n    ? props.renderContent({ defaultContent: defaultContentNode })\n    : defaultContentNode\n  \n  return h('div', {\n    class: overlayClassName.value,\n    style: overlayStyle.value,\n    ...(props.overlayProps ? Object.fromEntries(\n      Object.entries(props.overlayProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [contentNode])\n})\n</script>\n\n<style scoped>\n.modal-overlay {\n  position: fixed;\n  top: 0;\n  left: 0;\n  width: 100%;\n  height: 100%;\n  background-color: rgba(0, 0, 0, 0.5);\n  display: flex;\n  justify-content: center;\n  align-items: center;\n  z-index: 999;\n}\n\n.modal-container {\n  display: flex;\n  flex-direction: column;\n}\n\n.modal-content-wrapper {\n  display: flex;\n  flex-direction: column;\n}\n\n.modal-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-bottom: 15px;\n}\n\n.modal-title {\n  font-size: 1.5rem;\n  font-weight: bold;\n  color: black;\n  margin: 0;\n}\n\n.close-button {\n  border: none;\n  background: none;\n  cursor: pointer;\n  padding: 0;\n  color: black;\n  font-size: 20px;\n}\n\n.close-button:hover {\n  opacity: 0.7;\n}\n\n.modal-body {\n  flex: 1;\n}\n\n.lists-container {\n  display: grid;\n  grid-template-columns: 1fr 1fr;\n  gap: 15px;\n  margin-bottom: 15px;\n}\n\n.list-section {\n  display: flex;\n  flex-direction: column;\n}\n\n.list-title {\n  font-weight: bold;\n  margin-bottom: 8px;\n  font-size: 1rem;\n}\n\n.participant-list {\n  list-style: none;\n  padding: 0;\n  margin: 0;\n  max-height: 200px;\n  overflow-y: auto;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n}\n\n.participant-item {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  padding: 10px 12px;\n  margin: 8px;\n  background-color: white;\n  color: #333;\n  border-radius: 4px;\n  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n}\n\n.modal-footer {\n  display: flex;\n  justify-content: flex-end;\n  margin-bottom: 10px;\n}\n\n.divider {\n  height: 1px;\n  background-color: #ccc;\n  border: none;\n  margin: 10px 0;\n}\n\n.action-buttons {\n  display: flex;\n  flex-direction: column;\n  gap: 10px;\n}\n\n.btn {\n  padding: 8px 16px;\n  border: none;\n  border-radius: 4px;\n  cursor: pointer;\n  font-size: 0.95rem;\n  transition: background-color 0.2s;\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  gap: 8px;\n}\n\n.btn-sm {\n  padding: 4px 8px;\n  font-size: 0.75rem;\n}\n\n.btn-primary {\n  background-color: #007bff;\n  color: white;\n}\n\n.btn-primary:hover {\n  background-color: #0056b3;\n}\n\n.btn-danger {\n  background-color: #dc3545;\n  color: white;\n}\n\n.btn-danger:hover {\n  background-color: #a71d2a;\n}\n\n.btn-info {\n  background-color: #17a2b8;\n  color: white;\n}\n\n.btn-info:hover {\n  background-color: #117a8b;\n}\n\n.btn-success {\n  background-color: #28a745;\n  color: white;\n}\n\n.btn-success:hover {\n  background-color: #1e7e34;\n}\n\n.btn-warning {\n  background-color: #ffc107;\n  color: #212529;\n}\n\n.btn-warning:hover {\n  background-color: #e0a800;\n}\n\n.mt-2 {\n  margin-top: 8px;\n}\n\n@media (max-width: 576px) {\n  .lists-container {\n    grid-template-columns: 1fr;\n  }\n}\n</style>\n","<!--\n/**\n * @fileoverview Whiteboard - Collaborative real-time whiteboard with drawing tools\n * @component Whiteboard\n * @module components/whiteboardComponents/Whiteboard\n * \n * @description\n * A feature-rich collaborative whiteboard component with comprehensive drawing tools, real-time\n * synchronization via Socket.io, and Fabric.js canvas rendering. Supports freehand drawing,\n * shapes (rectangle, circle, line, triangle, hexagon, pentagon, polygon, square, octagon),\n * text insertion, image uploads, undo/redo history, and multi-user collaboration with cursor\n * tracking. Includes configurable grid backgrounds, line styles, and extensive customization\n * options for colors, thickness, fonts, and more.\n * \n * Key Features:\n * - **Drawing Tools**: Freehand brush, line tool with thickness controls (1-50px)\n * - **Shape Library**: 10+ shapes with fill/stroke customization\n * - **Text Tool**: Multiple fonts, sizes (10-100px), colors, and alignment\n * - **Image Upload**: Drag-and-drop or file picker for image insertion\n * - **Undo/Redo**: Full history management with action stack\n * - **Pan Mode**: Navigate large canvases with pan tool\n * - **Erase Mode**: Remove specific objects or clear entire canvas\n * - **Grid Background**: Toggle grid overlay for alignment\n * - **Line Styles**: Solid, dashed, dotted line types\n * - **Multi-user Collaboration**: Real-time shape sync via Socket.io\n * - **Save/Export**: Download canvas as image file\n * - **Zoom Controls**: Zoom in/out with percentage display\n * - **Object Selection**: Select, move, resize, rotate objects\n * - **Color Picker**: Full RGB color selection for shapes and text\n * \n * Drawing Modes:\n * - **draw**: Line drawing with adjustable thickness\n * - **freehand**: Free-form brush drawing\n * - **shape**: Shape insertion (rectangle, circle, triangle, etc.)\n * - **text**: Text insertion with font customization\n * - **erase**: Object deletion mode\n * - **pan**: Canvas navigation mode\n * - **select**: Object selection and manipulation\n * \n * Real-time Collaboration:\n * - Socket.io events: 'sendShape', 'receiveShape' for shape synchronization\n * - Participant cursor tracking with name labels\n * - Automatic shape ID generation for conflict-free updates\n * - Host-only whiteboard lock/unlock controls\n * - Participant permission management (can draw, can see shapes)\n * \n * Workflow:\n * 1. User selects drawing tool from toolbar (pencil, brush, shapes, text, etc.)\n * 2. User draws/types on canvas → shape created with Fabric.js\n * 3. Shape data serialized → Socket.io emits 'sendShape' to room\n * 4. Other participants receive 'receiveShape' → shape rendered on their canvas\n * 5. User can select/modify shapes → updates broadcast via Socket.io\n * 6. Undo/redo operations update local history and broadcast changes\n * 7. Canvas can be saved as image or cleared (with confirmation)\n * \n * @example Basic Usage - Standalone Whiteboard\n * ```vue\n * <Whiteboard\n *   customWidth=\"1200\"\n *   customHeight=\"800\"\n *   :parameters=\"{\n *     socket: socketConnection,\n *     roomName: 'room123',\n *     showAlert: alertFunction,\n *     member: 'HostUser',\n *     islevel: '2',\n *     whiteboardStarted: true,\n *     whiteboardEnded: false,\n *     participants: allParticipants,\n *     useImageBackground: false\n *   }\"\n *   :showAspect=\"true\"\n * />\n * ```\n * \n * @example In Main Grid - Conditionally Show Whiteboard\n * ```vue\n * <component\n *   :is=\"WhiteboardComponent\"\n *   :customWidth=\"componentSizes.mainWidth\"\n *   :customHeight=\"componentSizes.mainHeight\"\n *   :parameters=\"whiteboardParameters\"\n *   :showAspect=\"whiteboardStarted && !whiteboardEnded\"\n * />\n * ```\n * \n * @example With Image Background\n * ```vue\n * <Whiteboard\n *   customWidth=\"1920\"\n *   customHeight=\"1080\"\n *   :parameters=\"{\n *     socket: socket,\n *     roomName: roomName,\n *     showAlert: showAlert,\n *     member: member,\n *     islevel: islevel,\n *     whiteboardStarted: true,\n *     whiteboardEnded: false,\n *     participants: participants,\n *     useImageBackground: true,\n *     customImage: 'https://example.com/slide.jpg'\n *   }\"\n *   :showAspect=\"true\"\n * />\n * ```\n * \n * @example Host-Only Controls with Whiteboard Lock\n * ```vue\n * <Whiteboard\n *   customWidth=\"1200\"\n *   customHeight=\"800\"\n *   :parameters=\"{\n *     socket: socket,\n *     roomName: roomName,\n *     showAlert: showAlert,\n *     member: 'HostUser',\n *     islevel: '2',\n *     whiteboardStarted: true,\n *     whiteboardEnded: false,\n *     participants: participants,\n *     useImageBackground: false,\n *     whiteboardUsers: [{\n *       name: 'HostUser',\n *       useBoard: true\n *     }]\n *   }\"\n *   :showAspect=\"true\"\n * />\n * // Host can lock/unlock whiteboard to control participant drawing permissions\n * ```\n * \n * @example Programmatic Shape Addition\n * ```vue\n * <script setup>\n * import { ref } from 'vue';\n * \n * const whiteboardRef = ref(null);\n * \n * const addCustomShape = () => {\n *   const shapeData = {\n *     type: 'rect',\n *     left: 100,\n *     top: 100,\n *     width: 200,\n *     height: 150,\n *     fill: '#FF5733',\n *     stroke: '#000000',\n *     strokeWidth: 2\n *   };\n *   \n *   // Emit via Socket.io for real-time sync\n *   socket.emit('sendShape', {\n *     shape: shapeData,\n *     roomName: 'room123'\n *   });\n * };\n * // </script>\n * \n * // <template>\n * //   <Whiteboard\n * //     ref=\"whiteboardRef\"\n * //     customWidth=\"1200\"\n * //     customHeight=\"800\"\n * //     :parameters=\"whiteboardParams\"\n * //     :showAspect=\"true\"\n * //   />\n * //   <button @click=\"addCustomShape\">Add Rectangle</button>\n * // </template>\n * ```\n * \n * @see {@link ConfigureWhiteboardModal} for whiteboard configuration UI\n * @see {@link captureCanvasStream} for canvas streaming functionality\n * @see {@link https://mediasfu.com/docs/whiteboard} for comprehensive whiteboard documentation\n * @see {@link http://fabricjs.com/} for Fabric.js canvas library documentation\n */\n-->\n<template>\n  <div\n    id=\"whiteboard-interface\"\n    :style=\"{\n      position: 'relative',\n      display: showAspect ? 'block' : 'none',\n      justifyContent: 'center',\n      alignItems: 'center',\n      border: '2px solid #000',\n      backgroundColor: '#f0f0f0',\n      width: `${customWidth}px`,\n      height: `${customHeight}px`,\n    }\"\n  >\n    <div\n      id=\"whiteboardContent\"\n      :style=\"{\n        position: 'relative',\n        display: 'flex',\n        justifyContent: 'center',\n        alignItems: 'center',\n        width: '100%',\n        height: '100%',\n        maxWidth: '100%',\n        maxHeight: '100%',\n        overflow: 'auto',\n      }\"\n    >\n      <button\n        id=\"toolbarToggle\"\n        class=\"btn btnBoard btn-primary\"\n        :style=\"{\n          position: 'absolute',\n          top: '5px',\n          left: '65px',\n          zIndex: 1000,\n        }\"\n        @click=\"toggleToolbar\"\n      >\n        <font-awesome-icon :icon=\"toolbarVisible ? faChevronLeft : faChevronRight\" />\n      </button>\n\n      <div\n        v-if=\"toolbarVisible\"\n        id=\"toolbar\"\n        class=\"toolbar mb-3\"\n        :style=\"{\n          position: 'absolute',\n          top: '5px',\n          left: '110px',\n          zIndex: 1000,\n          backgroundColor: 'transparent',\n        }\"\n      >\n        <div\n          class=\"btn-group\"\n          role=\"group\"\n        >\n          <button\n            id=\"drawMode\"\n            class=\"btn btnBoard btn-secondary dropdown-toggle\"\n            @click=\"handleDropdownClick('drawMode')\"\n          >\n            <font-awesome-icon :icon=\"faPencilAlt\" />\n          </button>\n          <div\n            v-if=\"dropdownOpen === 'drawMode'\"\n            class=\"dropdown-menu show\"\n          >\n            <button\n              v-for=\"(item, index) in lineThicknessOptions\"\n              :key=\"index\"\n              class=\"dropdown-item\"\n              style=\"padding: 5px\"\n              @click=\"handleItemClick(updateLineThickness, 'draw', item.value)\"\n            >\n              {{ item.label }}\n            </button>\n          </div>\n        </div>\n\n        <div\n          class=\"btn-group\"\n          role=\"group\"\n        >\n          <button\n            id=\"freehandMode\"\n            class=\"btn btnBoard btn-secondary dropdown-toggle\"\n            @click=\"handleDropdownClick('freehandMode')\"\n          >\n            <font-awesome-icon :icon=\"faPaintBrush\" />\n          </button>\n          <div\n            v-if=\"dropdownOpen === 'freehandMode'\"\n            class=\"dropdown-menu show\"\n          >\n            <button\n              v-for=\"(item, index) in brushThicknessOptions\"\n              :key=\"index\"\n              class=\"dropdown-item\"\n              style=\"padding: 5px\"\n              @click=\"handleItemClick(updateBrushThickness, 'freehand', item.value)\"\n            >\n              {{ item.label }}\n            </button>\n          </div>\n        </div>\n\n        <div\n          class=\"btn-group\"\n          role=\"group\"\n        >\n          <button\n            id=\"shapeMode\"\n            class=\"btn btnBoard btn-secondary dropdown-toggle\"\n            @click=\"handleDropdownClick('shapeMode')\"\n          >\n            <font-awesome-icon :icon=\"faShapes\" />\n          </button>\n          <div\n            v-if=\"dropdownOpen === 'shapeMode'\"\n            class=\"dropdown-menu show\"\n          >\n            <button\n              v-for=\"(item, index) in shapeOptions\"\n              :key=\"index\"\n              class=\"dropdown-item\"\n              style=\"padding: 5px\"\n              @click=\"handleItemClick(updateShape, 'shape', item.value)\"\n            >\n              <img\n                v-if=\"item.icon\"\n                :src=\"item.icon\"\n                alt=\"Shape\"\n                class=\"shape-icon\"\n              />\n            </button>\n          </div>\n        </div>\n\n        <button\n          id=\"selectMode\"\n          class=\"btn btnBoard btn-secondary\"\n          @click=\"changeMode('select')\"\n        >\n          <font-awesome-icon :icon=\"faMousePointer\" />\n        </button>\n\n        <div\n          class=\"btn-group\"\n          role=\"group\"\n        >\n          <button\n            id=\"eraseMode\"\n            class=\"btn btnBoard btn-danger dropdown-toggle\"\n            @click=\"handleDropdownClick('eraseMode')\"\n          >\n            <font-awesome-icon :icon=\"faEraser\" />\n          </button>\n          <div\n            v-if=\"dropdownOpen === 'eraseMode'\"\n            class=\"dropdown-menu show\"\n          >\n            <button\n              v-for=\"(item, index) in eraserThicknessOptions\"\n              :key=\"index\"\n              class=\"dropdown-item\"\n              style=\"padding: 5px\"\n              @click=\"handleItemClick(updateEraserThickness, 'erase', item.value)\"\n            >\n              {{ item.label }}\n            </button>\n          </div>\n        </div>\n\n        <button\n          id=\"panMode\"\n          class=\"btn btnBoard btn-info\"\n          @click=\"changeMode('pan')\"\n        >\n          <font-awesome-icon :icon=\"faHandPaper\" />\n        </button>\n\n        <button\n          id=\"zoomIn\"\n          class=\"btn btnBoard btn-success\"\n          @click=\"(e) => zoomCanvas(1.2, e)\"\n        >\n          <font-awesome-icon :icon=\"faSearchPlus\" />\n        </button>\n\n        <button\n          id=\"zoomReset\"\n          class=\"btn btnBoard btn-success\"\n          @click=\"(e) => zoomCanvas(10, e)\"\n        >\n          <font-awesome-icon :icon=\"faSearch\" />\n        </button>\n\n        <button\n          id=\"zoomOut\"\n          class=\"btn btnBoard btn-success\"\n          @click=\"(e) => zoomCanvas(0.8, e)\"\n        >\n          <font-awesome-icon :icon=\"faSearchMinus\" />\n        </button>\n\n        <div\n          class=\"btn-group\"\n          role=\"group\"\n        >\n          <button\n            id=\"addText\"\n            class=\"btn btnBoard btn-secondary dropdown-toggle\"\n            @click=\"handleDropdownClick('addText')\"\n          >\n            <font-awesome-icon :icon=\"faFont\" />\n          </button>\n          <div\n            v-if=\"dropdownOpen === 'addText'\"\n            class=\"dropdown-menu show\"\n          >\n            <button\n              v-for=\"(item, index) in fontOptions\"\n              :key=\"index\"\n              class=\"dropdown-item\"\n              style=\"padding: 5px\"\n              @click=\"handleItemClick(updateFont, 'text', item.value)\"\n            >\n              {{ item.label }}\n            </button>\n          </div>\n        </div>\n\n        <div\n          class=\"btn-group\"\n          role=\"group\"\n        >\n          <button\n            id=\"fontSize\"\n            class=\"btn btnBoard btn-secondary dropdown-toggle\"\n            @click=\"handleDropdownClick('fontSize')\"\n          >\n            <font-awesome-icon :icon=\"faTextHeight\" />\n          </button>\n          <div\n            v-if=\"dropdownOpen === 'fontSize'\"\n            class=\"dropdown-menu show\"\n          >\n            <button\n              v-for=\"(item, index) in fontSizeOptions\"\n              :key=\"index\"\n              class=\"dropdown-item\"\n              style=\"padding: 5px\"\n              @click=\"handleItemClick(updateFontSize, '', item.value)\"\n            >\n              {{ item.label }}\n            </button>\n          </div>\n        </div>\n\n        <button\n          id=\"undo\"\n          class=\"btn btnBoard btn-secondary\"\n          @click=\"undo\"\n        >\n          <font-awesome-icon :icon=\"faUndo\" />\n        </button>\n\n        <button\n          id=\"redo\"\n          class=\"btn btnBoard btn-secondary\"\n          @click=\"redo\"\n        >\n          <font-awesome-icon :icon=\"faRedo\" />\n        </button>\n\n        <button\n          id=\"save\"\n          class=\"btn btnBoard btn-secondary\"\n          @click=\"saveCanvas\"\n        >\n          <font-awesome-icon :icon=\"faSave\" />\n        </button>\n\n        <button\n          id=\"delete\"\n          class=\"btn btnBoard btn-danger\"\n          @click=\"deleteShape()\"\n        >\n          <font-awesome-icon :icon=\"faTrash\" />\n        </button>\n\n        <button\n          id=\"clearCanvas\"\n          class=\"btn btnBoard btn-secondary\"\n          @click=\"clearCanvas()\"\n        >\n          <font-awesome-icon :icon=\"faTimes\" />\n        </button>\n\n        <button\n          id=\"toggleBackground\"\n          ref=\"toggleBackgroundRef\"\n          class=\"btn btnBoard btn-secondary\"\n          @click=\"toggleBackground()\"\n        >\n          <img\n            id=\"backgroundIcon\"\n            src=\"https://mediasfu.com/images/svg/graph.jpg\"\n            alt=\"Background\"\n            class=\"toggle-icon\"\n          />\n        </button>\n\n        <input\n          id=\"uploadBoardImage\"\n          type=\"file\"\n          accept=\"image/*\"\n          style=\"display: none\"\n          @change=\"uploadImage\"\n        />\n        <label\n          for=\"uploadBoardImage\"\n          class=\"btn btnBoard btn-primary\"\n        >\n          <font-awesome-icon :icon=\"faUpload\" />\n        </label>\n\n        <input\n          id=\"colorPicker\"\n          v-model=\"color\"\n          type=\"color\"\n          class=\"btn color-picker\"\n        />\n\n        <select\n          id=\"lineTypePicker\"\n          v-model=\"lineType\"\n          class=\"custom-select\"\n          style=\"width: auto\"\n        >\n          <option value=\"solid\">\n            Solid\n          </option>\n          <option value=\"dashed\">\n            Dashed\n          </option>\n          <option value=\"dotted\">\n            Dotted\n          </option>\n          <option value=\"dashDot\">\n            Dash-Dot\n          </option>\n        </select>\n      </div>\n\n      <canvas\n        id=\"whiteboardCanvas\"\n        ref=\"canvasRef\"\n        width=\"1280\"\n        height=\"720\"\n        style=\"border: 2px solid red\"\n      ></canvas>\n\n      <textarea\n        id=\"textInput\"\n        ref=\"textInputRef\"\n        class=\"form-control\"\n        style=\"display: none; position: absolute\"\n      ></textarea>\n\n      <a\n        ref=\"downloadLinkRef\"\n        href=\"#\"\n        style=\"display: none\"\n      >Download</a>\n      <canvas\n        ref=\"tempCanvasRef\"\n        style=\"display: none\"\n      ></canvas>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted, onUnmounted, watch } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport {\n  faTimes,\n  faUndo,\n  faRedo,\n  faEraser,\n  faShapes,\n  faMousePointer,\n  faHandPaper,\n  faTextHeight,\n  faFont,\n  faPencilAlt,\n  faPaintBrush,\n  faTrash,\n  faSave,\n  faSearch,\n  faSearchMinus,\n  faSearchPlus,\n  faChevronLeft,\n  faUpload,\n  faChevronRight,\n} from '@fortawesome/free-solid-svg-icons';\nimport type { Socket } from 'socket.io-client';\n\nexport interface Shape {\n  type: string;\n  x?: number;\n  y?: number;\n  x1?: number;\n  y1?: number;\n  x2?: number;\n  y2?: number;\n  text?: string;\n  color?: string;\n  font?: string;\n  fontSize?: number;\n  thickness?: number;\n  lineType?: string;\n  points?: Array<{ x: number; y: number }>;\n  img?: HTMLImageElement;\n  src?: string;\n}\n\nexport interface WhiteboardUser {\n  name: string;\n  useBoard: boolean;\n}\n\nexport interface Participant {\n  id: string;\n  name: string;\n  islevel: string;\n  isBanned?: boolean;\n}\n\n/**\n * Parameters object for the Whiteboard component\n * @interface WhiteboardParameters\n * \n * @property {Socket} socket - Socket.io connection for real-time shape synchronization\n * @property {Function} [showAlert] - Alert function for user feedback messages\n * @property {string} islevel - User's permission level ('2' = host, '1' = participant, '0' = guest)\n * @property {string} roomName - Room identifier for socket emissions\n * @property {Shape[]} shapes - Array of all shapes currently on the whiteboard canvas\n * @property {boolean} useImageBackground - Whether to use image background (grid) or plain background\n * @property {Shape[]} redoStack - Stack of shapes for redo operations\n * @property {string[]} undoStack - Stack of action IDs for undo operations\n * @property {boolean} whiteboardStarted - Whether whiteboard session has started\n * @property {boolean} whiteboardEnded - Whether whiteboard session has ended\n * @property {WhiteboardUser[]} whiteboardUsers - Array of users with whiteboard permissions\n * @property {Participant[]} participants - Current active participants in the room\n * @property {Participant[]} participantsAll - All participants including disconnected\n * @property {string} screenId - Current screen share producer ID\n * @property {boolean} recordStarted - Whether recording has started\n * @property {boolean} recordStopped - Whether recording has stopped\n * @property {boolean} recordPaused - Whether recording is paused\n * @property {boolean} recordResumed - Whether recording has resumed\n * @property {string} recordingMediaOptions - Recording media type ('video' | 'audio' | 'all')\n * @property {string} member - Current user's name/identifier\n * @property {boolean} shareScreenStarted - Whether screen sharing is active\n * @property {HTMLCanvasElement | null} [canvasWhiteboard] - Reference to the whiteboard canvas element\n * @property {string} [targetResolution] - Target resolution for participant canvas streaming ('sd' | 'hd' | 'fhd')\n * @property {string} [targetResolutionHost] - Target resolution for host canvas streaming\n * \n * @property {(shapes: Shape[]) => void} updateShapes - Function to update shapes array\n * @property {(useImageBackground: boolean) => void} updateUseImageBackground - Function to toggle background image\n * @property {(redoStack: Shape[]) => void} updateRedoStack - Function to update redo stack\n * @property {(undoStack: string[]) => void} updateUndoStack - Function to update undo stack\n * @property {(whiteboardStarted: boolean) => void} updateWhiteboardStarted - Function to update whiteboard started state\n * @property {(whiteboardEnded: boolean) => void} updateWhiteboardEnded - Function to update whiteboard ended state\n * @property {(whiteboardUsers: WhiteboardUser[]) => void} updateWhiteboardUsers - Function to update whiteboard users\n * @property {(participants: Participant[]) => void} updateParticipants - Function to update participants array\n * @property {(screenId: string) => void} updateScreenId - Function to update screen share ID\n * @property {(shareScreenStarted: boolean) => void} updateShareScreenStarted - Function to update screen share state\n * @property {(canvasWhiteboard: HTMLCanvasElement | null) => void} updateCanvasWhiteboard - Function to update canvas reference\n * \n * @property {Function} onScreenChanges - Function to handle screen orientation/size changes\n * @property {Function} captureCanvasStream - Function to capture canvas as MediaStream for streaming\n * @property {() => WhiteboardParameters} getUpdatedAllParams - Function to retrieve updated parameters object\n * \n * @example Basic WhiteboardParameters Object\n * ```ts\n * const whiteboardParams = {\n *   socket: socketConnection,\n *   showAlert: (alert) => console.log(alert.message),\n *   islevel: '2',\n *   roomName: 'room123',\n *   shapes: [],\n *   useImageBackground: true,\n *   redoStack: [],\n *   undoStack: [],\n *   whiteboardStarted: true,\n *   whiteboardEnded: false,\n *   whiteboardUsers: [{ name: 'HostUser', useBoard: true }],\n *   participants: allParticipants,\n *   participantsAll: allParticipants,\n *   screenId: '',\n *   recordStarted: false,\n *   recordStopped: false,\n *   recordPaused: false,\n *   recordResumed: false,\n *   recordingMediaOptions: 'video',\n *   member: 'HostUser',\n *   shareScreenStarted: false,\n *   updateShapes: (shapes) => { whiteboardShapes.value = shapes; },\n *   updateUseImageBackground: (use) => { useImageBg.value = use; },\n *   // ... other update functions\n *   onScreenChanges: async ({ changed, parameters }) => {\n *     if (changed) await adjustCanvasForOrientation(parameters);\n *   },\n *   captureCanvasStream: async ({ parameters, start }) => {\n *     if (start) await streamCanvas(parameters);\n *   },\n *   getUpdatedAllParams: () => ({ ...whiteboardParams })\n * };\n * ```\n */\nexport interface WhiteboardParameters {\n  socket: Socket;\n  showAlert?: (alert: { message: string; type: string }) => void;\n  islevel: string;\n  roomName: string;\n  shapes: Shape[];\n  useImageBackground: boolean;\n  redoStack: Shape[];\n  undoStack: string[];\n  whiteboardStarted: boolean;\n  whiteboardEnded: boolean;\n  whiteboardUsers: WhiteboardUser[];\n  participants: Participant[];\n  participantsAll: Participant[];\n  screenId: string;\n  recordStarted: boolean;\n  recordStopped: boolean;\n  recordPaused: boolean;\n  recordResumed: boolean;\n  recordingMediaOptions: string;\n  member: string;\n  shareScreenStarted: boolean;\n  canvasWhiteboard?: HTMLCanvasElement | null;\n  targetResolution?: string;\n  targetResolutionHost?: string;\n\n  updateShapes: (shapes: Shape[]) => void;\n  updateUseImageBackground: (useImageBackground: boolean) => void;\n  updateRedoStack: (redoStack: Shape[]) => void;\n  updateUndoStack: (undoStack: string[]) => void;\n  updateWhiteboardStarted: (whiteboardStarted: boolean) => void;\n  updateWhiteboardEnded: (whiteboardEnded: boolean) => void;\n  updateWhiteboardUsers: (whiteboardUsers: WhiteboardUser[]) => void;\n  updateParticipants: (participants: Participant[]) => void;\n  updateScreenId: (screenId: string) => void;\n  updateShareScreenStarted: (shareScreenStarted: boolean) => void;\n  updateCanvasWhiteboard: (canvasWhiteboard: HTMLCanvasElement | null) => void;\n\n  onScreenChanges: (options: { changed: boolean; parameters: WhiteboardParameters }) => Promise<void>;\n  captureCanvasStream: (options: {\n    parameters: WhiteboardParameters;\n    start: boolean;\n  }) => Promise<void>;\n\n  getUpdatedAllParams: () => WhiteboardParameters;\n  [key: string]: any;\n}\n\n/**\n * Props for the Whiteboard component\n * @interface WhiteboardProps\n * \n * @property {number} customWidth - Width of the whiteboard canvas in pixels\n * @property {number} customHeight - Height of the whiteboard canvas in pixels\n * @property {WhiteboardParameters} parameters - Parameters object with socket, state, and callback functions\n * @property {boolean} showAspect - Whether to display the whiteboard (used for conditional rendering)\n * \n * @example WhiteboardProps Usage\n * ```ts\n * const whiteboardProps = {\n *   customWidth: 1200,\n *   customHeight: 800,\n *   parameters: {\n *     socket: socketConnection,\n *     roomName: 'room123',\n *     islevel: '2',\n *     member: 'HostUser',\n *     shapes: [],\n *     useImageBackground: true,\n *     whiteboardStarted: true,\n *     whiteboardEnded: false,\n *     participants: participants,\n *     // ... other required parameters\n *   },\n *   showAspect: true\n * };\n * ```\n * \n * @default customWidth - No default (required)\n * @default customHeight - No default (required)\n * @default parameters - No default (required)\n * @default showAspect - No default (required)\n */\nexport interface WhiteboardProps {\n  customWidth: number;\n  customHeight: number;\n  parameters: WhiteboardParameters;\n  showAspect: boolean;\n}\n\nconst props = defineProps<WhiteboardProps>();\n\n// Refs for canvas and elements\nconst canvasRef = ref<HTMLCanvasElement | null>(null);\nconst textInputRef = ref<HTMLTextAreaElement | null>(null);\nconst toggleBackgroundRef = ref<HTMLButtonElement | null>(null);\nconst downloadLinkRef = ref<HTMLAnchorElement | null>(null);\nconst tempCanvasRef = ref<HTMLCanvasElement | null>(null);\n\n// Drawing state\nconst mode = ref<string>('pan');\nconst isDrawing = ref<boolean>(false);\nconst isPanning = ref<boolean>(false);\nconst isDragging = ref<boolean>(false);\nconst startX = ref<number>(0);\nconst startY = ref<number>(0);\nconst currentX = ref<number>(0);\nconst currentY = ref<number>(0);\nconst freehandDrawing = ref<Array<{ x: number; y: number }>>([]);\nconst selectedShape = ref<Shape | null>(null);\nconst selectedHandle = ref<{ x: number; y: number; isCenter?: boolean } | null>(null);\nconst movingShape = ref<boolean>(false);\nconst panX = ref<number>(0);\nconst panY = ref<number>(0);\nconst scale = ref<number>(1);\nconst minScale = ref<number>(0.25);\nconst maxScale = ref<number>(1.75);\n\n// Tool settings\nconst eraserThickness = ref<number>(10);\nconst brushThickness = ref<number>(6);\nconst lineThickness = ref<number>(6);\nconst lineType = ref<string>('solid');\nconst color = ref<string>('#000000');\nconst font = ref<string>('Arial');\nconst fontSize = ref<number>(20);\nconst shape = ref<string | null>(null);\n\n// UI state\nconst toolbarVisible = ref<boolean>(true);\nconst dropdownOpen = ref<string | null>(null);\nconst isValidShape = ref<boolean>(true);\n\n// Background and dimensions\nconst backgroundImage = ref<HTMLImageElement>(new Image());\nconst imageBackgroundUrl = 'https://mediasfu.com/images/svg/graph_paper.jpg';\nconst maxWidth = ref<number>(1280);\nconst maxHeight = ref<number>(720);\nconst dimensionsFixed = ref<boolean>(false);\n\n// Canvas context\nlet ctx: CanvasRenderingContext2D | null = null;\n\n// Dropdown options\nconst lineThicknessOptions = [\n  { label: 'XX-Small (3px)', value: 3 },\n  { label: 'X-Small (6px)', value: 6 },\n  { label: 'Small (12px)', value: 12 },\n  { label: 'Medium (18px)', value: 18 },\n  { label: 'Large (24px)', value: 24 },\n  { label: 'X-Large (36px)', value: 36 },\n];\n\nconst brushThicknessOptions = [\n  { label: 'X-Small (5px)', value: 5 },\n  { label: 'Small (10px)', value: 10 },\n  { label: 'Medium (20px)', value: 20 },\n  { label: 'Large (40px)', value: 40 },\n  { label: 'X-Large (60px)', value: 60 },\n];\n\nconst eraserThicknessOptions = [\n  { label: 'X-Small (5px)', value: 5 },\n  { label: 'Small (10px)', value: 10 },\n  { label: 'Medium (20px)', value: 20 },\n  { label: 'Large (30px)', value: 30 },\n  { label: 'X-Large (60px)', value: 60 },\n];\n\nconst fontOptions = [\n  { label: 'Arial', value: 'Arial' },\n  { label: 'Times New Roman', value: 'Times New Roman' },\n  { label: 'Courier New', value: 'Courier New' },\n  { label: 'Verdana', value: 'Verdana' },\n];\n\nconst fontSizeOptions = [\n  { label: 'X-Small (5px)', value: 5 },\n  { label: 'Small (10px)', value: 10 },\n  { label: 'Medium (20px)', value: 20 },\n  { label: 'Large (40px)', value: 40 },\n  { label: 'X-Large (60px)', value: 60 },\n];\n\nconst shapeOptions = [\n  { icon: 'https://mediasfu.com/images/svg/square.svg', value: 'square' },\n  { icon: 'https://mediasfu.com/images/svg/rectangle.svg', value: 'rectangle' },\n  { icon: 'https://mediasfu.com/images/svg/circle.svg', value: 'circle' },\n  { icon: 'https://mediasfu.com/images/svg/triangle.svg', value: 'triangle' },\n  { icon: 'https://mediasfu.com/images/svg/hexagon.svg', value: 'hexagon' },\n  { icon: 'https://mediasfu.com/images/svg/pentagon.svg', value: 'pentagon' },\n  { icon: 'https://mediasfu.com/images/svg/rhombus.svg', value: 'rhombus' },\n  { icon: 'https://mediasfu.com/images/svg/octagon.svg', value: 'octagon' },\n  { icon: 'https://mediasfu.com/images/svg/parallelogram.svg', value: 'parallelogram' },\n  { icon: 'https://mediasfu.com/images/svg/oval.svg', value: 'oval' },\n];\n\n// Update functions\nconst updateFont = (newFont: string) => {\n  font.value = newFont;\n};\n\nconst updateFontSize = (newFontSize: number) => {\n  fontSize.value = newFontSize;\n};\n\nconst updateShape = (newShape: string) => {\n  shape.value = newShape;\n};\n\nconst updateLineThickness = (newThickness: number) => {\n  lineThickness.value = newThickness;\n};\n\nconst updateBrushThickness = (newThickness: number) => {\n  brushThickness.value = newThickness;\n};\n\nconst updateEraserThickness = (newThickness: number) => {\n  eraserThickness.value = newThickness;\n};\n\n// Helper functions\nconst checkBoardAccess = (): boolean => {\n  const { whiteboardStarted, whiteboardEnded, whiteboardUsers, member, islevel, showAlert } =\n    props.parameters;\n  if (whiteboardStarted && !whiteboardEnded) {\n    const user = whiteboardUsers.find((user) => user.name === member);\n    if ((!user || !user.useBoard) && islevel !== '2') {\n      showAlert?.({\n        message: 'You are not allowed to use the whiteboard. Please ask the host to assign you.',\n        type: 'danger',\n      });\n      return false;\n    }\n    return true;\n  }\n  return true;\n};\n\nconst changeMode = (newMode: string) => {\n  if (newMode !== 'pan' && !checkBoardAccess()) return;\n  mode.value = newMode;\n\n  const canvas = canvasRef.value;\n  if (!canvas) return;\n\n  if (newMode === 'pan') {\n    canvas.style.cursor = 'grab';\n  } else if (newMode === 'select') {\n    canvas.style.cursor = 'pointer';\n  } else if (newMode === 'erase') {\n    canvas.style.cursor = 'crosshair';\n  } else {\n    canvas.style.cursor = 'crosshair';\n  }\n\n  if (newMode !== 'freehand' && freehandDrawing.value.length > 0) {\n    props.parameters.updateShapes([\n      ...props.parameters.shapes,\n      {\n        type: 'freehand',\n        points: freehandDrawing.value,\n        color: color.value,\n        thickness: brushThickness.value,\n      }\n    ]);\n    freehandDrawing.value = [];\n    saveState();\n  }\n};\n\nconst handleServerResponse = (response: { success: boolean; reason: string }) => {\n  if (!response.success) {\n    props.parameters.showAlert?.({\n      message: `Whiteboard action failed: ${response.reason}`,\n      type: 'danger',\n    });\n  }\n};\n\nconst drawLine = (\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n  color: string,\n  thickness: number,\n  lineType: string\n) => {\n  if (!ctx) return;\n  ctx.beginPath();\n  ctx.strokeStyle = color;\n  ctx.lineWidth = thickness;\n  if (lineType === 'dashed') {\n    ctx.setLineDash([10, 10]);\n  } else if (lineType === 'dotted') {\n    ctx.setLineDash([2, 10]);\n  } else if (lineType === 'dashDot') {\n    ctx.setLineDash([10, 5, 2, 5]);\n  } else {\n    ctx.setLineDash([]);\n  }\n  ctx.moveTo(x1, y1);\n  ctx.lineTo(x2, y2);\n  ctx.stroke();\n  ctx.setLineDash([]);\n};\n\nconst drawFreehand = (points: Array<{ x: number; y: number }>, color: string, thickness: number) => {\n  if (points.length < 2 || !ctx) return;\n  const context = ctx;\n  context.strokeStyle = color;\n  context.lineWidth = thickness;\n  context.beginPath();\n  context.moveTo(points[0]!.x, points[0]!.y);\n  for (let i = 1; i < points.length; i++) {\n    context.lineTo(points[i]!.x, points[i]!.y);\n  }\n  context.stroke(); \n};\n\nconst drawPolygon = (\n  ctxParam: CanvasRenderingContext2D,\n  sides: number,\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number\n) => {\n  const centerX = (x1 + x2) / 2;\n  const centerY = (y1 + y2) / 2;\n  const radius = Math.min(Math.abs(x2 - x1), Math.abs(y2 - y1)) / 2;\n  const angle = (2 * Math.PI) / sides;\n  ctxParam.beginPath();\n  for (let i = 0; i < sides; i++) {\n    const x = centerX + radius * Math.cos(i * angle - Math.PI / 2);\n    const y = centerY + radius * Math.sin(i * angle - Math.PI / 2);\n    if (i === 0) {\n      ctxParam.moveTo(x, y);\n    } else {\n      ctxParam.lineTo(x, y);\n    }\n  }\n  ctxParam.closePath();\n  ctxParam.stroke();\n};\n\nconst drawShape = (\n  type: string,\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n  color: string,\n  thickness: number,\n  lineType: string,\n  img: HTMLImageElement | null = null,\n  ctxx: CanvasRenderingContext2D | null = null\n) => {\n  const drawCtx = ctxx || ctx;\n  if (!drawCtx) return;\n\n  drawCtx.beginPath();\n  drawCtx.strokeStyle = color;\n  drawCtx.lineWidth = thickness;\n  if (lineType === 'dashed') {\n    drawCtx.setLineDash([10, 10]);\n  } else if (lineType === 'dotted') {\n    drawCtx.setLineDash([2, 10]);\n  } else if (lineType === 'dashDot') {\n    drawCtx.setLineDash([10, 5, 2, 5]);\n  } else {\n    drawCtx.setLineDash([]);\n  }\n\n  if (type === 'rectangle') {\n    drawCtx.strokeRect(x1, y1, x2 - x1, y2 - y1);\n  } else if (type === 'circle') {\n    const radius = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));\n    drawCtx.arc(x1, y1, radius, 0, 2 * Math.PI);\n    drawCtx.stroke();\n  } else if (type === 'rhombus') {\n    const centerX = (x1 + x2) / 2;\n    const centerY = (y1 + y2) / 2;\n    drawCtx.moveTo(centerX, y1);\n    drawCtx.lineTo(x2, centerY);\n    drawCtx.lineTo(centerX, y2);\n    drawCtx.lineTo(x1, centerY);\n    drawCtx.closePath();\n    drawCtx.stroke();\n  } else if (type === 'pentagon') {\n    drawPolygon(drawCtx, 5, x1, y1, x2, y2);\n  } else if (type === 'hexagon') {\n    drawPolygon(drawCtx, 6, x1, y1, x2, y2);\n  } else if (type === 'triangle') {\n    const centerXTriangle = (x1 + x2) / 2;\n    drawCtx.moveTo(centerXTriangle, y1);\n    drawCtx.lineTo(x2, y2);\n    drawCtx.lineTo(x1, y2);\n    drawCtx.closePath();\n    drawCtx.stroke();\n  } else if (type === 'square') {\n    drawCtx.strokeRect(x1, y1, x2 - x1, x2 - x1);\n  } else if (type === 'octagon') {\n    drawPolygon(drawCtx, 8, x1, y1, x2, y2);\n  } else if (type === 'oval') {\n    const radiusX = Math.abs(x2 - x1) / 2;\n    const radiusY = Math.abs(y2 - y1) / 2;\n    const centerX = (x1 + x2) / 2;\n    const centerY = (y1 + y2) / 2;\n    drawCtx.ellipse(centerX, centerY, radiusX, radiusY, 0, 0, 2 * Math.PI);\n    drawCtx.stroke();\n  } else if (type === 'parallelogram') {\n    const centerX = (x1 + x2) / 2;\n    drawCtx.moveTo(centerX, y1);\n    drawCtx.lineTo(x2, y2);\n    drawCtx.lineTo(centerX, y2);\n    drawCtx.lineTo(x1, y1);\n    drawCtx.closePath();\n    drawCtx.stroke();\n  } else if (type === 'image' && img) {\n    drawCtx.drawImage(img, x1, y1, x2 - x1, y2 - y1);\n  }\n};\n\nconst drawEdgeMarkers = () => {\n  if (!ctx) return;\n  ctx.save();\n  ctx.setTransform(1, 0, 0, 1, 0, 0);\n  ctx.strokeStyle = 'red';\n  ctx.lineWidth = 5;\n  ctx.setLineDash([]);\n\n  const markerLength = 20;\n  const topLeftX = panX.value;\n  const topLeftY = panY.value;\n  const bottomRightX = panX.value + maxWidth.value * scale.value;\n  const bottomRightY = panY.value + maxHeight.value * scale.value;\n\n  ctx.beginPath();\n  ctx.moveTo(topLeftX, topLeftY + markerLength);\n  ctx.lineTo(topLeftX, topLeftY);\n  ctx.lineTo(topLeftX + markerLength, topLeftY);\n  ctx.stroke();\n\n  ctx.beginPath();\n  ctx.moveTo(bottomRightX - markerLength, topLeftY);\n  ctx.lineTo(bottomRightX, topLeftY);\n  ctx.lineTo(bottomRightX, topLeftY + markerLength);\n  ctx.stroke();\n\n  ctx.beginPath();\n  ctx.moveTo(bottomRightX, bottomRightY - markerLength);\n  ctx.lineTo(bottomRightX, bottomRightY);\n  ctx.lineTo(bottomRightX - markerLength, bottomRightY);\n  ctx.stroke();\n\n  ctx.beginPath();\n  ctx.moveTo(topLeftX + markerLength, bottomRightY);\n  ctx.lineTo(topLeftX, bottomRightY);\n  ctx.lineTo(topLeftX, bottomRightY - markerLength);\n  ctx.stroke();\n\n  ctx.restore();\n};\n\nconst drawShapes = () => {\n  const canvas = canvasRef.value;\n  if (!ctx || !canvas) return;\n\n  ctx.clearRect(0, 0, canvas.width, canvas.height);\n  ctx.save();\n  ctx.setTransform(scale.value, 0, 0, scale.value, panX.value, panY.value);\n\n  if (props.parameters.useImageBackground) {\n    ctx.drawImage(\n      backgroundImage.value,\n      -panX.value / scale.value,\n      -panY.value / scale.value,\n      canvas.width / scale.value,\n      canvas.height / scale.value\n    );\n  } else {\n    ctx.fillStyle = '#fff';\n    ctx.fillRect(\n      -panX.value / scale.value,\n      -panY.value / scale.value,\n      canvas.width / scale.value,\n      canvas.height / scale.value\n    );\n  }\n\n  props.parameters.shapes.forEach((shapeItem) => {\n    if (!ctx) return;\n    if (shapeItem.type === 'line') {\n      drawLine(\n        shapeItem.x1!,\n        shapeItem.y1!,\n        shapeItem.x2!,\n        shapeItem.y2!,\n        shapeItem.color!,\n        shapeItem.thickness!,\n        shapeItem.lineType!\n      );\n    } else if (shapeItem.type === 'freehand') {\n      drawFreehand(shapeItem.points!, shapeItem.color!, shapeItem.thickness!);\n    } else if (shapeItem.type === 'text') {\n      ctx.font = `${shapeItem.fontSize}px ${shapeItem.font}`;\n      ctx.fillStyle = shapeItem.color!;\n      ctx.fillText(shapeItem.text!, shapeItem.x!, shapeItem.y!);\n    } else if (shapeItem.type === 'image') {\n      ctx.drawImage(\n        shapeItem.img!,\n        shapeItem.x1!,\n        shapeItem.y1!,\n        shapeItem.x2! - shapeItem.x1!,\n        shapeItem.y2! - shapeItem.y1!\n      );\n    } else {\n      drawShape(\n        shapeItem.type,\n        shapeItem.x1!,\n        shapeItem.y1!,\n        shapeItem.x2!,\n        shapeItem.y2!,\n        shapeItem.color!,\n        shapeItem.thickness!,\n        shapeItem.lineType!\n      );\n    }\n  });\n\n  ctx.restore();\n  drawEdgeMarkers();\n};\n\nconst erase = (x: number, y: number) => {\n  if (!ctx) return;\n  ctx.save();\n  ctx.globalCompositeOperation = 'destination-out';\n  ctx.beginPath();\n  ctx.arc(x, y, eraserThickness.value / 2, 0, Math.PI * 2, false);\n  ctx.fill();\n  ctx.restore();\n\n  let changeOccurred = false;\n  let shapes = props.parameters.shapes\n    .map((shapeItem) => {\n      if (shapeItem.type === 'freehand') {\n        return {\n          ...shapeItem,\n          points: shapeItem.points!.filter((point) => {\n            const distance = Math.sqrt(Math.pow(point.x - x, 2) + Math.pow(point.y - y, 2));\n            if (distance <= eraserThickness.value / 2) {\n              changeOccurred = true;\n              return false;\n            }\n            return distance > eraserThickness.value / 2;\n          }),\n        };\n      } else if (shapeItem.type === 'line') {\n        if (\n          isPointNearLine(\n            x,\n            y,\n            shapeItem.x1!,\n            shapeItem.y1!,\n            shapeItem.x2!,\n            shapeItem.y2!,\n            eraserThickness.value / 2\n          )\n        ) {\n          changeOccurred = true;\n          return null;\n        }\n      } else if (shapeItem.type === 'text') {\n        const textWidth = ctx!.measureText(shapeItem.text!).width;\n        if (\n          x > shapeItem.x! &&\n          x < shapeItem.x! + textWidth &&\n          y > shapeItem.y! - shapeItem.fontSize! &&\n          y < shapeItem.y!\n        ) {\n          changeOccurred = true;\n          return null;\n        }\n      } else if (shapeItem.type === 'image') {\n        if (x > shapeItem.x1! && x < shapeItem.x2! && y > shapeItem.y1! && y < shapeItem.y2!) {\n          changeOccurred = true;\n          return null;\n        }\n      } else {\n        if (x > shapeItem.x1! && x < shapeItem.x2! && y > shapeItem.y1! && y < shapeItem.y2!) {\n          changeOccurred = true;\n          return null;\n        }\n      }\n      return shapeItem;\n    })\n    .filter(\n      (shapeItem) => shapeItem && (shapeItem.type !== 'freehand' || shapeItem.points!.length > 0)\n    ) as Shape[];\n\n  props.parameters.updateShapes(shapes);\n  drawShapes();\n\n  if (changeOccurred) {\n    props.parameters.socket.emit(\n      'updateBoardAction',\n      { action: 'shapes', payload: { shapes } },\n      handleServerResponse\n    );\n  }\n};\n\nconst isPointNearLine = (\n  px: number,\n  py: number,\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n  threshold: number\n): boolean => {\n  const dx = x2 - x1;\n  const dy = y2 - y1;\n  const length = Math.sqrt(dx * dx + dy * dy);\n  const dot = ((px - x1) * dx + (py - y1) * dy) / (length * length);\n  const closestX = x1 + dot * dx;\n  const closestY = y1 + dot * dy;\n  const distance = Math.sqrt(Math.pow(px - closestX, 2) + Math.pow(py - closestY, 2));\n  return distance <= threshold;\n};\n\nconst findShape = (x: number, y: number): Shape | undefined => {\n  return props.parameters.shapes.find((shapeItem) => {\n    if (shapeItem.type === 'freehand') {\n      return shapeItem.points!.some((point) => {\n        const distance = Math.sqrt(Math.pow(point.x - x, 2) + Math.pow(point.y - y, 2));\n        return distance < shapeItem.thickness!;\n      });\n    } else if (shapeItem.type === 'text') {\n      if (!ctx) return false;\n      ctx.font = `${shapeItem.fontSize}px ${shapeItem.font}`;\n      const textMetrics = ctx.measureText(shapeItem.text!);\n      return (\n        x > shapeItem.x! &&\n        x < shapeItem.x! + textMetrics.width &&\n        y > shapeItem.y! - shapeItem.fontSize! &&\n        y < shapeItem.y!\n      );\n    } else if (shapeItem.type === 'image') {\n      return x > shapeItem.x1! && x < shapeItem.x2! && y > shapeItem.y1! && y < shapeItem.y2!;\n    } else {\n      return x > shapeItem.x1! && x < shapeItem.x2! && y > shapeItem.y1! && y < shapeItem.y2!;\n    }\n  });\n};\n\nconst getResizeHandles = (shapeItem: Shape) => {\n  const handles: any[] = [];\n  if (shapeItem.type === 'line') {\n    handles.push({ x: shapeItem.x1!, y: shapeItem.y1! });\n    handles.push({ x: shapeItem.x2!, y: shapeItem.y2! });\n  } else if (shapeItem.type === 'circle') {\n    const radius = Math.sqrt(\n      Math.pow(shapeItem.x2! - shapeItem.x1!, 2) + Math.pow(shapeItem.y2! - shapeItem.y1!, 2)\n    );\n    handles.push({ x: shapeItem.x1! + radius, y: shapeItem.y1! });\n    handles.push({ x: shapeItem.x1! - radius, y: shapeItem.y1! });\n    handles.push({ x: shapeItem.x1!, y: shapeItem.y1! + radius });\n    handles.push({ x: shapeItem.x1!, y: shapeItem.y1! - radius });\n    handles.push({ x: shapeItem.x1!, y: shapeItem.y1!, isCenter: true });\n  } else if (shapeItem.type === 'text') {\n    if (!ctx) return handles;\n    const textMetrics = ctx.measureText(shapeItem.text!);\n    handles.push({ x: shapeItem.x!, y: shapeItem.y! - shapeItem.fontSize!, isCenter: true });\n    handles.push({ x: shapeItem.x! + textMetrics.width, y: shapeItem.y!, isCenter: false });\n  } else if (shapeItem.type === 'image') {\n    handles.push({ x: shapeItem.x1!, y: shapeItem.y1! });\n    handles.push({ x: shapeItem.x2!, y: shapeItem.y1! });\n    handles.push({ x: shapeItem.x2!, y: shapeItem.y2! });\n    handles.push({ x: shapeItem.x1!, y: shapeItem.y2! });\n    handles.push({\n      x: (shapeItem.x1! + shapeItem.x2!) / 2,\n      y: (shapeItem.y1! + shapeItem.y2!) / 2,\n      isCenter: true,\n    });\n  } else {\n    handles.push({ x: shapeItem.x1!, y: shapeItem.y1! });\n    handles.push({ x: shapeItem.x2!, y: shapeItem.y1! });\n    handles.push({ x: shapeItem.x2!, y: shapeItem.y2! });\n    handles.push({ x: shapeItem.x1!, y: shapeItem.y2! });\n    handles.push({\n      x: (shapeItem.x1! + shapeItem.x2!) / 2,\n      y: (shapeItem.y1! + shapeItem.y2!) / 2,\n      isCenter: true,\n    });\n  }\n  return handles.map((handle) => ({\n    ...handle,\n    isCenter: handle.isCenter || false,\n  }));\n};\n\nconst drawSelection = (shapeItem: Shape | null) => {\n  if (!shapeItem || !ctx) return;\n\n  const handles = getResizeHandles(shapeItem);\n  ctx.strokeStyle = 'red';\n  ctx.lineWidth = 2;\n  ctx.setLineDash([6, 3]);\n\n  if (shapeItem.type === 'line') {\n    ctx.beginPath();\n    ctx.moveTo(shapeItem.x1!, shapeItem.y1!);\n    ctx.lineTo(shapeItem.x2!, shapeItem.y2!);\n    ctx.stroke();\n  } else if (shapeItem.type === 'circle') {\n    const radius = Math.sqrt(\n      Math.pow(shapeItem.x2! - shapeItem.x1!, 2) + Math.pow(shapeItem.y2! - shapeItem.y1!, 2)\n    );\n    ctx.beginPath();\n    ctx.arc(shapeItem.x1!, shapeItem.y1!, radius, 0, 2 * Math.PI);\n    ctx.stroke();\n  } else {\n    ctx.strokeRect(shapeItem.x1!, shapeItem.y1!, shapeItem.x2! - shapeItem.x1!, shapeItem.y2! - shapeItem.y1!);\n  }\n\n  ctx.setLineDash([]);\n\n  handles.forEach((handle) => {\n    ctx!.fillStyle = handle.isCenter ? 'blue' : 'red';\n    ctx!.fillRect(handle.x - 6, handle.y - 6, 12, 12);\n  });\n};\n\nconst getHandleAtPosition = (\n  x: number,\n  y: number\n): { x: number; y: number; isCenter?: boolean } | undefined => {\n  if (!selectedShape.value) return undefined;\n  return getResizeHandles(selectedShape.value).find((handle) => {\n    return Math.abs(handle.x - x) < 6 && Math.abs(handle.y - y) < 6;\n  });\n};\n\nconst moveShape = (shapeItem: Shape, dx: number, dy: number) => {\n  if (shapeItem.type === 'line' || shapeItem.type === 'circle') {\n    shapeItem.x1! += dx;\n    shapeItem.y1! += dy;\n    shapeItem.x2! += dx;\n    shapeItem.y2! += dy;\n  } else if (shapeItem.type === 'freehand') {\n    shapeItem.points!.forEach((point) => {\n      point.x += dx;\n      point.y += dy;\n    });\n  } else if (shapeItem.type === 'text') {\n    shapeItem.x! += dx;\n    shapeItem.y! += dy;\n  } else if (shapeItem.type === 'image') {\n    shapeItem.x1! += dx;\n    shapeItem.y1! += dy;\n    shapeItem.x2! += dx;\n    shapeItem.y2! += dy;\n  } else {\n    shapeItem.x1! += dx;\n    shapeItem.y1! += dy;\n    shapeItem.x2! += dx;\n    shapeItem.y2! += dy;\n  }\n};\n\nconst resizeShape = (\n  shapeItem: Shape,\n  handle: { x: number; y: number; isCenter?: boolean },\n  x: number,\n  y: number\n) => {\n  if (shapeItem.type === 'line') {\n    if (handle.x === shapeItem.x1 && handle.y === shapeItem.y1) {\n      shapeItem.x1 = x;\n      shapeItem.y1 = y;\n    } else {\n      shapeItem.x2 = x;\n      shapeItem.y2 = y;\n    }\n  } else if (shapeItem.type === 'circle') {\n    const dx = x - shapeItem.x1!;\n    const dy = y - shapeItem.y1!;\n    const radius = Math.sqrt(dx * dx + dy * dy);\n    shapeItem.x2 = shapeItem.x1! + radius;\n    shapeItem.y2 = shapeItem.y1!;\n  } else if (shapeItem.type === 'text') {\n    if (handle.isCenter) {\n      shapeItem.x = x;\n      shapeItem.y = y;\n    } else {\n      if (!ctx) return;\n      const textMetrics = ctx.measureText(shapeItem.text!);\n      shapeItem.x = x - textMetrics.width;\n      shapeItem.y = y;\n    }\n  } else if (shapeItem.type === 'image') {\n    if (handle.isCenter) {\n      const dx = x - (shapeItem.x1! + shapeItem.x2!) / 2;\n      const dy = y - (shapeItem.y1! + shapeItem.y2!) / 2;\n      moveShape(shapeItem, dx, dy);\n    } else {\n      if (handle.x === shapeItem.x1! && handle.y === shapeItem.y1!) {\n        shapeItem.x1 = x;\n        shapeItem.y1 = y;\n      } else if (handle.x === shapeItem.x2! && handle.y === shapeItem.y1!) {\n        shapeItem.x2 = x;\n        shapeItem.y1 = y;\n      } else if (handle.x === shapeItem.x2! && handle.y === shapeItem.y2!) {\n        shapeItem.x2 = x;\n        shapeItem.y2 = y;\n      } else {\n        shapeItem.x1 = x;\n        shapeItem.y2 = y;\n      }\n    }\n  } else {\n    if (handle.isCenter) {\n      const dx = x - (shapeItem.x1! + shapeItem.x2!) / 2;\n      const dy = y - (shapeItem.y1! + shapeItem.y2!) / 2;\n      moveShape(shapeItem, dx, dy);\n    } else {\n      if (handle.x === shapeItem.x1! && handle.y === shapeItem.y1!) {\n        shapeItem.x1 = x;\n        shapeItem.y1 = y;\n      } else if (handle.x === shapeItem.x2! && handle.y === shapeItem.y1!) {\n        shapeItem.x2 = x;\n        shapeItem.y1 = y;\n      } else if (handle.x === shapeItem.x2! && handle.y === shapeItem.y2!) {\n        shapeItem.x2 = x;\n        shapeItem.y2 = y;\n      } else {\n        shapeItem.x1 = x;\n        shapeItem.y2 = y;\n      }\n    }\n  }\n  drawShapes();\n};\n\nconst startDrawing = (e: MouseEvent) => {\n  try {\n    isDrawing.value = true;\n    startX.value = (e.offsetX - panX.value) / scale.value;\n    startY.value = (e.offsetY - panY.value) / scale.value;\n\n    if (mode.value === 'erase') {\n      erase(startX.value, startY.value);\n    } else if (mode.value === 'draw' || mode.value === 'freehand') {\n      ctx?.beginPath();\n      ctx?.moveTo(startX.value, startY.value);\n      if (mode.value === 'freehand') {\n        freehandDrawing.value = [{ x: startX.value, y: startY.value }];\n      }\n    } else if (mode.value === 'pan') {\n      isPanning.value = true;\n      isDragging.value = false;\n    } else if (mode.value === 'select') {\n      selectedHandle.value = getHandleAtPosition(startX.value, startY.value) ?? null;\n      if (selectedHandle.value) {\n        isDragging.value = true;\n        movingShape.value = selectedHandle.value.isCenter || false;\n      } else {\n        selectedShape.value = findShape(startX.value, startY.value) ?? null;\n        if (selectedShape.value) {\n          drawShapes();\n          drawSelection(selectedShape.value);\n        }\n      }\n    }\n  } catch (error) {\n    console.error('Error in startDrawing:', error);\n  }\n};\n\nconst draw = (e: MouseEvent) => {\n  const canvas = canvasRef.value;\n  if (!canvas) return;\n\n  if (!dimensionsFixed.value) {\n    try {\n      if (\n        props.parameters.targetResolution === 'qhd' ||\n        props.parameters.targetResolutionHost === 'qhd'\n      ) {\n        maxWidth.value = 1920;\n        maxHeight.value = 1080;\n      } else if (\n        props.parameters.targetResolution === 'fhd' ||\n        props.parameters.targetResolutionHost === 'fhd'\n      ) {\n        maxWidth.value = 1920;\n        maxHeight.value = 1080;\n      }\n      canvas.width = maxWidth.value;\n      canvas.height = maxHeight.value;\n      dimensionsFixed.value = true;\n      props.parameters.updateCanvasWhiteboard(canvas);\n    } catch {\n      // handle error\n    }\n  }\n\n  if (!isDrawing.value) return;\n\n  currentX.value = (e.offsetX - panX.value) / scale.value;\n  currentY.value = (e.offsetY - panY.value) / scale.value;\n\n  if (mode.value === 'draw' || mode.value === 'freehand' || mode.value === 'shape') {\n    if (currentX.value > maxWidth.value || currentY.value > maxHeight.value) {\n      isValidShape.value = false;\n      return;\n    } else {\n      isValidShape.value = true;\n    }\n  }\n\n  if (mode.value === 'erase') {\n    erase(currentX.value, currentY.value);\n  } else if (mode.value === 'draw') {\n    ctx!.clearRect(0, 0, canvas.width, canvas.height);\n    drawShapes();\n    drawLine(\n      startX.value,\n      startY.value,\n      currentX.value,\n      currentY.value,\n      color.value,\n      lineThickness.value,\n      lineType.value\n    );\n  } else if (mode.value === 'freehand') {\n    ctx!.lineTo(currentX.value, currentY.value);\n    ctx!.strokeStyle = color.value;\n    ctx!.lineWidth = brushThickness.value;\n    ctx!.stroke();\n    freehandDrawing.value.push({ x: currentX.value, y: currentY.value });\n  } else if (mode.value === 'shape') {\n    ctx!.clearRect(0, 0, canvas.width, canvas.height);\n    drawShapes();\n    drawShape(\n      shape.value!,\n      startX.value,\n      startY.value,\n      currentX.value,\n      currentY.value,\n      color.value,\n      lineThickness.value,\n      lineType.value\n    );\n  } else if (mode.value === 'pan' && isPanning.value) {\n    isDragging.value = true;\n    const dx = e.clientX - startX.value;\n    const dy = e.clientY - startY.value;\n    panX.value += dx;\n    panY.value += dy;\n    startX.value = e.clientX;\n    startY.value = e.clientY;\n\n    ctx!.setTransform(scale.value, 0, 0, scale.value, panX.value, panY.value);\n    drawShapes();\n  } else if (mode.value === 'select' && selectedShape.value) {\n    ctx!.clearRect(0, 0, canvas.width, canvas.height);\n    if (movingShape.value) {\n      const dx = currentX.value - startX.value;\n      const dy = currentY.value - startY.value;\n      moveShape(selectedShape.value, dx, dy);\n      startX.value = currentX.value;\n      startY.value = currentY.value;\n    } else if (isDragging.value) {\n      resizeShape(selectedShape.value, selectedHandle.value!, currentX.value, currentY.value);\n    }\n    drawShapes();\n    drawSelection(selectedShape.value);\n  }\n};\n\nconst stopDrawing = () => {\n  isDrawing.value = false;\n  isPanning.value = false;\n  isDragging.value = false;\n  ctx?.closePath();\n\n  if (mode.value === 'draw' && isValidShape.value) {\n    props.parameters.updateShapes([\n      ...props.parameters.shapes,\n      {\n        type: 'line',\n        x1: startX.value,\n        y1: startY.value,\n        x2: currentX.value,\n        y2: currentY.value,\n        color: color.value,\n        thickness: lineThickness.value,\n        lineType: lineType.value,\n      }\n    ]);\n    saveState();\n    props.parameters.socket.emit(\n      'updateBoardAction',\n      {\n        action: 'draw',\n        payload: {\n          type: 'line',\n          x1: startX.value,\n          y1: startY.value,\n          x2: currentX.value,\n          y2: currentY.value,\n          color: color.value,\n          thickness: lineThickness.value,\n          lineType: lineType.value,\n        },\n      },\n      handleServerResponse\n    );\n  } else if (mode.value === 'freehand' && isValidShape.value) {\n    props.parameters.updateShapes([\n      ...props.parameters.shapes,\n      {\n        type: 'freehand',\n        points: freehandDrawing.value,\n        color: color.value,\n        thickness: brushThickness.value,\n      }\n    ]);\n    props.parameters.socket.emit(\n      'updateBoardAction',\n      {\n        action: 'draw',\n        payload: {\n          type: 'freehand',\n          points: freehandDrawing.value,\n          color: color.value,\n          thickness: brushThickness.value,\n        },\n      },\n      handleServerResponse\n    );\n    freehandDrawing.value = [];\n    saveState();\n  } else if (mode.value === 'shape' && isValidShape.value) {\n    props.parameters.updateShapes([\n      ...props.parameters.shapes,\n      {\n        type: shape.value!,\n        x1: startX.value,\n        y1: startY.value,\n        x2: currentX.value,\n        y2: currentY.value,\n        color: color.value,\n        thickness: lineThickness.value,\n        lineType: lineType.value,\n      }\n    ]);\n    saveState();\n    props.parameters.socket.emit(\n      'updateBoardAction',\n      {\n        action: 'shape',\n        payload: {\n          type: shape.value!,\n          x1: startX.value,\n          y1: startY.value,\n          x2: currentX.value,\n          y2: currentY.value,\n          color: color.value,\n          thickness: lineThickness.value,\n          lineType: lineType.value,\n        },\n      },\n      handleServerResponse\n    );\n  } else if (mode.value === 'select') {\n    if (selectedShape.value && !movingShape.value && !isDragging.value) {\n      const shapeFound = findShape(currentX.value, currentY.value);\n      if (shapeFound) {\n        selectedShape.value = shapeFound;\n        drawShapes();\n        drawSelection(shapeFound);\n      }\n    }\n    if (selectedShape.value) {\n      props.parameters.socket.emit(\n        'updateBoardAction',\n        { action: 'shapes', payload: { shapes: props.parameters.shapes } },\n        handleServerResponse\n      );\n    }\n    saveState();\n  }\n};\n\nconst handleCanvasClick = (e: MouseEvent) => {\n  if (mode.value === 'text') {\n    const textInput = textInputRef.value!;\n    textInput.style.left = e.clientX + 'px';\n    textInput.style.top = e.clientY + 'px';\n    textInput.style.display = 'block';\n    textInput.focus();\n\n    const onEnter = (event: KeyboardEvent) => {\n      if (event.key === 'Enter') {\n        const text = textInput.value;\n        textInput.style.display = 'none';\n        textInput.value = '';\n        props.parameters.updateShapes([\n          ...props.parameters.shapes,\n          {\n            type: 'text',\n            text,\n            x: (e.offsetX - panX.value) / scale.value,\n            y: (e.offsetY - panY.value) / scale.value,\n            color: color.value,\n            font: font.value,\n            fontSize: fontSize.value,\n          }\n        ]);\n        drawShapes();\n        textInput.removeEventListener('keypress', onEnter);\n        props.parameters.socket.emit(\n          'updateBoardAction',\n          {\n            action: 'text',\n            payload: {\n              type: 'text',\n              text,\n              x: (e.offsetX - panX.value) / scale.value,\n              y: (e.offsetY - panY.value) / scale.value,\n              color: color.value,\n              font: font.value,\n              fontSize: fontSize.value,\n            },\n          },\n          handleServerResponse\n        );\n      }\n    };\n\n    textInput.addEventListener('keypress', onEnter);\n  }\n};\n\nconst handleTouchStart = (e: TouchEvent) => {\n  e.preventDefault();\n  const touch = e.touches[0];\n  if (!touch) return;\n  const mouseEvent = new MouseEvent('mousedown', {\n    clientX: touch.clientX,\n    clientY: touch.clientY,\n  });\n  canvasRef.value?.dispatchEvent(mouseEvent);\n};\n\nconst handleTouchMove = (e: TouchEvent) => {\n  e.preventDefault();\n  const touch = e.touches[0];\n  if (!touch) return;\n  const mouseEvent = new MouseEvent('mousemove', {\n    clientX: touch.clientX,\n    clientY: touch.clientY,\n  });\n  canvasRef.value?.dispatchEvent(mouseEvent);\n};\n\nconst handleTouchEnd = (e: TouchEvent) => {\n  e.preventDefault();\n  const mouseEvent = new MouseEvent('mouseup', {});\n  canvasRef.value?.dispatchEvent(mouseEvent);\n};\n\nconst handleClickOutside = (event: MouseEvent) => {\n  if (dropdownOpen.value && !(event.target as HTMLElement).closest('.btn-group')) {\n    dropdownOpen.value = null;\n  }\n};\n\nconst handleZoom = (e: WheelEvent) => {\n  e.preventDefault();\n  if (e.deltaY < 0) {\n    zoomCanvas(1.2, e);\n  } else {\n    zoomCanvas(0.8, e);\n  }\n};\n\nconst zoomCanvas = (\n  scaleFactor: number,\n  event: MouseEvent | { clientX: number; clientY: number } = {\n    clientX: maxWidth.value / 2,\n    clientY: maxHeight.value / 2,\n  }\n) => {\n  const canvas = canvasRef.value;\n  if (!canvas || !ctx) return;\n\n  if (scaleFactor === 10) {\n    scale.value = 1;\n    panX.value = 0;\n    panY.value = 0;\n  } else {\n    let newScale = scale.value * scaleFactor;\n    if (newScale < minScale.value) {\n      newScale = minScale.value;\n    } else if (newScale > maxScale.value) {\n      newScale = maxScale.value;\n    }\n\n    const rect = canvas.getBoundingClientRect();\n    const offsetX = (event.clientX - rect.left) / rect.width;\n    const offsetY = (event.clientY - rect.top) / rect.height;\n\n    const dx = offsetX * canvas.width * (1 - scaleFactor);\n    const dy = offsetY * canvas.height * (1 - scaleFactor);\n\n    scale.value = newScale;\n    panX.value = panX.value * scaleFactor + dx;\n    panY.value = panY.value * scaleFactor + dy;\n\n    const maxPanX = (canvas.width * (scale.value - 1)) / scale.value;\n    const maxPanY = (canvas.height * (scale.value - 1)) / scale.value;\n    panX.value = Math.min(Math.max(panX.value, -maxPanX), 0);\n    panY.value = Math.min(Math.max(panY.value, -maxPanY), 0);\n  }\n\n  ctx.setTransform(scale.value, 0, 0, scale.value, panX.value, panY.value);\n  drawShapes();\n};\n\nconst handleDropdownClick = (id: string) => {\n  dropdownOpen.value = dropdownOpen.value === id ? null : id;\n};\n\nconst handleItemClick = (callback: (value: any) => void, name: string, value: any) => {\n  callback(value);\n  dropdownOpen.value = null;\n  if (['draw', 'freehand', 'shape', 'text', 'erase'].includes(name)) {\n    changeMode(name);\n  }\n};\n\nconst toggleToolbar = () => {\n  toolbarVisible.value = !toolbarVisible.value;\n};\n\nconst saveState = () => {\n  props.parameters.updateUndoStack([\n    ...props.parameters.undoStack,\n    JSON.stringify(props.parameters.shapes)\n  ]);\n};\n\nconst undo = () => {\n  if (!checkBoardAccess()) return;\n\n  if (props.parameters.shapes.length > 0) {\n    const lastShape = props.parameters.shapes[props.parameters.shapes.length - 1]!;\n    props.parameters.updateRedoStack([...props.parameters.redoStack, lastShape]);\n    props.parameters.updateShapes(props.parameters.shapes.slice(0, -1));\n    drawShapes();\n    props.parameters.socket.emit('updateBoardAction', { action: 'undo' }, handleServerResponse);\n  }\n};\n\nconst redo = () => {\n  if (!checkBoardAccess()) return;\n\n  if (props.parameters.redoStack.length > 0) {\n    const lastRedo = props.parameters.redoStack[props.parameters.redoStack.length - 1]!;\n    props.parameters.updateShapes([...props.parameters.shapes, lastRedo]);\n    props.parameters.updateRedoStack(props.parameters.redoStack.slice(0, -1));\n    drawShapes();\n    props.parameters.socket.emit('updateBoardAction', { action: 'redo' }, handleServerResponse);\n  }\n};\n\nconst deleteShape = (doEmits = true) => {\n  if (!checkBoardAccess()) return;\n\n  if (!selectedShape.value) return;\n  if (selectedShape.value) {\n    const shapes = props.parameters.shapes.filter((shapeItem) => shapeItem !== selectedShape.value);\n    props.parameters.updateShapes(shapes);\n    selectedShape.value = null;\n    if (doEmits) {\n      props.parameters.socket.emit(\n        'updateBoardAction',\n        { action: 'shapes', payload: { shapes } },\n        handleServerResponse\n      );\n    }\n    drawShapes();\n  }\n};\n\nconst toggleBackground = (doEmits = true) => {\n  if (doEmits && !checkBoardAccess()) return;\n  \n  const newUseImageBackground = !props.parameters.useImageBackground;\n  props.parameters.updateUseImageBackground(newUseImageBackground);\n  \n  const toggleButton = toggleBackgroundRef.value!;\n  const canvas = canvasRef.value!;\n  \n  if (newUseImageBackground) {\n    canvas.style.backgroundImage = `url('${imageBackgroundUrl}')`;\n    toggleButton.classList.remove('active');\n  } else {\n    canvas.style.backgroundImage = 'none';\n    canvas.style.backgroundColor = 'white';\n    toggleButton.classList.add('active');\n  }\n  \n  drawShapes();\n  \n  if (doEmits) {\n    props.parameters.socket.emit(\n      'updateBoardAction',\n      { action: 'toggleBackground', payload: newUseImageBackground },\n      handleServerResponse\n    );\n  }\n};\n\nconst clearCanvas = (doEmits = true) => {\n  if (props.parameters.islevel !== '2' && doEmits) {\n    props.parameters.showAlert?.({\n      message: 'You do not have permission to clear the board',\n      type: 'danger',\n    });\n    return;\n  }\n  if (props.parameters.shapes.length === 0) return;\n  \n  props.parameters.updateShapes([]);\n  drawShapes();\n  \n  if (doEmits) {\n    props.parameters.socket.emit('updateBoardAction', { action: 'clear' }, handleServerResponse);\n  }\n};\n\nconst drawShapeOnCanvas = (shapeItem: Shape, ctxx: CanvasRenderingContext2D) => {\n  ctxx.beginPath();\n  ctxx.strokeStyle = shapeItem.color!;\n  ctxx.lineWidth = shapeItem.thickness || 2;\n  ctxx.fillStyle = shapeItem.color!;\n  ctxx.font = `${shapeItem.fontSize}px ${shapeItem.font}`;\n\n  const lineTypeVal = shapeItem.lineType ? shapeItem.lineType : 'solid';\n\n  if (lineTypeVal === 'dashed') {\n    ctxx.setLineDash([10, 10]);\n  } else if (lineTypeVal === 'dotted') {\n    ctxx.setLineDash([2, 10]);\n  } else if (lineTypeVal === 'dashDot') {\n    ctxx.setLineDash([10, 5, 2, 5]);\n  } else {\n    ctxx.setLineDash([]);\n  }\n\n  switch (shapeItem.type) {\n    case 'line':\n      ctxx.moveTo(shapeItem.x1!, shapeItem.y1!);\n      ctxx.lineTo(shapeItem.x2!, shapeItem.y2!);\n      break;\n    case 'freehand':\n      try {\n        if (shapeItem.points && shapeItem.points.length > 0) {\n          ctxx.moveTo(shapeItem.points[0]!.x, shapeItem.points[0]!.y);\n          shapeItem.points.forEach((point) => ctxx.lineTo(point.x, point.y));\n        }\n      } catch (e) {\n        console.error(e);\n      }\n      break;\n    case 'text':\n      ctxx.fillText(shapeItem.text!, shapeItem.x!, shapeItem.y!);\n      break;\n    case 'image':\n      ctxx.drawImage(\n        shapeItem.img!,\n        shapeItem.x1!,\n        shapeItem.y1!,\n        shapeItem.x2! - shapeItem.x1!,\n        shapeItem.y2! - shapeItem.y1!\n      );\n      break;\n    default:\n      break;\n  }\n  ctxx.stroke();\n};\n\nconst downloadCanvas = (tempCanvas: HTMLCanvasElement) => {\n  const link = downloadLinkRef.value!;\n  link.href = tempCanvas.toDataURL();\n  link.download = 'whiteboard.png';\n  link.click();\n};\n\nconst saveCanvas = () => {\n  const tempCanvas = tempCanvasRef.value!;\n  const tempCtx = tempCanvas.getContext('2d')!;\n  const canvas = canvasRef.value!;\n  \n  tempCanvas.width = canvas.width;\n  tempCanvas.height = canvas.height;\n  \n  const notShapes = ['freehand', 'text', 'image', 'line'];\n\n  if (props.parameters.useImageBackground) {\n    const bgImage = new Image();\n    bgImage.crossOrigin = 'anonymous';\n    bgImage.onload = () => {\n      tempCtx.drawImage(bgImage, 0, 0, tempCanvas.width, tempCanvas.height);\n      props.parameters.shapes.forEach((shapeItem) => {\n        if (!notShapes.includes(shapeItem.type)) {\n          drawShape(\n            shapeItem.type,\n            shapeItem.x1!,\n            shapeItem.y1!,\n            shapeItem.x2!,\n            shapeItem.y2!,\n            shapeItem.color!,\n            shapeItem.thickness!,\n            shapeItem.lineType!,\n            null,\n            tempCtx\n          );\n        } else {\n          drawShapeOnCanvas(shapeItem, tempCtx);\n        }\n      });\n      downloadCanvas(tempCanvas);\n    };\n    bgImage.src = imageBackgroundUrl;\n  } else {\n    tempCtx.fillStyle = 'white';\n    tempCtx.fillRect(0, 0, tempCanvas.width, tempCanvas.height);\n\n    props.parameters.shapes.forEach((shapeItem) => {\n      if (!notShapes.includes(shapeItem.type)) {\n        drawShape(\n          shapeItem.type,\n          shapeItem.x1!,\n          shapeItem.y1!,\n          shapeItem.x2!,\n          shapeItem.y2!,\n          shapeItem.color!,\n          shapeItem.thickness!,\n          shapeItem.lineType!,\n          null,\n          tempCtx\n        );\n      } else {\n        drawShapeOnCanvas(shapeItem, tempCtx);\n      }\n    });\n    downloadCanvas(tempCanvas);\n  }\n};\n\nconst uploadImage = (e: Event, doEmits = true) => {\n  try {\n    if (!checkBoardAccess()) return;\n    \n    const target = e.target as HTMLInputElement;\n    const file = target.files![0];\n    \n    if (file!.size > 1024 * 1024) {\n      props.parameters.showAlert?.({\n        message: 'File size must be less than 1MB',\n        type: 'danger',\n      });\n      return;\n    }\n\n    const reader = new FileReader();\n    reader.onload = function (event) {\n      const img = new Image();\n      img.crossOrigin = 'anonymous';\n      img.onload = function () {\n        if (img.height > 600 && img.height > img.width && !file!.type.includes('jpeg')) {\n          props.parameters.showAlert?.({\n            message: 'For better performance, please upload the image in JPG format.',\n            type: 'danger',\n          });\n          return;\n        }\n\n        let imageWidth = 350;\n        const aspectRatio = img.height / img.width;\n        let imageHeight = imageWidth * aspectRatio;\n        const maxHeight = 600;\n        \n        if (imageHeight > maxHeight) {\n          imageHeight = maxHeight;\n          imageWidth = imageHeight / aspectRatio;\n          if (imageWidth > 600) {\n            imageWidth = 600;\n          }\n        }\n        \n        const imageShape = {\n          type: 'image',\n          img: img,\n          src: event!.target!.result as string,\n          x1: 50,\n          y1: 50,\n          x2: 50 + imageWidth,\n          y2: 50 + imageHeight,\n        };\n        \n        props.parameters.updateShapes([...props.parameters.shapes, imageShape]);\n        drawShapes();\n        \n        if (doEmits) {\n          props.parameters.socket.emit(\n            'updateBoardAction',\n            { action: 'uploadImage', payload: imageShape },\n            handleServerResponse\n          );\n        }\n      };\n      img.onerror = function () {\n        props.parameters.showAlert?.({ message: 'Error loading image', type: 'danger' });\n      };\n      img.src = event!.target!.result as string;\n    };\n    reader.onerror = function () {\n      props.parameters.showAlert?.({ message: 'Error reading file', type: 'danger' });\n    };\n    reader.readAsDataURL(file!);\n  } catch (error) {\n    console.error('Error in uploadImage:', error);\n  }\n};\n\n// Socket event handlers\nconst setupSocketListeners = () => {\n  const socket = props.parameters.socket;\n\n  socket.on('whiteboardAction', (data: { action: string; payload: any }) => {\n    const { action, payload } = data;\n\n    if (!ctx && canvasRef.value) {\n      ctx = canvasRef.value.getContext('2d');\n      props.parameters.updateCanvasWhiteboard(canvasRef.value);\n    }\n\n    if (!ctx) return;\n\n    switch (action) {\n      case 'draw':\n        if (payload.type === 'freehand') {\n          drawFreehand(payload.points, payload.color, payload.thickness);\n          props.parameters.updateShapes([\n            ...props.parameters.shapes,\n            {\n              type: 'freehand',\n              points: payload.points,\n              color: payload.color,\n              thickness: payload.thickness,\n            }\n          ]);\n        } else {\n          drawLine(\n            payload.x1,\n            payload.y1,\n            payload.x2,\n            payload.y2,\n            payload.color,\n            payload.thickness,\n            payload.lineType\n          );\n          props.parameters.updateShapes([\n            ...props.parameters.shapes,\n            {\n              type: 'line',\n              x1: payload.x1,\n              y1: payload.y1,\n              x2: payload.x2,\n              y2: payload.y2,\n              color: payload.color,\n              thickness: payload.thickness,\n              lineType: payload.lineType,\n            }\n          ]);\n        }\n        break;\n      case 'shape':\n        drawShape(\n          payload.type,\n          payload.x1,\n          payload.y1,\n          payload.x2,\n          payload.y2,\n          payload.color,\n          payload.thickness,\n          payload.lineType\n        );\n        props.parameters.updateShapes([\n          ...props.parameters.shapes,\n          {\n            type: payload.type,\n            x1: payload.x1,\n            y1: payload.y1,\n            x2: payload.x2,\n            y2: payload.y2,\n            color: payload.color,\n            thickness: payload.thickness,\n            lineType: payload.lineType,\n          }\n        ]);\n        break;\n      case 'erase':\n        erase(payload.x, payload.y);\n        break;\n      case 'clear':\n        clearCanvas(false);\n        break;\n      case 'uploadImage': {\n        const img = new Image();\n        img.crossOrigin = 'anonymous';\n        img.onload = function () {\n          const imageShape = {\n            type: 'image',\n            img,\n            src: payload.src,\n            x1: payload.x1,\n            y1: payload.y1,\n            x2: payload.x2,\n            y2: payload.y2,\n          };\n          props.parameters.updateShapes([...props.parameters.shapes, imageShape]);\n          drawShapes();\n        };\n        img.src = payload.src;\n        break;\n      }\n      case 'toggleBackground':\n        toggleBackground(false);\n        drawShapes();\n        break;\n      case 'undo':\n        if (props.parameters.shapes.length > 0) {\n          const lastShape = props.parameters.shapes[props.parameters.shapes.length - 1]!;\n          props.parameters.updateRedoStack([...props.parameters.redoStack, lastShape]);\n          props.parameters.updateShapes(props.parameters.shapes.slice(0, -1));\n          drawShapes();\n        }\n        break;\n      case 'redo':\n        if (props.parameters.redoStack.length > 0) {\n          const lastRedo = props.parameters.redoStack[props.parameters.redoStack.length - 1]!;\n          props.parameters.updateShapes([...props.parameters.shapes, lastRedo]);\n          props.parameters.updateRedoStack(props.parameters.redoStack.slice(0, -1));\n          drawShapes();\n        }\n        break;\n      case 'text':\n        props.parameters.updateShapes([\n          ...props.parameters.shapes,\n          {\n            type: 'text',\n            text: payload.text,\n            x: payload.x,\n            y: payload.y,\n            color: payload.color,\n            font: payload.font,\n            fontSize: payload.fontSize,\n          }\n        ]);\n        drawShapes();\n        break;\n      case 'deleteShape':\n        {\n          const shapes = props.parameters.shapes.filter((shapeItem) => shapeItem !== payload);\n          props.parameters.updateShapes(shapes);\n          drawShapes();\n        }\n        break;\n      case 'shapes': {\n        const oldShapes = props.parameters.shapes.filter((shapeItem) => shapeItem.type === 'image');\n        const shapes = payload.shapes.map((shapeItem: Shape) => {\n          if (shapeItem.type === 'image') {\n            const oldShape = oldShapes.find((old) => old.src === shapeItem.src);\n            if (oldShape) {\n              return { ...shapeItem, img: oldShape.img };\n            } else {\n              const img = new Image();\n              img.src = shapeItem.src!;\n              img.crossOrigin = 'anonymous';\n              return { ...shapeItem, img };\n            }\n          } else {\n            return shapeItem;\n          }\n        });\n        props.parameters.updateShapes(shapes);\n        drawShapes();\n        break;\n      }\n      default:\n        break;\n    }\n  });\n\n  socket.on('whiteboardUpdated', async (data: any) => {\n    try {\n      if (props.parameters.islevel === '2' && data.members) {\n        const participants = await data.members.filter(\n          (participant: any) => participant.isBanned === false\n        );\n        props.parameters.updateParticipants(participants);\n      }\n\n      props.parameters.updateWhiteboardUsers(data.whiteboardUsers);\n\n      const useBoard = data.whiteboardUsers.find(\n        (user: WhiteboardUser) => user.name === props.parameters.member && user.useBoard\n      )\n        ? true\n        : false;\n        \n      if (\n        props.parameters.islevel !== '2' &&\n        !useBoard &&\n        !props.parameters.whiteboardEnded\n      ) {\n        changeMode('pan');\n      }\n\n      if (data.whiteboardData && Object.keys(data.whiteboardData).length > 0) {\n        if (data.whiteboardData.shapes) {\n          const oldShapes = props.parameters.shapes.filter(\n            (shapeItem) => shapeItem.type === 'image'\n          );\n          const shapes = data.whiteboardData.shapes.map((shapeItem: Shape) => {\n            if (shapeItem.type === 'image') {\n              const oldShape = oldShapes.find((old) => old.src === shapeItem.src);\n              if (oldShape) {\n                return { ...shapeItem, img: oldShape.img };\n              } else {\n                const img = new Image();\n                img.src = shapeItem.src!;\n                img.crossOrigin = 'anonymous';\n                return { ...shapeItem, img };\n              }\n            } else {\n              return shapeItem;\n            }\n          });\n          props.parameters.updateShapes(shapes);\n        }\n        \n        if (data.whiteboardData.useImageBackground != null) {\n          props.parameters.updateUseImageBackground(data.whiteboardData.useImageBackground);\n        } else {\n          props.parameters.updateUseImageBackground(true);\n        }\n        \n        if (data.whiteboardData.redoStack) {\n          props.parameters.updateRedoStack(data.whiteboardData.redoStack);\n        }\n        \n        if (data.whiteboardData.undoStack) {\n          props.parameters.updateUndoStack(data.whiteboardData.undoStack);\n        }\n      }\n\n      if (data.status === 'started' && !props.parameters.whiteboardStarted) {\n        props.parameters.updateWhiteboardStarted(true);\n        props.parameters.updateWhiteboardEnded(false);\n        props.parameters.updateScreenId(`whiteboard-${props.parameters.roomName}`);\n\n        if (props.parameters.islevel !== '2') {\n          props.parameters.updateShareScreenStarted(true);\n          await props.parameters.onScreenChanges({\n            changed: true,\n            parameters: props.parameters,\n          });\n        }\n      } else if (data.status === 'ended') {\n        const prevWhiteboardEnded = props.parameters.whiteboardEnded;\n        const prevWhiteboardStarted = props.parameters.whiteboardStarted;\n        \n        props.parameters.updateWhiteboardStarted(false);\n        props.parameters.updateWhiteboardEnded(true);\n        \n        if (props.parameters.islevel === '2' && prevWhiteboardEnded) {\n          // do nothing\n        } else {\n          props.parameters.updateShareScreenStarted(false);\n          props.parameters.updateScreenId('');\n          await props.parameters.onScreenChanges({\n            changed: true,\n            parameters: props.parameters,\n          });\n        }\n\n        try {\n          if (\n            prevWhiteboardStarted &&\n            props.parameters.islevel === '2' &&\n            (props.parameters.recordStarted || props.parameters.recordResumed)\n          ) {\n            if (\n              !(props.parameters.recordPaused || props.parameters.recordStopped)\n            ) {\n              if (props.parameters.recordingMediaOptions === 'video') {\n                await props.parameters.captureCanvasStream({\n                  parameters: props.parameters,\n                  start: false,\n                });\n              }\n            }\n          }\n        } catch (error) {\n          console.error(error);\n        }\n      } else if (data.status === 'started' && props.parameters.whiteboardStarted) {\n        props.parameters.updateWhiteboardStarted(true);\n        props.parameters.updateWhiteboardEnded(false);\n        props.parameters.updateShareScreenStarted(true);\n        props.parameters.updateScreenId(`whiteboard-${props.parameters.roomName}`);\n        await props.parameters.onScreenChanges({\n          changed: true,\n          parameters: props.parameters,\n        });\n      }\n    } catch (error) {\n      console.error('Error in whiteboardUpdated:', error);\n    }\n  });\n};\n\n// Lifecycle hooks\nonMounted(() => {\n  const img = new Image();\n  img.src = imageBackgroundUrl;\n  img.crossOrigin = 'anonymous';\n  img.onload = () => {\n    backgroundImage.value = img;\n    drawShapes();\n  };\n\n  if (canvasRef.value) {\n    const canvas = canvasRef.value;\n\n    try {\n      if (\n        props.parameters.targetResolution === 'qhd' ||\n        props.parameters.targetResolutionHost === 'qhd'\n      ) {\n        maxWidth.value = 1920;\n        maxHeight.value = 1080;\n      } else if (\n        props.parameters.targetResolution === 'fhd' ||\n        props.parameters.targetResolutionHost === 'fhd'\n      ) {\n        maxWidth.value = 1920;\n        maxHeight.value = 1080;\n      }\n      canvas.width = maxWidth.value;\n      canvas.height = maxHeight.value;\n      dimensionsFixed.value = true;\n    } catch {\n      // handle error\n    }\n\n    ctx = canvas.getContext('2d');\n    props.parameters.updateCanvasWhiteboard(canvas);\n  }\n\n  const canvas = canvasRef.value;\n  canvas?.addEventListener('mousedown', startDrawing);\n  canvas?.addEventListener('mousemove', draw);\n  canvas?.addEventListener('mouseup', stopDrawing);\n  canvas?.addEventListener('wheel', handleZoom);\n  canvas?.addEventListener('click', handleCanvasClick);\n  canvas?.addEventListener('touchstart', handleTouchStart);\n  canvas?.addEventListener('touchmove', handleTouchMove);\n  canvas?.addEventListener('touchend', handleTouchEnd);\n\n  document.addEventListener('mousedown', handleClickOutside);\n\n  setupSocketListeners();\n});\n\nonUnmounted(() => {\n  const canvas = canvasRef.value;\n  canvas?.removeEventListener('mousedown', startDrawing);\n  canvas?.removeEventListener('mousemove', draw);\n  canvas?.removeEventListener('mouseup', stopDrawing);\n  canvas?.removeEventListener('wheel', handleZoom);\n  canvas?.removeEventListener('click', handleCanvasClick);\n  canvas?.removeEventListener('touchstart', handleTouchStart);\n  canvas?.removeEventListener('touchmove', handleTouchMove);\n  canvas?.removeEventListener('touchend', handleTouchEnd);\n\n  document.removeEventListener('mousedown', handleClickOutside);\n\n  props.parameters.socket.off('whiteboardAction');\n  props.parameters.socket.off('whiteboardUpdated');\n});\n\n// Watch for shape changes\nwatch(\n  () => [props.parameters.shapes, panX.value, panY.value, scale.value],\n  () => {\n    drawShapes();\n  },\n  { deep: true }\n);\n</script>\n\n<style scoped>\n#whiteboard-interface #whiteboardContent #whiteboardCanvas {\n  border: 1px solid #000;\n  cursor: crosshair;\n  background-color: white;\n}\n\n#whiteboard-interface #whiteboardContent .resize-handle,\n#whiteboard-interface #whiteboardContent .move-handle {\n  width: 8px;\n  height: 8px;\n  background: red;\n  position: absolute;\n}\n\n#whiteboard-interface #whiteboardContent .move-handle {\n  background: blue;\n}\n\n#whiteboard-interface #whiteboardContent #textInput {\n  display: none;\n  position: absolute;\n  z-index: 10;\n  width: 200px;\n}\n\n#whiteboard-interface #whiteboardContent .shape-icon {\n  width: 20px;\n  height: 20px;\n  color: white;\n}\n\n#whiteboard-interface #whiteboardContent .toolbar {\n  display: flex;\n  align-items: center;\n  gap: 8px;\n}\n\n#whiteboard-interface #whiteboardContent .toolbar .btn-group {\n  display: flex;\n  align-items: center;\n  gap: 6px;\n  flex-wrap: wrap;\n}\n\n#whiteboard-interface #whiteboardContent .toolbar .btn-group button,\n#whiteboard-interface #whiteboardContent .toolbar .dropdown-menu button {\n  font-size: 0.8rem;\n  padding: 5px 10px;\n  margin: 0 2px;\n  border-radius: 4px;\n  transition: background-color 0.2s;\n}\n\n#whiteboard-interface #whiteboardContent .toolbar .dropdown-menu button {\n  background-color: transparent;\n  color: rgb(27, 26, 26);\n  border: none;\n  width: 100%;\n  text-align: left;\n}\n\n#whiteboard-interface #whiteboardContent .toolbar .btn-group button:hover,\n#whiteboard-interface #whiteboardContent .toolbar .dropdown-menu button:hover {\n  background-color: #e3e7eb;\n}\n\n#whiteboard-interface #whiteboardContent .toolbar .btn-group button.active {\n  background-color: #454d55;\n}\n\n#whiteboard-interface #whiteboardContent #colorPicker {\n  font-size: 0.8rem;\n  padding: 2px;\n  width: 32px;\n  height: 32px;\n  border: 1px solid #e4e3e3;\n  border-radius: 4px;\n}\n\n#whiteboard-interface #whiteboardContent #lineTypePicker {\n  font-size: 0.8rem;\n  padding: 2px 4px;\n  width: 32px;\n  height: 32px;\n}\n\n#whiteboard-interface #whiteboardContent .custom-select {\n  font-size: 0.8rem;\n  padding: 2px 4px;\n  min-width: 32px;\n  height: 32px;\n  width: max-content;\n}\n\n#whiteboard-interface #whiteboardContent .btnBoard {\n  font-size: 1rem;\n  padding: 6px 8px;\n  min-width: 36px;\n  height: 36px;\n  margin: 2px;\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n}\n\n#whiteboard-interface #whiteboardContent .toggle-icon {\n  width: 34px;\n  height: 34px;\n  padding: 0;\n  margin: 0;\n}\n\n#whiteboard-interface #whiteboardContent #toggleBackground.active {\n  background-color: #fdfeff;\n}\n\n.dropdown-menu {\n  position: absolute;\n  top: 7%;\n  background-color: white;\n  border: 1px solid #ccc;\n  border-radius: 4px;\n  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.15);\n  z-index: 1000;\n  min-width: 0;\n  width: max-content;\n  padding: 8px 0px;\n}\n\n.dropdown-menu.show .dropdown-item {\n  padding: 4px 8px !important;\n  width: auto;\n  min-width: unset;\n  display: inline-flex;\n  align-items: center;\n}\n\n.dropdown-menu.show {\n  display: block;\n  max-width: 200px !important;\n}\n</style>","<!--\n/**\n * @fileoverview Screenboard - Real-time canvas annotation overlay for screen sharing\n * @component Screenboard\n * @module components/screenboardComponents/Screenboard\n * \n * @description\n * A lightweight canvas annotation tool that overlays on top of shared screen streams, allowing\n * users to draw, annotate, and highlight content during screen sharing sessions. Designed for\n * webinars, presentations, and collaborative sessions where visual annotations enhance communication.\n * Features include freehand drawing, shapes, text, and color selection with a compact toolbar that\n * doesn't obstruct the shared content.\n * \n * Key Features:\n * - **Annotation Toggle**: Enable/disable annotation mode during screen sharing\n * - **Drawing Tools**: Freehand brush, line drawing with adjustable thickness\n * - **Shape Library**: Rectangle, circle, line for quick annotations\n * - **Text Tool**: Add text annotations with font and size options\n * - **Color Picker**: Full RGB color selection for annotations\n * - **Erase Mode**: Remove specific annotations or clear entire canvas\n * - **Compact Toolbar**: Minimal UI that doesn't block shared content\n * - **Toolbar Toggle**: Show/hide toolbar to maximize viewing area\n * - **Line Styles**: Solid, dashed, dotted line types\n * - **Undo/Redo**: Full history management for annotation actions\n * - **Canvas Overlay**: Transparent background preserves screen share visibility\n * - **Responsive Size**: Automatically fits screen share dimensions\n * \n * Drawing Modes:\n * - **draw**: Straight line drawing with adjustable thickness (1-50px)\n * - **freehand**: Free-form brush drawing with adjustable thickness (1-50px)\n * - **shape**: Shape insertion (rectangle, circle, line)\n * - **text**: Text annotation with font and size customization\n * - **erase**: Remove specific annotations\n * - **pan**: Navigate large canvases\n * \n * Use Cases:\n * - **Presentations**: Highlight key points on slides during webinars\n * - **Training**: Circle and annotate specific UI elements during demos\n * - **Collaboration**: Draw diagrams and notes on shared documents\n * - **Instruction**: Point out details in shared code or designs\n * - **Q&A Sessions**: Emphasize answers on shared content\n * \n * Workflow:\n * 1. User starts screen sharing → Screenboard component activates\n * 2. User clicks annotation button (pencil icon) → annotation mode enabled\n * 3. Toolbar appears with drawing tools → user selects tool (brush, shape, text, etc.)\n * 4. User draws on canvas overlay → annotations appear over shared screen\n * 5. Annotations are visible to all participants viewing the screen share\n * 6. User can toggle toolbar visibility to maximize viewing area\n * 7. User can undo/redo annotations or clear entire canvas\n * 8. User clicks annotation button again → annotation mode disabled\n * \n * @example Basic Usage - Screen Share with Annotation\n * ```typescript\n * // <Screenboard\n *   // :customWidth=\"1920\"\n *   // :customHeight=\"1080\"\n *   // :parameters=\"{\n *     updateCanvasScreenboard: setCanvasRef,\n *     annotateScreenStream: true,\n *     updateIsScreenboardModalVisible: setModalVisible,\n *     showAlert: alertFunction,\n *     sleep: sleepFunction,\n *     updateAnnotateScreenStream: setAnnotateState\n *   }\"\n *   // :showAspect=\"shared && annotateScreenStream\"\n * // />\n * ```\n * \n * @example Conditional Display - Show Only During Screen Share\n * ```typescript\n * // <component\n *   // :is=\"ScreenboardComponent\"\n *   // v-if=\"shared\"\n *   // :customWidth=\"componentSizes.mainWidth\"\n *   // :customHeight=\"componentSizes.mainHeight\"\n *   // :parameters=\"screenboardParameters\"\n *   // :showAspect=\"shared\"\n * // />\n * ```\n * \n * @example With Custom Dimensions\n * ```typescript\n * // <Screenboard\n *   // :customWidth=\"1280\"\n *   // :customHeight=\"720\"\n *   // :parameters=\"{\n *     updateCanvasScreenboard: (canvas) => { canvasRef.value = canvas; },\n *     annotateScreenStream: annotationEnabled,\n *     updateIsScreenboardModalVisible: (visible) => { modalVisible.value = visible; },\n *     showAlert: (alert) => console.log(alert.message),\n *     sleep: (ms) => new Promise(resolve => setTimeout(resolve, ms)),\n *     updateAnnotateScreenStream: (state) => { annotateState.value = state; }\n *   }\"\n *   // :showAspect=\"true\"\n * // />\n * ```\n * \n * @example Programmatic Annotation Control\n * ```typescript\n * // <script setup>\n * import { ref } from 'vue';\n * \n * const annotateScreenStream = ref(false);\n * const canvasScreenboard = ref(null);\n * \n * const enableAnnotation = () => {\n *   // annotateScreenStream.value = true;\n *   // console.log('Annotation mode enabled');\n * };\n * \n * const disableAnnotation = () => {\n *   // annotateScreenStream.value = false;\n *   // console.log('Annotation mode disabled');\n * };\n * \n * const clearAnnotations = () => {\n *   // if (canvasScreenboard.value) {\n *     const ctx = canvasScreenboard.value.getContext('2d');\n *     ctx.clearRect(0, 0, canvasScreenboard.value.width, canvasScreenboard.value.height);\n *   }\n * };\n * </script>\n * \n * // <template>\n *   <div>\n *     <button @click=\"enableAnnotation\">Enable Annotations</button>\n *     <button @click=\"disableAnnotation\">Disable Annotations</button>\n *     <button @click=\"clearAnnotations\">Clear Canvas</button>\n *     \n *     <Screenboard\n *       :customWidth=\"1920\"\n *       :customHeight=\"1080\"\n *       :parameters=\"{\n *         updateCanvasScreenboard: (canvas) => { canvasScreenboard = canvas; },\n *         annotateScreenStream: annotateScreenStream,\n *         updateIsScreenboardModalVisible: setModalVisible,\n *         showAlert: showAlert,\n *         sleep: sleep,\n *         updateAnnotateScreenStream: (state) => { annotateScreenStream.value = state; }\n *       }\"\n *       :showAspect=\"true\"\n *     />\n *   </div>\n * </template>\n * ```\n * \n * @see {@link ScreenboardModal} for screenboard configuration UI\n * @see {@link Whiteboard} for full collaborative whiteboard features\n * @see {@link https://mediasfu.com/docs/screenboard} for screenboard documentation\n */\n-->\n<template>\n  <div\n    id=\"screenboard-interface\"\n    ref=\"screenboardRef\"\n    :style=\"{\n      position: 'relative',\n      display: showAspect ? 'flex' : 'none',\n      flexDirection: 'column',\n      justifyContent: 'center',\n      alignItems: 'center',\n      backgroundColor: 'transparent',\n      zIndex: 1000,\n      width: '100%',\n      height: '100%',\n      maxWidth: '100%',\n      maxHeight: '100%',\n      overflow: 'auto',\n    }\"\n  >\n    <div\n      id=\"screenboardContent\"\n      ref=\"screenboardContentRef\"\n      :style=\"{\n        position: 'relative',\n        display: 'flex',\n        flexDirection: 'column',\n        justifyContent: 'center',\n        alignItems: 'center',\n        width: '100%',\n        height: '100%',\n        maxHeight: '100%',\n        overflow: 'hidden',\n        top: 0,\n        left: 0,\n      }\"\n    >\n      <button\n        id=\"annotateScreen\"\n        class=\"btn btn-primary btnBoardScreen annotateScreenBtn\"\n        :style=\"{\n          position: 'absolute',\n          top: '5px',\n          right: '10px',\n          zIndex: 1000,\n        }\"\n        @click=\"toggleAnnotate\"\n      >\n        <font-awesome-icon\n          :icon=\"faPencilAlt\"\n          :color=\"annotateScreenStream ? 'red' : 'green'\"\n        />\n      </button>\n\n      <button\n        v-if=\"annotateScreenStream\"\n        id=\"toolbarToggleScreen\"\n        class=\"btn btnBoardScreen btn-primary\"\n        :style=\"{\n          position: 'absolute',\n          top: '5px',\n          right: '55px',\n          zIndex: 1000,\n        }\"\n        @click=\"toggleToolbar\"\n      >\n        <font-awesome-icon :icon=\"toolbarVisible ? faChevronRight : faChevronLeft\" />\n      </button>\n\n      <div\n        id=\"toolbarScreen\"\n        class=\"toolbarScreen mb-3\"\n        :style=\"{\n          position: 'absolute',\n          top: '5px',\n          right: '105px',\n          zIndex: 1000,\n          backgroundColor: 'transparent',\n          display: toolbarVisible ? 'flex' : 'none',\n        }\"\n      >\n        <div\n          class=\"btn-group\"\n          role=\"group\"\n        >\n          <button\n            id=\"drawModeScreen\"\n            class=\"btn btnBoardScreen btn-secondary dropdown-toggle\"\n            @click=\"handleDropdownClick('drawModeScreen')\"\n          >\n            <font-awesome-icon :icon=\"faPencilAlt\" />\n          </button>\n          <div\n            v-if=\"dropdownOpen === 'drawModeScreen'\"\n            :class=\"['dropdown-menu', dropdownOpen ? 'show' : '']\"\n          >\n            <button\n              v-for=\"(item, index) in drawItems\"\n              :key=\"index\"\n              class=\"dropdown-item\"\n              :style=\"{ padding: '5px' }\"\n              @click=\"handleItemClick(() => setLineThickness(item.value), 'draw')\"\n            >\n              {{ item.label }}\n            </button>\n          </div>\n        </div>\n\n        <div\n          class=\"btn-group\"\n          role=\"group\"\n        >\n          <button\n            id=\"freehandModeScreen\"\n            class=\"btn btnBoardScreen btn-dark dropdown-toggle\"\n            @click=\"handleDropdownClick('freehandModeScreen')\"\n          >\n            <font-awesome-icon :icon=\"faPaintBrush\" />\n          </button>\n          <div\n            v-if=\"dropdownOpen === 'freehandModeScreen'\"\n            :class=\"['dropdown-menu', dropdownOpen ? 'show' : '']\"\n          >\n            <button\n              v-for=\"(item, index) in brushItems\"\n              :key=\"index\"\n              class=\"dropdown-item\"\n              :style=\"{ padding: '5px' }\"\n              @click=\"handleItemClick(() => setBrushThickness(item.value), 'freehand')\"\n            >\n              {{ item.label }}\n            </button>\n          </div>\n        </div>\n\n        <div\n          class=\"btn-group\"\n          role=\"group\"\n        >\n          <button\n            id=\"shapeModeScreen\"\n            class=\"btn btnBoardScreen btn-dark dropdown-toggle\"\n            @click=\"handleDropdownClick('shapeModeScreen')\"\n          >\n            <font-awesome-icon :icon=\"faShapes\" />\n          </button>\n          <div\n            v-if=\"dropdownOpen === 'shapeModeScreen'\"\n            :class=\"['dropdown-menu', dropdownOpen ? 'show' : '']\"\n          >\n            <button\n              v-for=\"(item, index) in shapeItems\"\n              :key=\"index\"\n              class=\"dropdown-item\"\n              :style=\"{ padding: '5px' }\"\n              @click=\"handleItemClick(() => setShape(item.value), 'shape')\"\n            >\n              <img\n                v-if=\"item.src\"\n                :src=\"item.src\"\n                :alt=\"item.alt\"\n                class=\"shape-icon\"\n              />\n            </button>\n          </div>\n        </div>\n\n        <div\n          class=\"btn-group\"\n          role=\"group\"\n        >\n          <button\n            id=\"eraseModeScreen\"\n            class=\"btn btnBoardScreen btn-danger dropdown-toggle\"\n            @click=\"handleDropdownClick('eraseModeScreen')\"\n          >\n            <font-awesome-icon :icon=\"faEraser\" />\n          </button>\n          <div\n            v-if=\"dropdownOpen === 'eraseModeScreen'\"\n            :class=\"['dropdown-menu', dropdownOpen ? 'show' : '']\"\n          >\n            <button\n              v-for=\"(item, index) in eraserItems\"\n              :key=\"index\"\n              class=\"dropdown-item\"\n              :style=\"{ padding: '5px' }\"\n              @click=\"handleItemClick(() => setEraserThickness(item.value), 'erase')\"\n            >\n              {{ item.label }}\n            </button>\n          </div>\n        </div>\n\n        <button\n          id=\"zoomResetScreen\"\n          class=\"btn btnBoard btn-success\"\n          :style=\"{ display: 'none' }\"\n        >\n          <font-awesome-icon :icon=\"faSearch\" />\n        </button>\n\n        <label for=\"colorPickerScreen\"></label>\n        <input\n          id=\"colorPickerScreen\"\n          v-model=\"color\"\n          type=\"color\"\n          class=\"btn\"\n        />\n\n        <label for=\"lineTypePickerScreen\"></label>\n        <select\n          id=\"lineTypePickerScreen\"\n          v-model=\"lineType\"\n          class=\"custom-select\"\n          :style=\"{ width: 'auto' }\"\n        >\n          <option value=\"solid\">\n            Solid\n          </option>\n          <option value=\"dashed\">\n            Dashed\n          </option>\n          <option value=\"dotted\">\n            Dotted\n          </option>\n          <option value=\"dashDot\">\n            Dash-Dot\n          </option>\n        </select>\n      </div>\n\n      <canvas\n        id=\"screenboardCanvas\"\n        ref=\"canvasRef\"\n        width=\"1280\"\n        height=\"720\"\n        :style=\"{\n          padding: 0,\n          margin: 0,\n          display: annotateScreenStream ? 'block' : 'none',\n        }\"\n      ></canvas>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, onMounted, onUnmounted, computed, watch } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport {\n  faChevronRight,\n  faChevronLeft,\n  faPencilAlt,\n  faPaintBrush,\n  faShapes,\n  faEraser,\n  faSearch,\n} from '@fortawesome/free-solid-svg-icons';\nimport './Screenboard.css';\nimport type { ShowAlert, SleepType } from '../../../../SharedTypes';\n\n/**\n * Parameters object for the Screenboard component\n * @interface ScreenboardParameters\n * \n * @property {(canvas: HTMLCanvasElement | null) => void} updateCanvasScreenboard - Function to update canvas reference\n * @property {boolean} annotateScreenStream - Whether annotation mode is currently active\n * @property {(visible: boolean) => void} updateIsScreenboardModalVisible - Function to control screenboard modal visibility\n * @property {ShowAlert} [showAlert] - Alert function for user feedback messages\n * @property {SleepType} sleep - Sleep/delay function for async operations\n * @property {(annotate: boolean) => void} updateAnnotateScreenStream - Function to update annotation state\n * \n * @example\n * ```ts\n * const screenboardParams = {\n *   // updateCanvasScreenboard: (canvas) => {\n *     canvasScreenboard.value = canvas;\n *     if (canvas) console.log('Canvas ready:', canvas.width, canvas.height);\n *   },\n *   // annotateScreenStream: true,\n *   // updateIsScreenboardModalVisible: (visible) => {\n *     isScreenboardModalVisible.value = visible;\n *   },\n *   // showAlert: (alert) => {\n *     console.log(`[${alert.type}] ${alert.message}`);\n *   },\n *   // sleep: (ms) => new Promise(resolve => setTimeout(resolve, ms)),\n *   // updateAnnotateScreenStream: (annotate) => {\n *     annotateScreenStream.value = annotate;\n *     if (annotate) console.log('Annotation enabled');\n *     else console.log('Annotation disabled');\n *   }\n * };\n * ```\n */\nexport interface ScreenboardParameters {\n  updateCanvasScreenboard: (canvas: HTMLCanvasElement | null) => void;\n  annotateScreenStream: boolean;\n  updateIsScreenboardModalVisible: (visible: boolean) => void;\n  showAlert?: ShowAlert;\n  sleep: SleepType;\n  updateAnnotateScreenStream: (annotate: boolean) => void;\n  [key: string]: unknown;\n}\n\n/**\n * Props for the Screenboard component\n * @interface ScreenboardProps\n * \n * @property {number} customWidth - Width of the screenboard canvas in pixels (should match screen share width)\n * @property {number} customHeight - Height of the screenboard canvas in pixels (should match screen share height)\n * @property {ScreenboardParameters} parameters - Parameters object with state and callback functions\n * @property {boolean} showAspect - Whether to display the screenboard (typically true during screen sharing)\n * \n * @example\n * ```ts\n * const screenboardProps = {\n *   // customWidth: 1920,\n *   // customHeight: 1080,\n *   // parameters: {\n *     updateCanvasScreenboard: setCanvasRef,\n *     annotateScreenStream: true,\n *     updateIsScreenboardModalVisible: setModalVisible,\n *     showAlert: alertFunction,\n *     sleep: sleepFunction,\n *     updateAnnotateScreenStream: setAnnotateState\n *   },\n *   // showAspect: shared && annotateScreenStream\n * };\n * ```\n * \n * @default customWidth - No default (required)\n * @default customHeight - No default (required)\n * @default parameters - No default (required)\n * @default showAspect - No default (required)\n */\nexport interface ScreenboardProps {\n  customWidth: number;\n  customHeight: number;\n  parameters: ScreenboardParameters;\n  showAspect: boolean;\n}\n\nconst props = defineProps<ScreenboardProps>();\n\nconst {\n  updateCanvasScreenboard,\n  updateIsScreenboardModalVisible,\n  showAlert,\n  sleep,\n  updateAnnotateScreenStream,\n} = props.parameters;\n\nconst annotateScreenStream = computed(() => props.parameters.annotateScreenStream);\n\ntype Mode = 'draw' | 'freehand' | 'shape' | 'erase';\ntype LinePattern = 'solid' | 'dashed' | 'dotted' | 'dashDot';\ntype ShapeName =\n  | 'square'\n  | 'rectangle'\n  | 'circle'\n  | 'triangle'\n  | 'hexagon'\n  | 'pentagon'\n  | 'rhombus'\n  | 'octagon'\n  | 'parallelogram'\n  | 'oval';\n\ninterface FreehandPoint {\n  x: number;\n  y: number;\n  color: string;\n  thickness: number;\n}\n\ninterface LineShape {\n  type: 'line';\n  x1: number;\n  y1: number;\n  x2: number;\n  y2: number;\n  color: string;\n  thickness: number;\n  lineType: LinePattern;\n}\n\ninterface FreehandShape {\n  type: 'freehand';\n  points: FreehandPoint[];\n  color: string;\n  thickness: number;\n}\n\ninterface TextShape {\n  type: 'text';\n  text: string;\n  x: number;\n  y: number;\n  fontSize: number;\n  color: string;\n}\n\ninterface PolygonShape {\n  type: ShapeName;\n  x1: number;\n  y1: number;\n  x2: number;\n  y2: number;\n  color: string;\n  thickness: number;\n  lineType: LinePattern;\n}\n\ntype ShapeItem = LineShape | FreehandShape | TextShape | PolygonShape;\n\nconst mode = ref<Mode>('draw');\nconst isDrawing = ref(false);\nconst startX = ref(0);\nconst startY = ref(0);\nconst currentX = ref(0);\nconst currentY = ref(0);\nconst freehandDrawing = ref<FreehandPoint[]>([]);\nconst shapes = ref<ShapeItem[]>([]);\nconst eraserThickness = ref(10);\nconst brushThickness = ref(6);\nconst lineThickness = ref(6);\nconst lineType = ref<LinePattern>('solid');\nconst color = ref('#000000');\nconst shape = ref<ShapeName | null>(null);\nconst toolbarVisible = ref(false);\nconst dropdownOpen = ref<string | null>(null);\nconst canvasRef = ref<HTMLCanvasElement | null>(null);\nconst screenboardRef = ref<HTMLDivElement | null>(null);\nconst screenboardContentRef = ref<HTMLDivElement | null>(null);\n\nlet canvas: HTMLCanvasElement | null = null;\nlet ctx: CanvasRenderingContext2D | null = null;\n\nconst drawItems: Array<{ label: string; value: number }> = [\n  { label: 'XX-Small (3px)', value: 3 },\n  { label: 'X-Small (6px)', value: 6 },\n  { label: 'Small (12px)', value: 12 },\n  { label: 'Medium (18px)', value: 18 },\n  { label: 'Large (24px)', value: 24 },\n  { label: 'X-Large (36px)', value: 36 },\n];\n\nconst brushItems: Array<{ label: string; value: number }> = [\n  { label: 'X-Small (5px)', value: 5 },\n  { label: 'Small (10px)', value: 10 },\n  { label: 'Medium (20px)', value: 20 },\n  { label: 'Large (40px)', value: 40 },\n  { label: 'X-Large (60px)', value: 60 },\n];\n\nconst shapeItems: Array<{ src: string; alt: string; value: ShapeName }> = [\n  { src: 'https://mediasfu.com/images/svg/square.svg', alt: 'Square', value: 'square' },\n  {\n    src: 'https://mediasfu.com/images/svg/rectangle.svg',\n    alt: 'Rectangle',\n    value: 'rectangle',\n  },\n  { src: 'https://mediasfu.com/images/svg/circle.svg', alt: 'Circle', value: 'circle' },\n  {\n    src: 'https://mediasfu.com/images/svg/triangle.svg',\n    alt: 'Triangle',\n    value: 'triangle',\n  },\n  { src: 'https://mediasfu.com/images/svg/hexagon.svg', alt: 'Hexagon', value: 'hexagon' },\n  {\n    src: 'https://mediasfu.com/images/svg/pentagon.svg',\n    alt: 'Pentagon',\n    value: 'pentagon',\n  },\n  { src: 'https://mediasfu.com/images/svg/rhombus.svg', alt: 'Rhombus', value: 'rhombus' },\n  { src: 'https://mediasfu.com/images/svg/octagon.svg', alt: 'Octagon', value: 'octagon' },\n  {\n    src: 'https://mediasfu.com/images/svg/parallelogram.svg',\n    alt: 'Parallelogram',\n    value: 'parallelogram',\n  },\n  { src: 'https://mediasfu.com/images/svg/oval.svg', alt: 'Oval', value: 'oval' },\n];\n\nconst eraserItems: Array<{ label: string; value: number }> = [\n  { label: 'X-Small (5px)', value: 5 },\n  { label: 'Small (10px)', value: 10 },\n  { label: 'Medium (20px)', value: 20 },\n  { label: 'Large (30px)', value: 30 },\n  { label: 'X-Large (60px)', value: 60 },\n];\n\nconst handleDropdownClick = (id: string) => {\n  dropdownOpen.value = dropdownOpen.value === id ? null : id;\n};\n\nconst setLineThickness = (value: number) => {\n  lineThickness.value = value;\n};\n\nconst setBrushThickness = (value: number) => {\n  brushThickness.value = value;\n};\n\nconst setShape = (value: ShapeName | string) => {\n  shape.value = value as ShapeName;\n};\n\nconst setEraserThickness = (value: number) => {\n  eraserThickness.value = value;\n};\n\nconst handleItemClick = (callback: () => void, name?: Mode) => {\n  callback();\n  dropdownOpen.value = null;\n  if (name) {\n    mode.value = name;\n  }\n};\n\nconst handleClickOutside = (event: MouseEvent) => {\n  if (dropdownOpen.value && !(event.target as HTMLElement).closest('.btn-group')) {\n    dropdownOpen.value = null;\n  }\n};\n\nconst startDrawing = (e: MouseEvent) => {\n  if (!ctx) return;\n  isDrawing.value = true;\n  startX.value = e.offsetX;\n  startY.value = e.offsetY;\n\n  if (mode.value === 'erase') {\n    erase(e.offsetX, e.offsetY);\n  } else if (mode.value === 'draw' || mode.value === 'freehand') {\n    ctx.beginPath();\n    ctx.moveTo(e.offsetX, e.offsetY);\n    if (mode.value === 'freehand') {\n      freehandDrawing.value = [\n        {\n          x: e.offsetX,\n          y: e.offsetY,\n          color: color.value,\n          thickness: brushThickness.value,\n        },\n      ];\n    }\n  }\n};\n\nconst draw = (e: MouseEvent) => {\n  if (!ctx || !isDrawing.value) return;\n\n  currentX.value = e.offsetX;\n  currentY.value = e.offsetY;\n\n  if (mode.value === 'erase') {\n    erase(e.offsetX, e.offsetY);\n  } else if (mode.value === 'draw') {\n    ctx.clearRect(0, 0, canvas?.width ?? 0, canvas?.height ?? 0);\n    drawShapes();\n    drawLine(\n      startX.value,\n      startY.value,\n      e.offsetX,\n      e.offsetY,\n      color.value,\n      lineThickness.value,\n      lineType.value\n    );\n  } else if (mode.value === 'freehand') {\n    ctx.lineTo(e.offsetX, e.offsetY);\n    ctx.strokeStyle = color.value;\n    ctx.lineWidth = brushThickness.value;\n    ctx.stroke();\n    freehandDrawing.value.push({\n      x: e.offsetX,\n      y: e.offsetY,\n      color: color.value,\n      thickness: brushThickness.value,\n    });\n  } else if (mode.value === 'shape') {\n    ctx.clearRect(0, 0, canvas?.width ?? 0, canvas?.height ?? 0);\n    drawShapes();\n    if (shape.value) {\n      drawShape(\n        shape.value,\n        startX.value,\n        startY.value,\n        e.offsetX,\n        e.offsetY,\n        color.value,\n        lineThickness.value,\n        lineType.value\n      );\n    }\n  }\n};\n\nconst stopDrawing = () => {\n  if (!ctx) return;\n\n  isDrawing.value = false;\n\n  if (mode.value === 'draw') {\n    shapes.value.push({\n      type: 'line',\n      x1: startX.value,\n      y1: startY.value,\n      x2: currentX.value,\n      y2: currentY.value,\n      color: color.value,\n      thickness: lineThickness.value,\n      lineType: lineType.value,\n    });\n  } else if (mode.value === 'freehand') {\n    shapes.value.push({\n      type: 'freehand',\n      points: freehandDrawing.value,\n      color: color.value,\n      thickness: brushThickness.value,\n    });\n    freehandDrawing.value = [];\n  } else if (mode.value === 'shape' && shape.value) {\n    shapes.value.push({\n      type: shape.value,\n      x1: startX.value,\n      y1: startY.value,\n      x2: currentX.value,\n      y2: currentY.value,\n      color: color.value,\n      thickness: lineThickness.value,\n      lineType: lineType.value,\n    });\n  }\n\n  setTimeout(() => removeShape(), 15000);\n};\n\nconst isPointNearLine = (\n  px: number,\n  py: number,\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n  threshold: number\n) => {\n  const dx = x2 - x1;\n  const dy = y2 - y1;\n  const length = Math.sqrt(dx * dx + dy * dy);\n  const dot = ((px - x1) * dx + (py - y1) * dy) / (length * length);\n  const closestX = x1 + dot * dx;\n  const closestY = y1 + dot * dy;\n  const distance = Math.sqrt(Math.pow(px - closestX, 2) + Math.pow(py - closestY, 2));\n  return distance <= threshold;\n};\n\nconst removeShape = () => {\n  try {\n    shapes.value.shift();\n    drawShapes();\n  } catch {\n    // Do nothing\n  }\n};\n\nconst erase = (x: number, y: number) => {\n  if (!ctx) return;\n\n  ctx.save();\n  ctx.globalCompositeOperation = 'destination-out';\n  ctx.beginPath();\n  ctx.arc(x, y, eraserThickness.value / 2, 0, Math.PI * 2, false);\n  ctx.fill();\n  ctx.restore();\n\n  shapes.value = shapes.value\n    .map<ShapeItem | null>((shapeItem) => {\n      if (shapeItem.type === 'freehand') {\n        return {\n          ...shapeItem,\n          points: shapeItem.points.filter((point: FreehandPoint) => {\n            const distance = Math.sqrt(\n              Math.pow(point.x - x, 2) + Math.pow(point.y - y, 2)\n            );\n            return distance > eraserThickness.value / 2;\n          }),\n        };\n      } else if (shapeItem.type === 'line') {\n        if (\n          isPointNearLine(\n            x,\n            y,\n            shapeItem.x1,\n            shapeItem.y1,\n            shapeItem.x2,\n            shapeItem.y2,\n            eraserThickness.value / 2\n          )\n        ) {\n          return null;\n        }\n      } else if (shapeItem.type === 'text') {\n        const textWidth = ctx!.measureText(shapeItem.text).width;\n        if (\n          x > shapeItem.x &&\n          x < shapeItem.x + textWidth &&\n          y > shapeItem.y - shapeItem.fontSize &&\n          y < shapeItem.y\n        ) {\n          return null;\n        }\n      } else {\n        if (\n          x > shapeItem.x1 &&\n          x < shapeItem.x2 &&\n          y > shapeItem.y1 &&\n          y < shapeItem.y2\n        ) {\n          return null;\n        }\n      }\n      return shapeItem;\n    })\n    .filter((shapeItem): shapeItem is ShapeItem => {\n      if (!shapeItem) {\n        return false;\n      }\n      if (shapeItem.type === 'freehand') {\n        return shapeItem.points.length > 0;\n      }\n      return true;\n    });\n};\n\nconst drawShapes = () => {\n  const context = ctx;\n  if (!context) return;\n  context.clearRect(0, 0, canvas?.width ?? 0, canvas?.height ?? 0);\n  shapes.value.forEach((shapeItem) => {\n    if (shapeItem.type === 'line') {\n      drawLine(\n        shapeItem.x1,\n        shapeItem.y1,\n        shapeItem.x2,\n        shapeItem.y2,\n        shapeItem.color,\n        shapeItem.thickness,\n        shapeItem.lineType\n      );\n    } else if (shapeItem.type === 'freehand') {\n      drawFreehand(shapeItem.points, shapeItem.color, shapeItem.thickness);\n    } else if (shapeItem.type === 'text') {\n      context.font = `${shapeItem.fontSize}px Arial`;\n      context.fillStyle = shapeItem.color;\n      context.fillText(shapeItem.text, shapeItem.x, shapeItem.y);\n    } else {\n      drawShape(\n        shapeItem.type,\n        shapeItem.x1,\n        shapeItem.y1,\n        shapeItem.x2,\n        shapeItem.y2,\n        shapeItem.color,\n        shapeItem.thickness,\n        shapeItem.lineType\n      );\n    }\n  });\n};\n\nconst drawLine = (\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n  drawColor: string,\n  thickness: number,\n  type: LinePattern\n) => {\n  if (!ctx) return;\n  ctx.beginPath();\n  ctx.strokeStyle = drawColor;\n  ctx.lineWidth = thickness;\n  if (type === 'dashed') {\n    ctx.setLineDash([10, 10]);\n  } else if (type === 'dotted') {\n    ctx.setLineDash([2, 10]);\n  } else if (type === 'dashDot') {\n    ctx.setLineDash([10, 5, 2, 5]);\n  } else {\n    ctx.setLineDash([]);\n  }\n  ctx.moveTo(x1, y1);\n  ctx.lineTo(x2, y2);\n  ctx.stroke();\n  ctx.setLineDash([]);\n};\n\nconst drawFreehand = (\n  points: FreehandPoint[],\n  drawColor: string,\n  thickness: number\n) => {\n  if (!ctx || points.length < 2 || !points[0]) return;\n  ctx.strokeStyle = drawColor;\n  ctx.lineWidth = thickness;\n  ctx.beginPath();\n  ctx.moveTo(points[0].x, points[0].y);\n  for (let i = 1; i < points.length; i++) {\n    const point = points[i];\n    if (point && point.x !== undefined && point.y !== undefined) {\n      ctx.lineTo(point.x, point.y);\n    }\n  }\n  ctx.stroke();\n};\n\nconst drawShape = (\n  type: ShapeName,\n  x1: number,\n  y1: number,\n  x2: number,\n  y2: number,\n  drawColor: string,\n  thickness: number,\n  lineTypeValue: LinePattern\n) => {\n  if (!ctx) return;\n  ctx.beginPath();\n  ctx.strokeStyle = drawColor;\n  ctx.lineWidth = thickness;\n  if (lineTypeValue === 'dashed') {\n    ctx.setLineDash([10, 10]);\n  } else if (lineTypeValue === 'dotted') {\n    ctx.setLineDash([2, 10]);\n  } else if (lineTypeValue === 'dashDot') {\n    ctx.setLineDash([10, 5, 2, 5]);\n  } else {\n    ctx.setLineDash([]);\n  }\n\n  if (type === 'rectangle') {\n    ctx.strokeRect(x1, y1, x2 - x1, y2 - y1);\n  } else if (type === 'circle') {\n    const radius = Math.sqrt(Math.pow(x2 - x1, 2) + Math.pow(y2 - y1, 2));\n    ctx.arc(x1, y1, radius, 0, 2 * Math.PI);\n    ctx.stroke();\n  } else if (type === 'rhombus') {\n    const centerX = (x1 + x2) / 2;\n    const centerY = (y1 + y2) / 2;\n    ctx.moveTo(centerX, y1);\n    ctx.lineTo(x2, centerY);\n    ctx.lineTo(centerX, y2);\n    ctx.lineTo(x1, centerY);\n    ctx.closePath();\n    ctx.stroke();\n  } else if (type === 'pentagon') {\n    drawPolygon(5, x1, y1, x2, y2);\n  } else if (type === 'hexagon') {\n    drawPolygon(6, x1, y1, x2, y2);\n  } else if (type === 'triangle') {\n    const centerXTriangle = (x1 + x2) / 2;\n    ctx.moveTo(centerXTriangle, y1);\n    ctx.lineTo(x2, y2);\n    ctx.lineTo(x1, y2);\n    ctx.closePath();\n    ctx.stroke();\n  } else if (type === 'square') {\n    ctx.strokeRect(x1, y1, x2 - x1, x2 - x1);\n  } else if (type === 'octagon') {\n    drawPolygon(8, x1, y1, x2, y2);\n  } else if (type === 'oval') {\n    const radiusX = Math.abs(x2 - x1) / 2;\n    const radiusY = Math.abs(y2 - y1) / 2;\n    const centerX = (x1 + x2) / 2;\n    const centerY = (y1 + y2) / 2;\n    ctx.ellipse(centerX, centerY, radiusX, radiusY, 0, 0, 2 * Math.PI);\n    ctx.stroke();\n  } else if (type === 'parallelogram') {\n    const centerX = (x1 + x2) / 2;\n    ctx.moveTo(centerX, y1);\n    ctx.lineTo(x2, y2);\n    ctx.lineTo(centerX, y2);\n    ctx.lineTo(x1, y1);\n    ctx.closePath();\n    ctx.stroke();\n  }\n  ctx.setLineDash([]);\n};\n\nconst drawPolygon = (sides: number, x1: number, y1: number, x2: number, y2: number) => {\n  if (!ctx) return;\n  const centerX = (x1 + x2) / 2;\n  const centerY = (y1 + y2) / 2;\n  const radius = Math.min(Math.abs(x2 - x1), Math.abs(y2 - y1)) / 2;\n  const angle = (2 * Math.PI) / sides;\n  ctx.beginPath();\n  for (let i = 0; i < sides; i++) {\n    const x = centerX + radius * Math.cos(i * angle - Math.PI / 2);\n    const y = centerY + radius * Math.sin(i * angle - Math.PI / 2);\n    if (i === 0) {\n      ctx.moveTo(x, y);\n    } else {\n      ctx.lineTo(x, y);\n    }\n  }\n  ctx.closePath();\n  ctx.stroke();\n};\n\nconst toggleToolbar = () => {\n  toolbarVisible.value = !toolbarVisible.value;\n};\n\nconst toggleAnnotate = async () => {\n  const newAnnotateState = !annotateScreenStream.value;\n  updateAnnotateScreenStream(newAnnotateState);\n  if (newAnnotateState) {\n    toolbarVisible.value = true;\n    showAlert?.({\n      message: `You can now annotate the screen. If you cannot see your annotation controls (on top), try minimizing your screen by using 'Cmd' + '-' (on Mac) or 'Ctrl' + '-' (on Windows).`,\n      type: 'success',\n      duration: 9000,\n    });\n  } else {\n    toolbarVisible.value = false;\n    dropdownOpen.value = null;\n  }\n\n  updateIsScreenboardModalVisible(true);\n  await sleep({ ms: 500 });\n  updateIsScreenboardModalVisible(false);\n};\n\nwatch(annotateScreenStream, (newVal) => {\n  if (!newVal) {\n    toolbarVisible.value = false;\n    dropdownOpen.value = null;\n  }\n});\n\nconst handleTouchStart = (e: TouchEvent) => {\n  e.preventDefault();\n  const touch = e.touches[0];\n  if (!touch) return;\n  const mouseEvent = new MouseEvent('mousedown', {\n    clientX: touch.clientX,\n    clientY: touch.clientY,\n  });\n  canvas?.dispatchEvent(mouseEvent);\n};\n\nconst handleTouchMove = (e: TouchEvent) => {\n  e.preventDefault();\n  const touch = e.touches[0];\n  if (!touch) return;\n  const mouseEvent = new MouseEvent('mousemove', {\n    clientX: touch.clientX,\n    clientY: touch.clientY,\n  });\n  canvas?.dispatchEvent(mouseEvent);\n};\n\nconst handleTouchEnd = (e: TouchEvent) => {\n  e.preventDefault();\n  const mouseEvent = new MouseEvent('mouseup', {});\n  canvas?.dispatchEvent(mouseEvent);\n};\n\nonMounted(() => {\n  if (canvasRef.value) {\n    canvas = canvasRef.value;\n    ctx = canvas.getContext('2d');\n    updateCanvasScreenboard(canvas);\n  }\n\n  if (canvas) {\n    canvas.addEventListener('mousedown', startDrawing);\n    canvas.addEventListener('mousemove', draw);\n    canvas.addEventListener('mouseup', stopDrawing);\n    canvas.addEventListener('mouseout', stopDrawing);\n\n    // Touch events\n    canvas.addEventListener('touchstart', handleTouchStart);\n    canvas.addEventListener('touchmove', handleTouchMove);\n    canvas.addEventListener('touchend', handleTouchEnd);\n  }\n\n  document.addEventListener('mousedown', handleClickOutside);\n});\n\nonUnmounted(() => {\n  if (canvas) {\n    canvas.removeEventListener('mousedown', startDrawing);\n    canvas.removeEventListener('mousemove', draw);\n    canvas.removeEventListener('mouseup', stopDrawing);\n    canvas.removeEventListener('mouseout', stopDrawing);\n\n    // Touch events\n    canvas.removeEventListener('touchstart', handleTouchStart);\n    canvas.removeEventListener('touchmove', handleTouchMove);\n    canvas.removeEventListener('touchend', handleTouchEnd);\n  }\n\n  document.removeEventListener('mousedown', handleClickOutside);\n});\n</script>\n\n<script lang=\"ts\">\nexport default {\n  name: 'Screenboard'\n}\n</script>\n","<!--\n/**\n * @fileoverview ScreenboardModal - Modal for managing screenboard canvas annotations\n * @component ScreenboardModal\n * @module components/screenboardComponents/ScreenboardModal\n * \n * @description\n * A modal that controls the screenboard annotation system during screen sharing sessions.\n * Manages canvas overlay, annotation toggle, and integrates with MediaSoup transport for\n * streaming annotated screen content. Provides a simple interface with annotation toggle\n * button and canvas preview.\n * \n * This component is the **control interface** for the Screenboard component. It allows\n * hosts to enable/disable annotation mode and handles the canvas-to-stream pipeline for\n * broadcasting annotated screen shares to all participants.\n * \n * Key Features:\n * - Toggle annotation mode on/off\n * - Canvas preview display\n * - MediaSoup transport integration\n * - Processed stream management (original screen + annotations)\n * - Automatic cleanup on close\n * - Customizable positioning and styling\n * - Close button to exit annotation mode\n * \n * Technical Details:\n * - Creates canvas element for annotation overlay\n * - Captures canvas stream via captureStream()\n * - Merges screen stream with canvas stream\n * - Streams combined result via MediaSoup transport\n * - Stores processed stream in processedScreenStream\n * \n * Workflow:\n * 1. User starts screen sharing → screen stream active\n * 2. Host opens ScreenboardModal from menu or annotation button\n * 3. Modal displays canvas preview and toggle button\n * 4. Host enables annotations → canvas overlay activates\n * 5. Screenboard component renders annotation tools\n * 6. Annotations drawn on canvas → combined with screen stream\n * 7. Processed stream (screen + annotations) sent to all participants\n * 8. Host closes modal → annotations disabled, streams cleaned up\n * \n * @example Basic Usage\n * // <ScreenboardModal\n *   // :isVisible=\"isScreenboardModalVisible\"\n *   // :parameters=\"{\n *     localStreamScreen: screenStream,\n *     shared: isScreenSharing,\n *     hostLabel: 'Host',\n *     annotateScreenStream: isAnnotating,\n *     processedScreenStream: processedStream,\n *     mainScreenCanvas: canvasElement,\n *     canvasScreenboard: screenboardCanvas,\n *     transportCreated: isTransportReady,\n *     screenProducer: screenProducerInstance,\n *     updateLocalStreamScreen: setLocalStreamScreen,\n *     updateProcessedScreenStream: setProcessedStream,\n *     updateMainScreenCanvas: setMainCanvas,\n *     sleep: sleepFunction,\n *     createSendTransport: createTransport,\n *     disconnectSendTransportScreen: disconnectTransport,\n *     connectSendTransportScreen: connectTransport,\n *     stopShareScreen: stopScreen,\n *     prepopulateUserMedia: prepopulateMedia,\n *     getUpdatedAllParams: getAllParams\n *   }\"\n *   // :onClose=\"() => setIsScreenboardModalVisible(false)\"\n *   // position=\"topRight\"\n *   // backgroundColor=\"#83c0e9\"\n * // />\n * \n * @remarks\n * This component manages the annotation control interface, not the annotation canvas itself.\n * The actual drawing tools are in the Screenboard component. ScreenboardModal handles the\n * stream processing pipeline: screen stream → canvas overlay → combined stream → MediaSoup.\n * Closing the modal automatically stops annotation mode and cleans up streams.\n * \n * @see {@link Screenboard} - Annotation canvas component with drawing tools\n */\n-->\n<template>\n  <RenderVNode :node=\"overlayNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, defineOptions, onUnmounted, defineComponent, h, isVNode, type PropType, type VNodeChild, type HTMLAttributes, type StyleValue } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faTimes } from '@fortawesome/free-solid-svg-icons';\nimport type { Producer } from 'mediasoup-client';\nimport type {\n  ConnectSendTransportScreenType,\n  CreateSendTransportType,\n  DisconnectSendTransportScreenType,\n  PrepopulateUserMediaType,\n  StopShareScreenType,\n  SleepType,\n  ConnectSendTransportScreenParameters,\n  CreateSendTransportParameters,\n  DisconnectSendTransportScreenParameters,\n  PrepopulateUserMediaParameters,\n  StopShareScreenParameters,\n} from 'mediasfu-shared';\n\n/**\n * Parameters interface for ScreenboardModal\n * @interface ScreenboardModalParameters\n * \n * @property {MediaStream|null} localStreamScreen - Original screen share stream\n * @property {boolean} shared - Whether screen is currently being shared\n * @property {string} hostLabel - Label for host user\n * @property {boolean} annotateScreenStream - Whether annotation mode is enabled\n * @property {MediaStream|null} processedScreenStream - Combined screen+annotation stream\n * @property {HTMLCanvasElement|null} mainScreenCanvas - Main screen canvas element\n * @property {HTMLCanvasElement|null} canvasScreenboard - Screenboard annotation canvas\n * @property {boolean} transportCreated - Whether MediaSoup transport is ready\n * @property {Producer|null} screenProducer - MediaSoup producer for screen stream\n * @property {function} updateLocalStreamScreen - Update local screen stream\n * @property {function} updateProcessedScreenStream - Update processed stream\n * @property {function} updateMainScreenCanvas - Update main canvas reference\n * @property {function} sleep - Sleep/delay utility function\n * @property {function} createSendTransport - Create MediaSoup send transport\n * @property {function} disconnectSendTransportScreen - Disconnect screen transport\n * @property {function} connectSendTransportScreen - Connect screen transport\n * @property {function} stopShareScreen - Stop screen sharing\n * @property {function} prepopulateUserMedia - Setup user media\n * @property {function} getUpdatedAllParams - Get latest parameters\n */\nexport interface ScreenboardModalParameters\n  extends ConnectSendTransportScreenParameters,\n    CreateSendTransportParameters,\n    DisconnectSendTransportScreenParameters,\n    PrepopulateUserMediaParameters,\n    StopShareScreenParameters {\n  localStreamScreen: MediaStream | null;\n  shared: boolean;\n  hostLabel: string;\n  annotateScreenStream: boolean;\n  processedScreenStream: MediaStream | null;\n  mainScreenCanvas: HTMLCanvasElement | null;\n  canvasScreenboard: HTMLCanvasElement | null;\n  transportCreated: boolean;\n  screenProducer: Producer | null;\n\n  updateLocalStreamScreen: (stream: MediaStream | null) => void;\n  updateProcessedScreenStream: (stream: MediaStream | null) => void;\n  updateMainScreenCanvas: (canvas: HTMLCanvasElement | null) => void;\n\n  sleep: SleepType;\n  createSendTransport: CreateSendTransportType;\n  disconnectSendTransportScreen: DisconnectSendTransportScreenType;\n  connectSendTransportScreen: ConnectSendTransportScreenType;\n  stopShareScreen: StopShareScreenType;\n  prepopulateUserMedia: PrepopulateUserMediaType;\n\n  getUpdatedAllParams: () => ScreenboardModalParameters;\n  [key: string]: unknown;\n};\n\nexport interface ScreenboardModalProps {\n  parameters: ScreenboardModalParameters;\n  isVisible: boolean;\n  onClose: () => void;\n  position?: string;\n  backgroundColor?: string;\n  \n  // UI override props\n  overlayProps?: HTMLAttributes;\n  contentProps?: HTMLAttributes;\n  headerProps?: HTMLAttributes;\n  titleProps?: HTMLAttributes;\n  closeButtonProps?: HTMLAttributes;\n  dividerProps?: HTMLAttributes;\n  videoContainerProps?: HTMLAttributes;\n  videoProps?: HTMLAttributes;\n  canvasProps?: HTMLAttributes;\n  \n  // Label customization\n  title?: VNodeChild;\n  \n  // Icon customization\n  closeIconComponent?: VNodeChild;\n  \n  // Render hooks\n  renderHeader?: (props: {\n    title: VNodeChild;\n    closeButton: VNodeChild;\n  }) => VNodeChild;\n  renderContent?: (props: {\n    header: VNodeChild;\n    divider: VNodeChild;\n    videoContainer: VNodeChild;\n  }) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<ScreenboardModalProps>(), {\n  position: 'topRight',\n  backgroundColor: '#83c0e9',\n  overlayProps: undefined,\n  contentProps: undefined,\n  headerProps: undefined,\n  titleProps: undefined,\n  closeButtonProps: undefined,\n  dividerProps: undefined,\n  videoContainerProps: undefined,\n  videoProps: undefined,\n  canvasProps: undefined,\n  title: undefined,\n  closeIconComponent: undefined,\n  renderHeader: undefined,\n  renderContent: undefined,\n});\n\ndefineOptions({\n  components: { FontAwesomeIcon },\n});\n\nconst annotationInterval = ref<number | null>(null);\nconst clonedStreamScreen = ref<MediaStream | null>(null);\nconst screenVideoRef = ref<HTMLVideoElement | null>(null);\nconst screenCanvasRef = ref<HTMLCanvasElement | null>(null);\n\nlet params = props.parameters.getUpdatedAllParams();\n\nconst showModal = async () => {\n  params = props.parameters.getUpdatedAllParams();\n  let {\n    annotateScreenStream,\n    shared,\n    createSendTransport,\n    connectSendTransportScreen,\n    prepopulateUserMedia,\n    hostLabel,\n    sleep,\n    transportCreated,\n    processedScreenStream,\n  } = params;\n\n  const screenVideo = screenVideoRef.value;\n\n  try {\n    if (annotateScreenStream && shared) {\n      screenVideo?.classList.remove('d-none');\n      annotatationPreview();\n      setTimeout(async () => {\n        params = props.parameters.getUpdatedAllParams();\n        transportCreated = params.transportCreated;\n        createSendTransport = params.createSendTransport;\n        connectSendTransportScreen = params.connectSendTransportScreen;\n        prepopulateUserMedia = params.prepopulateUserMedia;\n        hostLabel = params.hostLabel;\n        sleep = params.sleep;\n        processedScreenStream = params.processedScreenStream;\n\n        if (!transportCreated) {\n          await createSendTransport({ option: 'screen', parameters: params });\n        } else {\n          try {\n            await handleScreenTransport();\n            await sleep({ ms: 250 });\n          } catch (error) {\n            console.error(error);\n          }\n          params = props.parameters.getUpdatedAllParams();\n          processedScreenStream = params.processedScreenStream;\n          connectSendTransportScreen = params.connectSendTransportScreen;\n\n          if (processedScreenStream) {\n            await connectSendTransportScreen({\n              stream: processedScreenStream,\n              parameters: params,\n            });\n          }\n        }\n        params = props.parameters.getUpdatedAllParams();\n        prepopulateUserMedia = params.prepopulateUserMedia;\n        hostLabel = params.hostLabel;\n        await prepopulateUserMedia({ name: hostLabel, parameters: params });\n      }, 100);\n    } else {\n      screenVideo?.classList.add('d-none');\n    }\n  } catch (error) {\n    console.error(error);\n  }\n};\n\nconst hideModal = async () => {\n  params = props.parameters.getUpdatedAllParams();\n  let {\n    annotateScreenStream,\n    shared,\n    createSendTransport,\n    disconnectSendTransportScreen,\n    connectSendTransportScreen,\n    prepopulateUserMedia,\n    hostLabel,\n    sleep,\n    transportCreated,\n    localStreamScreen,\n    updateLocalStreamScreen,\n  } = params;\n\n  const screenVideo = screenVideoRef.value;\n\n  try {\n    if (!annotateScreenStream) {\n      try {\n        await stopAnnotation();\n      } catch {\n        // Handle error\n      }\n\n      if (shared) {\n        if (!transportCreated) {\n          await createSendTransport({ option: 'screen', parameters: params });\n        } else {\n          try {\n            await disconnectSendTransportScreen({ parameters: params });\n            await sleep({ ms: 500 });\n          } catch (error) {\n            console.error(error);\n          }\n\n          params = props.parameters.getUpdatedAllParams();\n          localStreamScreen = params.localStreamScreen;\n          updateLocalStreamScreen = params.updateLocalStreamScreen;\n\n          const localVideoTrack = localStreamScreen?.getVideoTracks()[0];\n          if (\n            localStreamScreen &&\n            localStreamScreen.getVideoTracks().length > 0 &&\n            localVideoTrack &&\n            localVideoTrack.readyState === 'ended'\n          ) {\n            localStreamScreen.removeTrack(localVideoTrack);\n            const clonedVideoTrack = clonedStreamScreen.value?.getVideoTracks()[0];\n            if (clonedVideoTrack) {\n              localStreamScreen.addTrack(clonedVideoTrack.clone());\n            }\n            updateLocalStreamScreen(localStreamScreen);\n          }\n\n          const clonedVideoTrack = clonedStreamScreen.value?.getVideoTracks()[0];\n          if (clonedVideoTrack) {\n            clonedVideoTrack.onended = async () => {\n              params = props.parameters.getUpdatedAllParams();\n              await disconnectSendTransportScreen({ parameters: params });\n              await params.stopShareScreen({ parameters: params });\n            };\n          }\n\n          params = props.parameters.getUpdatedAllParams();\n          connectSendTransportScreen = params.connectSendTransportScreen;\n          localStreamScreen = params.localStreamScreen;\n\n          await connectSendTransportScreen({\n            stream: localStreamScreen!,\n            parameters: params,\n          });\n        }\n      } else {\n        await stopAllTracks();\n      }\n\n      params = props.parameters.getUpdatedAllParams();\n      prepopulateUserMedia = params.prepopulateUserMedia;\n      hostLabel = params.hostLabel;\n      await prepopulateUserMedia({ name: hostLabel, parameters: params });\n    }\n\n    screenVideo?.classList.add('d-none');\n    if (params.mainScreenCanvas) {\n      screenCanvasRef.value?.classList.add('d-none');\n    }\n  } catch (error) {\n    console.error(error, 'Error stopping the video stream');\n  }\n};\n\nwatch(\n  () => props.isVisible,\n  (newVal) => {\n    if (newVal) {\n      showModal();\n    } else {\n      hideModal();\n    }\n  },\n  { immediate: true }\n);\n\nwatch(\n  () => props.parameters,\n  () => {\n    params = props.parameters.getUpdatedAllParams();\n  },\n  { deep: true }\n);\n\nonUnmounted(async () => {\n  try {\n   await stopAnnotation();\n   await stopAllTracks();\n  } catch {\n    //console.error(error);\n  }\n});\n\nconst annotatationPreview = () => {\n  params = props.parameters.getUpdatedAllParams();\n  const {\n    annotateScreenStream,\n    localStreamScreen,\n    mainScreenCanvas,\n    updateMainScreenCanvas,\n    canvasScreenboard,\n    updateProcessedScreenStream,\n  } = params;\n\n  const screenVideo = screenVideoRef.value;\n\n  let canvas: HTMLCanvasElement | null = mainScreenCanvas;\n  if (!canvas) {\n    canvas = screenCanvasRef.value!;\n    updateMainScreenCanvas(canvas!);\n  }\n\n  const clonedVideoTrack = clonedStreamScreen.value?.getVideoTracks()[0];\n  if (\n    annotateScreenStream &&\n    (!clonedStreamScreen.value ||\n      (clonedStreamScreen.value &&\n        clonedStreamScreen.value.getVideoTracks().length > 0 &&\n        clonedVideoTrack &&\n        clonedVideoTrack.readyState === 'ended'))\n  ) {\n    const originalTrack = localStreamScreen?.getVideoTracks()[0];\n    if (!originalTrack) return;\n    \n    const originalSettings = originalTrack.getSettings();\n    const cloned = originalTrack.clone();\n    cloned.applyConstraints({\n      width: originalSettings.width,\n      height: originalSettings.height,\n      frameRate: originalSettings.frameRate,\n      aspectRatio: originalSettings.aspectRatio,\n    });\n    clonedStreamScreen.value = new MediaStream([cloned]);\n  }\n\n  const localVideoTrack2 = localStreamScreen?.getVideoTracks()[0];\n  if (\n    clonedStreamScreen.value &&\n    localStreamScreen &&\n    localStreamScreen.getVideoTracks().length > 0 &&\n    localVideoTrack2 &&\n    localVideoTrack2.readyState === 'ended'\n  ) {\n    localStreamScreen.removeTrack(localVideoTrack2);\n    const clonedTrack = clonedStreamScreen.value.getVideoTracks()[0];\n    if (clonedTrack) {\n      localStreamScreen.addTrack(clonedTrack.clone());\n    }\n  }\n\n  if (clonedStreamScreen.value) {\n    const clonedTrack = clonedStreamScreen.value.getVideoTracks()[0];\n    if (clonedTrack) {\n      clonedTrack.onended = async () => {\n        await params.disconnectSendTransportScreen({ parameters: params });\n        await params.stopShareScreen({ parameters: params });\n      };\n    }\n  }\n\n  const mediaCanvas = canvas!;\n  const ctx = mediaCanvas!.getContext('2d')!;\n  const localVideoTrackSettings = localStreamScreen?.getVideoTracks()[0];\n  if (!localVideoTrackSettings) return;\n  \n  mediaCanvas!.width = localVideoTrackSettings.getSettings().width!;\n  mediaCanvas!.height = localVideoTrackSettings.getSettings().height!;\n\n  if (!annotateScreenStream) {\n    updateProcessedScreenStream(null);\n  }\n\n  const annotateVideo = clonedStreamScreen.value;\n  if (annotateVideo && annotateScreenStream) {\n    const annotateVideoTrack = annotateVideo.getVideoTracks()[0];\n    if (!annotateVideoTrack) return;\n    \n    screenVideo!.style.width = `${annotateVideoTrack.getSettings().width}px`;\n    screenVideo!.style.height = `${annotateVideoTrack.getSettings().height}px`;\n    screenVideo!.srcObject = annotateVideo;\n    annotateImage();\n  }\n\n  const canvasElement = canvasScreenboard;\n  canvasElement!.width = mediaCanvas!.width;\n  canvasElement!.height = mediaCanvas!.height;\n\n  function drawCombined() {\n    ctx.clearRect(0, 0, canvasElement!.width, canvasElement!.height);\n    ctx.drawImage(screenVideo!, 0, 0, canvasElement!.width, canvasElement!.height);\n    ctx.drawImage(canvasElement!, 0, 0, canvasElement!.width, canvasElement!.height);\n    ctx.restore();\n  }\n\n  async function captureStream() {\n    const stream = mediaCanvas!.captureStream(30);\n    annotationInterval.value = window.setInterval(() => {\n      drawCombined();\n    }, 30);\n    return stream;\n  }\n\n  async function annotateImage() {\n    const stream = await captureStream();\n    updateProcessedScreenStream(stream);\n    params.processedScreenStream = stream;\n  }\n};\n\nconst handleScreenTransport = async () => {\n  params = props.parameters.getUpdatedAllParams();\n  const {\n    localStreamScreen,\n    screenProducer,\n    disconnectSendTransportScreen,\n  } = params;\n\n  const localVideoTrack = localStreamScreen?.getVideoTracks()[0];\n  if (\n    localStreamScreen &&\n    localStreamScreen.getVideoTracks().length > 0 &&\n    localVideoTrack &&\n    localVideoTrack.id === screenProducer?.track?.id\n  ) {\n    const clonedVideoTrack = clonedStreamScreen.value?.getVideoTracks()[0];\n    if (\n      clonedStreamScreen.value &&\n      clonedStreamScreen.value.getVideoTracks().length > 0 &&\n      clonedVideoTrack &&\n      clonedVideoTrack.readyState === 'ended'\n    ) {\n      clonedStreamScreen.value.removeTrack(clonedVideoTrack);\n      const localTrackClone = localVideoTrack.clone();\n      clonedStreamScreen.value.addTrack(localTrackClone);\n    }\n\n    localStreamScreen.removeTrack(localVideoTrack);\n    const clonedTrack = clonedStreamScreen.value?.getVideoTracks()[0];\n    if (clonedTrack) {\n      localStreamScreen.addTrack(clonedTrack.clone());\n    }\n  }\n\n  await disconnectSendTransportScreen({ parameters: params });\n};\n\nconst stopAnnotation = async () => {\n  if (annotationInterval.value) {\n    clearInterval(annotationInterval.value);\n    annotationInterval.value = null;\n  }\n\n  params = props.parameters.getUpdatedAllParams();\n  const { processedScreenStream, updateProcessedScreenStream, mainScreenCanvas } = params;\n\n  if (processedScreenStream) {\n    processedScreenStream.getTracks().forEach((track) => track.stop());\n    updateProcessedScreenStream(null);\n  }\n\n  if (mainScreenCanvas) {\n    mainScreenCanvas\n      .getContext('2d')\n      ?.clearRect(0, 0, mainScreenCanvas.width, mainScreenCanvas.height);\n  }\n};\n\nconst stopAllTracks = async () => {\n  params = props.parameters.getUpdatedAllParams();\n  const {\n    localStreamScreen,\n    updateLocalStreamScreen,\n    processedScreenStream,\n    updateProcessedScreenStream,\n  } = params;\n\n  try {\n    if (localStreamScreen && localStreamScreen.getVideoTracks().length > 0) {\n      localStreamScreen.getVideoTracks().forEach((track) => track.stop());\n      updateLocalStreamScreen(null);\n    }\n  } catch {\n    //console.error(error);\n  }\n\n  try {\n    if (\n      clonedStreamScreen.value &&\n      clonedStreamScreen.value.getVideoTracks().length > 0\n    ) {\n      clonedStreamScreen.value.getVideoTracks().forEach((track) => track.stop());\n    }\n  } catch {\n    // console.error(error);\n  }\n\n  try {\n    if (processedScreenStream) {\n      processedScreenStream.getTracks().forEach((track) => track.stop());\n      updateProcessedScreenStream(null);\n    }\n  } catch {\n    // console.error(error);\n  }\n\n  clonedStreamScreen.value = null;\n};\n\n// Inline RenderVNode component\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Function] as PropType<VNodeChild>,\n      default: null\n    }\n  },\n  setup(props) {\n    return () => {\n      const node = props.node\n      if (isVNode(node)) {\n        return node\n      } else if (typeof node === 'function') {\n        return (node as () => VNodeChild)()\n      } else {\n        return node\n      }\n    }\n  }\n})\n\n// Helper functions\nconst joinClassNames = (...classes: (string | undefined | null)[]): string => {\n  return classes.filter(Boolean).join(' ')\n}\n\nconst safeSpreadStyle = (style: StyleValue | undefined) => {\n  return style && typeof style === 'object' ? style : {}\n}\n\n// Computed properties for styles\nconst defaultOverlayWidth = typeof window !== 'undefined' ? Math.min(window.innerWidth * 0.8, 500) : 500\n\nconst overlayStyle = computed(() => ({\n  position: 'fixed' as const,\n  top: 0,\n  left: 0,\n  width: '100%',\n  height: '100%',\n  backgroundColor: 'rgba(0, 0, 0, 0.5)',\n  display: props.isVisible ? 'block' : 'none',\n  zIndex: 999,\n  ...safeSpreadStyle(props.overlayProps?.style)\n}))\n\nconst overlayClassName = computed(() =>\n  joinClassNames('screenboard-modal', props.overlayProps?.class as string)\n)\n\nconst contentStyle = computed(() => ({\n  position: 'fixed' as const,\n  backgroundColor: props.backgroundColor,\n  borderRadius: '10px',\n  padding: '10px',\n  width: `${defaultOverlayWidth}px`,\n  maxWidth: `${defaultOverlayWidth}px`,\n  maxHeight: '75%',\n  overflowY: 'auto' as const,\n  overflowX: 'hidden' as const,\n  top: props.position.includes('top') ? '10px' : 'auto',\n  bottom: props.position.includes('bottom') ? '10px' : 'auto',\n  left: props.position.includes('Left') ? '10px' : 'auto',\n  right: props.position.includes('Right') ? '10px' : 'auto',\n  ...safeSpreadStyle(props.contentProps?.style)\n}))\n\nconst contentClassName = computed(() =>\n  joinClassNames('screenboard-modal__content', props.contentProps?.class as string)\n)\n\n// Main overlay node\nconst overlayNode = computed(() => {\n  const defaultCloseIcon = props.closeIconComponent ?? h(FontAwesomeIcon, { icon: faTimes, size: 'xl' })\n  \n  const defaultTitleNode = h('div', {\n    class: joinClassNames('modal-title', props.titleProps?.class as string),\n    style: {\n      fontSize: '18px',\n      fontWeight: 'bold',\n      color: 'black',\n      ...safeSpreadStyle(props.titleProps?.style)\n    },\n    ...(props.titleProps ? Object.fromEntries(\n      Object.entries(props.titleProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, props.title ?? 'Screen Annotation')\n  \n  const defaultCloseButtonNode = h('div', {\n    class: joinClassNames('btn-close-screenboard', props.closeButtonProps?.class as string),\n    style: {\n      padding: '5px',\n      cursor: 'pointer',\n      ...safeSpreadStyle(props.closeButtonProps?.style)\n    },\n    onClick: (event: MouseEvent) => {\n      if (props.closeButtonProps?.onClick) {\n        (props.closeButtonProps.onClick as (event: MouseEvent) => void)(event)\n      }\n      if (!event.defaultPrevented) {\n        props.onClose()\n      }\n    },\n    ...(props.closeButtonProps ? Object.fromEntries(\n      Object.entries(props.closeButtonProps).filter(([key]) => !['class', 'style', 'onClick'].includes(key))\n    ) : {})\n  }, [defaultCloseIcon])\n  \n  const defaultHeaderNode = h('div', {\n    class: joinClassNames('modal-header', props.headerProps?.class as string),\n    style: {\n      display: 'flex',\n      justifyContent: 'space-between',\n      alignItems: 'center',\n      marginBottom: '15px',\n      ...safeSpreadStyle(props.headerProps?.style)\n    },\n    ...(props.headerProps ? Object.fromEntries(\n      Object.entries(props.headerProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [defaultTitleNode, defaultCloseButtonNode])\n  \n  const headerNode = props.renderHeader\n    ? props.renderHeader({\n        title: defaultTitleNode,\n        closeButton: defaultCloseButtonNode\n      })\n    : defaultHeaderNode\n  \n  // Divider\n  const dividerNode = h('hr', {\n    class: joinClassNames('screenboard-divider', props.dividerProps?.class as string),\n    style: {\n      height: '1px',\n      backgroundColor: 'black',\n      marginTop: '5px',\n      marginBottom: '5px',\n      ...safeSpreadStyle(props.dividerProps?.style)\n    },\n    ...(props.dividerProps ? Object.fromEntries(\n      Object.entries(props.dividerProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  })\n  \n  // Video element\n  const videoNode = h('video', {\n    ref: screenVideoRef,\n    class: joinClassNames('d-none', props.videoProps?.class as string),\n    autoplay: true,\n    muted: true,\n    style: safeSpreadStyle(props.videoProps?.style),\n    ...(props.videoProps ? Object.fromEntries(\n      Object.entries(props.videoProps).filter(([key]) => !['class', 'style', 'ref', 'autoplay', 'muted'].includes(key))\n    ) : {})\n  })\n  \n  // Canvas element\n  const canvasNode = h('canvas', {\n    ref: screenCanvasRef,\n    id: 'screenCanvas',\n    class: props.canvasProps?.class as string,\n    style: safeSpreadStyle(props.canvasProps?.style),\n    ...(props.canvasProps ? Object.fromEntries(\n      Object.entries(props.canvasProps).filter(([key]) => !['class', 'style', 'ref', 'id'].includes(key))\n    ) : {})\n  })\n  \n  // Video container\n  const defaultVideoContainerNode = h('div', {\n    class: joinClassNames('video-container', props.videoContainerProps?.class as string),\n    style: {\n      flex: 1,\n      ...safeSpreadStyle(props.videoContainerProps?.style)\n    },\n    ...(props.videoContainerProps ? Object.fromEntries(\n      Object.entries(props.videoContainerProps).filter(([key]) => !['class', 'style'].includes(key))\n    ) : {})\n  }, [videoNode, canvasNode])\n  \n  // Content node\n  const defaultContentNode = h('div', {\n    class: contentClassName.value,\n    style: contentStyle.value\n  }, [\n    headerNode,\n    dividerNode,\n    defaultVideoContainerNode\n  ])\n  \n  const contentNode = props.renderContent\n    ? props.renderContent({\n        header: headerNode,\n        divider: dividerNode,\n        videoContainer: defaultVideoContainerNode\n      })\n    : defaultContentNode\n  \n  // Overlay node\n  return h('div', {\n    class: overlayClassName.value,\n    style: overlayStyle.value\n  }, [contentNode])\n})\n\n</script>\n\n<style scoped>\n.d-none {\n  display: none;\n}\n</style>\n","<!--\n/**\n * @fileoverview Pagination - Page navigation component for multi-page grid views\n * @component Pagination\n * @module components/displayComponents/Pagination\n * \n * @description\n * Pagination control for navigating between pages in multi-page participant grid layouts.\n * Displays page numbers with visual indicators for the current page, home page (main room),\n * and breakout rooms. Supports horizontal and vertical orientations.\n * \n * Features:\n * - Numbered page buttons with active state styling\n * - Home page indicator (star icon for main room)\n * - Breakout room indicator (lock icon)\n * - Horizontal and vertical layout modes\n * - Flexible positioning (left, middle, right / top, middle, bottom)\n * - Custom page change handler\n * - Accessible button labels\n * - Custom render functions for full customization\n * \n * @example Basic Pagination\n * // <Pagination\n *   // :totalPages=\"5\"\n *   // :currentUserPage=\"2\"\n *   // :parameters=\"parameters\"\n * // />\n * \n * @example Vertical Pagination\n * // <Pagination\n *   // :totalPages=\"10\"\n *   // :currentUserPage=\"3\"\n *   // direction=\"vertical\"\n *   // position=\"right\"\n *   // location=\"middle\"\n *   // :parameters=\"parameters\"\n * // />\n * \n * @example Custom Styled\n * // <Pagination\n *   // :totalPages=\"8\"\n *   // :currentUserPage=\"4\"\n *   // :parameters=\"parameters\"\n *   // :activePageStyle=\"{ backgroundColor: '#22c55e', color: '#fff' }\"\n *   // :inactivePageStyle=\"{ backgroundColor: '#f3f4f6', color: '#374151' }\"\n *   // :paginationHeight=\"50\"\n * // />\n * \n * @example With Custom Page Button Renderer\n * // <Pagination\n *   // :totalPages=\"6\"\n *   // :currentUserPage=\"2\"\n *   // :parameters=\"parameters\"\n *   // :renderPageButton=\"({ defaultButton, page, isActive, onSelect }) =>\n *     h('button', {\n *       class: ['custom-page-btn', { active: isActive }],\n *       onClick: onSelect\n *     }, `Page ${page}`)\n *   \"\n * // />\n */\n-->\n<template>\n  <RenderVNode :node=\"containerNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  computed,\n  defineComponent,\n  h,\n  isVNode,\n  type CSSProperties,\n  type HTMLAttributes,\n  type ButtonHTMLAttributes,\n  type PropType,\n  type VNode,\n  type VNodeChild,\n} from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport { faStar, faLock } from '@fortawesome/free-solid-svg-icons';\nimport {\n  generatePageContent,\n  type GeneratePageContentOptions,\n} from '@legacy/consumers/generatePageContent';\nimport type { Socket } from 'socket.io-client';\nimport type { ShowAlert, BreakoutParticipant } from '../../../../SharedTypes';\n\n/**\n * Parameters object for Pagination component\n * @interface PaginationParameters\n */\nexport interface PaginationParameters {\n  /** Number of main rooms/pages */\n  mainRoomsLength: number;\n  /** Current user's room/page number */\n  memberRoom: number;\n  /** Whether breakout rooms have started */\n  breakOutRoomStarted: boolean;\n  /** Whether breakout rooms have ended */\n  breakOutRoomEnded: boolean;\n  /** Current user's identifier */\n  member: string;\n  /** Array of breakout room participants */\n  breakoutRooms: BreakoutParticipant[][];\n  /** Host's new room number */\n  hostNewRoom: number;\n  /** Name of the current room */\n  roomName: string;\n  /** User level ('0' = regular, '1' = admin, '2' = host) */\n  islevel: string;\n  /** Alert display function */\n  showAlert?: ShowAlert;\n  /** Socket.io connection */\n  socket: Socket;\n  /** Function to get updated parameters */\n  getUpdatedAllParams: () => PaginationParameters;\n  /** Additional parameters */\n  // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  [key: string]: any;\n}\n\n/**\n * Options passed to renderContainer function\n * @interface RenderContainerOptions\n */\ninterface RenderContainerOptions {\n  /** The default container with all page buttons */\n  defaultContainer: VNode;\n  /** Array of page numbers */\n  pages: number[];\n}\n\n/**\n * Context for page button props function\n * @interface PageContext\n */\ninterface PageContext {\n  /** Page number */\n  page: number;\n  /** Whether this is the active/current page */\n  isActive: boolean;\n  /** Whether this is the home/main room page */\n  isHomePage: boolean;\n}\n\n/**\n * Options passed to renderPageButton function\n * @interface RenderPageButtonOptions\n */\ninterface RenderPageButtonOptions {\n  /** The default button VNode */\n  defaultButton: VNode;\n  /** Page number */\n  page: number;\n  /** Whether this is the active page */\n  isActive: boolean;\n  /** Whether this is the home page */\n  isHomePage: boolean;\n  /** Function to handle page selection */\n  onSelect: () => Promise<void>;\n  /** The page label content (with icons) */\n  label: VNodeChild;\n}\n\n/**\n * Options passed to renderPageContent function\n * @interface RenderPageContentOptions\n */\ninterface RenderPageContentOptions {\n  /** The default content VNode */\n  defaultContent: VNodeChild;\n  /** Page number */\n  page: number;\n  /** Whether this is the active page */\n  isActive: boolean;\n  /** Whether this is the home page */\n  isHomePage: boolean;\n  /** The page label content */\n  label: VNodeChild;\n}\n\n/**\n * Props for the Pagination component\n * @interface PaginationProps\n */\nexport interface PaginationProps {\n  /**\n   * Total number of pages\n   * @example 5\n   */\n  totalPages: number;\n  \n  /**\n   * Current user's active page (0-based)\n   * @example 2\n   */\n  currentUserPage: number;\n  \n  /**\n   * Custom handler for page changes\n   * @default generatePageContent\n   */\n  handlePageChange?: (options: GeneratePageContentOptions) => Promise<void>;\n  \n  /**\n   * Horizontal position of pagination controls\n   * @default \"middle\"\n   */\n  position?: 'left' | 'middle' | 'right';\n  \n  /**\n   * Vertical position of pagination controls\n   * @default \"middle\"\n   */\n  location?: 'top' | 'middle' | 'bottom';\n  \n  /**\n   * Layout direction\n   * @default \"horizontal\"\n   */\n  direction?: 'horizontal' | 'vertical';\n  \n  /**\n   * Custom CSS styles for the buttons container\n   */\n  buttonsContainerStyle?: CSSProperties;\n  \n  /**\n   * Styles for the active page button\n   * @default { backgroundColor: '#2c678f' }\n   */\n  activePageStyle?: CSSProperties;\n  \n  /**\n   * Styles for inactive page buttons\n   */\n  inactivePageStyle?: CSSProperties;\n  \n  /**\n   * Background color for buttons\n   * @default \"#ffffff\"\n   */\n  backgroundColor?: string;\n  \n  /**\n   * Height of pagination controls in pixels\n   * @default 40\n   */\n  paginationHeight?: number;\n  \n  /**\n   * Whether to show the pagination controls\n   * @default true\n   */\n  showAspect?: boolean;\n  \n  /**\n   * MediaSFU parameters object\n   */\n  parameters: PaginationParameters;\n  \n  /**\n   * HTML attributes for the outer container\n   */\n  containerProps?: HTMLAttributes;\n  \n  /**\n   * Function to generate per-page button attributes\n   * @param context - Page context (page number, isActive, isHomePage)\n   * @returns Button HTML attributes\n   */\n  pageButtonProps?: (context: PageContext) => ButtonHTMLAttributes | undefined;\n  \n  /**\n   * Custom renderer for the pagination container\n   */\n  renderContainer?: (options: RenderContainerOptions) => VNodeChild;\n  \n  /**\n   * Custom renderer for individual page buttons\n   */\n  renderPageButton?: (options: RenderPageButtonOptions) => VNodeChild;\n  \n  /**\n   * Custom renderer for page button content (label)\n   */\n  renderPageContent?: (options: RenderPageContentOptions) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<PaginationProps>(), {\n  handlePageChange: generatePageContent,\n  position: 'middle',\n  location: 'middle',\n  direction: 'horizontal',\n  buttonsContainerStyle: undefined,\n  activePageStyle: () => ({ backgroundColor: '#2c678f' }),\n  inactivePageStyle: undefined,\n  backgroundColor: '#ffffff',\n  paginationHeight: 40,\n  showAspect: true,\n  containerProps: () => ({}),\n  pageButtonProps: undefined,\n  renderContainer: undefined,\n  renderPageButton: undefined,\n  renderPageContent: undefined,\n});\n\n// Wrapper component for flexible VNodeChild rendering\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Boolean, Array] as PropType<VNodeChild>,\n      default: undefined,\n    },\n  },\n  render() {\n    if (isVNode(this.node)) {\n      return this.node;\n    }\n    if (typeof this.node === 'string' || typeof this.node === 'number') {\n      return String(this.node);\n    }\n    return null;\n  },\n});\n\n// Helper to join class names\nfunction joinClassNames(...classes: (string | string[] | undefined)[]): string[] {\n  const result: string[] = [];\n  classes.forEach((cls) => {\n    if (!cls) return;\n    if (Array.isArray(cls)) {\n      result.push(...cls);\n    } else {\n      result.push(cls);\n    }\n  });\n  return result;\n}\n\nconst pages = computed(() => Array.from({ length: props.totalPages + 1 }, (_, index) => index));\n\nconst params = computed(() => props.parameters.getUpdatedAllParams());\n\nconst mainRoomsLength = computed(() => props.parameters.mainRoomsLength);\nconst memberRoom = computed(() => props.parameters.memberRoom);\nconst breakOutRoomStarted = computed(() => props.parameters.breakOutRoomStarted);\nconst breakOutRoomEnded = computed(() => props.parameters.breakOutRoomEnded);\nconst member = computed(() => props.parameters.member);\nconst breakoutRooms = computed(() => props.parameters.breakoutRooms);\nconst hostNewRoom = computed(() => props.parameters.hostNewRoom);\nconst roomName = computed(() => props.parameters.roomName);\nconst islevel = computed(() => props.parameters.islevel);\nconst showAlert = computed(() => props.parameters.showAlert);\nconst socket = computed(() => props.parameters.socket);\n\nconst getDisplayContent = (item: number) => {\n  const roomNumber = item - (mainRoomsLength.value - 1);\n  const targetPage = memberRoom.value;\n  const isLocked = targetPage + 1 !== roomNumber && islevel.value !== '2';\n  return { roomNumber, isLocked };\n};\n\nconst handleClick = async (page: number, offSet?: number) => {\n  if (page === props.currentUserPage) {\n    return;\n  }\n\n  const updatedParams = params.value;\n  const effectiveOffset = offSet ?? mainRoomsLength.value;\n\n  if (breakOutRoomStarted.value && !breakOutRoomEnded.value && page !== 0) {\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    const roomMember = breakoutRooms.value.find((r: any) =>\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      r.find((p: any) => p.name === member.value)\n    );\n    const pageInt = page - effectiveOffset;\n    let memberBreakRoom = -1;\n    if (roomMember) {\n      memberBreakRoom = breakoutRooms.value.indexOf(roomMember);\n    }\n\n    if ((memberBreakRoom === -1 || memberBreakRoom !== pageInt) && pageInt >= 0) {\n      if (islevel.value !== '2') {\n        if (showAlert.value) {\n          showAlert.value({\n            message: `You are not part of the breakout room ${pageInt + 1}.`,\n            type: 'danger',\n          });\n        }\n        return;\n      }\n\n      await props.handlePageChange!({\n        page,\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        parameters: updatedParams as any,\n        breakRoom: pageInt,\n        inBreakRoom: true,\n      });\n      if (hostNewRoom.value !== pageInt) {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        (socket.value as any).emit(\n          'updateHostBreakout',\n          { newRoom: pageInt, roomName: roomName.value },\n          () => {}\n        );\n      }\n    } else {\n      await props.handlePageChange!({\n        page,\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        parameters: updatedParams as any,\n        breakRoom: pageInt,\n        inBreakRoom: pageInt >= 0,\n      });\n      if (islevel.value === '2' && hostNewRoom.value !== -1) {\n        // eslint-disable-next-line @typescript-eslint/no-explicit-any\n        (socket.value as any).emit(\n          'updateHostBreakout',\n          { prevRoom: hostNewRoom.value, newRoom: -1, roomName: roomName.value },\n          () => {}\n        );\n      }\n    }\n  } else {\n    await props.handlePageChange!({\n      page,\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      parameters: updatedParams as any,\n      breakRoom: 0,\n      inBreakRoom: false,\n    });\n    if (islevel.value === '2' && hostNewRoom.value !== -1) {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      (socket.value as any).emit(\n        'updateHostBreakout',\n        { prevRoom: hostNewRoom.value, newRoom: -1, roomName: roomName.value },\n        () => {}\n      );\n    }\n  }\n};\n\n// =========================\n// Container Props Merging\n// =========================\nconst containerRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.containerProps || {};\n  return rest;\n});\n\nconst containerClassNames = computed(() =>\n  joinClassNames('mediasfu-pagination', props.containerProps?.class).join(' ').trim() || undefined\n);\n\nconst containerStyle = computed(() => ({\n  backgroundColor: props.backgroundColor,\n  justifyContent:\n    props.position === 'middle'\n      ? 'space-evenly'\n      : props.position === 'left'\n        ? 'flex-start'\n        : 'flex-end',\n  alignItems:\n    props.location === 'middle'\n      ? 'center'\n      : props.location === 'top'\n        ? 'flex-start'\n        : 'flex-end',\n  padding: 0,\n  margin: 0,\n  width: props.direction === 'horizontal' ? '100%' : `${props.paginationHeight}px`,\n  height: props.direction === 'horizontal' ? `${props.paginationHeight}px` : '100%',\n  display: props.showAspect ? 'flex' : 'none',\n  maxHeight: props.direction === 'horizontal' ? `${props.paginationHeight}px` : '100%',\n  maxWidth: props.direction === 'horizontal' ? '100%' : `${props.paginationHeight}px`,\n  flexDirection: props.direction === 'vertical' ? ('column' as const) : ('row' as const),\n  ...(typeof props.containerProps?.style === 'object' ? props.containerProps.style : {}),\n} as CSSProperties));\n\n// =========================\n// Render Page Item\n// =========================\nconst renderPageItem = (item: number): VNode => {\n  const isActive = item === props.currentUserPage;\n  const isHomePage = item === 0;\n\n  // Determine the display content\n  let displayItem: VNodeChild = item;\n  if (\n    breakOutRoomStarted.value &&\n    !breakOutRoomEnded.value &&\n    item >= mainRoomsLength.value\n  ) {\n    const { roomNumber, isLocked } = getDisplayContent(item);\n    if (isLocked) {\n      displayItem = [\n        `Room ${roomNumber} `,\n        h(FontAwesomeIcon, { icon: faLock, key: 'lock-icon' }),\n      ];\n    } else {\n      displayItem = `Room ${roomNumber}`;\n    }\n  }\n\n  // Base content (icon for home, text for others)\n  const baseContent = isHomePage\n    ? h(FontAwesomeIcon, { icon: faStar, size: 'lg', color: isActive ? 'yellow' : 'gray' })\n    : h(\n        'span',\n        { class: 'pageText', style: { color: isActive ? '#ffffff' : '#000000' } },\n        displayItem\n      );\n\n  const resolvedContent = props.renderPageContent\n    ? props.renderPageContent({\n        defaultContent: baseContent,\n        page: item,\n        isActive,\n        isHomePage,\n        label: displayItem,\n      })\n    : baseContent;\n\n  // Get provided button props\n  const providedButtonProps = props.pageButtonProps?.({ page: item, isActive, isHomePage });\n  const {\n    onClick: customOnClick,\n    class: buttonClass,\n    style: buttonStyleOverrides,\n    ...restButtonProps\n  } = providedButtonProps ?? {};\n\n  const baseButtonClassName = joinClassNames('pageButton', isActive ? 'active' : undefined, buttonClass)\n    .join(' ')\n    .trim() || undefined;\n\n  const combinedButtonStyle = {\n    ...(props.buttonsContainerStyle ?? {}),\n    ...(isActive ? props.activePageStyle : props.inactivePageStyle),\n    ...(typeof buttonStyleOverrides === 'object' ? buttonStyleOverrides : {}),\n  } as CSSProperties;\n\n  const handleButtonClick = async (event: MouseEvent) => {\n    if (customOnClick) {\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      await Promise.resolve(customOnClick(event as any));\n    }\n    if (!event.defaultPrevented) {\n      await handleClick(item);\n    }\n  };\n\n  const defaultButton = h(\n    'button',\n    {\n      type: 'button',\n      key: item,\n      class: baseButtonClassName,\n      style: combinedButtonStyle,\n      onClick: handleButtonClick,\n      ...restButtonProps,\n    },\n    [resolvedContent]\n  );\n\n  return props.renderPageButton\n    ? (props.renderPageButton({\n        defaultButton,\n        page: item,\n        isActive,\n        isHomePage,\n        onSelect: () => handleClick(item),\n        label: displayItem,\n      }) as VNode) ?? defaultButton\n    : defaultButton;\n};\n\n// =========================\n// Container Node\n// =========================\nconst containerNode = computed<VNode>(() => {\n  const defaultContainer = h(\n    'div',\n    {\n      class: containerClassNames.value,\n      style: containerStyle.value,\n      ...containerRestAttrs.value,\n    },\n    pages.value.map((item) => renderPageItem(item))\n  );\n\n  if (props.renderContainer) {\n    const result = props.renderContainer({\n      defaultContainer,\n      pages: pages.value,\n    });\n    if (isVNode(result)) return result;\n  }\n  return defaultContainer;\n});\n\n</script>\n\n<style scoped>\n@import './Pagination.css';\n</style>\n","<!--\n/**\n * @fileoverview FlexibleGrid - Dynamic grid layout component for participant cards\n * @component FlexibleGrid\n * @module components/displayComponents/FlexibleGrid\n * \n * @description\n * A flexible grid layout component that dynamically arranges participant cards\n * in a row/column grid structure. Automatically fills cells with provided components\n * and handles empty cells gracefully. Used extensively for displaying video/audio\n * participants in grid view layouts.\n * \n * Features:\n * - Dynamic row/column configuration\n * - Automatic cell sizing based on custom dimensions\n * - Empty cell fallback support\n * - Custom render functions for cells, rows, and entire grid\n * - Per-element HTML attribute customization\n * - Responsive to parent container size\n * \n * @example Basic Grid\n * // <FlexibleGrid\n *   // :customWidth=\"800\"\n *   // :customHeight=\"600\"\n *   // :rows=\"2\"\n *   // :columns=\"3\"\n *   // :componentsToRender=\"participantComponents\"\n * // />\n * \n * @example With Empty Cell Fallback\n * // <FlexibleGrid\n *   // :customWidth=\"1200\"\n *   // :customHeight=\"800\"\n *   // :rows=\"3\"\n *   // :columns=\"4\"\n *   // :componentsToRender=\"components\"\n *   // :emptyCellFallback=\"({ row, column }) => \n *     h('div', { class: 'empty-slot' }, `Empty ${row},${column}`)\n *   \"\n * // />\n * \n * @example With Custom Cell Renderer\n * // <FlexibleGrid\n *   // :customWidth=\"1000\"\n *   // :customHeight=\"750\"\n *   // :rows=\"2\"\n *   // :columns=\"2\"\n *   // :componentsToRender=\"videoCards\"\n *   // :renderCell=\"({ defaultCell, component, row, column }) =>\n *     h('div', { class: 'custom-cell-wrapper', 'data-pos': `${row}-${column}` }, [defaultCell])\n *   \"\n * // />\n */\n-->\n<template>\n  <RenderVNode :node=\"gridNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  computed,\n  defineComponent,\n  h,\n  isVNode,\n  type CSSProperties,\n  type HTMLAttributes,\n  type PropType,\n  type VNode,\n  type VNodeChild,\n} from 'vue';\nimport type { RenderableComponent } from '../../types/renderable-component';\n\n/**\n * Options passed to renderCell function\n * @interface RenderCellOptions\n */\ninterface RenderCellOptions {\n  /** The default rendered cell with component or fallback */\n  defaultCell: VNode;\n  /** The component to render in this cell (undefined if empty) */\n  component: RenderableComponent | undefined;\n  /** Row index (0-based) */\n  row: number;\n  /** Column index (0-based) */\n  column: number;\n  /** Flat index in componentsToRender array */\n  index: number;\n}\n\n/**\n * Options passed to renderRow function\n * @interface RenderRowOptions\n */\ninterface RenderRowOptions {\n  /** The default rendered row with all cells */\n  defaultRow: VNode;\n  /** Row index (0-based) */\n  rowIndex: number;\n  /** Array of cell VNodes in this row */\n  cells: VNode[];\n}\n\n/**\n * Options passed to renderGrid function\n * @interface RenderGridOptions\n */\ninterface RenderGridOptions {\n  /** The default rendered grid with all rows */\n  defaultGrid: VNode;\n  /** Array of row VNodes */\n  rows: VNode[];\n}\n\n/**\n * Context passed to emptyCellFallback function\n * @interface EmptyCellContext\n */\ninterface EmptyCellContext {\n  /** Row index of the empty cell */\n  row: number;\n  /** Column index of the empty cell */\n  column: number;\n  /** Flat index that would have been used */\n  index: number;\n}\n\n/**\n * Props for the FlexibleGrid component\n * @interface FlexibleGridProps\n */\nexport interface FlexibleGridProps {\n  /**\n   * Total width of the grid in pixels\n   * @example 1200\n   */\n  customWidth: number;\n  \n  /**\n   * Total height of the grid in pixels\n   * @example 800\n   */\n  customHeight: number;\n  \n  /**\n   * Number of rows in the grid\n   * @example 3\n   */\n  rows: number;\n  \n  /**\n   * Number of columns in the grid\n   * @example 4\n   */\n  columns: number;\n  \n  /**\n   * Array of components to render in grid cells\n   * Each component has: { component, props, key }\n   * @example\n   * ```ts\n   * [\n   *   { component: VideoCard, props: { name: 'Alice' }, key: 'user-1' },\n   *   { component: AudioCard, props: { name: 'Bob' }, key: 'user-2' }\n   * ]\n   * ```\n   */\n  componentsToRender: RenderableComponent[];\n  \n  /**\n   * Background color for the grid wrapper\n   * @default \"transparent\"\n   */\n  backgroundColor?: string;\n  \n  /**\n   * HTML attributes for the grid wrapper element\n   */\n  gridWrapperProps?: HTMLAttributes;\n  \n  /**\n   * HTML attributes for row elements\n   */\n  rowProps?: HTMLAttributes;\n  \n  /**\n   * HTML attributes for cell elements\n   */\n  cellProps?: HTMLAttributes;\n  \n  /**\n   * Content to display in empty cells or function to generate it\n   * @example \"Empty\"\n   * @example ({ row, column }) => h('div', `Slot ${row},${column}`)\n   */\n  emptyCellFallback?: VNodeChild | ((context: EmptyCellContext) => VNodeChild);\n  \n  /**\n   * Custom renderer for individual cells\n   * @param options - Cell rendering options\n   * @returns Custom VNode for the cell\n   */\n  renderCell?: (options: RenderCellOptions) => VNodeChild;\n  \n  /**\n   * Custom renderer for rows\n   * @param options - Row rendering options\n   * @returns Custom VNode for the row\n   */\n  renderRow?: (options: RenderRowOptions) => VNodeChild;\n  \n  /**\n   * Custom renderer for the entire grid\n   * @param options - Grid rendering options\n   * @returns Custom VNode for the grid\n   */\n  renderGrid?: (options: RenderGridOptions) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<FlexibleGridProps>(), {\n  backgroundColor: 'transparent',\n  gridWrapperProps: () => ({}),\n  rowProps: () => ({}),\n  cellProps: () => ({}),\n  emptyCellFallback: undefined,\n  renderCell: undefined,\n  renderRow: undefined,\n  renderGrid: undefined,\n});\n\n// Wrapper component for flexible VNodeChild rendering\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Boolean, Array] as PropType<VNodeChild>,\n      default: undefined,\n    },\n  },\n  render() {\n    if (isVNode(this.node)) {\n      return this.node;\n    }\n    if (typeof this.node === 'string' || typeof this.node === 'number') {\n      return String(this.node);\n    }\n    return null;\n  },\n});\n\n// Helper to join class names\nfunction joinClassNames(...classes: (string | string[] | undefined)[]): string | undefined {\n  const result: string[] = [];\n  classes.forEach((cls) => {\n    if (!cls) return;\n    if (Array.isArray(cls)) {\n      result.push(...cls);\n    } else {\n      result.push(cls);\n    }\n  });\n  const filtered = result.join(' ').trim();\n  return filtered.length > 0 ? filtered : undefined;\n}\n\n// =========================\n// Grid Wrapper Props Merging\n// =========================\nconst gridRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.gridWrapperProps || {};\n  return rest;\n});\n\nconst gridClassNames = computed(() =>\n  joinClassNames('mediasfu-flexible-grid', props.gridWrapperProps?.class)\n);\n\nconst gridStyle = computed(() => {\n  const widthPx = `${props.columns * props.customWidth}px`;\n  const heightPx = `${props.rows * props.customHeight}px`;\n\n  return {\n    padding: 0,\n    display: 'flex',\n    flexDirection: 'column' as const,\n    width: widthPx,\n    maxWidth: '100%',\n    height: heightPx,\n    maxHeight: '100%',\n    ...(typeof props.gridWrapperProps?.style === 'object' ? props.gridWrapperProps.style : {}),\n  } as CSSProperties;\n});\n\n// =========================\n// Row Props Merging\n// =========================\nconst rowRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.rowProps || {};\n  return rest;\n});\n\nconst rowClassNames = computed(() =>\n  joinClassNames('mediasfu-flexible-grid__row', props.rowProps?.class)\n);\n\nconst rowStyle = computed(() => ({\n  display: 'flex',\n  flexDirection: 'row' as const,\n  width: '100%',\n  ...(typeof props.rowProps?.style === 'object' ? props.rowProps.style : {}),\n} as CSSProperties));\n\n// =========================\n// Cell Props Merging\n// =========================\nconst cellRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.cellProps || {};\n  return rest;\n});\n\nconst cellClassNames = computed(() =>\n  joinClassNames('mediasfu-flexible-grid__cell', props.cellProps?.class)\n);\n\nconst cellStyle = computed(() => {\n  const widthPx = `${props.customWidth}px`;\n  const heightPx = `${props.customHeight}px`;\n\n  return {\n    flex: 1,\n    width: widthPx,\n    height: heightPx,\n    minWidth: widthPx,\n    minHeight: heightPx,\n    backgroundColor: props.backgroundColor,\n    margin: '1px',\n    padding: 0,\n    borderRadius: '8px',\n    ...(typeof props.cellProps?.style === 'object' ? props.cellProps.style : {}),\n  } as CSSProperties;\n});\n\n// =========================\n// Get Empty Cell Fallback\n// =========================\nconst getEmptyCell = (row: number, column: number, index: number): VNodeChild => {\n  if (typeof props.emptyCellFallback === 'function') {\n    return props.emptyCellFallback({ row, column, index });\n  }\n  return props.emptyCellFallback ?? null;\n};\n\n// =========================\n// Render Grid Rows\n// =========================\nconst gridRows = computed<VNode[]>(() => {\n  const rowsNodes: VNode[] = [];\n\n  for (let row = 0; row < props.rows; row++) {\n    const cells: VNode[] = [];\n\n    for (let col = 0; col < props.columns; col++) {\n      const index = row * props.columns + col;\n      const component = props.componentsToRender[index];\n      \n      // Render component content\n      const content = component \n        ? h(component.component, component.props ?? {})\n        : getEmptyCell(row, col, index);\n      \n      const componentKey = component?.key ?? `${row}-${col}`;\n      const cellKey = componentKey;\n\n      const defaultCell = h(\n        'div',\n        {\n          key: cellKey,\n          class: cellClassNames.value,\n          style: cellStyle.value,\n          ...cellRestAttrs.value,\n        },\n        [content]\n      );\n\n      const renderedCell = props.renderCell\n        ? props.renderCell({\n            defaultCell,\n            component,\n            row,\n            column: col,\n            index,\n          })\n        : defaultCell;\n\n      if (isVNode(renderedCell)) {\n        cells.push(renderedCell);\n      } else {\n        cells.push(h('div', { key: `${row}-${col}` }, [renderedCell]));\n      }\n    }\n\n    const defaultRow = h(\n      'div',\n      {\n        key: row,\n        class: rowClassNames.value,\n        style: rowStyle.value,\n        ...rowRestAttrs.value,\n      },\n      cells\n    );\n\n    const renderedRow = props.renderRow\n      ? props.renderRow({ defaultRow, rowIndex: row, cells })\n      : defaultRow;\n\n    if (isVNode(renderedRow)) {\n      rowsNodes.push(renderedRow);\n    } else {\n      rowsNodes.push(h('div', { key: row }, [renderedRow]));\n    }\n  }\n\n  return rowsNodes;\n});\n\n// =========================\n// Final Grid Node\n// =========================\nconst gridNode = computed<VNode>(() => {\n  const defaultGrid = h(\n    'div',\n    {\n      class: gridClassNames.value,\n      style: gridStyle.value,\n      ...gridRestAttrs.value,\n    },\n    gridRows.value\n  );\n\n  if (props.renderGrid) {\n    const result = props.renderGrid({\n      defaultGrid,\n      rows: gridRows.value,\n    });\n    if (isVNode(result)) return result;\n  }\n  return defaultGrid;\n});\n\n</script>\n","<!--\n/**\n * @fileoverview FlexibleVideo - Grid layout with screenboard overlay support\n * @component FlexibleVideo\n * @module components/displayComponents/FlexibleVideo\n * \n * @description\n * Advanced grid layout component that extends FlexibleGrid with screenboard/whiteboard\n * overlay support. Handles screen sharing annotations and dynamically positions the\n * screenboard over the main grid view. Used in main grid areas for primary video display.\n * \n * Features:\n * - Dynamic grid layout for participant cards\n * - Screenboard overlay slot for annotations and whiteboards\n * - Automatic positioning for screen share streams\n * - Responsive to video track dimensions\n * - Custom render functions for cells, rows, grid, and screenboard\n * - Visibility toggle support\n * \n * @example Basic Video Grid\n * // <FlexibleVideo\n *   // :customWidth=\"1200\"\n *   // :customHeight=\"800\"\n *   // :rows=\"2\"\n *   // :columns=\"2\"\n *   // :componentsToRender=\"videoComponents\"\n *   // :showAspect=\"true\"\n * // />\n * \n * @example With Screen Share Annotation\n * // <FlexibleVideo\n *   // :customWidth=\"1920\"\n *   // :customHeight=\"1080\"\n *   // :rows=\"1\"\n *   // :columns=\"1\"\n *   // :componentsToRender=\"mainVideoStream\"\n *   // :showAspect=\"true\"\n *   // :annotateScreenStream=\"true\"\n *   // :localStreamScreen=\"screenShareStream\"\n * >\n *   <template #Screenboard>\n *     <Screenboard\n *       :customWidth=\"screenWidth\"\n *       :customHeight=\"screenHeight\"\n *       :parameters=\"parameters\"\n *       :showAspect=\"isScreenSharing\"\n *     />\n *   </template>\n * // </FlexibleVideo>\n * \n * @example With Custom Cell Renderer\n * // <FlexibleVideo\n *   // :customWidth=\"1600\"\n *   // :customHeight=\"900\"\n *   // :rows=\"3\"\n *   // :columns=\"3\"\n *   // :componentsToRender=\"participants\"\n *   // :showAspect=\"true\"\n *   // :renderCell=\"({ defaultCell, component, row, column }) =>\n *     h('div', { \n *       class: 'spotlight-cell',\n *       'data-speaker': component?.props?.isSpeaking \n *     }, [defaultCell])\n *   \"\n * // />\n */\n-->\n<template>\n  <RenderVNode :node=\"gridNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  ref,\n  computed,\n  watch,\n  defineComponent,\n  h,\n  isVNode,\n  useSlots,\n  type CSSProperties,\n  type HTMLAttributes,\n  type PropType,\n  type VNode,\n  type VNodeChild,\n} from 'vue';\nimport type { RenderableComponent } from '../../types/renderable-component';\n\n/**\n * Options passed to renderCell function\n * @interface RenderCellOptions\n */\ninterface RenderCellOptions {\n  /** The default rendered cell */\n  defaultCell: VNode;\n  /** The component to render (undefined if empty) */\n  component: RenderableComponent | undefined;\n  /** Row index (0-based) */\n  row: number;\n  /** Column index (0-based) */\n  column: number;\n  /** Flat index in componentsToRender array */\n  index: number;\n}\n\n/**\n * Options passed to renderRow function\n * @interface RenderRowOptions\n */\ninterface RenderRowOptions {\n  /** The default rendered row */\n  defaultRow: VNode;\n  /** Row index (0-based) */\n  rowIndex: number;\n  /** Array of cell VNodes */\n  cells: VNode[];\n}\n\n/**\n * Options passed to renderGrid function\n * @interface RenderGridOptions\n */\ninterface RenderGridOptions {\n  /** The default rendered grid */\n  defaultGrid: VNode;\n  /** Array of row VNodes */\n  rows: VNode[];\n}\n\n/**\n * Options passed to renderScreenboard function\n * @interface RenderScreenboardOptions\n */\ninterface RenderScreenboardOptions {\n  /** The default screenboard slot content (null if no slot) */\n  defaultScreenboard: VNode | null;\n}\n\n/**\n * Props for the FlexibleVideo component\n * @interface FlexibleVideoProps\n */\nexport interface FlexibleVideoProps {\n  /**\n   * Total width in pixels\n   * @example 1920\n   */\n  customWidth: number;\n  \n  /**\n   * Total height in pixels\n   * @example 1080\n   */\n  customHeight: number;\n  \n  /**\n   * Number of grid rows\n   * @example 2\n   */\n  rows: number;\n  \n  /**\n   * Number of grid columns\n   * @example 2\n   */\n  columns: number;\n  \n  /**\n   * Array of components to render in grid\n   * @example [{ component: VideoCard, props: { name: 'Alice' }, key: '1' }]\n   */\n  componentsToRender: RenderableComponent[];\n  \n  /**\n   * Whether to show the component (visibility control)\n   * @default false\n   */\n  showAspect: boolean;\n  \n  /**\n   * Background color for the grid\n   * @default \"transparent\"\n   */\n  backgroundColor?: string;\n  \n  /**\n   * Whether screen share stream should be annotated\n   * Adjusts positioning for screenboard overlay\n   * @default false\n   */\n  annotateScreenStream?: boolean;\n  \n  /**\n   * The local screen share MediaStream for annotation\n   * @default null\n   */\n  localStreamScreen?: MediaStream | null;\n  \n  /**\n   * HTML attributes for the outer container\n   */\n  containerProps?: HTMLAttributes;\n  \n  /**\n   * HTML attributes for row elements\n   */\n  rowProps?: HTMLAttributes;\n  \n  /**\n   * HTML attributes for cell elements\n   */\n  cellProps?: HTMLAttributes;\n  \n  /**\n   * HTML attributes for the screenboard container\n   */\n  screenboardContainerProps?: HTMLAttributes;\n  \n  /**\n   * Custom renderer for individual cells\n   */\n  renderCell?: (options: RenderCellOptions) => VNodeChild;\n  \n  /**\n   * Custom renderer for rows\n   */\n  renderRow?: (options: RenderRowOptions) => VNodeChild;\n  \n  /**\n   * Custom renderer for the entire grid\n   */\n  renderGrid?: (options: RenderGridOptions) => VNodeChild;\n  \n  /**\n   * Custom renderer for screenboard overlay\n   * @param options - Screenboard rendering options\n   * @returns Custom VNode for screenboard area\n   */\n  renderScreenboard?: (options: RenderScreenboardOptions) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<FlexibleVideoProps>(), {\n  backgroundColor: 'transparent',\n  showAspect: false,\n  annotateScreenStream: false,\n  localStreamScreen: null,\n  containerProps: () => ({}),\n  rowProps: () => ({}),\n  cellProps: () => ({}),\n  screenboardContainerProps: () => ({}),\n  renderCell: undefined,\n  renderRow: undefined,\n  renderGrid: undefined,\n  renderScreenboard: undefined,\n});\n\nconst cardWidth = ref(0);\nconst cardHeight = ref(0);\nconst cardLeft = ref(0);\nconst canvasLeft = ref(0);\n\nconst slots = useSlots();\n\n// Wrapper component for flexible VNodeChild rendering\nconst RenderVNode = defineComponent({\n  name: 'RenderVNode',\n  props: {\n    node: {\n      type: [Object, String, Number, Boolean, Array] as PropType<VNodeChild>,\n      default: undefined,\n    },\n  },\n  render() {\n    if (isVNode(this.node)) {\n      return this.node;\n    }\n    if (typeof this.node === 'string' || typeof this.node === 'number') {\n      return String(this.node);\n    }\n    return null;\n  },\n});\n\n// Helper to join class names\nfunction joinClassNames(...classes: (string | string[] | undefined)[]): string | undefined {\n  const result: string[] = [];\n  classes.forEach((cls) => {\n    if (!cls) return;\n    if (Array.isArray(cls)) {\n      result.push(...cls);\n    } else {\n      result.push(cls);\n    }\n  });\n  const filtered = result.join(' ').trim();\n  return filtered.length > 0 ? filtered : undefined;\n}\n\n// Watch for dimension and stream changes\nwatch(\n  [\n    () => props.customWidth,\n    () => props.customHeight,\n    () => props.localStreamScreen,\n    () => props.annotateScreenStream,\n  ],\n  () => {\n    if (props.annotateScreenStream && props.localStreamScreen) {\n      const localStream = props.localStreamScreen;\n      const videoTrack = localStream.getVideoTracks()[0];\n      if (videoTrack) {\n        const settings = videoTrack.getSettings();\n        const videoHeight = settings.height || 0;\n        const videoWidth = settings.width || 0;\n        cardWidth.value = videoWidth;\n        cardHeight.value = videoHeight;\n        const computedLeft = Math.floor((props.customWidth - videoWidth) / 2);\n        cardLeft.value = computedLeft;\n        canvasLeft.value = computedLeft < 0 ? computedLeft : 0;\n      }\n    } else {\n      cardWidth.value = props.customWidth;\n      cardHeight.value = props.customHeight;\n      cardLeft.value = 0;\n      canvasLeft.value = 0;\n    }\n  },\n  { immediate: true }\n);\n\n// =========================\n// Container Props Merging\n// =========================\nconst containerRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.containerProps || {};\n  return rest;\n});\n\nconst containerClassNames = computed(() =>\n  joinClassNames('mediasfu-flexible-video', props.containerProps?.class)\n);\n\nconst containerStyle = computed(() => {\n  const widthPx = `${props.customWidth}px`;\n  const heightPx = `${props.customHeight}px`;\n\n  return {\n    padding: 0,\n    flex: 1,\n    margin: 0,\n    position: 'relative' as const,\n    display: props.showAspect ? 'flex' : 'none',\n    width: widthPx,\n    minWidth: widthPx,\n    maxWidth: widthPx,\n    height: heightPx,\n    minHeight: heightPx,\n    maxHeight: heightPx,\n    justifyContent: 'center',\n    alignItems: 'center',\n    overflowX: 'hidden' as const,\n    overflowY: 'hidden' as const,\n    boxSizing: 'border-box',\n    left: cardLeft.value > 0 ? `${cardLeft.value}px` : 0,\n    ...(typeof props.containerProps?.style === 'object' ? props.containerProps.style : {}),\n  } as CSSProperties;\n});\n\n// =========================\n// Row Props Merging\n// =========================\nconst rowRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.rowProps || {};\n  return rest;\n});\n\nconst rowClassNames = computed(() =>\n  joinClassNames('mediasfu-flexible-video__row', props.rowProps?.class)\n);\n\nconst rowStyle = computed(() => ({\n  display: 'flex',\n  flexDirection: 'row' as const,\n  width: '100%',\n  height: '100%',\n  justifyContent: props.columns > 1 ? 'space-between' : 'center',\n  alignItems: 'center',\n  ...(typeof props.rowProps?.style === 'object' ? props.rowProps.style : {}),\n} as CSSProperties));\n\n// =========================\n// Cell Props Merging\n// =========================\nconst cellRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.cellProps || {};\n  return rest;\n});\n\nconst cellClassNames = computed(() =>\n  joinClassNames('mediasfu-flexible-video__cell', props.cellProps?.class)\n);\n\nconst cellStyle = computed(() => {\n  const widthPx = `${cardWidth.value}px`;\n  const heightPx = `${cardHeight.value}px`;\n\n  return {\n    flex: 1,\n    width: widthPx,\n    height: heightPx,\n    maxWidth: widthPx,\n    maxHeight: heightPx,\n    display: 'flex',\n    justifyContent: 'center',\n    alignItems: 'center',\n    backgroundColor: props.backgroundColor,\n    margin: '1px',\n    padding: 0,\n    borderRadius: '0px',\n    boxSizing: 'border-box',\n    ...(typeof props.cellProps?.style === 'object' ? props.cellProps.style : {}),\n  } as CSSProperties;\n});\n\n// =========================\n// Render Grid Rows\n// =========================\nconst rowsContent = computed<VNode[]>(() => {\n  const rows: VNode[] = [];\n\n  for (let row = 0; row < props.rows; row++) {\n    const rowCells: VNode[] = [];\n\n    for (let col = 0; col < props.columns; col++) {\n      const index = row * props.columns + col;\n      const component = props.componentsToRender[index];\n      \n      // Render component content\n      const content = component ? h(component.component, component.props ?? {}) : null;\n      const componentKey = component?.key ?? `${row}-${col}`;\n      const cellKey = componentKey;\n\n      const defaultCell = h(\n        'div',\n        {\n          key: cellKey,\n          class: cellClassNames.value,\n          style: cellStyle.value,\n          ...cellRestAttrs.value,\n        },\n        [content]\n      );\n\n      const renderedCell = props.renderCell\n        ? props.renderCell({\n            defaultCell,\n            component,\n            row,\n            column: col,\n            index,\n          })\n        : defaultCell;\n\n      if (isVNode(renderedCell)) {\n        rowCells.push(renderedCell);\n      } else {\n        rowCells.push(h('div', { key: `${row}-${col}` }, [renderedCell]));\n      }\n    }\n\n    const defaultRow = h(\n      'div',\n      {\n        key: row,\n        class: rowClassNames.value,\n        style: rowStyle.value,\n        ...rowRestAttrs.value,\n      },\n      rowCells\n    );\n\n    const renderedRow = props.renderRow\n      ? props.renderRow({ defaultRow, rowIndex: row, cells: rowCells })\n      : defaultRow;\n\n    if (isVNode(renderedRow)) {\n      rows.push(renderedRow);\n    } else {\n      rows.push(h('div', { key: row }, [renderedRow]));\n    }\n  }\n\n  return rows;\n});\n\n// =========================\n// Screenboard Props Merging\n// =========================\nconst screenboardRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.screenboardContainerProps || {};\n  return rest;\n});\n\nconst screenboardClassNames = computed(() =>\n  joinClassNames('mediasfu-flexible-video__screenboard', props.screenboardContainerProps?.class)\n);\n\nconst screenboardStyle = computed(() => {\n  const widthPx = `${cardWidth.value}px`;\n  const heightPx = `${cardHeight.value}px`;\n\n  return {\n    position: 'absolute' as const,\n    top: 0,\n    left: `${canvasLeft.value}px`,\n    width: widthPx,\n    minWidth: widthPx,\n    maxWidth: widthPx,\n    height: heightPx,\n    minHeight: heightPx,\n    maxHeight: heightPx,\n    backgroundColor: 'rgba(0, 0, 0, 0.005)',\n    zIndex: 2,\n    pointerEvents: 'auto' as const,\n    ...(typeof props.screenboardContainerProps?.style === 'object'\n      ? props.screenboardContainerProps.style\n      : {}),\n  } as CSSProperties;\n});\n\n// =========================\n// Screenboard Node\n// =========================\nconst screenboardNode = computed<VNode | null>(() => {\n  if (!slots.Screenboard) {\n    return null;\n  }\n\n  const defaultScreenboard = h(\n    'div',\n    {\n      class: screenboardClassNames.value,\n      style: screenboardStyle.value,\n      ...screenboardRestAttrs.value,\n    },\n    slots.Screenboard()\n  );\n\n  if (props.renderScreenboard) {\n    const result = props.renderScreenboard({ defaultScreenboard });\n    if (isVNode(result)) return result;\n  }\n  return defaultScreenboard;\n});\n\n// =========================\n// Final Grid Node\n// =========================\nconst gridNode = computed<VNode>(() => {\n  const defaultGrid = h(\n    'div',\n    {\n      class: containerClassNames.value,\n      style: containerStyle.value,\n      ...containerRestAttrs.value,\n    },\n    [...rowsContent.value, screenboardNode.value]\n  );\n\n  if (props.renderGrid) {\n    const result = props.renderGrid({\n      defaultGrid,\n      rows: rowsContent.value,\n    });\n    if (isVNode(result)) return result;\n  }\n  return defaultGrid;\n});\n\n</script>\n","<!--\n/**\n * @fileoverview AudioGrid - Grid layout for audio-only participant cards\n * @component AudioGrid\n * @module components/displayComponents/AudioGrid\n * \n * @description\n * Specialized grid component for displaying audio-only participant cards.\n * Uses CSS Grid with automatic column sizing for responsive layout.\n * Optimized for showing multiple audio participants without video streams.\n * \n * Features:\n * - CSS Grid-based layout with automatic column sizing\n * - Responsive gap spacing (12px)\n * - High z-index for overlay positioning\n * - Custom render functions for items and container\n * - Minimal styling for maximum flexibility\n * \n * @example Basic Audio Grid\n * // <AudioGrid\n *   // :componentsToRender=\"audioParticipants\"\n * // />\n * \n * @example With Custom Item Wrapper\n * // <AudioGrid\n *   // :componentsToRender=\"audioCards\"\n *   // :renderItem=\"({ component, index, defaultItem }) =>\n *     h('div', { class: `audio-${index}`, 'data-speaker': isSpeaking(index) }, [component])\n *   \"\n * // />\n * \n * @example With Custom Container\n * // <AudioGrid\n *   // :componentsToRender=\"participants\"\n *   // :renderContainer=\"({ defaultContainer, items }) =>\n *     h('div', { class: 'custom-audio-grid', style: { gap: '20px' } }, items)\n *   \"\n * // />\n */\n-->\n<template>\n  <RenderVNode :node=\"containerNode\" />\n</template>\n\n<script setup lang=\"ts\">\nimport {\n  cloneVNode,\n  computed,\n  defineComponent,\n  h,\n  isVNode,\n  type CSSProperties,\n  type HTMLAttributes,\n  type PropType,\n  type VNode,\n  type VNodeChild,\n} from 'vue';\nimport type { RenderableComponent } from '../../types/renderable-component';\n\n/**\n * Options passed to renderItem function\n * @interface RenderItemOptions\n */\ninterface RenderItemOptions {\n  /** The rendered component VNode */\n  component: VNode;\n  /** Index in the componentsToRender array */\n  index: number;\n  /** The default wrapped item */\n  defaultItem: VNode;\n}\n\n/**\n * Options passed to renderContainer function\n * @interface RenderContainerOptions\n */\ninterface RenderContainerOptions {\n  /** The default container with all items */\n  defaultContainer: VNode;\n  /** Array of rendered item VNodes */\n  items: VNode[];\n}\n\n/**\n * Props for the AudioGrid component\n * @interface AudioGridProps\n */\nexport interface AudioGridProps {\n  /**\n   * Array of audio card components to render\n   * @example\n   * ```ts\n   * [\n   *   { component: AudioCard, props: { name: 'Alice' }, key: 'user-1' },\n   *   { component: AudioCard, props: { name: 'Bob' }, key: 'user-2' }\n   * ]\n   * ```\n   */\n  componentsToRender: RenderableComponent[];\n  \n  /**\n   * HTML attributes for the grid container\n   * @example { 'data-testid': 'audio-grid' }\n   */\n  containerProps?: HTMLAttributes;\n  \n  /**\n   * HTML attributes for item wrapper elements\n   */\n  itemWrapperProps?: HTMLAttributes;\n  \n  /**\n   * Custom renderer for individual items\n   * @param options - Item rendering options\n   * @returns Custom VNode for the item wrapper\n   * @example\n   * ```ts\n   * ({ component, index, defaultItem }) =>\n   *   h('div', { class: `audio-${index}` }, [component])\n   * ```\n   */\n  renderItem?: (options: RenderItemOptions) => VNodeChild;\n  \n  /**\n   * Custom renderer for the grid container\n   * @param options - Container rendering options\n   * @returns Custom VNode for the container\n   * @example\n   * ```ts\n   * ({ defaultContainer, items }) =>\n   *   h('div', { class: 'custom-grid', style: { gap: '20px' } }, items)\n   * ```\n   */\n  renderContainer?: (options: RenderContainerOptions) => VNodeChild;\n}\n\nconst props = withDefaults(defineProps<AudioGridProps>(), {\n  containerProps: () => ({}),\n  itemWrapperProps: () => ({}),\n  renderItem: undefined,\n  renderContainer: undefined,\n});\n\nconst containerBaseStyle: CSSProperties = {\n  display: 'grid',\n  gap: '12px',\n  zIndex: 9,\n};\n\nconst itemBaseStyle: CSSProperties = {\n  zIndex: 9,\n  display: 'contents',\n};\n\nconst containerRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.containerProps ?? {};\n  return rest;\n});\n\nconst containerClassNames = computed(() => [\n  'mediasfu-audio-grid',\n  props.containerProps?.class,\n]);\n\nconst containerMergedStyle = computed(() => [\n  containerBaseStyle,\n  props.containerProps?.style,\n]);\n\nconst itemRestAttrs = computed(() => {\n  const { class: _class, style: _style, ...rest } = props.itemWrapperProps ?? {};\n  return rest;\n});\n\nconst itemClassNames = computed(() => [\n  'mediasfu-audio-grid__item',\n  props.itemWrapperProps?.class,\n]);\n\nconst itemMergedStyle = computed(() => [\n  itemBaseStyle,\n  props.itemWrapperProps?.style,\n]);\n\nconst RenderVNode = defineComponent({\n  name: 'AudioGridRenderVNode',\n  props: {\n    node: {\n      type: [String, Number, Boolean, Object, Array, Function] as PropType<VNodeChild>,\n      required: true,\n    },\n  },\n  setup(renderProps) {\n    return () => renderProps.node as VNodeChild;\n  },\n});\n\nconst renderedItemNodes = computed(() =>\n  props.componentsToRender.map((renderable, index) => {\n    const key = (renderable.key ?? index) as string | number;\n    const componentNode = h(renderable.component, renderable.props ?? {});\n    const defaultItem = h(\n      'div',\n      {\n        key,\n        ...itemRestAttrs.value,\n        class: itemClassNames.value,\n        style: itemMergedStyle.value,\n      },\n      componentNode\n    );\n\n    if (!props.renderItem) {\n      return defaultItem;\n    }\n\n    const rendered = props.renderItem({\n      component: componentNode,\n      index,\n      defaultItem,\n    });\n\n    if (isVNode(rendered)) {\n      return rendered.key == null\n        ? cloneVNode(rendered, { key })\n        : rendered;\n    }\n\n    return h(RenderVNode, { key, node: rendered });\n  })\n);\n\nconst defaultContainer = computed(() =>\n  h(\n    'div',\n    {\n      ...containerRestAttrs.value,\n      class: containerClassNames.value,\n      style: containerMergedStyle.value,\n    },\n    renderedItemNodes.value\n  )\n);\n\nconst containerNode = computed(() => {\n  if (!props.renderContainer) {\n    return defaultContainer.value;\n  }\n\n  const rendered = props.renderContainer({\n    defaultContainer: defaultContainer.value,\n    items: renderedItemNodes.value,\n  });\n\n  if (isVNode(rendered)) {\n    return rendered;\n  }\n\n  return h(RenderVNode, { node: rendered });\n});\n</script>\n","<!--\n/**\n * @fileoverview MiniCardAudio - Static audio card with waveform for grid layouts\n * @component MiniCardAudio\n * @module components/displayComponents/MiniCardAudio\n * \n * @description\n * A static (non-draggable) audio card that displays participant name, optional profile\n * image, and animated waveform visualization. Designed for use in grid layouts and\n * participant lists where dragging is not needed. Lighter-weight alternative to MiniAudio\n * with same visual appearance but without drag functionality.\n * \n * Features:\n * - Animated waveform visualization (9 bars with independent timing)\n * - Optional profile image or background\n * - Participant name overlay with configurable position\n * - Automatic waveform animation lifecycle management\n * - Custom styling support for card, image, and overlay\n * - Rounded image option\n * - No dragging overhead (better for grids with many participants)\n * \n * Waveform Animation:\n * - 9 bars with independent animation timings (400-487ms cycles)\n * - Bars animate between 1px (inactive) and 16px (active) heights\n * - Continuous animation when showWaveform=true\n * - Automatic cleanup on unmount or showWaveform=false\n * \n * Use Cases:\n * - Audio-only participant in grid view\n * - Sidebar participant list with audio indicators\n * - Waiting room participant display\n * - Any layout where static cards are preferred\n * \n * @example Basic Static Audio Card\n * // <MiniCardAudio\n *   // name=\"Jane Doe\"\n *   // :showWaveform=\"true\"\n * // />\n * \n * @example With Profile Image\n * // <MiniCardAudio\n *   // name=\"John Smith\"\n *   // :showWaveform=\"true\"\n *   // imageSource=\"https://example.com/avatar.jpg\"\n *   // :roundedImage=\"true\"\n * // />\n * \n * @example Custom Colors and Styling\n * // <MiniCardAudio\n *   // name=\"Alex Johnson\"\n *   // :showWaveform=\"true\"\n *   // imageSource=\"https://example.com/avatar2.jpg\"\n *   // barColor=\"#22c55e\"\n *   // textColor=\"#ffffff\"\n *   // :customStyle=\"{ \n *     backgroundColor: 'rgba(0,0,0,0.85)', \n *     borderRadius: '12px',\n *     border: '2px solid #22c55e'\n *   }\"\n * // />\n * \n * @example With Overlay Positioning\n * // <MiniCardAudio\n *   // name=\"Sarah Williams\"\n *   // :showWaveform=\"isSpeaking\"\n *   // overlayPosition=\"bottomRight\"\n *   // barColor=\"#3b82f6\"\n * // />\n * \n * @example Custom Image Styling\n * // <MiniCardAudio\n *   // name=\"Mike Brown\"\n *   // :showWaveform=\"true\"\n *   // imageSource=\"https://example.com/avatar3.jpg\"\n *   // :imageStyle=\"{ \n *     opacity: 0.8, \n *     filter: 'blur(1px)' \n *   }\"\n *   // textColor=\"#fff\"\n * // />\n * \n * @remarks\n * This is a lightweight alternative to MiniAudio designed for grid layouts where dragging\n * is not needed. If you need a draggable audio card, use MiniAudio instead. For video\n * participants, use MiniCard or VideoCard.\n * \n * Workflow:\n * 1. Component mounts → Initializes waveform state (all bars at 0)\n * 2. showWaveform=true → Starts 9 independent waveform bar animations\n * 3. Each bar cycles between 0 (1px height) and 1 (16px height) at its own timing\n * 4. showWaveform=false → Stops all animations, resets bars to 0\n * 5. Component unmounts → Cleans up all animation timers\n * \n * @see {@link MiniAudio} - Draggable version with same appearance\n * @see {@link MiniCard} - Static card for video participants\n * @see {@link AudioCard} - Full-featured audio card with controls\n */\n-->\n<template>\n  <div :style=\"{ ...styles.card, ...customStyle }\">\n    <img\n      v-if=\"imageSource\"\n      :src=\"imageSource\"\n      :style=\"{\n        ...styles.backgroundImage,\n        ...(roundedImage ? styles.roundedImage : {}),\n        ...imageStyle,\n      }\"\n      alt=\"Background\"\n    />\n    <div\n      :style=\"{\n        ...overlayPositionStyle,\n        ...styles.overlayWeb,\n      }\"\n    >\n      <div :style=\"styles.nameColumn\">\n        <span :style=\"{ ...styles.nameText, color: textColor }\">{{ name }}</span>\n      </div>\n      <div :style=\"styles.waveformWeb\">\n        <div\n          v-for=\"(animation, index) in waveformAnimations\"\n          :key=\"index\"\n          :style=\"{\n            ...styles.bar,\n            height: animation === 0 ? '1px' : '16px',\n            backgroundColor: barColor,\n          }\"\n        />\n      </div>\n    </div>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onUnmounted, type CSSProperties } from 'vue';\nimport { getOverlayPosition } from '@legacy/methods/utils/getOverlayPosition';\n\n/**\n * Props for the MiniCardAudio component\n * @interface MiniCardAudioProps\n * \n * @property {CSSProperties} [customStyle] - Custom CSS styles for the card container\n * @property {string} name - Participant name to display\n * @property {boolean} showWaveform - Whether to show animated waveform (true=animate, false=static)\n * @property {string} [overlayPosition] - Position for name overlay (e.g., 'topLeft', 'bottomRight')\n * @property {string} [barColor='red'] - Color for waveform bars\n * @property {string} [textColor='white'] - Color for participant name text\n * @property {string} [imageSource] - Optional URL for profile image or background\n * @property {boolean} [roundedImage=false] - Whether to apply rounded corners to image\n * @property {CSSProperties} [imageStyle] - Custom CSS styles for image element\n * \n * @default barColor - 'red'\n * @default textColor - 'white'\n * @default roundedImage - false\n * \n * @example\n * ```typescript\n * // <MiniCardAudio\n *   // name=\"Jane Smith\"\n *   // :showWaveform=\"true\"\n *   // imageSource=\"https://example.com/avatar.jpg\"\n *   // :roundedImage=\"true\"\n *   // barColor=\"#22c55e\"\n *   // textColor=\"#ffffff\"\n *   // overlayPosition=\"bottomLeft\"\n *   // :customStyle=\"{ backgroundColor: '#1a1a1a', borderRadius: '8px' }\"\n * // />\n * ```\n */\nexport interface MiniCardAudioProps {\n  customStyle?: CSSProperties;\n  name: string;\n  showWaveform: boolean;\n  overlayPosition?: string;\n  barColor?: string;\n  textColor?: string;\n  imageSource?: string;\n  roundedImage?: boolean;\n  imageStyle?: CSSProperties;\n}\n\nconst props = withDefaults(defineProps<MiniCardAudioProps>(), {\n  barColor: 'white',\n  textColor: 'white',\n  roundedImage: false,\n});\n\nconst waveformAnimations = ref<number[]>(Array.from({ length: 9 }, () => 0));\nconst intervals = ref<number[]>([]);\n\nconst getAnimationDuration = (index: number): number => {\n  const durations = [474, 433, 407, 458, 400, 427, 441, 419, 487];\n  return durations[index] || 0;\n};\n\nconst animateWaveform = () => {\n  intervals.value.forEach(clearInterval);\n  intervals.value = [];\n\n  waveformAnimations.value.forEach((_, index) => {\n    const interval = window.setInterval(() => {\n      if (waveformAnimations.value[index] !== undefined) {\n        waveformAnimations.value[index] = (waveformAnimations.value[index]! + 1) % 2;\n      }\n    }, getAnimationDuration(index));\n    intervals.value.push(interval);\n  });\n};\n\nconst resetWaveform = () => {\n  intervals.value.forEach(clearInterval);\n  intervals.value = [];\n  waveformAnimations.value = Array.from({ length: 9 }, () => 0);\n};\n\nwatch(\n  () => props.showWaveform,\n  (newValue) => {\n    if (newValue) {\n      animateWaveform();\n    } else {\n      resetWaveform();\n    }\n  },\n  { immediate: true }\n);\n\nonUnmounted(() => {\n  resetWaveform();\n});\n\nconst overlayPositionStyle = computed(() => getOverlayPosition({ position: props.overlayPosition! }));\n\nconst styles: Record<string, CSSProperties> = {\n  card: {\n    width: '100%',\n    height: '100%',\n    margin: 0,\n    padding: 0,\n    backgroundColor: '#2c678f',\n    position: 'relative',\n  },\n  overlayWeb: {\n    position: 'absolute',\n    minWidth: '50%',\n    minHeight: '5%',\n    maxHeight: '100%',\n    display: 'grid',\n    gridTemplateColumns: '4fr 2fr',\n    gridGap: '3px',\n  },\n  nameColumn: {\n    justifyContent: 'center',\n    alignItems: 'center',\n    backgroundColor: 'rgba(0, 0, 0, 0.5)',\n    paddingTop: '5px',\n    paddingBottom: '5px',\n    paddingLeft: '10px',\n    paddingRight: '10px',\n    marginRight: '2px',\n    fontSize: '14px',\n    display: 'flex',\n  },\n  nameText: {\n    fontSize: '14px',\n    color: 'white',\n  },\n  waveformWeb: {\n    display: 'flex',\n    justifyContent: 'left',\n    alignItems: 'center',\n    backgroundColor: 'rgba(0, 0, 0, 0.05)',\n    padding: 0,\n    flexDirection: 'row',\n  },\n  bar: {\n    flex: 1,\n    opacity: 0.35,\n    marginLeft: '1px',\n    marginRight: '1px',\n  },\n  backgroundImage: {\n    position: 'absolute',\n    width: '80px',\n    height: '80px',\n    justifyContent: 'center',\n    alignItems: 'center',\n    alignSelf: 'center',\n    top: '50%',\n    left: '50%',\n    transform: 'translate(-40px, -40px)',\n  },\n  roundedImage: {\n    borderRadius: '20px',\n  },\n};\n</script>\n\n<style scoped>\n/* Component-specific styles */\n</style>\n","/**\n * useUIOverrides Composable\n * \n * Vue composition function for handling UI overrides in MediaSFU components.\n * Provides utilities to resolve component and function overrides with full type safety.\n */\n\nimport { h, type Component, type VNode } from 'vue';\nimport type { \n  CustomComponentOverride, \n  CustomFunctionOverride,\n  MediasfuUICustomOverrides \n} from '../types/ui-overrides';\n\n/**\n * Resolves a component override to a renderable Vue component\n * \n * @param override - The override configuration (can include component or render function)\n * @param defaultComponent - The original component to use if no override is provided\n * @returns The resolved component to render\n */\nexport function resolveComponentOverride<P extends Record<string, unknown>>(\n  override: CustomComponentOverride<P> | undefined,\n  defaultComponent: Component<P>\n): Component<P> {\n  if (!override) {\n    return defaultComponent;\n  }\n\n  // If a direct component replacement is provided, use it\n  if (override.component) {\n    return override.component;\n  }\n\n  // If a render function is provided, create a wrapper component\n  if (override.render) {\n    return {\n      name: `${defaultComponent.name || 'Component'}Override`,\n      // eslint-disable-next-line @typescript-eslint/no-explicit-any\n      props: Object.keys((defaultComponent as any).props || {}),\n      setup(props: P) {\n        return () => override.render!(props, () => h(defaultComponent, props));\n      }\n    } as Component<P>;\n  }\n\n  return defaultComponent;\n}\n\n/**\n * Resolves a function override to an executable function\n * \n * @param override - The override configuration (can include implementation or wrap function)\n * @param defaultFn - The original function to use if no override is provided\n * @returns The resolved function to execute\n */\nexport function resolveFunctionOverride<Fn extends (...args: never[]) => unknown>(\n  override: CustomFunctionOverride<Fn> | undefined,\n  defaultFn: Fn\n): Fn {\n  if (!override) {\n    return defaultFn;\n  }\n\n  // If a direct implementation replacement is provided, use it\n  if (override.implementation) {\n    return override.implementation;\n  }\n\n  // If a wrapper is provided, wrap the default function\n  if (override.wrap) {\n    return override.wrap(defaultFn);\n  }\n\n  return defaultFn;\n}\n\n/**\n * Main composable for UI overrides\n * Provides reactive access to override resolution utilities\n */\nexport function useUIOverrides(overrides?: MediasfuUICustomOverrides) {\n  /**\n   * Get a resolved component for a specific override key\n   */\n  const getOverriddenComponent = <K extends keyof MediasfuUICustomOverrides>(\n    key: K,\n    defaultComponent: Component\n  ): Component => {\n    const override = overrides?.[key] as CustomComponentOverride | undefined;\n    return resolveComponentOverride(override, defaultComponent);\n  };\n\n  /**\n   * Get a resolved function for a specific override key\n   */\n  const getOverriddenFunction = <K extends keyof MediasfuUICustomOverrides>(\n    key: K,\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n    defaultFn: (...args: any[]) => any\n    // eslint-disable-next-line @typescript-eslint/no-explicit-any\n  ): ((...args: any[]) => any) => {\n    const override = overrides?.[key] as CustomFunctionOverride<typeof defaultFn> | undefined;\n    return resolveFunctionOverride(override, defaultFn);\n  };\n\n  /**\n   * Check if a specific override is defined\n   */\n  const hasOverride = (key: keyof MediasfuUICustomOverrides): boolean => {\n    return !!overrides?.[key];\n  };\n\n  /**\n   * Create a render function that conditionally uses override or default\n   */\n  const createConditionalRenderer = <P extends Record<string, unknown>>(\n    key: keyof MediasfuUICustomOverrides,\n    defaultComponent: Component<P>\n  ) => {\n    return (props: P): VNode => {\n      const resolved = getOverriddenComponent(key, defaultComponent);\n      return h(resolved, props);\n    };\n  };\n\n  return {\n    getOverriddenComponent,\n    getOverriddenFunction,\n    hasOverride,\n    createConditionalRenderer,\n    overrides\n  };\n}\n\n/**\n * Higher-order component helper for wrapping components with override support\n * \n * @param component - The component to wrap\n * @param overrideKey - The key in the overrides map\n * @param overrides - The overrides configuration\n * @returns Wrapped component with override support\n */\nexport function withOverride<P extends Record<string, unknown>>(\n  component: Component<P>,\n  overrideKey: keyof MediasfuUICustomOverrides,\n  overrides?: MediasfuUICustomOverrides\n): Component<P> {\n  const override = overrides?.[overrideKey] as CustomComponentOverride<P> | undefined;\n  return resolveComponentOverride(override, component);\n}\n\n/**\n * Helper for wrapping functions with override support\n * \n * @param fn - The function to wrap\n * @param overrideKey - The key in the overrides map\n * @param overrides - The overrides configuration\n * @returns Wrapped function with override support\n */\nexport function withFunctionOverride<Fn extends (...args: never[]) => unknown>(\n  fn: Fn,\n  overrideKey: keyof MediasfuUICustomOverrides,\n  overrides?: MediasfuUICustomOverrides\n): Fn {\n  const override = overrides?.[overrideKey] as CustomFunctionOverride<Fn> | undefined;\n  return resolveFunctionOverride(override, fn);\n}\n","export const mediaDevices: MediaDevices = navigator.mediaDevices;\n\n","import type { ResponseJoinLocalRoom, ResponseJoinRoom } from \"../../@types/types\";\n\nexport interface CreateResponseJoinRoomOptions {\n  localRoom: ResponseJoinLocalRoom;\n}\n\n// Export the type definition for the function\nexport type CreateResponseJoinRoomType = (options: CreateResponseJoinRoomOptions) => Promise<ResponseJoinRoom>;\n\n/**\n * Creates a ResponseJoinRoom object from a ResponseJoinLocalRoom object.\n *\n * @param {CreateResponseJoinRoomOptions} options - The options containing the ResponseJoinLocalRoom object.\n * @returns {Promise<ResponseJoinRoom>} - A promise that resolves to a ResponseJoinRoom object.\n *\n * @example\n * ```typescript\n * const localRoom: ResponseJoinLocalRoom = {\n *   rtpCapabilities: null,\n *   isHost: true,\n *   eventStarted: false,\n *   isBanned: false,\n *   hostNotJoined: false,\n *   eventRoomParams: { /* MeetingRoomParams * / },\n *   recordingParams: { /* RecordingParams * / },\n *   secureCode: \"12345\",\n *   mediasfuURL: \"https://example.com\",\n *   apiKey: \"api-key\",\n *   apiUserName: \"user-name\",\n *   allowRecord: true,\n * };\n *\n * const joinRoom = await createResponseJoinRoom({ localRoom });\n * console.log(joinRoom);\n * ```\n */\n\nexport const createResponseJoinRoom: CreateResponseJoinRoomType = async ({\n  localRoom,\n}: CreateResponseJoinRoomOptions): Promise<ResponseJoinRoom> => {\n  return {\n    rtpCapabilities: localRoom.rtpCapabilities ?? null,\n    success: localRoom.rtpCapabilities !== null,\n    roomRecvIPs: [], // Placeholder; populate with necessary values\n    meetingRoomParams: localRoom.eventRoomParams,\n    recordingParams: localRoom.recordingParams,\n    secureCode: localRoom.secureCode,\n    recordOnly: false, // Default assumption unless additional logic applies\n    isHost: localRoom.isHost,\n    safeRoom: false, // Default assumption unless additional logic applies\n    autoStartSafeRoom: false, // Default assumption unless additional logic applies\n    safeRoomStarted: false, // Default assumption unless additional logic applies\n    safeRoomEnded: false, // Default assumption unless additional logic applies\n    reason: localRoom.isBanned ? \"User is banned from the room.\" : undefined,\n    banned: localRoom.isBanned,\n    suspended: false, // Default assumption unless additional logic applies\n    noAdmin: localRoom.hostNotJoined,\n  };\n};\n","<!--\n/**\n * @fileoverview MediasfuGeneric - Main orchestrator component for MediaSFU platform\n * @component MediasfuGeneric\n * @module components/mediasfuComponents/MediasfuGeneric\n * \n * @description\n * The core component that orchestrates the entire MediaSFU experience. This is the main\n * entry point for all MediaSFU functionality, handling room initialization, participant\n * management, media streaming, UI rendering, and real-time communication. It supports\n * multiple event types (webinar, conference, broadcast, chat) and provides comprehensive\n * customization through the UI override system.\n * \n * Key Features:\n * - Multi-event type support (webinar, conference, broadcast, chat, generic)\n * - Complete UI override system via `uiOverrides` prop\n * - Pre-join page with room creation and joining\n * - Real-time WebRTC media streaming (audio/video)\n * - Screen sharing and recording capabilities\n * - Whiteboard and screenboard collaboration\n * - Breakout rooms functionality\n * - Participant management and controls\n * - Chat and messaging system\n * - Polls and Q&A features\n * - Responsive layout with grid/list views\n * - Local and MediaSFU cloud integration\n * - Seed data support for testing\n * - Custom component injection at any level\n * \n * Architecture:\n * - Validates and authenticates users via PreJoinPage\n * - Establishes socket connection (local or MediaSFU cloud)\n * - Manages WebRTC peer connections via mediasoup\n * - Renders main UI with grid layouts, controls, and modals\n * - Exposes `allParameters` object with all state and methods\n * - Resolves UI overrides via `useUIOverrides` composable\n * - Exports resolved card components for downstream use\n * \n * @example Basic Usage - Conference Mode\n * // <MediasfuGeneric\n *   // defaultEventType=\"conference\"\n *   // :credentials=\"{ apiUserName: 'user123', apiKey: 'key456' }\"\n *   // connectMediaSFU\n * // />\n * \n * @example With UI Overrides - Custom Cards\n * // <script setup>\n * import { computed } from 'vue';\n * import MediasfuGeneric from './components/mediasfuComponents/MediasfuGeneric.vue';\n * import CustomVideoCard from './components/custom/CustomVideoCard.vue';\n * \n * const uiOverrides = computed(() => ({\n *   // videoCard: { component: CustomVideoCard },\n *   // audioCard: { component: CustomAudioCard },\n *   // miniCard: { component: CustomMiniCard }\n * }));\n * </script>\n * \n * // <template>\n *   <MediasfuGeneric\n *     defaultEventType=\"webinar\"\n *     :uiOverrides=\"uiOverrides\"\n *     :credentials=\"credentials\"\n *   />\n * </template>\n * \n * @example Local Development Mode\n * // <MediasfuGeneric\n *   // defaultEventType=\"conference\"\n *   // localLink=\"http://localhost:3000\"\n *   // :connectMediaSFU=\"false\"\n *   // useLocalUIMode\n * // />\n * \n * @example No-UI Mode with Seed Data (Testing)\n * // <MediasfuGeneric\n *   // defaultEventType=\"broadcast\"\n *   // :returnUI=\"false\"\n *   // useSeed\n *   // :seedData=\"{\n *     member: 'Host',\n *     host: 'Host',\n *     eventType: 'broadcast',\n *     participants: [...],\n *     messages: [...]\n *   }\"\n * // />\n * \n * @example Complete Custom UI Replacement\n * // <MediasfuGeneric\n *   // defaultEventType=\"conference\"\n *   // :customComponent=\"MyCompleteUI\"\n *   // :credentials=\"credentials\"\n * // />\n * \n * @example Comprehensive Override System\n * const uiOverrides = computed(() => ({\n *   // Layout components\n *   // mainContainer: { component: CustomMainContainer },\n *   // flexibleVideo: { component: CustomFlexibleVideo },\n *   \n *   // Participant cards\n *   // videoCard: { component: CustomVideoCard },\n *   // audioCard: { component: CustomAudioCard },\n *   // miniCard: { component: CustomMiniCard },\n *   \n *   // Modals\n *   // participantsModal: { component: CustomParticipantsModal },\n *   // messagesModal: { component: CustomMessagesModal },\n *   \n *   // Entry flows\n *   // preJoinPage: { component: CustomPreJoinPage },\n *   // welcomePage: { component: CustomWelcomePage },\n *   \n *   // Functions\n *   // consumerResume: {\n *     wrap: (defaultFn) => async (options) => {\n *       console.log('Consumer resuming:', options);\n *       return await defaultFn(options);\n *     }\n *   }\n * }));\n * \n * @see {@link MediasfuUICustomOverrides} for all available overrides\n * @see {@link https://mediasfu.com/docs} for comprehensive documentation\n */\n-->\n<template>\n  <div\n    ref=\"mediaContainerRef\"\n    class=\"MediaSFU\"\n    :style=\"computedContainerStyle\"\n  >\n    <!-- Custom Component (full UI override) -->\n    <component\n      :is=\"resolvedCustomComponent\"\n      v-if=\"resolvedCustomComponent && validated\"\n      :parameters=\"allParameters\"\n    />\n\n    <!-- Pre-join Page -->\n    <component\n      :is=\"prejoinComponent\"\n      v-else-if=\"!validated\"\n      :parameters=\"prejoinParameters\"\n      :credentials=\"credentials\"\n      :local-link=\"localLink\"\n      :connect-media-s-f-u=\"connectMediaSFU\"\n      :return-u-i=\"returnUI\"\n      :no-u-i-pre-join-options=\"noUIPreJoinOptions\"\n      :create-media-s-f-u-room=\"createMediaSFURoom\"\n      :join-media-s-f-u-room=\"joinMediaSFURoom\"\n    />\n\n    <!-- Main UI -->\n    <component\n      :is=\"MainContainer\"\n      v-else-if=\"returnUI\"\n    >\n      <!-- Main aspect component contains all but the control buttons -->\n      <component\n        :is=\"MainAspect\"\n        background-color=\"rgba(217, 227, 234, 0.99)\"\n        :default-fraction=\"1 - controlHeight\"\n        :update-is-wide-screen=\"updateIsWideScreen\"\n        :update-is-medium-screen=\"updateIsMediumScreen\"\n        :update-is-small-screen=\"updateIsSmallScreen\"\n        :show-controls=\"eventType === 'webinar' || eventType === 'conference'\"\n      >\n        <!-- MainScreenComponent contains the main grid view and the minor grid view -->\n        <component\n          :is=\"MainScreen\"\n          :do-stack=\"true\"\n          :main-size=\"mainHeightWidth\"\n          :update-component-sizes=\"updateComponentSizes\"\n          :default-fraction=\"1 - controlHeight\"\n          :component-sizes=\"componentSizes\"\n          :show-controls=\"eventType === 'webinar' || eventType === 'conference'\"\n        >\n          <!-- MainGridComponent shows the main grid view -->\n          <component\n            :is=\"MainGrid\"\n            :height=\"componentSizes.mainHeight\"\n            :width=\"componentSizes.mainWidth\"\n            background-color=\"rgba(217, 227, 234, 0.99)\"\n            :main-size=\"mainHeightWidth\"\n            :show-aspect=\"mainHeightWidth > 0\"\n            :time-background-color=\"recordState\"\n            :meeting-progress-time=\"meetingProgressTime\"\n            :stack-direction=\"isWideScreen ? 'row' : 'column'\"\n          >\n            <component\n              :is=\"FlexibleVideoComponent\"\n              :custom-width=\"componentSizes.mainWidth\"\n              :custom-height=\"componentSizes.mainHeight\"\n              :rows=\"1\"\n              :columns=\"1\"\n              :components-to-render=\"mainGridStream\"\n              :show-aspect=\"mainGridStream.length > 0 && !(whiteboardStarted && !whiteboardEnded)\"\n              :local-stream-screen=\"localStreamScreen\"\n              :annotate-screen-stream=\"annotateScreenStream\"\n            >\n              <template #Screenboard>\n                <component\n                  :is=\"ScreenboardComponent\"\n                  v-if=\"shared\"\n                  :custom-width=\"componentSizes.mainWidth\"\n                  :custom-height=\"componentSizes.mainHeight\"\n                  :parameters=\"allParameters\"\n                  :show-aspect=\"shared\"\n                />\n              </template>\n            </component>\n\n            <component\n              :is=\"WhiteboardComponent\"\n              :custom-width=\"componentSizes.mainWidth\"\n              :custom-height=\"componentSizes.mainHeight\"\n              :parameters=\"whiteboardParameters\"\n              :show-aspect=\"whiteboardStarted && !whiteboardEnded\"\n            />\n\n            <component\n              :is=\"ControlButtonsTouch\"\n              :buttons=\"controlBroadcastButtons\"\n              position=\"right\"\n              location=\"bottom\"\n              direction=\"vertical\"\n              :show-aspect=\"eventType === 'broadcast'\"\n            />\n\n            <!-- Button to launch recording modal -->\n            <component\n              :is=\"ControlButtonsTouch\"\n              :buttons=\"recordButton\"\n              direction=\"horizontal\"\n              :show-aspect=\"eventType === 'broadcast' && !showRecordButtons && islevel === '2'\"\n              location=\"bottom\"\n              position=\"middle\"\n            />\n\n            <!-- Buttons to control recording -->\n            <component\n              :is=\"ControlButtonsTouch\"\n              :buttons=\"recordButtons\"\n              direction=\"horizontal\"\n              :show-aspect=\"eventType === 'broadcast' && showRecordButtons && islevel === '2'\"\n              location=\"bottom\"\n              position=\"middle\"\n            />\n          </component>\n\n          <!-- OthergridComponent shows the minor grid view -->\n          <component\n            :is=\"OtherGrid\"\n            :height=\"componentSizes.otherHeight\"\n            :width=\"componentSizes.otherWidth\"\n            background-color=\"rgba(217, 227, 234, 0.99)\"\n            :show-aspect=\"mainHeightWidth !== 100\"\n            :time-background-color=\"recordState\"\n            :show-timer=\"mainHeightWidth === 0\"\n            :meeting-progress-time=\"meetingProgressTime\"\n            :stack-direction=\"isWideScreen ? 'row' : 'column'\"\n          >\n            <!-- Pagination -->\n            <div\n              :style=\"{\n                width: paginationDirection === 'horizontal' ? componentSizes.otherWidth + 'px' : paginationHeightWidth + 'px',\n                height: paginationDirection === 'horizontal' ? paginationHeightWidth + 'px' : componentSizes.otherHeight + 'px',\n                padding: 0,\n                margin: 0,\n                display: doPaginate ? 'flex' : 'none',\n                flexDirection: paginationDirection === 'horizontal' ? 'row' : 'column',\n                justifyContent: 'center',\n                alignItems: 'center',\n              }\"\n            >\n              <component\n                :is=\"PaginationComponent\"\n                :total-pages=\"numberPages\"\n                :current-user-page=\"currentUserPage\"\n                :show-aspect=\"doPaginate\"\n                :pagination-height=\"paginationHeightWidth\"\n                :direction=\"paginationDirection\"\n                :parameters=\"allParameters\"\n              />\n            </div>\n\n            <!-- AudioGrid contains all the audio only streams -->\n            <component\n              :is=\"AudioGridComponent\"\n              :components-to-render=\"audioOnlyComponents\"\n            />\n\n            <component\n              :is=\"ControlButtonsTouch\"\n              :buttons=\"controlChatButtons\"\n              position=\"right\"\n              location=\"bottom\"\n              direction=\"vertical\"\n              :show-aspect=\"eventType === 'chat'\"\n            />\n\n            <component\n              :is=\"FlexibleGridPrimary\"\n              :custom-width=\"gridSizes.gridWidth ?? 0\"\n              :custom-height=\"gridSizes.gridHeight ?? 0\"\n              :rows=\"gridRows\"\n              :columns=\"gridCols\"\n              :components-to-render=\"otherGridComponentLists[0]\"\n              background-color=\"rgba(217, 227, 234, 0.99)\"\n            />\n\n            <component\n              :is=\"FlexibleGridAlt\"\n              :custom-width=\"gridSizes.altGridWidth ?? 0\"\n              :custom-height=\"gridSizes.altGridHeight ?? 0\"\n              :rows=\"altGridRows\"\n              :columns=\"altGridCols\"\n              :components-to-render=\"otherGridComponentLists[1]\"\n              background-color=\"rgba(217, 227, 234, 0.99)\"\n            />\n          </component>\n        </component>\n      </component>\n\n      <!-- SubAspectComponent is used for webinar and conference events only to display fixed control buttons -->\n      <component\n        :is=\"SubAspect\"\n        background-color=\"rgba(217, 227, 234, 0.99)\"\n        :show-controls=\"eventType === 'webinar' || eventType === 'conference'\"\n        :default-fraction-sub=\"controlHeight\"\n      >\n        <component\n          :is=\"ControlButtons\"\n          :buttons=\"controlButtons\"\n          button-color=\"black\"\n          :button-background-color=\"{ default: 'transparent', pressed: 'transparent' }\"\n          alignment=\"space-between\"\n          :vertical=\"false\"\n          :buttons-container-style=\"{\n            marginTop: 2,\n            marginBottom: 2,\n            backgroundColor: 'transparent',\n          }\"\n        />\n      </component>\n    </component>\n\n    <!-- All Modals -->\n    <template v-if=\"returnUI && !resolvedCustomComponent\">\n      <component\n        :is=\"MenuModalComponent\"\n        background-color=\"rgba(181, 233, 229, 0.97)\"\n        :is-visible=\"isMenuModalVisible\"\n        :on-close=\"() => updateIsMenuModalVisible(false)\"\n        :custom-buttons=\"customMenuButtons\"\n        :room-name=\"roomName\"\n        :admin-passcode=\"adminPasscode\"\n        :islevel=\"islevel\"\n        :event-type=\"eventType\"\n        :local-link=\"localLink\"\n      />\n\n      <component\n        :is=\"EventSettingsModalComponent\"\n        background-color=\"rgba(217, 227, 234, 0.99)\"\n        :is-event-settings-modal-visible=\"isSettingsModalVisible\"\n        :update-is-settings-modal-visible=\"updateIsSettingsModalVisible\"\n        :on-event-settings-close=\"() => updateIsSettingsModalVisible(false)\"\n        :audio-setting=\"audioSetting\"\n        :video-setting=\"videoSetting\"\n        :screenshare-setting=\"screenshareSetting\"\n        :chat-setting=\"chatSetting\"\n        :update-audio-setting=\"updateAudioSetting\"\n        :update-video-setting=\"updateVideoSetting\"\n        :update-screenshare-setting=\"updateScreenshareSetting\"\n        :update-chat-setting=\"updateChatSetting\"\n        :room-name=\"roomName\"\n        :socket=\"castedSocket\"\n      />\n\n      <component\n        :is=\"RequestsModalComponent\"\n        background-color=\"rgba(217, 227, 234, 0.99)\"\n        :is-requests-modal-visible=\"isRequestsModalVisible\"\n        :on-request-close=\"() => updateIsRequestsModalVisible(false)\"\n        :request-counter=\"requestCounter\"\n        :on-request-filter-change=\"onRequestFilterChange\"\n        :update-request-list=\"updateRequestList\"\n        :request-list=\"filteredRequestList\"\n        :room-name=\"roomName\"\n        :socket=\"castedSocket\"\n        :parameters=\"{\n          updateRequestCounter,\n          updateRequestFilter,\n          updateRequestList,\n          getUpdatedAllParams,\n        }\"\n      />\n\n      <component\n        :is=\"WaitingRoomModalComponent\"\n        background-color=\"rgba(217, 227, 234, 0.99)\"\n        :is-waiting-modal-visible=\"isWaitingModalVisible\"\n        :on-waiting-room-close=\"() => updateIsWaitingModalVisible(false)\"\n        :waiting-room-counter=\"waitingRoomCounter\"\n        :on-waiting-room-filter-change=\"onWaitingRoomFilterChange\"\n        :waiting-room-list=\"filteredWaitingRoomList\"\n        :update-waiting-list=\"updateWaitingRoomList\"\n        :room-name=\"roomName\"\n        :socket=\"castedSocket\"\n        :parameters=\"{\n          filteredWaitingRoomList,\n          getUpdatedAllParams,\n        }\"\n      />\n\n      <component\n        :is=\"CoHostModalComponent\"\n        background-color=\"rgba(217, 227, 234, 0.99)\"\n        :is-co-host-modal-visible=\"isCoHostModalVisible\"\n        :update-is-co-host-modal-visible=\"updateIsCoHostModalVisible\"\n        :on-co-host-close=\"() => updateIsCoHostModalVisible(false)\"\n        :co-host-responsibility=\"coHostResponsibility\"\n        :participants=\"participants\"\n        :current-cohost=\"coHost\"\n        :room-name=\"roomName\"\n        :show-alert=\"showAlert\"\n        :update-co-host-responsibility=\"updateCoHostResponsibility\"\n        :update-co-host=\"updateCoHost\"\n        :socket=\"castedSocket\"\n      />\n\n      <component\n        :is=\"MediaSettingsModalComponent\"\n        background-color=\"rgba(181, 233, 229, 0.97)\"\n        :is-media-settings-modal-visible=\"isMediaSettingsModalVisible\"\n        :on-media-settings-close=\"() => updateIsMediaSettingsModalVisible(false)\"\n        :parameters=\"allParameters\"\n      />\n\n      <component\n        :is=\"ParticipantsModalComponent\"\n        background-color=\"rgba(217, 227, 234, 0.99)\"\n        :is-participants-modal-visible=\"isParticipantsModalVisible\"\n        :on-participants-close=\"() => updateIsParticipantsModalVisible(false)\"\n        :participants-counter=\"participantsCounter\"\n        :on-participants-filter-change=\"onParticipantsFilterChange\"\n        :on-mute-participants=\"muteParticipants\"\n        :on-message-participants=\"messageParticipants\"\n        :on-remove-participants=\"removeParticipants\"\n        :parameters=\"{\n          updateParticipants,\n          updateIsParticipantsModalVisible,\n          updateDirectMessageDetails,\n          updateStartDirectMessage,\n          updateIsMessagesModalVisible,\n          showAlert,\n          filteredParticipants,\n          participants: filteredParticipants,\n          roomName,\n          islevel,\n          member,\n          coHostResponsibility,\n          coHost,\n          eventType,\n          startDirectMessage,\n          directMessageDetails,\n          socket: castedSocket,\n          getUpdatedAllParams: getAllParams,\n        }\"\n      />\n\n      <component\n        :is=\"DisplaySettingsModalComponent\"\n        background-color=\"rgba(217, 227, 234, 0.99)\"\n        :is-display-settings-modal-visible=\"isDisplaySettingsModalVisible\"\n        :on-display-settings-close=\"() => updateIsDisplaySettingsModalVisible(false)\"\n        :parameters=\"allParameters\"\n      />\n\n      <component\n        :is=\"RecordingModalComponent\"\n        background-color=\"rgba(217, 227, 234, 0.99)\"\n        :is-recording-modal-visible=\"isRecordingModalVisible\"\n        :on-close=\"() => updateIsRecordingModalVisible(false)\"\n        :start-recording=\"startRecording\"\n        :confirm-recording=\"confirmRecording\"\n        :parameters=\"allParameters\"\n      />\n\n      <component\n        :is=\"MessagesModalComponent\"\n        :background-color=\"eventType === 'webinar' || eventType === 'conference' ? '#f5f5f5' : 'rgba(255, 255, 255, 0.25)'\"\n        :is-messages-modal-visible=\"isMessagesModalVisible\"\n        :on-messages-close=\"() => updateIsMessagesModalVisible(false)\"\n        :messages=\"messages\"\n        :event-type=\"eventType\"\n        :member=\"member\"\n        :islevel=\"islevel\"\n        :co-host-responsibility=\"coHostResponsibility\"\n        :co-host=\"coHost\"\n        :start-direct-message=\"startDirectMessage\"\n        :direct-message-details=\"directMessageDetails\"\n        :update-start-direct-message=\"updateStartDirectMessage\"\n        :update-direct-message-details=\"updateDirectMessageDetails\"\n        :show-alert=\"showAlert\"\n        :room-name=\"roomName\"\n        :socket=\"castedSocket\"\n        :chat-setting=\"chatSetting\"\n      />\n\n      <component\n        :is=\"ConfirmExitModalComponent\"\n        background-color=\"rgba(181, 233, 229, 0.97)\"\n        :is-confirm-exit-modal-visible=\"isConfirmExitModalVisible\"\n        :on-confirm-exit-close=\"() => updateIsConfirmExitModalVisible(false)\"\n        :member=\"member\"\n        :room-name=\"roomName\"\n        :socket=\"castedSocket\"\n        :islevel=\"islevel\"\n      />\n\n      <component\n        :is=\"ConfirmHereModalComponent\"\n        background-color=\"rgba(181, 233, 229, 0.97)\"\n        :is-confirm-here-modal-visible=\"isConfirmHereModalVisible\"\n        :on-confirm-here-close=\"() => updateIsConfirmHereModalVisible(false)\"\n        :member=\"member\"\n        :room-name=\"roomName\"\n        :socket=\"castedSocket\"\n      />\n\n      <component\n        :is=\"ShareEventModalComponent\"\n        :is-share-event-modal-visible=\"isShareEventModalVisible\"\n        :on-share-event-close=\"() => updateIsShareEventModalVisible(false)\"\n        :room-name=\"roomName\"\n        :islevel=\"islevel\"\n        :admin-passcode=\"adminPasscode\"\n        :event-type=\"eventType\"\n        :local-link=\"localLink\"\n      />\n\n      <component\n        :is=\"PollModalComponent\"\n        :is-poll-modal-visible=\"isPollModalVisible\"\n        :on-close=\"() => updateIsPollModalVisible(false)\"\n        :member=\"member\"\n        :islevel=\"islevel\"\n        :polls=\"polls\"\n        :poll=\"poll\"\n        :socket=\"castedSocket\"\n        :room-name=\"roomName\"\n        :show-alert=\"showAlert\"\n        :update-is-poll-modal-visible=\"updateIsPollModalVisible\"\n        :handle-create-poll=\"handleCreatePoll\"\n        :handle-end-poll=\"handleEndPoll\"\n        :handle-vote-poll=\"handleVotePoll\"\n      />\n\n      <component\n        :is=\"BackgroundModalComponent\"\n        background-color=\"rgba(217, 227, 234, 0.99)\"\n        :is-visible=\"isBackgroundModalVisible\"\n        :on-close=\"() => updateIsBackgroundModalVisible(false)\"\n        :parameters=\"allParameters\"\n      />\n\n      <component\n        :is=\"BreakoutRoomsModalComponent\"\n        background-color=\"rgba(217, 227, 234, 0.99)\"\n        :is-visible=\"isBreakoutRoomsModalVisible\"\n        :on-breakout-rooms-close=\"() => updateIsBreakoutRoomsModalVisible(false)\"\n        :parameters=\"allParameters\"\n      />\n\n      <component\n        :is=\"ConfigureWhiteboardModalComponent\"\n        background-color=\"rgba(217, 227, 234, 0.99)\"\n        :is-visible=\"isConfigureWhiteboardModalVisible\"\n        :on-configure-whiteboard-close=\"() => updateIsConfigureWhiteboardModalVisible(false)\"\n        :parameters=\"allParameters\"\n      />\n\n      <!-- @vue-ignore -->\n      <component\n        :is=\"ScreenboardModalComponent\"\n        background-color=\"rgba(217, 227, 234, 0.99)\"\n        :is-visible=\"isScreenboardModalVisible\"\n        :on-close=\"() => updateIsScreenboardModalVisible(false)\"\n        :parameters=\"allParameters\"\n      />\n\n      <component\n        :is=\"AlertComponentOverride\"\n        :visible=\"alertVisible\"\n        :message=\"alertMessage\"\n        :type=\"alertType\"\n        :duration=\"alertDuration\"\n        :on-hide=\"() => (alertVisible = false)\"\n        text-color=\"#ffffff\"\n      />\n\n      <component\n        :is=\"LoadingModalComponent\"\n        :is-visible=\"isLoadingModalVisible\"\n        background-color=\"rgba(217, 227, 234, 0.99)\"\n        display-color=\"black\"\n      />\n    </template>\n  </div>\n</template>\n\n<script setup lang=\"ts\">\nimport { ref, computed, watch, onMounted, onBeforeUnmount, h, markRaw, type Component, type ComputedRef } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport {\n  faMicrophoneSlash,\n  faVideoSlash,\n  faDesktop,\n  faPhone,\n  faUsers,\n  faBars,\n  faComments,\n  faShareAlt,\n  faSync,\n  faChartBar,\n  faRecordVinyl,\n  faCog,\n  faClock,\n  faUserPlus,\n  faTools,\n  faPlayCircle,\n  faPauseCircle,\n  faStopCircle,\n  faDotCircle,\n  faVideo,\n  faMicrophone,\n  faPoll,\n  faUserFriends,\n  faChalkboardTeacher,\n  faBan,\n  } from '@fortawesome/free-solid-svg-icons';\n\n// Initial values\nimport { initialValuesState } from '@legacy/methods/utils/initialValuesState';\n\n// Import components\nimport MainAspectComponent from '../displayComponents/MainAspectComponent.vue';\nimport LoadingModal from '../displayComponents/LoadingModal.vue';\nimport ControlButtonsComponent from '../displayComponents/ControlButtonsComponent.vue';\nimport ControlButtonsAltComponent from '../displayComponents/ControlButtonsAltComponent.vue';\nimport ControlButtonsComponentTouch from '../displayComponents/ControlButtonsComponentTouch.vue';\nimport OthergridComponent from '../displayComponents/OtherGridComponent.vue';\nimport MainScreenComponent from '../displayComponents/MainScreenComponent.vue';\nimport MainGridComponent from '../displayComponents/MainGridComponent.vue';\nimport SubAspectComponent from '../displayComponents/SubAspectComponent.vue';\nimport MainContainerComponent from '../displayComponents/MainContainerComponent.vue';\nimport AlertComponent from '../displayComponents/AlertComponent.vue';\nimport MenuModal from '../menuComponents/MenuModal.vue';\nimport RecordingModal from '../recordingComponents/RecordingModal.vue';\nimport RequestsModal from '../requestsComponents/RequestsModal.vue';\nimport WaitingRoomModal from '../waitingComponents/WaitingModal.vue';\nimport DisplaySettingsModal from '../displaySettingsComponents/DisplaySettingsModal.vue';\nimport EventSettingsModal from '../eventSettingsComponents/EventSettingsModal.vue';\nimport CoHostModal from '../coHostComponents/CoHostModal.vue';\nimport ParticipantsModal from '../participantsComponents/ParticipantsModal.vue';\nimport MessagesModal from '../messageComponents/MessagesModal.vue';\nimport MediaSettingsModal from '../mediaSettingsComponents/MediaSettingsModal.vue';\nimport ConfirmExitModal from '../exitComponents/ConfirmExitModal.vue';\nimport ConfirmHereModal from '../miscComponents/ConfirmHereModal.vue';\nimport ShareEventModal from '../miscComponents/ShareEventModal.vue';\nimport WelcomePage from '../miscComponents/WelcomePage.vue';\nimport PreJoinPage from '../miscComponents/PreJoinPage.vue';\nimport PollModal from '../pollsComponents/PollModal.vue';\nimport BackgroundModal from '../backgroundComponents/BackgroundModal.vue';\nimport BreakoutRoomsModal from '../breakoutComponents/BreakoutRoomsModal.vue';\nimport ConfigureWhiteboardModal from '../whiteboardComponents/ConfigureWhiteboardModal.vue';\nimport Whiteboard from '../whiteboardComponents/Whiteboard.vue';\nimport Screenboard from '../screenboardComponents/Screenboard.vue';\nimport ScreenboardModal from '../screenboardComponents/ScreenboardModal.vue';\nimport Pagination from '../displayComponents/Pagination.vue';\nimport FlexibleGrid from '../displayComponents/FlexibleGrid.vue';\nimport FlexibleVideo from '../displayComponents/FlexibleVideo.vue';\nimport AudioGrid from '../displayComponents/AudioGrid.vue';\nimport VideoCard from '../displayComponents/VideoCard.vue';\nimport AudioCard from '../displayComponents/AudioCard.vue';\nimport MiniCard from '../displayComponents/MiniCard.vue';\nimport MiniCardAudio from '../displayComponents/MiniCardAudio.vue';\nimport MiniAudio from '../displayComponents/MiniAudio.vue';\nimport MiniAudioPlayer from '../../methods/utils/MiniAudioPlayer/MiniAudioPlayer.vue';\nimport { useUIOverrides } from '../../composables/useUIOverrides';\nimport type { MediasfuUICustomOverrides } from '../../types/ui-overrides';\n// Import methods (from shared folder)\nimport { launchMenuModal } from 'mediasfu-shared';\nimport { launchRecording } from 'mediasfu-shared';\nimport { startRecording } from 'mediasfu-shared';\nimport { confirmRecording } from 'mediasfu-shared';\nimport { launchWaiting } from 'mediasfu-shared';\nimport { launchCoHost } from 'mediasfu-shared';\nimport { launchMediaSettings } from 'mediasfu-shared';\nimport { launchDisplaySettings } from 'mediasfu-shared';\nimport { launchSettings } from 'mediasfu-shared';\nimport { launchRequests } from 'mediasfu-shared';\nimport { launchParticipants } from 'mediasfu-shared';\nimport { muteParticipants, messageParticipants, removeParticipants } from 'mediasfu-shared';\nimport { launchMessages } from 'mediasfu-shared';\nimport { launchConfirmExit } from 'mediasfu-shared';\nimport { launchPoll } from 'mediasfu-shared';\nimport { launchBreakoutRooms } from 'mediasfu-shared';\nimport { launchConfigureWhiteboard } from 'mediasfu-shared';\n\n// Import the platform-specific WebRTC module\nimport { mediaDevices } from '@legacy/methods/utils/webrtc/webrtc';\n\n// mediasfu functions\nimport { connectSocket, connectLocalSocket } from '@legacy/sockets/SocketManager';\nimport { joinRoomClient } from '@legacy/ProducerClient/producerClientEmits/joinRoomClient';\nimport { joinLocalRoom } from '@legacy/producers/producerEmits/joinLocalRoom';\nimport { updateRoomParametersClient } from '@legacy/ProducerClient/producerClientEmits/updateRoomParametersClient';\nimport { createDeviceClient } from '@legacy/ProducerClient/producerClientEmits/createDeviceClient';\n// Stream methods - use shared where available\nimport { switchVideoAlt } from 'mediasfu-shared';\n// These stay in src (not in shared)\nimport { clickVideo } from '@legacy/methods/streamMethods/clickVideo';\nimport { clickAudio } from '@legacy/methods/streamMethods/clickAudio';\nimport { clickScreenShare } from '@legacy/methods/streamMethods/clickScreenShare';\n\n// Consumer functions - use shared where available\nimport { streamSuccessVideo } from 'mediasfu-shared';\nimport { streamSuccessAudio } from 'mediasfu-shared';\nimport { streamSuccessScreen } from 'mediasfu-shared';\nimport { streamSuccessAudioSwitch } from 'mediasfu-shared';\nimport { checkPermission } from 'mediasfu-shared';\n\n// More mediasfu functions (from shared)\nimport { updateMiniCardsGrid } from 'mediasfu-shared';\nimport { mixStreams } from 'mediasfu-shared';\nimport { dispStreams } from 'mediasfu-shared';\nimport { stopShareScreen } from 'mediasfu-shared';\nimport { checkScreenShare } from 'mediasfu-shared';\nimport { startShareScreen } from 'mediasfu-shared';\nimport { requestScreenShare } from 'mediasfu-shared';\nimport { reorderStreams } from 'mediasfu-shared';\nimport { getVideos } from 'mediasfu-shared';\nimport { rePort } from 'mediasfu-shared';\nimport { trigger } from 'mediasfu-shared';\nimport { connectSendTransportAudio } from 'mediasfu-shared';\nimport { connectSendTransportVideo } from 'mediasfu-shared';\nimport { connectSendTransportScreen } from 'mediasfu-shared';\nimport { processConsumerTransports } from 'mediasfu-shared';\nimport { resumePauseStreams } from 'mediasfu-shared';\nimport { readjust } from 'mediasfu-shared';\nimport { checkGrid } from 'mediasfu-shared';\nimport { getEstimate } from 'mediasfu-shared';\nimport { calculateRowsAndColumns } from 'mediasfu-shared';\nimport { onScreenChanges } from 'mediasfu-shared';\n\n// Vue-native consumer implementations\nimport { prepopulateUserMedia } from '../../consumers/prepopulateUserMedia';\nimport { addVideosGrid } from '../../consumers/addVideosGrid';\n// Still use React versions for these (will migrate later)\nimport { consumerResume } from '../../consumers/consumerResume';\nimport { sleep } from '@legacy/methods/utils/sleep';\n// More consumers from shared\nimport { changeVids } from 'mediasfu-shared';\nimport { compareActiveNames } from 'mediasfu-shared';\nimport { compareScreenStates } from 'mediasfu-shared';\nimport { createSendTransport } from 'mediasfu-shared';\nimport { resumeSendTransportAudio } from 'mediasfu-shared';\nimport { receiveAllPipedTransports } from 'mediasfu-shared';\nimport { disconnectSendTransportVideo } from 'mediasfu-shared';\nimport { disconnectSendTransportAudio } from 'mediasfu-shared';\nimport { disconnectSendTransportScreen } from 'mediasfu-shared';\nimport { connectSendTransport } from 'mediasfu-shared';\nimport { getPipedProducersAlt } from 'mediasfu-shared';\nimport { signalNewConsumerTransport } from 'mediasfu-shared';\nimport { connectRecvTransport } from 'mediasfu-shared';\nimport { reUpdateInter } from 'mediasfu-shared';\nimport { updateParticipantAudioDecibels } from 'mediasfu-shared';\nimport { closeAndResize } from 'mediasfu-shared';\nimport { autoAdjust } from 'mediasfu-shared';\nimport { switchUserVideoAlt } from 'mediasfu-shared';\nimport { switchUserVideo } from 'mediasfu-shared';\nimport { switchUserAudio } from 'mediasfu-shared';\nimport { receiveRoomMessages } from 'mediasfu-shared';\nimport { formatNumber } from '@legacy/methods/utils/formatNumber';\nimport { connectIps } from 'mediasfu-shared';\nimport { connectLocalIps } from 'mediasfu-shared';\nimport { pollUpdated } from '@legacy/methods/pollsMethods/pollUpdated';\nimport { handleCreatePoll } from 'mediasfu-shared';\nimport { handleVotePoll } from 'mediasfu-shared';\nimport { handleEndPoll } from 'mediasfu-shared';\nimport { breakoutRoomUpdated } from 'mediasfu-shared';\nimport { startMeetingProgressTimer } from '@legacy/methods/utils/meetingTimer/startMeetingProgressTimer';\nimport { updateRecording } from 'mediasfu-shared';\nimport { stopRecording } from 'mediasfu-shared';\n\n// Socket receive methods\nimport { userWaiting } from '@legacy/producers/socketReceiveMethods/userWaiting';\nimport { personJoined } from '@legacy/producers/socketReceiveMethods/personJoined';\nimport { allWaitingRoomMembers } from '@legacy/producers/socketReceiveMethods/allWaitingRoomMembers';\nimport { roomRecordParams } from '@legacy/producers/socketReceiveMethods/roomRecordParams';\nimport { banParticipant } from '@legacy/producers/socketReceiveMethods/banParticipant';\nimport { updatedCoHost } from '@legacy/producers/socketReceiveMethods/updatedCoHost';\nimport { participantRequested } from '@legacy/producers/socketReceiveMethods/participantRequested';\nimport { screenProducerId } from '@legacy/producers/socketReceiveMethods/screenProducerId';\nimport { updateMediaSettings } from '@legacy/producers/socketReceiveMethods/updateMediaSettings';\nimport { producerMediaPaused } from '@legacy/producers/socketReceiveMethods/producerMediaPaused';\nimport { producerMediaResumed } from '@legacy/producers/socketReceiveMethods/producerMediaResumed';\nimport { producerMediaClosed } from '@legacy/producers/socketReceiveMethods/producerMediaClosed';\nimport { controlMediaHost } from '@legacy/producers/socketReceiveMethods/controlMediaHost';\nimport { meetingEnded } from '@legacy/producers/socketReceiveMethods/meetingEnded';\nimport { disconnectUserSelf } from '@legacy/producers/socketReceiveMethods/disconnectUserSelf';\nimport { receiveMessage } from '@legacy/producers/socketReceiveMethods/receiveMessage';\nimport { meetingTimeRemaining } from '@legacy/producers/socketReceiveMethods/meetingTimeRemaining';\nimport { meetingStillThere } from '@legacy/producers/socketReceiveMethods/meetingStillThere';\nimport { startRecords } from '@legacy/producers/socketReceiveMethods/startRecords';\nimport { reInitiateRecording } from '@legacy/producers/socketReceiveMethods/reInitiateRecording';\nimport { getDomains } from '@legacy/producers/socketReceiveMethods/getDomains';\nimport { updateConsumingDomains } from '@legacy/producers/socketReceiveMethods/updateConsumingDomains';\nimport { recordingNotice } from '@legacy/producers/socketReceiveMethods/recordingNotice';\nimport { timeLeftRecording } from '@legacy/producers/socketReceiveMethods/timeLeftRecording';\nimport { stoppedRecording } from '@legacy/producers/socketReceiveMethods/stoppedRecording';\nimport { hostRequestResponse } from '@legacy/producers/socketReceiveMethods/hostRequestResponse';\nimport { allMembers } from '@legacy/producers/socketReceiveMethods/allMembers';\nimport { allMembersRest } from '@legacy/producers/socketReceiveMethods/allMembersRest';\nimport { disconnect } from '@legacy/producers/socketReceiveMethods/disconnect';\nimport { captureCanvasStream } from '@legacy/methods/whiteboardMethods/captureCanvasStream';\nimport { resumePauseAudioStreams } from 'mediasfu-shared';\nimport { processConsumerTransportsAudio } from 'mediasfu-shared';\n\n// Types\nimport type { MediaSFUSocket } from '../../types/socket';\nimport type {\n  AParamsType,\n  AudioDecibels,\n  BreakoutParticipant,\n  CoHostResponsibility,\n  ComponentSizes,\n  GridSizes,\n  HParamsType,\n  MeetingRoomParams,\n  Message,\n  Participant,\n  Poll,\n  ResponseJoinRoom,\n  ResponseJoinLocalRoom,\n  ScreenParamsType,\n  ScreenState,\n  Stream,\n  UserRecordingParams,\n  VParamsType,\n  VidCons,\n  WaitingRoomParticipant,\n  WhiteboardUser,\n  Shapes as SharedShape,\n  ShapePayload,\n  Request,\n  Transport as TransportType,\n  RecordParams,\n  EventType,\n  ConsumeSocket,\n  AllMembersData,\n  AllMembersRestData,\n  AllWaitingRoomMembersData,\n  UpdatedCoHostData,\n  Settings,\n  UpdateConsumingDomainsData,\n  HostRequestResponseData,\n  PollUpdatedData,\n  BreakoutRoomUpdatedData,\n  SeedData,\n  CreateMediaSFURoomOptions,\n  JoinMediaSFURoomOptions,\n  JoinRoomOnMediaSFUType,\n  CreateRoomOnMediaSFUType,\n} from 'mediasfu-shared';\nimport type { Button as ControlButton } from '../displayComponents/ControlButtonsComponent.vue';\nimport type { ButtonTouch as ControlButtonTouch } from '../displayComponents/ControlButtonsComponentTouch.vue';\nimport type { CustomButton as MenuCustomButton } from '../../types/menu';\nimport type { RenderableComponent } from '../../types/renderable-component';\nimport type { Device, types as MediasoupTypes } from 'mediasoup-client';\nimport type { SelfieSegmentation } from '@mediapipe/selfie_segmentation';\nimport type {\n  CustomAudioCardType,\n  CustomMiniCardType,\n  CustomPreJoinPageType,\n  CustomVideoCardType,\n  CustomComponentType,\n} from '@legacy/@types/types';\nimport type {\n  Shape as WhiteboardShape,\n  WhiteboardParameters as WhiteboardComponentParameters,\n} from '../whiteboardComponents/Whiteboard.vue';\n\n// Mediasoup types\ntype Producer = MediasoupTypes.Producer;\ntype ProducerOptions = MediasoupTypes.ProducerOptions;\ntype RtpCapabilities = MediasoupTypes.RtpCapabilities;\ntype Transport = MediasoupTypes.Transport;\nimport { createResponseJoinRoom } from '@legacy/methods/utils/createResponseJoinRoom';\n\n// Component props interface\n/**\n * Props/Options for the MediasfuGeneric component\n * @interface MediasfuGenericOptions\n * \n * @description\n * Comprehensive configuration options for the MediaSFU platform. Supports both\n * MediaSFU cloud service and local/self-hosted deployments. Provides multiple\n * customization levels from simple prop-based overrides to complete UI replacement.\n */\nexport interface MediasfuGenericOptions {\n  /**\n   * Custom PreJoinPage component (legacy prop, prefer uiOverrides.preJoinPage)\n   * @deprecated Use uiOverrides.preJoinPage instead\n   */\n  // eslint-disable-next-line vue/prop-name-casing\n  PrejoinPage?: Component;\n  \n  /**\n   * Local server URL for self-hosted MediaSFU deployments\n   * @default \"\"\n   * @example \"http://localhost:3000\"\n   * @example \"https://your-mediasfu-server.com\"\n   */\n  localLink?: string;\n  \n  /**\n   * Whether to connect to MediaSFU cloud service\n   * Set to false for local-only deployments\n   * @default true\n   */\n  connectMediaSFU?: boolean;\n  \n  /**\n   * API credentials for MediaSFU cloud service\n   * Required when connectMediaSFU is true\n   * @default { apiUserName: '', apiKey: '' }\n   * @example { apiUserName: 'user123', apiKey: 'sk_1234567890abcdef' }\n   */\n  credentials?: { apiUserName: string; apiKey: string };\n  \n  /**\n   * Enable local UI mode for development/testing\n   * Bypasses some cloud-specific checks\n   * @default false\n   */\n  useLocalUIMode?: boolean;\n  \n  /**\n   * Seed data for testing/demo purposes\n   * Pre-populates room with participants, messages, etc.\n   * @default {}\n   * @example\n   * ```ts\n   * {\n   *   member: 'Host',\n   *   host: 'Host',\n   *   eventType: 'conference',\n   *   participants: [\n   *     { name: 'Alice', muted: false, videoOn: true },\n   *     { name: 'Bob', muted: true, videoOn: false }\n   *   ],\n   *   messages: [\n   *     { sender: 'Alice', message: 'Hello!', timestamp: Date.now() }\n   *   ]\n   * }\n   * ```\n   */\n  seedData?: SeedData;\n  \n  /**\n   * Whether to use the provided seedData\n   * When true, bypasses normal room join flow\n   * @default false\n   */\n  useSeed?: boolean;\n  \n  /**\n   * Custom logo image URL for branding\n   * Displayed on PreJoinPage and WelcomePage\n   * @default \"https://mediasfu.com/images/logo192.png\"\n   * @example \"https://your-domain.com/logo.png\"\n   */\n  imgSrc?: string;\n  \n  /**\n   * External parameters object for advanced integration\n   * Allows parent components to inject custom state\n   * @example { customFeatureFlag: true, themeMode: 'dark' }\n   */\n  sourceParameters?: Record<string, unknown>;\n  \n  /**\n   * Callback to update sourceParameters from within MediaSFU\n   * Enables two-way binding with parent component\n   * @param data - Updated parameter object\n   * @example\n   * ```ts\n   * (data) => {\n   *   console.log('Parameters updated:', data);\n   *   myExternalState.value = { ...myExternalState.value, ...data };\n   * }\n   * ```\n   */\n  updateSourceParameters?: (data: Record<string, unknown>) => void;\n  \n  /**\n   * Whether to render the built-in UI\n   * When false, component only manages state/logic (headless mode)\n   * @default true\n   */\n  returnUI?: boolean;\n  \n  /**\n   * Configuration for programmatic (no-UI) join/create mode\n   * Used when returnUI is false for automated testing/bots\n   * @example { action: 'join', userName: 'Bot', meetingID: 'room123' }\n   * @example { action: 'create', userName: 'Host', duration: 60, eventType: 'webinar', capacity: 100 }\n   */\n  noUIPreJoinOptions?: CreateMediaSFURoomOptions | JoinMediaSFURoomOptions;\n  \n  /**\n   * Custom function for joining a MediaSFU room\n   * Override default join logic with custom implementation\n   * @default joinRoomOnMediaSFU\n   */\n  joinMediaSFURoom?: JoinRoomOnMediaSFUType;\n  \n  /**\n   * Custom function for creating a MediaSFU room\n   * Override default create logic with custom implementation\n   * @default createRoomOnMediaSFU\n   */\n  createMediaSFURoom?: CreateRoomOnMediaSFUType;\n  \n  /**\n   * Custom VideoCard component (legacy prop, prefer uiOverrides.videoCard)\n   * @deprecated Use uiOverrides.videoCard instead\n   * @example CustomVideoCard\n   */\n  customVideoCard?: Component;\n  \n  /**\n   * Custom AudioCard component (legacy prop, prefer uiOverrides.audioCard)\n   * @deprecated Use uiOverrides.audioCard instead\n   * @example CustomAudioCard\n   */\n  customAudioCard?: Component;\n  \n  /**\n   * Custom MiniCard component (legacy prop, prefer uiOverrides.miniCard)\n   * @deprecated Use uiOverrides.miniCard instead\n   * @example CustomMiniCard\n   */\n  customMiniCard?: Component;\n  \n  /**\n   * Custom PreJoinPage component (legacy prop, prefer uiOverrides.preJoinPage)\n   * @deprecated Use uiOverrides.preJoinPage instead\n   * @example CustomPreJoinPage\n   */\n  customPreJoinPage?: Component;\n  \n  /**\n   * Custom component to completely replace the entire MediaSFU UI\n   * Receives allParameters prop with all state and methods\n   * @example MyCompleteCustomUI\n   */\n  customComponent?: Component;\n  \n  /**\n   * Custom CSS styles for the root MediaSFU container\n   * @default {}\n   * @example { backgroundColor: '#1a1a1a', maxWidth: '1920px', margin: '0 auto' }\n   */\n  containerStyle?: Record<string, unknown>;\n  \n  /**\n   * Default event type for the session\n   * Determines which UI controls and layouts are shown\n   * @default \"webinar\"\n   * @example \"conference\" | \"webinar\" | \"broadcast\" | \"chat\" | \"generic\"\n   */\n  defaultEventType?: EventType;\n  \n  /**\n   * Comprehensive UI override system\n   * Replace or wrap any MediaSFU component or function\n   * This is the recommended approach for customization\n   * \n   * @example\n   * ```ts\n   * {\n   *   videoCard: { component: CustomVideoCard },\n   *   audioCard: { component: CustomAudioCard },\n   *   participantsModal: { component: CustomParticipantsModal },\n   *   consumerResume: {\n   *     wrap: (defaultFn) => async (options) => {\n   *       await trackAnalytics('consumer_resume');\n   *       return await defaultFn(options);\n   *     }\n   *   }\n   * }\n   * ```\n   * \n   * @see {@link MediasfuUICustomOverrides} for all available overrides\n   */\n  uiOverrides?: MediasfuUICustomOverrides;\n}\n\n// Props with defaults\nconst props = withDefaults(defineProps<MediasfuGenericOptions>(), {\n  PrejoinPage: undefined,\n  localLink: '',\n  connectMediaSFU: true,\n  credentials: () => ({ apiUserName: '', apiKey: '' }),\n  useLocalUIMode: false,\n  seedData: () => ({}),\n  useSeed: false,\n  imgSrc: 'https://mediasfu.com/images/logo192.png',\n  sourceParameters: undefined,\n  updateSourceParameters: undefined,\n  returnUI: true,\n  noUIPreJoinOptions: undefined,\n  joinMediaSFURoom: undefined,\n  createMediaSFURoom: undefined,\n  customVideoCard: undefined,\n  customAudioCard: undefined,\n  customMiniCard: undefined,\n  customPreJoinPage: undefined,\n  customComponent: undefined,\n  containerStyle: () => ({}),\n  defaultEventType: 'webinar',\n  uiOverrides: undefined,\n});\n\nconst reportedUnsupportedCustomKeys = new Set<string>();\n\nconst warnUnsupportedCustom = (key: string) => {\n  if (!reportedUnsupportedCustomKeys.has(key)) {\n    console.warn(\n      `[MediasfuGeneric] Ignoring custom ${key} because non-function components are not yet supported in Vue mode.`\n    );\n    reportedUnsupportedCustomKeys.add(key);\n  }\n};\n\nconst toCustomRenderer = <TRenderer>(value: unknown, key: string): TRenderer | undefined => {\n  if (!value) {\n    return undefined;\n  }\n  const isCallable = typeof value === 'function';\n  const isComponentObject =\n    typeof value === 'object' && value !== null &&\n    (typeof (value as Record<string, unknown>).setup === 'function' ||\n      typeof (value as Record<string, unknown>).render === 'function');\n\n  if (isCallable || isComponentObject) {\n    return value as TRenderer;\n  }\n\n  warnUnsupportedCustom(key);\n  return undefined;\n};\n\nconst customVideoCardRenderer = computed<CustomVideoCardType | undefined>(() =>\n  toCustomRenderer<CustomVideoCardType>(props.customVideoCard, 'video card')\n);\n\nconst customAudioCardRenderer = computed<CustomAudioCardType | undefined>(() =>\n  toCustomRenderer<CustomAudioCardType>(props.customAudioCard, 'audio card')\n);\n\nconst customMiniCardRenderer = computed<CustomMiniCardType | undefined>(() =>\n  toCustomRenderer<CustomMiniCardType>(props.customMiniCard, 'mini card')\n);\n\nconst customPreJoinPageRenderer = computed<CustomPreJoinPageType | undefined>(() =>\n  toCustomRenderer<CustomPreJoinPageType>(props.customPreJoinPage, 'pre-join page')\n);\n\nconst customComponentRenderer = computed<CustomComponentType | undefined>(() =>\n  toCustomRenderer<CustomComponentType>(props.customComponent, 'component')\n);\n\nconst uiOverridesApi = computed(() => useUIOverrides(props.uiOverrides));\n\nconst resolveComponent = (\n  key: keyof MediasfuUICustomOverrides,\n  component: Component\n): ComputedRef<Component> =>\n  computed(() => uiOverridesApi.value.getOverriddenComponent(key, component));\n\nconst resolveFunction = <Fn extends (...args: never[]) => unknown>(\n  key: keyof MediasfuUICustomOverrides,\n  fn: Fn\n): ComputedRef<Fn> =>\n  computed(() => uiOverridesApi.value.getOverriddenFunction(key, fn) as Fn);\n\nconst MainContainer = resolveComponent('mainContainer', MainContainerComponent);\nconst MainAspect = resolveComponent('mainAspect', MainAspectComponent);\nconst MainScreen = resolveComponent('mainScreen', MainScreenComponent);\nconst MainGrid = resolveComponent('mainGrid', MainGridComponent);\nconst SubAspect = resolveComponent('subAspect', SubAspectComponent);\nconst OtherGrid = resolveComponent('otherGrid', OthergridComponent);\nconst FlexibleGridPrimary = resolveComponent('flexibleGrid', FlexibleGrid);\nconst FlexibleGridAlt = resolveComponent('flexibleGridAlt', FlexibleGrid);\nconst FlexibleVideoComponent = resolveComponent('flexibleVideo', FlexibleVideo);\nconst AudioGridComponent = resolveComponent('audioGrid', AudioGrid);\nconst PaginationComponent = resolveComponent('pagination', Pagination);\nconst ControlButtons = resolveComponent('controlButtons', ControlButtonsComponent);\nconst ControlButtonsAlt = resolveComponent('controlButtonsAlt', ControlButtonsAltComponent);\nconst ControlButtonsTouch = resolveComponent('controlButtonsTouch', ControlButtonsComponentTouch);\nconst WhiteboardComponent = resolveComponent('whiteboard', Whiteboard);\nconst ScreenboardComponent = resolveComponent('screenboard', Screenboard);\nconst ScreenboardModalComponent = resolveComponent('screenboardModal', ScreenboardModal);\nconst VideoCardComponentOverride = resolveComponent('videoCard', VideoCard);\nconst AudioCardComponentOverride = resolveComponent('audioCard', AudioCard);\nconst MiniCardComponentOverride = resolveComponent('miniCard', MiniCard);\nconst MiniAudioComponentOverride = resolveComponent('miniAudio', MiniAudio);\nconst MiniAudioPlayerComponent = resolveComponent('miniAudioPlayer', MiniAudioPlayer);\nconst LoadingModalComponent = resolveComponent('loadingModal', LoadingModal);\nconst AlertComponentOverride = resolveComponent('alert', AlertComponent);\nconst MenuModalComponent = resolveComponent('menuModal', MenuModal);\nconst EventSettingsModalComponent = resolveComponent('eventSettingsModal', EventSettingsModal);\nconst RequestsModalComponent = resolveComponent('requestsModal', RequestsModal);\nconst WaitingRoomModalComponent = resolveComponent('waitingRoomModal', WaitingRoomModal);\nconst CoHostModalComponent = resolveComponent('coHostModal', CoHostModal);\nconst MediaSettingsModalComponent = resolveComponent('mediaSettingsModal', MediaSettingsModal);\nconst ParticipantsModalComponent = resolveComponent('participantsModal', ParticipantsModal);\nconst MessagesModalComponent = resolveComponent('messagesModal', MessagesModal);\nconst DisplaySettingsModalComponent = resolveComponent('displaySettingsModal', DisplaySettingsModal);\nconst ConfirmExitModalComponent = resolveComponent('confirmExitModal', ConfirmExitModal);\nconst ConfirmHereModalComponent = resolveComponent('confirmHereModal', ConfirmHereModal);\nconst ShareEventModalComponent = resolveComponent('shareEventModal', ShareEventModal);\nconst RecordingModalComponent = resolveComponent('recordingModal', RecordingModal);\nconst PollModalComponent = resolveComponent('pollModal', PollModal);\nconst BackgroundModalComponent = resolveComponent('backgroundModal', BackgroundModal);\nconst BreakoutRoomsModalComponent = resolveComponent('breakoutRoomsModal', BreakoutRoomsModal);\nconst ConfigureWhiteboardModalComponent = resolveComponent('configureWhiteboardModal', ConfigureWhiteboardModal);\nconst WelcomePageComponent = resolveComponent('welcomePage', WelcomePage);\nconst CustomMenuButtonsRenderer = resolveComponent('customMenuButtonsRenderer', ControlButtonsAltComponent);\nconst PreJoinPageComponent = resolveComponent('preJoinPage', PreJoinPage);\n\nconst menuButtonsRendererComponent = computed(\n  () => CustomMenuButtonsRenderer.value || ControlButtonsAlt.value\n);\n\nconst consumerResumeOverride = resolveFunction('consumerResume', consumerResume);\nconst addVideosGridOverride = resolveFunction('addVideosGrid', addVideosGrid);\n\n// Validated state\nconst validated = ref<boolean>(props.useLocalUIMode);\n\n// Socket references\nconst socket = ref<MediaSFUSocket>({} as MediaSFUSocket);\nconst localSocket = ref<MediaSFUSocket | null>(null);\nconst roomData = ref<ResponseJoinRoom | null>(null);\nconst device = ref<Device | null>(null);\n\n// Computed properties for casting socket in templates\nconst castedSocket = computed(() => socket.value as unknown as MediaSFUSocket);\n\n// API credentials\nconst apiUserName = ref<string>('');\nconst apiToken = ref<string>('');\nconst link = ref<string>('');\n\n// Room details\nconst roomName = ref<string>('');\nconst member = ref<string>(props.useSeed && props.seedData?.member ? props.seedData?.member : '');\nconst adminPasscode = ref<string>('');\nconst islevel = ref<string>(\n  props.useSeed && props.seedData?.member\n    ? props.seedData.member === props.seedData?.host\n      ? '2'\n      : '1'\n    : '1'\n);\nconst coHost = ref<string>('');\nconst coHostResponsibility = ref<CoHostResponsibility[]>([\n  { name: 'participants', value: false, dedicated: false },\n  { name: 'media', value: false, dedicated: false },\n  { name: 'waiting', value: false, dedicated: false },\n  { name: 'chat', value: false, dedicated: false },\n]);\nconst youAreCoHost = ref<boolean>(coHost.value ? coHost.value === member.value : false);\nconst youAreHost = ref<boolean>(islevel.value === '2');\nconst confirmedToRecord = ref<boolean>(false);\nconst meetingDisplayType = ref<string>('media');\nconst meetingVideoOptimized = ref<boolean>(false);\nconst eventType = ref<EventType>(\n  props.useSeed && props.seedData?.eventType\n    ? props.seedData?.eventType\n    : props.defaultEventType ?? 'webinar'\n);\nconst participants = ref<Participant[]>(\n  props.useSeed && props.seedData?.participants ? props.seedData?.participants : []\n);\nconst filteredParticipants = ref<Participant[]>(participants.value);\nconst participantsCounter = ref<number>(0);\nconst participantsFilter = ref<string>('');\n\n// Media and room details\nconst consume_sockets = ref<ConsumeSocket[]>([]);\nconst rtpCapabilities = ref<RtpCapabilities | null>(null);\nconst roomRecvIPs = ref<string[]>([]);\nconst meetingRoomParams = ref<MeetingRoomParams | null>(null);\nconst itemPageLimit = ref<number>(4);\nconst audioOnlyRoom = ref<boolean>(false);\nconst addForBasic = ref<boolean>(false);\nconst screenPageLimit = ref<number>(4);\nconst shareScreenStarted = ref<boolean>(false);\nconst shared = ref<boolean>(false);\nconst targetOrientation = ref<string>('landscape');\nconst targetResolution = ref<string>('sd');\nconst targetResolutionHost = ref<string>('sd');\nconst vidCons = ref<VidCons>({ width: 640, height: 360 });\nconst frameRate = ref<number>(10);\nconst hParams = ref<HParamsType>({} as HParamsType);\nconst vParams = ref<VParamsType>({} as VParamsType);\nconst screenParams = ref<ScreenParamsType>({} as ScreenParamsType);\nconst aParams = ref<AParamsType>({} as AParamsType);\n\n// Recording details\nconst recordingAudioPausesLimit = ref<number>(0);\nconst recordingAudioPausesCount = ref<number>(0);\nconst recordingAudioSupport = ref<boolean>(false);\nconst recordingAudioPeopleLimit = ref<number>(0);\nconst recordingAudioParticipantsTimeLimit = ref<number>(0);\nconst recordingVideoPausesCount = ref<number>(0);\nconst recordingVideoPausesLimit = ref<number>(0);\nconst recordingVideoSupport = ref<boolean>(false);\nconst recordingVideoPeopleLimit = ref<number>(0);\nconst recordingVideoParticipantsTimeLimit = ref<number>(0);\nconst recordingAllParticipantsSupport = ref<boolean>(false);\nconst recordingVideoParticipantsSupport = ref<boolean>(false);\nconst recordingAllParticipantsFullRoomSupport = ref<boolean>(false);\nconst recordingVideoParticipantsFullRoomSupport = ref<boolean>(false);\nconst recordingPreferredOrientation = ref<string>('landscape');\nconst recordingSupportForOtherOrientation = ref<boolean>(false);\nconst recordingMultiFormatsSupport = ref<boolean>(false);\n\n// User recording parameters\nconst userRecordingParams = ref<UserRecordingParams>({\n  mainSpecs: {\n    mediaOptions: 'video',\n    audioOptions: 'all',\n    videoOptions: 'all',\n    videoType: 'fullDisplay',\n    videoOptimized: false,\n    recordingDisplayType: 'media',\n    addHLS: false,\n  },\n  dispSpecs: {\n    nameTags: true,\n    backgroundColor: '#000000',\n    nameTagsColor: '#ffffff',\n    orientationVideo: 'portrait',\n  },\n});\n\n// Recording state\nconst canRecord = ref<boolean>(false);\nconst startReport = ref<boolean>(false);\nconst endReport = ref<boolean>(false);\nconst recordTimerInterval = ref<ReturnType<typeof setInterval> | null>(null);\nconst recordStartTime = ref<number>(0);\nconst recordElapsedTime = ref<number>(0);\nconst isTimerRunning = ref<boolean>(false);\nconst canPauseResume = ref<boolean>(false);\nconst recordChangeSeconds = ref<number>(15000);\nconst pauseLimit = ref<number>(0);\nconst pauseRecordCount = ref<number>(0);\nconst canLaunchRecord = ref<boolean>(true);\nconst stopLaunchRecord = ref<boolean>(false);\n\n// Misc variables\nconst firstAll = ref<boolean>(false);\nconst updateMainWindow = ref<boolean>(false);\nconst first_round = ref<boolean>(false);\nconst landScaped = ref<boolean>(false);\nconst lock_screen = ref<boolean>(false);\nconst screenId = ref<string>('');\nconst allVideoStreams = ref<(Participant | Stream)[]>([]);\nconst newLimitedStreams = ref<(Participant | Stream)[]>([]);\nconst newLimitedStreamsIDs = ref<string[]>([]);\nconst activeSounds = ref<string[]>([]);\nconst screenShareIDStream = ref<string>('');\nconst screenShareNameStream = ref<string>('');\nconst adminIDStream = ref<string>('');\nconst adminNameStream = ref<string>('');\nconst youYouStream = ref<(Participant | Stream)[]>([]);\nconst youYouStreamIDs = ref<string[]>([]);\nconst localStream = ref<MediaStream | null>(null);\nconst recordStarted = ref<boolean>(false);\nconst recordResumed = ref<boolean>(false);\nconst recordPaused = ref<boolean>(false);\nconst recordStopped = ref<boolean>(false);\nconst adminRestrictSetting = ref<boolean>(false);\nconst videoRequestState = ref<string | null>(null);\nconst videoRequestTime = ref<number>(0);\nconst videoAction = ref<boolean>(false);\nconst localStreamVideo = ref<MediaStream | null>(null);\nconst userDefaultVideoInputDevice = ref<string>('');\nconst currentFacingMode = ref<string>('user');\nconst prevFacingMode = ref<string>('user');\nconst defVideoID = ref<string>('');\nconst allowed = ref<boolean>(false);\nconst dispActiveNames = ref<string[]>([]);\nconst p_dispActiveNames = ref<string[]>([]);\nconst activeNames = ref<string[]>([]);\nconst prevActiveNames = ref<string[]>([]);\nconst p_activeNames = ref<string[]>([]);\nconst membersReceived = ref<boolean>(false);\nconst deferScreenReceived = ref<boolean>(false);\nconst hostFirstSwitch = ref<boolean>(false);\nconst micAction = ref<boolean>(false);\nconst screenAction = ref<boolean>(false);\nconst chatAction = ref<boolean>(false);\nconst audioRequestState = ref<string | null>(null);\nconst screenRequestState = ref<string | null>(null);\nconst chatRequestState = ref<string | null>(null);\nconst audioRequestTime = ref<number>(0);\nconst screenRequestTime = ref<number>(0);\nconst chatRequestTime = ref<number>(0);\nconst updateRequestIntervalSeconds = ref<number>(240);\nconst oldSoundIds = ref<string[]>([]);\nconst hostLabel = ref<string>('Host');\nconst mainScreenFilled = ref<boolean>(false);\nconst localStreamScreen = ref<MediaStream | null>(null);\nconst screenAlreadyOn = ref<boolean>(false);\nconst chatAlreadyOn = ref<boolean>(false);\nconst redirectURL = ref<string>('');\nconst oldAllStreams = ref<(Participant | Stream)[]>([]);\nconst adminVidID = ref<string>('');\nconst streamNames = ref<Stream[]>([]);\nconst non_alVideoStreams = ref<Participant[]>([]);\nconst sortAudioLoudness = ref<boolean>(false);\nconst audioDecibels = ref<AudioDecibels[]>([]);\nconst mixed_alVideoStreams = ref<(Participant | Stream)[]>([]);\nconst non_alVideoStreams_muted = ref<Participant[]>([]);\nconst paginatedStreams = ref<(Participant | Stream)[][]>([]);\nconst localStreamAudio = ref<MediaStream | null>(null);\nconst defAudioID = ref<string>('');\nconst userDefaultAudioInputDevice = ref<string>('');\nconst userDefaultAudioOutputDevice = ref<string>('');\nconst prevAudioInputDevice = ref<string>('');\nconst prevVideoInputDevice = ref<string>('');\nconst audioPaused = ref<boolean>(false);\nconst mainScreenPerson = ref<string>('');\nconst adminOnMainScreen = ref<boolean>(false);\nconst screenStates = ref<ScreenState[]>([\n  {\n    mainScreenPerson: '',\n    mainScreenProducerId: '',\n    mainScreenFilled: false,\n    adminOnMainScreen: false,\n  },\n]);\nconst prevScreenStates = ref<ScreenState[]>([\n  {\n    mainScreenPerson: '',\n    mainScreenProducerId: '',\n    mainScreenFilled: false,\n    adminOnMainScreen: false,\n  },\n]);\nconst updateDateState = ref<number | null>(null);\nconst lastUpdate = ref<number | null>(null);\nconst nForReadjustRecord = ref<number>(0);\nconst fixedPageLimit = ref<number>(4);\nconst removeAltGrid = ref<boolean>(false);\nconst nForReadjust = ref<number>(0);\nconst reorderInterval = ref<number>(30000);\nconst fastReorderInterval = ref<number>(10000);\nconst lastReorderTime = ref<number>(0);\nconst audStreamNames = ref<Stream[]>([]);\nconst currentUserPage = ref<number>(0);\n\nconst mainHeightWidth = ref<number>(\n  eventType.value === 'webinar' ? 67 : eventType.value === 'broadcast' ? 100 : 0\n);\nconst prevMainHeightWidth = ref<number>(mainHeightWidth.value);\nconst prevDoPaginate = ref<boolean>(false);\nconst doPaginate = ref<boolean>(false);\nconst shareEnded = ref<boolean>(false);\nconst lStreams = ref<(Participant | Stream)[]>([]);\nconst chatRefStreams = ref<(Participant | Stream)[]>([]);\n\nconst controlHeight = ref<number>(0);\nconst isWideScreen = ref<boolean>(false);\nconst isMediumScreen = ref<boolean>(false);\nconst isSmallScreen = ref<boolean>(false);\nconst addGrid = ref<boolean>(false);\nconst addAltGrid = ref<boolean>(false);\n\nconst gridRows = ref<number>(0);\nconst gridCols = ref<number>(0);\nconst altGridRows = ref<number>(0);\nconst altGridCols = ref<number>(0);\nconst numberPages = ref<number>(0);\nconst currentStreams = ref<(Participant | Stream)[]>([]);\n\nconst showMiniView = ref<boolean>(false);\nconst nStream = ref<MediaStream | null>(null);\nconst defer_receive = ref<boolean>(false);\nconst allAudioStreams = ref<(Participant | Stream)[]>([]);\nconst remoteScreenStream = ref<Stream[]>([]);\n\nconst screenProducer = ref<Producer | null>(null);\nconst localScreenProducer = ref<Producer | null>(null);\nconst gotAllVids = ref<boolean>(false);\nconst paginationHeightWidth = ref<number>(40);\nconst paginationDirection = ref<'horizontal' | 'vertical'>('horizontal');\n\nconst gridSizes = ref<GridSizes>({\n  gridWidth: 0,\n  gridHeight: 0,\n  altGridWidth: 0,\n  altGridHeight: 0,\n});\n\nconst screenForceFullDisplay = ref<boolean>(false);\nconst mainGridStreamRaw = ref<Array<RenderableComponent | ReactElementLike | null | undefined>>([]);\nconst otherGridStreams = ref<RenderableComponent[][]>([[], []]);\nconst audioOnlyStreams = ref<RenderableComponent[]>([]);\n\nconst componentUpdateQueue: Array<() => Promise<void> | void> = [];\nlet isProcessingComponentUpdates = false;\n\nconst mediaContainerRef = ref<HTMLElement | null>(null);\n\nlet resizeObserver: ResizeObserver | null = null;\nlet resizeScheduled = false;\nlet resizeInProgress = false;\nlet resizeQueued = false;\n\nconst runResize = async (): Promise<void> => {\n  if (resizeInProgress) {\n    resizeQueued = true;\n    return;\n  }\n\n  resizeInProgress = true;\n  try {\n    await handleResize();\n  } catch (error) {\n    console.log('error handleResize', error);\n  } finally {\n    resizeInProgress = false;\n    if (resizeQueued) {\n      resizeQueued = false;\n      scheduleResize();\n    }\n  }\n};\n\nconst scheduleResize = () => {\n  if (resizeScheduled) {\n    return;\n  }\n  resizeScheduled = true;\n  requestAnimationFrame(() => {\n    resizeScheduled = false;\n    void runResize();\n  });\n};\n\nconst processComponentUpdates = async (): Promise<void> => {\n  if (isProcessingComponentUpdates) {\n    return;\n  }\n\n  isProcessingComponentUpdates = true;\n\n  try {\n    while (componentUpdateQueue.length > 0) {\n      const task = componentUpdateQueue.shift();\n\n      if (!task) {\n        continue;\n      }\n\n      try {\n        await task();\n      } catch (error) {\n        console.log('error processing component update', error);\n      }\n    }\n  } finally {\n    isProcessingComponentUpdates = false;\n    if (componentUpdateQueue.length > 0) {\n      void processComponentUpdates();\n    }\n  }\n};\n\nconst enqueueComponentUpdate = (task: () => Promise<void> | void): void => {\n  componentUpdateQueue.push(task);\n  if (!isProcessingComponentUpdates) {\n    void processComponentUpdates();\n  }\n};\n\ninterface ReactElementLike {\n  $$typeof: symbol;\n  type: unknown;\n  key: string | number | null;\n  props: Record<string, unknown>;\n}\n\nconst REACT_ELEMENT_TYPE = Symbol.for('react.element');\nlet autoRenderableKey = 0;\n\nconst componentRegistry: Record<string, Component> = {\n  VideoCard: markRaw(VideoCard),\n  AudioCard: markRaw(AudioCard),\n  MiniCard: markRaw(MiniCard),\n  MiniCardAudio: markRaw(MiniCardAudio),\n  MiniAudio: markRaw(MiniAudio),\n  MiniAudioPlayer: markRaw(MiniAudioPlayer),\n};\n\nwatch(\n  VideoCardComponentOverride,\n  (component) => {\n    componentRegistry.VideoCard = markRaw(component);\n  },\n  { immediate: true }\n);\n\nwatch(\n  AudioCardComponentOverride,\n  (component) => {\n    componentRegistry.AudioCard = markRaw(component);\n  },\n  { immediate: true }\n);\n\nwatch(\n  MiniCardComponentOverride,\n  (component) => {\n    componentRegistry.MiniCard = markRaw(component);\n  },\n  { immediate: true }\n);\n\nwatch(\n  MiniAudioComponentOverride,\n  (component) => {\n    componentRegistry.MiniAudio = markRaw(component);\n  },\n  { immediate: true }\n);\n\nwatch(\n  MiniAudioPlayerComponent,\n  (component) => {\n    componentRegistry.MiniAudioPlayer = markRaw(component);\n  },\n  { immediate: true }\n);\n\nconst missingReactComponentWarnings = new Set<string>();\n\ntype ReactComponentCandidate = {\n  displayName?: string;\n  name?: string;\n};\n\nconst getDisplayNameFromCandidate = (candidate: ReactComponentCandidate | null | undefined) =>\n  candidate?.displayName ?? candidate?.name;\n\nconst getReactComponentName = (type: unknown): string | undefined => {\n  if (!type) {\n    return undefined;\n  }\n\n  if (typeof type === 'function') {\n    return getDisplayNameFromCandidate(type as ReactComponentCandidate);\n  }\n\n  if (typeof type === 'object') {\n    return getDisplayNameFromCandidate(type as ReactComponentCandidate);\n  }\n\n  return undefined;\n};\n\nconst resolveVueComponentFromReact = (type: unknown): Component | undefined => {\n  const name = getReactComponentName(type);\n  if (!name) {\n    return undefined;\n  }\n\n  const component = componentRegistry[name];\n  if (!component && !missingReactComponentWarnings.has(name)) {\n    console.warn(`[MediasfuGeneric] No Vue equivalent registered for React component \"${name}\".`);\n    missingReactComponentWarnings.add(name);\n  }\n\n  return component;\n};\n\nconst isReactElementLike = (value: unknown): value is ReactElementLike =>\n  typeof value === 'object' &&\n  value !== null &&\n  (value as Partial<ReactElementLike>).$$typeof === REACT_ELEMENT_TYPE;\n\nconst isRenderableComponent = (value: unknown): value is RenderableComponent =>\n  (typeof value === 'object' && value !== null && 'component' in value && 'props' in value && 'key' in value);\n\nconst normalizeComponentList = (value: unknown): RenderableComponent[] => {\n  if (!Array.isArray(value)) {\n    return [];\n  }\n\n  return value.filter(isRenderableComponent) as RenderableComponent[];\n};\n\nconst otherGridComponentLists = computed<[RenderableComponent[], RenderableComponent[]]>(() => {\n  const streams = otherGridStreams.value ?? [];\n\n  return [\n    normalizeComponentList(streams?.[0]),\n    normalizeComponentList(streams?.[1]),\n  ];\n});\n\nconst audioOnlyComponents = computed<RenderableComponent[]>(() => normalizeComponentList(audioOnlyStreams.value));\n\nconst parseFontSizeValue = (value: unknown): number | undefined => {\n  if (typeof value === 'number' && Number.isFinite(value)) {\n    return value;\n  }\n\n  if (typeof value === 'string') {\n    const parsed = Number.parseFloat(value);\n    return Number.isFinite(parsed) ? parsed : undefined;\n  }\n\n  return undefined;\n};\n\nconst formatFontSizeValue = (value: unknown): string | undefined => {\n  if (typeof value === 'string') {\n    return value;\n  }\n\n  const parsed = parseFontSizeValue(value);\n  return parsed !== undefined ? `${parsed}px` : undefined;\n};\n\nconst sanitizeRenderableComponent = (component: RenderableComponent): RenderableComponent => {\n  if (!component || typeof component !== 'object') {\n    return component;\n  }\n\n  const originalProps = component.props ?? {};\n  if (!originalProps || typeof originalProps !== 'object') {\n    return component;\n  }\n\n  const props: Record<string, unknown> = { ...originalProps };\n\n  if ('fontSize' in props) {\n    const normalizedFontSize = parseFontSizeValue(props.fontSize);\n    if (normalizedFontSize !== undefined) {\n      props.fontSize = normalizedFontSize;\n    }\n  }\n\n  if (props.style && typeof props.style === 'object' && props.style !== null) {\n    const style = { ...(props.style as Record<string, unknown>) };\n    const formattedStyleFontSize = formatFontSizeValue(style.fontSize);\n    if (formattedStyleFontSize !== undefined) {\n      style.fontSize = formattedStyleFontSize;\n    }\n    props.style = style;\n  }\n\n  return {\n    ...component,\n    props: props as RenderableComponent['props'],\n  };\n};\n\nconst prepareRenderableComponent = (component: RenderableComponent): RenderableComponent => {\n  const sanitized = sanitizeRenderableComponent(component);\n  return markRaw({\n    ...sanitized,\n    component: markRaw(sanitized.component),\n  });\n};\n\nconst convertReactElementToRenderable = (element: ReactElementLike): RenderableComponent | null => {\n  const componentName = getReactComponentName(element.type);\n  const component = resolveVueComponentFromReact(element.type);\n  if (!component) {\n    return null;\n  }\n\n  const props: Record<string, unknown> = { ...element.props };\n  delete (props as Record<string, unknown>).children;\n\n  if (componentName === 'MiniAudioPlayer') {\n    const reactMiniAudio = props.MiniAudioComponent;\n    const resolvedMiniAudio = reactMiniAudio\n      ? resolveVueComponentFromReact(reactMiniAudio)\n      : componentRegistry.MiniAudio;\n    props.miniAudioComponent = resolvedMiniAudio ?? null;\n    delete props.MiniAudioComponent;\n  }\n\n  const participant = props.participant as { id?: string | number } | undefined;\n  const derivedKey =\n    element.key ??\n    (props.key as string | number | undefined) ??\n    (props.remoteProducerId as string | number | undefined) ??\n    participant?.id ??\n    (typeof props.name === 'string' ? props.name : undefined);\n\n  return prepareRenderableComponent({\n    component,\n    props,\n    key: derivedKey ?? `react-${autoRenderableKey++}`,\n  });\n};\n\nconst convertToRenderableComponent = (\n  value: RenderableComponent | ReactElementLike | null | undefined\n): RenderableComponent | null => {\n  if (!value) {\n    return null;\n  }\n\n  if (isRenderableComponent(value)) {\n    return prepareRenderableComponent(value);\n  }\n\n  if (isReactElementLike(value)) {\n    return convertReactElementToRenderable(value);\n  }\n\n  return null;\n};\n\ntype RenderableListSource = Array<RenderableComponent | ReactElementLike | null | undefined>;\ntype RenderableGridSource = Array<RenderableListSource | null | undefined>;\n\nconst prepareRenderableList = (components: RenderableListSource): RenderableComponent[] =>\n  markRaw(\n    components\n      .map((component) => convertToRenderableComponent(component))\n      .filter((component): component is RenderableComponent => component !== null)\n  );\n\nconst emptyRenderableList = (): RenderableComponent[] => markRaw([] as RenderableComponent[]);\n\nconst prepareRenderableGrid = (grid: RenderableGridSource): RenderableComponent[][] =>\n  markRaw(\n    grid.map((row) =>\n      Array.isArray(row) ? prepareRenderableList(row) : emptyRenderableList()\n    )\n  );\n\nconst emptyRenderableGrid = (): RenderableComponent[][] =>\n  markRaw([emptyRenderableList(), emptyRenderableList()]);\n\nconst mainGridStream = computed<RenderableComponent[]>(() => {\n  const raw = mainGridStreamRaw.value;\n  if (!Array.isArray(raw) || raw.length === 0) {\n    return emptyRenderableList();\n  }\n\n  return prepareRenderableList(raw as RenderableListSource);\n});\n\nconst videoInputs = ref<MediaDeviceInfo[]>([]);\nconst audioInputs = ref<MediaDeviceInfo[]>([]);\nconst meetingProgressTime = ref<string>('00:00:00');\nconst meetingElapsedTime = ref<number>(0);\n\nconst ref_participants = ref<Participant[]>([]);\nconst participantsAll = ref<Participant[]>([]);\n\n// Messages\nconst messages = ref<Message[]>(props.useSeed && props.seedData?.messages ? props.seedData.messages : []);\nconst startDirectMessage = ref<boolean>(false);\nconst directMessageDetails = ref<Participant | null>(null);\nconst showMessagesBadge = ref<boolean>(false);\n\n// Event settings\nconst audioSetting = ref<string>('allow');\nconst videoSetting = ref<string>('allow');\nconst screenshareSetting = ref<string>('allow');\nconst chatSetting = ref<string>('allow');\n\n// Display settings\nconst displayOption = ref<string>(meetingDisplayType.value ? meetingDisplayType.value : 'media');\nconst autoWave = ref<boolean>(true);\nconst forceFullDisplay = ref<boolean>(\n  eventType.value === 'webinar' || eventType.value === 'conference' ? false : true\n);\nconst prevForceFullDisplay = ref<boolean>(false);\nconst prevMeetingDisplayType = ref<string>('video');\n\n// Waiting room\nconst waitingRoomFilter = ref<string>('');\nconst waitingRoomList = ref<WaitingRoomParticipant[]>(\n  props.useSeed && props.seedData?.waitingList ? props.seedData.waitingList : []\n);\nconst waitingRoomCounter = ref<number>(0);\nconst filteredWaitingRoomList = ref<WaitingRoomParticipant[]>(waitingRoomList.value);\n\n// Requests\nconst requestFilter = ref<string>('');\nconst requestList = ref<Request[]>(props.useSeed && props.seedData?.requests ? props.seedData.requests : []);\nconst requestCounter = ref<number>(0);\nconst filteredRequestList = ref<Request[]>(requestList.value);\nconst totalReqWait = ref<number>(0);\n\n// Alert modal\nconst alertVisible = ref<boolean>(false);\nconst alertMessage = ref<string>('');\nconst alertType = ref<'success' | 'danger'>('success');\nconst alertDuration = ref<number>(3000);\n\n// Progress Timer\nconst progressTimerVisible = ref<boolean>(true);\nconst progressTimerValue = ref<number>(0);\n\n// Menu modals\nconst isMenuModalVisible = ref<boolean>(false);\nconst isRecordingModalVisible = ref<boolean>(false);\nconst isSettingsModalVisible = ref<boolean>(false);\nconst isRequestsModalVisible = ref<boolean>(false);\nconst isWaitingModalVisible = ref<boolean>(false);\nconst isCoHostModalVisible = ref<boolean>(false);\nconst isMediaSettingsModalVisible = ref<boolean>(false);\nconst isDisplaySettingsModalVisible = ref<boolean>(false);\n\n// Other modals\nconst isParticipantsModalVisible = ref<boolean>(false);\nconst isMessagesModalVisible = ref<boolean>(false);\nconst isConfirmExitModalVisible = ref<boolean>(false);\nconst isConfirmHereModalVisible = ref<boolean>(false);\nconst isShareEventModalVisible = ref<boolean>(false);\nconst isLoadingModalVisible = ref<boolean>(false);\n\n// Recording options\nconst recordingMediaOptions = ref<string>('video');\nconst recordingAudioOptions = ref<string>('all');\nconst recordingVideoOptions = ref<string>('all');\nconst recordingVideoType = ref<string>('fullDisplay');\nconst recordingVideoOptimized = ref<boolean>(false);\nconst recordingDisplayType = ref<'media' | 'video' | 'all'>('media');\nconst recordingAddHLS = ref<boolean>(true);\nconst recordingNameTags = ref<boolean>(true);\n\nconst recordingBackgroundColor = ref<string>('#83c0e9');\nconst recordingNameTagsColor = ref<string>('#ffffff');\n\nconst recordingAddText = ref<boolean>(false);\nconst recordingCustomText = ref<string>('Add Text');\nconst recordingCustomTextPosition = ref<string>('top');\n\nconst recordingCustomTextColor = ref<string>('#ffffff');\n\nconst recordingOrientationVideo = ref<string>('landscape');\nconst clearedToResume = ref<boolean>(true);\nconst clearedToRecord = ref<boolean>(true);\nconst recordState = ref<string>('green');\n\nconst showRecordButtons = ref<boolean>(false);\nconst recordingProgressTime = ref<string>('00:00:00');\nconst audioSwitching = ref<boolean>(false);\nconst videoSwitching = ref<boolean>(false);\n\n// Media states\nconst videoAlreadyOn = ref<boolean>(false);\nconst audioAlreadyOn = ref<boolean>(false);\n\nconst componentSizes = ref<ComponentSizes>({\n  mainHeight: 0,\n  otherHeight: 0,\n  mainWidth: 0,\n  otherWidth: 0,\n});\n\n// Permissions\nconst hasCameraPermission = ref<boolean>(false);\nconst hasAudioPermission = ref<boolean>(false);\n\n// Transports\nconst transportCreated = ref<boolean>(false);\nconst localTransportCreated = ref<boolean>(false);\nconst transportCreatedVideo = ref<boolean>(false);\nconst transportCreatedAudio = ref<boolean>(false);\nconst transportCreatedScreen = ref<boolean>(false);\nconst producerTransport = ref<Transport | null>(null);\nconst localProducerTransport = ref<Transport | null>(null);\nconst videoProducer = ref<Producer | null>(null);\nconst localVideoProducer = ref<Producer | null>(null);\nconst params = ref<ProducerOptions>({} as ProducerOptions);\nconst videoParams = ref<ProducerOptions>({} as ProducerOptions);\nconst audioParams = ref<ProducerOptions>({} as ProducerOptions);\nconst audioProducer = ref<Producer | null>(null);\nconst audioLevel = ref<number>(0);\nconst localAudioProducer = ref<Producer | null>(null);\nconst consumerTransports = ref<TransportType[]>([]);\nconst consumingTransports = ref<string[]>([]);\n\n// Polls\nconst polls = ref<Poll[]>(props.useSeed && props.seedData?.polls ? props.seedData.polls : []);\nconst poll = ref<Poll | null>(null);\nconst isPollModalVisible = ref<boolean>(false);\n\n// Background\nconst customImage = ref<string>('');\nconst selectedImage = ref<string>('');\nconst segmentVideo = ref<MediaStream | null>(null);\nconst selfieSegmentation = ref<SelfieSegmentation | null>(null);\nconst pauseSegmentation = ref<boolean>(false);\nconst processedStream = ref<MediaStream | null>(null);\nconst keepBackground = ref<boolean>(false);\nconst backgroundHasChanged = ref<boolean>(false);\nconst virtualStream = ref<MediaStream | null>(null);\nconst mainCanvas = ref<HTMLCanvasElement | null>(null);\nconst prevKeepBackground = ref<boolean>(false);\nconst appliedBackground = ref<boolean>(false);\nconst isBackgroundModalVisible = ref<boolean>(false);\nconst autoClickBackground = ref<boolean>(false);\n\n// Breakout rooms\nconst breakoutRooms = ref<BreakoutParticipant[][]>(\n  props.useSeed && props.seedData?.breakoutRooms ? props.seedData.breakoutRooms : []\n);\nconst currentRoomIndex = ref<number>(0);\nconst canStartBreakout = ref<boolean>(false);\nconst breakOutRoomStarted = ref<boolean>(false);\nconst breakOutRoomEnded = ref<boolean>(false);\nconst hostNewRoom = ref<number>(-1);\nconst limitedBreakRoom = ref<BreakoutParticipant[]>([]);\nconst mainRoomsLength = ref<number>(0);\nconst memberRoom = ref<number>(-1);\nconst isBreakoutRoomsModalVisible = ref<boolean>(false);\n\n// Whiteboard\nconst whiteboardUsers = ref<WhiteboardUser[]>(\n  props.useSeed && props.seedData?.whiteboardUsers ? props.seedData.whiteboardUsers : []\n);\nconst currentWhiteboardIndex = ref<number | null>(null);\nconst canStartWhiteboard = ref<boolean>(false);\nconst whiteboardStarted = ref<boolean>(false);\nconst whiteboardEnded = ref<boolean>(false);\nconst whiteboardLimit = ref<number>(itemPageLimit.value);\nconst isWhiteboardModalVisible = ref<boolean>(false);\nconst isConfigureWhiteboardModalVisible = ref<boolean>(false);\nconst shapes = ref<SharedShape[]>([]);\nconst useImageBackground = ref<boolean>(true);\nconst redoStack = ref<SharedShape[]>([]);\nconst undoStack = ref<string[]>([]);\nconst canvasStream = ref<MediaStream | null>(null);\nconst canvasWhiteboard = ref<HTMLCanvasElement | null>(null);\n\n// Screenboard\nconst canvasScreenboard = ref<HTMLCanvasElement | null>(null);\nconst processedScreenStream = ref<MediaStream | null>(null);\nconst annotateScreenStream = ref<boolean>(false);\nconst mainScreenCanvas = ref<HTMLCanvasElement | null>(null);\nconst isScreenboardModalVisible = ref<boolean>(false);\n\ntype SupportedShapeInput = readonly SharedShape[] | readonly WhiteboardShape[];\n\nconst isSharedShape = (value: unknown): value is SharedShape =>\n  typeof value === 'object' &&\n  value !== null &&\n  'payload' in (value as Record<string, unknown>);\n\nconst toWhiteboardShape = (shape: SharedShape): WhiteboardShape => {\n  const payload = shape.payload ?? ({} as ShapePayload);\n\n  return {\n    type: payload.type ?? shape.action ?? 'draw',\n    x1: payload.x1 ?? payload.x ?? 0,\n    y1: payload.y1 ?? payload.y ?? 0,\n    x2: payload.x2 ?? payload.x ?? 0,\n    y2: payload.y2 ?? payload.y ?? 0,\n    color: payload.color ?? '#000000',\n    thickness: payload.thickness ?? 1,\n    lineType: payload.lineType ?? 'solid',\n    text: payload.text as string | undefined,\n    font: payload.font as string | undefined,\n    fontSize: payload.fontSize as number | undefined,\n    points: payload.points as Array<{ x: number; y: number }> | undefined,\n    img: payload.img as HTMLImageElement | undefined,\n    src: payload.src as string | undefined,\n    x: payload.x as number | undefined,\n    y: payload.y as number | undefined,\n  };\n};\n\nconst toSharedShape = (shape: WhiteboardShape): SharedShape => {\n  const payload: ShapePayload = {\n    type: shape.type ?? 'draw',\n    x1: shape.x1 ?? shape.x ?? 0,\n    y1: shape.y1 ?? shape.y ?? 0,\n    x2: shape.x2 ?? shape.x ?? 0,\n    y2: shape.y2 ?? shape.y ?? 0,\n    color: shape.color ?? '#000000',\n    thickness: shape.thickness ?? 1,\n    lineType: shape.lineType ?? 'solid',\n    text: shape.text,\n    font: shape.font,\n    fontSize: shape.fontSize,\n    points: shape.points,\n    img: shape.img,\n    src: shape.src,\n    x: shape.x,\n    y: shape.y,\n  };\n\n  return {\n    action: shape.type ?? 'draw',\n    payload,\n  } satisfies SharedShape;\n};\n\nconst convertSharedShapesToWhiteboard = (value: SharedShape[]): WhiteboardShape[] =>\n  value.map((shape) => toWhiteboardShape(shape));\n\nconst isSharedShapeArray = (value: SupportedShapeInput): value is SharedShape[] =>\n  value.every((item) => isSharedShape(item));\n\nconst normalizeToSharedShapes = (value: SupportedShapeInput): SharedShape[] => {\n  if (value.length === 0) {\n    return [];\n  }\n  if (isSharedShapeArray(value)) {\n    return [...value];\n  }\n  return value.map((shape) => toSharedShape(shape as WhiteboardShape));\n};\nconst updateShapesValue = (value: SupportedShapeInput): void => {\n  shapes.value = normalizeToSharedShapes(value);\n};\n\nconst updateRedoStackValue = (value: SupportedShapeInput): void => {\n  redoStack.value = normalizeToSharedShapes(value);\n};\n\n// Control buttons state\nconst micActive = ref<boolean>(audioAlreadyOn.value);\nconst videoActive = ref<boolean>(videoAlreadyOn.value);\nconst screenShareActive = ref<boolean>(false);\nconst endCallActive = ref<boolean>(false);\nconst participantsActive = ref<boolean>(false);\n\n// Computed Properties\nconst computedContainerStyle = computed(() => ({\n  height: '100vh',\n  width: '100vw',\n  maxWidth: '100vw',\n  maxHeight: '100vh',\n  overflow: 'hidden',\n  ...props.containerStyle,\n}));\n\nconst credentials = computed(() => props.credentials);\nconst localLink = computed(() => props.localLink ?? '');\nconst connectMediaSFU = computed(() => props.connectMediaSFU ?? true);\nconst returnUI = computed(() => props.returnUI ?? true);\nconst noUIPreJoinOptions = computed(() => props.noUIPreJoinOptions);\nconst createMediaSFURoom = computed(() => props.createMediaSFURoom);\nconst joinMediaSFURoom = computed(() => props.joinMediaSFURoom);\nconst resolvedCustomComponent = computed<Component | undefined>(() =>\n  customComponentRenderer.value ? (customComponentRenderer.value as unknown as Component) : undefined\n);\n\nconst prejoinComponent = computed(() => props.PrejoinPage || PreJoinPageComponent.value);\n\nconst prejoinParameters = computed(() => ({\n  imgSrc: props.imgSrc,\n  showAlert,\n  updateIsLoadingModalVisible: (value: boolean) => (isLoadingModalVisible.value = value),\n  connectSocket,\n  connectLocalSocket,\n  updateSocket: (value: MediaSFUSocket) => (socket.value = value),\n  updateLocalSocket: (value: MediaSFUSocket | null) => (localSocket.value = value),\n  updateValidated: (value: boolean) => (validated.value = value),\n  updateApiUserName: (value: string) => (apiUserName.value = value),\n  updateApiToken: (value: string) => (apiToken.value = value),\n  updateLink: (value: string) => (link.value = value),\n  updateRoomName: (value: string) => (roomName.value = value),\n  updateMember: (value: string) => (member.value = value),\n  welcomePageComponent: WelcomePageComponent.value,\n}));\n\n// Update functions\nconst updateIsWideScreen = (value: boolean) => {\n  isWideScreen.value = value;\n};\n\nconst updateIsMediumScreen = (value: boolean) => {\n  isMediumScreen.value = value;\n};\n\nconst updateIsSmallScreen = (value: boolean) => {\n  isSmallScreen.value = value;\n};\n\nconst updateComponentSizes = (sizes: ComponentSizes) => {\n  const current = componentSizes.value;\n  if (\n    current.mainHeight === sizes.mainHeight &&\n    current.otherHeight === sizes.otherHeight &&\n    current.mainWidth === sizes.mainWidth &&\n    current.otherWidth === sizes.otherWidth\n  ) {\n    return;\n  }\n  current.mainHeight = sizes.mainHeight;\n  current.otherHeight = sizes.otherHeight;\n  current.mainWidth = sizes.mainWidth;\n  current.otherWidth = sizes.otherWidth;\n};\n\nconst updateIsMenuModalVisible = (value: boolean) => {\n  isMenuModalVisible.value = value;\n};\n\nconst updateIsRecordingModalVisible = (value: boolean) => {\n  isRecordingModalVisible.value = value;\n  if (value) {\n    confirmedToRecord.value = false;\n  } else {\n    if (clearedToRecord.value && clearedToResume.value && recordStarted.value) {\n      showRecordButtons.value = true;\n    }\n  }\n};\n\nconst updateIsSettingsModalVisible = (value: boolean) => {\n  isSettingsModalVisible.value = value;\n};\n\nconst updateIsRequestsModalVisible = (value: boolean) => {\n  isRequestsModalVisible.value = value;\n};\n\nconst updateIsWaitingModalVisible = (value: boolean) => {\n  isWaitingModalVisible.value = value;\n};\n\nconst updateIsCoHostModalVisible = (value: boolean) => {\n  isCoHostModalVisible.value = value;\n};\n\nconst updateIsMediaSettingsModalVisible = (value: boolean) => {\n  isMediaSettingsModalVisible.value = value;\n};\n\nconst updateIsDisplaySettingsModalVisible = (value: boolean) => {\n  isDisplaySettingsModalVisible.value = value;\n};\n\nconst updateIsParticipantsModalVisible = (value: boolean) => {\n  isParticipantsModalVisible.value = value;\n};\n\nconst updateIsMessagesModalVisible = (value: boolean) => {\n  isMessagesModalVisible.value = value;\n  if (!value) {\n    showMessagesBadge.value = false;\n  }\n};\n\nconst updateIsConfirmExitModalVisible = (value: boolean) => {\n  isConfirmExitModalVisible.value = value;\n};\n\nconst updateIsConfirmHereModalVisible = (value: boolean) => {\n  isConfirmHereModalVisible.value = value;\n};\n\nconst updateIsLoadingModalVisible = (value: boolean) => {\n  isLoadingModalVisible.value = value;\n};\n\nconst updateIsShareEventModalVisible = (value: boolean) => {\n  isShareEventModalVisible.value = value;\n};\n\nconst updateIsPollModalVisible = (value: boolean) => {\n  isPollModalVisible.value = value;\n};\n\nconst updateIsBackgroundModalVisible = (value: boolean) => {\n  isBackgroundModalVisible.value = value;\n};\n\nconst updateIsBreakoutRoomsModalVisible = (value: boolean) => {\n  isBreakoutRoomsModalVisible.value = value;\n};\n\nconst updateIsConfigureWhiteboardModalVisible = (value: boolean) => {\n  isConfigureWhiteboardModalVisible.value = value;\n};\n\nconst updateIsScreenboardModalVisible = (value: boolean) => {\n  isScreenboardModalVisible.value = value;\n};\n\nconst updateIsWhiteboardModalVisible = (value: boolean) => {\n  isWhiteboardModalVisible.value = value;\n};\n\nconst updateParticipants = (value: Participant[]) => {\n  participants.value = value;\n  filteredParticipants.value = value;\n  participantsCounter.value = value.length;\n};\n\nconst updateRequestList = (value: Request[]) => {\n  requestList.value = value;\n  filteredRequestList.value = value;\n  requestCounter.value = value.length;\n};\n\nconst updateWaitingRoomList = (value: WaitingRoomParticipant[]) => {\n  waitingRoomList.value = value;\n  filteredWaitingRoomList.value = value;\n  waitingRoomCounter.value = value.length;\n};\n\nconst updateRequestCounter = (value: number) => {\n  requestCounter.value = value;\n};\n\nconst updateRequestFilter = (value: string) => {\n  requestFilter.value = value;\n};\n\nconst updateCoHost = (value: string) => {\n  coHost.value = value;\n};\n\nconst updateCoHostResponsibility = (value: CoHostResponsibility[]) => {\n  coHostResponsibility.value = value;\n};\n\nconst updateAudioSetting = (value: string) => {\n  audioSetting.value = value;\n};\n\nconst updateVideoSetting = (value: string) => {\n  videoSetting.value = value;\n};\n\nconst updateScreenshareSetting = (value: string) => {\n  screenshareSetting.value = value;\n};\n\nconst updateChatSetting = (value: string) => {\n  chatSetting.value = value;\n};\n\nconst updateStartDirectMessage = (value: boolean) => {\n  startDirectMessage.value = value;\n};\n\nconst updateDirectMessageDetails = (value: Participant | null) => {\n  directMessageDetails.value = value;\n};\n\nconst showAlert = ({\n  message,\n  type,\n  duration = 3000,\n}: {\n  message: string;\n  type: string;\n  duration?: number;\n}) => {\n  const normalizedType: 'success' | 'danger' = type === 'danger' ? 'danger' : 'success';\n  alertMessage.value = message;\n  alertType.value = normalizedType;\n  alertDuration.value = duration;\n  alertVisible.value = true;\n};\n\nconst onRequestFilterChange = (value: string) => {\n  if (value && value.length > 0) {\n    const filteredRequest = requestList.value.filter((request: Request) =>\n      request?.name?.toLowerCase().includes(value.toLowerCase())\n    );\n    filteredRequestList.value = filteredRequest;\n    requestCounter.value = filteredRequest.length;\n  } else {\n    filteredRequestList.value = requestList.value;\n    requestCounter.value = requestList.value.length;\n  }\n};\n\nconst onWaitingRoomFilterChange = (value: string) => {\n  if (value && value.length > 0) {\n    const filteredWaitingRoom = waitingRoomList.value.filter((waitingRoom) =>\n      waitingRoom.name.toLowerCase().includes(value.toLowerCase())\n    );\n    filteredWaitingRoomList.value = filteredWaitingRoom;\n    waitingRoomCounter.value = filteredWaitingRoom.length;\n  } else {\n    filteredWaitingRoomList.value = waitingRoomList.value;\n    waitingRoomCounter.value = waitingRoomList.value.length;\n  }\n};\n\nconst onParticipantsFilterChange = (value: string) => {\n  if (value && value.length > 0) {\n    const filteredParts = participants.value.filter((participant) =>\n      participant.name.toLowerCase().includes(value.toLowerCase())\n    );\n    filteredParticipants.value = filteredParts;\n    participantsCounter.value = filteredParts.length;\n  } else {\n    filteredParticipants.value = participants.value;\n    participantsCounter.value = participants.value.length;\n  }\n};\n\nconst checkOrientation = () => {\n  const isPortrait = window.matchMedia('(orientation: portrait)').matches;\n  return isPortrait ? 'portrait' : 'landscape';\n};\n\nconst getUpdatedAllParams = () => {\n  // Get all the params for the room as well as the update functions for them and Media SFU functions and return them\n  try {\n    if (props.sourceParameters !== null && props.sourceParameters !== undefined) {\n      const updatedParams = {\n        ...getAllParams(),\n        ...mediaSFUFunctions(),\n      };\n      if (props.updateSourceParameters) {\n        props.updateSourceParameters(updatedParams);\n      }\n    }\n  } catch {\n    // Do nothing\n  }\n\n  return {\n    ...getAllParams(),\n    ...mediaSFUFunctions(),\n  };\n};\n\nconst mediaSFUFunctions = () => {\n  // Media SFU functions\n  return {\n    updateMiniCardsGrid,\n    mixStreams,\n    dispStreams,\n    stopShareScreen,\n    checkScreenShare,\n    startShareScreen,\n    requestScreenShare,\n    reorderStreams,\n    prepopulateUserMedia,\n    getVideos,\n    rePort,\n    trigger,\n  consumerResume: consumerResumeOverride.value,\n    connectSendTransport,\n    connectSendTransportAudio,\n    connectSendTransportVideo,\n    connectSendTransportScreen,\n    processConsumerTransports,\n    resumePauseStreams,\n    readjust,\n    checkGrid,\n    getEstimate,\n    calculateRowsAndColumns,\n  addVideosGrid: addVideosGridOverride.value,\n    onScreenChanges,\n    sleep,\n    changeVids,\n    compareActiveNames,\n    compareScreenStates,\n    createSendTransport,\n    resumeSendTransportAudio,\n    receiveAllPipedTransports,\n    disconnectSendTransportVideo,\n    disconnectSendTransportAudio,\n    disconnectSendTransportScreen,\n    getPipedProducersAlt,\n    signalNewConsumerTransport,\n    connectRecvTransport,\n    reUpdateInter,\n    updateParticipantAudioDecibels,\n    closeAndResize,\n    autoAdjust,\n    switchUserVideoAlt,\n    switchUserVideo,\n    switchUserAudio,\n    getDomains,\n    formatNumber,\n    connectIps,\n    connectLocalIps,\n    createDeviceClient,\n    handleCreatePoll,\n    handleEndPoll,\n    handleVotePoll,\n    captureCanvasStream,\n    resumePauseAudioStreams,\n    processConsumerTransportsAudio,\n    checkPermission,\n    streamSuccessVideo,\n    streamSuccessAudio,\n    streamSuccessScreen,\n    streamSuccessAudioSwitch,\n    clickVideo,\n    clickAudio,\n    clickScreenShare,\n    switchVideoAlt,\n    requestPermissionCamera,\n    requestPermissionAudio,\n    getMediaDevicesList,\n    getParticipantMedia,\n  };\n};\n\nconst requestPermissionCamera = async () => {\n  return 'granted';\n};\n\nconst requestPermissionAudio = async () => {\n  return 'granted';\n};\n\nconst getAllParams = () => {\n  // Get all the params for the room as well as the update functions for them and return them\n  return {\n    localUIMode: props.useLocalUIMode,\n    roomName: roomName.value,\n    member: member.value,\n    adminPasscode: adminPasscode.value,\n    youAreCoHost: youAreCoHost.value,\n    youAreHost: youAreHost.value,\n    islevel: islevel.value,\n    confirmedToRecord: confirmedToRecord.value,\n    meetingDisplayType: meetingDisplayType.value,\n    meetingVideoOptimized: meetingVideoOptimized.value,\n    eventType: eventType.value,\n    participants: participants.value,\n    filteredParticipants: filteredParticipants.value,\n    participantsCounter: participantsCounter.value,\n    participantsFilter: participantsFilter.value,\n    consume_sockets: consume_sockets.value,\n    rtpCapabilities: rtpCapabilities.value,\n    roomRecvIPs: roomRecvIPs.value,\n    meetingRoomParams: meetingRoomParams.value,\n    itemPageLimit: itemPageLimit.value,\n    audioOnlyRoom: audioOnlyRoom.value,\n    addForBasic: addForBasic.value,\n    screenPageLimit: screenPageLimit.value,\n    shareScreenStarted: shareScreenStarted.value,\n    shared: shared.value,\n    targetOrientation: targetOrientation.value,\n    targetResolution: targetResolution.value,\n    targetResolutionHost: targetResolutionHost.value,\n    vidCons: vidCons.value,\n    frameRate: frameRate.value,\n    hParams: hParams.value,\n    vParams: vParams.value,\n    screenParams: screenParams.value,\n    aParams: aParams.value,\n    recordingAudioPausesLimit: recordingAudioPausesLimit.value,\n    recordingAudioPausesCount: recordingAudioPausesCount.value,\n    recordingAudioSupport: recordingAudioSupport.value,\n    recordingAudioPeopleLimit: recordingAudioPeopleLimit.value,\n    recordingAudioParticipantsTimeLimit: recordingAudioParticipantsTimeLimit.value,\n    recordingVideoPausesCount: recordingVideoPausesCount.value,\n    recordingVideoPausesLimit: recordingVideoPausesLimit.value,\n    recordingVideoSupport: recordingVideoSupport.value,\n    recordingVideoPeopleLimit: recordingVideoPeopleLimit.value,\n    recordingVideoParticipantsTimeLimit: recordingVideoParticipantsTimeLimit.value,\n    recordingAllParticipantsSupport: recordingAllParticipantsSupport.value,\n    recordingVideoParticipantsSupport: recordingVideoParticipantsSupport.value,\n    recordingAllParticipantsFullRoomSupport: recordingAllParticipantsFullRoomSupport.value,\n    recordingVideoParticipantsFullRoomSupport: recordingVideoParticipantsFullRoomSupport.value,\n    recordingPreferredOrientation: recordingPreferredOrientation.value,\n    recordingSupportForOtherOrientation: recordingSupportForOtherOrientation.value,\n    recordingMultiFormatsSupport: recordingMultiFormatsSupport.value,\n    userRecordingParams: userRecordingParams.value,\n    canRecord: canRecord.value,\n    startReport: startReport.value,\n    endReport: endReport.value,\n    recordStartTime: recordStartTime.value,\n    recordElapsedTime: recordElapsedTime.value,\n    isTimerRunning: isTimerRunning.value,\n    canPauseResume: canPauseResume.value,\n    recordChangeSeconds: recordChangeSeconds.value,\n    pauseLimit: pauseLimit.value,\n    pauseRecordCount: pauseRecordCount.value,\n    canLaunchRecord: canLaunchRecord.value,\n    stopLaunchRecord: stopLaunchRecord.value,\n    participantsAll: participantsAll.value,\n    firstAll: firstAll.value,\n    updateMainWindow: updateMainWindow.value,\n    first_round: first_round.value,\n    landScaped: landScaped.value,\n    lock_screen: lock_screen.value,\n    screenId: screenId.value,\n    allVideoStreams: allVideoStreams.value as unknown as (Participant | Stream)[],\n    newLimitedStreams: newLimitedStreams.value,\n    newLimitedStreamsIDs: newLimitedStreamsIDs.value,\n    activeSounds: activeSounds.value,\n    screenShareIDStream: screenShareIDStream.value,\n    screenShareNameStream: screenShareNameStream.value,\n    adminIDStream: adminIDStream.value,\n    adminNameStream: adminNameStream.value,\n    youYouStream: youYouStream.value,\n    youYouStreamIDs: youYouStreamIDs.value,\n    localStream: localStream.value,\n    recordStarted: recordStarted.value,\n    recordResumed: recordResumed.value,\n    recordPaused: recordPaused.value,\n    recordStopped: recordStopped.value,\n    adminRestrictSetting: adminRestrictSetting.value,\n    videoRequestState: videoRequestState.value,\n    videoRequestTime: videoRequestTime.value,\n    videoAction: videoAction.value,\n    localStreamVideo: localStreamVideo.value,\n    userDefaultVideoInputDevice: userDefaultVideoInputDevice.value,\n    currentFacingMode: currentFacingMode.value,\n    prevFacingMode: prevFacingMode.value,\n    defVideoID: defVideoID.value,\n    allowed: allowed.value,\n    dispActiveNames: dispActiveNames.value,\n    p_dispActiveNames: p_dispActiveNames.value,\n    activeNames: activeNames.value,\n    prevActiveNames: prevActiveNames.value,\n    p_activeNames: p_activeNames.value,\n    membersReceived: membersReceived.value,\n    deferScreenReceived: deferScreenReceived.value,\n    hostFirstSwitch: hostFirstSwitch.value,\n    micAction: micAction.value,\n    screenAction: screenAction.value,\n    chatAction: chatAction.value,\n    audioRequestState: audioRequestState.value,\n    screenRequestState: screenRequestState.value,\n    chatRequestState: chatRequestState.value,\n    audioRequestTime: audioRequestTime.value,\n    screenRequestTime: screenRequestTime.value,\n    chatRequestTime: chatRequestTime.value,\n    updateRequestIntervalSeconds: updateRequestIntervalSeconds.value,\n    oldSoundIds: oldSoundIds.value,\n    hostLabel: hostLabel.value,\n    mainScreenFilled: mainScreenFilled.value,\n    localStreamScreen: localStreamScreen.value,\n    screenAlreadyOn: screenAlreadyOn.value,\n    chatAlreadyOn: chatAlreadyOn.value,\n    redirectURL: redirectURL.value,\n    oldAllStreams: oldAllStreams.value,\n    adminVidID: adminVidID.value,\n    streamNames: streamNames.value,\n    non_alVideoStreams: non_alVideoStreams.value as unknown as (Participant | Stream)[],\n    sortAudioLoudness: sortAudioLoudness.value,\n    audioDecibels: audioDecibels.value,\n    mixed_alVideoStreams: mixed_alVideoStreams.value as unknown as (Participant | Stream)[],\n    non_alVideoStreams_muted: non_alVideoStreams_muted.value as unknown as (Participant | Stream)[],\n    paginatedStreams: paginatedStreams.value,\n    localStreamAudio: localStreamAudio.value,\n    defAudioID: defAudioID.value,\n    userDefaultAudioInputDevice: userDefaultAudioInputDevice.value,\n    userDefaultAudioOutputDevice: userDefaultAudioOutputDevice.value,\n    prevAudioInputDevice: prevAudioInputDevice.value,\n    prevVideoInputDevice: prevVideoInputDevice.value,\n    audioPaused: audioPaused.value,\n    mainScreenPerson: mainScreenPerson.value,\n    adminOnMainScreen: adminOnMainScreen.value,\n    screenStates: screenStates.value,\n    prevScreenStates: prevScreenStates.value,\n    updateDateState: updateDateState.value,\n    lastUpdate: lastUpdate.value,\n    nForReadjustRecord: nForReadjustRecord.value,\n    fixedPageLimit: fixedPageLimit.value,\n    removeAltGrid: removeAltGrid.value,\n    nForReadjust: nForReadjust.value,\n    lastReorderTime: lastReorderTime.value,\n    reorderInterval: reorderInterval.value,\n    fastReorderInterval: fastReorderInterval.value,\n    audStreamNames: audStreamNames.value,\n    currentUserPage: currentUserPage.value,\n    mainHeightWidth: mainHeightWidth.value,\n    prevMainHeightWidth: prevMainHeightWidth.value,\n    prevDoPaginate: prevDoPaginate.value,\n    doPaginate: doPaginate.value,\n    shareEnded: shareEnded.value,\n    lStreams: lStreams.value,\n    chatRefStreams: chatRefStreams.value,\n    controlHeight: controlHeight.value,\n    isWideScreen: isWideScreen.value,\n    isMediumScreen: isMediumScreen.value,\n    isSmallScreen: isSmallScreen.value,\n    addGrid: addGrid.value,\n    addAltGrid: addAltGrid.value,\n    gridRows: gridRows.value,\n    gridCols: gridCols.value,\n    altGridRows: altGridRows.value,\n    altGridCols: altGridCols.value,\n    numberPages: numberPages.value,\n    currentStreams: currentStreams.value,\n    showMiniView: showMiniView.value,\n    nStream: nStream.value,\n    defer_receive: defer_receive.value,\n    allAudioStreams: allAudioStreams.value as unknown as (Participant | Stream)[],\n    screenProducer: screenProducer.value as unknown as Producer | null,\n    remoteScreenStream: remoteScreenStream.value as unknown as (Participant | Stream)[],\n    gotAllVids: gotAllVids.value,\n    paginationHeightWidth: paginationHeightWidth.value,\n    paginationDirection: paginationDirection.value,\n    gridSizes: gridSizes.value,\n    screenForceFullDisplay: screenForceFullDisplay.value,\n    mainGridStream: mainGridStream.value,\n    otherGridStreams: otherGridStreams.value,\n    audioOnlyStreams: audioOnlyStreams.value,\n    videoInputs: videoInputs.value,\n    audioInputs: audioInputs.value,\n    meetingProgressTime: meetingProgressTime.value,\n    meetingElapsedTime: meetingElapsedTime.value,\n    ref_participants: ref_participants.value as unknown as (Participant | Stream)[],\n    messages: messages.value,\n    startDirectMessage: startDirectMessage.value,\n    directMessageDetails: directMessageDetails.value,\n    coHost: coHost.value,\n    coHostResponsibility: coHostResponsibility.value,\n    audioSetting: audioSetting.value,\n    videoSetting: videoSetting.value,\n    screenshareSetting: screenshareSetting.value,\n    chatSetting: chatSetting.value,\n    autoWave: autoWave.value,\n    forceFullDisplay: forceFullDisplay.value,\n    prevForceFullDisplay: prevForceFullDisplay.value,\n    prevMeetingDisplayType: prevMeetingDisplayType.value,\n    waitingRoomFilter: waitingRoomFilter.value,\n    waitingRoomList: waitingRoomList.value,\n    waitingRoomCounter: waitingRoomCounter.value,\n    filteredWaitingRoomList: filteredWaitingRoomList.value,\n    requestFilter: requestFilter.value,\n    requestList: requestList.value,\n    requestCounter: requestCounter.value,\n    filteredRequestList: filteredRequestList.value,\n    totalReqWait: totalReqWait.value,\n    alertVisible: alertVisible.value,\n    alertMessage: alertMessage.value,\n    alertType: alertType.value,\n    alertDuration: alertDuration.value,\n    progressTimerVisible: progressTimerVisible.value,\n    progressTimerValue: progressTimerValue.value,\n    isMenuModalVisible: isMenuModalVisible.value,\n    isRecordingModalVisible: isRecordingModalVisible.value,\n    isSettingsModalVisible: isSettingsModalVisible.value,\n    isRequestsModalVisible: isRequestsModalVisible.value,\n    isWaitingModalVisible: isWaitingModalVisible.value,\n    isCoHostModalVisible: isCoHostModalVisible.value,\n    isMediaSettingsModalVisible: isMediaSettingsModalVisible.value,\n    isDisplaySettingsModalVisible: isDisplaySettingsModalVisible.value,\n    isParticipantsModalVisible: isParticipantsModalVisible.value,\n    isMessagesModalVisible: isMessagesModalVisible.value,\n    isConfirmExitModalVisible: isConfirmExitModalVisible.value,\n    isConfirmHereModalVisible: isConfirmHereModalVisible.value,\n    isLoadingModalVisible: isLoadingModalVisible.value,\n    recordingMediaOptions: recordingMediaOptions.value,\n    recordingAudioOptions: recordingAudioOptions.value,\n    recordingVideoOptions: recordingVideoOptions.value,\n    recordingVideoType: recordingVideoType.value,\n    recordingVideoOptimized: recordingVideoOptimized.value,\n    recordingDisplayType: recordingDisplayType.value,\n    recordingAddHLS: recordingAddHLS.value,\n    recordingAddText: recordingAddText.value,\n    recordingCustomText: recordingCustomText.value,\n    recordingCustomTextPosition: recordingCustomTextPosition.value,\n    recordingCustomTextColor: recordingCustomTextColor.value,\n    recordingNameTags: recordingNameTags.value,\n    recordingBackgroundColor: recordingBackgroundColor.value,\n    recordingNameTagsColor: recordingNameTagsColor.value,\n    recordingOrientationVideo: recordingOrientationVideo.value,\n    clearedToResume: clearedToResume.value,\n    clearedToRecord: clearedToRecord.value,\n    recordState: recordState.value,\n    showRecordButtons: showRecordButtons.value,\n    recordingProgressTime: recordingProgressTime.value,\n    audioSwitching: audioSwitching.value,\n    videoSwitching: videoSwitching.value,\n    videoAlreadyOn: videoAlreadyOn.value,\n    audioAlreadyOn: audioAlreadyOn.value,\n    componentSizes: componentSizes.value,\n    hasCameraPermission: hasCameraPermission.value,\n    hasAudioPermission: hasAudioPermission.value,\n    transportCreated: transportCreated.value,\n    localTransportCreated: localTransportCreated.value,\n    transportCreatedVideo: transportCreatedVideo.value,\n    transportCreatedAudio: transportCreatedAudio.value,\n    transportCreatedScreen: transportCreatedScreen.value,\n    producerTransport: producerTransport.value,\n    localProducerTransport: localProducerTransport.value,\n    videoProducer: videoProducer.value as unknown as Producer | null,\n    localVideoProducer: localVideoProducer.value as unknown as Producer | null,\n    params: params.value,\n    videoParams: videoParams.value,\n    audioParams: audioParams.value,\n    audioProducer: audioProducer.value as unknown as Producer | null,\n    audioLevel: audioLevel.value,\n    localAudioProducer: localAudioProducer.value as unknown as Producer | null,\n    consumerTransports: consumerTransports.value as unknown as TransportType[],\n    consumingTransports: consumingTransports.value as unknown as string[],\n    polls: polls.value,\n    poll: poll.value,\n    isPollModalVisible: isPollModalVisible.value,\n    customImage: customImage.value,\n    selectedImage: selectedImage.value,\n    segmentVideo: segmentVideo.value,\n    selfieSegmentation: selfieSegmentation.value,\n    pauseSegmentation: pauseSegmentation.value,\n    processedStream: processedStream.value,\n    keepBackground: keepBackground.value,\n    backgroundHasChanged: backgroundHasChanged.value,\n    virtualStream: virtualStream.value,\n    mainCanvas: mainCanvas.value,\n    prevKeepBackground: prevKeepBackground.value,\n    appliedBackground: appliedBackground.value,\n    isBackgroundModalVisible: isBackgroundModalVisible.value,\n    autoClickBackground: autoClickBackground.value,\n    breakoutRooms: breakoutRooms.value,\n    currentRoomIndex: currentRoomIndex.value,\n    canStartBreakout: canStartBreakout.value,\n    breakOutRoomStarted: breakOutRoomStarted.value,\n    breakOutRoomEnded: breakOutRoomEnded.value,\n    hostNewRoom: hostNewRoom.value,\n    limitedBreakRoom: limitedBreakRoom.value,\n    mainRoomsLength: mainRoomsLength.value,\n    memberRoom: memberRoom.value,\n    isBreakoutRoomsModalVisible: isBreakoutRoomsModalVisible.value,\n    whiteboardUsers: whiteboardUsers.value,\n    currentWhiteboardIndex: currentWhiteboardIndex.value,\n    canStartWhiteboard: canStartWhiteboard.value,\n    whiteboardStarted: whiteboardStarted.value,\n    whiteboardEnded: whiteboardEnded.value,\n    whiteboardLimit: whiteboardLimit.value,\n    isWhiteboardModalVisible: isWhiteboardModalVisible.value,\n    isConfigureWhiteboardModalVisible: isConfigureWhiteboardModalVisible.value,\n    shapes: shapes.value,\n    useImageBackground: useImageBackground.value,\n    redoStack: redoStack.value,\n    undoStack: undoStack.value,\n    canvasStream: canvasStream.value,\n    canvasWhiteboard: canvasWhiteboard.value,\n    canvasScreenboard: canvasScreenboard.value,\n    processedScreenStream: processedScreenStream.value,\n    annotateScreenStream: annotateScreenStream.value,\n    mainScreenCanvas: mainScreenCanvas.value,\n    isScreenboardModalVisible: isScreenboardModalVisible.value,\n    validated: validated.value,\n    device: device.value as unknown as Device | null,\n    socket: socket.value as unknown as MediaSFUSocket,\n    localSocket: (localSocket.value ?? undefined) as unknown as MediaSFUSocket | undefined,\n    checkMediaPermission: false,\n    onWeb: true,\n    mediaDevices: mediaDevices,\n    // Update functions (Vue-specific - pass setters)\n    updateRoomName: (value: string) => (roomName.value = value),\n    updateMember: (value: string) => {\n      if (value.length > 0 && value.includes('_')) {\n        const parts = value.split('_');\n        if (parts[1]) {\n          islevel.value = parts[1];\n        }\n        value = parts[0] || value;\n      }\n      member.value = value;\n    },\n    updateAdminPasscode: (value: string) => (adminPasscode.value = value),\n    updateYouAreCoHost: (value: boolean) => (youAreCoHost.value = value),\n    updateYouAreHost: (value: boolean) => (youAreHost.value = value),\n    updateIslevel: (value: string) => (islevel.value = value),\n    updateCoHost,\n    updateCoHostResponsibility,\n    updateConfirmedToRecord: (value: boolean) => (confirmedToRecord.value = value),\n    updateMeetingDisplayType: (value: string) => (meetingDisplayType.value = value),\n    updateMeetingVideoOptimized: (value: boolean) => (meetingVideoOptimized.value = value),\n    updateEventType: (value: EventType) => {\n      eventType.value = value;\n      if (value !== 'none') {\n        try {\n          setTimeout(() => {\n            onResize();\n          }, 1500);\n        } catch {\n          // Do nothing\n        }\n      }\n    },\n    updateParticipants,\n    updateParticipantsCounter: (value: number) => (participantsCounter.value = value),\n    updateParticipantsFilter: (value: string) => (participantsFilter.value = value),\n    updateConsume_sockets: (value: ConsumeSocket[]) => (consume_sockets.value = value),\n    updateRtpCapabilities: (value: RtpCapabilities | null) => (rtpCapabilities.value = value),\n    updateRoomRecvIPs: (value: string[]) => (roomRecvIPs.value = value),\n    updateMeetingRoomParams: (value: MeetingRoomParams | null) => (meetingRoomParams.value = value),\n    updateItemPageLimit: (value: number) => (itemPageLimit.value = value),\n    updateAudioOnlyRoom: (value: boolean) => (audioOnlyRoom.value = value),\n    updateAddForBasic: (value: boolean) => (addForBasic.value = value),\n    updateScreenPageLimit: (value: number) => (screenPageLimit.value = value),\n    updateShareScreenStarted: (value: boolean) => (shareScreenStarted.value = value),\n    updateShared: (value: boolean) => {\n      shared.value = value;\n      screenShareActive.value = value;\n      if (value) {\n        setTimeout(async () => {\n          window.dispatchEvent(new Event('resize'));\n        }, 2000);\n      }\n    },\n    updateTargetOrientation: (value: string) => (targetOrientation.value = value),\n    updateTargetResolution: (value: string) => (targetResolution.value = value),\n    updateTargetResolutionHost: (value: string) => (targetResolutionHost.value = value),\n    updateVidCons: (value: VidCons) => (vidCons.value = value),\n    updateFrameRate: (value: number) => (frameRate.value = value),\n    updateHParams: (value: HParamsType) => (hParams.value = value),\n    updateVParams: (value: VParamsType) => (vParams.value = value),\n    updateScreenParams: (value: ScreenParamsType) => (screenParams.value = value),\n    updateAParams: (value: AParamsType) => (aParams.value = value),\n    updateRecordingAudioPausesLimit: (value: number) => (recordingAudioPausesLimit.value = value),\n    updateRecordingAudioPausesCount: (value: number) => (recordingAudioPausesCount.value = value),\n    updateRecordingAudioSupport: (value: boolean) => (recordingAudioSupport.value = value),\n    updateRecordingAudioPeopleLimit: (value: number) => (recordingAudioPeopleLimit.value = value),\n    updateRecordingAudioParticipantsTimeLimit: (value: number) => (recordingAudioParticipantsTimeLimit.value = value),\n    updateRecordingVideoPausesCount: (value: number) => (recordingVideoPausesCount.value = value),\n    updateRecordingVideoPausesLimit: (value: number) => (recordingVideoPausesLimit.value = value),\n    updateRecordingVideoSupport: (value: boolean) => (recordingVideoSupport.value = value),\n    updateRecordingVideoPeopleLimit: (value: number) => (recordingVideoPeopleLimit.value = value),\n    updateRecordingVideoParticipantsTimeLimit: (value: number) => (recordingVideoParticipantsTimeLimit.value = value),\n    updateRecordingAllParticipantsSupport: (value: boolean) => (recordingAllParticipantsSupport.value = value),\n    updateRecordingVideoParticipantsSupport: (value: boolean) => (recordingVideoParticipantsSupport.value = value),\n    updateRecordingAllParticipantsFullRoomSupport: (value: boolean) => (recordingAllParticipantsFullRoomSupport.value = value),\n    updateRecordingVideoParticipantsFullRoomSupport: (value: boolean) => (recordingVideoParticipantsFullRoomSupport.value = value),\n    updateRecordingPreferredOrientation: (value: string) => (recordingPreferredOrientation.value = value),\n    updateRecordingSupportForOtherOrientation: (value: boolean) => (recordingSupportForOtherOrientation.value = value),\n    updateRecordingMultiFormatsSupport: (value: boolean) => (recordingMultiFormatsSupport.value = value),\n    updateUserRecordingParams: (value: UserRecordingParams) => (userRecordingParams.value = value),\n    updateCanRecord: (value: boolean) => (canRecord.value = value),\n    updateStartReport: (value: boolean) => (startReport.value = value),\n    updateEndReport: (value: boolean) => (endReport.value = value),\n    updateRecordTimerInterval: (value: ReturnType<typeof setInterval> | null) => (recordTimerInterval.value = value),\n    updateRecordStartTime: (value: number) => (recordStartTime.value = value),\n    updateRecordElapsedTime: (value: number) => (recordElapsedTime.value = value),\n    updateIsTimerRunning: (value: boolean) => (isTimerRunning.value = value),\n    updateCanPauseResume: (value: boolean) => (canPauseResume.value = value),\n    updateRecordChangeSeconds: (value: number) => (recordChangeSeconds.value = value),\n    updatePauseLimit: (value: number) => (pauseLimit.value = value),\n    updatePauseRecordCount: (value: number) => (pauseRecordCount.value = value),\n    updateCanLaunchRecord: (value: boolean) => (canLaunchRecord.value = value),\n    updateStopLaunchRecord: (value: boolean) => (stopLaunchRecord.value = value),\n    updateParticipantsAll: (value: Participant[]) => (participantsAll.value = value),\n    updateFirstAll: (value: boolean) => (firstAll.value = value),\n    updateUpdateMainWindow: (value: boolean) => (updateMainWindow.value = value),\n    updateFirst_round: (value: boolean) => (first_round.value = value),\n    updateLandScaped: (value: boolean) => (landScaped.value = value),\n    updateLock_screen: (value: boolean) => (lock_screen.value = value),\n    updateScreenId: (value: string) => (screenId.value = value),\n    updateAllVideoStreams: (value: (Participant | Stream)[]) => (allVideoStreams.value = value),\n    updateNewLimitedStreams: (value: (Participant | Stream)[]) => (newLimitedStreams.value = value),\n    updateNewLimitedStreamsIDs: (value: string[]) => (newLimitedStreamsIDs.value = value),\n    updateActiveSounds: (value: string[]) => (activeSounds.value = value),\n    updateScreenShareIDStream: (value: string) => (screenShareIDStream.value = value),\n    updateScreenShareNameStream: (value: string) => (screenShareNameStream.value = value),\n    updateAdminIDStream: (value: string) => (adminIDStream.value = value),\n    updateAdminNameStream: (value: string) => (adminNameStream.value = value),\n    updateYouYouStream: (value: (Participant | Stream)[]) => (youYouStream.value = value),\n    updateYouYouStreamIDs: (value: string[]) => (youYouStreamIDs.value = value),\n    updateLocalStream: (value: MediaStream | null) => (localStream.value = value),\n    updateRecordStarted: (value: boolean) => (recordStarted.value = value),\n    updateRecordResumed: (value: boolean) => (recordResumed.value = value),\n    updateRecordPaused: (value: boolean) => (recordPaused.value = value),\n    updateRecordStopped: (value: boolean) => (recordStopped.value = value),\n    updateAdminRestrictSetting: (value: boolean) => (adminRestrictSetting.value = value),\n    updateVideoRequestState: (value: string | null) => (videoRequestState.value = value),\n    updateVideoRequestTime: (value: number) => (videoRequestTime.value = value),\n    updateVideoAction: (value: boolean) => (videoAction.value = value),\n    updateLocalStreamVideo: (value: MediaStream | null) => (localStreamVideo.value = value),\n    updateUserDefaultVideoInputDevice: (value: string) => (userDefaultVideoInputDevice.value = value),\n    updateCurrentFacingMode: (value: string) => (currentFacingMode.value = value),\n    updatePrevFacingMode: (value: string) => (prevFacingMode.value = value),\n    updateDefVideoID: (value: string) => (defVideoID.value = value),\n    updateAllowed: (value: boolean) => (allowed.value = value),\n    updateDispActiveNames: (value: string[]) => (dispActiveNames.value = value),\n    updateP_dispActiveNames: (value: string[]) => (p_dispActiveNames.value = value),\n    updateActiveNames: (value: string[]) => (activeNames.value = value),\n    updatePrevActiveNames: (value: string[]) => (prevActiveNames.value = value),\n    updateP_activeNames: (value: string[]) => (p_activeNames.value = value),\n    updateMembersReceived: (value: boolean) => (membersReceived.value = value),\n    updateDeferScreenReceived: (value: boolean) => (deferScreenReceived.value = value),\n    updateHostFirstSwitch: (value: boolean) => (hostFirstSwitch.value = value),\n    updateMicAction: (value: boolean) => (micAction.value = value),\n    updateScreenAction: (value: boolean) => (screenAction.value = value),\n    updateChatAction: (value: boolean) => (chatAction.value = value),\n    updateAudioRequestState: (value: string | null) => (audioRequestState.value = value),\n    updateScreenRequestState: (value: string | null) => (screenRequestState.value = value),\n    updateChatRequestState: (value: string | null) => (chatRequestState.value = value),\n    updateAudioRequestTime: (value: number) => (audioRequestTime.value = value),\n    updateScreenRequestTime: (value: number) => (screenRequestTime.value = value),\n    updateChatRequestTime: (value: number) => (chatRequestTime.value = value),\n    updateOldSoundIds: (value: string[]) => (oldSoundIds.value = value),\n    updatehostLabel: (value: string) => (hostLabel.value = value),\n    updateMainScreenFilled: (value: boolean) => (mainScreenFilled.value = value),\n    updateLocalStreamScreen: (value: MediaStream | null) => (localStreamScreen.value = value),\n    updateScreenAlreadyOn: (value: boolean) => (screenAlreadyOn.value = value),\n    updateChatAlreadyOn: (value: boolean) => (chatAlreadyOn.value = value),\n    updateRedirectURL: (value: string) => (redirectURL.value = value),\n    updateOldAllStreams: (value: (Participant | Stream)[]) => (oldAllStreams.value = value),\n    updateAdminVidID: (value: string) => (adminVidID.value = value),\n    updateStreamNames: (value: Stream[]) => (streamNames.value = value),\n    updateNon_alVideoStreams: (value: Participant[]) => (non_alVideoStreams.value = value),\n    updateSortAudioLoudness: (value: boolean) => (sortAudioLoudness.value = value),\n    updateAudioDecibels: (value: AudioDecibels[]) => (audioDecibels.value = value),\n    updateMixed_alVideoStreams: (value: (Participant | Stream)[]) => (mixed_alVideoStreams.value = value),\n    updateNon_alVideoStreams_muted: (value: Participant[]) => (non_alVideoStreams_muted.value = value),\n    updatePaginatedStreams: (value: (Participant | Stream)[][]) => (paginatedStreams.value = value),\n    updateLocalStreamAudio: (value: MediaStream | null) => (localStreamAudio.value = value),\n    updateDefAudioID: (value: string) => (defAudioID.value = value),\n    updateUserDefaultAudioInputDevice: (value: string) => (userDefaultAudioInputDevice.value = value),\n    updateUserDefaultAudioOutputDevice: (value: string) => (userDefaultAudioOutputDevice.value = value),\n    updatePrevAudioInputDevice: (value: string) => (prevAudioInputDevice.value = value),\n    updatePrevVideoInputDevice: (value: string) => (prevVideoInputDevice.value = value),\n    updateAudioPaused: (value: boolean) => (audioPaused.value = value),\n    updateMainScreenPerson: (value: string) => (mainScreenPerson.value = value),\n    updateAdminOnMainScreen: (value: boolean) => (adminOnMainScreen.value = value),\n    updateScreenStates: (value: ScreenState[]) => (screenStates.value = value),\n    updatePrevScreenStates: (value: ScreenState[]) => (prevScreenStates.value = value),\n    updateUpdateDateState: (value: number | null) => (updateDateState.value = value),\n    updateLastUpdate: (value: number | null) => (lastUpdate.value = value),\n    updateNForReadjustRecord: (value: number) => (nForReadjustRecord.value = value),\n    updateFixedPageLimit: (value: number) => (fixedPageLimit.value = value),\n    updateRemoveAltGrid: (value: boolean) => (removeAltGrid.value = value),\n    updateNForReadjust: (value: number) => (nForReadjust.value = value),\n    updateLastReorderTime: (value: number) => (lastReorderTime.value = value),\n    updateAudStreamNames: (value: Stream[]) => (audStreamNames.value = value),\n    updateCurrentUserPage: (value: number) => (currentUserPage.value = value),\n    updateMainHeightWidth: (value: number) => (mainHeightWidth.value = value),\n    updatePrevMainHeightWidth: (value: number) => (prevMainHeightWidth.value = value),\n    updatePrevDoPaginate: (value: boolean) => (prevDoPaginate.value = value),\n    updateDoPaginate: (value: boolean) => (doPaginate.value = value),\n    updateShareEnded: (value: boolean) => (shareEnded.value = value),\n    updateLStreams: (value: (Participant | Stream)[]) => (lStreams.value = value),\n    updateChatRefStreams: (value: (Participant | Stream)[]) => (chatRefStreams.value = value),\n    updateControlHeight: (value: number) => (controlHeight.value = value),\n    updateIsWideScreen,\n    updateIsMediumScreen,\n    updateIsSmallScreen,\n    updateAddGrid: (value: boolean) => (addGrid.value = value),\n    updateAddAltGrid: (value: boolean) => (addAltGrid.value = value),\n    updateGridRows: (value: number) => (gridRows.value = value),\n    updateGridCols: (value: number) => (gridCols.value = value),\n    updateAltGridRows: (value: number) => (altGridRows.value = value),\n    updateAltGridCols: (value: number) => (altGridCols.value = value),\n    updateNumberPages: (value: number) => (numberPages.value = value),\n    updateCurrentStreams: (value: (Participant | Stream)[]) => (currentStreams.value = value),\n    updateShowMiniView: (value: boolean) => (showMiniView.value = value),\n    updateNStream: (value: MediaStream | null) => (nStream.value = value),\n    updateDefer_receive: (value: boolean) => (defer_receive.value = value),\n    updateAllAudioStreams: (value: (Participant | Stream)[]) => (allAudioStreams.value = value),\n    updateRemoteScreenStream: (value: Stream[]) => (remoteScreenStream.value = value),\n    updateScreenProducer: (value: Producer | null) => (screenProducer.value = value),\n    updateLocalScreenProducer: (value: Producer | null) => (localScreenProducer.value = value),\n    updateGotAllVids: (value: boolean) => (gotAllVids.value = value),\n    updatePaginationHeightWidth: (value: number) => (paginationHeightWidth.value = value),\n    updatePaginationDirection: (value: 'horizontal' | 'vertical') => (paginationDirection.value = value),\n    updateGridSizes: (value: GridSizes) => (gridSizes.value = value),\n    updateScreenForceFullDisplay: (value: boolean) => (screenForceFullDisplay.value = value),\n    updateMainGridStream: (value: RenderableListSource | null | undefined) => {\n      mainGridStreamRaw.value = Array.isArray(value)\n        ? (value as RenderableListSource)\n        : ([] as RenderableListSource);\n    },\n    updateOtherGridStreams: (value: RenderableGridSource | null | undefined) => {\n      otherGridStreams.value = Array.isArray(value)\n        ? prepareRenderableGrid(value as RenderableGridSource)\n        : emptyRenderableGrid();\n    },\n    updateAudioOnlyStreams: (value: RenderableListSource | null | undefined) => {\n      audioOnlyStreams.value = Array.isArray(value)\n        ? prepareRenderableList(value as RenderableListSource)\n        : emptyRenderableList();\n    },\n    updateVideoInputs: (value: MediaDeviceInfo[]) => (videoInputs.value = value),\n    updateAudioInputs: (value: MediaDeviceInfo[]) => (audioInputs.value = value),\n    updateMeetingProgressTime: (value: string) => (meetingProgressTime.value = value),\n    updateMeetingElapsedTime: (value: number) => (meetingElapsedTime.value = value),\n    updateRef_participants: (value: Participant[]) => (ref_participants.value = value),\n    updateMessages: (value: Message[]) => (messages.value = value),\n    updateStartDirectMessage,\n    updateDirectMessageDetails,\n    updateShowMessagesBadge: (value: boolean) => (showMessagesBadge.value = value),\n    updateAudioSetting,\n    updateVideoSetting,\n    updateScreenshareSetting,\n    updateChatSetting,\n    updateDisplayOption: (value: string) => (displayOption.value = value),\n    updateAutoWave: (value: boolean) => (autoWave.value = value),\n    updateForceFullDisplay: (value: boolean) => (forceFullDisplay.value = value),\n    updatePrevForceFullDisplay: (value: boolean) => (prevForceFullDisplay.value = value),\n    updatePrevMeetingDisplayType: (value: string) => (prevMeetingDisplayType.value = value),\n    updateWaitingRoomFilter: (value: string) => (waitingRoomFilter.value = value),\n    updateWaitingRoomList,\n    updateWaitingRoomCounter: (value: number) => (waitingRoomCounter.value = value),\n    updateRequestFilter,\n    updateRequestList,\n    updateRequestCounter,\n    updateTotalReqWait: (value: number) => (totalReqWait.value = value),\n    updateIsMenuModalVisible,\n    updateIsRecordingModalVisible,\n    updateIsSettingsModalVisible,\n    updateIsRequestsModalVisible,\n    updateIsWaitingModalVisible,\n    updateIsCoHostModalVisible,\n    updateIsMediaSettingsModalVisible,\n    updateIsDisplaySettingsModalVisible,\n    updateIsParticipantsModalVisible,\n    updateIsMessagesModalVisible,\n    updateIsConfirmExitModalVisible,\n    updateIsConfirmHereModalVisible,\n    updateIsLoadingModalVisible,\n    updateRecordingMediaOptions: (value: string) => {\n      recordingMediaOptions.value = value;\n      clearedToRecord.value = false;\n    },\n    updateRecordingAudioOptions: (value: string) => {\n      recordingAudioOptions.value = value;\n      clearedToRecord.value = false;\n    },\n    updateRecordingVideoOptions: (value: string) => {\n      recordingVideoOptions.value = value;\n      clearedToRecord.value = false;\n    },\n    updateRecordingVideoType: (value: string) => {\n      recordingVideoType.value = value;\n      clearedToRecord.value = false;\n    },\n    updateRecordingVideoOptimized: (value: boolean) => {\n      recordingVideoOptimized.value = value;\n      clearedToRecord.value = false;\n    },\n    updateRecordingDisplayType: (value: 'media' | 'video' | 'all') => {\n      recordingDisplayType.value = value;\n      clearedToRecord.value = false;\n    },\n    updateRecordingAddHLS: (value: boolean) => {\n      recordingAddHLS.value = value;\n      clearedToRecord.value = false;\n    },\n    updateRecordingAddText: (value: boolean) => {\n      recordingAddText.value = value;\n      clearedToRecord.value = false;\n    },\n    updateRecordingCustomText: (value: string) => {\n      recordingCustomText.value = value;\n      clearedToRecord.value = false;\n    },\n    updateRecordingCustomTextPosition: (value: string) => {\n      recordingCustomTextPosition.value = value;\n      clearedToRecord.value = false;\n    },\n    updateRecordingCustomTextColor: (value: string) => {\n      recordingCustomTextColor.value = value;\n      clearedToRecord.value = false;\n    },\n    updateRecordingNameTags: (value: boolean) => {\n      recordingNameTags.value = value;\n      clearedToRecord.value = false;\n    },\n    updateRecordingBackgroundColor: (value: string) => {\n      recordingBackgroundColor.value = value;\n      clearedToRecord.value = false;\n    },\n    updateRecordingNameTagsColor: (value: string) => {\n      recordingNameTagsColor.value = value;\n      clearedToRecord.value = false;\n    },\n    updateRecordingOrientationVideo: (value: string) => {\n      recordingOrientationVideo.value = value;\n      clearedToRecord.value = false;\n    },\n    updateClearedToResume: (value: boolean) => (clearedToResume.value = value),\n    updateClearedToRecord: (value: boolean) => (clearedToRecord.value = value),\n    updateRecordState: (value: string) => (recordState.value = value),\n    updateShowRecordButtons: (value: boolean) => (showRecordButtons.value = value),\n    updateRecordingProgressTime: (value: string) => (recordingProgressTime.value = value),\n    updateAudioSwitching: (value: boolean) => (audioSwitching.value = value),\n    updateVideoSwitching: (value: boolean) => (videoSwitching.value = value),\n    updateVideoAlreadyOn: (value: boolean) => {\n      videoAlreadyOn.value = value;\n      videoActive.value = value;\n    },\n    updateAudioAlreadyOn: (value: boolean) => {\n      audioAlreadyOn.value = value;\n      micActive.value = value;\n    },\n    updateComponentSizes,\n    updateHasCameraPermission: (value: boolean) => (hasCameraPermission.value = value),\n    updateHasAudioPermission: (value: boolean) => (hasAudioPermission.value = value),\n    updateTransportCreated: (value: boolean) => (transportCreated.value = value),\n    updateLocalTransportCreated: (value: boolean) => (localTransportCreated.value = value),\n    updateTransportCreatedVideo: (value: boolean) => (transportCreatedVideo.value = value),\n    updateTransportCreatedAudio: (value: boolean) => (transportCreatedAudio.value = value),\n    updateTransportCreatedScreen: (value: boolean) => (transportCreatedScreen.value = value),\n    updateProducerTransport: (value: Transport | null) => (producerTransport.value = value),\n    updateLocalProducerTransport: (value: Transport | null) => (localProducerTransport.value = value),\n    updateVideoProducer: (value: Producer | null) => (videoProducer.value = value),\n    updateLocalVideoProducer: (value: Producer | null) => (localVideoProducer.value = value),\n    updateParams: (value: ProducerOptions) => (params.value = value),\n    updateVideoParams: (value: ProducerOptions) => (videoParams.value = value),\n    updateAudioParams: (value: ProducerOptions) => (audioParams.value = value),\n    updateAudioProducer: (value: Producer | null) => (audioProducer.value = value),\n    updateAudioLevel: (value: number) => (audioLevel.value = value),\n    updateLocalAudioProducer: (value: Producer | null) => (localAudioProducer.value = value),\n    updateConsumerTransports: (value: TransportType[]) => (consumerTransports.value = value),\n    updateConsumingTransports: (value: string[]) => (consumingTransports.value = value),\n    updatePolls: (value: Poll[]) => (polls.value = value),\n    updatePoll: (value: Poll | null) => (poll.value = value),\n    updateIsPollModalVisible,\n    updateCustomImage: (value: string) => (customImage.value = value),\n    updateSelectedImage: (value: string) => (selectedImage.value = value),\n    updateSegmentVideo: (value: MediaStream | null) => (segmentVideo.value = value),\n    updateSelfieSegmentation: (value: SelfieSegmentation | null) => (selfieSegmentation.value = value),\n    updatePauseSegmentation: (value: boolean) => (pauseSegmentation.value = value),\n    updateProcessedStream: (value: MediaStream | null) => (processedStream.value = value),\n    updateKeepBackground: (value: boolean) => (keepBackground.value = value),\n    updateBackgroundHasChanged: (value: boolean) => (backgroundHasChanged.value = value),\n    updateVirtualStream: (value: MediaStream | null) => (virtualStream.value = value),\n    updateMainCanvas: (value: HTMLCanvasElement | null) => (mainCanvas.value = value),\n    updatePrevKeepBackground: (value: boolean) => (prevKeepBackground.value = value),\n    updateAppliedBackground: (value: boolean) => (appliedBackground.value = value),\n    updateIsBackgroundModalVisible,\n    updateAutoClickBackground: (value: boolean) => (autoClickBackground.value = value),\n    updateBreakoutRooms: (value: BreakoutParticipant[][]) => (breakoutRooms.value = value),\n    updateCurrentRoomIndex: (value: number) => (currentRoomIndex.value = value),\n    updateCanStartBreakout: (value: boolean) => (canStartBreakout.value = value),\n    updateBreakOutRoomStarted: (value: boolean) => (breakOutRoomStarted.value = value),\n    updateBreakOutRoomEnded: (value: boolean) => (breakOutRoomEnded.value = value),\n    updateHostNewRoom: (value: number) => (hostNewRoom.value = value),\n    updateLimitedBreakRoom: (value: BreakoutParticipant[]) => (limitedBreakRoom.value = value),\n    updateMainRoomsLength: (value: number) => (mainRoomsLength.value = value),\n    updateMemberRoom: (value: number) => (memberRoom.value = value),\n    updateIsBreakoutRoomsModalVisible,\n    updateWhiteboardUsers: (value: WhiteboardUser[]) => (whiteboardUsers.value = value),\n    updateCurrentWhiteboardIndex: (value: number | null) => (currentWhiteboardIndex.value = value),\n    updateCanStartWhiteboard: (value: boolean) => (canStartWhiteboard.value = value),\n    updateWhiteboardStarted: (value: boolean) => (whiteboardStarted.value = value),\n    updateWhiteboardEnded: (value: boolean) => (whiteboardEnded.value = value),\n    updateWhiteboardLimit: (value: number) => (whiteboardLimit.value = value),\n    updateIsWhiteboardModalVisible: (value: boolean) => (isWhiteboardModalVisible.value = value),\n    updateIsConfigureWhiteboardModalVisible,\n    updateShapes: updateShapesValue,\n    updateUseImageBackground: (value: boolean) => (useImageBackground.value = value),\n    updateRedoStack: updateRedoStackValue,\n    updateUndoStack: (value: string[]) => (undoStack.value = value),\n    updateCanvasStream: (value: MediaStream | null) => (canvasStream.value = value),\n    updateCanvasWhiteboard: (value: HTMLCanvasElement | null) => (canvasWhiteboard.value = value),\n    updateCanvasScreenboard: (value: HTMLCanvasElement | null) => (canvasScreenboard.value = value),\n    updateProcessedScreenStream: (value: MediaStream | null) => (processedScreenStream.value = value),\n    updateAnnotateScreenStream: (value: boolean) => (annotateScreenStream.value = value),\n    updateMainScreenCanvas: (value: HTMLCanvasElement | null) => (mainScreenCanvas.value = value),\n    updateIsScreenboardModalVisible,\n    checkOrientation,\n    updateDevice: (value: Device | null) => (device.value = value),\n    updateSocket: (value: MediaSFUSocket) => (socket.value = value),\n    updateLocalSocket: (value: MediaSFUSocket | null) => (localSocket.value = value),\n    updateValidated: (value: boolean) => (validated.value = value),\n    showAlert,\n    getUpdatedAllParams,\n    videoCardComponent: VideoCardComponentOverride.value as typeof VideoCard,\n    audioCardComponent: AudioCardComponentOverride.value as typeof AudioCard,\n    miniCardComponent: MiniCardComponentOverride.value as typeof MiniCard,\n    miniAudioComponent: MiniAudioComponentOverride.value as typeof MiniAudio,\n    miniAudioPlayerComponent: MiniAudioPlayerComponent.value as typeof MiniAudioPlayer,\n    customVideoCard: customVideoCardRenderer.value,\n    customAudioCard: customAudioCardRenderer.value,\n    customMiniCard: customMiniCardRenderer.value,\n    customPreJoinPage: customPreJoinPageRenderer.value,\n    customComponent: customComponentRenderer.value,\n  };\n};\n\n// Computed property for all parameters\nconst allParameters = computed(() => ({\n  ...getAllParams(),\n  ...mediaSFUFunctions(),\n}));\n\n// Helper function to cast parameters for external methods  \n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nconst getCastedParameters = (): any => allParameters.value;\n\nconst whiteboardParameters = computed<WhiteboardComponentParameters>(() => {\n  const params = allParameters.value as unknown as WhiteboardComponentParameters;\n\n  return {\n    ...params,\n    showAlert: ({ message, type }: { message: string; type: string }) => showAlert({ message, type }),\n    shapes: convertSharedShapesToWhiteboard(shapes.value),\n    redoStack: convertSharedShapesToWhiteboard(redoStack.value),\n    updateShapes: (value: WhiteboardShape[]) => updateShapesValue(value),\n    updateRedoStack: (value: WhiteboardShape[]) => updateRedoStackValue(value),\n  };\n});\n\n// Utility functions\nconst getMediaDevicesList = async (kind: 'videoinput' | 'audioinput') => {\n  // Get the list of available media devices\n  try {\n    const devices = await mediaDevices.enumerateDevices();\n    const filtered = devices.filter((device: MediaDeviceInfo) => device.kind === kind);\n    return filtered;\n  } catch {\n    return [];\n  }\n};\n\nconst getParticipantMedia = async (id: string = '', name: string, kind: string = 'video') => {\n  // Get the media stream of a participant by id or name\n  try {\n    let stream = null;\n\n    if (id && id !== '') {\n      if (kind === 'video') {\n        const videoStreamObj = (allVideoStreams.value as (Participant | Stream)[]).find(\n          (obj) => 'producerId' in obj && obj.producerId === id\n        );\n        if (videoStreamObj && 'stream' in videoStreamObj) {\n          stream = videoStreamObj.stream;\n        }\n      } else if (kind === 'audio') {\n        const audioStreamObj = (allAudioStreams.value as (Participant | Stream)[]).find(\n          (obj) => 'producerId' in obj && obj.producerId === id\n        );\n        if (audioStreamObj && 'stream' in audioStreamObj) {\n          stream = audioStreamObj.stream;\n        }\n      }\n    } else if (name && name !== '') {\n      const participant = participants.value.find((part: Participant) => part.name === name);\n      if (participant) {\n        const participantId = participant.id;\n        if (kind === 'video') {\n          const videoStreamObj = (allVideoStreams.value as (Participant | Stream)[]).find(\n            (obj) => 'producerId' in obj && obj.producerId === participantId\n          );\n          if (videoStreamObj && 'stream' in videoStreamObj) {\n            stream = videoStreamObj.stream;\n          }\n        } else if (kind === 'audio') {\n          const audioStreamObj = (allAudioStreams.value as (Participant | Stream)[]).find(\n            (obj) => 'producerId' in obj && obj.producerId === participantId\n          );\n          if (audioStreamObj && 'stream' in audioStreamObj) {\n            stream = audioStreamObj.stream;\n          }\n        }\n      }\n    }\n\n    return stream;\n  } catch {\n    return null;\n  }\n};\n\nconst computeDimensionsMethod = ({\n  containerWidthFraction = 1,\n  containerHeightFraction = 1,\n  mainSize,\n  doStack = true,\n  defaultFraction,\n}: {\n  containerWidthFraction?: number;\n  containerHeightFraction?: number;\n  mainSize: number;\n  doStack?: boolean;\n  defaultFraction: number;\n}): ComponentSizes => {\n  const parentWidth = window.innerWidth * containerWidthFraction;\n  const parentHeight = window.innerHeight * containerHeightFraction * defaultFraction;\n  let isWideScreen_ = parentWidth >= 768;\n  if (!isWideScreen_ && parentWidth > 1.5 * parentHeight) {\n    isWideScreen_ = true;\n  }\n\n  isWideScreen.value = isWideScreen_;\n\n  const computeDimensions = (): ComponentSizes => {\n    if (doStack) {\n      return isWideScreen_\n        ? {\n            mainHeight: parentHeight,\n            otherHeight: parentHeight,\n            mainWidth: Math.floor((mainSize / 100) * parentWidth),\n            otherWidth: Math.floor(((100 - mainSize) / 100) * parentWidth),\n          }\n        : {\n            mainHeight: Math.floor((mainSize / 100) * parentHeight),\n            otherHeight: Math.floor(((100 - mainSize) / 100) * parentHeight),\n            mainWidth: parentWidth,\n            otherWidth: parentWidth,\n          };\n    } else {\n      return {\n        mainHeight: parentHeight,\n        otherHeight: parentHeight,\n        mainWidth: parentWidth,\n        otherWidth: parentWidth,\n      };\n    }\n  };\n\n  return computeDimensions();\n};\n\nconst applyComponentSizes = (defaultFraction: number) => {\n  if (eventType.value === 'chat' && mainHeightWidth.value > 0) {\n    mainHeightWidth.value = 0;\n  }\n  if (eventType.value === 'broadcast' && mainHeightWidth.value !== 100) {\n    mainHeightWidth.value = 100;\n  }\n\n  const { mainHeight, otherHeight, mainWidth, otherWidth } = computeDimensionsMethod({\n    containerWidthFraction: 1,\n    containerHeightFraction: 1,\n    mainSize: eventType.value === 'chat' ? 0 : eventType.value === 'broadcast' ? 100 : mainHeightWidth.value,\n    doStack: true,\n    defaultFraction,\n  });\n\n  componentSizes.value = {\n    mainHeight,\n    otherHeight,\n    mainWidth,\n    otherWidth,\n  };\n\n  const orientation = checkOrientation();\n  if (\n    orientation === 'portrait' &&\n    !isWideScreen.value &&\n    (shareScreenStarted.value || shared.value)\n  ) {\n    screenForceFullDisplay.value = true;\n  }\n};\n\nconst handleResize = async () => {\n  let fraction = 0.0;\n\n  if (eventType.value === 'webinar' || eventType.value === 'conference') {\n    const currentHeight = window.innerHeight;\n    fraction = Number((40 / currentHeight).toFixed(3));\n    if (fraction !== controlHeight.value) {\n      controlHeight.value = fraction;\n    }\n  } else {\n    const currentHeight = window.innerHeight;\n    fraction = Number((40 / currentHeight).toFixed(3));\n    if (fraction !== controlHeight.value) {\n      controlHeight.value = fraction;\n    }\n  }\n\n  const defaultFraction =\n    eventType.value === 'webinar' || eventType.value === 'conference' ? 1 - fraction : 1;\n\n  applyComponentSizes(defaultFraction);\n\n  // Updates the main grid view\n  await prepopulateUserMedia({\n    name: hostLabel.value,\n    parameters: getCastedParameters(),\n  });\n\n  // Updates the mini grid view\n  await onScreenChanges({\n    changed: true,\n    parameters: getCastedParameters(),\n  });\n};\n\nconst onResize = () => {\n  scheduleResize();\n};\n\nconst updateStatesToInitialValues = async () => {\n  const initialValues = initialValuesState as unknown as Record<string, unknown>;\n  const allParams = getAllParams() as unknown as Record<string, (value: unknown) => void>;\n\n  for (const key in initialValues) {\n    if (Object.prototype.hasOwnProperty.call(initialValues, key)) {\n      const updateFunctionName = `update${key.charAt(0).toUpperCase() + key.slice(1)}`;\n      const updateFunction = allParams[updateFunctionName];\n\n      if (typeof updateFunction === 'function') {\n        try {\n          updateFunction(initialValues[key]);\n        } catch {\n          // Do nothing\n        }\n      }\n    }\n  }\n};\n\n// Control button configurations (framework-agnostic)\nconst recordButton = computed<ControlButtonTouch[]>(() => [\n  {\n    icon: faRecordVinyl,\n    text: 'Record',\n    onPress: () => {\n      launchRecording({\n        updateIsRecordingModalVisible,\n        isRecordingModalVisible: isRecordingModalVisible.value,\n        showAlert,\n        stopLaunchRecord: stopLaunchRecord.value,\n        canLaunchRecord: canLaunchRecord.value,\n        recordingAudioSupport: recordingAudioSupport.value,\n        recordingVideoSupport: recordingVideoSupport.value,\n        updateCanRecord: (value: boolean) => (canRecord.value = value),\n        updateClearedToRecord: (value: boolean) => (clearedToRecord.value = value),\n        recordStarted: recordStarted.value,\n        recordPaused: recordPaused.value,\n        localUIMode: props.useLocalUIMode,\n      });\n    },\n    activeColor: 'black',\n    inActiveColor: 'black',\n    show: true,\n  },\n]);\n\nconst recordButtons = computed<ControlButtonTouch[]>(() => [\n  {\n    icon: faPlayCircle,\n    active: recordPaused.value === false,\n    onPress: () => {\n      updateRecording({\n  parameters: getCastedParameters(),\n      });\n    },\n    activeColor: 'black',\n    inActiveColor: 'black',\n    alternateIcon: faPauseCircle,\n    show: true,\n  },\n  {\n    icon: faStopCircle,\n    active: false,\n    onPress: () => {\n      stopRecording({\n  parameters: getCastedParameters(),\n      });\n    },\n    activeColor: 'green',\n    inActiveColor: 'black',\n    show: true,\n  },\n  {\n    customComponent: () =>\n      h(\n        'div',\n        {\n          style: {\n            backgroundColor: 'transparent',\n            borderWidth: 0,\n            padding: 0,\n            margin: 2,\n          },\n        },\n        h(\n          'span',\n          {\n            style: {\n              backgroundColor: 'transparent',\n              borderWidth: 0,\n              padding: 0,\n              margin: 0,\n            },\n          },\n          recordingProgressTime.value\n        )\n      ),\n    show: true,\n  },\n  {\n    icon: faDotCircle,\n    active: false,\n    onPress: () => console.log('Status pressed'),\n    activeColor: 'black',\n    inActiveColor: recordPaused.value === false ? 'red' : 'yellow',\n    show: true,\n  },\n  {\n    icon: faCog,\n    active: false,\n    onPress: () => {\n      launchRecording({\n        updateIsRecordingModalVisible,\n        isRecordingModalVisible: isRecordingModalVisible.value,\n        showAlert,\n        stopLaunchRecord: stopLaunchRecord.value,\n        canLaunchRecord: canLaunchRecord.value,\n        recordingAudioSupport: recordingAudioSupport.value,\n        recordingVideoSupport: recordingVideoSupport.value,\n        updateCanRecord: (value: boolean) => (canRecord.value = value),\n        updateClearedToRecord: (value: boolean) => (clearedToRecord.value = value),\n        recordStarted: recordStarted.value,\n        recordPaused: recordPaused.value,\n        localUIMode: props.useLocalUIMode,\n      });\n    },\n    activeColor: 'green',\n    inActiveColor: 'black',\n    show: true,\n  },\n]);\n\nconst customMenuButtons = computed<MenuCustomButton[]>(() => [\n  {\n    icon: faRecordVinyl,\n    text: 'Record',\n    action: () => {\n      launchRecording({\n        updateIsRecordingModalVisible,\n        isRecordingModalVisible: isRecordingModalVisible.value,\n        showAlert,\n        stopLaunchRecord: stopLaunchRecord.value,\n        canLaunchRecord: canLaunchRecord.value,\n        recordingAudioSupport: recordingAudioSupport.value,\n        recordingVideoSupport: recordingVideoSupport.value,\n        updateCanRecord: (value: boolean) => (canRecord.value = value),\n        updateClearedToRecord: (value: boolean) => (clearedToRecord.value = value),\n        recordStarted: recordStarted.value,\n        recordPaused: recordPaused.value,\n        localUIMode: props.useLocalUIMode,\n      });\n    },\n    show: !showRecordButtons.value && islevel.value === '2',\n  },\n  {\n    customComponent: () =>\n      h(menuButtonsRendererComponent.value, {\n        buttons: recordButtons.value,\n        direction: 'horizontal',\n        showAspect: true,\n      }),\n    show: showRecordButtons.value && islevel.value === '2',\n    action: () => {\n      console.log('record buttons pressed');\n    },\n  },\n  {\n    icon: faCog,\n    text: 'Event Settings',\n    action: () => {\n      launchSettings({\n        updateIsSettingsModalVisible,\n        isSettingsModalVisible: isSettingsModalVisible.value,\n      });\n    },\n    show: islevel.value === '2',\n  },\n  {\n    icon: faUsers,\n    text: 'Requests',\n    action: () => {\n      launchRequests({\n        updateIsRequestsModalVisible,\n        isRequestsModalVisible: isRequestsModalVisible.value,\n      });\n    },\n    show:\n      islevel.value === '2' ||\n      (coHostResponsibility.value &&\n        coHost.value &&\n        coHost.value === member.value &&\n        !!coHostResponsibility.value.find((item) => item.name === 'media')!.value === true) ||\n      false,\n  },\n  {\n    icon: faClock,\n    text: 'Waiting',\n    action: () => {\n      launchWaiting({\n        updateIsWaitingModalVisible,\n        isWaitingModalVisible: isWaitingModalVisible.value,\n      });\n    },\n    show:\n      islevel.value === '2' ||\n      (coHostResponsibility.value &&\n        coHost.value &&\n        coHost.value === member.value &&\n        !!coHostResponsibility.value.find((item) => item.name === 'waiting')!.value === true) ||\n      false,\n  },\n  {\n    icon: faUserPlus,\n    text: 'Co-host',\n    action: () => {\n      launchCoHost({\n        updateIsCoHostModalVisible,\n        isCoHostModalVisible: isCoHostModalVisible.value,\n      });\n    },\n    show: islevel.value === '2',\n  },\n  {\n    icon: faTools,\n    text: 'Set Media',\n    action: () => {\n      launchMediaSettings({\n        updateIsMediaSettingsModalVisible,\n        isMediaSettingsModalVisible: isMediaSettingsModalVisible.value,\n        audioInputs: audioInputs.value,\n        videoInputs: videoInputs.value,\n        updateAudioInputs: (value: MediaDeviceInfo[]) => (audioInputs.value = value),\n        updateVideoInputs: (value: MediaDeviceInfo[]) => (videoInputs.value = value),\n        mediaDevices,\n      });\n    },\n    show: true,\n  },\n  {\n    icon: faDesktop,\n    text: 'Display',\n    action: () => {\n      launchDisplaySettings({\n        updateIsDisplaySettingsModalVisible,\n        isDisplaySettingsModalVisible: isDisplaySettingsModalVisible.value,\n      });\n    },\n    show: true,\n  },\n  {\n    icon: faPoll,\n    text: 'Poll',\n    action: () => {\n      launchPoll({\n        updateIsPollModalVisible,\n        isPollModalVisible: isPollModalVisible.value,\n      });\n    },\n    show: true,\n  },\n  {\n    icon: faUserFriends,\n    text: 'Breakout Rooms',\n    action: () => {\n      launchBreakoutRooms({\n        updateIsBreakoutRoomsModalVisible,\n        isBreakoutRoomsModalVisible: isBreakoutRoomsModalVisible.value,\n      });\n    },\n    show: islevel.value === '2',\n  },\n  {\n    icon: faChalkboardTeacher,\n    text: 'Whiteboard',\n    action: () => {\n      launchConfigureWhiteboard({\n        updateIsConfigureWhiteboardModalVisible,\n        isConfigureWhiteboardModalVisible: isConfigureWhiteboardModalVisible.value,\n      });\n    },\n    show: islevel.value === '2',\n  },\n]);\n\nconst controlBroadcastButtons = computed<ControlButtonTouch[]>(() => [\n  {\n    icon: faUsers,\n    active: true,\n    alternateIcon: faUsers,\n    onPress: () => {\n      launchParticipants({\n        updateIsParticipantsModalVisible,\n        isParticipantsModalVisible: isParticipantsModalVisible.value,\n      });\n    },\n    activeColor: 'black',\n    inActiveColor: 'black',\n    show: islevel.value === '2',\n  },\n  {\n    icon: faShareAlt,\n    active: true,\n    alternateIcon: faShareAlt,\n    onPress: () => updateIsShareEventModalVisible(!isShareEventModalVisible.value),\n    activeColor: 'black',\n    inActiveColor: 'black',\n    show: true,\n  },\n  {\n    customComponent: () =>\n      h('div', { style: { position: 'relative' } }, [\n        h(FontAwesomeIcon, { icon: faComments, size: 'lg', color: 'black' }),\n        showMessagesBadge.value &&\n          h(\n            'div',\n            {\n              style: {\n                position: 'absolute',\n                top: '-2px',\n                right: '-2px',\n                display: 'flex',\n                alignItems: 'center',\n                justifyContent: 'center',\n              },\n            },\n            h(\n              'div',\n              {\n                style: {\n                  backgroundColor: 'red',\n                  borderRadius: '12px',\n                  padding: '4px',\n                },\n              },\n              h('span', { style: { color: 'white', fontSize: '12px', fontWeight: 'bold' } })\n            )\n          ),\n      ]),\n    onPress: () =>\n      launchMessages({\n        updateIsMessagesModalVisible,\n        isMessagesModalVisible: isMessagesModalVisible.value,\n      }),\n    show: true,\n  },\n  {\n    icon: faSync,\n    active: true,\n    alternateIcon: faSync,\n    onPress: () =>\n      switchVideoAlt({\n  parameters: getCastedParameters(),\n      }),\n    activeColor: 'black',\n    inActiveColor: 'black',\n    show: islevel.value === '2',\n  },\n  {\n    icon: faVideoSlash,\n    alternateIcon: faVideo,\n    active: videoActive.value,\n    onPress: () =>\n      clickVideo({\n  parameters: getCastedParameters(),\n      }),\n    show: islevel.value === '2',\n    activeColor: 'green',\n    inActiveColor: 'red',\n  },\n  {\n    icon: faMicrophoneSlash,\n    alternateIcon: faMicrophone,\n    active: micActive.value,\n    onPress: () =>\n      clickAudio({\n  parameters: getCastedParameters(),\n      }),\n    activeColor: 'green',\n    inActiveColor: 'red',\n    show: islevel.value === '2',\n  },\n  {\n    customComponent: () =>\n      h(\n        'div',\n        {\n          style: {\n            backgroundColor: 'transparent',\n            display: 'flex',\n            alignItems: 'center',\n            justifyContent: 'center',\n            padding: '0',\n            margin: '5px',\n          },\n        },\n        [\n          h(FontAwesomeIcon, { icon: faChartBar, size: 'lg', color: 'black' }),\n          h(\n            'span',\n            {\n              style: {\n                backgroundColor: 'transparent',\n                padding: '0',\n                margin: '0',\n              },\n            },\n            participantsCounter.value.toString()\n          ),\n        ]\n      ),\n    show: true,\n  },\n  {\n    icon: faPhone,\n    active: endCallActive.value,\n    onPress: () =>\n      launchConfirmExit({\n        updateIsConfirmExitModalVisible,\n        isConfirmExitModalVisible: isConfirmExitModalVisible.value,\n      }),\n    activeColor: 'green',\n    inActiveColor: 'red',\n    show: true,\n  },\n  {\n    icon: faPhone,\n    active: false,\n    onPress: () => undefined,\n    activeColor: 'transparent',\n    inActiveColor: 'transparent',\n    backgroundColor: { default: 'transparent' },\n    show: false,\n  },\n]);\n\nconst controlChatButtons = computed<ControlButtonTouch[]>(() => [\n  {\n    icon: faShareAlt,\n    active: true,\n    alternateIcon: faShareAlt,\n    onPress: () => updateIsShareEventModalVisible(!isShareEventModalVisible.value),\n    activeColor: 'black',\n    inActiveColor: 'black',\n    show: true,\n  },\n  {\n    customComponent: () =>\n      h('div', { style: { position: 'relative' } }, [\n        h(FontAwesomeIcon, { icon: faComments, size: 'lg', color: 'black' }),\n        showMessagesBadge.value &&\n          h(\n            'div',\n            {\n              style: {\n                position: 'absolute',\n                top: '-2px',\n                right: '-2px',\n                display: 'flex',\n                alignItems: 'center',\n                justifyContent: 'center',\n              },\n            },\n            h(\n              'div',\n              {\n                style: {\n                  backgroundColor: 'red',\n                  borderRadius: '12px',\n                  padding: '4px',\n                },\n              },\n              h('span', { style: { color: 'white', fontSize: '12px', fontWeight: 'bold' } })\n            )\n          ),\n      ]),\n    onPress: () =>\n      launchMessages({\n        updateIsMessagesModalVisible,\n        isMessagesModalVisible: isMessagesModalVisible.value,\n      }),\n    show: true,\n  },\n  {\n    icon: faSync,\n    active: true,\n    alternateIcon: faSync,\n    onPress: () =>\n      switchVideoAlt({\n  parameters: getCastedParameters(),\n      }),\n    activeColor: 'black',\n    inActiveColor: 'black',\n    show: true,\n  },\n  {\n    icon: faVideoSlash,\n    alternateIcon: faVideo,\n    active: videoActive.value,\n    onPress: () =>\n      clickVideo({\n  parameters: getCastedParameters(),\n      }),\n    activeColor: 'green',\n    inActiveColor: 'red',\n    show: true,\n  },\n  {\n    icon: faMicrophoneSlash,\n    alternateIcon: faMicrophone,\n    active: micActive.value,\n    onPress: () =>\n      clickAudio({\n  parameters: getCastedParameters(),\n      }),\n    activeColor: 'green',\n    inActiveColor: 'red',\n    show: true,\n  },\n  {\n    icon: faPhone,\n    active: endCallActive.value,\n    onPress: () =>\n      launchConfirmExit({\n        updateIsConfirmExitModalVisible,\n        isConfirmExitModalVisible: isConfirmExitModalVisible.value,\n      }),\n    activeColor: 'green',\n    inActiveColor: 'red',\n    show: true,\n  },\n]);\n\nconst controlButtons = computed<ControlButton[]>(() => [\n  {\n    icon: faMicrophoneSlash,\n    alternateIcon: faMicrophone,\n    active: micActive.value,\n    onPress: () =>\n      clickAudio({\n  parameters: getCastedParameters(),\n      }),\n    activeColor: 'green',\n    inActiveColor: 'red',\n    disabled: audioSwitching.value,\n    show: true,\n  },\n  {\n    icon: faVideoSlash,\n    alternateIcon: faVideo,\n    active: videoActive.value,\n    onPress: () =>\n      clickVideo({\n  parameters: getCastedParameters(),\n      }),\n    activeColor: 'green',\n    inActiveColor: 'red',\n    disabled: videoSwitching.value,\n    show: true,\n  },\n  {\n    icon: faDesktop,\n    alternateIconComponent: () =>\n      h('div', { style: { position: 'relative', display: 'inline-block' } }, [\n        h(FontAwesomeIcon, {\n          icon: faDesktop,\n          size: 'lg',\n          style: { color: !screenShareActive.value ? 'black' : 'green' },\n        }),\n        !screenShareActive.value &&\n          h(FontAwesomeIcon, {\n            icon: faBan,\n            size: 'lg',\n            style: {\n              color: 'red',\n              position: 'absolute',\n              top: 0,\n              right: 0,\n            },\n          }),\n      ]),\n    active: true,\n    onPress: () => {\n      clickScreenShare({\n  parameters: getCastedParameters(),\n      });\n    },\n    activeColor: 'green',\n    inActiveColor: 'red',\n    disabled: false,\n    show: true,\n  },\n  {\n    icon: faPhone,\n    active: endCallActive.value,\n    onPress: () =>\n      launchConfirmExit({\n        updateIsConfirmExitModalVisible,\n        isConfirmExitModalVisible: isConfirmExitModalVisible.value,\n      }),\n    activeColor: 'green',\n    inActiveColor: 'red',\n    disabled: false,\n    show: true,\n  },\n  {\n    icon: faUsers,\n    active: participantsActive.value,\n    onPress: () =>\n      launchParticipants({\n        updateIsParticipantsModalVisible,\n        isParticipantsModalVisible: isParticipantsModalVisible.value,\n      }),\n    activeColor: 'black',\n    inActiveColor: 'black',\n    disabled: false,\n    show: true,\n  },\n  {\n    customComponent: () =>\n      h('div', { style: { position: 'relative' } }, [\n        h(FontAwesomeIcon, { icon: faBars, size: 'lg', color: 'black' }),\n        h(\n          'div',\n          {\n            style: {\n              position: 'absolute',\n              top: '-8px',\n              right: '-8px',\n              display: 'flex',\n              alignItems: 'center',\n              justifyContent: 'center',\n            },\n          },\n          h(\n            'div',\n            {\n              style: {\n                backgroundColor: 'red',\n                borderRadius: '50%',\n                padding: '4px',\n                minWidth: '8px',\n                minHeight: '8px',\n                display: 'flex',\n                alignItems: 'center',\n                justifyContent: 'center',\n              },\n            },\n            h('span', { style: { color: 'white', fontSize: '10px', fontWeight: 'bold' } }, totalReqWait.value.toString())\n          )\n        ),\n      ]),\n    onPress: () =>\n      launchMenuModal({\n        updateIsMenuModalVisible,\n        isMenuModalVisible: isMenuModalVisible.value,\n      }),\n    show: true,\n  },\n  {\n    customComponent: () =>\n      h('div', { style: { position: 'relative' } }, [\n        h(FontAwesomeIcon, { icon: faComments, size: 'lg', color: 'black' }),\n        showMessagesBadge.value &&\n          h(\n            'div',\n            {\n              style: {\n                position: 'absolute',\n                top: '-6px',\n                right: '-6px',\n                display: 'flex',\n                alignItems: 'center',\n                justifyContent: 'center',\n              },\n            },\n            h(\n              'div',\n              {\n                style: {\n                  backgroundColor: 'red',\n                  borderRadius: '50%',\n                  padding: '4px',\n                  minWidth: '8px',\n                  minHeight: '8px',\n                  display: 'flex',\n                  alignItems: 'center',\n                  justifyContent: 'center',\n                },\n              },\n              h('span', { style: { color: 'white', fontSize: '10px', fontWeight: 'bold', lineHeight: '1' } }, '*')\n            )\n          ),\n      ]),\n    onPress: () =>\n      launchMessages({\n        updateIsMessagesModalVisible,\n        isMessagesModalVisible: isMessagesModalVisible.value,\n      }),\n    show: true,\n  },\n]);\n\n// Function to join room using socket\nasync function joinRoom(data: {\n  socket: MediaSFUSocket;\n  roomName: string;\n  islevel: string;\n  member: string;\n  sec: string;\n  apiUserName: string;\n}): Promise<ResponseJoinRoom | null> {\n  const { socket: sock, roomName: room, islevel: level, member: mem, sec, apiUserName: apiUser } = data;\n  try {\n    const response = await joinRoomClient({\n      socket: sock,\n      roomName: room,\n      islevel: level,\n      member: mem,\n      sec,\n      apiUserName: apiUser,\n    });\n    return response;\n  } catch (error) {\n    console.log('error', error);\n    throw new Error(\n      'Failed to join the room. Please check your connection and try again.'\n    );\n  }\n}\n\n// Function to join room and get data from server\nasync function join_Room({\n  socket: sock,\n  roomName: room,\n  islevel: level,\n  member: mem,\n  sec,\n  apiUserName: apiUser,\n  isLocal = false,\n}: {\n  socket: MediaSFUSocket;\n  roomName: string;\n  islevel: string;\n  member: string;\n  sec: string;\n  apiUserName: string;\n  isLocal?: boolean;\n}): Promise<void> {\n  let data: ResponseJoinRoom | null;\n\n  if (!isLocal) {\n    data = await joinRoom({\n      socket: sock,\n      roomName: room,\n      islevel: level,\n      member: mem,\n      sec,\n      apiUserName: apiUser,\n    });\n  } else {\n    const localData: ResponseJoinLocalRoom = await joinLocalRoom({\n      socket: sock,\n      roomName: room,\n      islevel: level,\n      member: mem,\n      sec,\n      apiUserName: apiUser,\n      parameters: {\n        imgSrc: props.imgSrc,\n        showAlert,\n        updateIsLoadingModalVisible: (value: boolean) => (isLoadingModalVisible.value = value),\n        connectSocket,\n        connectLocalSocket,\n        updateSocket: (value: MediaSFUSocket) => (socket.value = value),\n        updateLocalSocket: (value: MediaSFUSocket | null) => (localSocket.value = value),\n        updateValidated: (value: boolean) => (validated.value = value),\n        updateApiUserName: (value: string) => (apiUserName.value = value),\n        updateApiToken: (value: string) => (apiToken.value = value),\n        updateLink: (value: string) => (link.value = value),\n        updateRoomName: (value: string) => (roomName.value = value),\n        updateMember: (value: string) => (member.value = value),\n      },\n      checkConnect:\n        props.localLink.length > 0 &&\n        props.connectMediaSFU === true &&\n        !link.value.includes('mediasfu.com'),\n      localLink: props.localLink,\n      joinMediaSFURoom: props.joinMediaSFURoom,\n    });\n\n    data = await createResponseJoinRoom({ localRoom: localData });\n  }\n\n  async function updateAndComplete(data: ResponseJoinRoom) {\n    try {\n      if (!data.roomRecvIPs || (data.roomRecvIPs && data.roomRecvIPs.length === 0)) {\n        data.roomRecvIPs = ['none'];\n        if (\n          link.value !== '' &&\n          link.value.includes('mediasfu.com') &&\n          !isLocal\n        ) {\n          await receiveAllPipedTransports({\n            community: true,\n            nsock: getUpdatedAllParams().socket,\n            parameters: getCastedParameters(),\n          });\n        }\n      }\n\n      try {\n        updateRoomParametersClient({\n          parameters: {\n            ...allParameters.value,\n            data: data,\n          },\n        });\n      } catch {\n        // Handle error\n      }\n\n      if (data.isHost) {\n        islevel.value = '2';\n      } else {\n        if (islevel.value !== '2') {\n          islevel.value = '1';\n        }\n      }\n\n      if (data.secureCode && data.secureCode !== '') {\n        adminPasscode.value = data.secureCode;\n      }\n\n      if (data.rtpCapabilities) {\n        try {\n          const device_ = await createDeviceClient({\n            rtpCapabilities: data.rtpCapabilities as unknown as RtpCapabilities,\n          });\n\n          if (device_) {\n            device.value = device_;\n          }\n        } catch (error) {\n          console.log('error Device', error);\n        }\n      }\n    } catch (error) {\n      console.log('error updateRoomParametersClient', error);\n    }\n  }\n\n  if (data && data.success) {\n    if (\n      link.value !== '' &&\n      link.value.includes('mediasfu.com') &&\n      isLocal\n    ) {\n      roomData.value = data;\n      return;\n    } else if (\n      link.value !== '' &&\n      link.value.includes('mediasfu.com') &&\n      !isLocal\n    ) {\n      if (roomData.value) {\n        roomData.value.recordingParams = data.recordingParams;\n        roomData.value.meetingRoomParams = data.meetingRoomParams;\n      } else {\n        roomData.value = data;\n      }\n    } else {\n      roomData.value = data;\n      if (!link.value.includes('mediasfu.com')) {\n        roomData.value.meetingRoomParams = data.meetingRoomParams;\n      }\n    }\n\n    await updateAndComplete(data);\n  } else {\n    if (\n      link.value !== '' &&\n      link.value.includes('mediasfu.com') &&\n      !isLocal\n    ) {\n      await updateAndComplete(roomData.value!);\n      return;\n    }\n\n    try {\n      if (showAlert) {\n        showAlert({ message: data!.reason!, type: 'danger', duration: 3000 });\n      }\n    } catch {\n      // Handle error\n    }\n  }\n}\n\n// Function to disconnect all sockets\nasync function disconnectAllSockets(consumeSockets: ConsumeSocket[]): Promise<void> {\n  for (const socket of consumeSockets) {\n    try {\n      const ip = Object.keys(socket)[0];\n      if (ip && (socket)[ip]) {\n        (socket)[ip].disconnect();\n      }\n    } catch (error) {\n      console.log(\n        `Error disconnecting socket with IP: ${Object.keys(socket)[0]}`,\n        error\n      );\n    }\n  }\n}\n\nconst stopMediaStreamTracks = (stream: MediaStream | null | undefined) => {\n  if (!stream) {\n    return;\n  }\n\n  try {\n    stream.getTracks().forEach((track) => {\n      try {\n        track.stop();\n      } catch (error) {\n        console.log('error stopping track', error);\n      }\n    });\n  } catch (error) {\n    console.log('error stopping media stream', error);\n  }\n};\n\nconst clearCanvasElement = (canvas: HTMLCanvasElement | null | undefined) => {\n  if (!canvas) {\n    return;\n  }\n\n  try {\n    const ctx = canvas.getContext('2d');\n    if (ctx) {\n      ctx.clearRect(0, 0, canvas.width ?? 0, canvas.height ?? 0);\n    }\n  } catch (error) {\n    console.log('error clearing canvas', error);\n  }\n};\n\nconst resetRuntimeArtifacts = () => {\n  stopMediaStreamTracks(localStream.value);\n  stopMediaStreamTracks(localStreamAudio.value);\n  stopMediaStreamTracks(localStreamVideo.value);\n  stopMediaStreamTracks(localStreamScreen.value);\n  stopMediaStreamTracks(segmentVideo.value);\n  stopMediaStreamTracks(processedStream.value);\n  stopMediaStreamTracks(virtualStream.value);\n  stopMediaStreamTracks(processedScreenStream.value);\n  stopMediaStreamTracks(canvasStream.value);\n\n  if (recordTimerInterval.value) {\n    clearInterval(recordTimerInterval.value);\n    recordTimerInterval.value = null;\n  }\n\n  clearCanvasElement(mainCanvas.value ?? null);\n  clearCanvasElement(canvasWhiteboard.value ?? null);\n  clearCanvasElement(canvasScreenboard.value ?? null);\n  clearCanvasElement(mainScreenCanvas.value ?? null);\n\n  componentUpdateQueue.length = 0;\n  isProcessingComponentUpdates = false;\n  resizeScheduled = false;\n  resizeQueued = false;\n  resizeInProgress = false;\n\n  autoRenderableKey = 0;\n  if (typeof missingReactComponentWarnings.clear === 'function') {\n    missingReactComponentWarnings.clear();\n  }\n\n  micActive.value = false;\n  videoActive.value = false;\n  screenShareActive.value = false;\n};\n\n// Function to close and reset\nasync function closeAndReset() {\n  updateIsMessagesModalVisible(false);\n  updateIsParticipantsModalVisible(false);\n  updateIsWaitingModalVisible(false);\n  updateIsRequestsModalVisible(false);\n  updateIsCoHostModalVisible(false);\n  updateIsSettingsModalVisible(false);\n  updateIsDisplaySettingsModalVisible(false);\n  updateIsMediaSettingsModalVisible(false);\n  updateIsMenuModalVisible(false);\n  updateIsShareEventModalVisible(false);\n  updateIsConfirmExitModalVisible(false);\n  \n  await disconnectAllSockets(consume_sockets.value);\n  await updateStatesToInitialValues();\n  \n  meetingProgressTime.value = '00:00:00';\n  meetingElapsedTime.value = 0;\n  recordingProgressTime.value = '00:00:00';\n  recordElapsedTime.value = 0;\n  showRecordButtons.value = false;\n\n  updateIsConfigureWhiteboardModalVisible(false);\n  updateIsWhiteboardModalVisible(false);\n  updateIsMenuModalVisible(false);\n  updateIsRecordingModalVisible(false);\n  updateIsPollModalVisible(false);\n  updateIsBreakoutRoomsModalVisible(false);\n  updateIsBackgroundModalVisible(false);\n  updateIsLoadingModalVisible(false);\n  updateIsConfirmHereModalVisible(false);\n\n  setTimeout(async function () {\n    validated.value = false;\n    resetRuntimeArtifacts();\n  }, 500);\n\n  try {\n    if (props.updateSourceParameters) {\n      props.updateSourceParameters(allParameters.value);\n    }\n  } catch {\n    console.log('error updateSourceParameters during reset');\n  }\n}\n\n// Function to connect socket and attach event listeners\nasync function connect_Socket(\n  apiUser: string,\n  token: string,\n  skipSockets: boolean = false\n): Promise<MediaSFUSocket | null> {\n  const socketDefault = socket.value as unknown as MediaSFUSocket;\n  const socketAlt = (\n    props.connectMediaSFU && localSocket.value && localSocket.value.id\n      ? localSocket.value\n      : socketDefault\n  )! as unknown as MediaSFUSocket;\n\n  if (socketDefault.id) {\n    if (!skipSockets) {\n      socketDefault.on('disconnect', async () => {\n        await disconnect({\n          showAlert,\n          redirectURL: redirectURL.value,\n          onWeb: true,\n          updateValidated: (value: boolean) => (validated.value = value),\n        });\n        \n        if (videoAlreadyOn.value) {\n          await clickVideo({\n            parameters: getCastedParameters(),\n          });\n        }\n        if (audioAlreadyOn.value) {\n          await clickAudio({\n            parameters: getCastedParameters(),\n          });\n        }\n\n        await closeAndReset();\n      });\n\n      socketDefault.on('allMembers', async (membersData: AllMembersData) => {\n        if (membersData) {\n          await allMembers({\n            apiUserName: apiUser,\n            apiKey: '',\n            apiToken: token,\n            members: membersData.members,\n            requestss: membersData.requests ? membersData.requests : requestList.value,\n            coHoste: membersData.coHost ? membersData.coHost : coHost.value,\n            coHostRes: membersData.coHostResponsibilities\n              ? membersData.coHostResponsibilities\n              : coHostResponsibility.value,\n            parameters: getCastedParameters(),\n            consume_sockets: consume_sockets.value,\n          });\n        }\n      });\n\n      socketDefault.on('allMembersRest', async (membersData: AllMembersRestData) => {\n        if (membersData) {\n          await allMembersRest({\n            apiUserName: apiUser,\n            apiKey: '',\n            members: membersData.members,\n            apiToken: token,\n            settings: membersData.settings,\n            coHoste: membersData.coHost ? membersData.coHost : coHost.value,\n            coHostRes: membersData.coHostResponsibilities\n              ? membersData.coHostResponsibilities\n              : coHostResponsibility.value,\n            parameters: getCastedParameters(),\n            consume_sockets: consume_sockets.value,\n          });\n        }\n      });\n\n      socketDefault.on('userWaiting', async ({ name }: { name: string }) => {\n        await userWaiting({\n          name,\n          showAlert,\n          totalReqWait: totalReqWait.value,\n          updateTotalReqWait: (value: number) => (totalReqWait.value = value),\n        });\n      });\n\n      socketDefault.on('personJoined', async ({ name }: { name: string }) => {\n        await personJoined({\n          name,\n          showAlert,\n        });\n      });\n\n      socketDefault.on('allWaitingRoomMembers', async (waiting_data: AllWaitingRoomMembersData) => {\n        await allWaitingRoomMembers({\n          waitingParticipants: waiting_data.waitingParticipants\n            ? waiting_data.waitingParticipants\n            : waiting_data.waitingParticipantss\n            ? waiting_data.waitingParticipantss\n            : waitingRoomList.value,\n          updateTotalReqWait: (value: number) => (totalReqWait.value = value),\n          updateWaitingRoomList,\n        });\n      });\n\n      socketDefault.on('ban', async ({ name }: { name: string }) => {\n        await banParticipant({\n          name,\n          parameters: getCastedParameters(),\n        });\n      });\n\n      socketDefault.on('updatedCoHost', async (cohost_data: UpdatedCoHostData) => {\n        await updatedCoHost({\n          coHost: cohost_data.coHost ? cohost_data.coHost : coHost.value,\n          coHostResponsibility: cohost_data.coHostResponsibilities\n            ? cohost_data.coHostResponsibilities\n            : coHostResponsibility.value,\n          youAreCoHost: youAreCoHost.value,\n          updateCoHost,\n          updateCoHostResponsibility,\n          updateYouAreCoHost: (value: boolean) => (youAreCoHost.value = value),\n          showAlert,\n          eventType: eventType.value,\n          islevel: islevel.value,\n          member: member.value,\n        });\n      });\n\n      socketDefault.on('participantRequested', async ({ userRequest }: { userRequest: Request }) => {\n        await participantRequested({\n          userRequest,\n          requestList: requestList.value,\n          waitingRoomList: waitingRoomList.value,\n          updateTotalReqWait: (value: number) => (totalReqWait.value = value),\n          updateRequestList,\n        });\n      });\n\n      socketDefault.on('screenProducerId', async ({ producerId }: { producerId: string }) => {\n        screenProducerId({\n          producerId,\n          screenId: screenId.value,\n          membersReceived: membersReceived.value,\n          shareScreenStarted: shareScreenStarted.value,\n          deferScreenReceived: deferScreenReceived.value,\n          participants: participants.value,\n          updateScreenId: (value: string) => (screenId.value = value),\n          updateShareScreenStarted: (value: boolean) => (shareScreenStarted.value = value),\n          updateDeferScreenReceived: (value: boolean) => (deferScreenReceived.value = value),\n        });\n      });\n\n      socketDefault.on('updateMediaSettings', async ({ settings }: { settings: Settings }) => {\n        updateMediaSettings({\n          settings,\n          updateAudioSetting,\n          updateVideoSetting,\n          updateScreenshareSetting,\n          updateChatSetting,\n        });\n      });\n\n      socketDefault.on('producer-media-paused', async ({\n        producerId,\n        kind,\n        name,\n      }: {\n        producerId: string;\n        kind: 'audio';\n        name: string;\n      }) => {\n        await producerMediaPaused({\n          producerId,\n          kind,\n          name,\n          parameters: getCastedParameters(),\n        });\n      });\n\n      socketDefault.on('producer-media-resumed', async ({ kind, name }: { kind: 'audio'; name: string }) => {\n        await producerMediaResumed({\n          kind,\n          name,\n          parameters: getCastedParameters(),\n        });\n      });\n\n      socketDefault.on('producer-media-closed', async ({\n        producerId,\n        kind,\n      }: {\n        producerId: string;\n        kind: 'video' | 'audio' | 'screenshare' | 'screen';\n      }) => {\n        if (producerId && kind) {\n          await producerMediaClosed({\n            producerId,\n            kind,\n            parameters: getCastedParameters(),\n          });\n        }\n      });\n\n      socketDefault.on('controlMediaHost', async ({\n        type,\n      }: {\n        type: 'video' | 'audio' | 'screenshare' | 'chat' | 'all';\n      }) => {\n        await controlMediaHost({\n          type,\n          parameters: getCastedParameters(),\n        });\n      });\n\n      socketDefault.on('meetingEnded', async function () {\n        await meetingEnded({\n          showAlert,\n          redirectURL: redirectURL.value,\n          onWeb: true,\n          eventType: eventType.value,\n          updateValidated: (value: boolean) => (validated.value = value),\n        });\n\n        if (videoAlreadyOn.value) {\n          await clickVideo({\n            parameters: getCastedParameters(),\n          });\n        }\n        if (audioAlreadyOn.value) {\n          await clickAudio({\n            parameters: getCastedParameters(),\n          });\n        }\n\n        await closeAndReset();\n      });\n\n      socketDefault.on('disconnectUserSelf', async function () {\n        await disconnectUserSelf({\n          socket: socketDefault,\n          member: member.value,\n          roomName: roomName.value,\n        });\n      });\n\n      socketDefault.on('receiveMessage', async ({ message }: { message: Message }) => {\n        await receiveMessage({\n          message,\n          messages: messages.value,\n          participantsAll: participants.value,\n          member: member.value,\n          eventType: eventType.value,\n          islevel: islevel.value,\n          coHost: coHost.value,\n          updateMessages: (value: Message[]) => (messages.value = value),\n          updateShowMessagesBadge: (value: boolean) => (showMessagesBadge.value = value),\n        });\n      });\n\n      socketDefault.on('meetingTimeRemaining', async ({ timeRemaining }: { timeRemaining: number }) => {\n        await meetingTimeRemaining({\n          timeRemaining,\n          showAlert,\n          eventType: eventType.value,\n        });\n      });\n\n      socketDefault.on('meetingStillThere', async () => {\n        await meetingStillThere({\n          updateIsConfirmHereModalVisible,\n        });\n      });\n\n      socketDefault.on('updateConsumingDomains', async ({ domains, alt_domains }: UpdateConsumingDomainsData) => {\n        await updateConsumingDomains({\n          domains,\n          alt_domains,\n          apiUserName: apiUser,\n          apiKey: '',\n          apiToken: token,\n          parameters: getCastedParameters(),\n        });\n      });\n\n      socketDefault.on('hostRequestResponse', ({ requestResponse }: HostRequestResponseData) => {\n        hostRequestResponse({\n          requestResponse,\n          showAlert,\n          requestList: requestList.value,\n          updateRequestList,\n          updateMicAction: (value: boolean) => (micAction.value = value),\n          updateVideoAction: (value: boolean) => (videoAction.value = value),\n          updateScreenAction: (value: boolean) => (screenAction.value = value),\n          updateChatAction: (value: boolean) => (chatAction.value = value),\n          updateAudioRequestState: (value: string | null) => (audioRequestState.value = value),\n          updateVideoRequestState: (value: string | null) => (videoRequestState.value = value),\n          updateScreenRequestState: (value: string | null) => (screenRequestState.value = value),\n          updateChatRequestState: (value: string | null) => (chatRequestState.value = value),\n          updateAudioRequestTime: (value: number) => (audioRequestTime.value = value),\n          updateVideoRequestTime: (value: number) => (videoRequestTime.value = value),\n          updateScreenRequestTime: (value: number) => (screenRequestTime.value = value),\n          updateChatRequestTime: (value: number) => (chatRequestTime.value = value),\n          updateRequestIntervalSeconds: updateRequestIntervalSeconds.value,\n        });\n      });\n\n      socketDefault.on('pollUpdated', async (data: PollUpdatedData) => {\n        try {\n          await pollUpdated({\n            data,\n            polls: polls.value,\n            poll: poll.value!,\n            member: member.value,\n            islevel: islevel.value,\n            showAlert,\n            updatePolls: (value: Poll[]) => (polls.value = value),\n            updatePoll: (value: Poll | null) => (poll.value = value),\n            updateIsPollModalVisible,\n          });\n        } catch {\n          // Handle error\n        }\n      });\n\n      socketDefault.on('breakoutRoomUpdated', async (data: BreakoutRoomUpdatedData) => {\n        try {\n          await breakoutRoomUpdated({\n            data,\n            parameters: getCastedParameters(),\n          });\n        } catch {\n          // Handle error\n        }\n      });\n    }\n\n    if (skipSockets) {\n      const events = [\n        'roomRecordParams',\n        'startRecords',\n        'reInitiateRecording',\n        'RecordingNotice',\n        'timeLeftRecording',\n        'stoppedRecording',\n      ];\n      events.forEach((event) => {\n        socketDefault.off(event);\n        socketAlt.off(event);\n      });\n    }\n\n    socketAlt.on('roomRecordParams', async ({ recordParams }: { recordParams: RecordParams }) => {\n      await roomRecordParams({\n        recordParams,\n  parameters: getCastedParameters(),\n      });\n    });\n\n    socketAlt.on('startRecords', async () => {\n      await startRecords({\n        roomName: roomName.value,\n        member: member.value,\n        socket: socketAlt,\n      });\n    });\n\n    socketAlt.on('reInitiateRecording', async () => {\n      await reInitiateRecording({\n        roomName: roomName.value,\n        member: member.value,\n        socket: socketAlt,\n        adminRestrictSetting: adminRestrictSetting.value,\n      });\n    });\n\n    socketAlt.on(\n      'RecordingNotice',\n      async ({\n        state,\n        userRecordingParam,\n        pauseCount,\n        timeDone,\n      }: {\n        state: string;\n        userRecordingParam: UserRecordingParams;\n        pauseCount: number;\n        timeDone: number | string;\n      }) => {\n      const timeDoneNumber = typeof timeDone === 'number' ? timeDone : Number(timeDone) || 0;\n      await recordingNotice({\n        state,\n        userRecordingParam,\n        pauseCount,\n        timeDone: timeDoneNumber,\n  parameters: getCastedParameters(),\n      });\n    }\n    );\n\n    socketAlt.on('timeLeftRecording', async ({ timeLeft }: { timeLeft: number }) => {\n      timeLeftRecording({\n        timeLeft,\n        showAlert,\n      });\n    });\n\n    socketAlt.on('stoppedRecording', async ({ state, reason }: { state: string; reason: string }) => {\n      await stoppedRecording({\n        state,\n        reason,\n        showAlert,\n      });\n    });\n\n    if (props.localLink !== '' && socketDefault && !skipSockets) {\n      await join_Room({\n        socket: socketDefault,\n        roomName: roomName.value,\n        islevel: islevel.value,\n        member: member.value,\n        sec: token,\n        apiUserName: apiUser,\n        isLocal: true,\n      });\n    }\n\n    let localChanged = false;\n    localChanged =\n      localSocket.value && localSocket.value.id !== socketAlt.id ? true : false;\n\n    if (!skipSockets && localChanged) {\n      await connect_Socket(apiUser, token, true);\n      await sleep({ ms: 1000 });\n      isLoadingModalVisible.value = false;\n      return socketDefault;\n    } else {\n      if (link.value !== '' && link.value.includes('mediasfu.com')) {\n        const token_ = apiToken.value;\n        await join_Room({\n          socket:\n            props.connectMediaSFU && socketAlt && socketAlt.id\n              ? socketAlt\n              : socketDefault,\n          roomName: roomName.value,\n          islevel: islevel.value,\n          member: member.value,\n          sec: token_,\n          apiUserName: apiUser,\n        });\n      }\n\n      await receiveRoomMessages({\n        socket: socketDefault,\n        roomName: roomName.value,\n        updateMessages: (value: Message[]) => (messages.value = value),\n      });\n\n      if (!skipSockets) {\n        await prepopulateUserMedia({\n          name: hostLabel.value,\n          parameters: getCastedParameters(),\n        });\n      }\n\n      return socketDefault;\n    }\n  } else {\n    return null;\n  }\n}\n\nconst connectAndAddSocketMethods = async () => {\n  const _socket = await connect_Socket(apiUserName.value, apiToken.value);\n  if (_socket) {\n    socket.value = _socket;\n  }\n  return _socket;\n};\n\nconst runValidatedFlow = async (_origin: 'mount' | 'validation-change') => {\n\n  if (!props.useLocalUIMode) {\n    isLoadingModalVisible.value = true;\n    try {\n\n      console.log(`[MediasfuGeneric] (${_origin}) Connecting to socket...`);\n      await connectAndAddSocketMethods();\n    \n    } catch (error) {\n      console.log('error connectAndAddSocketMethods', error);\n    } finally {\n      isLoadingModalVisible.value = false;\n    }\n  } else {\n    isLoadingModalVisible.value = false;\n  }\n\n  startMeetingProgressTimer({\n    startTime: Date.now() / 1000,\n    parameters: getCastedParameters(),\n  });\n\n  try {\n    await runResize();\n  } catch (error) {\n    console.log('error runResize during validated flow', error);\n  }\n\n  try {\n    if (props.sourceParameters !== null && props.sourceParameters !== undefined) {\n      const updatedParams = allParameters.value;\n      props.updateSourceParameters?.(updatedParams);\n    }\n  } catch {\n    console.log('error updateSourceParameters');\n  }\n};\n\n// Lifecycle hooks\n// Update the onMounted hook to include socket connection\nonMounted(async () => {\n  // Update allVideoStreams\n  allVideoStreams.value = [\n    { producerId: 'youyou', stream: undefined, id: 'youyou', name: 'youyou' },\n  ];\n\n  // Update StreamNames\n  streamNames.value = [{ id: 'youyou', name: 'youyou', producerId: '' }];\n\n  window.addEventListener('resize', onResize);\n  window.addEventListener('orientationchange', onResize);\n\n  if (typeof ResizeObserver !== 'undefined') {\n    resizeObserver = new ResizeObserver(() => {\n      scheduleResize();\n    });\n\n    if (mediaContainerRef.value) {\n      resizeObserver.observe(mediaContainerRef.value);\n    }\n  }\n\n  try {\n    await runResize();\n  } catch (error) {\n    console.log('error runResize', error);\n  }\n\n  if (validated.value) {\n    try {\n      await runValidatedFlow('mount');\n    } catch (error) {\n      console.log('error runValidatedFlow', error);\n    }\n  } else {\n    console.log('Not validated, skipping socket connection.');\n  }\n});\n\nwatch(\n  () => validated.value,\n  (newValue, oldValue) => {\n    if (newValue && !oldValue) {\n      void runValidatedFlow('validation-change');\n    }\n  }\n);\n\nonBeforeUnmount(() => {\n  // Remove event listeners\n  window.removeEventListener('resize', onResize);\n  window.removeEventListener('orientationchange', onResize);\n  if (resizeObserver) {\n    resizeObserver.disconnect();\n    resizeObserver = null;\n  }\n});\n\n// Watch for recordState changes\nwatch([recordStarted, recordPaused, recordStopped], () => {\n  if (recordStarted.value && !recordStopped.value) {\n    if (!recordPaused.value) {\n      recordState.value = 'red';\n    } else {\n      recordState.value = 'yellow';\n    }\n  } else {\n    recordState.value = 'green';\n  }\n});\n\n// Watch for mainHeightWidth changes\nwatch(mainHeightWidth, (newValue, oldValue) => {\n  enqueueComponentUpdate(async () => {\n    if (newValue !== oldValue) {\n      const defaultFraction =\n        eventType.value === 'webinar' || eventType.value === 'conference'\n          ? 1 - controlHeight.value\n          : 1;\n\n      applyComponentSizes(defaultFraction);\n    }\n\n    const parameters = getCastedParameters();\n\n    if (!lock_screen.value && !shared.value) {\n      await prepopulateUserMedia({\n        name: hostLabel.value,\n        parameters,\n      });\n    } else if (!first_round.value) {\n      await prepopulateUserMedia({\n        name: hostLabel.value,\n        parameters,\n      });\n    }\n  });\n});\n</script>\n\n<style scoped>\n.MediaSFU .modal-header {\n  display: flex;\n  justify-content: space-between;\n  align-items: center;\n  margin-bottom: 15px;\n}\n\n.MediaSFU .modal-title {\n  font-size: 18px;\n  font-weight: bold;\n  color: black;\n}\n\n.MediaSFU .btn-close {\n  padding: 5px;\n  cursor: pointer;\n}\n\n.MediaSFU .container {\n  display: flex;\n  width: 100%;\n  flex-direction: row;\n  margin-top: 0px;\n}\n\n.MediaSFU .buttonContainer {\n  display: flex;\n  align-items: center;\n  justify-content: center;\n  padding: 8px;\n  border-radius: 5px;\n  margin-right: 4px;\n  font-size: medium;\n  border: none;\n}\n\n.MediaSFU .buttonContainer:hover {\n  cursor: pointer;\n}\n\n.MediaSFU .verticalButton {\n  flex-direction: column;\n}\n\n.MediaSFU .buttonText {\n  font-size: 12px;\n  margin-top: 5px;\n}\n\n.MediaSFU .modal-body {\n  flex: 1;\n}\n\n.MediaSFU .form-group {\n  margin-bottom: 20px;\n}\n\n.MediaSFU .label {\n  font-size: 14px;\n  color: black;\n  margin-bottom: 5px;\n  font-weight: bold;\n  padding-right: 10px;\n}\n\n.MediaSFU .hr {\n  height: 1px;\n  background-color: black;\n  margin-top: 5px;\n  margin-bottom: 5px;\n}\n\n.MediaSFU .sep {\n  height: 1px;\n  background-color: white;\n  margin-top: 0;\n  margin-bottom: 0;\n}\n\n.MediaSFU .modal-footer {\n  margin-top: 10px;\n  display: flex;\n  justify-content: flex-end;\n}\n\n.MediaSFU .btn-apply-settings {\n  padding: 5px;\n  border-radius: 5px;\n  justify-content: center;\n  align-items: center;\n  background-color: black;\n  color: white;\n  font-size: 14px;\n  cursor: pointer;\n}\n\n.MediaSFU .customButtonsContainer {\n  display: flex;\n  flex-direction: column;\n  flex-wrap: wrap;\n  justify-content: space-between;\n  align-items: flex-start;\n}\n\n.MediaSFU .customButton {\n  width: 100%;\n  margin: 10px 0;\n  padding: 10px;\n  border-radius: 5px;\n  background-color: transparent;\n  align-items: flex-start;\n  justify-content: flex-start;\n  border: none;\n}\n\n.MediaSFU .buttonContent {\n  display: flex;\n  align-items: flex-start;\n  justify-content: flex-start;\n}\n\n.MediaSFU .customButtonIcon {\n  font-size: 20px;\n  color: #000000;\n  margin-right: 4px;\n}\n\n.MediaSFU .customButtonText {\n  color: #000000;\n}\n\n.MediaSFU #whiteboardCanvas {\n  border: 1px solid #000;\n  cursor: crosshair;\n  background-color: white;\n}\n\n.MediaSFU .resize-handle,\n.MediaSFU .move-handle {\n  width: 8px;\n  height: 8px;\n  background: red;\n  position: absolute;\n}\n\n.MediaSFU .move-handle {\n  background: blue;\n}\n\n.MediaSFU #textInput {\n  display: none;\n  position: absolute;\n  z-index: 10;\n  width: 200px;\n}\n\n.MediaSFU .shape-icon {\n  width: 20px;\n  height: 20px;\n  color: white;\n}\n\n.MediaSFU .toolbar .btn-group button,\n.MediaSFU .toolbar .dropdown-menu a {\n  font-size: 0.8rem;\n  padding: 5px 10px;\n  margin: 0 2px;\n  border-radius: 4px;\n  transition: background-color 0.2s;\n}\n\n.MediaSFU .toolbar .dropdown-menu a {\n  background-color: transparent;\n  color: rgb(27, 26, 26);\n}\n\n.MediaSFU .toolbar .btn-group button:hover,\n.MediaSFU .toolbar .dropdown-menu a:hover {\n  background-color: #e3e7eb;\n}\n\n.MediaSFU .toolbar .btn-group button.active {\n  background-color: #454d55;\n}\n\n.MediaSFU .toolbarScreen .btn-group button,\n.MediaSFU .toolbarScreen .dropdown-menu a {\n  font-size: 0.8rem;\n  padding: 5px 10px;\n  margin: 1px 2px;\n  border-radius: 4px;\n  transition: background-color 0.2s;\n  background-color: transparent;\n  color: black;\n}\n\n.MediaSFU .toolbarScreen .btn-group button {\n  color: rgb(6, 6, 6);\n  border: none;\n}\n\n.MediaSFU .toolbarScreen .dropdown-menu a {\n  background-color: transparent;\n  color: rgb(27, 26, 26);\n}\n\n.MediaSFU .toolbarScreen .btn-group button.active {\n  background-color: #454d55;\n}\n\n.MediaSFU #toolbar,\n.MediaSFU #toolbarScreen {\n  transition: display 0.3s ease-in-out;\n}\n\n.MediaSFU #toolbarToggle,\n.MediaSFU #toolbarToggleScreen {\n  cursor: pointer;\n  border: 2px solid black !important;\n  font-size: 0.8rem;\n}\n\n.MediaSFU #colorPicker,\n.MediaSFU #colorPickerScreen {\n  font-size: 0.8rem;\n  padding: 2px 2px;\n  width: 32px;\n  height: 32px;\n}\n\n.MediaSFU #lineTypePicker {\n  font-size: 0.8rem;\n  padding: 2px;\n  width: 32px;\n  height: 32px;\n}\n\n.MediaSFU .btnBoard {\n  font-size: 1rem;\n  padding: 2px 2px;\n  width: 40px;\n  height: 40px;\n  margin: 2px;\n}\n\n.MediaSFU #lineTypePickerScreen {\n  font-size: 0.7rem;\n  padding: 2px;\n  width: 28px;\n  height: 28px;\n  background-color: rgba(214, 209, 209, 0.4);\n  color: #000;\n  border-radius: 4px;\n}\n\n.MediaSFU .toggle-icon {\n  width: 30px;\n  height: 30px;\n  padding: 0;\n  margin: 0;\n}\n\n.MediaSFU #toggleBackground.active {\n  background-color: #fdfeff;\n}\n\n.MediaSFU .annotateScreenBtn {\n  background-color: #2d2e2f !important;\n  border: 2px solid #000 !important;\n  color: green !important;\n  font-size: 0.75rem;\n}\n\n.MediaSFU .waiting-list {\n  display: flex;\n  flex-direction: column;\n}\n\n.MediaSFU .waiting-item {\n  display: flex;\n  flex-direction: row;\n  margin-top: 5px;\n}\n\n.MediaSFU .col7 {\n  flex: 5;\n  justify-content: center;\n}\n\n.MediaSFU .col2 {\n  flex: 2;\n  align-items: center;\n  justify-content: center;\n}\n\n.MediaSFU .col1 {\n  flex: 1;\n}\n\n.MediaSFU {\n  position: relative;\n  overflow: hidden;\n}\n</style>\n\n","<!--\n/**\n * @fileoverview MediasfuBroadcast - Broadcast event variant component\n * @component MediasfuBroadcast\n * @module components/mediasfuComponents/MediasfuBroadcast\n * \n * @description\n * Pre-configured MediaSFU component optimized for broadcast events.\n * A broadcast event is a one-to-many streaming scenario where a host streams\n * to viewers. Includes HLS egress support, recording tools, and viewer controls.\n * \n * Features:\n * - Host-controlled broadcasting with start/stop/pause\n * - HLS egress for external streaming (YouTube, Twitch, etc.)\n * - Recording with multiple quality options\n * - Viewer limit controls\n * - Minimal viewer UI (watch-only by default)\n * - Host control panel with broadcast buttons\n * - Chat and Q&A for viewer interaction\n * \n * @example Basic Broadcast\n * // <MediasfuBroadcast\n *   // :credentials=\"{ apiUserName: 'host123', apiKey: 'key456' }\"\n * // />\n * \n * @example With Custom UI\n * // <MediasfuBroadcast\n *   // :credentials=\"credentials\"\n *   // :uiOverrides=\"{\n *     videoCard: { component: CustomBroadcastCard }\n *   }\"\n * // />\n */\n-->\n<template>\n  <MediasfuGeneric v-bind=\"props\" />\n</template>\n\n<script setup lang=\"ts\">\nimport MediasfuGeneric, { type MediasfuGenericOptions } from './MediasfuGeneric.vue'\nimport type { EventType } from 'mediasfu-shared'\n\n/**\n * Props for MediasfuBroadcast component\n * Inherits all MediasfuGenericOptions except defaultEventType is fixed to 'broadcast'\n * @interface BroadcastProps\n */\ntype BroadcastProps = Omit<MediasfuGenericOptions, 'defaultEventType'> & {\n  /**\n   * Event type (fixed to 'broadcast', but can be overridden)\n   * @default \"broadcast\"\n   */\n  defaultEventType?: EventType\n}\n\nconst props = withDefaults(defineProps<BroadcastProps>(), {\n  defaultEventType: 'broadcast' as EventType,\n})\n</script>\n","<!--\n/**\n * @fileoverview MediasfuChat - Chat event variant component\n * @component MediasfuChat\n * @module components/mediasfuComponents/MediasfuChat\n * \n * @description\n * Pre-configured MediaSFU component optimized for chat-focused events.\n * A chat event emphasizes text messaging with optional audio/video capabilities.\n * Ideal for text-based discussions, support channels, and casual hangouts.\n * \n * Features:\n * - Prominent messaging interface\n * - Optional audio/video participants\n * - Direct messaging support\n * - Message history and search\n * - File sharing capabilities\n * - Emojis and reactions\n * - Participant list with online status\n * - Moderation tools (mute, kick, ban)\n * - Minimal video grid (text-first experience)\n * \n * @example Basic Chat Room\n * // <MediasfuChat\n *   // :credentials=\"{ apiUserName: 'user123', apiKey: 'key456' }\"\n * // />\n * \n * @example With Custom Message UI\n * // <MediasfuChat\n *   // :credentials=\"credentials\"\n *   // :uiOverrides=\"{\n *     messagesModal: { component: CustomChatPanel },\n *     participantsModal: { component: CustomUserList }\n *   }\"\n * // />\n */\n-->\n<template>\n  <MediasfuGeneric v-bind=\"props\" />\n</template>\n\n<script setup lang=\"ts\">\nimport MediasfuGeneric, { type MediasfuGenericOptions } from './MediasfuGeneric.vue'\nimport type { EventType } from 'mediasfu-shared'\n\n/**\n * Props for MediasfuChat component\n * Inherits all MediasfuGenericOptions except defaultEventType is fixed to 'chat'\n * @interface ChatProps\n */\ntype ChatProps = Omit<MediasfuGenericOptions, 'defaultEventType'> & {\n  /**\n   * Event type (fixed to 'chat', but can be overridden)\n   * @default \"chat\"\n   */\n  defaultEventType?: EventType\n}\n\nconst props = withDefaults(defineProps<ChatProps>(), {\n  defaultEventType: 'chat' as EventType,\n})\n</script>\n","<!--\n/**\n * @fileoverview MediasfuConference - Conference event variant component\n * @component MediasfuConference\n * @module components/mediasfuComponents/MediasfuConference\n * \n * @description\n * Pre-configured MediaSFU component optimized for conference/meeting events.\n * A conference is a peer-to-peer collaborative meeting where all participants\n * can share audio, video, and screens. Ideal for team meetings, workshops,\n * and collaborative sessions.\n * \n * Features:\n * - Equal participant privileges (everyone can share)\n * - Grid and speaker view layouts\n * - Screen sharing for all participants\n * - Breakout rooms support\n * - Whiteboard collaboration\n * - Recording capabilities\n * - Participant management (mute, remove, etc.)\n * - Chat and file sharing\n * - Polls and Q&A\n * \n * @example Basic Conference\n * // <MediasfuConference\n *   // :credentials=\"{ apiUserName: 'user123', apiKey: 'key456' }\"\n * // />\n * \n * @example With Custom Layout\n * // <MediasfuConference\n *   // :credentials=\"credentials\"\n *   // :uiOverrides=\"{\n *     mainGrid: { component: CustomGridLayout },\n *     participantsModal: { component: CustomParticipantsList }\n *   }\"\n * // />\n */\n-->\n<template>\n  <MediasfuGeneric v-bind=\"props\" />\n</template>\n\n<script setup lang=\"ts\">\nimport MediasfuGeneric, { type MediasfuGenericOptions } from './MediasfuGeneric.vue'\nimport type { EventType } from 'mediasfu-shared'\n\n/**\n * Props for MediasfuConference component\n * Inherits all MediasfuGenericOptions except defaultEventType is fixed to 'conference'\n * @interface ConferenceProps\n */\ntype ConferenceProps = Omit<MediasfuGenericOptions, 'defaultEventType'> & {\n  /**\n   * Event type (fixed to 'conference', but can be overridden)\n   * @default \"conference\"\n   */\n  defaultEventType?: EventType\n}\n\nconst props = withDefaults(defineProps<ConferenceProps>(), {\n  defaultEventType: 'conference' as EventType,\n})\n</script>\n","<!--\n/**\n * @fileoverview MediasfuWebinar - Webinar event variant component\n * @component MediasfuWebinar\n * @module components/mediasfuComponents/MediasfuWebinar\n * \n * @description\n * Pre-configured MediaSFU component optimized for webinar events.\n * A webinar features a stage with presenters/panelists and an audience of attendees.\n * Includes stage management, Q&A, polls, and attendee engagement tools.\n * \n * Features:\n * - Stage management with presenter queue\n * - Request-to-speak system for attendees\n * - Panelist/presenter roles with elevated privileges\n * - Audience view with limited controls\n * - Q&A and polling for engagement\n * - Raise hand functionality\n * - Breakout rooms for networking\n * - Recording with speaker spotlighting\n * - Attendee list with moderation tools\n * \n * @example Basic Webinar\n * // <MediasfuWebinar\n *   // :credentials=\"{ apiUserName: 'host123', apiKey: 'key456' }\"\n * // />\n * \n * @example With Custom Stage Controls\n * // <MediasfuWebinar\n *   // :credentials=\"credentials\"\n *   // :uiOverrides=\"{\n *     requestsModal: { component: CustomRequestsPanel },\n *     participantsModal: { component: CustomAttendeeList }\n *   }\"\n * // />\n */\n-->\n<template>\n  <MediasfuGeneric v-bind=\"props\" />\n</template>\n\n<script setup lang=\"ts\">\nimport MediasfuGeneric, { type MediasfuGenericOptions } from './MediasfuGeneric.vue'\nimport type { EventType } from 'mediasfu-shared'\n\n/**\n * Props for MediasfuWebinar component\n * Inherits all MediasfuGenericOptions except defaultEventType is fixed to 'webinar'\n * @interface WebinarProps\n */\ntype WebinarProps = Omit<MediasfuGenericOptions, 'defaultEventType'> & {\n  /**\n   * Event type (fixed to 'webinar', but can be overridden)\n   * @default \"webinar\"\n   */\n  defaultEventType?: EventType\n}\n\nconst props = withDefaults(defineProps<WebinarProps>(), {\n  defaultEventType: 'webinar' as EventType,\n})\n</script>\n","<!--\n/**\n * @fileoverview MenuItemComponent - Simple menu button with icon and text\n * @component MenuItemComponent\n * @module components/menuComponents/MenuItemComponent\n * \n * @description\n * A simple, reusable menu button component that displays an optional FontAwesome icon\n * and/or text label. Used in MenuModal and other menu contexts to provide consistent\n * menu item styling and behavior. Features a transparent background with white text/icons.\n * \n * Features:\n * - Optional FontAwesome icon (left-aligned)\n * - Optional text label (right of icon)\n * - Transparent background with white text\n * - Click handler via onPress prop\n * - Consistent spacing and sizing\n * - Fully customizable via icon and name props\n * \n * @example Menu Item with Icon and Text\n * // <MenuItemComponent\n *   // :icon=\"faUser\"\n *   // name=\"View Participants\"\n *   // :onPress=\"() => openParticipantsModal()\"\n * // />\n * \n * @example Icon Only\n * // <MenuItemComponent\n *   // :icon=\"faComment\"\n *   // :onPress=\"() => openChat()\"\n * // />\n * \n * @example Text Only\n * // <MenuItemComponent\n *   // name=\"End Meeting\"\n *   // :onPress=\"() => confirmEndMeeting()\"\n * // />\n * \n * @example Common Menu Items\n * // <MenuItemComponent\n *   // :icon=\"faCog\"\n *   // name=\"Settings\"\n *   // :onPress=\"() => openSettings()\"\n * // />\n * // <MenuItemComponent\n *   // :icon=\"faSignOutAlt\"\n *   // name=\"Leave Meeting\"\n *   // :onPress=\"() => handleLeaveMeeting()\"\n * // />\n * // <MenuItemComponent\n *   // :icon=\"faRecordVinyl\"\n *   // name=\"Start Recording\"\n *   // :onPress=\"() => startRecording()\"\n * // />\n * \n * @remarks\n * This is a lightweight, presentational component with no internal state.\n * All styling is predefined for consistency across the menu system.\n * \n * Workflow:\n * 1. Component renders button with transparent background\n * 2. If icon provided → Renders FontAwesome icon (20px, white, left-aligned)\n * 3. If name provided → Renders text label (16px, white, right of icon)\n * 4. User clicks button → Calls onPress function\n * \n * @see {@link MenuModal} - Modal container that uses multiple MenuItemComponents\n */\n-->\n<template>\n  <button\n    :style=\"listItemStyle\"\n    @click=\"onPress\"\n  >\n    <font-awesome-icon\n      v-if=\"icon\"\n      :icon=\"icon\"\n      :style=\"listIconStyle\"\n    />\n    <span\n      v-if=\"name\"\n      :style=\"listTextStyle\"\n    >{{ name }}</span>\n  </button>\n</template>\n\n<script setup lang=\"ts\">\nimport type { CSSProperties } from 'vue';\nimport { FontAwesomeIcon } from '@fortawesome/vue-fontawesome';\nimport type { IconDefinition } from '@fortawesome/fontawesome-svg-core';\n\n/**\n * Props for the MenuItemComponent\n * @interface MenuItemComponentProps\n * \n * @property {IconDefinition} [icon] - Optional FontAwesome icon to display\n * @property {string} [name] - Optional text label to display\n * @property {() => void} onPress - Click handler function\n * \n * @example\n * ```typescript\n * // <MenuItemComponent\n *   // :icon=\"faUsers\"\n *   // name=\"Participants\"\n *   // :onPress=\"() => openParticipants()\"\n * // />\n * ```\n */\nexport interface MenuItemComponentProps {\n  icon?: IconDefinition;\n  name?: string;\n  onPress: () => void;\n}\n\ndefineProps<MenuItemComponentProps>();\n\nconst listItemStyle: CSSProperties = {\n  display: 'flex',\n  flexDirection: 'row',\n  alignItems: 'center',\n  backgroundColor: 'transparent',\n  border: 'none',\n  fontSize: '16px',\n  paddingLeft: 0,\n  marginLeft: 0,\n  marginBottom: '10px',\n  cursor: 'pointer',\n};\n\nconst listIconStyle: CSSProperties = {\n  fontSize: '20px',\n  marginRight: '10px',\n  color: '#ffffff',\n};\n\nconst listTextStyle: CSSProperties = {\n  color: '#ffffff',\n  fontSize: '16px',\n};\n</script>\n","import { computed, reactive, ref } from 'vue'\nimport { launchBackground } from 'mediasfu-shared'\nimport type { BackgroundModalParameters } from '../types/background'\n\nconst defaultParameters: BackgroundModalParameters = {}\n\nexport function useBackgroundModal(initialParameters?: Partial<BackgroundModalParameters>) {\n  const isVisible = ref(false)\n  const parameters = reactive<BackgroundModalParameters>({\n    ...defaultParameters,\n    ...(initialParameters ?? {}),\n  })\n\n  const toggleBackgroundModal = (next?: Partial<BackgroundModalParameters>) => {\n    if (next) {\n      Object.assign(parameters, next)\n    }\n    launchBackground({\n      isBackgroundModalVisible: isVisible.value,\n      updateIsBackgroundModalVisible: (visible) => {\n        isVisible.value = visible\n      },\n    })\n  }\n\n  const openBackgroundModal = (next?: Partial<BackgroundModalParameters>) => {\n    if (next) {\n      Object.assign(parameters, next)\n    }\n    isVisible.value = true\n  }\n\n  const closeBackgroundModal = () => {\n    isVisible.value = false\n  }\n\n  const modalParameters = computed(() => parameters)\n\n  return {\n    isBackgroundModalVisible: isVisible,\n    backgroundModalParameters: modalParameters,\n    toggleBackgroundModal,\n    openBackgroundModal,\n    closeBackgroundModal,\n  }\n}\n","import { ref } from 'vue'\nimport { launchMenuModal } from 'mediasfu-shared'\n\nexport function useMenuModal(initiallyVisible = false) {\n  const isMenuModalVisible = ref(initiallyVisible)\n\n  const toggleMenuModal = () => {\n    launchMenuModal({\n      isMenuModalVisible: isMenuModalVisible.value,\n      updateIsMenuModalVisible: (visible) => {\n        isMenuModalVisible.value = visible\n      },\n    })\n  }\n\n  const openMenuModal = () => {\n    isMenuModalVisible.value = true\n  }\n\n  const closeMenuModal = () => {\n    isMenuModalVisible.value = false\n  }\n\n  return {\n    isMenuModalVisible,\n    toggleMenuModal,\n    openMenuModal,\n    closeMenuModal,\n  }\n}\n","import { computed, onMounted, ref, watch } from 'vue';\nimport type {\n  CreateMediaSFURoomOptions,\n  JoinMediaSFURoomOptions,\n  Participant,\n  ShowAlert,\n} from 'mediasfu-shared';\nimport type { MediasfuGenericProps, MediaAlert, MediaSessionApi, MediaSessionState } from '../types/mediasfu';\nimport type { BackgroundModalParameters } from '../types/background';\nimport type { MenuModalParameters } from '../types/menu';\nimport type { ComputedRef, Ref } from 'vue';\nimport { useBackgroundModal } from './useBackgroundModal';\nimport { useMenuModal } from './useMenuModal';\n\nconst DEFAULT_NAMES = [\n  'Alice',\n  'Bob',\n  'Charlie',\n  'Daisy',\n  'Ethan',\n  'Fiona',\n  'Grace',\n  'Henry',\n  'Isla',\n  'Jack',\n];\n\ninterface UseMediasfuResult {\n  state: Ref<MediaSessionState>;\n  alerts: Ref<MediaAlert[]>;\n  showAlert: ShowAlert;\n  startSession: MediaSessionApi['startSession'];\n  endSession: MediaSessionApi['endSession'];\n  customParameters: ComputedRef<Record<string, unknown>>;\n  isBackgroundModalVisible: Ref<boolean>;\n  backgroundModalParameters: ComputedRef<Partial<BackgroundModalParameters>>;\n  toggleBackgroundModal: (next?: Partial<BackgroundModalParameters>) => void;\n  closeBackgroundModal: () => void;\n  isMenuModalVisible: Ref<boolean>;\n  toggleMenuModal: () => void;\n  closeMenuModal: () => void;\n  menuModalParameters: ComputedRef<MenuModalParameters>;\n}\n\nfunction buildParticipants(host: string, seed?: Participant[]): Participant[] {\n  if (seed && seed.length > 0) {\n    return seed.map((participant, index) => ({\n      ...participant,\n      audioID: participant.audioID ?? `audio-${index}`,\n      videoID: participant.videoID ?? `video-${index}`,\n      id: participant.id ?? `${index}`,\n    }));\n  }\n\n  const shuffled: string[] = [...DEFAULT_NAMES];\n  for (let i = shuffled.length - 1; i > 0; i--) {\n    const j = Math.floor(Math.random() * (i + 1));\n    const current = shuffled[i]!;\n    shuffled[i] = shuffled[j]!;\n    shuffled[j] = current;\n  }\n\n  const participants: Participant[] = [];\n  const uniqueNames = new Set<string>();\n  let hasHostLevel = false;\n\n  for (let i = 0; i < shuffled.length; i++) {\n    const name = (i === 0 ? host : shuffled[i]) ?? host;\n    if (uniqueNames.has(name)) {\n      continue;\n    }\n    uniqueNames.add(name);\n\n    const isHost = !hasHostLevel;\n    if (isHost) {\n      hasHostLevel = true;\n    }\n\n    participants.push({\n      id: `${i}`,\n      name,\n      audioID: `audio-${i}`,\n      videoID: `video-${i}`,\n      muted: Math.random() < 0.3,\n      islevel: isHost ? '2' : '1',\n      isHost,\n    });\n  }\n\n  return participants;\n}\n\nexport function useMediasfu(props: MediasfuGenericProps): UseMediasfuResult {\n  const state = ref<MediaSessionState>({\n    isSessionActive: false,\n    isLoading: false,\n    participants: [],\n    roomName: 'MediaSFU Room',\n    hostName: '',\n  });\n\n  const alerts = ref<MediaAlert[]>([]);\n  let alertId = 0;\n\n  const showAlert: ShowAlert = ({ message, type, duration = 4 }) => {\n    alertId += 1;\n    const id = alertId;\n    alerts.value.push({ id, message, type });\n\n    setTimeout(() => {\n      alerts.value = alerts.value.filter((alert) => alert.id !== id);\n    }, duration * 1000);\n  };\n\n  const updateExternalState = () => {\n    if (!props.updateSourceParameters) {\n      return;\n    }\n\n    props.updateSourceParameters({\n      ...props.sourceParameters,\n      participants: state.value.participants,\n      roomName: state.value.roomName,\n      hostName: state.value.hostName,\n      islevel: state.value.participants.find((p) => p.isHost)?.islevel ?? '1',\n      showAlert,\n    });\n  };\n\n  const {\n    isBackgroundModalVisible,\n    backgroundModalParameters,\n    toggleBackgroundModal,\n    closeBackgroundModal,\n  } = useBackgroundModal({\n    showAlert,\n  });\n\n  const {\n    isMenuModalVisible,\n    toggleMenuModal,\n    closeMenuModal,\n  } = useMenuModal();\n\n  const menuModalParameters = computed<MenuModalParameters>(() => ({\n    roomName: state.value.roomName,\n    adminPasscode: props.credentials?.apiKey ?? '0000',\n    islevel: state.value.participants.find((participant) => participant.isHost)?.islevel ?? '1',\n    eventType: props.noUIPreJoinOptions && 'eventType' in props.noUIPreJoinOptions\n      ? props.noUIPreJoinOptions.eventType ?? 'conference'\n      : 'conference',\n    localLink: props.localLink ?? (typeof window !== 'undefined' ? window.location.href : ''),\n    position: 'bottomRight',\n    shareButtons: true,\n    customButtons: [],\n    backgroundColor: '#83c0e9',\n  }));\n\n  const startSession = async (options: CreateMediaSFURoomOptions | JoinMediaSFURoomOptions) => {\n    state.value.isLoading = true;\n    try {\n      const hostName = options.userName;\n      state.value.hostName = hostName;\n      state.value.roomName = options.action === 'create'\n        ? `${hostName}'s Room`\n        : (options as JoinMediaSFURoomOptions).meetingID ?? 'MediaSFU Room';\n      state.value.participants = buildParticipants(hostName, props.seedData);\n      state.value.isSessionActive = true;\n      showAlert({ message: `Connected to ${state.value.roomName}`, type: 'success' });\n      updateExternalState();\n    } finally {\n      state.value.isLoading = false;\n    }\n  };\n\n  const endSession = () => {\n    state.value.isSessionActive = false;\n    state.value.participants = [];\n    showAlert({ message: 'Disconnected from session.', type: 'danger' });\n    updateExternalState();\n  };\n\n  const customParameters = computed(() => ({\n    participants: state.value.participants,\n    roomName: state.value.roomName,\n    islevel: state.value.participants.find((participant) => participant.isHost)?.islevel ?? '1',\n    showAlert,\n    alerts: alerts.value,\n    mediaSFUFunctions: {\n      endSession,\n      showAlert,\n      launchBackground: toggleBackgroundModal,\n      closeBackground: closeBackgroundModal,\n      launchMenu: toggleMenuModal,\n      closeMenu: closeMenuModal,\n    },\n    menuModalDefaults: menuModalParameters.value,\n  }));\n\n  watch(\n    () => props.sourceParameters,\n    (next) => {\n      if (!next || state.value.isSessionActive) {\n        return;\n      }\n      // Type assertion for sourceParameters since it's Record<string, unknown>\n      if ('participants' in next && Array.isArray(next.participants)) {\n        state.value.participants = next.participants as Participant[];\n      }\n      if ('roomName' in next && typeof next.roomName === 'string') {\n        state.value.roomName = next.roomName;\n      }\n    },\n    { deep: true }\n  );\n\n  onMounted(() => {\n    if (!props.returnUI && props.noUIPreJoinOptions) {\n      void startSession(props.noUIPreJoinOptions);\n    }\n  });\n\n  return {\n    state,\n    alerts,\n    showAlert,\n    startSession,\n    endSession,\n    customParameters,\n    isBackgroundModalVisible,\n    backgroundModalParameters: backgroundModalParameters as ComputedRef<Partial<BackgroundModalParameters>>,\n    toggleBackgroundModal,\n    closeBackgroundModal,\n    isMenuModalVisible,\n    toggleMenuModal,\n    closeMenuModal,\n    menuModalParameters,\n  };\n}\n","import { computed, reactive, ref } from 'vue'\nimport type { Ref } from 'vue'\nimport type { EventType, CreateMediaSFURoomOptions, JoinMediaSFURoomOptions, StyleDictionary } from 'mediasfu-shared'\nimport type { Credentials } from '../types/mediasfu'\n\nexport interface DemoState {\n  credentials: Credentials\n  localLink: Ref<string>\n  connectMediaSFU: Ref<boolean>\n  returnUI: Ref<boolean>\n  useCustomComponent: Ref<boolean>\n  useCustomCards: Ref<boolean>\n  noUIPreJoinOptions: Ref<CreateMediaSFURoomOptions | JoinMediaSFURoomOptions>\n  sourceParameters: Ref<Record<string, any>>\n  updateSourceParameters: (params: Record<string, any>) => void\n  containerStyle: Ref<StyleDictionary>\n  effectiveNoUIPreJoinOptions: Ref<CreateMediaSFURoomOptions | JoinMediaSFURoomOptions | undefined>\n  effectiveSourceParameters: Ref<Record<string, any> | undefined>\n}\n\nconst DEFAULT_CONTAINER_STYLE: StyleDictionary = {\n  minHeight: '85vh',\n  borderRadius: '32px',\n  padding: '2.5rem',\n}\n\nexport const useMediasfuDemo = (defaultEventType: EventType = 'webinar'): DemoState => {\n  const credentials = reactive<Credentials>({\n    apiUserName: 'yourDevUser',\n    apiKey: 'yourDevApiKey1234567890abcdef1234567890abcdef1234567890abcdef1234567890abcdef',\n  })\n\n  const localLink = ref('')\n  const connectMediaSFU = ref(true)\n  const returnUI = ref(true)\n  const useCustomComponent = ref(false)\n  const useCustomCards = ref(false)\n\n  const noUIPreJoinOptions = ref<CreateMediaSFURoomOptions | JoinMediaSFURoomOptions>({\n    action: 'create',\n    capacity: 10,\n    duration: 15,\n    eventType: defaultEventType === 'none' ? 'broadcast' : defaultEventType,\n    userName: 'Prince',\n  })\n\n  const sourceParameters = ref<Record<string, any>>({})\n  const updateSourceParameters = (params: Record<string, any>) => {\n    sourceParameters.value = params\n  }\n\n  const containerStyle = ref<StyleDictionary>(DEFAULT_CONTAINER_STYLE)\n\n  const effectiveNoUIPreJoinOptions = computed(() => (returnUI.value ? undefined : noUIPreJoinOptions.value))\n  const effectiveSourceParameters = computed(() => (returnUI.value ? undefined : sourceParameters.value))\n\n  return {\n    credentials,\n    localLink,\n    connectMediaSFU,\n    returnUI,\n    useCustomComponent,\n    useCustomCards,\n    noUIPreJoinOptions,\n    sourceParameters,\n    updateSourceParameters,\n    containerStyle,\n    effectiveNoUIPreJoinOptions,\n    effectiveSourceParameters,\n  }\n}\n"],"names":["createRoomOnMediaSFU","joinRoomOnMediaSFU","mediaDevices","startTime","padNumber","sleep","mediasoupClient","hParams","host_Params","vParams","video_Params","screen_Params","audio_Params","prepopulateUserMedia","getDomains","ref","watch","onMounted","onBeforeUnmount","computed","_createElementBlock","_mergeProps","_createElementVNode","onUnmounted","_renderSlot","_createVNode","CardVideoDisplay","_openBlock","_createBlock","_resolveDynamicComponent","_normalizeStyle","_toDisplayString","_Fragment","_renderList","_unref","FontAwesomeIcon","faMicrophoneSlash","faMicrophone","faVideo","faVideoSlash","defineComponent","isVNode","h","VideoCard","AudioCard","audioCardComponent","miniCardComponent","videoCardComponent","nextTick","_normalizeProps","activeScreenParticipants","miniAudioComponent","BORDER_WIDTH","toRefs","useSlots","_hoisted_1","_hoisted_2","faCopy","faEnvelope","faFacebook","faWhatsapp","faTelegram","_hoisted_3","faSpinner","props","faBars","faTimes","_hoisted_4","_hoisted_5","StandardPanelComponent","AdvancedPanelComponent","faDesktop","faComments","faCheck","respondToWaiting","__default__","modifyDisplaySettings","_hoisted_6","_hoisted_7","item","modifyCoHostSettings","faDotCircle","faComment","faTrash","ParticipantListItem","faCircle","ParticipantListOthersItem","faReply","_hoisted_8","faPaperPlane","MessagePanel","switchVideoAlt","switchVideo","switchAudio","faCamera","faSyncAlt","faPhotoFilm","validateAlphanumeric","validateWelcomeInputs","handleWelcomeRequest","handleCreateRoom","handleJoinRoom","markRaw","error","shallowRef","toRaw","SelfieSegmentation","_Teleport","faDoorOpen","faEdit","_createTextVNode","faUsers","faMinus","faUserFriends","_hoisted_9","faPlus","room","handleStartBreakout","handleStopBreakout","faRandom","faHandPointer","faSave","faPlay","faStop","captureCanvasStream","handleStartWhiteboard","handleStopWhiteboard","user","color","lineType","maxHeight","canvas","faChevronLeft","faChevronRight","faPencilAlt","faPaintBrush","faShapes","_hoisted_10","faMousePointer","faEraser","faHandPaper","faSearchPlus","faSearch","faSearchMinus","faFont","faTextHeight","faUndo","faRedo","faUpload","clonedVideoTrack","faLock","faStar","cloneVNode","MainContainerComponent","MainAspectComponent","MainScreenComponent","MainGridComponent","SubAspectComponent","OthergridComponent","FlexibleGrid","FlexibleVideo","AudioGrid","ControlButtonsAltComponent","ControlButtonsComponentTouch","Screenboard","MenuModal","RequestsModal","WaitingRoomModal","ParticipantsModal","MessagesModal","ConfirmExitModal","ConfirmHereModal","ShareEventModal","RecordingModal","screenParams","aParams","updateMiniCardsGrid","mixStreams","dispStreams","stopShareScreen","checkScreenShare","startShareScreen","requestScreenShare","reorderStreams","getVideos","rePort","trigger","connectSendTransport","connectSendTransportAudio","connectSendTransportVideo","connectSendTransportScreen","processConsumerTransports","resumePauseStreams","readjust","checkGrid","getEstimate","calculateRowsAndColumns","onScreenChanges","changeVids","compareActiveNames","compareScreenStates","createSendTransport","resumeSendTransportAudio","receiveAllPipedTransports","disconnectSendTransportVideo","disconnectSendTransportAudio","disconnectSendTransportScreen","getPipedProducersAlt","signalNewConsumerTransport","connectRecvTransport","reUpdateInter","updateParticipantAudioDecibels","closeAndResize","autoAdjust","switchUserVideoAlt","switchUserVideo","switchUserAudio","connectIps","connectLocalIps","handleCreatePoll","handleEndPoll","handleVotePoll","resumePauseAudioStreams","processConsumerTransportsAudio","checkPermission","streamSuccessVideo","streamSuccessAudio","streamSuccessScreen","streamSuccessAudioSwitch","params","device","faRecordVinyl","launchRecording","faPlayCircle","updateRecording","faPauseCircle","faStopCircle","stopRecording","faCog","launchSettings","launchRequests","faClock","launchWaiting","faUserPlus","launchCoHost","faTools","launchMediaSettings","launchDisplaySettings","faPoll","launchPoll","launchBreakoutRooms","faChalkboardTeacher","launchConfigureWhiteboard","launchParticipants","faShareAlt","launchMessages","faSync","faChartBar","faPhone","launchConfirmExit","faBan","launchMenuModal","joinRoom","data","socket","breakoutRoomUpdated","receiveRoomMessages","muteParticipants","messageParticipants","removeParticipants","startRecording","confirmRecording","reactive","launchBackground"],"mappings":"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"}