--- title: Button description: Displays a button or a component that looks like a button. featured: true component: true --- ## Usage ```tsx import { Button } from '@/components/ui/button' ``` ```tsx ``` _It is likely that the `type` prop will be changed to `variant` in the future._ ## Link You can use the `buttonVariants` helper to create a link that looks like a button. ```tsx import { buttonVariants } from '@/components/ui/button' ``` ```tsx Click here ``` Alternatively, you can set the `asChild` parameter and nest the link component. ```tsx ``` ## Examples ### Sizes Use the `size` prop to determine the size of the button. ### Types These are all the different `type` variations. #### Primary Used for data insertion actions, confirming purchases, strong positive actions. #### Default Used for opening dialogs, navigating to pages, and other non CRUD actions. This `type` will probably be the most used button type. It will probably be changed to be the default type in future. #### Secondary Can be used for signaling a data or config change, but not as serious as a primary button. For destructive or side effect actions, use the `destructive` or `warning` type. #### Warning Used for actions that might have a side effect, but not as serious as a destructive action. #### Destructive (currently `danger`) Used for actions that will have a serious destructive side effect, like deleting data. prop `type` will probably be changed to `destructive` in the future. #### Outline Used for secondary actions, or actions that are not as important as the primary action. #### Ghost (currently `text`) Used for actions that are not as important as the primary action, or for actions that are not as important as the primary action. prop `type` will probably be changed to `ghost` in the future. #### Link Used for actions that are not as important as the primary action, or for actions that are not as important as the primary action. ### Only an Icon Displaying only an Icon in a button. We should update the button component to support this use case better. ### As Child Supports slot behavior with `asChild` prop. ## Accessibility [Keyboard focus](../accessibility#focus-management) is automatically handled: - Enabled buttons default to `tabIndex={0}` (keyboard accessible) - Disabled buttons default to `tabIndex={-1}` (removed from tab order) - You can still override with an explicit `tabIndex` prop when needed You therefore don't need to manually set `tabIndex`, as Button handles it automatically based on its `disabled` state.