|  | @@ -1,6 +1,8 @@
 | 
	
		
			
				|  |  |  import React, { useLayoutEffect, useRef, useEffect } from "react";
 | 
	
		
			
				|  |  |  import "./Popover.scss";
 | 
	
		
			
				|  |  |  import { unstable_batchedUpdates } from "react-dom";
 | 
	
		
			
				|  |  | +import { queryFocusableElements } from "../utils";
 | 
	
		
			
				|  |  | +import { KEYS } from "../keys";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  type Props = {
 | 
	
		
			
				|  |  |    top?: number;
 | 
	
	
		
			
				|  | @@ -27,6 +29,41 @@ export const Popover = ({
 | 
	
		
			
				|  |  |  }: Props) => {
 | 
	
		
			
				|  |  |    const popoverRef = useRef<HTMLDivElement>(null);
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +  const container = popoverRef.current;
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  useEffect(() => {
 | 
	
		
			
				|  |  | +    if (!container) {
 | 
	
		
			
				|  |  | +      return;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    const handleKeyDown = (event: KeyboardEvent) => {
 | 
	
		
			
				|  |  | +      if (event.key === KEYS.TAB) {
 | 
	
		
			
				|  |  | +        const focusableElements = queryFocusableElements(container);
 | 
	
		
			
				|  |  | +        const { activeElement } = document;
 | 
	
		
			
				|  |  | +        const currentIndex = focusableElements.findIndex(
 | 
	
		
			
				|  |  | +          (element) => element === activeElement,
 | 
	
		
			
				|  |  | +        );
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +        if (currentIndex === 0 && event.shiftKey) {
 | 
	
		
			
				|  |  | +          focusableElements[focusableElements.length - 1].focus();
 | 
	
		
			
				|  |  | +          event.preventDefault();
 | 
	
		
			
				|  |  | +          event.stopImmediatePropagation();
 | 
	
		
			
				|  |  | +        } else if (
 | 
	
		
			
				|  |  | +          currentIndex === focusableElements.length - 1 &&
 | 
	
		
			
				|  |  | +          !event.shiftKey
 | 
	
		
			
				|  |  | +        ) {
 | 
	
		
			
				|  |  | +          focusableElements[0].focus();
 | 
	
		
			
				|  |  | +          event.preventDefault();
 | 
	
		
			
				|  |  | +          event.stopImmediatePropagation();
 | 
	
		
			
				|  |  | +        }
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    };
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    container.addEventListener("keydown", handleKeyDown);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +    return () => container.removeEventListener("keydown", handleKeyDown);
 | 
	
		
			
				|  |  | +  }, [container]);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    // ensure the popover doesn't overflow the viewport
 | 
	
		
			
				|  |  |    useLayoutEffect(() => {
 | 
	
		
			
				|  |  |      if (fitInViewport && popoverRef.current) {
 |