mirror of
https://github.com/kremalicious/metamask-extension.git
synced 2024-12-01 13:47:06 +01:00
2326195324
* Add DS Popover component * Update to Popover story * make role a prop with PopoverRole enum * update to Hiro design changes * fix snapshot * Update ui/components/component-library/popover/README.mdx Co-authored-by: George Marshall <george.marshall@consensys.net> * Update ui/components/component-library/popover/README.mdx Co-authored-by: George Marshall <george.marshall@consensys.net> * small story changes and removal of unused forwardRef * add more test coverage * add more story demos * add more popover demos * if escKeyClose is passed then it will add event listener * isPortal story * add if statement * replace Text with Box for now * add esc test coverage * add README docs * fix readme and onEscKeyClose * onEscKeyClose to onPressEscKey * Update ui/components/component-library/popover/README.mdx Co-authored-by: George Marshall <george.marshall@consensys.net> * change conditional on useEffect --------- Co-authored-by: legobeat <109787230+legobeat@users.noreply.github.com> Co-authored-by: George Marshall <george.marshall@consensys.net>
268 lines
7.0 KiB
Plaintext
268 lines
7.0 KiB
Plaintext
import { Story, Canvas, ArgsTable } from '@storybook/addon-docs';
|
|
import { Popover } from './popover';
|
|
|
|
# Popover
|
|
|
|
Popover is an overlay that appears by the trigger used for menus, additional contents, and contains at least one focusable element.
|
|
|
|
<Canvas>
|
|
<Story id="components-componentlibrary-popover--default-story" />
|
|
</Canvas>
|
|
|
|
## Props
|
|
|
|
The `Popover` accepts all props below as well as all [Box](/docs/ui-components-ui-box-box-stories-js--default-story#props) component props
|
|
|
|
<ArgsTable of={Popover} />
|
|
|
|
### Reference Element
|
|
|
|
The `referenceElement` prop is required and used to position the popover relative to the reference element.
|
|
|
|
```jsx
|
|
import { useState } from 'react';
|
|
import { Popover } from '../../ui/component-library';
|
|
|
|
const [referenceElement, setReferenceElement] = useState();
|
|
|
|
const setBoxRef = (ref) => {
|
|
setReferenceElement(ref);
|
|
};
|
|
|
|
<Box ref={setBoxRef}></Box>
|
|
<Popover referenceElement={referenceElement}>Reference Element</Popover>
|
|
```
|
|
|
|
### Children
|
|
|
|
Popover accepts any children and has a default padding of `4` (16px).
|
|
|
|
```jsx
|
|
import {
|
|
Popover,
|
|
Text,
|
|
Icon,
|
|
IconSize,
|
|
IconName,
|
|
} from '../../ui/component-library';
|
|
|
|
<Popover>
|
|
<Text>
|
|
Demo of popover with children.
|
|
<Icon size={IconSize.Inherit} name={IconName.Info} />
|
|
</Text>
|
|
</Popover>;
|
|
```
|
|
|
|
### Position
|
|
|
|
Use the `position` prop with the `PopoverPosition` enum to set the position of the popover relative to the reference element.
|
|
|
|
Default is `PopoverPosition.Auto`
|
|
|
|
```jsx
|
|
import { Popover, PopoverPosition } from '../../ui/component-library';
|
|
|
|
<Popover position={PopoverPosition.Auto}>Auto</Popover>
|
|
<Popover position={PopoverPosition.AutoStart}>AutoStart</Popover>
|
|
<Popover position={PopoverPosition.AutoEnd}>AutoEnd</Popover>
|
|
<Popover position={PopoverPosition.Top}>Top</Popover>
|
|
<Popover position={PopoverPosition.TopStart}>TopStart</Popover>
|
|
<Popover position={PopoverPosition.TopEnd}>TopEnd</Popover>
|
|
<Popover position={PopoverPosition.Right}>Right</Popover>
|
|
<Popover position={PopoverPosition.RightStart}>RightStart</Popover>
|
|
<Popover position={PopoverPosition.RightEnd}>RightEnd</Popover>
|
|
<Popover position={PopoverPosition.Bottom}>Bottom</Popover>
|
|
<Popover position={PopoverPosition.BottomStart}>BottomStart</Popover>
|
|
<Popover position={PopoverPosition.BottomEnd}>BottomEnd</Popover>
|
|
<Popover position={PopoverPosition.Left}>Left</Popover>
|
|
<Popover position={PopoverPosition.LeftStart}>LeftStart</Popover>
|
|
<Popover position={PopoverPosition.LeftEnd}>LeftEnd</Popover>
|
|
```
|
|
|
|
### Is Portal
|
|
|
|
The `isPortal` prop is a boolean that when set to true, causes the Popover to be rendered as a separate DOM element at the end of the document body.
|
|
Default `false`
|
|
|
|
```jsx
|
|
import { Popover } from '../../ui/component-library';
|
|
|
|
<Popover isPortal={true}>Popover using create portal</Popover>;
|
|
```
|
|
|
|
### Has Arrow
|
|
|
|
Use the `hasArrow` boolean to add an arrow to the popover.
|
|
|
|
```jsx
|
|
import { Popover } from '../../ui/component-library';
|
|
|
|
<Popover hasArrow>Popover with arrow</Popover>;
|
|
```
|
|
|
|
### Is Open
|
|
|
|
Use the `isOpen` boolean to control the visibility of the popover.
|
|
|
|
```jsx
|
|
import { Popover } from '../../ui/component-library';
|
|
|
|
<Popover isOpen={true}>Popover with arrow</Popover>;
|
|
```
|
|
|
|
### Flip
|
|
|
|
Use the `flip` boolean to flip the popover to the opposite side of the reference element if there is not enough space.
|
|
For `PopoverPosition.Auto` this will become true.
|
|
|
|
```jsx
|
|
import { Popover } from '../../ui/component-library';
|
|
|
|
<Popover flip={true}>Flip demo</Popover>;
|
|
```
|
|
|
|
### Prevent Overflow
|
|
|
|
Use the `preventOverflow` boolean to prevent the popover from overflowing the viewport.
|
|
For `PopoverPosition.Auto` this will become true.
|
|
|
|
```jsx
|
|
import { Popover } from '../../ui/component-library';
|
|
|
|
<Popover preventOverflow={true}>Prevent overflow demo</Popover>;
|
|
```
|
|
|
|
### Reference Hidden
|
|
|
|
Use the `referenceHidden` boolean to hide the Popover when the reference element is no longer visible in the viewport.
|
|
|
|
```jsx
|
|
import { Popover } from '../../ui/component-library';
|
|
|
|
<Popover referenceHidden={true}>Reference hidden demo</Popover>;
|
|
```
|
|
|
|
### Match Width
|
|
|
|
Use the `matchWidth` boolean to match the width of the popover to the reference element.
|
|
|
|
```jsx
|
|
import { Popover } from '../../ui/component-library';
|
|
|
|
<Popover matchWidth={true}>Match width demo</Popover>;
|
|
```
|
|
|
|
### Role
|
|
|
|
Use the `role` prop with `PopoverRole` enum to set the role of the popover.
|
|
`PopoverRole.Dialog` if the content is interactive, or `PopoverRole.Tooltip` for purely informational popovers.
|
|
|
|
Default: `PopoverRole.Tooltip`
|
|
|
|
```jsx
|
|
import { Popover, PopoverRole } from '../../ui/component-library';
|
|
|
|
<Popover role={PopoverRole.Tooltip}>PopoverRole.Tooltip</Popover>;
|
|
<Popover role={PopoverRole.Dialog}>PopoverRole.Dialog</Popover>;
|
|
```
|
|
|
|
### Offset
|
|
|
|
Use the `offset` prop to pass an array of two numbers to offset the popover from the reference element.
|
|
Default is `[0, 8]`
|
|
First number controls the skidding offset and the second number controls the distance offset.
|
|
|
|
```jsx
|
|
import { Popover } from '../../ui/component-library';
|
|
|
|
<Popover offset={[0, 32]}>offset override to [0,32]</Popover>;
|
|
```
|
|
|
|
### On Press Esc Key
|
|
|
|
`onPressEscKey` is a callback function that is invoked when the 'Escape' key is pressed within the `Popover` component
|
|
|
|
```jsx
|
|
import { Popover } from '../../ui/component-library';
|
|
|
|
const [isOpen, setIsOpen] = useState(false);
|
|
|
|
const handleClick = () => {
|
|
setIsOpen(!isOpen);
|
|
};
|
|
|
|
<Popover onPressEscKey={() => setIsOpen(false)}>
|
|
Press esc key to close
|
|
</Popover>;
|
|
```
|
|
|
|
### With PopoverHeader
|
|
|
|
Using the `PopoverHeader` component to add a header to the `Popover` component. The `PopoverHeader` is used to show common elements such as title, back button, and close button.
|
|
|
|
```jsx
|
|
import { Popover } from '../../ui/component-library';
|
|
|
|
<Popover>
|
|
<PopoverHeader
|
|
onClose={() => console.log('close')}
|
|
onBack={() => console.log('back')}
|
|
>
|
|
Popover Title
|
|
</PopoverHeader>
|
|
Title should be short and concise. It should be sentence case and no period.
|
|
</Popover>;
|
|
```
|
|
|
|
### Mouse Event Demo
|
|
|
|
Not built into the `Popover` component, but a demo of `onMouseEnter` and `onMouseLeave` events on the reference element to control the visibility of the popover
|
|
|
|
```jsx
|
|
import { Popover } from '../../ui/component-library';
|
|
|
|
const [isOpen, setIsOpen] = useState(false);
|
|
|
|
const handleMouseEnter = () => {
|
|
setIsOpen(true);
|
|
};
|
|
|
|
const handleMouseLeave = () => {
|
|
setIsOpen(false);
|
|
};
|
|
|
|
<>
|
|
<Box onMouseEnter={handleMouseEnter} onMouseLeave={handleMouseLeave}>
|
|
Hover
|
|
</Box>
|
|
<Popover isOpen={isOpen}>onMouseEnter and onMouseLeave</Popover>
|
|
</>;
|
|
```
|
|
|
|
### On Focus/Blur Demo
|
|
|
|
Not built into the `Popover` component, but a demo of `onFocus` and `onBlur` events on the reference element to control the visibility of the popover
|
|
|
|
```jsx
|
|
import { Popover } from '../../ui/component-library';
|
|
|
|
const [isOpen, setIsOpen] = useState(false);
|
|
|
|
// Example of how open popover with focus and pair with onBlur to close popover
|
|
const handleFocus = () => {
|
|
setIsOpen(true);
|
|
};
|
|
|
|
const handleClose = () => {
|
|
setIsOpen(false);
|
|
};
|
|
|
|
<>
|
|
<Box onFocus={handleFocus} onBlur={handleClose} as="button">
|
|
Focus to open
|
|
</Box>
|
|
<Popover>onFocus to open and onBlur to close</Popover>
|
|
</>;
|
|
```
|