|  | @@ -1,15 +1,41 @@
 | 
	
		
			
				|  |  | -import React from "react";
 | 
	
		
			
				|  |  | +import React, { useLayoutEffect, useRef } from "react";
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  type Props = {
 | 
	
		
			
				|  |  |    top?: number;
 | 
	
		
			
				|  |  |    left?: number;
 | 
	
		
			
				|  |  |    children?: React.ReactNode;
 | 
	
		
			
				|  |  |    onCloseRequest?(): void;
 | 
	
		
			
				|  |  | +  fitInViewport?: boolean;
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -export function Popover({ children, left, onCloseRequest, top }: Props) {
 | 
	
		
			
				|  |  | +export function Popover({
 | 
	
		
			
				|  |  | +  children,
 | 
	
		
			
				|  |  | +  left,
 | 
	
		
			
				|  |  | +  top,
 | 
	
		
			
				|  |  | +  onCloseRequest,
 | 
	
		
			
				|  |  | +  fitInViewport = false
 | 
	
		
			
				|  |  | +}: Props) {
 | 
	
		
			
				|  |  | +  const popoverRef = useRef<HTMLDivElement>(null);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  // ensure the popover doesn't overflow the viewport
 | 
	
		
			
				|  |  | +  useLayoutEffect(() => {
 | 
	
		
			
				|  |  | +    if (fitInViewport && popoverRef.current) {
 | 
	
		
			
				|  |  | +      const element = popoverRef.current;
 | 
	
		
			
				|  |  | +      const { x, y, width, height } = element.getBoundingClientRect();
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +      const viewportWidth = window.innerWidth;
 | 
	
		
			
				|  |  | +      if (x + width > viewportWidth) {
 | 
	
		
			
				|  |  | +        element.style.left = viewportWidth - width + "px";
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +      const viewportHeight = window.innerHeight;
 | 
	
		
			
				|  |  | +      if (y + height > viewportHeight) {
 | 
	
		
			
				|  |  | +        element.style.top = viewportHeight - height + "px";
 | 
	
		
			
				|  |  | +      }
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +  }, [fitInViewport]);
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |    return (
 | 
	
		
			
				|  |  | -    <div className="popover" style={{ top: top, left: left }}>
 | 
	
		
			
				|  |  | +    <div className="popover" style={{ top: top, left: left }} ref={popoverRef}>
 | 
	
		
			
				|  |  |        <div
 | 
	
		
			
				|  |  |          className="cover"
 | 
	
		
			
				|  |  |          onClick={onCloseRequest}
 |