@xipkg/calls-compactview 0.1.55 → 0.1.57
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.d.ts +13 -2
- package/dist/index.mjs +376 -172
- package/dist/index.mjs.map +1 -1
- package/package.json +10 -10
package/dist/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/ui/compactDragSensors.ts","../src/constants.ts","../src/boardChromeInsets.ts","../src/hooks/useCompactAvailableHeight.ts","../src/hooks/useCompactNavigation.ts","../src/hooks/useDocumentPiP.ts","../src/providers/PiPProvider.tsx","../src/ui/CompactCallCollapsedBar.tsx","../src/ui/CompactNavigationControls.tsx","../src/ui/CompactMultiViewControls.tsx","../src/ui/CompactCallVideoArea.tsx","../src/ui/CompactCallBottomBar.tsx","../src/ui/CompactCall.tsx","../src/ui/ScreenShareStage.tsx","../src/ui/CompactView.tsx","../src/ui/PiPCompactCall.tsx"],"names":["useState","useEffect","useRoom","useCallStore","useCallback","useRef","jsxs","jsx","Track","useTranslation","cn","Button","Tooltip","TooltipTrigger","TooltipContent","usePhoneLayout","useLocalParticipant","mode","useMemo","useClassroomPins","EDGE_PX","useTracks","RemoteTrackPublication","useLayoutEffect","createPortal","Fragment","ScreenShareStageToggle","ParticipantPinToggle","useCallsNavigation","useSensors","useSensor","Chat","DndContext","restrictToWindowEdges","useChatStore","Users","SoundTwo","Account","usePersistentUserChoices","useTrackToggle","useDeviceMenuGroups","ParticipantTile","DevicesBar","LessonRecordButton","ScreenShareButton","ChatButton","RaiseHandButton","DisconnectButton"],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n PointerSensor,\n TouchSensor,\n type PointerSensorOptions,\n type PointerSensorProps,\n} from '@dnd-kit/core';\nimport type { PointerEvent as ReactPointerEvent } from 'react';\n\n/**\n * dnd-kit отменяет drag на window `resize`. На планшете жест меняет visual viewport\n * (тулбар, dvh) и браузер шлёт resize сразу после старта: зоны уже видны, а перенос обрывается.\n */\nconst detachResizeCancel = (sensor: object, event: Event) => {\n const target = event.target;\n const view =\n target instanceof Node\n ? (target.ownerDocument?.defaultView ?? null)\n : 'view' in event && event.view instanceof Window\n ? event.view\n : null;\n\n if (!view) return;\n\n view.removeEventListener('resize', (sensor as { handleCancel: EventListener }).handleCancel);\n};\n\n/**\n * Мышь и стилус. Палец сюда не берём: PointerSensor на iOS отменяет касание (pointercancel),\n * потому что preventDefault на pointermove там не работает.\n */\nexport class CompactPointerSensor extends PointerSensor {\n constructor(props: PointerSensorProps) {\n super(props);\n detachResizeCancel(this, props.event);\n }\n\n static activators = [\n {\n eventName: 'onPointerDown' as const,\n handler: (\n { nativeEvent: event }: ReactPointerEvent,\n { onActivation }: PointerSensorOptions,\n ) => {\n if (!event.isPrimary || event.button !== 0 || event.pointerType === 'touch') {\n return false;\n }\n\n onActivation?.({ event });\n return true;\n },\n },\n ];\n}\n\n/** Палец. TouchSensor заранее вешает non-passive touchmove, без этого iOS Safari гасит жест. */\nexport class CompactTouchSensor extends TouchSensor {\n constructor(props: PointerSensorProps) {\n super(props);\n detachResizeCancel(this, props.event);\n }\n}\n","import type { CompactViewModeT } from '@xipkg/calls-store';\n\n/** Высота шапки приложения (top-16) */\nexport const HEADER_HEIGHT_PX = 64;\n/**\n * Доп. зазор между fixed compact overlay и контентом доски на телефоне.\n * marginTop контента = высота overlay + этот отступ.\n */\nexport const COMPACT_MOBILE_CONTENT_GAP_PX = 12;\n/** Fallback высоты overlay, пока ResizeObserver ещё не дал headerHeight */\nexport const COMPACT_MOBILE_OVERLAY_FALLBACK_PX = 120;\n/** Тулбар доски сверху и снизу при работе на доске */\nexport const BOARD_TOP_TOOLBAR_PX = 64;\nexport const BOARD_BOTTOM_TOOLBAR_PX = 64;\n/** Нижний отступ: при доске — тулбар доски, иначе общий отступ */\nexport const BOTTOM_OFFSET_BOARD_PX = BOARD_BOTTOM_TOOLBAR_PX;\nexport const BOTTOM_OFFSET_DEFAULT_PX = 16;\nexport const COMPACT_BOTTOM_BAR_PX = 40;\n/** Высота полоски «только аудио» (CompactCallCollapsedBar) */\nexport const COMPACT_AUDIO_BAR_HEIGHT_PX = 48;\nexport const TILES_PADDING_PX = 16;\n\nexport const TILE_MIN_HEIGHT_PX = 120;\nexport const TILE_GAP_PX = 8;\n\n/** Вертикальный padding контейнера expanded-режима (p-1: 4px сверху + 4px снизу) */\nexport const EXPANDED_VIDEO_PADDING_VERTICAL_PX = 8;\n/** Отступ между областью видео и нижней панелью (mb-2 на контейнере видео) */\nexport const COMPACT_VIDEO_AREA_MARGIN_PX = 8;\n/** Нижний отступ compact call на странице доски, соответствует CSS bottom-[72px] */\nexport const COMPACT_BOTTOM_OFFSET_BOARD_PX = BOARD_BOTTOM_TOOLBAR_PX + TILE_GAP_PX; // 72\n\n/** Ширина панели компакт-ВКС: влезает вся нижняя панель, включая запись и завершение звонка. */\nexport const COMPACT_PANEL_WIDTH_PX = 400;\nexport const TILE_HEIGHT_16_9_PX = Math.round((COMPACT_PANEL_WIDTH_PX * 9) / 16); // 225 при ширине 400\n\n/** Размеры окна PiP Document */\nexport const PIP_PANEL_WIDTH_PX = 400;\nexport const PIP_BAR_HEIGHT_PX = 48;\n/** Зазор между областью видео и нижней панелью в PiP (gap-1) */\nexport const PIP_VIDEO_BAR_GAP_PX = 4;\n/** Внутренний вертикальный padding области плиток в PiP expanded (p-0.5) */\nexport const PIP_EXPANDED_INNER_PADDING_PX = 4;\n/** Панель управления + gap + внешний padding корня PiP (p-1 + gap-1 + h-12) */\nexport const PIP_CHROME_HEIGHT_PX =\n PIP_BAR_HEIGHT_PX + PIP_VIDEO_BAR_GAP_PX + EXPANDED_VIDEO_PADDING_VERTICAL_PX;\n\n/**\n * Доп. высота окна Document PiP: шапка браузера не входит в innerHeight,\n * без неё обрезается нижняя панель (~⅔ высоты control bar).\n */\nexport const PIP_DOCUMENT_WINDOW_FRAME_PX = Math.round((PIP_BAR_HEIGHT_PX * 2) / 3);\n\n/**\n * Высота «хрома» + внутренний padding expanded-области (p-0.5).\n * Используется при расчёте, сколько плиток влезает по высоте окна.\n */\nexport const PIP_RESERVED_HEIGHT_PX = PIP_CHROME_HEIGHT_PX + PIP_EXPANDED_INNER_PADDING_PX;\n\n/** Высота одной плитки 16:9 при ширине PiP */\nexport const PIP_TILE_HEIGHT_16_9_PX = Math.round((PIP_PANEL_WIDTH_PX * 9) / 16);\n\n/**\n * Высота области с плитками в PiP.\n * @param tileCount — число видимых плиток 16:9\n * @param withExpandedInnerPadding — p-0.5 вокруг стека в expanded\n */\nexport function getPipTilesStackHeightPx(\n tileCount: number,\n withExpandedInnerPadding = false,\n): number {\n const n = Math.max(1, tileCount);\n const innerPad = withExpandedInnerPadding ? PIP_EXPANDED_INNER_PADDING_PX : 0;\n return innerPad + n * PIP_TILE_HEIGHT_16_9_PX + Math.max(0, n - 1) * TILE_GAP_PX;\n}\n\n/** Высота контента PiP (innerHeight), без шапки окна браузера */\nexport function getPipContentHeight(mode: CompactViewModeT, tileCount = 1): number {\n if (mode === 'audio') {\n return PIP_CHROME_HEIGHT_PX + COMPACT_AUDIO_BAR_HEIGHT_PX;\n }\n if (mode === 'basic') {\n return PIP_CHROME_HEIGHT_PX + getPipTilesStackHeightPx(1, false);\n }\n const n = Math.min(Math.max(1, tileCount), 4);\n return PIP_CHROME_HEIGHT_PX + getPipTilesStackHeightPx(n, true);\n}\n\n/** Высота для resizeTo / requestWindow (контент + шапка Document PiP) */\nexport function getPipWindowHeight(mode: CompactViewModeT, tileCount = 1): number {\n return getPipContentHeight(mode, tileCount) + PIP_DOCUMENT_WINDOW_FRAME_PX;\n}\n\n/** Минимальная высота области чата внутри PiP */\nexport const PIP_CHAT_AREA_MIN_HEIGHT_PX = 360;\n\n/**\n * Высота окна PiP при открытом чате.\n * audio/basic — чат под видео/аудио-полосой (высоты складываются).\n * expanded — чат вместо плиток (не меньше удобной высоты чата).\n */\nexport function getPipWindowHeightWithChat(mode: CompactViewModeT, tileCount = 1): number {\n if (mode === 'expanded') {\n const tilesHeight = getPipWindowHeight(mode, tileCount);\n const chatOnly =\n PIP_CHROME_HEIGHT_PX + PIP_CHAT_AREA_MIN_HEIGHT_PX + PIP_DOCUMENT_WINDOW_FRAME_PX;\n return Math.max(tilesHeight, chatOnly);\n }\n return getPipWindowHeight(mode, 1) + PIP_VIDEO_BAR_GAP_PX + PIP_CHAT_AREA_MIN_HEIGHT_PX;\n}\n\n/** Минимальный innerHeight для n плиток в expanded */\nexport function getPipRequiredHeightForTiles(tileCount: number): number {\n return getPipContentHeight('expanded', tileCount);\n}\n\n/** @deprecated Используйте getPipWindowHeight('basic', 1) */\nexport const PIP_HEIGHT_BASIC_PX = getPipWindowHeight('basic', 1);\n\n/** @deprecated Используйте getPipWindowHeight('audio', 1) */\nexport const PIP_HEIGHT_AUDIO_PX = getPipWindowHeight('audio', 1);\n\nconst COMPACT_VIEW_MODES: CompactViewModeT[] = ['basic', 'expanded', 'audio'];\n\nexport function getNextCompactViewMode(current: CompactViewModeT): CompactViewModeT {\n const index = COMPACT_VIEW_MODES.indexOf(current);\n return COMPACT_VIEW_MODES[(index + 1) % COMPACT_VIEW_MODES.length];\n}\n\nexport function getPipHeightForMode(mode: CompactViewModeT, participantCount: number): number {\n if (mode === 'expanded') {\n const n = Math.min(Math.max(1, participantCount), 4);\n return getPipWindowHeight('expanded', n);\n }\n return getPipWindowHeight(mode, 1);\n}\n\n/** @deprecated Используйте getPipWindowHeight('expanded', n) */\nexport function getPipHeightExpandedPx(participantCount: number): number {\n return getPipHeightForMode('expanded', participantCount);\n}\n","import { useLayoutEffect, useState } from 'react';\nimport type { CSSProperties } from 'react';\nimport type { CornerT } from '@xipkg/calls-store';\nimport {\n BOTTOM_OFFSET_DEFAULT_PX,\n COMPACT_BOTTOM_OFFSET_BOARD_PX,\n HEADER_HEIGHT_PX,\n} from './constants';\n\n/**\n * Доска публикует отступы хрома на documentElement.\n * Имена совпадают с modules.board `boardToolbarDock`.\n */\nconst TOP_VAR = '--board-chrome-top';\nconst RIGHT_VAR = '--board-chrome-right';\nconst BOTTOM_VAR = '--board-chrome-bottom';\nconst LEFT_VAR = '--board-chrome-left';\n\nconst EDGE_PX = 16;\nconst CHAT_TOP_PX = 128;\nconst CHAT_LEFT_EXTRA_PX = 72;\n\nexport type BoardChromeInsets = {\n top: number;\n right: number;\n bottom: number;\n left: number;\n};\n\nfunction readPx(name: string): number | null {\n if (typeof document === 'undefined') return null;\n const raw = getComputedStyle(document.documentElement).getPropertyValue(name).trim();\n if (!raw) return null;\n const value = Number.parseFloat(raw);\n return Number.isFinite(value) ? value : null;\n}\n\nexport function defaultBoardChromeInsets(isBoardPage: boolean): BoardChromeInsets {\n return {\n top: HEADER_HEIGHT_PX,\n right: EDGE_PX,\n bottom: isBoardPage ? COMPACT_BOTTOM_OFFSET_BOARD_PX : BOTTOM_OFFSET_DEFAULT_PX,\n left: EDGE_PX,\n };\n}\n\nexport function readBoardChromeInsets(isBoardPage: boolean): BoardChromeInsets {\n const fallback = defaultBoardChromeInsets(isBoardPage);\n return {\n top: readPx(TOP_VAR) ?? fallback.top,\n right: readPx(RIGHT_VAR) ?? fallback.right,\n bottom: readPx(BOTTOM_VAR) ?? fallback.bottom,\n left: readPx(LEFT_VAR) ?? fallback.left,\n };\n}\n\nfunction sameInsets(left: BoardChromeInsets, right: BoardChromeInsets) {\n return (\n left.top === right.top &&\n left.right === right.right &&\n left.bottom === right.bottom &&\n left.left === right.left\n );\n}\n\nexport function useBoardChromeInsets(isBoardPage: boolean): BoardChromeInsets {\n const [insets, setInsets] = useState(() => readBoardChromeInsets(isBoardPage));\n\n useLayoutEffect(() => {\n const update = () => {\n const next = readBoardChromeInsets(isBoardPage);\n setInsets((current) => (sameInsets(current, next) ? current : next));\n };\n update();\n const observer = new MutationObserver(update);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['style'],\n });\n return () => observer.disconnect();\n }, [isBoardPage]);\n\n return insets;\n}\n\nexport function cornerStyle(corner: CornerT, insets: BoardChromeInsets): CSSProperties {\n switch (corner) {\n case 'top-left':\n return { top: insets.top, left: insets.left };\n case 'top-right':\n return { top: insets.top, right: insets.right };\n case 'bottom-left':\n return { bottom: insets.bottom, left: insets.left };\n case 'bottom-right':\n return { bottom: insets.bottom, right: insets.right };\n }\n}\n\nexport function chatPositionStyle(corner: CornerT, insets: BoardChromeInsets): CSSProperties {\n const oppositeLeft = corner === 'top-right' || corner === 'bottom-right';\n const top = CHAT_TOP_PX + Math.max(0, insets.top - HEADER_HEIGHT_PX);\n return oppositeLeft\n ? { top, bottom: insets.bottom, left: insets.left + CHAT_LEFT_EXTRA_PX }\n : { top, bottom: insets.bottom, right: insets.right };\n}\n","import { useEffect, useState } from 'react';\nimport { useBoardChromeInsets } from '../boardChromeInsets';\n\n/**\n * Максимальная высота контейнера compact call (видео + нижняя панель).\n * На доске учитывает отступы тулбара из CSS-переменных `--board-chrome-*`.\n */\nexport function useCompactAvailableHeight(isOnBoardPage: boolean): number {\n const insets = useBoardChromeInsets(isOnBoardPage);\n const [availableHeight, setAvailableHeight] = useState(() => {\n if (typeof window === 'undefined') return 400;\n return window.innerHeight - insets.top - insets.bottom;\n });\n\n useEffect(() => {\n const update = () => {\n setAvailableHeight(window.innerHeight - insets.top - insets.bottom);\n };\n update();\n window.addEventListener('resize', update);\n return () => window.removeEventListener('resize', update);\n }, [insets.top, insets.bottom]);\n\n return availableHeight;\n}\n","import { useState, useEffect, useMemo } from 'react';\nimport { RemoteTrackPublication, Track } from 'livekit-client';\nimport { useTracks } from '@livekit/components-react';\nimport { applyPinsFirst, useCallStore } from '@xipkg/calls-store';\nimport { useClassroomPins, useScreenShareCleanup, useSortedTracks } from '@xipkg/calls-hooks';\nimport { useRoom } from '@xipkg/calls-providers';\n\nexport const useCompactNavigation = () => {\n const { room } = useRoom();\n const [currentParticipantIndex, setCurrentParticipantIndex] = useState(0);\n\n const participants = useTracks(\n [\n { source: Track.Source.Camera, withPlaceholder: true },\n { source: Track.Source.ScreenShare, withPlaceholder: false },\n ],\n {\n onlySubscribed: false,\n },\n );\n\n useScreenShareCleanup(participants);\n\n // VideoGrid при уходе в compact размонтируется. Если плитки ещё и сами\n // отписываются по IntersectionObserver, удалённые камеры остаются\n // isSubscribed=false — а CompactCall рисует VideoTrack только для\n // подписанных треков. Локальная камера от этого не страдает.\n // Не трогаем подписки, пока комната не connected: setSubscribed в момент\n // publish/reconnect на локальном 1.8.x срывает SDP (negotiation timed out).\n useEffect(() => {\n if (room.state !== 'connected') return;\n\n participants.forEach((trackRef) => {\n const publication = trackRef.publication;\n if (\n publication instanceof RemoteTrackPublication &&\n publication.kind === Track.Kind.Video &&\n publication.isEnabled &&\n !publication.isSubscribed\n ) {\n publication.setSubscribed(true);\n }\n });\n }, [participants, room]);\n\n const baseSorted = useSortedTracks(participants, 1);\n const { pins } = useClassroomPins();\n\n const sorted = useMemo(() => applyPinsFirst(baseSorted, pins), [baseSorted, pins]);\n const screenShareStageIdentity = useCallStore((state) => state.screenShareStageIdentity);\n\n // На весь экран уже выведена демонстрация — в панели остаются камеры участников.\n const visibleSorted = useMemo(() => {\n if (!screenShareStageIdentity) return sorted;\n return sorted.filter((trackRef) => trackRef.source !== Track.Source.ScreenShare);\n }, [screenShareStageIdentity, sorted]);\n\n const currentParticipant = visibleSorted[currentParticipantIndex] || null;\n const totalParticipants = visibleSorted.length;\n\n const canGoNext = currentParticipantIndex < totalParticipants - 1;\n const canGoPrev = currentParticipantIndex > 0;\n\n const goToNext = () => {\n if (canGoNext) {\n setCurrentParticipantIndex((prev) => prev + 1);\n }\n };\n\n const goToPrev = () => {\n if (canGoPrev) {\n setCurrentParticipantIndex((prev) => prev - 1);\n }\n };\n\n const goToParticipant = (index: number) => {\n if (index >= 0 && index < totalParticipants) {\n setCurrentParticipantIndex(index);\n }\n };\n\n useEffect(() => {\n if (currentParticipantIndex >= totalParticipants && totalParticipants > 0) {\n setCurrentParticipantIndex(Math.max(0, totalParticipants - 1));\n }\n }, [totalParticipants, currentParticipantIndex]);\n\n const pinsKey = pins.map((pin) => `${pin.userId}:${pin.source}`).join(',');\n\n useEffect(() => {\n if (pins.length > 0) {\n setCurrentParticipantIndex(0);\n }\n }, [pinsKey, pins.length]);\n\n useEffect(() => {\n if (!screenShareStageIdentity) return;\n setCurrentParticipantIndex(0);\n }, [screenShareStageIdentity]);\n\n return {\n currentParticipant,\n participants: visibleSorted,\n currentIndex: currentParticipantIndex,\n totalParticipants,\n canGoNext,\n canGoPrev,\n goToNext,\n goToPrev,\n goToParticipant,\n };\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { PIP_PANEL_WIDTH_PX } from '../constants';\n\ndeclare global {\n interface DocumentPictureInPicture {\n requestWindow(options?: {\n width?: number;\n height?: number;\n disallowReturnToOpener?: boolean;\n preferInitialWindowPlacement?: boolean;\n }): Promise<Window>;\n window: Window | null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n interface DocumentPictureInPictureEvent extends Event {}\n\n interface Window {\n documentPictureInPicture?: DocumentPictureInPicture;\n __SOVLIUM_NATIVE__?: boolean;\n }\n\n // setMicrophoneActive / setCameraActive есть в Chrome 93+, в lib.dom.d.ts пока нет\n interface MediaSession {\n setMicrophoneActive(active: boolean): Promise<void> | void;\n setCameraActive(active: boolean): Promise<void> | void;\n }\n}\n\nfunction setMediaSessionCaptureState(\n setActive: ((active: boolean) => Promise<void> | void) | undefined,\n active: boolean,\n) {\n if (!setActive) return;\n try {\n const result = setActive(active);\n result?.catch(() => {\n // Chrome отклоняет активацию без user gesture — ожидаемо вне обработчика клика\n });\n } catch {\n // ignore\n }\n}\n\ntype UseDocumentPiPOptions = {\n width?: number;\n height?: number;\n enabled?: boolean;\n microphoneActive?: boolean;\n cameraActive?: boolean;\n};\n\nfunction applyDocumentTheme(sourceDoc: Document, targetDoc: Document) {\n const sourceEl = sourceDoc.documentElement;\n const targetEl = targetDoc.documentElement;\n const theme = sourceEl.getAttribute('data-theme');\n if (theme) {\n targetEl.setAttribute('data-theme', theme);\n } else {\n targetEl.removeAttribute('data-theme');\n }\n targetEl.className = sourceEl.className;\n const colorScheme = getComputedStyle(sourceEl).colorScheme;\n if (colorScheme) {\n targetEl.style.colorScheme = colorScheme;\n targetDoc.body.style.colorScheme = colorScheme;\n }\n const pageBg =\n getComputedStyle(sourceEl).getPropertyValue('--xi-background-page').trim() ||\n (theme === 'dark' ? '#1a1a1a' : '#ffffff');\n targetEl.style.height = '100%';\n targetEl.style.background = pageBg;\n targetDoc.body.style.margin = '0';\n targetDoc.body.style.height = '100%';\n targetDoc.body.style.overflow = 'hidden';\n targetDoc.body.style.background = pageBg;\n}\n\nfunction copyStylesToWindow(targetWindow: Window) {\n [...document.styleSheets].forEach((styleSheet) => {\n try {\n const cssRules = [...styleSheet.cssRules].map((rule) => rule.cssText).join('');\n const style = document.createElement('style');\n style.textContent = cssRules;\n targetWindow.document.head.appendChild(style);\n } catch {\n if (styleSheet.href) {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.type = styleSheet.type || 'text/css';\n link.media = styleSheet.media.mediaText;\n link.href = styleSheet.href;\n targetWindow.document.head.appendChild(link);\n }\n }\n });\n\n try {\n document.fonts.forEach((font) => {\n targetWindow.document.fonts.add(font);\n });\n } catch {\n // ignore\n }\n}\n\nexport function useDocumentPiP({\n width = PIP_PANEL_WIDTH_PX,\n height = 270,\n enabled = true,\n microphoneActive = false,\n cameraActive = false,\n}: UseDocumentPiPOptions = {}) {\n const [pipWindow, setPipWindow] = useState<Window | null>(null);\n const pipWindowRef = useRef<Window | null>(null);\n const micActiveRef = useRef(microphoneActive);\n const camActiveRef = useRef(cameraActive);\n\n micActiveRef.current = microphoneActive;\n camActiveRef.current = cameraActive;\n\n const isSupported = typeof window !== 'undefined' && 'documentPictureInPicture' in window;\n\n // Chrome для авто-PiP при видеозвонках требует setCameraActive / setMicrophoneActive\n useEffect(() => {\n if (!enabled) return;\n\n const mediaSession = navigator.mediaSession;\n if (!mediaSession) return;\n\n setMediaSessionCaptureState(\n typeof mediaSession.setMicrophoneActive === 'function'\n ? mediaSession.setMicrophoneActive.bind(mediaSession)\n : undefined,\n microphoneActive,\n );\n setMediaSessionCaptureState(\n typeof mediaSession.setCameraActive === 'function'\n ? mediaSession.setCameraActive.bind(mediaSession)\n : undefined,\n cameraActive,\n );\n }, [enabled, microphoneActive, cameraActive]);\n\n const openPiP = useCallback(\n async (overrides?: { width?: number; height?: number }): Promise<Window | null> => {\n if (!isSupported || !enabled) return null;\n if (pipWindowRef.current) return pipWindowRef.current;\n\n const w = overrides?.width ?? width;\n const h = overrides?.height ?? height;\n\n try {\n const pip = await window.documentPictureInPicture!.requestWindow({\n width: w,\n height: h,\n });\n\n copyStylesToWindow(pip);\n applyDocumentTheme(document, pip.document);\n\n const themeObserver = new MutationObserver(() => {\n applyDocumentTheme(document, pip.document);\n });\n themeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'class', 'style'],\n });\n\n pipWindowRef.current = pip;\n setPipWindow(pip);\n\n try {\n pip.resizeTo(w, h);\n } catch {\n // ignore\n }\n\n pip.addEventListener('pagehide', () => {\n themeObserver.disconnect();\n pipWindowRef.current = null;\n setPipWindow(null);\n });\n\n return pip;\n } catch {\n return null;\n }\n },\n [isSupported, enabled, width, height],\n );\n\n const closePiP = useCallback(() => {\n if (pipWindowRef.current) {\n pipWindowRef.current.close();\n }\n }, []);\n\n // Закрываем PiP при возврате на вкладку\n useEffect(() => {\n if (!enabled) return;\n\n const handleVisibilityChange = () => {\n // Native mini-window *is* the opener; closing on focus would expand\n // the call every time the user clicks the overlay.\n if (typeof window !== 'undefined' && window.__SOVLIUM_NATIVE__) return;\n if (!document.hidden && pipWindowRef.current) {\n closePiP();\n }\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n return () => document.removeEventListener('visibilitychange', handleVisibilityChange);\n }, [enabled, closePiP]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n pipWindowRef.current?.close();\n pipWindowRef.current = null;\n };\n }, []);\n\n const resizePiP = useCallback((w: number, h: number) => {\n if (pipWindowRef.current) {\n try {\n pipWindowRef.current.resizeTo(w, h);\n } catch {\n // ignore\n }\n }\n }, []);\n\n return {\n isSupported,\n pipWindow,\n isPiPActive: pipWindow !== null,\n openPiP,\n closePiP,\n resizePiP,\n };\n}\n","import { createContext, useCallback, useContext, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useLocalParticipant } from '@livekit/components-react';\nimport { useDocumentPiP, useCompactNavigation } from '../hooks';\nimport { PiPCompactCall } from '../ui';\nimport { useCallStore } from '@xipkg/calls-store';\nimport { useRoom } from '@xipkg/calls-providers';\nimport { usePhoneLayout } from '@xipkg/calls-utils';\nimport { getPipHeightForMode, PIP_HEIGHT_BASIC_PX, PIP_PANEL_WIDTH_PX } from '../constants';\n\ntype PiPContextValue = {\n openPiP: () => Promise<void>;\n closePiP: () => void;\n isPiPActive: boolean;\n isSupported: boolean;\n resizePiPTo: (height: number) => void;\n};\n\nconst PiPContext = createContext<PiPContextValue | null>(null);\n\nexport function usePiP() {\n const ctx = useContext(PiPContext);\n return ctx;\n}\n\nfunction getMediaStreamTrack(\n pub: { track?: { mediaStreamTrack?: MediaStreamTrack } } | undefined,\n): MediaStreamTrack | undefined {\n return pub?.track?.mediaStreamTrack;\n}\n\nfunction useMediaCaptureLive() {\n const { microphoneTrack, cameraTrack } = useLocalParticipant();\n const micTrack = getMediaStreamTrack(microphoneTrack);\n const camTrack = getMediaStreamTrack(cameraTrack);\n const micLive = !!micTrack && micTrack.readyState === 'live' && micTrack.enabled;\n const camLive = !!camTrack && camTrack.readyState === 'live' && camTrack.enabled;\n return { micLive, camLive };\n}\n\ntype PiPProviderProps = {\n children: React.ReactNode;\n};\n\n/**\n * Предоставляет API PiP (openPiP, isSupported) дочерним компонентам и управляет\n * Document Picture-in-Picture (логика из PiPManager).\n */\nexport function PiPProvider({ children }: PiPProviderProps) {\n const isMobile = usePhoneLayout();\n const { micLive, camLive } = useMediaCaptureLive();\n const { room } = useRoom();\n const compactViewMode = useCallStore((s) => s.compactViewMode);\n const { totalParticipants } = useCompactNavigation();\n\n const {\n pipWindow,\n closePiP,\n resizePiP,\n openPiP: openPiPRaw,\n isSupported,\n } = useDocumentPiP({\n enabled: !isMobile,\n width: PIP_PANEL_WIDTH_PX,\n height: PIP_HEIGHT_BASIC_PX,\n microphoneActive: micLive,\n cameraActive: camLive,\n });\n\n const openPiP = useCallback(async () => {\n const width = PIP_PANEL_WIDTH_PX;\n const height = getPipHeightForMode(compactViewMode, totalParticipants);\n const pip = await openPiPRaw({ width, height });\n if (pip) {\n // requestWindow не всегда сразу даёт нужный innerHeight — подгоняем сразу при открытии\n requestAnimationFrame(() => {\n resizePiP?.(width, height);\n });\n }\n }, [openPiPRaw, resizePiP, compactViewMode, totalParticipants]);\n\n useEffect(() => {\n if (!room || !pipWindow) return;\n if (room.state !== 'connected') {\n closePiP();\n return;\n }\n const handleState = () => {\n if (room.state !== 'connected') closePiP();\n };\n room.on('connectionStateChanged', handleState);\n return () => {\n room.off('connectionStateChanged', handleState);\n };\n }, [room, pipWindow, closePiP]);\n\n const resizePiPTo = useCallback(\n (height: number) => {\n resizePiP?.(PIP_PANEL_WIDTH_PX, height);\n },\n [resizePiP],\n );\n\n const openPiPRef = useRef(openPiP);\n openPiPRef.current = openPiP;\n\n useEffect(() => {\n if (!isSupported || isMobile) return;\n\n const request = () => {\n void openPiPRef.current();\n };\n const close = () => {\n closePiP();\n };\n\n window.addEventListener('sovlium:call-pip-request', request);\n window.addEventListener('sovlium:call-pip-close', close);\n return () => {\n window.removeEventListener('sovlium:call-pip-request', request);\n window.removeEventListener('sovlium:call-pip-close', close);\n };\n }, [isSupported, isMobile, closePiP]);\n\n // Media Session PiP — с корректной высотой под текущий режим (не дефолт basic)\n useEffect(() => {\n if (!isSupported || isMobile) return;\n\n const action = 'enterpictureinpicture' as MediaSessionAction;\n const mediaSession = navigator.mediaSession;\n if (!mediaSession) return;\n\n try {\n mediaSession.setActionHandler(action, () => {\n void openPiPRef.current();\n });\n } catch {\n // enterpictureinpicture не поддерживается\n }\n\n return () => {\n try {\n mediaSession.setActionHandler(action, null);\n } catch {\n // ignore\n }\n };\n }, [isSupported, isMobile]);\n\n const value: PiPContextValue = {\n openPiP,\n closePiP,\n isPiPActive: pipWindow !== null,\n isSupported: isSupported && !isMobile,\n resizePiPTo,\n };\n\n return (\n <PiPContext.Provider value={value}>\n {children}\n {pipWindow &&\n createPortal(\n <div className=\"bg-background-page h-full min-h-0\">\n <PiPCompactCall pipWindow={pipWindow} resizePiPTo={resizePiPTo} />\n </div>,\n pipWindow.document.body,\n )}\n </PiPContext.Provider>\n );\n}\n","import type { CSSProperties } from 'react';\nimport { useAudioWaveform } from '@livekit/components-react';\nimport type { LocalAudioTrack, RemoteAudioTrack } from 'livekit-client';\nimport { Participant, Track } from 'livekit-client';\nimport { ChevronBottom, MicrophoneOff, RedLine } from '@xipkg/icons';\nimport { Button } from '@xipkg/button';\nimport { ParticipantName, TrackMutedIndicator, RaisedHandIndicator } from '@xipkg/calls-ui';\nimport { cn } from '@xipkg/utils';\nimport { useTranslation } from 'react-i18next';\n\ntype CompactCallCollapsedBarProps = {\n participant: Participant | null;\n audioTrack?: LocalAudioTrack | RemoteAudioTrack | null;\n onExpand: () => void;\n className?: string;\n style?: CSSProperties;\n};\n\nexport function CompactCallCollapsedBar({\n participant,\n audioTrack,\n onExpand,\n className,\n style,\n}: CompactCallCollapsedBarProps) {\n const { t } = useTranslation('calls');\n const { bars } = useAudioWaveform(audioTrack ?? undefined, {\n barCount: 24,\n volMultiplier: 4,\n updateInterval: 50,\n });\n return (\n <div\n style={style}\n className={cn(\n 'bg-background-surface border-border-default flex items-center gap-2 rounded-2xl border px-2 py-2 shadow-lg',\n className,\n )}\n >\n {/* Тот же блок, что и в плитке участника ВКС: микрофон + имя */}\n <div className=\"bg-background-page/80 flex h-6 max-w-[45%] min-w-0 shrink gap-1.5 rounded-lg px-1.5 py-1 backdrop-blur\">\n {participant ? (\n <>\n <TrackMutedIndicator\n trackRef={{\n participant,\n source: Track.Source.Microphone,\n }}\n show=\"muted\"\n style={{ marginRight: '0.45rem', background: 'transparent' }}\n />\n <span className=\"flex min-w-0 truncate\">\n <ParticipantName participant={participant} />\n </span>\n </>\n ) : (\n <>\n <div className=\"relative w-3 shrink-0\">\n <MicrophoneOff className=\"fill-icon-primary absolute h-4 w-4\" />\n <RedLine className=\"fill-icon-danger absolute h-4 w-4\" />\n </div>\n <span className=\"text-xs-base-size text-text-primary leading-[16px]\">\n {t('compactView.noParticipants')}\n </span>\n </>\n )}\n </div>\n {participant && <RaisedHandIndicator participant={participant ?? 'unknown'} />}\n <div className=\"flex min-w-0 flex-1 items-center justify-center gap-0.5 py-1\">\n {bars.length > 0 ? (\n <div className=\"flex h-4 items-end justify-center gap-0.5\">\n {bars.map((h, i) => (\n <div\n key={i}\n className=\"bg-action-primary-background-default w-0.5 min-w-[2px] rounded-full transition-all duration-75\"\n style={{ height: `${Math.min(100, Math.max(20, h * 150))}%` }}\n />\n ))}\n </div>\n ) : (\n <div className=\"bg-action-primary-background-default h-2 w-12 rounded-full\" />\n )}\n </div>\n <Button\n size=\"icon\"\n variant=\"none\"\n onClick={onExpand}\n className=\"bg-action-primary-background-pressed hover:bg-action-primary-background-pressed/80 text-text-on-accent h-8 w-8 shrink-0 rounded-xl p-0\"\n aria-label={t('compactView.expand')}\n >\n <ChevronBottom className=\"fill-action-primary-text h-4 w-4\" />\n </Button>\n </div>\n );\n}\n","import { ArrowLeft, ArrowRight } from '@xipkg/icons';\nimport { useTranslation } from 'react-i18next';\n\ninterface CompactNavigationControlsProps {\n canPrev: boolean;\n canNext: boolean;\n onPrev: () => void;\n onNext: () => void;\n currentIndex: number;\n totalParticipants: number;\n}\n\n/**\n * Элементы управления навигацией для компактного вида\n * Показывает кнопки навигации и индикаторы участников только при наведении\n */\nexport function CompactNavigationControls({\n canPrev,\n canNext,\n onPrev,\n onNext,\n currentIndex,\n totalParticipants,\n}: CompactNavigationControlsProps) {\n const { t } = useTranslation('calls');\n\n if (totalParticipants <= 1) {\n return null;\n }\n\n return (\n <div className=\"pointer-events-none absolute inset-0\">\n {/* Индикатор участников вверху */}\n <div className=\"pointer-events-auto absolute top-2 left-1/2 -translate-x-1/2\">\n <div className=\"bg-background-subtle/80 flex gap-1 rounded-full px-2 py-1 backdrop-blur-sm transition-opacity duration-200 sm:opacity-0 sm:group-hover:opacity-100\">\n {Array.from({ length: totalParticipants }, (_, index) => (\n <button\n key={index}\n type=\"button\"\n onClick={() => {\n // Здесь можно добавить логику для прямого перехода к участнику\n // Пока оставляем только навигацию через кнопки\n }}\n className={`h-1.5 w-1.5 rounded-full transition-colors ${\n index === currentIndex\n ? 'bg-text-primary'\n : 'bg-text-primary/40 hover:bg-text-primary/70'\n }`}\n aria-label={t('compactView.participant', { index: index + 1 })}\n />\n ))}\n </div>\n </div>\n\n {/* Кнопка \"Предыдущий участник\" */}\n <div className=\"pointer-events-auto absolute top-1/2 left-2 -translate-y-1/2 transition-opacity duration-200 sm:opacity-0 sm:group-hover:opacity-100\">\n <button\n type=\"button\"\n disabled={!canPrev}\n onClick={onPrev}\n className=\"bg-background-subtle/80 hover:bg-background-subtle fill-icon-primary z-10 flex items-center justify-center rounded-full p-2 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n <span className=\"sr-only\">{t('compactView.prevParticipant')}</span>\n </button>\n </div>\n\n {/* Кнопка \"Следующий участник\" */}\n <div className=\"pointer-events-auto absolute top-1/2 right-2 -translate-y-1/2 transition-opacity duration-200 sm:opacity-0 sm:group-hover:opacity-100\">\n <button\n type=\"button\"\n disabled={!canNext}\n onClick={onNext}\n className=\"bg-background-subtle/80 hover:bg-background-subtle fill-icon-primary z-10 flex items-center justify-center rounded-full p-2 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <ArrowRight className=\"h-4 w-4\" />\n <span className=\"sr-only\">{t('compactView.nextParticipant')}</span>\n </button>\n </div>\n </div>\n );\n}\n","import { ArrowUp } from '@xipkg/icons';\nimport { useTranslation } from 'react-i18next';\n\ninterface CompactMultiViewControlsProps {\n canPrev: boolean;\n canNext: boolean;\n onPrev: () => void;\n onNext: () => void;\n}\n\n/**\n * Стрелки листания для развёрнутого мульти-вида ВКС:\n * сверху на первой плитке — стрелка вверх, снизу на последней — стрелка вниз\n */\nexport function CompactMultiViewControls({\n canPrev,\n canNext,\n onPrev,\n onNext,\n}: CompactMultiViewControlsProps) {\n const { t } = useTranslation('calls');\n\n return (\n <div className=\"pointer-events-none absolute inset-0\">\n {/* Стрелка вверх — по центру сверху (на первой плитке), если есть куда листать */}\n {canPrev && (\n <div className=\"pointer-events-auto absolute top-2 left-1/2 z-10 -translate-x-1/2\">\n <button\n type=\"button\"\n onClick={onPrev}\n className=\"bg-background-subtle/80 hover:bg-background-subtle fill-icon-primary flex items-center justify-center rounded-full p-2\"\n aria-label={t('compactView.scrollUp')}\n >\n <ArrowUp className=\"h-4 w-4 fill-inherit\" />\n </button>\n </div>\n )}\n {/* Стрелка вниз — по центру снизу (на последней плитке) */}\n {canNext && (\n <div className=\"pointer-events-auto absolute bottom-2 left-1/2 z-10 -translate-x-1/2\">\n <button\n type=\"button\"\n onClick={onNext}\n className=\"bg-background-subtle/80 hover:bg-background-subtle fill-icon-primary flex items-center justify-center rounded-full p-2\"\n aria-label={t('compactView.scrollDown')}\n >\n <ArrowUp className=\"h-4 w-4 rotate-180 fill-inherit\" />\n </button>\n </div>\n )}\n </div>\n );\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { Track } from 'livekit-client';\nimport type { CompactViewModeT } from '@xipkg/calls-store';\nimport { Button } from '@xipkg/button';\nimport { ChevronUp, External } from '@xipkg/icons';\nimport { cn } from '@xipkg/utils';\nimport { useTranslation } from 'react-i18next';\nimport { usePiP } from '../providers';\nimport { CompactCallCollapsedBar } from './CompactCallCollapsedBar';\nimport { CompactNavigationControls } from './CompactNavigationControls';\nimport { CompactMultiViewControls } from './CompactMultiViewControls';\nimport {\n ParticipantTile,\n ParticipantPinToggle,\n ScreenShareStageToggle,\n tileOverlayButtonClassName,\n} from '@xipkg/calls-ui';\nimport { COMPACT_PANEL_WIDTH_PX, TILE_GAP_PX, TILE_HEIGHT_16_9_PX } from '../constants';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@xipkg/tooltip';\n\ntype CompactCallVideoAreaProps = {\n isMobile: boolean;\n isCollapsed: boolean;\n onCollapsedChange: (collapsed: boolean) => void;\n withOutShadows: boolean;\n dragAttributes?: object;\n dragListeners?: object;\n /** Режим вида на десктопе */\n compactViewMode: CompactViewModeT;\n currentParticipant: TrackReferenceOrPlaceholder | null;\n currentAudioTrack:\n import('livekit-client').RemoteAudioTrack | import('livekit-client').LocalAudioTrack | null;\n totalParticipants: number;\n canGoPrev: boolean;\n canGoNext: boolean;\n onPrev: () => void;\n onNext: () => void;\n currentIndex: number;\n multiVisibleParticipants: TrackReferenceOrPlaceholder[];\n multiTileHeightPx: number;\n multiCanPrev: boolean;\n multiCanNext: boolean;\n onMultiPrev: () => void;\n onMultiNext: () => void;\n onAudioExpand: () => void;\n};\n\nexport function CompactCallVideoArea({\n isMobile,\n isCollapsed,\n onCollapsedChange,\n withOutShadows,\n dragAttributes = {},\n dragListeners = {},\n compactViewMode,\n currentParticipant,\n currentAudioTrack,\n totalParticipants,\n canGoPrev,\n canGoNext,\n onPrev,\n onNext,\n currentIndex,\n multiVisibleParticipants,\n multiTileHeightPx,\n multiCanPrev,\n multiCanNext,\n onMultiPrev,\n onMultiNext,\n onAudioExpand,\n}: CompactCallVideoAreaProps) {\n const { t } = useTranslation('calls');\n const pip = usePiP();\n const showPiPButton = pip?.isSupported && !!currentParticipant;\n\n /**\n * На десктопе в basic-режиме выносим Pin (и опционально PiP) в оверлей над плиткой.\n * Это позволяет показывать Pin всегда, даже если PiP не поддерживается.\n */\n const showDesktopOverlay = !isMobile && compactViewMode === 'basic' && !!currentParticipant;\n\n /** В expanded-режиме Pin первой плитки и PiP в одном оверлее — иначе кнопки накладываются */\n const firstMultiParticipant = multiVisibleParticipants[0] ?? null;\n const showExpandedOverlay =\n !isMobile && compactViewMode === 'expanded' && !!firstMultiParticipant;\n\n const overlayTrackRef = showDesktopOverlay\n ? currentParticipant\n : showExpandedOverlay\n ? firstMultiParticipant\n : null;\n const showPinPiPOverlay = !!overlayTrackRef;\n\n const emptyState = (\n <div className=\"bg-background-subtle text-text-primary flex h-full w-full items-center justify-center\">\n <span className=\"text-sm\">{t('compactView.noParticipants')}</span>\n </div>\n );\n\n if (isMobile && isCollapsed) {\n return (\n <CompactCallCollapsedBar\n participant={currentParticipant?.participant ?? null}\n audioTrack={currentAudioTrack ?? null}\n onExpand={() => onCollapsedChange(false)}\n className={cn('mb-2', withOutShadows ? '' : 'shadow-lg')}\n />\n );\n }\n\n if (!isMobile && compactViewMode === 'audio') {\n return (\n <CompactCallCollapsedBar\n participant={currentParticipant?.participant ?? null}\n audioTrack={currentAudioTrack ?? null}\n onExpand={onAudioExpand}\n className={cn('mb-2', withOutShadows ? '' : 'shadow-lg')}\n style={{ width: COMPACT_PANEL_WIDTH_PX }}\n />\n );\n }\n\n return (\n <div\n {...(isMobile ? {} : { ...dragAttributes, ...dragListeners })}\n className={cn(\n 'bg-background-subtle group relative mb-2 flex overflow-hidden rounded-2xl',\n withOutShadows ? '' : 'shadow-lg',\n isMobile ? 'h-auto w-full items-center justify-center' : 'cursor-move touch-none flex-col',\n !isMobile && compactViewMode === 'basic' && 'shrink-0',\n !isMobile && compactViewMode === 'expanded' && 'h-auto',\n )}\n style={\n isMobile\n ? undefined\n : {\n width: COMPACT_PANEL_WIDTH_PX,\n touchAction: 'none',\n ...(compactViewMode === 'basic' ? { height: TILE_HEIGHT_16_9_PX } : {}),\n }\n }\n >\n {isMobile ? (\n currentParticipant ? (\n <div className=\"relative h-full min-h-0 w-full min-w-0\">\n <ParticipantTile\n trackRef={currentParticipant}\n participant={currentParticipant.participant}\n className=\"h-full w-full\"\n hidePinToggle={showDesktopOverlay}\n />\n </div>\n ) : (\n emptyState\n )\n ) : compactViewMode === 'expanded' ? (\n <div\n className=\"relative flex flex-col gap-2 overflow-hidden rounded-2xl p-1\"\n style={{ gap: TILE_GAP_PX }}\n >\n {multiVisibleParticipants.length === 0\n ? emptyState\n : multiVisibleParticipants.map((trackRef, index) => (\n <div\n key={`${trackRef.participant.identity}-${trackRef.source}`}\n className=\"aspect-video w-full shrink-0 overflow-hidden rounded-xl\"\n style={{ minHeight: multiTileHeightPx }}\n >\n <ParticipantTile\n trackRef={trackRef}\n participant={trackRef.participant}\n className=\"h-full w-full [&_video]:object-cover\"\n hidePinToggle={showExpandedOverlay && index === 0}\n />\n </div>\n ))}\n <CompactMultiViewControls\n canPrev={multiCanPrev}\n canNext={multiCanNext}\n onPrev={onMultiPrev}\n onNext={onMultiNext}\n />\n </div>\n ) : currentParticipant ? (\n <div className=\"relative h-full min-h-0 w-full min-w-0\">\n <ParticipantTile\n trackRef={currentParticipant}\n participant={currentParticipant.participant}\n className=\"h-full w-full\"\n hidePinToggle={showDesktopOverlay}\n />\n </div>\n ) : (\n emptyState\n )}\n\n {/* Оверлей с Pin (и опционально PiP) для basic и expanded на десктопе */}\n {showPinPiPOverlay && (\n <div className=\"absolute top-2 right-2 z-10 flex items-center gap-1\">\n {overlayTrackRef.source === Track.Source.ScreenShare ? (\n <ScreenShareStageToggle trackRef={overlayTrackRef} inline />\n ) : null}\n <ParticipantPinToggle trackRef={overlayTrackRef} inline />\n {showPiPButton && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => void pip!.openPiP()}\n className={tileOverlayButtonClassName}\n aria-label={t('compactView.openPip')}\n >\n <External className=\"fill-icon-primary\" style={{ width: 16, height: 16 }} />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t('compactView.openPip')}</TooltipContent>\n </Tooltip>\n )}\n </div>\n )}\n\n {isMobile && (\n <Button\n size=\"icon\"\n variant=\"none\"\n onClick={() => onCollapsedChange(true)}\n className=\"bg-action-primary-background-pressed hover:bg-action-primary-background-pressed/80 text-text-on-accent absolute top-2 right-2 z-10 h-8 w-8 rounded-xl p-0\"\n aria-label={t('compactView.collapse')}\n >\n <ChevronUp className=\"fill-action-primary-text h-4 w-4\" />\n </Button>\n )}\n\n {totalParticipants > 0 && (isMobile || compactViewMode === 'basic') && (\n <CompactNavigationControls\n canPrev={canGoPrev}\n canNext={canGoNext}\n onPrev={onPrev}\n onNext={onNext}\n currentIndex={currentIndex}\n totalParticipants={totalParticipants}\n />\n )}\n </div>\n );\n}\n","import type { LocalAudioTrack, LocalVideoTrack } from 'livekit-client';\nimport { Button } from '@xipkg/button';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@xipkg/tooltip';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from '@xipkg/dropdown';\nimport { Account, Maximize, SoundTwo, Users, WhiteBoard } from '@xipkg/icons';\nimport { cn } from '@xipkg/utils';\nimport { useCallStore, type CompactViewModeT } from '@xipkg/calls-store';\nimport type { DeviceMenuGroupT } from '@xipkg/calls-hooks';\nimport { useTranslation } from 'react-i18next';\nimport { getNextCompactViewMode } from '../constants';\nimport {\n DevicesBar,\n DisconnectButton,\n LessonRecordButton,\n ScreenShareButton,\n} from '@xipkg/calls-ui';\nimport { ChatButton } from '@xipkg/calls-chat';\nimport { RaiseHandButton } from '@xipkg/calls-risehand';\n\ntype CompactCallTrackTogglePropsT = {\n showIcon: boolean;\n source: import('livekit-client').Track.Source;\n onChange: (enabled: boolean) => void;\n deviceGroups?: DeviceMenuGroupT[];\n};\n\ntype CompactCallDevicesPropsT = {\n microTrack: LocalAudioTrack | undefined;\n microEnabled: boolean;\n microTrackToggle: CompactCallTrackTogglePropsT;\n videoTrack: LocalVideoTrack | undefined;\n videoEnabled: boolean;\n videoTrackToggle: CompactCallTrackTogglePropsT;\n};\n\ntype CompactCallBottomBarPropsT = {\n withOutShadows: boolean;\n devices: CompactCallDevicesPropsT;\n isMobile: boolean;\n compactViewMode: CompactViewModeT;\n onViewModeToggle: () => void;\n showBackToBoardButton: boolean;\n onBackToBoard: () => void;\n onMaximize: (syncToAll?: boolean) => void;\n isTutor: boolean;\n};\n\nexport function CompactCallBottomBar({\n withOutShadows,\n devices,\n isMobile,\n compactViewMode,\n onViewModeToggle,\n showBackToBoardButton,\n onBackToBoard,\n onMaximize,\n isTutor,\n}: CompactCallBottomBarPropsT) {\n const { t } = useTranslation('calls');\n const screenShareStage = useCallStore((state) => state.screenShareStageIdentity);\n const nextViewMode = getNextCompactViewMode(compactViewMode);\n const viewModeToggleMeta = {\n expanded: { Icon: Users, label: t('compactView.mode.expanded') },\n audio: { Icon: SoundTwo, label: t('compactView.mode.audio') },\n basic: { Icon: Account, label: t('compactView.mode.basic') },\n }[nextViewMode];\n const ViewModeIcon = viewModeToggleMeta.Icon;\n\n const barCn = cn(\n 'bg-background-surface border-border-default flex items-center justify-center rounded-2xl border p-1',\n withOutShadows ? '' : 'shadow-lg',\n );\n\n return (\n <div className=\"flex h-[40px] shrink-0 flex-row pb-[max(0px,env(safe-area-inset-bottom))]\">\n <div className={barCn}>\n <DevicesBar\n className=\"h-[32px] w-[32px]\"\n microTrack={devices.microTrack}\n microEnabled={devices.microEnabled}\n microTrackToggle={devices.microTrackToggle}\n videoTrack={devices.videoTrack}\n videoEnabled={devices.videoEnabled}\n videoTrackToggle={devices.videoTrackToggle}\n />\n </div>\n\n {!isMobile && (\n <div className={cn(barCn, 'ml-1')}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n size=\"icon\"\n variant=\"none\"\n onClick={onViewModeToggle}\n className=\"hover:bg-background-page text-text-primary h-8 w-8 rounded-xl p-0\"\n aria-label={viewModeToggleMeta.label}\n >\n <ViewModeIcon className=\"h-6 w-6\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{viewModeToggleMeta.label}</TooltipContent>\n </Tooltip>\n </div>\n )}\n\n {showBackToBoardButton && (\n <div className={cn(barCn, 'ml-1')}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n size=\"icon\"\n variant=\"primary\"\n className=\"h-8 w-8 rounded-xl p-0\"\n onClick={onBackToBoard}\n aria-label={t('compactView.toBoardAria')}\n >\n <WhiteBoard className=\"fill-action-primary-text h-6 w-6\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{t('compactView.toBoardTooltip')}</TooltipContent>\n </Tooltip>\n </div>\n )}\n\n <div className={cn(barCn, 'ml-auto')}>\n <LessonRecordButton className=\"h-8 w-8\" />\n <ScreenShareButton className=\"h-8 w-8\" />\n <ChatButton className=\"h-8 w-8 min-w-8 rounded-xl\" />\n <RaiseHandButton className=\"h-8 w-8 min-w-8\" />\n </div>\n\n <div className={cn(barCn, 'ml-1')}>\n {!screenShareStage &&\n (isTutor ? (\n <DropdownMenu>\n <Tooltip>\n <TooltipTrigger asChild>\n <DropdownMenuTrigger asChild>\n <Button\n size=\"icon\"\n variant=\"none\"\n className=\"hover:bg-background-page text-text-primary relative m-0 h-8 w-8 rounded-xl p-0\"\n >\n <Maximize className=\"fill-icon-primary\" />\n </Button>\n </DropdownMenuTrigger>\n </TooltipTrigger>\n <TooltipContent>{t('compactView.returnToConference')}</TooltipContent>\n </Tooltip>\n <DropdownMenuContent side=\"top\" align=\"end\" className=\"z-1000 min-w-[200px]\">\n <DropdownMenuLabel className=\"text-text-secondary text-sm\">\n {t('compactView.returnMenuLabel')}\n </DropdownMenuLabel>\n <DropdownMenuItem\n onClick={() => onMaximize(false)}\n className=\"text-text-primary cursor-pointer text-sm\"\n >\n {t('compactView.returnOnlyMe')}\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => onMaximize(true)}\n className=\"text-text-primary cursor-pointer text-sm\"\n >\n {t('compactView.returnEveryone')}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n size=\"icon\"\n variant=\"none\"\n onClick={() => onMaximize(false)}\n className=\"hover:bg-background-page text-text-primary relative m-0 h-8 w-8 rounded-xl p-0\"\n >\n <Maximize className=\"fill-icon-primary\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{t('compactView.returnToConference')}</TooltipContent>\n </Tooltip>\n ))}\n <DisconnectButton className=\"h-[32px] w-[32px] rounded-xl\" />\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useDraggable } from '@dnd-kit/core';\nimport { CSS } from '@dnd-kit/utilities';\nimport {\n useLocalParticipant,\n usePersistentUserChoices,\n useTrackToggle,\n} from '@livekit/components-react';\nimport { LocalAudioTrack, LocalVideoTrack, Track } from 'livekit-client';\nimport { useCallStore, type CompactViewModeT } from '@xipkg/calls-store';\nimport { useClassroomPins, useDeviceMenuGroups } from '@xipkg/calls-hooks';\nimport { useCompactAvailableHeight, useCompactNavigation } from '../hooks';\nimport { useVideoBlur, useSyncModeToOthers } from '@xipkg/calls-hooks';\nimport { useRoom, useCalls, useCallsNavigation } from '@xipkg/calls-providers';\nimport { usePiP } from '../providers';\nimport { usePhoneLayout } from '@xipkg/calls-utils';\nimport { CompactCallVideoArea } from './CompactCallVideoArea';\nimport { CompactCallBottomBar } from './CompactCallBottomBar';\nimport {\n COMPACT_BOTTOM_BAR_PX,\n COMPACT_PANEL_WIDTH_PX,\n COMPACT_VIDEO_AREA_MARGIN_PX,\n EXPANDED_VIDEO_PADDING_VERTICAL_PX,\n TILE_GAP_PX,\n TILE_HEIGHT_16_9_PX,\n getNextCompactViewMode,\n} from '../constants';\n\nexport const CompactCall = ({\n saveUserChoices = true,\n withOutShadows = false,\n freeDrag = false,\n}: {\n saveUserChoices?: boolean;\n withOutShadows?: boolean;\n /** Панель тащится целиком в любую точку, в том числе на телефоне */\n freeDrag?: boolean;\n}) => {\n const isMobile = usePhoneLayout();\n const { attributes, listeners, setNodeRef, transform } = useDraggable({\n id: freeDrag ? 'screen-share-stage-compact' : 'draggable-call',\n disabled: freeDrag ? false : isMobile,\n });\n const style =\n !freeDrag && isMobile ? undefined : { transform: CSS.Translate.toString(transform) };\n\n const { saveAudioInputEnabled, saveVideoInputEnabled } = usePersistentUserChoices({\n preventSave: !saveUserChoices,\n });\n const { isMicrophoneEnabled, isCameraEnabled, microphoneTrack, cameraTrack } =\n useLocalParticipant();\n const videoTrack = cameraTrack?.track as LocalVideoTrack | undefined;\n\n const mode = useCallStore((state) => state.mode);\n useVideoBlur(mode === 'compact' ? videoTrack : null);\n\n const microphoneToggle = useTrackToggle({\n source: Track.Source.Microphone,\n onChange: (enabled: boolean, isUserInitiated: boolean) => {\n if (isUserInitiated) saveAudioInputEnabled(enabled);\n },\n });\n const cameraToggle = useTrackToggle({\n source: Track.Source.Camera,\n onChange: (enabled: boolean, isUserInitiated: boolean) => {\n if (isUserInitiated) saveVideoInputEnabled(enabled);\n },\n });\n\n const handleMicrophoneToggle = useCallback(\n (enabled: boolean) => microphoneToggle.toggle(enabled),\n [microphoneToggle],\n );\n const handleCameraToggle = useCallback(\n (enabled: boolean) => cameraToggle.toggle(enabled),\n [cameraToggle],\n );\n\n const { microphoneGroups, cameraGroups } = useDeviceMenuGroups();\n\n const compactNavigation = useCompactNavigation();\n const {\n currentParticipant,\n participants,\n currentIndex,\n totalParticipants,\n canGoNext,\n canGoPrev,\n goToNext,\n goToPrev,\n } = compactNavigation;\n const callsNavigation = useCallsNavigation();\n const pip = usePiP();\n\n const [isCollapsed, setIsCollapsed] = useState(false);\n const compactViewMode = useCallStore((state) => state.compactViewMode);\n const updateStore = useCallStore((state) => state.updateStore);\n const setCompactViewMode = useCallback(\n (mode: CompactViewModeT) => updateStore('compactViewMode', mode),\n [updateStore],\n );\n const [multiScrollIndex, setMultiScrollIndex] = useState(0);\n\n const currentAudioTrack = currentParticipant?.participant?.getTrackPublication(\n Track.Source.Microphone,\n )?.track as\n | import('livekit-client').RemoteAudioTrack\n | import('livekit-client').LocalAudioTrack\n | undefined;\n\n const syncModeToOthers = useSyncModeToOthers();\n const activeBoardId = useCallStore((state) => state.activeBoardId);\n const activeClassroom = useCallStore((state) => state.activeClassroom);\n const { room } = useRoom();\n const token = useCallStore((state) => state.token);\n\n const { data: user } = useCalls().auth.useCurrentUser();\n\n const isTutor = user?.default_layout === 'tutor';\n const isBoardPage = callsNavigation.pathnameIncludes('/board');\n const isOnBoardPage =\n callsNavigation.params.classroomId === activeClassroom &&\n callsNavigation.params.boardId === activeBoardId;\n const showBackToBoardButton =\n mode === 'compact' && !!activeBoardId && !!activeClassroom && !isOnBoardPage;\n\n const availableHeight = useCompactAvailableHeight(isBoardPage);\n\n const multiViewLayout = useMemo(() => {\n const heightForTiles = Math.max(\n 0,\n availableHeight -\n COMPACT_BOTTOM_BAR_PX -\n EXPANDED_VIDEO_PADDING_VERTICAL_PX -\n COMPACT_VIDEO_AREA_MARGIN_PX,\n );\n // Плитки имеют aspect-video (16:9), их высота фиксирована шириной контейнера\n const visibleCount = Math.min(\n totalParticipants,\n Math.max(1, Math.floor((heightForTiles + TILE_GAP_PX) / (TILE_HEIGHT_16_9_PX + TILE_GAP_PX))),\n );\n return { visibleCount, tileHeightPx: TILE_HEIGHT_16_9_PX };\n }, [availableHeight, totalParticipants]);\n\n const { visibleCount: multiVisibleCount, tileHeightPx: multiTileHeightPx } = multiViewLayout;\n const multiCanPrev = multiScrollIndex > 0;\n const multiCanNext = multiScrollIndex + multiVisibleCount < totalParticipants;\n const multiVisibleParticipants = participants.slice(\n multiScrollIndex,\n multiScrollIndex + multiVisibleCount,\n );\n\n useEffect(() => {\n if (multiScrollIndex + multiVisibleCount > totalParticipants && totalParticipants > 0) {\n setMultiScrollIndex(Math.max(0, totalParticipants - multiVisibleCount));\n }\n }, [totalParticipants, multiVisibleCount, multiScrollIndex]);\n\n const { pins } = useClassroomPins();\n\n useEffect(() => {\n if (pins.length > 0) {\n setMultiScrollIndex(0);\n }\n }, [pins.map((pin) => `${pin.userId}:${pin.source}`).join(',')]);\n\n const handleBackToBoard = useCallback(() => {\n if (!activeBoardId || !activeClassroom) return;\n callsNavigation.navigateToClassroomBoard(activeClassroom, activeBoardId);\n }, [activeBoardId, activeClassroom, callsNavigation]);\n\n const handleMaximize = useCallback(\n (syncToAll: boolean = false) => {\n pip?.closePiP();\n if (!room || !token || room.state !== 'connected') return;\n const callParam = callsNavigation.search.call;\n const targetCallId =\n (typeof callParam === 'string' ? callParam.replace(/^\"|\"$/g, '').trim() : '') ||\n activeClassroom ||\n callsNavigation.params.classroomId ||\n callsNavigation.getCallId() ||\n '';\n if (syncToAll && isTutor && activeBoardId && targetCallId) {\n updateStore('localFullView', false);\n updateStore('mode', 'full');\n updateStore('activeBoardId', undefined);\n updateStore('activeClassroom', undefined);\n syncModeToOthers('full', undefined, targetCallId);\n } else {\n updateStore('localFullView', true);\n updateStore('mode', 'full');\n }\n if (targetCallId) {\n callsNavigation.navigateToCall(targetCallId, { replace: true });\n }\n },\n [\n room,\n token,\n callsNavigation,\n activeClassroom,\n isTutor,\n activeBoardId,\n updateStore,\n syncModeToOthers,\n pip,\n ],\n );\n\n return (\n <div\n ref={setNodeRef}\n {...(freeDrag ? listeners : {})}\n style={{\n ...style,\n ...(isMobile && !freeDrag\n ? {}\n : { width: COMPACT_PANEL_WIDTH_PX, touchAction: 'none' as const }),\n }}\n className={`compact-call-container flex flex-col ${\n isMobile && !freeDrag ? 'w-full' : 'touch-none [&_video]:touch-none'\n } ${freeDrag ? 'cursor-grab active:cursor-grabbing' : ''}`}\n >\n <CompactCallVideoArea\n isMobile={isMobile}\n isCollapsed={isCollapsed}\n onCollapsedChange={setIsCollapsed}\n withOutShadows={withOutShadows}\n dragAttributes={freeDrag ? undefined : (attributes as object)}\n dragListeners={freeDrag ? undefined : (listeners as object)}\n compactViewMode={compactViewMode}\n currentParticipant={currentParticipant}\n currentAudioTrack={currentAudioTrack ?? null}\n totalParticipants={totalParticipants}\n canGoPrev={canGoPrev}\n canGoNext={canGoNext}\n onPrev={goToPrev}\n onNext={goToNext}\n currentIndex={currentIndex}\n multiVisibleParticipants={multiVisibleParticipants}\n multiTileHeightPx={multiTileHeightPx}\n multiCanPrev={multiCanPrev}\n multiCanNext={multiCanNext}\n onMultiPrev={() => setMultiScrollIndex((i) => Math.max(0, i - 1))}\n onMultiNext={() =>\n setMultiScrollIndex((i) => Math.min(totalParticipants - multiVisibleCount, i + 1))\n }\n onAudioExpand={() => setCompactViewMode('basic')}\n />\n <CompactCallBottomBar\n withOutShadows={withOutShadows}\n devices={{\n microTrack: microphoneTrack?.track as LocalAudioTrack,\n microEnabled: isMicrophoneEnabled,\n microTrackToggle: {\n showIcon: true,\n source: Track.Source.Microphone,\n onChange: handleMicrophoneToggle,\n deviceGroups: microphoneGroups,\n },\n videoTrack: cameraTrack?.track as unknown as LocalVideoTrack,\n videoEnabled: isCameraEnabled,\n videoTrackToggle: {\n showIcon: true,\n source: Track.Source.Camera,\n onChange: handleCameraToggle,\n deviceGroups: cameraGroups,\n },\n }}\n isMobile={isMobile}\n compactViewMode={compactViewMode}\n onViewModeToggle={() => setCompactViewMode(getNextCompactViewMode(compactViewMode))}\n showBackToBoardButton={!!showBackToBoardButton}\n onBackToBoard={handleBackToBoard}\n onMaximize={handleMaximize}\n isTutor={!!isTutor}\n />\n </div>\n );\n};\n","import { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DndContext, type DragEndEvent, useSensor, useSensors } from '@dnd-kit/core';\nimport { restrictToWindowEdges } from '@dnd-kit/modifiers';\nimport { ScreenShareIcon, useTracks } from '@livekit/components-react';\nimport { RemoteTrackPublication, Track } from 'livekit-client';\nimport { useTranslation } from 'react-i18next';\nimport {\n ParticipantPinToggle,\n ScreenShareStageToggle,\n ScreenShareZoom,\n VideoTrack,\n} from '@xipkg/calls-ui';\nimport { useCallStore } from '@xipkg/calls-store';\nimport { Chat } from '@xipkg/calls-chat';\nimport { COMPACT_PANEL_WIDTH_PX } from '../constants';\nimport { usePiP } from '../providers';\nimport { CompactCall } from './CompactCall';\nimport { CompactPointerSensor, CompactTouchSensor } from './compactDragSensors';\n\nconst EDGE_PX = 16;\nconst STAGE_GONE_MS = 500;\n\nfunction clampStagePosition(x: number, y: number, width: number, height: number) {\n const maxX = Math.max(EDGE_PX, window.innerWidth - width - EDGE_PX);\n const maxY = Math.max(EDGE_PX, window.innerHeight - height - EDGE_PX);\n return {\n x: Math.min(Math.max(EDGE_PX, x), maxX),\n y: Math.min(Math.max(EDGE_PX, y), maxY),\n };\n}\n\ntype ScreenShareStagePropsT = {\n identity: string;\n};\n\nexport const ScreenShareStage = ({ identity }: ScreenShareStagePropsT) => {\n const { t } = useTranslation('calls');\n const updateStore = useCallStore((state) => state.updateStore);\n const closePiP = usePiP()?.closePiP;\n const overlayRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const [position, setPosition] = useState({ x: EDGE_PX, y: EDGE_PX });\n\n const tracks = useTracks([{ source: Track.Source.ScreenShare, withPlaceholder: false }], {\n onlySubscribed: false,\n });\n const track = tracks.find((item) => item.participant.identity === identity) ?? null;\n const publication = track?.publication;\n const hasTrack = Boolean(publication);\n\n const sensors = useSensors(\n useSensor(CompactPointerSensor, { activationConstraint: { distance: 8 } }),\n useSensor(CompactTouchSensor, { activationConstraint: { distance: 8 } }),\n );\n\n useEffect(() => {\n closePiP?.();\n }, [closePiP]);\n\n useEffect(() => {\n if (!(publication instanceof RemoteTrackPublication) || publication.isSubscribed) return;\n publication.setSubscribed(true);\n }, [publication]);\n\n useEffect(() => {\n if (hasTrack) return undefined;\n const timeoutId = window.setTimeout(() => {\n if (useCallStore.getState().screenShareStageIdentity === identity) {\n useCallStore.getState().updateStore('screenShareStageIdentity', null);\n }\n }, STAGE_GONE_MS);\n return () => window.clearTimeout(timeoutId);\n }, [hasTrack, identity]);\n\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || event.defaultPrevented) return;\n event.preventDefault();\n updateStore('screenShareStageIdentity', null);\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [updateStore]);\n\n useEffect(() => {\n const portalNode = overlayRef.current;\n if (!portalNode) return undefined;\n\n const hidden: HTMLElement[] = [];\n Array.from(document.body.children).forEach((node) => {\n if (!(node instanceof HTMLElement)) return;\n if (node === portalNode || node.contains(portalNode)) return;\n if (node.hasAttribute('data-sonner-toaster')) return;\n if (node.hasAttribute('inert')) return;\n node.setAttribute('inert', '');\n hidden.push(node);\n });\n\n const { body, documentElement } = document;\n const previousBodyOverflow = body.style.overflow;\n const previousHtmlOverflow = documentElement.style.overflow;\n body.style.overflow = 'hidden';\n documentElement.style.overflow = 'hidden';\n portalNode?.focus();\n\n return () => {\n hidden.forEach((node) => node.removeAttribute('inert'));\n body.style.overflow = previousBodyOverflow;\n documentElement.style.overflow = previousHtmlOverflow;\n };\n }, []);\n\n useLayoutEffect(() => {\n const node = panelRef.current;\n if (!node) return undefined;\n\n const clamp = () => {\n const current = panelRef.current;\n if (!current) return;\n setPosition((prev) => {\n const next = clampStagePosition(prev.x, prev.y, current.offsetWidth, current.offsetHeight);\n if (next.x === prev.x && next.y === prev.y) return prev;\n return next;\n });\n };\n\n clamp();\n const observer = new ResizeObserver(clamp);\n observer.observe(node);\n window.addEventListener('resize', clamp);\n return () => {\n observer.disconnect();\n window.removeEventListener('resize', clamp);\n };\n }, []);\n\n const handleDragEnd = (event: DragEndEvent) => {\n const node = panelRef.current;\n setPosition((prev) => {\n const next = clampStagePosition(\n prev.x + event.delta.x,\n prev.y + event.delta.y,\n node?.offsetWidth ?? COMPACT_PANEL_WIDTH_PX,\n node?.offsetHeight ?? 320,\n );\n if (next.x === prev.x && next.y === prev.y) return prev;\n return next;\n });\n };\n\n if (typeof document === 'undefined') return null;\n\n const sharerName = track?.participant.name;\n\n return createPortal(\n <div\n ref={overlayRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t('participant.stageTitle')}\n tabIndex={-1}\n className=\"screen-share-stage fixed inset-0 z-[2100] bg-black outline-none\"\n >\n <div className=\"relative h-full w-full\">\n {track && publication ? (\n <ScreenShareZoom trackRef={track} className=\"rounded-none\">\n <VideoTrack\n trackRef={track}\n manageSubscription={false}\n className=\"h-full w-full bg-black object-contain\"\n />\n </ScreenShareZoom>\n ) : null}\n {track ? (\n <div className=\"bg-background-surface/80 pointer-events-none absolute bottom-4 left-4 z-20 flex h-6 items-center gap-1.5 rounded-lg px-1.5 py-1 backdrop-blur\">\n <ScreenShareIcon style={{ marginRight: '0.25rem' }} />\n <span className=\"text-xs-base-size text-text-primary leading-[16px]\">\n {t('participant.screenSharePrefix')}\n {sharerName ? <> {sharerName}</> : null}\n </span>\n </div>\n ) : null}\n <div className=\"absolute top-3 right-3 z-40 flex items-center gap-1\">\n <ScreenShareStageToggle trackRef={track ?? undefined} inline />\n {track ? <ParticipantPinToggle trackRef={track} inline /> : null}\n </div>\n </div>\n\n <DndContext\n sensors={sensors}\n onDragEnd={handleDragEnd}\n modifiers={[restrictToWindowEdges]}\n autoScroll={false}\n >\n <div\n ref={panelRef}\n className=\"absolute z-30 w-max\"\n style={{ left: position.x, top: position.y }}\n >\n <CompactCall freeDrag />\n </div>\n </DndContext>\n\n <Chat compactPositionStyle={{ top: 56, right: 16, bottom: 16, zIndex: 20 }} />\n </div>,\n document.body,\n );\n};\n","import { FC, useEffect, useRef, useState, type CSSProperties } from 'react';\nimport {\n DndContext,\n DragEndEvent,\n useSensor,\n useSensors,\n useDroppable,\n DragOverlay,\n useDndMonitor,\n} from '@dnd-kit/core';\nimport { CompactPointerSensor, CompactTouchSensor } from './compactDragSensors';\nimport { useCallsNavigation } from '@xipkg/calls-providers';\nimport { restrictToWindowEdges } from '@dnd-kit/modifiers';\nimport { CompactCall } from './CompactCall';\nimport { Chat, useChatStore } from '@xipkg/calls-chat';\nimport { PermissionsDialog } from '@xipkg/calls-ui';\nimport { useCallStore } from '@xipkg/calls-store';\nimport type { CornerT } from '@xipkg/calls-store';\nimport { usePhoneLayout } from '@xipkg/calls-utils';\nimport { useRoom } from '@xipkg/calls-providers';\nimport { PiPProvider, usePiP } from '../providers';\nimport { useParticipantSounds, useParticipantJoinSync } from '@xipkg/calls-hooks';\nimport { COMPACT_MOBILE_CONTENT_GAP_PX, COMPACT_MOBILE_OVERLAY_FALLBACK_PX } from '../constants';\nimport { chatPositionStyle, cornerStyle, useBoardChromeInsets } from '../boardChromeInsets';\nimport { ScreenShareStage } from './ScreenShareStage';\n\ntype CompactViewPropsT = {\n children: React.ReactNode;\n};\n\nconst useCompactDragActive = () => {\n const [isDragging, setIsDragging] = useState(false);\n\n useDndMonitor({\n onDragStart: () => {\n setIsDragging(true);\n },\n onDragEnd: () => {\n setIsDragging(false);\n },\n // На планшете жест часто отменяется (pointercancel / resize), а не завершается.\n // Без этого бирюзовые зоны остаются, хотя перенос уже мёртв.\n onDragCancel: () => {\n setIsDragging(false);\n },\n });\n\n return isDragging;\n};\n\nconst DroppableCorner = ({ id, style }: { id: string; style: CSSProperties }) => {\n const { setNodeRef } = useDroppable({\n id,\n });\n const isDragging = useCompactDragActive();\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={`pointer-events-none absolute z-20 size-1/3 transition-all duration-200 ${\n isDragging ? 'bg-status-info-background/20 ring-border-selected rounded-lg ring-2' : ''\n }`}\n />\n );\n};\n\nconst DroppableAreas: FC<{ insets: ReturnType<typeof useBoardChromeInsets> }> = ({ insets }) => {\n const isDragging = useCompactDragActive();\n\n return (\n <>\n <DroppableCorner id=\"top-left\" style={cornerStyle('top-left', insets)} />\n <DroppableCorner id=\"top-right\" style={cornerStyle('top-right', insets)} />\n <DroppableCorner id=\"bottom-left\" style={cornerStyle('bottom-left', insets)} />\n <DroppableCorner id=\"bottom-right\" style={cornerStyle('bottom-right', insets)} />\n {/* Превью не должно перехватывать касание: на планшете слой под пальцем отменяет жест. */}\n <DragOverlay style={{ pointerEvents: 'none' }}>\n {isDragging ? <CompactCall /> : null}\n </DragOverlay>\n </>\n );\n};\n\ntype CompactPropsT = CompactViewPropsT & {\n /** При true не рендерить оверлей (звонок, чат, углы). Используется при PiP, чтобы children не размонтировались. */\n hideOverlay?: boolean;\n};\n\nexport const Compact: FC<CompactPropsT> = ({ children, hideOverlay = false }) => {\n const navigation = useCallsNavigation();\n const { activeCorner, updateStore } = useCallStore();\n const isMobile = usePhoneLayout();\n const headerRef = useRef<HTMLDivElement>(null);\n const [headerHeight, setHeaderHeight] = useState(0);\n\n useEffect(() => {\n if (!isMobile || hideOverlay || !headerRef.current) return;\n const el = headerRef.current;\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) setHeaderHeight(entry.contentRect.height);\n });\n observer.observe(el);\n setHeaderHeight(el.getBoundingClientRect().height);\n return () => observer.disconnect();\n }, [isMobile, hideOverlay]);\n\n const sensors = useSensors(\n useSensor(CompactPointerSensor, {\n activationConstraint: {\n distance: 8,\n },\n }),\n useSensor(CompactTouchSensor, {\n activationConstraint: {\n distance: 8,\n },\n }),\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { over } = event;\n if (over) {\n updateStore('activeCorner', over.id as CornerT);\n }\n };\n\n const isBoardPage = navigation.pathnameIncludes('/board');\n const insets = useBoardChromeInsets(isBoardPage);\n\n const mobileContentMarginTop =\n hideOverlay || !isMobile\n ? 0\n : (headerHeight > 0 ? headerHeight : COMPACT_MOBILE_OVERLAY_FALLBACK_PX) +\n COMPACT_MOBILE_CONTENT_GAP_PX;\n\n const container = (\n <div className={`relative flex h-dvh flex-col bg-transparent`} data-board-chrome-aware=\"\">\n {isMobile ? (\n <>\n {!hideOverlay && (\n <div ref={headerRef} className=\"fixed top-2 right-0 left-0 z-10 w-full px-2\">\n <CompactCall withOutShadows />\n </div>\n )}\n <div\n className=\"flex min-h-0 flex-1 flex-col\"\n style={{ marginTop: mobileContentMarginTop }}\n >\n {children}\n </div>\n </>\n ) : (\n <>\n {!hideOverlay && (\n <>\n <DroppableAreas insets={insets} />\n <Chat compactPositionStyle={chatPositionStyle(activeCorner, insets)} />\n <div\n className=\"absolute z-20 transition-all duration-500 ease-out\"\n style={cornerStyle(activeCorner, insets)}\n >\n <CompactCall />\n </div>\n </>\n )}\n {children}\n </>\n )}\n </div>\n );\n\n // Всегда один и тот же корень (DndContext), иначе при hideOverlay React размонтирует\n // container и всё дерево доски (YjsProvider пересоздаётся → белый экран).\n return (\n <DndContext sensors={sensors} onDragEnd={handleDragEnd} modifiers={[restrictToWindowEdges]}>\n {container}\n </DndContext>\n );\n};\n\nconst CompactViewInner = ({ children }: CompactViewPropsT) => {\n const { mode, token } = useCallStore();\n const screenShareStageIdentity = useCallStore((state) => state.screenShareStageIdentity);\n const isStarted = useCallStore((state) => state.isStarted);\n const { room } = useRoom();\n const pip = usePiP();\n const isPiPActive = !!pip?.isPiPActive;\n\n // Синхронизация состояния при подключении новых участников (работает и в compact mode)\n useParticipantJoinSync();\n useParticipantSounds();\n\n useEffect(() => {\n if (!screenShareStageIdentity) return;\n if (!room || !token || !isStarted) {\n useCallStore.getState().updateStore('screenShareStageIdentity', null);\n }\n }, [isStarted, room, screenShareStageIdentity, token]);\n\n const navigation = useCallsNavigation();\n const { updateStore: updateChatStore } = useChatStore();\n\n useEffect(() => {\n const { activeClassroom } = useCallStore.getState();\n const isOnBoardPage = navigation.pathnameIncludes('/board');\n\n if ((!room || !token) && navigation.search.call && !isOnBoardPage && !activeClassroom) {\n navigation.clearCallSearchParam();\n\n // Очищаем все состояния интерфейса при отключении\n const { clearAllRaisedHands, updateStore: updateCallStore } = useCallStore.getState();\n // Очищаем поднятые руки\n clearAllRaisedHands();\n\n // Очищаем чат\n updateChatStore('isChatOpen', false);\n updateChatStore('chatMessages', []);\n updateChatStore('unreadMessagesCount', 0);\n\n // Очищаем информацию о доске при отключении\n updateCallStore('activeBoardId', undefined);\n updateCallStore('activeClassroom', undefined);\n\n updateCallStore('mode', 'full');\n }\n }, [room, token, navigation, updateChatStore]);\n\n const contentWrapper = (\n <div className=\"flex h-full min-h-0 flex-col\">\n <div className=\"min-h-0 flex-1\">{children}</div>\n </div>\n );\n\n if (!room || !token) {\n return (\n <>\n {contentWrapper}\n <PermissionsDialog />\n </>\n );\n }\n\n const stageLayer =\n screenShareStageIdentity && room && token && isStarted ? (\n <ScreenShareStage key={screenShareStageIdentity} identity={screenShareStageIdentity} />\n ) : null;\n\n if (mode === 'full') {\n return (\n <>\n {contentWrapper}\n {stageLayer}\n <PermissionsDialog />\n </>\n );\n }\n\n // Всегда один и тот же Compact — при PiP только скрываем оверлей (hideOverlay).\n return (\n <>\n <Compact hideOverlay={isPiPActive || Boolean(screenShareStageIdentity)}>{children}</Compact>\n {stageLayer}\n <PermissionsDialog />\n </>\n );\n};\n\nexport const CompactView = ({ children }: CompactViewPropsT) => (\n <PiPProvider>\n <CompactViewInner>{children}</CompactViewInner>\n </PiPProvider>\n);\n","import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport {\n useLocalParticipant,\n usePersistentUserChoices,\n useTrackToggle,\n} from '@livekit/components-react';\nimport { Track, LocalAudioTrack, LocalVideoTrack, RemoteAudioTrack } from 'livekit-client';\nimport { Account, SoundTwo, Users } from '@xipkg/icons';\nimport { Button } from '@xipkg/button';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@xipkg/tooltip';\nimport { cn } from '@xipkg/utils';\nimport { useCallStore, type CompactViewModeT } from '@xipkg/calls-store';\nimport { useClassroomPins, useDeviceMenuGroups } from '@xipkg/calls-hooks';\nimport { useTranslation } from 'react-i18next';\nimport { useCompactNavigation } from '../hooks/useCompactNavigation';\nimport {\n ParticipantTile,\n DevicesBar,\n DisconnectButton,\n LessonRecordButton,\n ScreenShareButton,\n} from '@xipkg/calls-ui';\nimport { RaiseHandButton } from '@xipkg/calls-risehand';\nimport { Chat, ChatButton, useChatStore } from '@xipkg/calls-chat';\nimport { CompactNavigationControls } from './CompactNavigationControls';\nimport { CompactMultiViewControls } from './CompactMultiViewControls';\nimport { CompactCallCollapsedBar } from './CompactCallCollapsedBar';\nimport {\n COMPACT_AUDIO_BAR_HEIGHT_PX,\n PIP_BAR_HEIGHT_PX,\n PIP_TILE_HEIGHT_16_9_PX,\n TILE_GAP_PX,\n getNextCompactViewMode,\n getPipRequiredHeightForTiles,\n getPipWindowHeight,\n getPipWindowHeightWithChat,\n PIP_DOCUMENT_WINDOW_FRAME_PX,\n} from '../constants';\n\ntype PiPCompactCallPropsT = {\n pipWindow: Window;\n resizePiPTo?: (height: number) => void;\n};\n\nexport function PiPCompactCall({ pipWindow, resizePiPTo }: PiPCompactCallPropsT) {\n const { t } = useTranslation('calls');\n const compactViewMode = useCallStore((s) => s.compactViewMode);\n const isChatOpen = useChatStore((s) => s.isChatOpen);\n const updateStore = useCallStore((s) => s.updateStore);\n const setViewMode = useCallback(\n (mode: CompactViewModeT) => updateStore('compactViewMode', mode),\n [updateStore],\n );\n const nextViewMode = getNextCompactViewMode(compactViewMode);\n const viewModeToggleMeta = {\n expanded: { Icon: Users, label: t('compactView.mode.expanded') },\n audio: { Icon: SoundTwo, label: t('compactView.mode.audio') },\n basic: { Icon: Account, label: t('compactView.mode.basic') },\n }[nextViewMode];\n const ViewModeIcon = viewModeToggleMeta.Icon;\n const [multiScrollIndex, setMultiScrollIndex] = useState(0);\n const [pipSize, setPipSize] = useState({\n width: pipWindow.innerWidth,\n height: pipWindow.innerHeight,\n });\n\n const { saveAudioInputEnabled, saveVideoInputEnabled } = usePersistentUserChoices();\n const { isMicrophoneEnabled, isCameraEnabled, microphoneTrack, cameraTrack } =\n useLocalParticipant();\n\n const microphoneToggle = useTrackToggle({\n source: Track.Source.Microphone,\n onChange: (enabled: boolean, isUserInitiated: boolean) => {\n if (isUserInitiated) saveAudioInputEnabled(enabled);\n },\n });\n const cameraToggle = useTrackToggle({\n source: Track.Source.Camera,\n onChange: (enabled: boolean, isUserInitiated: boolean) => {\n if (isUserInitiated) saveVideoInputEnabled(enabled);\n },\n });\n\n const handleMicrophoneToggle = useCallback(\n (enabled: boolean) => microphoneToggle.toggle(enabled),\n [microphoneToggle],\n );\n const handleCameraToggle = useCallback(\n (enabled: boolean) => cameraToggle.toggle(enabled),\n [cameraToggle],\n );\n\n const { microphoneGroups, cameraGroups } = useDeviceMenuGroups();\n\n const {\n currentParticipant,\n participants,\n currentIndex,\n totalParticipants,\n canGoNext,\n canGoPrev,\n goToNext,\n goToPrev,\n } = useCompactNavigation();\n\n // Размер окна PiP:\n useEffect(() => {\n const updateSize = () => {\n const { innerWidth, innerHeight, document: pipDoc } = pipWindow;\n setPipSize({ width: innerWidth, height: innerHeight });\n pipDoc.documentElement.style.height = `${innerHeight}px`;\n pipDoc.body.style.height = `${innerHeight}px`;\n };\n updateSize();\n pipWindow.addEventListener('resize', updateSize);\n return () => pipWindow.removeEventListener('resize', updateSize);\n }, [pipWindow]);\n\n // Сколько полных плиток (16:9) помещается при текущей высоте окна.\n // Плитка добавляется, только когда есть полное место; убирается сразу, как перестаёт влезать.\n // При открытом чате окно выше — не раздуваем expanded под чатом.\n const tilesCountBeforeChatRef = useRef(1);\n const multiVisibleCount = useMemo(() => {\n if (isChatOpen) return tilesCountBeforeChatRef.current;\n\n let n = 1;\n while (n < totalParticipants && getPipRequiredHeightForTiles(n + 1) <= pipSize.height) {\n n++;\n }\n tilesCountBeforeChatRef.current = n;\n return n;\n }, [pipSize.height, totalParticipants, isChatOpen]);\n\n const pipWindowHeight = useMemo(() => {\n const tileCount = compactViewMode === 'expanded' ? multiVisibleCount : 1;\n return isChatOpen\n ? getPipWindowHeightWithChat(compactViewMode, tileCount)\n : getPipWindowHeight(compactViewMode, tileCount);\n }, [compactViewMode, multiVisibleCount, isChatOpen]);\n\n const pipContentHeight = pipWindowHeight - PIP_DOCUMENT_WINDOW_FRAME_PX;\n\n useLayoutEffect(() => {\n resizePiPTo?.(pipWindowHeight);\n }, [resizePiPTo, pipWindowHeight]);\n\n useEffect(() => {\n if (pipSize.height + 2 < pipContentHeight) {\n resizePiPTo?.(pipWindowHeight);\n }\n }, [resizePiPTo, pipWindowHeight, pipContentHeight, pipSize.height]);\n\n const multiVisibleParticipants = useMemo(\n () => participants.slice(multiScrollIndex, multiScrollIndex + multiVisibleCount),\n [participants, multiScrollIndex, multiVisibleCount],\n );\n const multiCanPrev = multiScrollIndex > 0;\n const multiCanNext = multiScrollIndex + multiVisibleCount < totalParticipants;\n\n const currentAudioTrack = currentParticipant?.participant?.getTrackPublication(\n Track.Source.Microphone,\n )?.track as LocalAudioTrack | RemoteAudioTrack | undefined;\n\n useEffect(() => {\n if (multiScrollIndex + multiVisibleCount > totalParticipants && totalParticipants > 0) {\n setMultiScrollIndex(Math.max(0, totalParticipants - multiVisibleCount));\n }\n }, [totalParticipants, multiVisibleCount, multiScrollIndex]);\n\n const { pins } = useClassroomPins();\n\n useEffect(() => {\n if (pins.length > 0) {\n setMultiScrollIndex(0);\n }\n }, [pins.map((pin) => `${pin.userId}:${pin.source}`).join(',')]);\n\n const emptyState = (\n <div className=\"bg-background-subtle text-text-primary flex h-full w-full items-center justify-center rounded-2xl\">\n <span className=\"text-sm\">{t('compactView.noParticipants')}</span>\n </div>\n );\n\n const barCn = cn(\n 'bg-background-surface border-border-default flex items-center justify-center rounded-2xl border p-0.5',\n );\n\n const showAudioBar = compactViewMode === 'audio';\n const showSingleParticipant = compactViewMode === 'basic';\n /** В мульти чат заменяет плитки; в basic/audio плитка/полоса остаются. */\n const showMultiTiles = compactViewMode === 'expanded' && !isChatOpen;\n\n const gridTemplateRows = [\n showAudioBar ? `${COMPACT_AUDIO_BAR_HEIGHT_PX}px` : null,\n showSingleParticipant ? 'auto' : null,\n showMultiTiles ? 'minmax(0, 1fr)' : null,\n isChatOpen ? 'minmax(0, 1fr)' : null,\n `${PIP_BAR_HEIGHT_PX}px`,\n ]\n .filter(Boolean)\n .join(' ');\n\n const singleParticipantTile = currentParticipant ? (\n <>\n <ParticipantTile\n trackRef={currentParticipant}\n participant={currentParticipant.participant}\n className=\"h-full w-full\"\n />\n {totalParticipants > 1 && (\n <CompactNavigationControls\n canPrev={canGoPrev}\n canNext={canGoNext}\n onPrev={goToPrev}\n onNext={goToNext}\n currentIndex={currentIndex}\n totalParticipants={totalParticipants}\n />\n )}\n </>\n ) : (\n emptyState\n );\n\n return (\n <div\n className=\"compact-call-container bg-background-page grid min-h-0 gap-1 overflow-hidden p-1\"\n style={{ height: pipSize.height, gridTemplateRows }}\n >\n {showAudioBar && (\n <CompactCallCollapsedBar\n participant={currentParticipant?.participant ?? null}\n audioTrack={currentAudioTrack ?? null}\n onExpand={() => setViewMode('basic')}\n className=\"h-full min-h-0 w-full shadow-none\"\n />\n )}\n\n {showSingleParticipant && (\n <div className=\"group relative aspect-video w-full overflow-hidden rounded-2xl\">\n {singleParticipantTile}\n </div>\n )}\n\n {showMultiTiles && (\n <div className=\"group relative min-h-0 overflow-hidden rounded-2xl\">\n <div\n className=\"relative flex h-full flex-col justify-start overflow-hidden rounded-2xl p-0.5\"\n style={{ gap: TILE_GAP_PX }}\n >\n {multiVisibleParticipants.length === 0\n ? emptyState\n : multiVisibleParticipants.map((trackRef) => (\n <div\n key={`${trackRef.participant.identity}-${trackRef.source}`}\n className=\"aspect-video w-full shrink-0 overflow-hidden rounded-xl\"\n style={{ minHeight: PIP_TILE_HEIGHT_16_9_PX }}\n >\n <ParticipantTile\n trackRef={trackRef}\n participant={trackRef.participant}\n className=\"h-full w-full [&_video]:object-cover\"\n />\n </div>\n ))}\n <CompactMultiViewControls\n canPrev={multiCanPrev}\n canNext={multiCanNext}\n onPrev={() => setMultiScrollIndex((i) => Math.max(0, i - 1))}\n onNext={() =>\n setMultiScrollIndex((i) => Math.min(totalParticipants - multiVisibleCount, i + 1))\n }\n />\n </div>\n </div>\n )}\n\n {isChatOpen && (\n <div className=\"flex min-h-0 flex-col overflow-hidden\">\n <Chat embedded />\n </div>\n )}\n\n <div className=\"flex h-12 shrink-0 items-center gap-0.5\">\n <div className={barCn}>\n <DevicesBar\n className=\"h-[28px] w-[28px]\"\n microTrack={microphoneTrack?.track as LocalAudioTrack}\n microEnabled={isMicrophoneEnabled}\n microTrackToggle={{\n showIcon: true,\n source: Track.Source.Microphone,\n onChange: handleMicrophoneToggle,\n deviceGroups: microphoneGroups,\n }}\n videoTrack={cameraTrack?.track as unknown as LocalVideoTrack}\n videoEnabled={isCameraEnabled}\n videoTrackToggle={{\n showIcon: true,\n source: Track.Source.Camera,\n onChange: handleCameraToggle,\n deviceGroups: cameraGroups,\n }}\n />\n </div>\n\n <div className={barCn}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n size=\"icon\"\n variant=\"none\"\n onClick={() => setViewMode(getNextCompactViewMode(compactViewMode))}\n className=\"hover:bg-background-page text-text-primary h-[28px] w-[28px] rounded-xl p-0\"\n aria-label={viewModeToggleMeta.label}\n >\n <ViewModeIcon className=\"h-6 w-6\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{viewModeToggleMeta.label}</TooltipContent>\n </Tooltip>\n </div>\n\n <div className={cn(barCn, 'ml-auto')}>\n <LessonRecordButton className=\"h-[28px] w-[28px]\" />\n <ScreenShareButton className=\"h-[28px] w-[28px]\" />\n <ChatButton className=\"h-[28px] w-[28px] min-w-[28px] rounded-xl\" />\n <RaiseHandButton className=\"h-[28px] w-[28px]\" />\n </div>\n\n <div className={barCn}>\n <DisconnectButton className=\"h-[28px] w-[28px] rounded-xl\" />\n </div>\n </div>\n </div>\n );\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/ui/compactDragSensors.ts","../src/constants.ts","../src/boardChromeInsets.ts","../src/hooks/useCompactAvailableHeight.ts","../src/hooks/useCompactNavigation.ts","../src/hooks/useDocumentPiP.ts","../src/providers/PiPProvider.tsx","../src/ui/CompactCallCollapsedBar.tsx","../src/ui/CompactNavigationControls.tsx","../src/ui/CompactMultiViewControls.tsx","../src/ui/CompactCallVideoArea.tsx","../src/ui/CompactCallBottomBar.tsx","../src/ui/CompactCall.tsx","../src/ui/stageLayout.ts","../src/ui/ScreenShareStage.tsx","../src/ui/CompactView.tsx","../src/ui/PiPCompactCall.tsx"],"names":["useState","useEffect","useRoom","useCallStore","useCallback","useRef","jsxs","jsx","Track","useTranslation","cn","Button","Tooltip","TooltipTrigger","TooltipContent","usePhoneLayout","useLocalParticipant","mode","useMemo","useClassroomPins","EDGE_PX","width","useTracks","RemoteTrackPublication","useLayoutEffect","node","createPortal","Fragment","ScreenShareStageToggle","ParticipantPinToggle","useCallsNavigation","useSensors","useSensor","Chat","DndContext","restrictToWindowEdges","useChatStore","Users","SoundTwo","Account","usePersistentUserChoices","useTrackToggle","useDeviceMenuGroups","ParticipantTile","DevicesBar","LessonRecordButton","ScreenShareButton","ChatButton","RaiseHandButton","DisconnectButton"],"mappings":"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","file":"index.mjs","sourcesContent":["import {\n PointerSensor,\n TouchSensor,\n type PointerSensorOptions,\n type PointerSensorProps,\n} from '@dnd-kit/core';\nimport type { PointerEvent as ReactPointerEvent } from 'react';\n\n/**\n * dnd-kit отменяет drag на window `resize`. На планшете жест меняет visual viewport\n * (тулбар, dvh) и браузер шлёт resize сразу после старта: зоны уже видны, а перенос обрывается.\n */\nconst detachResizeCancel = (sensor: object, event: Event) => {\n const target = event.target;\n const view =\n target instanceof Node\n ? (target.ownerDocument?.defaultView ?? null)\n : 'view' in event && event.view instanceof Window\n ? event.view\n : null;\n\n if (!view) return;\n\n view.removeEventListener('resize', (sensor as { handleCancel: EventListener }).handleCancel);\n};\n\n/**\n * Мышь и стилус. Палец сюда не берём: PointerSensor на iOS отменяет касание (pointercancel),\n * потому что preventDefault на pointermove там не работает.\n */\nexport class CompactPointerSensor extends PointerSensor {\n constructor(props: PointerSensorProps) {\n super(props);\n detachResizeCancel(this, props.event);\n }\n\n static activators = [\n {\n eventName: 'onPointerDown' as const,\n handler: (\n { nativeEvent: event }: ReactPointerEvent,\n { onActivation }: PointerSensorOptions,\n ) => {\n if (!event.isPrimary || event.button !== 0 || event.pointerType === 'touch') {\n return false;\n }\n\n onActivation?.({ event });\n return true;\n },\n },\n ];\n}\n\n/** Палец. TouchSensor заранее вешает non-passive touchmove, без этого iOS Safari гасит жест. */\nexport class CompactTouchSensor extends TouchSensor {\n constructor(props: PointerSensorProps) {\n super(props);\n detachResizeCancel(this, props.event);\n }\n}\n","import type { CompactViewModeT } from '@xipkg/calls-store';\n\n/** Высота шапки приложения (top-16) */\nexport const HEADER_HEIGHT_PX = 64;\n/**\n * Доп. зазор между fixed compact overlay и контентом доски на телефоне.\n * marginTop контента = высота overlay + этот отступ.\n */\nexport const COMPACT_MOBILE_CONTENT_GAP_PX = 12;\n/** Fallback высоты overlay, пока ResizeObserver ещё не дал headerHeight */\nexport const COMPACT_MOBILE_OVERLAY_FALLBACK_PX = 120;\n/** Тулбар доски сверху и снизу при работе на доске */\nexport const BOARD_TOP_TOOLBAR_PX = 64;\nexport const BOARD_BOTTOM_TOOLBAR_PX = 64;\n/** Нижний отступ: при доске — тулбар доски, иначе общий отступ */\nexport const BOTTOM_OFFSET_BOARD_PX = BOARD_BOTTOM_TOOLBAR_PX;\nexport const BOTTOM_OFFSET_DEFAULT_PX = 16;\nexport const COMPACT_BOTTOM_BAR_PX = 40;\n/** Высота полоски «только аудио» (CompactCallCollapsedBar) */\nexport const COMPACT_AUDIO_BAR_HEIGHT_PX = 48;\nexport const TILES_PADDING_PX = 16;\n\nexport const TILE_MIN_HEIGHT_PX = 120;\nexport const TILE_GAP_PX = 8;\n\n/** Вертикальный padding контейнера expanded-режима (p-1: 4px сверху + 4px снизу) */\nexport const EXPANDED_VIDEO_PADDING_VERTICAL_PX = 8;\n/** Отступ между областью видео и нижней панелью (mb-2 на контейнере видео) */\nexport const COMPACT_VIDEO_AREA_MARGIN_PX = 8;\n/** Нижний отступ compact call на странице доски, соответствует CSS bottom-[72px] */\nexport const COMPACT_BOTTOM_OFFSET_BOARD_PX = BOARD_BOTTOM_TOOLBAR_PX + TILE_GAP_PX; // 72\n\n/** Ширина панели компакт-ВКС: влезает вся нижняя панель, включая запись и завершение звонка. */\nexport const COMPACT_PANEL_WIDTH_PX = 400;\nexport const TILE_HEIGHT_16_9_PX = Math.round((COMPACT_PANEL_WIDTH_PX * 9) / 16); // 225 при ширине 400\n\n/** Размеры окна PiP Document */\nexport const PIP_PANEL_WIDTH_PX = 400;\nexport const PIP_BAR_HEIGHT_PX = 48;\n/** Зазор между областью видео и нижней панелью в PiP (gap-1) */\nexport const PIP_VIDEO_BAR_GAP_PX = 4;\n/** Внутренний вертикальный padding области плиток в PiP expanded (p-0.5) */\nexport const PIP_EXPANDED_INNER_PADDING_PX = 4;\n/** Панель управления + gap + внешний padding корня PiP (p-1 + gap-1 + h-12) */\nexport const PIP_CHROME_HEIGHT_PX =\n PIP_BAR_HEIGHT_PX + PIP_VIDEO_BAR_GAP_PX + EXPANDED_VIDEO_PADDING_VERTICAL_PX;\n\n/**\n * Доп. высота окна Document PiP: шапка браузера не входит в innerHeight,\n * без неё обрезается нижняя панель (~⅔ высоты control bar).\n */\nexport const PIP_DOCUMENT_WINDOW_FRAME_PX = Math.round((PIP_BAR_HEIGHT_PX * 2) / 3);\n\n/**\n * Высота «хрома» + внутренний padding expanded-области (p-0.5).\n * Используется при расчёте, сколько плиток влезает по высоте окна.\n */\nexport const PIP_RESERVED_HEIGHT_PX = PIP_CHROME_HEIGHT_PX + PIP_EXPANDED_INNER_PADDING_PX;\n\n/** Высота одной плитки 16:9 при ширине PiP */\nexport const PIP_TILE_HEIGHT_16_9_PX = Math.round((PIP_PANEL_WIDTH_PX * 9) / 16);\n\n/**\n * Высота области с плитками в PiP.\n * @param tileCount — число видимых плиток 16:9\n * @param withExpandedInnerPadding — p-0.5 вокруг стека в expanded\n */\nexport function getPipTilesStackHeightPx(\n tileCount: number,\n withExpandedInnerPadding = false,\n): number {\n const n = Math.max(1, tileCount);\n const innerPad = withExpandedInnerPadding ? PIP_EXPANDED_INNER_PADDING_PX : 0;\n return innerPad + n * PIP_TILE_HEIGHT_16_9_PX + Math.max(0, n - 1) * TILE_GAP_PX;\n}\n\n/** Высота контента PiP (innerHeight), без шапки окна браузера */\nexport function getPipContentHeight(mode: CompactViewModeT, tileCount = 1): number {\n if (mode === 'audio') {\n return PIP_CHROME_HEIGHT_PX + COMPACT_AUDIO_BAR_HEIGHT_PX;\n }\n if (mode === 'basic') {\n return PIP_CHROME_HEIGHT_PX + getPipTilesStackHeightPx(1, false);\n }\n const n = Math.min(Math.max(1, tileCount), 4);\n return PIP_CHROME_HEIGHT_PX + getPipTilesStackHeightPx(n, true);\n}\n\n/** Высота для resizeTo / requestWindow (контент + шапка Document PiP) */\nexport function getPipWindowHeight(mode: CompactViewModeT, tileCount = 1): number {\n return getPipContentHeight(mode, tileCount) + PIP_DOCUMENT_WINDOW_FRAME_PX;\n}\n\n/** Минимальная высота области чата внутри PiP */\nexport const PIP_CHAT_AREA_MIN_HEIGHT_PX = 360;\n\n/**\n * Высота окна PiP при открытом чате.\n * audio/basic — чат под видео/аудио-полосой (высоты складываются).\n * expanded — чат вместо плиток (не меньше удобной высоты чата).\n */\nexport function getPipWindowHeightWithChat(mode: CompactViewModeT, tileCount = 1): number {\n if (mode === 'expanded') {\n const tilesHeight = getPipWindowHeight(mode, tileCount);\n const chatOnly =\n PIP_CHROME_HEIGHT_PX + PIP_CHAT_AREA_MIN_HEIGHT_PX + PIP_DOCUMENT_WINDOW_FRAME_PX;\n return Math.max(tilesHeight, chatOnly);\n }\n return getPipWindowHeight(mode, 1) + PIP_VIDEO_BAR_GAP_PX + PIP_CHAT_AREA_MIN_HEIGHT_PX;\n}\n\n/** Минимальный innerHeight для n плиток в expanded */\nexport function getPipRequiredHeightForTiles(tileCount: number): number {\n return getPipContentHeight('expanded', tileCount);\n}\n\n/** @deprecated Используйте getPipWindowHeight('basic', 1) */\nexport const PIP_HEIGHT_BASIC_PX = getPipWindowHeight('basic', 1);\n\n/** @deprecated Используйте getPipWindowHeight('audio', 1) */\nexport const PIP_HEIGHT_AUDIO_PX = getPipWindowHeight('audio', 1);\n\nconst COMPACT_VIEW_MODES: CompactViewModeT[] = ['basic', 'expanded', 'audio'];\n\nexport function getNextCompactViewMode(current: CompactViewModeT): CompactViewModeT {\n const index = COMPACT_VIEW_MODES.indexOf(current);\n return COMPACT_VIEW_MODES[(index + 1) % COMPACT_VIEW_MODES.length];\n}\n\nexport function getPipHeightForMode(mode: CompactViewModeT, participantCount: number): number {\n if (mode === 'expanded') {\n const n = Math.min(Math.max(1, participantCount), 4);\n return getPipWindowHeight('expanded', n);\n }\n return getPipWindowHeight(mode, 1);\n}\n\n/** @deprecated Используйте getPipWindowHeight('expanded', n) */\nexport function getPipHeightExpandedPx(participantCount: number): number {\n return getPipHeightForMode('expanded', participantCount);\n}\n","import { useLayoutEffect, useState } from 'react';\nimport type { CSSProperties } from 'react';\nimport type { CornerT } from '@xipkg/calls-store';\nimport {\n BOTTOM_OFFSET_DEFAULT_PX,\n COMPACT_BOTTOM_OFFSET_BOARD_PX,\n HEADER_HEIGHT_PX,\n} from './constants';\n\n/**\n * Доска публикует отступы хрома на documentElement.\n * Имена совпадают с modules.board `boardToolbarDock`.\n */\nconst TOP_VAR = '--board-chrome-top';\nconst RIGHT_VAR = '--board-chrome-right';\nconst BOTTOM_VAR = '--board-chrome-bottom';\nconst LEFT_VAR = '--board-chrome-left';\n\nconst EDGE_PX = 16;\nconst CHAT_TOP_PX = 128;\nconst CHAT_LEFT_EXTRA_PX = 72;\n\nexport type BoardChromeInsets = {\n top: number;\n right: number;\n bottom: number;\n left: number;\n};\n\nfunction readPx(name: string): number | null {\n if (typeof document === 'undefined') return null;\n const raw = getComputedStyle(document.documentElement).getPropertyValue(name).trim();\n if (!raw) return null;\n const value = Number.parseFloat(raw);\n return Number.isFinite(value) ? value : null;\n}\n\nexport function defaultBoardChromeInsets(isBoardPage: boolean): BoardChromeInsets {\n return {\n top: HEADER_HEIGHT_PX,\n right: EDGE_PX,\n bottom: isBoardPage ? COMPACT_BOTTOM_OFFSET_BOARD_PX : BOTTOM_OFFSET_DEFAULT_PX,\n left: EDGE_PX,\n };\n}\n\nexport function readBoardChromeInsets(isBoardPage: boolean): BoardChromeInsets {\n const fallback = defaultBoardChromeInsets(isBoardPage);\n return {\n top: readPx(TOP_VAR) ?? fallback.top,\n right: readPx(RIGHT_VAR) ?? fallback.right,\n bottom: readPx(BOTTOM_VAR) ?? fallback.bottom,\n left: readPx(LEFT_VAR) ?? fallback.left,\n };\n}\n\nfunction sameInsets(left: BoardChromeInsets, right: BoardChromeInsets) {\n return (\n left.top === right.top &&\n left.right === right.right &&\n left.bottom === right.bottom &&\n left.left === right.left\n );\n}\n\nexport function useBoardChromeInsets(isBoardPage: boolean): BoardChromeInsets {\n const [insets, setInsets] = useState(() => readBoardChromeInsets(isBoardPage));\n\n useLayoutEffect(() => {\n const update = () => {\n const next = readBoardChromeInsets(isBoardPage);\n setInsets((current) => (sameInsets(current, next) ? current : next));\n };\n update();\n const observer = new MutationObserver(update);\n observer.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['style'],\n });\n return () => observer.disconnect();\n }, [isBoardPage]);\n\n return insets;\n}\n\nexport function cornerStyle(corner: CornerT, insets: BoardChromeInsets): CSSProperties {\n switch (corner) {\n case 'top-left':\n return { top: insets.top, left: insets.left };\n case 'top-right':\n return { top: insets.top, right: insets.right };\n case 'bottom-left':\n return { bottom: insets.bottom, left: insets.left };\n case 'bottom-right':\n return { bottom: insets.bottom, right: insets.right };\n }\n}\n\nexport function chatPositionStyle(corner: CornerT, insets: BoardChromeInsets): CSSProperties {\n const oppositeLeft = corner === 'top-right' || corner === 'bottom-right';\n const top = CHAT_TOP_PX + Math.max(0, insets.top - HEADER_HEIGHT_PX);\n return oppositeLeft\n ? { top, bottom: insets.bottom, left: insets.left + CHAT_LEFT_EXTRA_PX }\n : { top, bottom: insets.bottom, right: insets.right };\n}\n","import { useEffect, useState } from 'react';\nimport { useBoardChromeInsets } from '../boardChromeInsets';\n\n/**\n * Максимальная высота контейнера compact call (видео + нижняя панель).\n * На доске учитывает отступы тулбара из CSS-переменных `--board-chrome-*`.\n */\nexport function useCompactAvailableHeight(isOnBoardPage: boolean): number {\n const insets = useBoardChromeInsets(isOnBoardPage);\n const [availableHeight, setAvailableHeight] = useState(() => {\n if (typeof window === 'undefined') return 400;\n return window.innerHeight - insets.top - insets.bottom;\n });\n\n useEffect(() => {\n const update = () => {\n setAvailableHeight(window.innerHeight - insets.top - insets.bottom);\n };\n update();\n window.addEventListener('resize', update);\n return () => window.removeEventListener('resize', update);\n }, [insets.top, insets.bottom]);\n\n return availableHeight;\n}\n","import { useState, useEffect, useMemo } from 'react';\nimport { RemoteTrackPublication, Track } from 'livekit-client';\nimport { useTracks } from '@livekit/components-react';\nimport { applyPinsFirst, useCallStore } from '@xipkg/calls-store';\nimport { useClassroomPins, useScreenShareCleanup, useSortedTracks } from '@xipkg/calls-hooks';\nimport { useRoom } from '@xipkg/calls-providers';\n\nexport const useCompactNavigation = () => {\n const { room } = useRoom();\n const [currentParticipantIndex, setCurrentParticipantIndex] = useState(0);\n\n const participants = useTracks(\n [\n { source: Track.Source.Camera, withPlaceholder: true },\n { source: Track.Source.ScreenShare, withPlaceholder: false },\n ],\n {\n onlySubscribed: false,\n },\n );\n\n useScreenShareCleanup(participants);\n\n // VideoGrid при уходе в compact размонтируется. Если плитки ещё и сами\n // отписываются по IntersectionObserver, удалённые камеры остаются\n // isSubscribed=false — а CompactCall рисует VideoTrack только для\n // подписанных треков. Локальная камера от этого не страдает.\n // Не трогаем подписки, пока комната не connected: setSubscribed в момент\n // publish/reconnect на локальном 1.8.x срывает SDP (negotiation timed out).\n useEffect(() => {\n if (room.state !== 'connected') return;\n\n participants.forEach((trackRef) => {\n const publication = trackRef.publication;\n if (\n publication instanceof RemoteTrackPublication &&\n publication.kind === Track.Kind.Video &&\n publication.isEnabled &&\n !publication.isSubscribed\n ) {\n publication.setSubscribed(true);\n }\n });\n }, [participants, room]);\n\n const baseSorted = useSortedTracks(participants, 1);\n const { pins } = useClassroomPins();\n\n const sorted = useMemo(() => applyPinsFirst(baseSorted, pins), [baseSorted, pins]);\n const screenShareStageIdentity = useCallStore((state) => state.screenShareStageIdentity);\n\n // На весь экран уже выведена демонстрация — в панели остаются камеры участников.\n const visibleSorted = useMemo(() => {\n if (!screenShareStageIdentity) return sorted;\n return sorted.filter((trackRef) => trackRef.source !== Track.Source.ScreenShare);\n }, [screenShareStageIdentity, sorted]);\n\n const currentParticipant = visibleSorted[currentParticipantIndex] || null;\n const totalParticipants = visibleSorted.length;\n\n const canGoNext = currentParticipantIndex < totalParticipants - 1;\n const canGoPrev = currentParticipantIndex > 0;\n\n const goToNext = () => {\n if (canGoNext) {\n setCurrentParticipantIndex((prev) => prev + 1);\n }\n };\n\n const goToPrev = () => {\n if (canGoPrev) {\n setCurrentParticipantIndex((prev) => prev - 1);\n }\n };\n\n const goToParticipant = (index: number) => {\n if (index >= 0 && index < totalParticipants) {\n setCurrentParticipantIndex(index);\n }\n };\n\n useEffect(() => {\n if (currentParticipantIndex >= totalParticipants && totalParticipants > 0) {\n setCurrentParticipantIndex(Math.max(0, totalParticipants - 1));\n }\n }, [totalParticipants, currentParticipantIndex]);\n\n const pinsKey = pins.map((pin) => `${pin.userId}:${pin.source}`).join(',');\n\n useEffect(() => {\n if (pins.length > 0) {\n setCurrentParticipantIndex(0);\n }\n }, [pinsKey, pins.length]);\n\n useEffect(() => {\n if (!screenShareStageIdentity) return;\n setCurrentParticipantIndex(0);\n }, [screenShareStageIdentity]);\n\n return {\n currentParticipant,\n participants: visibleSorted,\n currentIndex: currentParticipantIndex,\n totalParticipants,\n canGoNext,\n canGoPrev,\n goToNext,\n goToPrev,\n goToParticipant,\n };\n};\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { PIP_PANEL_WIDTH_PX } from '../constants';\n\ndeclare global {\n interface DocumentPictureInPicture {\n requestWindow(options?: {\n width?: number;\n height?: number;\n disallowReturnToOpener?: boolean;\n preferInitialWindowPlacement?: boolean;\n }): Promise<Window>;\n window: Window | null;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-empty-object-type\n interface DocumentPictureInPictureEvent extends Event {}\n\n interface Window {\n documentPictureInPicture?: DocumentPictureInPicture;\n __SOVLIUM_NATIVE__?: boolean;\n }\n\n // setMicrophoneActive / setCameraActive есть в Chrome 93+, в lib.dom.d.ts пока нет\n interface MediaSession {\n setMicrophoneActive(active: boolean): Promise<void> | void;\n setCameraActive(active: boolean): Promise<void> | void;\n }\n}\n\nfunction setMediaSessionCaptureState(\n setActive: ((active: boolean) => Promise<void> | void) | undefined,\n active: boolean,\n) {\n if (!setActive) return;\n try {\n const result = setActive(active);\n result?.catch(() => {\n // Chrome отклоняет активацию без user gesture — ожидаемо вне обработчика клика\n });\n } catch {\n // ignore\n }\n}\n\ntype UseDocumentPiPOptions = {\n width?: number;\n height?: number;\n enabled?: boolean;\n microphoneActive?: boolean;\n cameraActive?: boolean;\n};\n\nfunction applyDocumentTheme(sourceDoc: Document, targetDoc: Document) {\n const sourceEl = sourceDoc.documentElement;\n const targetEl = targetDoc.documentElement;\n const theme = sourceEl.getAttribute('data-theme');\n if (theme) {\n targetEl.setAttribute('data-theme', theme);\n } else {\n targetEl.removeAttribute('data-theme');\n }\n targetEl.className = sourceEl.className;\n const colorScheme = getComputedStyle(sourceEl).colorScheme;\n if (colorScheme) {\n targetEl.style.colorScheme = colorScheme;\n targetDoc.body.style.colorScheme = colorScheme;\n }\n const pageBg =\n getComputedStyle(sourceEl).getPropertyValue('--xi-background-page').trim() ||\n (theme === 'dark' ? '#1a1a1a' : '#ffffff');\n targetEl.style.height = '100%';\n targetEl.style.background = pageBg;\n targetDoc.body.style.margin = '0';\n targetDoc.body.style.height = '100%';\n targetDoc.body.style.overflow = 'hidden';\n targetDoc.body.style.background = pageBg;\n}\n\nfunction copyStylesToWindow(targetWindow: Window) {\n [...document.styleSheets].forEach((styleSheet) => {\n try {\n const cssRules = [...styleSheet.cssRules].map((rule) => rule.cssText).join('');\n const style = document.createElement('style');\n style.textContent = cssRules;\n targetWindow.document.head.appendChild(style);\n } catch {\n if (styleSheet.href) {\n const link = document.createElement('link');\n link.rel = 'stylesheet';\n link.type = styleSheet.type || 'text/css';\n link.media = styleSheet.media.mediaText;\n link.href = styleSheet.href;\n targetWindow.document.head.appendChild(link);\n }\n }\n });\n\n try {\n document.fonts.forEach((font) => {\n targetWindow.document.fonts.add(font);\n });\n } catch {\n // ignore\n }\n}\n\nexport function useDocumentPiP({\n width = PIP_PANEL_WIDTH_PX,\n height = 270,\n enabled = true,\n microphoneActive = false,\n cameraActive = false,\n}: UseDocumentPiPOptions = {}) {\n const [pipWindow, setPipWindow] = useState<Window | null>(null);\n const pipWindowRef = useRef<Window | null>(null);\n const micActiveRef = useRef(microphoneActive);\n const camActiveRef = useRef(cameraActive);\n\n micActiveRef.current = microphoneActive;\n camActiveRef.current = cameraActive;\n\n const isSupported = typeof window !== 'undefined' && 'documentPictureInPicture' in window;\n\n // Chrome для авто-PiP при видеозвонках требует setCameraActive / setMicrophoneActive\n useEffect(() => {\n if (!enabled) return;\n\n const mediaSession = navigator.mediaSession;\n if (!mediaSession) return;\n\n setMediaSessionCaptureState(\n typeof mediaSession.setMicrophoneActive === 'function'\n ? mediaSession.setMicrophoneActive.bind(mediaSession)\n : undefined,\n microphoneActive,\n );\n setMediaSessionCaptureState(\n typeof mediaSession.setCameraActive === 'function'\n ? mediaSession.setCameraActive.bind(mediaSession)\n : undefined,\n cameraActive,\n );\n }, [enabled, microphoneActive, cameraActive]);\n\n const openPiP = useCallback(\n async (overrides?: { width?: number; height?: number }): Promise<Window | null> => {\n if (!isSupported || !enabled) return null;\n if (pipWindowRef.current) return pipWindowRef.current;\n\n const w = overrides?.width ?? width;\n const h = overrides?.height ?? height;\n\n try {\n const pip = await window.documentPictureInPicture!.requestWindow({\n width: w,\n height: h,\n });\n\n copyStylesToWindow(pip);\n applyDocumentTheme(document, pip.document);\n\n const themeObserver = new MutationObserver(() => {\n applyDocumentTheme(document, pip.document);\n });\n themeObserver.observe(document.documentElement, {\n attributes: true,\n attributeFilter: ['data-theme', 'class', 'style'],\n });\n\n pipWindowRef.current = pip;\n setPipWindow(pip);\n\n try {\n pip.resizeTo(w, h);\n } catch {\n // ignore\n }\n\n pip.addEventListener('pagehide', () => {\n themeObserver.disconnect();\n pipWindowRef.current = null;\n setPipWindow(null);\n });\n\n return pip;\n } catch {\n return null;\n }\n },\n [isSupported, enabled, width, height],\n );\n\n const closePiP = useCallback(() => {\n if (pipWindowRef.current) {\n pipWindowRef.current.close();\n }\n }, []);\n\n // Закрываем PiP при возврате на вкладку\n useEffect(() => {\n if (!enabled) return;\n\n const handleVisibilityChange = () => {\n // Native mini-window *is* the opener; closing on focus would expand\n // the call every time the user clicks the overlay.\n if (typeof window !== 'undefined' && window.__SOVLIUM_NATIVE__) return;\n if (!document.hidden && pipWindowRef.current) {\n closePiP();\n }\n };\n\n document.addEventListener('visibilitychange', handleVisibilityChange);\n return () => document.removeEventListener('visibilitychange', handleVisibilityChange);\n }, [enabled, closePiP]);\n\n // Cleanup on unmount\n useEffect(() => {\n return () => {\n pipWindowRef.current?.close();\n pipWindowRef.current = null;\n };\n }, []);\n\n const resizePiP = useCallback((w: number, h: number) => {\n if (pipWindowRef.current) {\n try {\n pipWindowRef.current.resizeTo(w, h);\n } catch {\n // ignore\n }\n }\n }, []);\n\n return {\n isSupported,\n pipWindow,\n isPiPActive: pipWindow !== null,\n openPiP,\n closePiP,\n resizePiP,\n };\n}\n","import { createContext, useCallback, useContext, useEffect, useRef } from 'react';\nimport { createPortal } from 'react-dom';\nimport { useLocalParticipant } from '@livekit/components-react';\nimport { useDocumentPiP, useCompactNavigation } from '../hooks';\nimport { PiPCompactCall } from '../ui';\nimport { useCallStore } from '@xipkg/calls-store';\nimport { useRoom } from '@xipkg/calls-providers';\nimport { usePhoneLayout } from '@xipkg/calls-utils';\nimport { getPipHeightForMode, PIP_HEIGHT_BASIC_PX, PIP_PANEL_WIDTH_PX } from '../constants';\n\ntype PiPContextValue = {\n openPiP: () => Promise<void>;\n closePiP: () => void;\n isPiPActive: boolean;\n isSupported: boolean;\n resizePiPTo: (height: number) => void;\n};\n\nconst PiPContext = createContext<PiPContextValue | null>(null);\n\nexport function usePiP() {\n const ctx = useContext(PiPContext);\n return ctx;\n}\n\nfunction getMediaStreamTrack(\n pub: { track?: { mediaStreamTrack?: MediaStreamTrack } } | undefined,\n): MediaStreamTrack | undefined {\n return pub?.track?.mediaStreamTrack;\n}\n\nfunction useMediaCaptureLive() {\n const { microphoneTrack, cameraTrack } = useLocalParticipant();\n const micTrack = getMediaStreamTrack(microphoneTrack);\n const camTrack = getMediaStreamTrack(cameraTrack);\n const micLive = !!micTrack && micTrack.readyState === 'live' && micTrack.enabled;\n const camLive = !!camTrack && camTrack.readyState === 'live' && camTrack.enabled;\n return { micLive, camLive };\n}\n\ntype PiPProviderProps = {\n children: React.ReactNode;\n};\n\n/**\n * Предоставляет API PiP (openPiP, isSupported) дочерним компонентам и управляет\n * Document Picture-in-Picture (логика из PiPManager).\n */\nexport function PiPProvider({ children }: PiPProviderProps) {\n const isMobile = usePhoneLayout();\n const { micLive, camLive } = useMediaCaptureLive();\n const { room } = useRoom();\n const compactViewMode = useCallStore((s) => s.compactViewMode);\n const { totalParticipants } = useCompactNavigation();\n\n const {\n pipWindow,\n closePiP,\n resizePiP,\n openPiP: openPiPRaw,\n isSupported,\n } = useDocumentPiP({\n enabled: !isMobile,\n width: PIP_PANEL_WIDTH_PX,\n height: PIP_HEIGHT_BASIC_PX,\n microphoneActive: micLive,\n cameraActive: camLive,\n });\n\n const openPiP = useCallback(async () => {\n const width = PIP_PANEL_WIDTH_PX;\n const height = getPipHeightForMode(compactViewMode, totalParticipants);\n const pip = await openPiPRaw({ width, height });\n if (pip) {\n // requestWindow не всегда сразу даёт нужный innerHeight — подгоняем сразу при открытии\n requestAnimationFrame(() => {\n resizePiP?.(width, height);\n });\n }\n }, [openPiPRaw, resizePiP, compactViewMode, totalParticipants]);\n\n useEffect(() => {\n if (!room || !pipWindow) return;\n if (room.state !== 'connected') {\n closePiP();\n return;\n }\n const handleState = () => {\n if (room.state !== 'connected') closePiP();\n };\n room.on('connectionStateChanged', handleState);\n return () => {\n room.off('connectionStateChanged', handleState);\n };\n }, [room, pipWindow, closePiP]);\n\n const resizePiPTo = useCallback(\n (height: number) => {\n resizePiP?.(PIP_PANEL_WIDTH_PX, height);\n },\n [resizePiP],\n );\n\n const openPiPRef = useRef(openPiP);\n openPiPRef.current = openPiP;\n\n useEffect(() => {\n if (!isSupported || isMobile) return;\n\n const request = () => {\n void openPiPRef.current();\n };\n const close = () => {\n closePiP();\n };\n\n window.addEventListener('sovlium:call-pip-request', request);\n window.addEventListener('sovlium:call-pip-close', close);\n return () => {\n window.removeEventListener('sovlium:call-pip-request', request);\n window.removeEventListener('sovlium:call-pip-close', close);\n };\n }, [isSupported, isMobile, closePiP]);\n\n // Media Session PiP — с корректной высотой под текущий режим (не дефолт basic)\n useEffect(() => {\n if (!isSupported || isMobile) return;\n\n const action = 'enterpictureinpicture' as MediaSessionAction;\n const mediaSession = navigator.mediaSession;\n if (!mediaSession) return;\n\n try {\n mediaSession.setActionHandler(action, () => {\n void openPiPRef.current();\n });\n } catch {\n // enterpictureinpicture не поддерживается\n }\n\n return () => {\n try {\n mediaSession.setActionHandler(action, null);\n } catch {\n // ignore\n }\n };\n }, [isSupported, isMobile]);\n\n const value: PiPContextValue = {\n openPiP,\n closePiP,\n isPiPActive: pipWindow !== null,\n isSupported: isSupported && !isMobile,\n resizePiPTo,\n };\n\n return (\n <PiPContext.Provider value={value}>\n {children}\n {pipWindow &&\n createPortal(\n <div className=\"bg-background-page h-full min-h-0\">\n <PiPCompactCall pipWindow={pipWindow} resizePiPTo={resizePiPTo} />\n </div>,\n pipWindow.document.body,\n )}\n </PiPContext.Provider>\n );\n}\n","import type { CSSProperties } from 'react';\nimport { useAudioWaveform } from '@livekit/components-react';\nimport type { LocalAudioTrack, RemoteAudioTrack } from 'livekit-client';\nimport { Participant, Track } from 'livekit-client';\nimport { ChevronBottom, MicrophoneOff, RedLine } from '@xipkg/icons';\nimport { Button } from '@xipkg/button';\nimport { ParticipantName, TrackMutedIndicator, RaisedHandIndicator } from '@xipkg/calls-ui';\nimport { cn } from '@xipkg/utils';\nimport { useTranslation } from 'react-i18next';\n\ntype CompactCallCollapsedBarProps = {\n participant: Participant | null;\n audioTrack?: LocalAudioTrack | RemoteAudioTrack | null;\n onExpand: () => void;\n className?: string;\n style?: CSSProperties;\n};\n\nexport function CompactCallCollapsedBar({\n participant,\n audioTrack,\n onExpand,\n className,\n style,\n}: CompactCallCollapsedBarProps) {\n const { t } = useTranslation('calls');\n const { bars } = useAudioWaveform(audioTrack ?? undefined, {\n barCount: 24,\n volMultiplier: 4,\n updateInterval: 50,\n });\n return (\n <div\n style={style}\n className={cn(\n 'bg-background-surface border-border-default flex items-center gap-2 rounded-2xl border px-2 py-2 shadow-lg',\n className,\n )}\n >\n {/* Тот же блок, что и в плитке участника ВКС: микрофон + имя */}\n <div className=\"bg-background-page/80 flex h-6 max-w-[45%] min-w-0 shrink gap-1.5 rounded-lg px-1.5 py-1 backdrop-blur\">\n {participant ? (\n <>\n <TrackMutedIndicator\n trackRef={{\n participant,\n source: Track.Source.Microphone,\n }}\n show=\"muted\"\n style={{ marginRight: '0.45rem', background: 'transparent' }}\n />\n <span className=\"flex min-w-0 truncate\">\n <ParticipantName participant={participant} />\n </span>\n </>\n ) : (\n <>\n <div className=\"relative w-3 shrink-0\">\n <MicrophoneOff className=\"fill-icon-primary absolute h-4 w-4\" />\n <RedLine className=\"fill-icon-danger absolute h-4 w-4\" />\n </div>\n <span className=\"text-xs-base-size text-text-primary leading-[16px]\">\n {t('compactView.noParticipants')}\n </span>\n </>\n )}\n </div>\n {participant && <RaisedHandIndicator participant={participant ?? 'unknown'} />}\n <div className=\"flex min-w-0 flex-1 items-center justify-center gap-0.5 py-1\">\n {bars.length > 0 ? (\n <div className=\"flex h-4 items-end justify-center gap-0.5\">\n {bars.map((h, i) => (\n <div\n key={i}\n className=\"bg-action-primary-background-default w-0.5 min-w-[2px] rounded-full transition-all duration-75\"\n style={{ height: `${Math.min(100, Math.max(20, h * 150))}%` }}\n />\n ))}\n </div>\n ) : (\n <div className=\"bg-action-primary-background-default h-2 w-12 rounded-full\" />\n )}\n </div>\n <Button\n size=\"icon\"\n variant=\"none\"\n onClick={onExpand}\n className=\"bg-action-primary-background-pressed hover:bg-action-primary-background-pressed/80 text-text-on-accent h-8 w-8 shrink-0 rounded-xl p-0\"\n aria-label={t('compactView.expand')}\n >\n <ChevronBottom className=\"fill-action-primary-text h-4 w-4\" />\n </Button>\n </div>\n );\n}\n","import { ArrowLeft, ArrowRight } from '@xipkg/icons';\nimport { useTranslation } from 'react-i18next';\n\ninterface CompactNavigationControlsProps {\n canPrev: boolean;\n canNext: boolean;\n onPrev: () => void;\n onNext: () => void;\n currentIndex: number;\n totalParticipants: number;\n /** На тач-экране шире 640px hover нет — стрелки остаются видимыми */\n persistent?: boolean;\n}\n\n/**\n * Элементы управления навигацией для компактного вида\n * Показывает кнопки навигации и индикаторы участников только при наведении\n */\nexport function CompactNavigationControls({\n canPrev,\n canNext,\n onPrev,\n onNext,\n currentIndex,\n totalParticipants,\n persistent = false,\n}: CompactNavigationControlsProps) {\n const { t } = useTranslation('calls');\n const hoverOnly = persistent ? '' : 'sm:opacity-0 sm:group-hover:opacity-100';\n\n if (totalParticipants <= 1) {\n return null;\n }\n\n return (\n <div className=\"pointer-events-none absolute inset-0\">\n {/* Индикатор участников вверху */}\n <div className=\"pointer-events-auto absolute top-2 left-1/2 -translate-x-1/2\">\n <div\n className={`bg-background-subtle/80 flex gap-1 rounded-full px-2 py-1 backdrop-blur-sm transition-opacity duration-200 ${hoverOnly}`}\n >\n {Array.from({ length: totalParticipants }, (_, index) => (\n <button\n key={index}\n type=\"button\"\n onClick={() => {\n // Здесь можно добавить логику для прямого перехода к участнику\n // Пока оставляем только навигацию через кнопки\n }}\n className={`h-1.5 w-1.5 rounded-full transition-colors ${\n index === currentIndex\n ? 'bg-text-primary'\n : 'bg-text-primary/40 hover:bg-text-primary/70'\n }`}\n aria-label={t('compactView.participant', { index: index + 1 })}\n />\n ))}\n </div>\n </div>\n\n {/* Кнопка \"Предыдущий участник\" */}\n <div\n className={`pointer-events-auto absolute top-1/2 left-2 -translate-y-1/2 transition-opacity duration-200 ${hoverOnly}`}\n >\n <button\n type=\"button\"\n disabled={!canPrev}\n onClick={onPrev}\n className=\"bg-background-subtle/80 hover:bg-background-subtle fill-icon-primary z-10 flex items-center justify-center rounded-full p-2 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <ArrowLeft className=\"h-4 w-4\" />\n <span className=\"sr-only\">{t('compactView.prevParticipant')}</span>\n </button>\n </div>\n\n {/* Кнопка \"Следующий участник\" */}\n <div\n className={`pointer-events-auto absolute top-1/2 right-2 -translate-y-1/2 transition-opacity duration-200 ${hoverOnly}`}\n >\n <button\n type=\"button\"\n disabled={!canNext}\n onClick={onNext}\n className=\"bg-background-subtle/80 hover:bg-background-subtle fill-icon-primary z-10 flex items-center justify-center rounded-full p-2 disabled:pointer-events-none disabled:cursor-not-allowed disabled:opacity-50\"\n >\n <ArrowRight className=\"h-4 w-4\" />\n <span className=\"sr-only\">{t('compactView.nextParticipant')}</span>\n </button>\n </div>\n </div>\n );\n}\n","import { ArrowUp } from '@xipkg/icons';\nimport { useTranslation } from 'react-i18next';\n\ninterface CompactMultiViewControlsProps {\n canPrev: boolean;\n canNext: boolean;\n onPrev: () => void;\n onNext: () => void;\n}\n\n/**\n * Стрелки листания для развёрнутого мульти-вида ВКС:\n * сверху на первой плитке — стрелка вверх, снизу на последней — стрелка вниз\n */\nexport function CompactMultiViewControls({\n canPrev,\n canNext,\n onPrev,\n onNext,\n}: CompactMultiViewControlsProps) {\n const { t } = useTranslation('calls');\n\n return (\n <div className=\"pointer-events-none absolute inset-0\">\n {/* Стрелка вверх — по центру сверху (на первой плитке), если есть куда листать */}\n {canPrev && (\n <div className=\"pointer-events-auto absolute top-2 left-1/2 z-10 -translate-x-1/2\">\n <button\n type=\"button\"\n onClick={onPrev}\n className=\"bg-background-subtle/80 hover:bg-background-subtle fill-icon-primary flex items-center justify-center rounded-full p-2\"\n aria-label={t('compactView.scrollUp')}\n >\n <ArrowUp className=\"h-4 w-4 fill-inherit\" />\n </button>\n </div>\n )}\n {/* Стрелка вниз — по центру снизу (на последней плитке) */}\n {canNext && (\n <div className=\"pointer-events-auto absolute bottom-2 left-1/2 z-10 -translate-x-1/2\">\n <button\n type=\"button\"\n onClick={onNext}\n className=\"bg-background-subtle/80 hover:bg-background-subtle fill-icon-primary flex items-center justify-center rounded-full p-2\"\n aria-label={t('compactView.scrollDown')}\n >\n <ArrowUp className=\"h-4 w-4 rotate-180 fill-inherit\" />\n </button>\n </div>\n )}\n </div>\n );\n}\n","import type { TrackReferenceOrPlaceholder } from '@livekit/components-core';\nimport { Track } from 'livekit-client';\nimport type { CompactViewModeT } from '@xipkg/calls-store';\nimport { Button } from '@xipkg/button';\nimport { ChevronUp, External } from '@xipkg/icons';\nimport { cn } from '@xipkg/utils';\nimport { useTranslation } from 'react-i18next';\nimport { usePiP } from '../providers';\nimport { CompactCallCollapsedBar } from './CompactCallCollapsedBar';\nimport { CompactNavigationControls } from './CompactNavigationControls';\nimport { CompactMultiViewControls } from './CompactMultiViewControls';\nimport {\n ParticipantTile,\n ParticipantPinToggle,\n ScreenShareStageToggle,\n tileOverlayButtonClassName,\n} from '@xipkg/calls-ui';\nimport { COMPACT_PANEL_WIDTH_PX, TILE_GAP_PX, TILE_HEIGHT_16_9_PX } from '../constants';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@xipkg/tooltip';\n\ntype CompactCallVideoAreaProps = {\n isMobile: boolean;\n isCollapsed: boolean;\n onCollapsedChange: (collapsed: boolean) => void;\n withOutShadows: boolean;\n dragAttributes?: object;\n dragListeners?: object;\n /** Режим вида на десктопе */\n compactViewMode: CompactViewModeT;\n currentParticipant: TrackReferenceOrPlaceholder | null;\n currentAudioTrack:\n import('livekit-client').RemoteAudioTrack | import('livekit-client').LocalAudioTrack | null;\n totalParticipants: number;\n canGoPrev: boolean;\n canGoNext: boolean;\n onPrev: () => void;\n onNext: () => void;\n currentIndex: number;\n multiVisibleParticipants: TrackReferenceOrPlaceholder[];\n multiTileHeightPx: number;\n multiCanPrev: boolean;\n multiCanNext: boolean;\n onMultiPrev: () => void;\n onMultiNext: () => void;\n onAudioExpand: () => void;\n /** Размер плитки в полноэкранной демонстрации на телефоне */\n tileWidth?: number;\n tileHeight?: number;\n};\n\nexport function CompactCallVideoArea({\n isMobile,\n isCollapsed,\n onCollapsedChange,\n withOutShadows,\n dragAttributes = {},\n dragListeners = {},\n compactViewMode,\n currentParticipant,\n currentAudioTrack,\n totalParticipants,\n canGoPrev,\n canGoNext,\n onPrev,\n onNext,\n currentIndex,\n multiVisibleParticipants,\n multiTileHeightPx,\n multiCanPrev,\n multiCanNext,\n onMultiPrev,\n onMultiNext,\n onAudioExpand,\n tileWidth,\n tileHeight,\n}: CompactCallVideoAreaProps) {\n const { t } = useTranslation('calls');\n const pip = usePiP();\n const showPiPButton = pip?.isSupported && !!currentParticipant;\n\n /**\n * На десктопе в basic-режиме выносим Pin (и опционально PiP) в оверлей над плиткой.\n * Это позволяет показывать Pin всегда, даже если PiP не поддерживается.\n */\n const showDesktopOverlay = !isMobile && compactViewMode === 'basic' && !!currentParticipant;\n\n /** В expanded-режиме Pin первой плитки и PiP в одном оверлее — иначе кнопки накладываются */\n const firstMultiParticipant = multiVisibleParticipants[0] ?? null;\n const showExpandedOverlay =\n !isMobile && compactViewMode === 'expanded' && !!firstMultiParticipant;\n\n const overlayTrackRef = showDesktopOverlay\n ? currentParticipant\n : showExpandedOverlay\n ? firstMultiParticipant\n : null;\n const showPinPiPOverlay = !!overlayTrackRef;\n\n const emptyState = (\n <div className=\"bg-background-subtle text-text-primary flex h-full w-full items-center justify-center\">\n <span className=\"text-sm\">{t('compactView.noParticipants')}</span>\n </div>\n );\n\n if (isMobile && isCollapsed) {\n return (\n <CompactCallCollapsedBar\n participant={currentParticipant?.participant ?? null}\n audioTrack={currentAudioTrack ?? null}\n onExpand={() => onCollapsedChange(false)}\n className={cn('mb-2', withOutShadows ? '' : 'shadow-lg')}\n />\n );\n }\n\n if (!isMobile && compactViewMode === 'audio') {\n return (\n <CompactCallCollapsedBar\n participant={currentParticipant?.participant ?? null}\n audioTrack={currentAudioTrack ?? null}\n onExpand={onAudioExpand}\n className={cn('mb-2', withOutShadows ? '' : 'shadow-lg')}\n style={{ width: COMPACT_PANEL_WIDTH_PX }}\n />\n );\n }\n\n return (\n <div\n {...(isMobile ? {} : { ...dragAttributes, ...dragListeners })}\n className={cn(\n 'bg-background-subtle group relative mb-2 flex overflow-hidden rounded-2xl',\n withOutShadows ? '' : 'shadow-lg',\n isMobile ? 'h-auto w-full items-center justify-center' : 'cursor-move touch-none flex-col',\n !isMobile && compactViewMode === 'basic' && 'shrink-0',\n !isMobile && compactViewMode === 'expanded' && 'h-auto',\n )}\n style={\n isMobile\n ? undefined\n : {\n width: tileWidth != null ? '100%' : COMPACT_PANEL_WIDTH_PX,\n touchAction: 'none',\n ...(compactViewMode === 'basic' ? { height: tileHeight ?? TILE_HEIGHT_16_9_PX } : {}),\n }\n }\n >\n {isMobile ? (\n currentParticipant ? (\n <div className=\"relative h-full min-h-0 w-full min-w-0\">\n <ParticipantTile\n trackRef={currentParticipant}\n participant={currentParticipant.participant}\n className=\"h-full w-full\"\n hidePinToggle={showDesktopOverlay}\n />\n </div>\n ) : (\n emptyState\n )\n ) : compactViewMode === 'expanded' ? (\n <div\n className=\"relative flex flex-col gap-2 overflow-hidden rounded-2xl p-1\"\n style={{ gap: TILE_GAP_PX }}\n >\n {multiVisibleParticipants.length === 0\n ? emptyState\n : multiVisibleParticipants.map((trackRef, index) => (\n <div\n key={`${trackRef.participant.identity}-${trackRef.source}`}\n className=\"aspect-video w-full shrink-0 overflow-hidden rounded-xl\"\n style={{ minHeight: multiTileHeightPx }}\n >\n <ParticipantTile\n trackRef={trackRef}\n participant={trackRef.participant}\n className=\"h-full w-full [&_video]:object-cover\"\n hidePinToggle={showExpandedOverlay && index === 0}\n />\n </div>\n ))}\n <CompactMultiViewControls\n canPrev={multiCanPrev}\n canNext={multiCanNext}\n onPrev={onMultiPrev}\n onNext={onMultiNext}\n />\n </div>\n ) : currentParticipant ? (\n <div className=\"relative h-full min-h-0 w-full min-w-0\">\n <ParticipantTile\n trackRef={currentParticipant}\n participant={currentParticipant.participant}\n className=\"h-full w-full\"\n hidePinToggle={showDesktopOverlay}\n />\n </div>\n ) : (\n emptyState\n )}\n\n {/* Оверлей с Pin (и опционально PiP) для basic и expanded на десктопе */}\n {showPinPiPOverlay && (\n <div className=\"absolute top-2 right-2 z-10 flex items-center gap-1\">\n {overlayTrackRef.source === Track.Source.ScreenShare ? (\n <ScreenShareStageToggle trackRef={overlayTrackRef} inline />\n ) : null}\n <ParticipantPinToggle trackRef={overlayTrackRef} inline />\n {showPiPButton && (\n <Tooltip>\n <TooltipTrigger asChild>\n <button\n type=\"button\"\n onClick={() => void pip!.openPiP()}\n className={tileOverlayButtonClassName}\n aria-label={t('compactView.openPip')}\n >\n <External className=\"fill-icon-primary\" style={{ width: 16, height: 16 }} />\n </button>\n </TooltipTrigger>\n <TooltipContent>{t('compactView.openPip')}</TooltipContent>\n </Tooltip>\n )}\n </div>\n )}\n\n {isMobile && (\n <Button\n size=\"icon\"\n variant=\"none\"\n onClick={() => onCollapsedChange(true)}\n className=\"bg-action-primary-background-pressed hover:bg-action-primary-background-pressed/80 text-text-on-accent absolute top-2 right-2 z-10 h-8 w-8 rounded-xl p-0\"\n aria-label={t('compactView.collapse')}\n >\n <ChevronUp className=\"fill-action-primary-text h-4 w-4\" />\n </Button>\n )}\n\n {totalParticipants > 0 && (isMobile || compactViewMode === 'basic') && (\n <CompactNavigationControls\n canPrev={canGoPrev}\n canNext={canGoNext}\n onPrev={onPrev}\n onNext={onNext}\n currentIndex={currentIndex}\n totalParticipants={totalParticipants}\n persistent={tileHeight != null}\n />\n )}\n </div>\n );\n}\n","import type { LocalAudioTrack, LocalVideoTrack } from 'livekit-client';\nimport { Button } from '@xipkg/button';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@xipkg/tooltip';\nimport {\n DropdownMenu,\n DropdownMenuContent,\n DropdownMenuItem,\n DropdownMenuLabel,\n DropdownMenuTrigger,\n} from '@xipkg/dropdown';\nimport { Account, Maximize, SoundTwo, Users, WhiteBoard } from '@xipkg/icons';\nimport { cn } from '@xipkg/utils';\nimport { useCallStore, type CompactViewModeT } from '@xipkg/calls-store';\nimport type { DeviceMenuGroupT } from '@xipkg/calls-hooks';\nimport { useTranslation } from 'react-i18next';\nimport { getNextCompactViewMode } from '../constants';\nimport {\n DevicesBar,\n DisconnectButton,\n LessonRecordButton,\n ScreenShareButton,\n} from '@xipkg/calls-ui';\nimport { ChatButton } from '@xipkg/calls-chat';\nimport { RaiseHandButton } from '@xipkg/calls-risehand';\n\ntype CompactCallTrackTogglePropsT = {\n showIcon: boolean;\n source: import('livekit-client').Track.Source;\n onChange: (enabled: boolean) => void;\n deviceGroups?: DeviceMenuGroupT[];\n};\n\ntype CompactCallDevicesPropsT = {\n microTrack: LocalAudioTrack | undefined;\n microEnabled: boolean;\n microTrackToggle: CompactCallTrackTogglePropsT;\n videoTrack: LocalVideoTrack | undefined;\n videoEnabled: boolean;\n videoTrackToggle: CompactCallTrackTogglePropsT;\n};\n\ntype CompactCallBottomBarPropsT = {\n withOutShadows: boolean;\n devices: CompactCallDevicesPropsT;\n isMobile: boolean;\n compactViewMode: CompactViewModeT;\n onViewModeToggle: () => void;\n showBackToBoardButton: boolean;\n onBackToBoard: () => void;\n onMaximize: (syncToAll?: boolean) => void;\n isTutor: boolean;\n /** Узкая панель поверх демонстрации: одна строка без нижнего safe-area */\n stageCompact?: boolean;\n};\n\nexport function CompactCallBottomBar({\n withOutShadows,\n devices,\n isMobile,\n compactViewMode,\n onViewModeToggle,\n showBackToBoardButton,\n onBackToBoard,\n onMaximize,\n isTutor,\n stageCompact = false,\n}: CompactCallBottomBarPropsT) {\n const { t } = useTranslation('calls');\n const screenShareStage = useCallStore((state) => state.screenShareStageIdentity);\n const nextViewMode = getNextCompactViewMode(compactViewMode);\n const viewModeToggleMeta = {\n expanded: { Icon: Users, label: t('compactView.mode.expanded') },\n audio: { Icon: SoundTwo, label: t('compactView.mode.audio') },\n basic: { Icon: Account, label: t('compactView.mode.basic') },\n }[nextViewMode];\n const ViewModeIcon = viewModeToggleMeta.Icon;\n\n const barCn = cn(\n 'bg-background-surface border-border-default flex items-center justify-center rounded-2xl border p-1',\n withOutShadows ? '' : 'shadow-lg',\n );\n\n return (\n <div\n className={cn(\n 'flex h-10 shrink-0 flex-row',\n stageCompact\n ? 'max-w-full [scrollbar-width:none] overflow-x-auto [&::-webkit-scrollbar]:hidden [&>*]:shrink-0'\n : 'pb-[max(0px,env(safe-area-inset-bottom))]',\n )}\n >\n <div className={barCn}>\n <DevicesBar\n className=\"h-[32px] w-[32px]\"\n microTrack={devices.microTrack}\n microEnabled={devices.microEnabled}\n microTrackToggle={devices.microTrackToggle}\n videoTrack={devices.videoTrack}\n videoEnabled={devices.videoEnabled}\n videoTrackToggle={devices.videoTrackToggle}\n />\n </div>\n\n {!isMobile && (\n <div className={cn(barCn, 'ml-1')}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n size=\"icon\"\n variant=\"none\"\n onClick={onViewModeToggle}\n className=\"hover:bg-background-page text-text-primary h-8 w-8 rounded-xl p-0\"\n aria-label={viewModeToggleMeta.label}\n >\n <ViewModeIcon className=\"h-6 w-6\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{viewModeToggleMeta.label}</TooltipContent>\n </Tooltip>\n </div>\n )}\n\n {showBackToBoardButton && (\n <div className={cn(barCn, 'ml-1')}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n size=\"icon\"\n variant=\"primary\"\n className=\"h-8 w-8 rounded-xl p-0\"\n onClick={onBackToBoard}\n aria-label={t('compactView.toBoardAria')}\n >\n <WhiteBoard className=\"fill-action-primary-text h-6 w-6\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{t('compactView.toBoardTooltip')}</TooltipContent>\n </Tooltip>\n </div>\n )}\n\n <div className={cn(barCn, 'ml-auto')}>\n <LessonRecordButton className=\"h-8 w-8\" />\n <ScreenShareButton className=\"h-8 w-8\" />\n <ChatButton className=\"h-8 w-8 min-w-8 rounded-xl\" />\n <RaiseHandButton className=\"h-8 w-8 min-w-8\" />\n </div>\n\n <div className={cn(barCn, 'ml-1')}>\n {!screenShareStage &&\n (isTutor ? (\n <DropdownMenu>\n <Tooltip>\n <TooltipTrigger asChild>\n <DropdownMenuTrigger asChild>\n <Button\n size=\"icon\"\n variant=\"none\"\n className=\"hover:bg-background-page text-text-primary relative m-0 h-8 w-8 rounded-xl p-0\"\n >\n <Maximize className=\"fill-icon-primary\" />\n </Button>\n </DropdownMenuTrigger>\n </TooltipTrigger>\n <TooltipContent>{t('compactView.returnToConference')}</TooltipContent>\n </Tooltip>\n <DropdownMenuContent side=\"top\" align=\"end\" className=\"z-1000 min-w-[200px]\">\n <DropdownMenuLabel className=\"text-text-secondary text-sm\">\n {t('compactView.returnMenuLabel')}\n </DropdownMenuLabel>\n <DropdownMenuItem\n onClick={() => onMaximize(false)}\n className=\"text-text-primary cursor-pointer text-sm\"\n >\n {t('compactView.returnOnlyMe')}\n </DropdownMenuItem>\n <DropdownMenuItem\n onClick={() => onMaximize(true)}\n className=\"text-text-primary cursor-pointer text-sm\"\n >\n {t('compactView.returnEveryone')}\n </DropdownMenuItem>\n </DropdownMenuContent>\n </DropdownMenu>\n ) : (\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n size=\"icon\"\n variant=\"none\"\n onClick={() => onMaximize(false)}\n className=\"hover:bg-background-page text-text-primary relative m-0 h-8 w-8 rounded-xl p-0\"\n >\n <Maximize className=\"fill-icon-primary\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{t('compactView.returnToConference')}</TooltipContent>\n </Tooltip>\n ))}\n <DisconnectButton className=\"h-[32px] w-[32px] rounded-xl\" />\n </div>\n </div>\n );\n}\n","import { useCallback, useEffect, useMemo, useState } from 'react';\nimport { useDraggable } from '@dnd-kit/core';\nimport { CSS } from '@dnd-kit/utilities';\nimport {\n useLocalParticipant,\n usePersistentUserChoices,\n useTrackToggle,\n} from '@livekit/components-react';\nimport { LocalAudioTrack, LocalVideoTrack, Track } from 'livekit-client';\nimport { useCallStore, type CompactViewModeT } from '@xipkg/calls-store';\nimport { useClassroomPins, useDeviceMenuGroups } from '@xipkg/calls-hooks';\nimport { useCompactAvailableHeight, useCompactNavigation } from '../hooks';\nimport { useVideoBlur, useSyncModeToOthers } from '@xipkg/calls-hooks';\nimport { useRoom, useCalls, useCallsNavigation } from '@xipkg/calls-providers';\nimport { usePiP } from '../providers';\nimport { usePhoneLayout } from '@xipkg/calls-utils';\nimport { CompactCallVideoArea } from './CompactCallVideoArea';\nimport { CompactCallBottomBar } from './CompactCallBottomBar';\nimport {\n COMPACT_BOTTOM_BAR_PX,\n COMPACT_PANEL_WIDTH_PX,\n COMPACT_VIDEO_AREA_MARGIN_PX,\n EXPANDED_VIDEO_PADDING_VERTICAL_PX,\n TILE_GAP_PX,\n TILE_HEIGHT_16_9_PX,\n getNextCompactViewMode,\n} from '../constants';\n\nexport const CompactCall = ({\n saveUserChoices = true,\n withOutShadows = false,\n freeDrag = false,\n stageFrame = null,\n}: {\n saveUserChoices?: boolean;\n withOutShadows?: boolean;\n /** Панель тащится целиком в любую точку, в том числе на телефоне */\n freeDrag?: boolean;\n /**\n * Поверх демонстрации. lockCompactModes — только портрет:\n * в альбоме оставляем 16:9 и переключение на «только звук».\n */\n stageFrame?: { width: number; tileHeight: number; lockCompactModes?: boolean } | null;\n}) => {\n const isMobile = usePhoneLayout();\n const lockCompactModes = stageFrame?.lockCompactModes === true;\n const { attributes, listeners, setNodeRef, transform } = useDraggable({\n id: freeDrag ? 'screen-share-stage-compact' : 'draggable-call',\n disabled: freeDrag ? false : isMobile,\n });\n const style =\n !freeDrag && isMobile ? undefined : { transform: CSS.Translate.toString(transform) };\n\n const { saveAudioInputEnabled, saveVideoInputEnabled } = usePersistentUserChoices({\n preventSave: !saveUserChoices,\n });\n const { isMicrophoneEnabled, isCameraEnabled, microphoneTrack, cameraTrack } =\n useLocalParticipant();\n const videoTrack = cameraTrack?.track as LocalVideoTrack | undefined;\n\n const mode = useCallStore((state) => state.mode);\n useVideoBlur(mode === 'compact' ? videoTrack : null);\n\n const microphoneToggle = useTrackToggle({\n source: Track.Source.Microphone,\n onChange: (enabled: boolean, isUserInitiated: boolean) => {\n if (isUserInitiated) saveAudioInputEnabled(enabled);\n },\n });\n const cameraToggle = useTrackToggle({\n source: Track.Source.Camera,\n onChange: (enabled: boolean, isUserInitiated: boolean) => {\n if (isUserInitiated) saveVideoInputEnabled(enabled);\n },\n });\n\n const handleMicrophoneToggle = useCallback(\n (enabled: boolean) => microphoneToggle.toggle(enabled),\n [microphoneToggle],\n );\n const handleCameraToggle = useCallback(\n (enabled: boolean) => cameraToggle.toggle(enabled),\n [cameraToggle],\n );\n\n const { microphoneGroups, cameraGroups } = useDeviceMenuGroups();\n\n const compactNavigation = useCompactNavigation();\n const {\n currentParticipant,\n participants,\n currentIndex,\n totalParticipants,\n canGoNext,\n canGoPrev,\n goToNext,\n goToPrev,\n } = compactNavigation;\n const callsNavigation = useCallsNavigation();\n const pip = usePiP();\n\n const [isCollapsed, setIsCollapsed] = useState(false);\n const compactViewMode = useCallStore((state) => state.compactViewMode);\n const updateStore = useCallStore((state) => state.updateStore);\n const setCompactViewMode = useCallback(\n (mode: CompactViewModeT) => updateStore('compactViewMode', mode),\n [updateStore],\n );\n const [multiScrollIndex, setMultiScrollIndex] = useState(0);\n\n const currentAudioTrack = currentParticipant?.participant?.getTrackPublication(\n Track.Source.Microphone,\n )?.track as\n | import('livekit-client').RemoteAudioTrack\n | import('livekit-client').LocalAudioTrack\n | undefined;\n\n const syncModeToOthers = useSyncModeToOthers();\n const activeBoardId = useCallStore((state) => state.activeBoardId);\n const activeClassroom = useCallStore((state) => state.activeClassroom);\n const { room } = useRoom();\n const token = useCallStore((state) => state.token);\n\n const { data: user } = useCalls().auth.useCurrentUser();\n\n const isTutor = user?.default_layout === 'tutor';\n const isBoardPage = callsNavigation.pathnameIncludes('/board');\n const isOnBoardPage =\n callsNavigation.params.classroomId === activeClassroom &&\n callsNavigation.params.boardId === activeBoardId;\n const showBackToBoardButton =\n mode === 'compact' && !!activeBoardId && !!activeClassroom && !isOnBoardPage;\n\n const availableHeight = useCompactAvailableHeight(isBoardPage);\n\n const multiViewLayout = useMemo(() => {\n const heightForTiles = Math.max(\n 0,\n availableHeight -\n COMPACT_BOTTOM_BAR_PX -\n EXPANDED_VIDEO_PADDING_VERTICAL_PX -\n COMPACT_VIDEO_AREA_MARGIN_PX,\n );\n // Плитки имеют aspect-video (16:9), их высота фиксирована шириной контейнера\n const visibleCount = Math.min(\n totalParticipants,\n Math.max(1, Math.floor((heightForTiles + TILE_GAP_PX) / (TILE_HEIGHT_16_9_PX + TILE_GAP_PX))),\n );\n return { visibleCount, tileHeightPx: TILE_HEIGHT_16_9_PX };\n }, [availableHeight, totalParticipants]);\n\n const { visibleCount: multiVisibleCount, tileHeightPx: multiTileHeightPx } = multiViewLayout;\n const multiCanPrev = multiScrollIndex > 0;\n const multiCanNext = multiScrollIndex + multiVisibleCount < totalParticipants;\n const multiVisibleParticipants = participants.slice(\n multiScrollIndex,\n multiScrollIndex + multiVisibleCount,\n );\n\n useEffect(() => {\n if (multiScrollIndex + multiVisibleCount > totalParticipants && totalParticipants > 0) {\n setMultiScrollIndex(Math.max(0, totalParticipants - multiVisibleCount));\n }\n }, [totalParticipants, multiVisibleCount, multiScrollIndex]);\n\n const { pins } = useClassroomPins();\n\n useEffect(() => {\n if (pins.length > 0) {\n setMultiScrollIndex(0);\n }\n }, [pins.map((pin) => `${pin.userId}:${pin.source}`).join(',')]);\n\n const handleBackToBoard = useCallback(() => {\n if (!activeBoardId || !activeClassroom) return;\n callsNavigation.navigateToClassroomBoard(activeClassroom, activeBoardId);\n }, [activeBoardId, activeClassroom, callsNavigation]);\n\n const handleMaximize = useCallback(\n (syncToAll: boolean = false) => {\n pip?.closePiP();\n if (!room || !token || room.state !== 'connected') return;\n const callParam = callsNavigation.search.call;\n const targetCallId =\n (typeof callParam === 'string' ? callParam.replace(/^\"|\"$/g, '').trim() : '') ||\n activeClassroom ||\n callsNavigation.params.classroomId ||\n callsNavigation.getCallId() ||\n '';\n if (syncToAll && isTutor && activeBoardId && targetCallId) {\n updateStore('localFullView', false);\n updateStore('mode', 'full');\n updateStore('activeBoardId', undefined);\n updateStore('activeClassroom', undefined);\n syncModeToOthers('full', undefined, targetCallId);\n } else {\n updateStore('localFullView', true);\n updateStore('mode', 'full');\n }\n if (targetCallId) {\n callsNavigation.navigateToCall(targetCallId, { replace: true });\n }\n },\n [\n room,\n token,\n callsNavigation,\n activeClassroom,\n isTutor,\n activeBoardId,\n updateStore,\n syncModeToOthers,\n pip,\n ],\n );\n\n return (\n <div\n ref={setNodeRef}\n {...(freeDrag ? listeners : {})}\n style={{\n ...style,\n ...(isMobile && !freeDrag\n ? {}\n : {\n width: stageFrame?.width ?? COMPACT_PANEL_WIDTH_PX,\n touchAction: 'none' as const,\n maxWidth: '100%',\n }),\n }}\n className={`compact-call-container flex flex-col ${\n isMobile && !freeDrag ? 'w-full' : 'touch-none [&_video]:touch-none'\n } ${freeDrag ? 'cursor-grab active:cursor-grabbing' : ''}`}\n >\n <CompactCallVideoArea\n isCollapsed={isCollapsed}\n onCollapsedChange={setIsCollapsed}\n withOutShadows={withOutShadows}\n dragAttributes={freeDrag ? undefined : (attributes as object)}\n dragListeners={freeDrag ? undefined : (listeners as object)}\n compactViewMode={lockCompactModes ? 'basic' : compactViewMode}\n tileWidth={stageFrame?.width}\n tileHeight={stageFrame?.tileHeight}\n isMobile={stageFrame ? false : isMobile}\n currentParticipant={currentParticipant}\n currentAudioTrack={currentAudioTrack ?? null}\n totalParticipants={totalParticipants}\n canGoPrev={canGoPrev}\n canGoNext={canGoNext}\n onPrev={goToPrev}\n onNext={goToNext}\n currentIndex={currentIndex}\n multiVisibleParticipants={multiVisibleParticipants}\n multiTileHeightPx={multiTileHeightPx}\n multiCanPrev={multiCanPrev}\n multiCanNext={multiCanNext}\n onMultiPrev={() => setMultiScrollIndex((i) => Math.max(0, i - 1))}\n onMultiNext={() =>\n setMultiScrollIndex((i) => Math.min(totalParticipants - multiVisibleCount, i + 1))\n }\n onAudioExpand={() => setCompactViewMode('basic')}\n />\n <CompactCallBottomBar\n withOutShadows={withOutShadows}\n devices={{\n microTrack: microphoneTrack?.track as LocalAudioTrack,\n microEnabled: isMicrophoneEnabled,\n microTrackToggle: {\n showIcon: true,\n source: Track.Source.Microphone,\n onChange: handleMicrophoneToggle,\n deviceGroups: microphoneGroups,\n },\n videoTrack: cameraTrack?.track as unknown as LocalVideoTrack,\n videoEnabled: isCameraEnabled,\n videoTrackToggle: {\n showIcon: true,\n source: Track.Source.Camera,\n onChange: handleCameraToggle,\n deviceGroups: cameraGroups,\n },\n }}\n isMobile={lockCompactModes || (isMobile && stageFrame == null)}\n stageCompact={lockCompactModes}\n compactViewMode={compactViewMode}\n onViewModeToggle={() => setCompactViewMode(getNextCompactViewMode(compactViewMode))}\n showBackToBoardButton={!!showBackToBoardButton}\n onBackToBoard={handleBackToBoard}\n onMaximize={handleMaximize}\n isTutor={!!isTutor}\n />\n </div>\n );\n};\n","export type StageInsets = {\n top: number;\n right: number;\n bottom: number;\n left: number;\n};\n\nexport type StageFrame = {\n /** Узкий экран или низкий (телефон в портрете и в альбомной ориентации) */\n handheld: boolean;\n landscape: boolean;\n /** В портрете прячем переключение вида и ограничиваем высоту плитки */\n lockCompactModes: boolean;\n width: number;\n tileHeight: number;\n insets: StageInsets;\n};\n\nconst EDGE_PX = 12;\n/** Плитка + отступ mb-2 + нижняя панель */\nconst CONTROLS_PX = 48;\n\nconst EMPTY_INSETS: StageInsets = { top: 0, right: 0, bottom: 0, left: 0 };\n\nfunction viewportBox() {\n const viewport = window.visualViewport;\n return {\n width: viewport?.width ?? window.innerWidth,\n height: viewport?.height ?? window.innerHeight,\n offsetLeft: viewport?.offsetLeft ?? 0,\n offsetTop: viewport?.offsetTop ?? 0,\n };\n}\n\nexport function readSafeInsets(): StageInsets {\n if (typeof document === 'undefined') return EMPTY_INSETS;\n const probe = document.createElement('div');\n probe.style.cssText =\n 'position:fixed;visibility:hidden;pointer-events:none;padding:env(safe-area-inset-top) env(safe-area-inset-right) env(safe-area-inset-bottom) env(safe-area-inset-left)';\n document.body.appendChild(probe);\n const style = getComputedStyle(probe);\n const insets = {\n top: Number.parseFloat(style.paddingTop) || 0,\n right: Number.parseFloat(style.paddingRight) || 0,\n bottom: Number.parseFloat(style.paddingBottom) || 0,\n left: Number.parseFloat(style.paddingLeft) || 0,\n };\n probe.remove();\n return insets;\n}\n\nexport function computeStageFrame(): StageFrame {\n const box = viewportBox();\n const insets = readSafeInsets();\n const landscape = box.width > box.height;\n const handheld = box.width <= 720 || box.height <= 500;\n\n if (!handheld) {\n const width = 400;\n return {\n handheld: false,\n landscape,\n lockCompactModes: false,\n width,\n tileHeight: Math.round((width * 9) / 16),\n insets,\n };\n }\n\n const maxWidth = Math.max(220, box.width - insets.left - insets.right - EDGE_PX * 2);\n const width = Math.min(400, maxWidth);\n const naturalTile = Math.round((width * 9) / 16);\n // В альбоме оставляем честные 16:9. Сжимаем плитку только в портрете, чтобы панель не закрывала демонстрацию.\n const maxPanel = box.height * 0.36;\n const tileHeight = landscape\n ? naturalTile\n : Math.max(84, Math.min(naturalTile, Math.floor(maxPanel - CONTROLS_PX)));\n\n return { handheld: true, landscape, lockCompactModes: !landscape, width, tileHeight, insets };\n}\n\nexport function sameStageFrame(left: StageFrame, right: StageFrame) {\n return (\n left.handheld === right.handheld &&\n left.landscape === right.landscape &&\n left.lockCompactModes === right.lockCompactModes &&\n left.width === right.width &&\n left.tileHeight === right.tileHeight &&\n left.insets.top === right.insets.top &&\n left.insets.right === right.insets.right &&\n left.insets.bottom === right.insets.bottom &&\n left.insets.left === right.insets.left\n );\n}\n\nexport function clampStagePosition(\n x: number,\n y: number,\n width: number,\n height: number,\n insets: StageInsets,\n) {\n const box = viewportBox();\n const minX = box.offsetLeft + insets.left + 8;\n const minY = box.offsetTop + insets.top + 8;\n const maxX = Math.max(minX, box.offsetLeft + box.width - insets.right - width - 8);\n const maxY = Math.max(minY, box.offsetTop + box.height - insets.bottom - height - 8);\n return {\n x: Math.min(Math.max(minX, x), maxX),\n y: Math.min(Math.max(minY, y), maxY),\n };\n}\n\n/** Портрет — по центру снизу, альбом — слева снизу, чтобы демонстрация оставалась видна. */\nexport function defaultStagePosition(frame: StageFrame) {\n const box = viewportBox();\n const panelHeight = frame.tileHeight + CONTROLS_PX + 8;\n if (!frame.handheld) {\n return clampStagePosition(\n EDGE_PX + frame.insets.left,\n EDGE_PX + frame.insets.top,\n frame.width,\n panelHeight,\n frame.insets,\n );\n }\n const y = box.offsetTop + box.height - frame.insets.bottom - EDGE_PX - panelHeight;\n const x = frame.landscape\n ? box.offsetLeft + frame.insets.left + EDGE_PX\n : box.offsetLeft + (box.width - frame.width) / 2;\n return clampStagePosition(x, y, frame.width, panelHeight, frame.insets);\n}\n\nexport function stagePanelHeight(frame: StageFrame) {\n return frame.tileHeight + CONTROLS_PX + 8;\n}\n","import { useEffect, useLayoutEffect, useRef, useState } from 'react';\nimport { createPortal } from 'react-dom';\nimport { DndContext, type DragEndEvent, useSensor, useSensors } from '@dnd-kit/core';\nimport { restrictToWindowEdges } from '@dnd-kit/modifiers';\nimport { ScreenShareIcon, useTracks } from '@livekit/components-react';\nimport { RemoteTrackPublication, Track } from 'livekit-client';\nimport { useTranslation } from 'react-i18next';\nimport {\n ParticipantPinToggle,\n ScreenShareStageToggle,\n ScreenShareZoom,\n VideoTrack,\n} from '@xipkg/calls-ui';\nimport { useCallStore } from '@xipkg/calls-store';\nimport { Chat } from '@xipkg/calls-chat';\nimport { usePiP } from '../providers';\nimport { CompactCall } from './CompactCall';\nimport { CompactPointerSensor, CompactTouchSensor } from './compactDragSensors';\nimport {\n clampStagePosition,\n computeStageFrame,\n defaultStagePosition,\n sameStageFrame,\n stagePanelHeight,\n type StageFrame,\n} from './stageLayout';\n\nconst STAGE_GONE_MS = 500;\n\nfunction initialStageFrame(): StageFrame {\n if (typeof window === 'undefined') {\n return {\n handheld: false,\n landscape: false,\n lockCompactModes: false,\n width: 400,\n tileHeight: 225,\n insets: { top: 0, right: 0, bottom: 0, left: 0 },\n };\n }\n return computeStageFrame();\n}\n\ntype ScreenShareStagePropsT = {\n identity: string;\n};\n\nexport const ScreenShareStage = ({ identity }: ScreenShareStagePropsT) => {\n const { t } = useTranslation('calls');\n const updateStore = useCallStore((state) => state.updateStore);\n const closePiP = usePiP()?.closePiP;\n const overlayRef = useRef<HTMLDivElement>(null);\n const panelRef = useRef<HTMLDivElement>(null);\n const movedRef = useRef(false);\n const landscapeRef = useRef<boolean | null>(null);\n const [frame, setFrame] = useState(initialStageFrame);\n const [position, setPosition] = useState(() => defaultStagePosition(initialStageFrame()));\n\n const tracks = useTracks([{ source: Track.Source.ScreenShare, withPlaceholder: false }], {\n onlySubscribed: false,\n });\n const track = tracks.find((item) => item.participant.identity === identity) ?? null;\n const publication = track?.publication;\n const hasTrack = Boolean(publication);\n\n const sensors = useSensors(\n useSensor(CompactPointerSensor, { activationConstraint: { distance: 8 } }),\n useSensor(CompactTouchSensor, { activationConstraint: { distance: 8 } }),\n );\n\n useEffect(() => {\n closePiP?.();\n }, [closePiP]);\n\n useEffect(() => {\n if (!(publication instanceof RemoteTrackPublication) || publication.isSubscribed) return;\n publication.setSubscribed(true);\n }, [publication]);\n\n useEffect(() => {\n if (hasTrack) return undefined;\n const timeoutId = window.setTimeout(() => {\n if (useCallStore.getState().screenShareStageIdentity === identity) {\n useCallStore.getState().updateStore('screenShareStageIdentity', null);\n }\n }, STAGE_GONE_MS);\n return () => window.clearTimeout(timeoutId);\n }, [hasTrack, identity]);\n\n useEffect(() => {\n const onKeyDown = (event: KeyboardEvent) => {\n if (event.key !== 'Escape' || event.defaultPrevented) return;\n event.preventDefault();\n updateStore('screenShareStageIdentity', null);\n };\n window.addEventListener('keydown', onKeyDown);\n return () => window.removeEventListener('keydown', onKeyDown);\n }, [updateStore]);\n\n useEffect(() => {\n const portalNode = overlayRef.current;\n if (!portalNode) return undefined;\n\n const hidden: HTMLElement[] = [];\n Array.from(document.body.children).forEach((node) => {\n if (!(node instanceof HTMLElement)) return;\n if (node === portalNode || node.contains(portalNode)) return;\n if (node.hasAttribute('data-sonner-toaster')) return;\n if (node.hasAttribute('inert')) return;\n node.setAttribute('inert', '');\n hidden.push(node);\n });\n\n const { body, documentElement } = document;\n const previousBodyOverflow = body.style.overflow;\n const previousHtmlOverflow = documentElement.style.overflow;\n body.style.overflow = 'hidden';\n documentElement.style.overflow = 'hidden';\n portalNode?.focus();\n\n return () => {\n hidden.forEach((node) => node.removeAttribute('inert'));\n body.style.overflow = previousBodyOverflow;\n documentElement.style.overflow = previousHtmlOverflow;\n };\n }, []);\n\n useLayoutEffect(() => {\n const sync = () => {\n const next = computeStageFrame();\n setFrame((prev) => (sameStageFrame(prev, next) ? prev : next));\n const flipped = landscapeRef.current !== null && landscapeRef.current !== next.landscape;\n landscapeRef.current = next.landscape;\n if (flipped) movedRef.current = false;\n\n setPosition((prev) => {\n if (!movedRef.current) {\n const placed = defaultStagePosition(next);\n if (placed.x === prev.x && placed.y === prev.y) return prev;\n return placed;\n }\n const node = panelRef.current;\n const clamped = clampStagePosition(\n prev.x,\n prev.y,\n node?.offsetWidth ?? next.width,\n node?.offsetHeight ?? stagePanelHeight(next),\n next.insets,\n );\n if (clamped.x === prev.x && clamped.y === prev.y) return prev;\n return clamped;\n });\n };\n\n sync();\n const viewport = window.visualViewport;\n window.addEventListener('resize', sync);\n window.addEventListener('orientationchange', sync);\n viewport?.addEventListener('resize', sync);\n viewport?.addEventListener('scroll', sync);\n const node = panelRef.current;\n const observer = new ResizeObserver(sync);\n if (node) observer.observe(node);\n return () => {\n window.removeEventListener('resize', sync);\n window.removeEventListener('orientationchange', sync);\n viewport?.removeEventListener('resize', sync);\n viewport?.removeEventListener('scroll', sync);\n observer.disconnect();\n };\n }, []);\n\n const handleDragEnd = (event: DragEndEvent) => {\n movedRef.current = true;\n const node = panelRef.current;\n const current = computeStageFrame();\n setPosition((prev) => {\n const next = clampStagePosition(\n prev.x + event.delta.x,\n prev.y + event.delta.y,\n node?.offsetWidth ?? current.width,\n node?.offsetHeight ?? stagePanelHeight(current),\n current.insets,\n );\n if (next.x === prev.x && next.y === prev.y) return prev;\n return next;\n });\n };\n\n if (typeof document === 'undefined') return null;\n\n const sharerName = track?.participant.name;\n\n return createPortal(\n <div\n ref={overlayRef}\n role=\"dialog\"\n aria-modal=\"true\"\n aria-label={t('participant.stageTitle')}\n tabIndex={-1}\n className=\"screen-share-stage fixed inset-0 z-[2100] bg-black outline-none\"\n >\n <div className=\"relative h-full w-full\">\n {track && publication ? (\n frame.handheld ? (\n <div className=\"absolute inset-0 flex items-center justify-center bg-black\">\n <VideoTrack\n trackRef={track}\n manageSubscription={false}\n className=\"h-full w-full bg-black object-contain\"\n />\n </div>\n ) : (\n <ScreenShareZoom trackRef={track} className=\"rounded-none\">\n <VideoTrack\n trackRef={track}\n manageSubscription={false}\n className=\"h-full w-full bg-black object-contain\"\n />\n </ScreenShareZoom>\n )\n ) : null}\n {track ? (\n <div\n className=\"bg-background-surface/80 pointer-events-none absolute z-20 flex h-6 max-w-[calc(100%-96px)] items-center gap-1.5 rounded-lg px-1.5 py-1 backdrop-blur\"\n style={\n frame.handheld\n ? {\n top: 'max(12px, env(safe-area-inset-top))',\n left: 'max(12px, env(safe-area-inset-left))',\n }\n : {\n bottom: 'max(16px, env(safe-area-inset-bottom))',\n left: 'max(16px, env(safe-area-inset-left))',\n }\n }\n >\n <ScreenShareIcon style={{ marginRight: '0.25rem' }} />\n <span className=\"text-xs-base-size text-text-primary truncate leading-[16px]\">\n {t('participant.screenSharePrefix')}\n {sharerName ? <> {sharerName}</> : null}\n </span>\n </div>\n ) : null}\n <div\n className=\"absolute z-40 flex items-center gap-1\"\n style={{\n top: 'max(12px, env(safe-area-inset-top))',\n right: 'max(12px, env(safe-area-inset-right))',\n }}\n >\n <ScreenShareStageToggle trackRef={track ?? undefined} inline />\n {track ? <ParticipantPinToggle trackRef={track} inline /> : null}\n </div>\n </div>\n\n <DndContext\n sensors={sensors}\n onDragEnd={handleDragEnd}\n modifiers={[restrictToWindowEdges]}\n autoScroll={false}\n >\n <div\n ref={panelRef}\n className=\"absolute z-30 w-max\"\n style={{ left: position.x, top: position.y }}\n >\n <CompactCall\n freeDrag\n stageFrame={\n frame.handheld\n ? {\n width: frame.width,\n tileHeight: frame.tileHeight,\n lockCompactModes: frame.lockCompactModes,\n }\n : null\n }\n />\n </div>\n </DndContext>\n\n <Chat\n forceSheet={frame.handheld}\n compactPositionStyle={\n frame.handheld ? undefined : { top: 56, right: 16, bottom: 16, zIndex: 20 }\n }\n />\n </div>,\n document.body,\n );\n};\n","import { FC, useEffect, useRef, useState, type CSSProperties } from 'react';\nimport {\n DndContext,\n DragEndEvent,\n useSensor,\n useSensors,\n useDroppable,\n DragOverlay,\n useDndMonitor,\n} from '@dnd-kit/core';\nimport { CompactPointerSensor, CompactTouchSensor } from './compactDragSensors';\nimport { useCallsNavigation } from '@xipkg/calls-providers';\nimport { restrictToWindowEdges } from '@dnd-kit/modifiers';\nimport { CompactCall } from './CompactCall';\nimport { Chat, useChatStore } from '@xipkg/calls-chat';\nimport { PermissionsDialog } from '@xipkg/calls-ui';\nimport { useCallStore } from '@xipkg/calls-store';\nimport type { CornerT } from '@xipkg/calls-store';\nimport { usePhoneLayout } from '@xipkg/calls-utils';\nimport { useRoom } from '@xipkg/calls-providers';\nimport { PiPProvider, usePiP } from '../providers';\nimport { useParticipantSounds, useParticipantJoinSync } from '@xipkg/calls-hooks';\nimport { COMPACT_MOBILE_CONTENT_GAP_PX, COMPACT_MOBILE_OVERLAY_FALLBACK_PX } from '../constants';\nimport { chatPositionStyle, cornerStyle, useBoardChromeInsets } from '../boardChromeInsets';\nimport { ScreenShareStage } from './ScreenShareStage';\n\ntype CompactViewPropsT = {\n children: React.ReactNode;\n};\n\nconst useCompactDragActive = () => {\n const [isDragging, setIsDragging] = useState(false);\n\n useDndMonitor({\n onDragStart: () => {\n setIsDragging(true);\n },\n onDragEnd: () => {\n setIsDragging(false);\n },\n // На планшете жест часто отменяется (pointercancel / resize), а не завершается.\n // Без этого бирюзовые зоны остаются, хотя перенос уже мёртв.\n onDragCancel: () => {\n setIsDragging(false);\n },\n });\n\n return isDragging;\n};\n\nconst DroppableCorner = ({ id, style }: { id: string; style: CSSProperties }) => {\n const { setNodeRef } = useDroppable({\n id,\n });\n const isDragging = useCompactDragActive();\n\n return (\n <div\n ref={setNodeRef}\n style={style}\n className={`pointer-events-none absolute z-20 size-1/3 transition-all duration-200 ${\n isDragging ? 'bg-status-info-background/20 ring-border-selected rounded-lg ring-2' : ''\n }`}\n />\n );\n};\n\nconst DroppableAreas: FC<{ insets: ReturnType<typeof useBoardChromeInsets> }> = ({ insets }) => {\n const isDragging = useCompactDragActive();\n\n return (\n <>\n <DroppableCorner id=\"top-left\" style={cornerStyle('top-left', insets)} />\n <DroppableCorner id=\"top-right\" style={cornerStyle('top-right', insets)} />\n <DroppableCorner id=\"bottom-left\" style={cornerStyle('bottom-left', insets)} />\n <DroppableCorner id=\"bottom-right\" style={cornerStyle('bottom-right', insets)} />\n {/* Превью не должно перехватывать касание: на планшете слой под пальцем отменяет жест. */}\n <DragOverlay style={{ pointerEvents: 'none' }}>\n {isDragging ? <CompactCall /> : null}\n </DragOverlay>\n </>\n );\n};\n\ntype CompactPropsT = CompactViewPropsT & {\n /** При true не рендерить оверлей (звонок, чат, углы). Используется при PiP, чтобы children не размонтировались. */\n hideOverlay?: boolean;\n};\n\nexport const Compact: FC<CompactPropsT> = ({ children, hideOverlay = false }) => {\n const navigation = useCallsNavigation();\n const { activeCorner, updateStore } = useCallStore();\n const isMobile = usePhoneLayout();\n const headerRef = useRef<HTMLDivElement>(null);\n const [headerHeight, setHeaderHeight] = useState(0);\n\n useEffect(() => {\n if (!isMobile || hideOverlay || !headerRef.current) return;\n const el = headerRef.current;\n const observer = new ResizeObserver((entries) => {\n const entry = entries[0];\n if (entry) setHeaderHeight(entry.contentRect.height);\n });\n observer.observe(el);\n setHeaderHeight(el.getBoundingClientRect().height);\n return () => observer.disconnect();\n }, [isMobile, hideOverlay]);\n\n const sensors = useSensors(\n useSensor(CompactPointerSensor, {\n activationConstraint: {\n distance: 8,\n },\n }),\n useSensor(CompactTouchSensor, {\n activationConstraint: {\n distance: 8,\n },\n }),\n );\n\n const handleDragEnd = (event: DragEndEvent) => {\n const { over } = event;\n if (over) {\n updateStore('activeCorner', over.id as CornerT);\n }\n };\n\n const isBoardPage = navigation.pathnameIncludes('/board');\n const insets = useBoardChromeInsets(isBoardPage);\n\n const mobileContentMarginTop =\n hideOverlay || !isMobile\n ? 0\n : (headerHeight > 0 ? headerHeight : COMPACT_MOBILE_OVERLAY_FALLBACK_PX) +\n COMPACT_MOBILE_CONTENT_GAP_PX;\n\n const container = (\n <div className={`relative flex h-dvh flex-col bg-transparent`} data-board-chrome-aware=\"\">\n {isMobile ? (\n <>\n {!hideOverlay && (\n <div ref={headerRef} className=\"fixed top-2 right-0 left-0 z-10 w-full px-2\">\n <CompactCall withOutShadows />\n </div>\n )}\n <div\n className=\"flex min-h-0 flex-1 flex-col\"\n style={{ marginTop: mobileContentMarginTop }}\n >\n {children}\n </div>\n </>\n ) : (\n <>\n {!hideOverlay && (\n <>\n <DroppableAreas insets={insets} />\n <Chat compactPositionStyle={chatPositionStyle(activeCorner, insets)} />\n <div\n className=\"absolute z-20 transition-all duration-500 ease-out\"\n style={cornerStyle(activeCorner, insets)}\n >\n <CompactCall />\n </div>\n </>\n )}\n {children}\n </>\n )}\n </div>\n );\n\n // Всегда один и тот же корень (DndContext), иначе при hideOverlay React размонтирует\n // container и всё дерево доски (YjsProvider пересоздаётся → белый экран).\n return (\n <DndContext sensors={sensors} onDragEnd={handleDragEnd} modifiers={[restrictToWindowEdges]}>\n {container}\n </DndContext>\n );\n};\n\nconst CompactViewInner = ({ children }: CompactViewPropsT) => {\n const { mode, token } = useCallStore();\n const screenShareStageIdentity = useCallStore((state) => state.screenShareStageIdentity);\n const isStarted = useCallStore((state) => state.isStarted);\n const { room } = useRoom();\n const pip = usePiP();\n const isPiPActive = !!pip?.isPiPActive;\n\n // Синхронизация состояния при подключении новых участников (работает и в compact mode)\n useParticipantJoinSync();\n useParticipantSounds();\n\n useEffect(() => {\n if (!screenShareStageIdentity) return;\n if (!room || !token || !isStarted) {\n useCallStore.getState().updateStore('screenShareStageIdentity', null);\n }\n }, [isStarted, room, screenShareStageIdentity, token]);\n\n const navigation = useCallsNavigation();\n const { updateStore: updateChatStore } = useChatStore();\n\n useEffect(() => {\n const { activeClassroom } = useCallStore.getState();\n const isOnBoardPage = navigation.pathnameIncludes('/board');\n\n if ((!room || !token) && navigation.search.call && !isOnBoardPage && !activeClassroom) {\n navigation.clearCallSearchParam();\n\n // Очищаем все состояния интерфейса при отключении\n const { clearAllRaisedHands, updateStore: updateCallStore } = useCallStore.getState();\n // Очищаем поднятые руки\n clearAllRaisedHands();\n\n // Очищаем чат\n updateChatStore('isChatOpen', false);\n updateChatStore('chatMessages', []);\n updateChatStore('unreadMessagesCount', 0);\n\n // Очищаем информацию о доске при отключении\n updateCallStore('activeBoardId', undefined);\n updateCallStore('activeClassroom', undefined);\n\n updateCallStore('mode', 'full');\n }\n }, [room, token, navigation, updateChatStore]);\n\n const contentWrapper = (\n <div className=\"flex h-full min-h-0 flex-col\">\n <div className=\"min-h-0 flex-1\">{children}</div>\n </div>\n );\n\n if (!room || !token) {\n return (\n <>\n {contentWrapper}\n <PermissionsDialog />\n </>\n );\n }\n\n const stageLayer =\n screenShareStageIdentity && room && token && isStarted ? (\n <ScreenShareStage key={screenShareStageIdentity} identity={screenShareStageIdentity} />\n ) : null;\n\n if (mode === 'full') {\n return (\n <>\n {contentWrapper}\n {stageLayer}\n <PermissionsDialog />\n </>\n );\n }\n\n // Всегда один и тот же Compact — при PiP только скрываем оверлей (hideOverlay).\n return (\n <>\n <Compact hideOverlay={isPiPActive || Boolean(screenShareStageIdentity)}>{children}</Compact>\n {stageLayer}\n <PermissionsDialog />\n </>\n );\n};\n\nexport const CompactView = ({ children }: CompactViewPropsT) => (\n <PiPProvider>\n <CompactViewInner>{children}</CompactViewInner>\n </PiPProvider>\n);\n","import { useCallback, useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react';\nimport {\n useLocalParticipant,\n usePersistentUserChoices,\n useTrackToggle,\n} from '@livekit/components-react';\nimport { Track, LocalAudioTrack, LocalVideoTrack, RemoteAudioTrack } from 'livekit-client';\nimport { Account, SoundTwo, Users } from '@xipkg/icons';\nimport { Button } from '@xipkg/button';\nimport { Tooltip, TooltipContent, TooltipTrigger } from '@xipkg/tooltip';\nimport { cn } from '@xipkg/utils';\nimport { useCallStore, type CompactViewModeT } from '@xipkg/calls-store';\nimport { useClassroomPins, useDeviceMenuGroups } from '@xipkg/calls-hooks';\nimport { useTranslation } from 'react-i18next';\nimport { useCompactNavigation } from '../hooks/useCompactNavigation';\nimport {\n ParticipantTile,\n DevicesBar,\n DisconnectButton,\n LessonRecordButton,\n ScreenShareButton,\n} from '@xipkg/calls-ui';\nimport { RaiseHandButton } from '@xipkg/calls-risehand';\nimport { Chat, ChatButton, useChatStore } from '@xipkg/calls-chat';\nimport { CompactNavigationControls } from './CompactNavigationControls';\nimport { CompactMultiViewControls } from './CompactMultiViewControls';\nimport { CompactCallCollapsedBar } from './CompactCallCollapsedBar';\nimport {\n COMPACT_AUDIO_BAR_HEIGHT_PX,\n PIP_BAR_HEIGHT_PX,\n PIP_TILE_HEIGHT_16_9_PX,\n TILE_GAP_PX,\n getNextCompactViewMode,\n getPipRequiredHeightForTiles,\n getPipWindowHeight,\n getPipWindowHeightWithChat,\n PIP_DOCUMENT_WINDOW_FRAME_PX,\n} from '../constants';\n\ntype PiPCompactCallPropsT = {\n pipWindow: Window;\n resizePiPTo?: (height: number) => void;\n};\n\nexport function PiPCompactCall({ pipWindow, resizePiPTo }: PiPCompactCallPropsT) {\n const { t } = useTranslation('calls');\n const compactViewMode = useCallStore((s) => s.compactViewMode);\n const isChatOpen = useChatStore((s) => s.isChatOpen);\n const updateStore = useCallStore((s) => s.updateStore);\n const setViewMode = useCallback(\n (mode: CompactViewModeT) => updateStore('compactViewMode', mode),\n [updateStore],\n );\n const nextViewMode = getNextCompactViewMode(compactViewMode);\n const viewModeToggleMeta = {\n expanded: { Icon: Users, label: t('compactView.mode.expanded') },\n audio: { Icon: SoundTwo, label: t('compactView.mode.audio') },\n basic: { Icon: Account, label: t('compactView.mode.basic') },\n }[nextViewMode];\n const ViewModeIcon = viewModeToggleMeta.Icon;\n const [multiScrollIndex, setMultiScrollIndex] = useState(0);\n const [pipSize, setPipSize] = useState({\n width: pipWindow.innerWidth,\n height: pipWindow.innerHeight,\n });\n\n const { saveAudioInputEnabled, saveVideoInputEnabled } = usePersistentUserChoices();\n const { isMicrophoneEnabled, isCameraEnabled, microphoneTrack, cameraTrack } =\n useLocalParticipant();\n\n const microphoneToggle = useTrackToggle({\n source: Track.Source.Microphone,\n onChange: (enabled: boolean, isUserInitiated: boolean) => {\n if (isUserInitiated) saveAudioInputEnabled(enabled);\n },\n });\n const cameraToggle = useTrackToggle({\n source: Track.Source.Camera,\n onChange: (enabled: boolean, isUserInitiated: boolean) => {\n if (isUserInitiated) saveVideoInputEnabled(enabled);\n },\n });\n\n const handleMicrophoneToggle = useCallback(\n (enabled: boolean) => microphoneToggle.toggle(enabled),\n [microphoneToggle],\n );\n const handleCameraToggle = useCallback(\n (enabled: boolean) => cameraToggle.toggle(enabled),\n [cameraToggle],\n );\n\n const { microphoneGroups, cameraGroups } = useDeviceMenuGroups();\n\n const {\n currentParticipant,\n participants,\n currentIndex,\n totalParticipants,\n canGoNext,\n canGoPrev,\n goToNext,\n goToPrev,\n } = useCompactNavigation();\n\n // Размер окна PiP:\n useEffect(() => {\n const updateSize = () => {\n const { innerWidth, innerHeight, document: pipDoc } = pipWindow;\n setPipSize({ width: innerWidth, height: innerHeight });\n pipDoc.documentElement.style.height = `${innerHeight}px`;\n pipDoc.body.style.height = `${innerHeight}px`;\n };\n updateSize();\n pipWindow.addEventListener('resize', updateSize);\n return () => pipWindow.removeEventListener('resize', updateSize);\n }, [pipWindow]);\n\n // Сколько полных плиток (16:9) помещается при текущей высоте окна.\n // Плитка добавляется, только когда есть полное место; убирается сразу, как перестаёт влезать.\n // При открытом чате окно выше — не раздуваем expanded под чатом.\n const tilesCountBeforeChatRef = useRef(1);\n const multiVisibleCount = useMemo(() => {\n if (isChatOpen) return tilesCountBeforeChatRef.current;\n\n let n = 1;\n while (n < totalParticipants && getPipRequiredHeightForTiles(n + 1) <= pipSize.height) {\n n++;\n }\n tilesCountBeforeChatRef.current = n;\n return n;\n }, [pipSize.height, totalParticipants, isChatOpen]);\n\n const pipWindowHeight = useMemo(() => {\n const tileCount = compactViewMode === 'expanded' ? multiVisibleCount : 1;\n return isChatOpen\n ? getPipWindowHeightWithChat(compactViewMode, tileCount)\n : getPipWindowHeight(compactViewMode, tileCount);\n }, [compactViewMode, multiVisibleCount, isChatOpen]);\n\n const pipContentHeight = pipWindowHeight - PIP_DOCUMENT_WINDOW_FRAME_PX;\n\n useLayoutEffect(() => {\n resizePiPTo?.(pipWindowHeight);\n }, [resizePiPTo, pipWindowHeight]);\n\n useEffect(() => {\n if (pipSize.height + 2 < pipContentHeight) {\n resizePiPTo?.(pipWindowHeight);\n }\n }, [resizePiPTo, pipWindowHeight, pipContentHeight, pipSize.height]);\n\n const multiVisibleParticipants = useMemo(\n () => participants.slice(multiScrollIndex, multiScrollIndex + multiVisibleCount),\n [participants, multiScrollIndex, multiVisibleCount],\n );\n const multiCanPrev = multiScrollIndex > 0;\n const multiCanNext = multiScrollIndex + multiVisibleCount < totalParticipants;\n\n const currentAudioTrack = currentParticipant?.participant?.getTrackPublication(\n Track.Source.Microphone,\n )?.track as LocalAudioTrack | RemoteAudioTrack | undefined;\n\n useEffect(() => {\n if (multiScrollIndex + multiVisibleCount > totalParticipants && totalParticipants > 0) {\n setMultiScrollIndex(Math.max(0, totalParticipants - multiVisibleCount));\n }\n }, [totalParticipants, multiVisibleCount, multiScrollIndex]);\n\n const { pins } = useClassroomPins();\n\n useEffect(() => {\n if (pins.length > 0) {\n setMultiScrollIndex(0);\n }\n }, [pins.map((pin) => `${pin.userId}:${pin.source}`).join(',')]);\n\n const emptyState = (\n <div className=\"bg-background-subtle text-text-primary flex h-full w-full items-center justify-center rounded-2xl\">\n <span className=\"text-sm\">{t('compactView.noParticipants')}</span>\n </div>\n );\n\n const barCn = cn(\n 'bg-background-surface border-border-default flex items-center justify-center rounded-2xl border p-0.5',\n );\n\n const showAudioBar = compactViewMode === 'audio';\n const showSingleParticipant = compactViewMode === 'basic';\n /** В мульти чат заменяет плитки; в basic/audio плитка/полоса остаются. */\n const showMultiTiles = compactViewMode === 'expanded' && !isChatOpen;\n\n const gridTemplateRows = [\n showAudioBar ? `${COMPACT_AUDIO_BAR_HEIGHT_PX}px` : null,\n showSingleParticipant ? 'auto' : null,\n showMultiTiles ? 'minmax(0, 1fr)' : null,\n isChatOpen ? 'minmax(0, 1fr)' : null,\n `${PIP_BAR_HEIGHT_PX}px`,\n ]\n .filter(Boolean)\n .join(' ');\n\n const singleParticipantTile = currentParticipant ? (\n <>\n <ParticipantTile\n trackRef={currentParticipant}\n participant={currentParticipant.participant}\n className=\"h-full w-full\"\n />\n {totalParticipants > 1 && (\n <CompactNavigationControls\n canPrev={canGoPrev}\n canNext={canGoNext}\n onPrev={goToPrev}\n onNext={goToNext}\n currentIndex={currentIndex}\n totalParticipants={totalParticipants}\n />\n )}\n </>\n ) : (\n emptyState\n );\n\n return (\n <div\n className=\"compact-call-container bg-background-page grid min-h-0 gap-1 overflow-hidden p-1\"\n style={{ height: pipSize.height, gridTemplateRows }}\n >\n {showAudioBar && (\n <CompactCallCollapsedBar\n participant={currentParticipant?.participant ?? null}\n audioTrack={currentAudioTrack ?? null}\n onExpand={() => setViewMode('basic')}\n className=\"h-full min-h-0 w-full shadow-none\"\n />\n )}\n\n {showSingleParticipant && (\n <div className=\"group relative aspect-video w-full overflow-hidden rounded-2xl\">\n {singleParticipantTile}\n </div>\n )}\n\n {showMultiTiles && (\n <div className=\"group relative min-h-0 overflow-hidden rounded-2xl\">\n <div\n className=\"relative flex h-full flex-col justify-start overflow-hidden rounded-2xl p-0.5\"\n style={{ gap: TILE_GAP_PX }}\n >\n {multiVisibleParticipants.length === 0\n ? emptyState\n : multiVisibleParticipants.map((trackRef) => (\n <div\n key={`${trackRef.participant.identity}-${trackRef.source}`}\n className=\"aspect-video w-full shrink-0 overflow-hidden rounded-xl\"\n style={{ minHeight: PIP_TILE_HEIGHT_16_9_PX }}\n >\n <ParticipantTile\n trackRef={trackRef}\n participant={trackRef.participant}\n className=\"h-full w-full [&_video]:object-cover\"\n />\n </div>\n ))}\n <CompactMultiViewControls\n canPrev={multiCanPrev}\n canNext={multiCanNext}\n onPrev={() => setMultiScrollIndex((i) => Math.max(0, i - 1))}\n onNext={() =>\n setMultiScrollIndex((i) => Math.min(totalParticipants - multiVisibleCount, i + 1))\n }\n />\n </div>\n </div>\n )}\n\n {isChatOpen && (\n <div className=\"flex min-h-0 flex-col overflow-hidden\">\n <Chat embedded />\n </div>\n )}\n\n <div className=\"flex h-12 shrink-0 items-center gap-0.5\">\n <div className={barCn}>\n <DevicesBar\n className=\"h-[28px] w-[28px]\"\n microTrack={microphoneTrack?.track as LocalAudioTrack}\n microEnabled={isMicrophoneEnabled}\n microTrackToggle={{\n showIcon: true,\n source: Track.Source.Microphone,\n onChange: handleMicrophoneToggle,\n deviceGroups: microphoneGroups,\n }}\n videoTrack={cameraTrack?.track as unknown as LocalVideoTrack}\n videoEnabled={isCameraEnabled}\n videoTrackToggle={{\n showIcon: true,\n source: Track.Source.Camera,\n onChange: handleCameraToggle,\n deviceGroups: cameraGroups,\n }}\n />\n </div>\n\n <div className={barCn}>\n <Tooltip>\n <TooltipTrigger asChild>\n <Button\n size=\"icon\"\n variant=\"none\"\n onClick={() => setViewMode(getNextCompactViewMode(compactViewMode))}\n className=\"hover:bg-background-page text-text-primary h-[28px] w-[28px] rounded-xl p-0\"\n aria-label={viewModeToggleMeta.label}\n >\n <ViewModeIcon className=\"h-6 w-6\" />\n </Button>\n </TooltipTrigger>\n <TooltipContent>{viewModeToggleMeta.label}</TooltipContent>\n </Tooltip>\n </div>\n\n <div className={cn(barCn, 'ml-auto')}>\n <LessonRecordButton className=\"h-[28px] w-[28px]\" />\n <ScreenShareButton className=\"h-[28px] w-[28px]\" />\n <ChatButton className=\"h-[28px] w-[28px] min-w-[28px] rounded-xl\" />\n <RaiseHandButton className=\"h-[28px] w-[28px]\" />\n </div>\n\n <div className={barCn}>\n <DisconnectButton className=\"h-[28px] w-[28px] rounded-xl\" />\n </div>\n </div>\n </div>\n );\n}\n"]}
|