focus-trap.tsx 781 B

123456789101112131415161718192021222324252627282930313233
  1. import { useRef } from 'react'
  2. import {
  3. FocusTrap as FocusTrapReact,
  4. FocusTrapProps as FocusTrapReactProps,
  5. } from 'focus-trap-react'
  6. export type FocusTrapProps = {
  7. active: FocusTrapReactProps['active']
  8. children: React.ReactNode
  9. focusTrapOptions?: FocusTrapReactProps['focusTrapOptions']
  10. }
  11. export default function FocusTrap({
  12. active,
  13. focusTrapOptions,
  14. children,
  15. }: FocusTrapProps) {
  16. const containerRef = useRef<HTMLDivElement>(null)
  17. return (
  18. <FocusTrapReact
  19. active={active}
  20. focusTrapOptions={{
  21. ...focusTrapOptions,
  22. fallbackFocus: () => containerRef.current as HTMLElement,
  23. }}
  24. >
  25. <div ref={containerRef} className="focus-trap-container" tabIndex={-1}>
  26. {children}
  27. </div>
  28. </FocusTrapReact>
  29. )
  30. }