<!--
    Licensed to the Apache Software Foundation (ASF) under one
    or more contributor license agreements.  See the NOTICE file
    distributed with this work for additional information
    regarding copyright ownership.  The ASF licenses this file
    to you under the Apache License, Version 2.0 (the
    "License"); you may not use this file except in compliance
    with the License.  You may obtain a copy of the License at

      http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing,
    software distributed under the License is distributed on an
    "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
    KIND, either express or implied.  See the License for the
    specific language governing permissions and limitations
    under the License.
-->
---
title: Button Component
sidebar_position: 1
---

import { StoryExample, StoryWithControls } from '../../../src/components/StorybookWrapper';
import { Button } from '../../../superset-frontend/packages/superset-ui-core/src/components/Button';

# Button Component

The Button component is a fundamental UI element used throughout Superset for user interactions.

## Basic Usage

The default button with primary styling:
<StoryExample
  component={() => (
    <Button buttonStyle="primary" onClick={() => console.log('Clicked!')}>
      Click Me
    </Button>
  )}
/>

## Interactive Example

<StoryWithControls
  component={({ buttonStyle, buttonSize, label, disabled }) => (
    <Button
      buttonStyle={buttonStyle}
      buttonSize={buttonSize}
      disabled={disabled}
      onClick={() => console.log('Clicked!')}
    >
      {label}
    </Button>
  )}
  props={{
    buttonStyle: 'primary',
    buttonSize: 'default',
    label: 'Click Me',
    disabled: false
  }}
  controls={[
    {
      name: 'buttonStyle',
      label: 'Button Style',
      type: 'select',
      options: ['primary', 'secondary', 'tertiary', 'success', 'warning', 'danger', 'default', 'link', 'dashed']
    },
    {
      name: 'buttonSize',
      label: 'Button Size',
      type: 'select',
      options: ['default', 'small', 'xsmall']
    },
    {
      name: 'label',
      label: 'Button Text',
      type: 'text'
    },
    {
      name: 'disabled',
      label: 'Disabled',
      type: 'boolean'
    }
  ]}
/>

## Props

| Prop | Type | Default | Description |
|------|------|---------|-------------|
| `buttonStyle` | `'primary' \| 'secondary' \| 'tertiary' \| 'success' \| 'warning' \| 'danger' \| 'default' \| 'link' \| 'dashed'` | `'default'` | Button style |
| `buttonSize` | `'default' \| 'small' \| 'xsmall'` | `'default'` | Button size |
| `disabled` | `boolean` | `false` | Whether the button is disabled |
| `cta` | `boolean` | `false` | Whether the button is a call-to-action button |
| `tooltip` | `ReactNode` | - | Tooltip content |
| `placement` | `TooltipProps['placement']` | - | Tooltip placement |
| `onClick` | `function` | - | Callback when button is clicked |
| `href` | `string` | - | Turns button into an anchor link |
| `target` | `string` | - | Target attribute for anchor links |

## Usage

```jsx
import Button from 'src/components/Button';

function MyComponent() {
  return (
    <Button
      buttonStyle="primary"
      onClick={() => console.log('Button clicked')}
    >
      Click Me
    </Button>
  );
}
```

## Button Styles

Superset provides a variety of button styles for different purposes:

- **Primary**: Used for primary actions
- **Secondary**: Used for secondary actions
- **Tertiary**: Used for less important actions
- **Success**: Used for successful or confirming actions
- **Warning**: Used for actions that require caution
- **Danger**: Used for destructive actions
- **Link**: Used for navigation
- **Dashed**: Used for adding new items or features

## Button Sizes

Buttons come in three sizes:

- **Default**: Standard size for most use cases
- **Small**: Compact size for tight spaces
- **XSmall**: Extra small size for very limited spaces

## Best Practices

- Use primary buttons for the main action in a form or page
- Use secondary buttons for alternative actions
- Use danger buttons for destructive actions
- Limit the number of primary buttons on a page to avoid confusion
- Use consistent button styles throughout your application
- Add tooltips to buttons when their purpose might not be immediately clear
