@wix/design-system
Version:
@wix/design-system
222 lines (197 loc) • 6.13 kB
Markdown
## Feature Examples
### Resizeable
- description: <p>Control if a handle is shown in the component header with <code>resizable</code> prop. When enabled, it allows user to expand or collapse the drawer with a swipe gesture. </p>
- example:
```jsx
() => {
const [open, setOpen] = React.useState(false);
const [resizable, setResizable] = React.useState(true);
return (
<Box direction="vertical">
<Box gap="10px">
<Button
onClick={() => {
setResizable(true);
setOpen(true);
}}
>
Open resizable drawer
</Button>
<Button
onClick={() => {
setResizable(false);
setOpen(true);
}}
>
Open non-resizable drawer
</Button>
</Box>
<Drawer
open={open}
onClose={() => setOpen(false)}
resizable={resizable}
backdrop
margin
dismissible
>
<Box padding="20px" gap="20px" direction="vertical">
<StorybookComponents.Placeholder height="200px">
<Text size="medium" weight="normal">
{resizable ? 'Resizable drawer' : 'Non-resizable drawer'}
</Text>
</StorybookComponents.Placeholder>
<Button onClick={() => setOpen(false)}>Close Drawer</Button>
</Box>
</Drawer>
</Box>
);
};
```
### Backdrop
- description: <p>Control whether the drawer displays a <code>backdrop</code> using the backdrop property. By default, clicking the backdrop will close the drawer.</p><p></p><p>When the backdrop is disabled, you can allow users to interact with the content behind the drawer by turning off the <code>renderBackdrop</code> property. When this property is off, make sure to provide alternative ways to close the drawer so users don’t get trapped in it.</p>
- example:
```jsx
() => {
const [open, setOpen] = React.useState(false);
const [backdrop, setBackdrop] = React.useState(true);
return (
<Box direction="vertical">
<Box gap="10px">
<Button
onClick={() => {
setBackdrop(true);
setOpen(true);
}}
>
Open drawer with backdrop
</Button>
<Button
onClick={() => {
setBackdrop(false);
setOpen(true);
}}
>
Open drawer without backdrop
</Button>
</Box>
<Drawer
open={open}
onClose={() => setOpen(false)}
backdrop={backdrop}
margin
dismissible
>
<Box padding="20px" gap="20px" direction="vertical">
<StorybookComponents.Placeholder height="200px">
<Text size="medium" weight="normal">
{backdrop ? 'With backdrop' : 'Without backdrop'}
</Text>
</StorybookComponents.Placeholder>
<Button onClick={() => setOpen(false)}>Close Drawer</Button>
</Box>
</Drawer>
</Box>
);
};
```
### Margin
- description: <p>Control if the drawer has a margin around it with a <code>margin</code> prop. The size of it is fixed and varies per different themes.</p>
- example:
```jsx
() => {
const [open, setOpen] = React.useState(false);
const [margin, setMargin] = React.useState(true);
return (
<Box direction="vertical">
<Box gap="10px">
<Button
onClick={() => {
setMargin(true);
setOpen(true);
}}
>
Open drawer with margin
</Button>
<Button
onClick={() => {
setMargin(false);
setOpen(true);
}}
>
Open drawer without margin
</Button>
</Box>
<Drawer
open={open}
onClose={() => setOpen(false)}
margin={margin}
backdrop
dismissible
>
<Box padding="20px" gap="20px" direction="vertical">
<StorybookComponents.Placeholder height="200px">
<Text size="medium" weight="normal">
{margin ? 'With margin' : 'Without margin'}
</Text>
</StorybookComponents.Placeholder>
<Button onClick={() => setOpen(false)}>Close Drawer</Button>
</Box>
</Drawer>
</Box>
);
};
```
### Header
- description: <p>Add header with action when needed. Drawer content is a <code>react.node</code>, so any content can be placed inside of it. </p><p></p><p>However, when adding a header, stick to the pattern that the close button is on the left, title is in the center and additional actions are on the right side.</p>
- example:
```jsx
() => {
const [open, setOpen] = React.useState(false);
return (
<Box>
<Button onClick={() => setOpen(true)}>Open drawer</Button>
<Drawer open={open} onClose={() => setOpen(false)}>
<Box direction="vertical">
<Box
align="center"
verticalAlign="middle"
padding="12px 16px"
backgroundColor="white"
>
<Box width="40px">
<IconButton
priority="tertiary"
skin="dark"
size="medium"
onClick={() => setOpen(false)}
>
<Icons.X />
</IconButton>
</Box>
<Box flexGrow={1} align="center">
<Heading size="small">Title</Heading>
</Box>
<Box width="40px" align="right">
<IconButton
priority="tertiary"
skin="dark"
size="medium"
onClick={() => setOpen(false)}
>
<Icons.Check />
</IconButton>
</Box>
</Box>
<Box padding="20px" direction="vertical" gap="20px">
<StorybookComponents.Placeholder height="300px">
<Text size="medium" weight="normal">
Content goes here
</Text>
</StorybookComponents.Placeholder>
</Box>
</Box>
</Drawer>
</Box>
);
};
```