## Feature Examples

### Size
- description: Control toggle button size with `size` prop: - `large` is best for main actions in a composer. - `medium` (default) is for main composer toolbars. - `small` fits into smaller toolbars and UI elements like cards and widgets. - `tiny` is used in dense layouts.
- example:
```jsx
<StorybookComponents.Stack alignItems="flex-start">
  <ToggleButton labelValue="Large" size="large">
    <Icons.CropRotate />
  </ToggleButton>
  <ToggleButton labelValue="Medium" size="medium">
    <Icons.CropRotate />
  </ToggleButton>
  <ToggleButton labelValue="Small" size="small">
    <Icons.CropRotateSmall />
  </ToggleButton>
  <ToggleButton labelValue="Tiny" size="tiny">
    <Icons.CropRotateSmall />
  </ToggleButton>
</StorybookComponents.Stack>;
```

### Label placement
- description: Position the label with `labelPlacement` prop: - `tooltip` (default) - use it in dense layouts and for repetitive intuitive actions that don't need the exposed label, such as making text italic. - `end` saves vertical space. - `bottom` saves horizontal space.
- example:
```jsx
<StorybookComponents.Stack alignItems="flex-start">
  <ToggleButton labelValue="Tooltip" labelPlacement="tooltip">
    <Icons.CropRotate />
  </ToggleButton>
  <ToggleButton labelValue="End" labelPlacement="end">
    <Icons.CropRotate />
  </ToggleButton>
  <ToggleButton labelValue="Bottom" labelPlacement="bottom">
    <Icons.CropRotate />
  </ToggleButton>
</StorybookComponents.Stack>;
```

### Skin
- description: Control the appearance of a button with `skin` prop: - `standard` (default) is used it in all default cases. - `inverted` is used when selected actions need additional emphasis. - `destructive` is best for actions that might have a negative effect, for example, when the microphone is muted. - `success` is best for actions that have a positive effect, for example when camera is on or screen is shared. - `dark` is used on colored backgrounds. Note: by design, different skins are only visible when toggle buttons are selected.
- example:
```jsx
<StorybookComponents.Stack>
  <ToggleButton labelValue="Standard" skin="standard" selected>
    <Icons.CropRotate />
  </ToggleButton>
  <ToggleButton
    labelValue="Standard secondary"
    skin="standard-secondary"
    selected
  >
    <Icons.CropRotate />
  </ToggleButton>
  <ToggleButton labelValue="Inverted" skin="inverted" selected>
    <Icons.CropRotate />
  </ToggleButton>
  <ToggleButton labelValue="Destructive" skin="destructive" selected>
    <Icons.CropRotate />
  </ToggleButton>
  <ToggleButton labelValue="Success" skin="success" selected>
    <Icons.CropRotate />
  </ToggleButton>
  <ToggleButton labelValue="Dark" skin="dark" selected>
    <Icons.CropRotate />
  </ToggleButton>
</StorybookComponents.Stack>;
```

### Shape
- description: Control toggle button form with `shape` prop: - `square` (default) is best for composer toolbars and top bars. - `round` is built in composer sidebars. - `pill` is for main page layouts.
- example:
```jsx
<StorybookComponents.Stack>
  <ToggleButton labelValue="Square" shape="square">
    <Icons.CropRotate />
  </ToggleButton>
  <ToggleButton labelValue="Round" shape="round">
    <Icons.CropRotate />
  </ToggleButton>
  <ToggleButton labelValue="Pill" shape="pill">
    <Icons.CropRotate />
  </ToggleButton>
</StorybookComponents.Stack>;
```

### Border
- description: Turn on a toggle button border using `border` prop. It is off by default. Use it when the action needs additional emphasis.
- example:
```jsx
<StorybookComponents.Stack>
  <ToggleButton labelValue="No border">
    <Icons.CropRotate />
  </ToggleButton>
  <ToggleButton labelValue="With border" border={true}>
    <Icons.CropRotate />
  </ToggleButton>
</StorybookComponents.Stack>;
```

### State
- description: Control toggle button states with these props: - `selected` is used when action is set to active. - `disabled` is used for unavailable actions, when toggle button cannot be clicked or selected.
- example:
```jsx
<StorybookComponents.Stack>
  <ToggleButton labelValue="Default" labelPlacement="bottom">
    <Icons.CropRotate />
  </ToggleButton>
  <ToggleButton labelValue="Selected" selected labelPlacement="bottom">
    <Icons.CropRotate />
  </ToggleButton>
  <ToggleButton labelValue="Disabled" disabled labelPlacement="bottom">
    <Icons.CropRotate />
  </ToggleButton>
</StorybookComponents.Stack>;
```

## Developer Examples

