import React from 'react' import styled, { keyframes } from 'styled-components' import { breakpoints, isTestEnvironment, theme } from '@planview/pv-utilities' import { useFloating } from '@floating-ui/react-dom' import { Portal } from '@planview/pv-uikit' const animFrames = keyframes` from { opacity: 0; } to { opacity: 1; } ` const Wrap = styled.div<{ theme: { zindex: number } }>` z-index: ${({ theme }) => theme.zindex}; background-color: transparent; ${breakpoints.phone` width: 100%; height: 100%; position: fixed; top: 0; right: 0; bottom: 0; left: 0; overflow: hidden; outline: 0; background-color: ${theme.backgroundNeutral0}; `} ` const InnerWrap = styled.div` height: 100%; display: flex; opacity: 0; animation: ${animFrames} 0.1s linear forwards; ` export type PortalProps = { type?: string children: React.JSX.Element } type FloatingWrapDetailsProps = { style: React.CSSProperties children: React.ReactNode } const FloatingWrapDetails = React.forwardRef< HTMLDivElement, FloatingWrapDetailsProps >(({ style, children, ...rest }, ref) => ( {children} )) FloatingWrapDetails.displayName = 'FloatingWrapDetails' type FloaterProps = { /** * Element/coordinates to anchor to */ anchor?: React.RefObject children: React.ReactNode } export const Floater = ({ anchor, children }: FloaterProps) => { const { refs: { setFloating }, x, y, strategy, } = useFloating({ placement: 'bottom-start', elements: { reference: anchor!.current, }, }) const isMobile = window.innerWidth <= breakpoints.PHONE return ( {isMobile ? ( {children} ) : ( {((x !== 0 && y !== 0) || isTestEnvironment) && (
{children}
)}
)}
) }