feat: Add Picture-in-Picture floating video + fix local track visibility

- New PictureInPicture component: draggable floating window that shows
  active stream when navigating away from voice channel, with LIVE badge,
  snap-to-edge, click-to-navigate-back
- Fix VoiceUser to check actual track presence instead of boolean flags
  for video rendering
- Add LocalTrackPublished/LocalTrackUnpublished events to useLiveKit
  so local screen share and camera show immediately in VoiceGrid
- Add pipCollapsed state to uiStore
This commit is contained in:
Jannis Braun
2026-02-19 05:26:06 +01:00
parent d88c72aa62
commit 2e309bf959
10 changed files with 546 additions and 3 deletions
@@ -14,6 +14,7 @@ import { UserSettingsModal } from '../modals/UserSettings';
import { ServerSettingsModal } from '../modals/ServerSettings';
import { NewDmModal } from '../modals/NewDmModal';
import { IncomingCallModal } from '../voice/IncomingCallModal';
import { PictureInPicture } from '../voice/PictureInPicture';
import { UserProfilePopout } from '../ui/UserProfilePopout';
import { useAuth } from '../../hooks/useAuth';
import { useWebSocket } from '../../hooks/useWebSocket';
@@ -161,6 +162,7 @@ export function AppLayout() {
<NewDmModal />
<IncomingCallModal />
<ImagePreview />
<PictureInPicture />
{/* User Profile Popout */}
{userProfilePopout.user && userProfilePopout.position && (