RootUI
Button

Button

Primitive button component.

<Button>Hello, World!</Button>

Note: The display property has been changed from inline-block to inline-flex to allow for proper child alignment. Keep this in mind when using flex parents.


Props

alignContent

alignContent?: "left" | "center" | "right"

Align content within the button.

Default is "center".

Note: Button is an inline-flex element, so setting alignContent won't visually show its effect without adding extra width (like adding the block prop).

<Button alignContent="left" block>Left</Button>
<Button alignContent="center" block>Center</Button>
<Button alignContent="right" block>Right</Button>

as

as?: "button" | "a" | Link

The as prop allows you to render a button as a different HTML element or component. Currently, the following values are supported: "button", "a", and Link.

Defaults to "button".

as="button"

Render as a button element.

<Button as="button">Hello, World!</Button>

as="a"

Render as an anchor element.

<Button as="a" href="https://remix.run/" target="_blank">
  Open remix.run
</Button>

Render as a react-router Link component. Remix is used here, but you can use react-router-dom instead. Element must be passed in.

<Button as={Link} to="/">
  Go to home
</Button>

block

block?: boolean

The block prop makes the button take up the full width of its container.

width: 100% and display: block are applied to the button.

<Button block>Block</Button>

disabled

disabled?: boolean

As the name suggests, the disabled prop disables the button. The button becomes non-interactive.

<Button>Enabled</Button>
<Button disabled>Disabled</Button>

formSize

formSize?: "sm" | "md" | "lg"

Controls the size of the button. Default is "md".

<Button formSize="sm">Small</Button>
<Button formSize="md">Medium</Button>
<Button formSize="lg">Large</Button>

iconLeft

iconLeft?: Icons | IconProps | React.ReactNode;

Icon to be displayed on the left side of the button.

<Button iconLeft="star">Icon left</Button>

iconOnly

iconOnly?: Icons | IconProps | React.ReactNode;

Changes button to be a square icon-only button. Children and other icons are ignored.

<Button iconOnly="star">Icon left</Button>

iconRight

iconRight?: Icons | IconProps | React.ReactNode;

Icon to be displayed on the right side of the button.

<Button iconRight="star">Icon right</Button>

intent

intent?:
  | "primary"
  | "secondary"
  | "secondaryColor"
  | "outline"
  | "tertiary"
  | "listItem";

The intent prop is used to style the button based on its purpose. Defaults to secondary.

<Button intent="primary">Primary</Button>
<Button intent="secondary">Secondary</Button>
<Button intent="secondaryColor">Secondary Color</Button>
<Button intent="outline">Outline</Button>
<Button intent="tertiary">Tertiary</Button>
<Button intent="listItem">List Item</Button>

isActive

isActive?: boolean;

isActive is a manual way of setting the "active" state of the button. The style is the same as its "active" (pressed) state.

This prop is useful in scenarios where you need to manually set the active state of the button, such as when the button is a dropdown trigger and the dropdown is open.

<div className="flex gap-2">
  <Button>Normal state</Button>
  <Button isActive>Active state</Button>
</div>

isLoading

isLoading?: boolean;

Adds a loading spinner to the button. The button is disabled while loading. iconLeft and iconOnly icons are replaced with the loader.

<Button isLoading>Regular</Button>
<Button iconOnly="star" isLoading />
<Button iconLeft="star" iconRight="star" isLoading>
  With Icons
</Button>