diff --git a/web/src/components/DiffView.tsx b/web/src/components/DiffView.tsx index 04d57835..e1a897db 100644 --- a/web/src/components/DiffView.tsx +++ b/web/src/components/DiffView.tsx @@ -1,6 +1,7 @@ import { diffLines } from 'diff' import { useMemo } from 'react' import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from '@/components/ui/dialog' +import { usePointerFocusRing } from '@/hooks/usePointerFocusRing' import { cn } from '@/lib/utils' export function DiffView(props: { @@ -10,6 +11,7 @@ export function DiffView(props: { variant?: 'preview' | 'inline' }) { const variant = props.variant ?? 'preview' + const { suppressFocusRing, onTriggerPointerDown, onTriggerKeyDown, onTriggerBlur } = usePointerFocusRing() const stats = useMemo(() => { const oldChars = props.oldString.length @@ -37,7 +39,16 @@ export function DiffView(props: { return ( - diff --git a/web/src/hooks/usePointerFocusRing.ts b/web/src/hooks/usePointerFocusRing.ts new file mode 100644 index 00000000..da02b0c3 --- /dev/null +++ b/web/src/hooks/usePointerFocusRing.ts @@ -0,0 +1,24 @@ +import { useCallback, useState, type FocusEvent, type KeyboardEvent, type PointerEvent } from 'react' + +export function usePointerFocusRing() { + const [suppressFocusRing, setSuppressFocusRing] = useState(false) + + const onTriggerPointerDown = useCallback((_event: PointerEvent) => { + setSuppressFocusRing(true) + }, []) + + const onTriggerKeyDown = useCallback((_event: KeyboardEvent) => { + setSuppressFocusRing(false) + }, []) + + const onTriggerBlur = useCallback((_event: FocusEvent) => { + setSuppressFocusRing(false) + }, []) + + return { + suppressFocusRing, + onTriggerPointerDown, + onTriggerKeyDown, + onTriggerBlur + } +}