### Custom HTML tag
- description: Render toggle button as any given HTML tag with `as` prop. For example, it can be rendered as: - `<a>` when attributes like href, target, etc., are needed. - `<Link>` when props like to, replace, etc. are needed. All attributes will be passed to the rendered HTML tag.
- example:
```jsx
() => {
  const ReactRouterLink = (props) => <div {...props} />;
  return (
    <StorybookComponents.Stack>
      <ToggleButton
        as="a"
        href="https://www.wix.com"
        target="_blank"
        labelValue="Native <a/> tag"
        labelPlacement="bottom"
      >
        <Icons.CropRotate />
      </ToggleButton>

      <ToggleButton
        as={ReactRouterLink}
        to="/home"
        labelValue="React Router <Link/> tag"
        labelPlacement="bottom"
      >
        <Icons.CropRotate />
      </ToggleButton>

      <ToggleButton
        as="button"
        onClick={() => alert('You have clicked on a button!')}
        labelValue="Native <button/> tag"
        labelPlacement="bottom"
      >
        <Icons.CropRotate />
      </ToggleButton>
    </StorybookComponents.Stack>
  );
};
```

## Common Use Case Examples

### Composer interface
- description: Toggle button is one of the main components used in Wix composers. Use it in: - `<ComposerHeader/>` for Undo and Redo actions. - `<ComposerSidebar/>` as built-in button for navigation. - Any other toolbar to show actions or select states.
- example:
```jsx
() => {
  const [selectedSidebar, setSelectedSidebar] = React.useState(0);
  const [publishDate, setPublishDate] = React.useState();

  const items = [
    {
      id: 0,
      label: 'Settings',
      icon: <Icons.Settings />,
    },
    {
      id: 1,
      label: 'Categories',
      icon: <Icons.Category />,
    },
    {
      id: 2,
      label: 'Tags',
      icon: <Icons.Tag />,
    },
  ];

  const handleSidebarClick = (id) => {
    setSelectedSidebar(id);
  };

  const handleCloseSidePanel = () => {
    setSelectedSidebar(null);
  };

  const renderSettingsPanel = () => (
    <SidePanel onCloseButtonClick={handleCloseSidePanel}>
      <SidePanel.Header title="Post Settings"></SidePanel.Header>
      <SidePanel.Content>
        <StorybookComponents.Placeholder>
          <Box
            verticalAlign="middle"
            align="center"
            height="100%"
            width="240px"
          >
            <Text>Settings side panel</Text>
          </Box>
        </StorybookComponents.Placeholder>
      </SidePanel.Content>
    </SidePanel>
  );

  const renderTagPanel = () => (
    <SidePanel onCloseButtonClick={handleCloseSidePanel}>
      <SidePanel.Header title="Tags" />
      <SidePanel.Content>
        <StorybookComponents.Placeholder>
          <Box
            verticalAlign="middle"
            align="center"
            height="100%"
            width="240px"
          >
            <Text>Tags side panel</Text>
          </Box>
        </StorybookComponents.Placeholder>
      </SidePanel.Content>
    </SidePanel>
  );

  const renderCategoryPanel = () => {
    return (
      <SidePanel onCloseButtonClick={handleCloseSidePanel}>
        <SidePanel.Header title="Categories" />
        <SidePanel.Content>
          <StorybookComponents.Placeholder>
            <Box
              verticalAlign="middle"
              align="center"
              height="100%"
              width="240px"
            >
              <Text>Categories side panel</Text>
            </Box>
          </StorybookComponents.Placeholder>
        </SidePanel.Content>
      </SidePanel>
    );
  };

  return (
    <Layout gap={0}>
      <Cell>
        <ComposerHeader backButtonValue="Back">
          <ComposerHeader.Actions justifyContent="flex-end">
            <ToggleButton labelValue="Undo">
              <Icons.Undo />
            </ToggleButton>
            <ToggleButton labelValue="Redo">
              <Icons.Redo />
            </ToggleButton>
          </ComposerHeader.Actions>
          <ComposerHeader.MainActions>
            <Button skin="inverted">Preview</Button>
            <Button>Publish</Button>
          </ComposerHeader.MainActions>
        </ComposerHeader>
      </Cell>
      <Cell>
        <Box direction="vertical">
          <Box gap="0" height="600px">
            <ComposerSidebar
              labelPlacement="bottom"
              items={items}
              selectedId={selectedSidebar}
              onClick={(_, { id }) => handleSidebarClick(id)}
            />

            {selectedSidebar === 0 && renderSettingsPanel()}
            {selectedSidebar === 1 && renderCategoryPanel()}
            {selectedSidebar === 2 && renderTagPanel()}

            <Box backgroundColor="D70" width="100%">
              <Box width="100%" padding={4}>
                <StorybookComponents.Placeholder>
                  <Box verticalAlign="middle" align="center" height="100%">
                    <Text>Composer content</Text>
                  </Box>
                </StorybookComponents.Placeholder>
              </Box>
            </Box>
          </Box>
        </Box>
      </Cell>
    </Layout>
  );
};
```

