ghost-portal/packages/react-components/src/Popup/PopupWindow.tsx
Jaco 4929b1c6fd
Update headers for 2023 (#8665)
* Update headers for 2023

* Adjust env-config
2023-01-01 10:32:05 +02:00

99 lines
2.2 KiB
TypeScript

// Copyright 2017-2023 @polkadot/react-components authors & contributors
// SPDX-License-Identifier: Apache-2.0
import type { PopupWindowProps } from './types';
import React from 'react';
import { createPortal } from 'react-dom';
import styled, { css } from 'styled-components';
import { usePopupWindow } from '@polkadot/react-hooks/usePopupWindow';
function PopupWindow ({ children, className = '', position, triggerRef, windowRef }: PopupWindowProps) {
const { renderWindowPosition, verticalPosition } = usePopupWindow(windowRef, triggerRef, position);
return createPortal(
<div
className={`${className}${verticalPosition === 'top' ? ' pointerTop' : ' pointerBottom'}`}
data-testid='popup-window'
ref={windowRef}
style={renderWindowPosition && { transform: `translate3d(${renderWindowPosition.x}px, ${renderWindowPosition.y}px, 0)`, zIndex: 1000 }}
>
{children}
</div>,
document.body
);
}
export default React.memo(styled(PopupWindow)`
position: absolute;
top:0;
left:0;
z-index: -1;
margin: 0.7rem 0;
padding: 0;
color: var(--color-text);
background-color: var(--bg-menu);
border-radius: 4px;
border: 1px solid #d4d4d5;
box-shadow: 0 2px 4px 0 rgb(34 36 38 / 12%), 0 2px 10px 0 rgb(34 36 38 / 15%);
&::before {
position: absolute;
right: 50%;
top: unset;
bottom: -0.45rem;
box-shadow: 1px 1px 0 0 #bababc;
${({ position }) => position === 'left' && css`
left: unset;
right: 0.8rem;
`}
${({ position }) => position === 'right' && css`
left: 0.8rem;
right: unset;
`}
content: '';
background-color: var(--bg-menu);
width: 1rem;
height: 1rem;
transform: rotate(45deg);
z-index: 2;
}
&.pointerBottom::before {
box-shadow: -1px -1px 0 0 #bababc;
top: -0.45rem;
bottom: unset;
}
.ui.text.menu .item {
color: var(--color-text) !important;
text-align: left;
&.disabled {
opacity: 0.3;
}
}
& > *:not(.ui--Menu) {
margin-left: 1rem;
margin-right: 1rem;
}
& > *:first-child:not(.ui--Menu) {
margin-top: 1rem;
}
& > *:last-child:not(.ui--Menu) {
margin-bottom: 1rem;
}
`);