Files
outline/app/components/Popover.tsx
忽如寄 9f400af73b refactor: ♻️ refactor isHosted && type clean up (#3290)
* refactor: ♻️ refactor isHosted && type clean up

Change-Id: I4dfbad8a07607432801de78920ce42bf81e46498

* refactor: ♻️ code clean up

Change-Id: I8f487a33d332a2acaff84397a97371b56ace28a1

* feat: 💄 lint

Change-Id: I776b1a5e249bdb542f8e6da7cb2277821cf91094

* feat:  ci type

Change-Id: I486dde7bf60321238e9a394c40ad8cdb8bfc54c8

* feat: some code sugession

Change-Id: I4761d057344b95a98e99068d312a42292977875b
2022-03-27 15:18:37 -07:00

56 lines
1.3 KiB
TypeScript

import * as React from "react";
import { Dialog } from "reakit/Dialog";
import { Popover as ReakitPopover } from "reakit/Popover";
import styled from "styled-components";
import breakpoint from "styled-components-breakpoint";
import useMobile from "~/hooks/useMobile";
import { fadeAndScaleIn } from "~/styles/animations";
type Props = {
tabIndex?: number;
width?: number;
};
const Popover: React.FC<Props> = ({ children, width = 380, ...rest }) => {
const isMobile = useMobile();
if (isMobile) {
return (
<Dialog {...rest} modal>
<Contents>{children}</Contents>
</Dialog>
);
}
return (
<ReakitPopover {...rest}>
<Contents $width={width}>{children}</Contents>
</ReakitPopover>
);
};
const Contents = styled.div<{ $width?: number }>`
animation: ${fadeAndScaleIn} 200ms ease;
transform-origin: 75% 0;
background: ${(props) => props.theme.menuBackground};
border-radius: 6px;
padding: 12px 24px;
max-height: 50vh;
overflow-y: scroll;
box-shadow: ${(props) => props.theme.menuShadow};
width: ${(props) => props.$width}px;
${breakpoint("mobile", "tablet")`
position: fixed;
z-index: ${(props: any) => props.theme.depths.menu};
// 50 is a magic number that positions us nicely under the top bar
top: 50px;
left: 8px;
right: 8px;
width: auto;
`};
`;
export default Popover;