mirror of
https://github.com/suitenumerique/meet.git
synced 2026-09-02 05:38:02 +00:00
♿️(frontend) restore focus-visible rings inside PiP window
Sync React Aria interaction modality with PiP keyboard and mouse events.
This commit is contained in:
@@ -8,6 +8,7 @@ import { pipLayoutStore } from '../stores/pipLayoutStore'
|
|||||||
import { useEscapeDismiss } from '../hooks/useEscapeDismiss'
|
import { useEscapeDismiss } from '../hooks/useEscapeDismiss'
|
||||||
import { usePipKeyboardShortcuts } from '../hooks/usePipKeyboardShortcuts'
|
import { usePipKeyboardShortcuts } from '../hooks/usePipKeyboardShortcuts'
|
||||||
import { usePipRestoreFocus } from '../hooks/usePipRestoreFocus'
|
import { usePipRestoreFocus } from '../hooks/usePipRestoreFocus'
|
||||||
|
import { usePipFocusModality } from '../hooks/usePipFocusModality'
|
||||||
import { PipControlBar } from './PipControlBar'
|
import { PipControlBar } from './PipControlBar'
|
||||||
import { PipReactionsToolbar } from './PipReactionsToolbar'
|
import { PipReactionsToolbar } from './PipReactionsToolbar'
|
||||||
import { PipStage } from './layouts/PipStage'
|
import { PipStage } from './layouts/PipStage'
|
||||||
@@ -29,6 +30,9 @@ export const PipView = () => {
|
|||||||
// Forward keyboard shortcuts (Ctrl+D, Ctrl+E, etc.) to the main store.
|
// Forward keyboard shortcuts (Ctrl+D, Ctrl+E, etc.) to the main store.
|
||||||
usePipKeyboardShortcuts(containerRef)
|
usePipKeyboardShortcuts(containerRef)
|
||||||
|
|
||||||
|
// Sync React Aria's focus-visible modality with the PiP document.
|
||||||
|
usePipFocusModality(containerRef)
|
||||||
|
|
||||||
// Side panels open via a menu item that unmounts on click; fall back to the
|
// Side panels open via a menu item that unmounts on click; fall back to the
|
||||||
// options button so focus returns somewhere visible.
|
// options button so focus returns somewhere visible.
|
||||||
const resolveTrigger = useCallback((activeEl: HTMLElement | null) => {
|
const resolveTrigger = useCallback((activeEl: HTMLElement | null) => {
|
||||||
|
|||||||
@@ -0,0 +1,26 @@
|
|||||||
|
import { useEffect, type RefObject } from 'react'
|
||||||
|
import { setInteractionModality } from '@react-aria/interactions'
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sync React Aria's interaction modality with the PiP document.
|
||||||
|
* React Aria only installs keyboard/mouse listeners on the main document,
|
||||||
|
* so focus-visible rings never appear in PiP without this bridge.
|
||||||
|
*/
|
||||||
|
export const usePipFocusModality = (
|
||||||
|
containerRef: RefObject<HTMLElement | null>
|
||||||
|
) => {
|
||||||
|
useEffect(() => {
|
||||||
|
const doc = containerRef.current?.ownerDocument
|
||||||
|
if (!doc || doc === document) return
|
||||||
|
|
||||||
|
const onKeyDown = () => setInteractionModality('keyboard')
|
||||||
|
const onMouseDown = () => setInteractionModality('pointer')
|
||||||
|
|
||||||
|
doc.addEventListener('keydown', onKeyDown, true)
|
||||||
|
doc.addEventListener('mousedown', onMouseDown, true)
|
||||||
|
return () => {
|
||||||
|
doc.removeEventListener('keydown', onKeyDown, true)
|
||||||
|
doc.removeEventListener('mousedown', onMouseDown, true)
|
||||||
|
}
|
||||||
|
}, [containerRef])
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user