@wix/design-system
Version:
@wix/design-system
358 lines (331 loc) • 11.7 kB
Markdown
## Feature Examples
### Size
- description: <p>Update the dimensions of a button with the <code>size</code> prop. </p><li><code>large</code> is for onboarding flows and marketing pages where the action needs more emphasis.</li><li><code>medium</code> is the default for all common cases.</li><li><code>small</code> is for icon buttons used in cards and widgets.</li><li><code>tiny</code> is for small and dense layouts.</li><p></p><p><em>Note</em>: small and tiny size buttons should use the small icon size (18x18).</p>
- example:
```jsx
<StorybookComponents.Stack flexDirection="column">
<IconButton size="large">
<Icons.Add />
</IconButton>
<IconButton size="medium">
<Icons.Add />
</IconButton>
<IconButton size="small">
<Icons.AddSmall />
</IconButton>
<IconButton size="tiny">
<Icons.AddSmall />
</IconButton>
</StorybookComponents.Stack>;
```
### Skin
- description: <p>Change the button's appearance with the <code>skin</code> prop. </p><li><code>standard</code> is the default for all general actions.</li><li><code>light</code> is for dark backgrounds.</li><li><code>transparent</code> is for backgrounds with colors or images. </li><li><code>premium</code> is for actions that prompt users to upgrade their plans.</li><li><code>dark</code> should be used with buttons on backgrounds with colors. </li><li><code>ai</code> should be used with AI based features.</li><p></p><p>Each action can be <code>primary</code>, <code>secondary</code> or <code>tertiary</code>, depending on priority. There should only be one primary action per page.</p><p></p><p><em>Note</em>: Secondary buttons should be used alongside primary buttons for less utilized actions, such as cancel or back. </p>
- example:
```jsx
<StorybookComponents.Stack flexDirection="column">
<StorybookComponents.Stack padding="12px" gap="6px">
<IconButton skin="standard" priority="primary">
<Icons.Check />
</IconButton>
<IconButton skin="standard" priority="secondary">
<Icons.X />
</IconButton>
<IconButton skin="standard" priority="tertiary">
<Icons.More />
</IconButton>
</StorybookComponents.Stack>
<StorybookComponents.Background skin="dark">
<StorybookComponents.Stack padding="12px" gap="6px">
<IconButton skin="light" priority="primary">
<Icons.Check />
</IconButton>
<IconButton skin="light" priority="secondary">
<Icons.X />
</IconButton>
<IconButton skin="light" priority="tertiary">
<Icons.More />
</IconButton>
</StorybookComponents.Stack>
</StorybookComponents.Background>
<StorybookComponents.Background skin="blue">
<StorybookComponents.Stack padding="12px" gap="6px">
<IconButton skin="transparent" priority="primary">
<Icons.Check />
</IconButton>
<IconButton skin="transparent" priority="secondary">
<Icons.X />
</IconButton>
<IconButton skin="transparent" priority="tertiary">
<Icons.More />
</IconButton>
</StorybookComponents.Stack>
</StorybookComponents.Background>
<StorybookComponents.Background skin="light">
<StorybookComponents.Stack padding="12px" gap="6px">
<IconButton skin="premium" priority="primary">
<Icons.Check />
</IconButton>
<IconButton skin="premium" priority="secondary">
<Icons.X />
</IconButton>
<IconButton skin="premium" priority="tertiary">
<Icons.More />
</IconButton>
</StorybookComponents.Stack>
</StorybookComponents.Background>
<StorybookComponents.Stack padding="12px" gap="6px">
<IconButton skin="dark" priority="primary">
<Icons.Check />
</IconButton>
<IconButton skin="dark" priority="secondary">
<Icons.X />
</IconButton>
<IconButton skin="dark" priority="tertiary">
<Icons.More />
</IconButton>
</StorybookComponents.Stack>
<StorybookComponents.Stack padding="12px" gap="6px">
<IconButton skin="ai" priority="primary">
<Icons.Check />
</IconButton>
<IconButton skin="ai" priority="secondary">
<Icons.X />
</IconButton>
<IconButton skin="ai" priority="tertiary">
<Icons.More />
</IconButton>
</StorybookComponents.Stack>
</StorybookComponents.Stack>;
```
### Disabled
- description: <p>To disable a button, use the <code>disabled</code> prop which indicates a button can't be selected.</p>
- example:
```jsx
<IconButton disabled>
<Icons.Add />
</IconButton>;
```
## Developer Examples
### Custom HTML tag
- description: <p>Render buttons as any given HTML tag with the <code>as</code> prop. For example, they can be rendered as:</p><li><code><a></code> when attributes like <code>href</code>, <code>target</code> are needed.</li><li><code><Link></code> when props like <code>to</code>, <code>replace</code>, etc. are needed.</li><p></p><p>All attributes will be passed to the rendered element.</p>
- example:
```jsx
() => {
const ReactRouterLink = props => <div {...props} />;
return (
<StorybookComponents.Stack justifyContent="space-between">
<StorybookComponents.Stack
flexDirection="column"
gap="12px"
alignItems="center"
>
<Text secondary size="small">
{'<a/> tag'}
</Text>
<IconButton as="a" href="https://www.wix.com" target="_blank">
<Icons.Add />
</IconButton>
</StorybookComponents.Stack>
<StorybookComponents.Stack
flexDirection="column"
gap="12px"
alignItems="center"
>
<Text secondary size="small">
{'React router <Link/> tag'}
</Text>
<IconButton as={ReactRouterLink} to="/home">
<Icons.Add />
</IconButton>
</StorybookComponents.Stack>
<StorybookComponents.Stack
flexDirection="column"
gap="12px"
alignItems="center"
>
<Text secondary size="small">
{'Native <button/> tag'}
</Text>
<IconButton as="button">
<Icons.Add />
</IconButton>
</StorybookComponents.Stack>
</StorybookComponents.Stack>
);
};
```
## Common Use Case Examples
### Button labels
- description: <p>Use <code><Tooltip/></code> <a href="https://www.wix-style-react.com/storybook/?path=/story/components-overlays--tooltip"></a> to add a label to icon buttons.</p>
- example:
```jsx
<Box align="center">
<Tooltip content="Edit program">
<IconButton priority="secondary">
<Icons.Edit />
</IconButton>
</Tooltip>
</Box>;
```
### Small layouts
- description: <p>Use icon buttons in small and crowded layouts.</p>
- example:
```jsx
<Layout>
<Cell span={4}>
<Proportion aspectRatio={1}>
<MediaOverlay skin="gradient" media="FoodExample2.jpg">
<MediaOverlay.Content placement="top-end" visible="always">
<Tooltip content="Edit image">
<IconButton priority="secondary" skin="inverted" size="small">
<Icons.CropSmall />
</IconButton>
</Tooltip>
<Tooltip content="Mark as favorite">
<IconButton priority="secondary" skin="inverted" size="small">
<Icons.FavoriteSmall />
</IconButton>
</Tooltip>
<PopoverMenu
textSize="small"
triggerElement={
<Tooltip content="More actions">
<IconButton priority="secondary" skin="inverted" size="small">
<Icons.MoreSmall />
</IconButton>
</Tooltip>
}
>
<PopoverMenu.MenuItem text="Edit" />
<PopoverMenu.MenuItem text="Remove" skin="destructive" />
</PopoverMenu>
</MediaOverlay.Content>
<MediaOverlay.Content placement="bottom-start" visible="always">
<Text light size="small">Pasta with Ricotta Cheese</Text>
</MediaOverlay.Content>
</MediaOverlay>
</Proportion>
</Cell>
</Layout>;
```
### Popover menu
- description: <p>Use icon buttons to open a <code><PopoverMenu/></code>.</p>
- example:
```jsx
() => {
const renderImage = () => <Image width={230} borderRadius={0}></Image>;
const renderContent = () => (
<Box
direction="vertical"
verticalAlign="space-between"
padding="24px 29px 27px"
backgroundColor="D80"
flexGrow={1}
>
<Box direction="vertical" gap={1}>
<Text weight="bold">JAVA meetup</Text>
<Text size="small" weight="thin" secondary light>
Jan 20, 2021, 10:00 AM, Location will be announced later
</Text>
</Box>
<Box align="space-between">
<Box />
<Box align="space-between" verticalAlign="middle" gap={1}>
<PopoverMenu
textSize="small"
triggerElement={
<Tooltip content="More actions">
<IconButton priority="secondary" size="small">
<Icons.MoreSmall />
</IconButton>
</Tooltip>
}
>
<PopoverMenu.MenuItem
text="Edit SEO settings"
prefixIcon={<Icons.SettingsSmall />}
/>
<PopoverMenu.Divider />
<PopoverMenu.MenuItem
text="Duplicate as draft"
prefixIcon={<Icons.DuplicateSmall />}
/>
<PopoverMenu.MenuItem
text="Cancel event"
skin="destructive"
prefixIcon={<Icons.BlockSmall />}
/>
</PopoverMenu>
<Button
priority="secondary"
size="small"
prefixIcon={<Icons.PromoteSmall />}
>
Promote
</Button>
<Button priority="secondary" size="small">
Edit
</Button>
</Box>
</Box>
</Box>
);
return (
<Card hideOverflow>
<Box minHeight={200}>
{renderImage()}
{renderContent()}
</Box>
</Card>
);
};
```
### Low priority actions
- description: <p>Use icon buttons for lower-priority actions that have no effect on the main user flow. For example, to change the cover image of an audio.</p>
- example:
```jsx
<SidePanel onCloseButtonClick={() => {}} skin="floating" width="288px">
<SidePanel.Header title="Audio Player Settings" />
<SidePanel.Content noPadding>
<SidePanel.Field>
<FieldSet
legend="Track cover image"
alignment="center"
columns="168px auto auto"
>
<Image width="156px" height="102px" src="TravelExample6.jpg" />
<Tooltip content="Change image">
<IconButton size="small" skin="standard" priority="secondary">
<Icons.RefreshSmall />
</IconButton>
</Tooltip>
<Tooltip content="Remove image">
<IconButton size="small" skin="standard" priority="secondary">
<Icons.DeleteSmall />
</IconButton>
</Tooltip>
</FieldSet>
</SidePanel.Field>
<SidePanel.Field>
<FormField label="Source (URL)">
<Input placeholder="Add link to the track" size="small" />
</FormField>
</SidePanel.Field>
<SidePanel.Field>
<FormField label="Name">
<Input value="Track Name" size="small" />
</FormField>
</SidePanel.Field>
<SidePanel.Field>
<FormField label="Description">
<InputArea
placeholder="Add a short description to promote your audio track."
size="small"
minHeight="120px"
resizable
/>
</FormField>
</SidePanel.Field>
</SidePanel.Content>
</SidePanel>;
```