### Video stream
- description: Use toggle buttons in control toolbars to enable/disable actions like screen sharing.
- example:
```jsx
() => {
  const renderToggleButton = (icon, skin, selected, labelValue) => (
    <ToggleButton
      shape="round"
      selected={selected}
      skin={skin}
      labelValue={labelValue}
      labelPlacement="bottom"
    >
      {icon}
    </ToggleButton>
  );
  return (
    <Box direction="vertical" gap="SP2">
      <StorybookComponents.Placeholder>
        <Box verticalAlign="middle" align="center" height="240px">
          <Text>Video content</Text>
        </Box>
      </StorybookComponents.Placeholder>

      <Box align="space-between">
        <Box gap="SP2" width="180px">
          {renderToggleButton(<Icons.Microphone />, '', false, 'Mute')}
          {renderToggleButton(<Icons.VideoCamera />, '', false, 'Stop video')}
        </Box>
        <Box gap="SP2" width="180px" align="center">
          {renderToggleButton(
            <Icons.Desktop />,
            'success',
            true,
            'Share screen',
          )}
        </Box>
        <Box gap="SP2" width="180px" align="right">
          {renderToggleButton(<Icons.Exit />, 'destructive', true, 'Leave')}
        </Box>
      </Box>
    </Box>
  );
};
```

### Switch between states
- description: Use toggle buttons as selectors that switch between two states.
- example:
```jsx
() => {
  const [selectedButtonToast, setSelectedButtonToast] = React.useState(false);
  const [selectedButtonPasta, setSelectedButtonPasta] = React.useState(false);
  const [selectedButtonPaella, setSelectedButtonPaella] = React.useState(false);

  return (
    <Box gap="SP4">
      <Proportion aspectRatio={1}>
        <MediaOverlay skin="gradient" media="FoodExample1.jpg">
          <MediaOverlay.Content placement="top-start" visible="always">
            <ToggleButton
              shape="pill"
              labelValue={selectedButtonToast ? 'Favorite' : 'Mark as Favorite'}
              size="tiny"
              selected={selectedButtonToast}
              onClick={() => setSelectedButtonToast(!selectedButtonToast)}
            >
              {selectedButtonToast ? (
                <Icons.FavoriteFilled />
              ) : (
                <Icons.Favorite />
              )}
            </ToggleButton>
          </MediaOverlay.Content>
          <MediaOverlay.Content placement="bottom-start" visible="always">
            <Text size="small" weight="normal" light>
              Breakfast toast
            </Text>
          </MediaOverlay.Content>
        </MediaOverlay>
      </Proportion>
      <Proportion aspectRatio={1}>
        <MediaOverlay skin="gradient" media="FoodExample2.jpg">
          <MediaOverlay.Content placement="top-start" visible="always">
            <ToggleButton
              shape="pill"
              labelValue={selectedButtonPasta ? 'Favorite' : 'Mark as Favorite'}
              size="tiny"
              selected={selectedButtonPasta}
              onClick={() => setSelectedButtonPasta(!selectedButtonPasta)}
            >
              {selectedButtonPasta ? (
                <Icons.FavoriteFilled />
              ) : (
                <Icons.Favorite />
              )}
            </ToggleButton>
          </MediaOverlay.Content>
          <MediaOverlay.Content placement="bottom-start" visible="always">
            <Text size="small" weight="normal" light>
              Lemon Ricotta Pasta
            </Text>
          </MediaOverlay.Content>
        </MediaOverlay>
      </Proportion>
      <Proportion aspectRatio={1}>
        <MediaOverlay skin="gradient" media="FoodExample3.jpg">
          <MediaOverlay.Content placement="top-start" visible="always">
            <ToggleButton
              shape="pill"
              labelValue={
                selectedButtonPaella ? 'Favorite' : 'Mark as Favorite'
              }
              size="tiny"
              selected={selectedButtonPaella}
              onClick={() => setSelectedButtonPaella(!selectedButtonPaella)}
            >
              {selectedButtonPaella ? (
                <Icons.FavoriteFilled />
              ) : (
                <Icons.Favorite />
              )}
            </ToggleButton>
          </MediaOverlay.Content>
          <MediaOverlay.Content placement="bottom-start" visible="always">
            <Text size="small" weight="normal" light>
              Spanish Paella
            </Text>
          </MediaOverlay.Content>
        </MediaOverlay>
      </Proportion>
    </Box>
  );
};
```
