# Button (/components/actions/button)



`Button` triggers an action, such as saving a form, opening a dialog, or deleting an item. Use
[`Link`](/components/actions/link) when the interaction takes someone to another URL or route.

apps/docs/src/examples/button/basic.tsx

```tsx
import { Button } from '@luke-ui/react/button';

export default () => {
	return <Button>Save changes</Button>;
};
```

## Best practices [#best-practices]

| Guidance | Practices                                                                                                     |
| -------- | ------------------------------------------------------------------------------------------------------------- |
| Do       | Use `Button` for an action, such as saving, submitting, or opening a dialog.                                  |
| Do       | Use [`Link`](/components/actions/link) with an `href` when the interaction navigates to another URL or route. |
| Don't    | Navigate from a `Button`. It loses native link semantics and browser link behaviours.                         |

## Size [#size]

`medium` is the default size. Use `small` in dense toolbars, tables, and other compact interfaces.
Keep related controls at the same size.

apps/docs/src/examples/button/sizes.tsx

```tsx
import { Button } from '@luke-ui/react/button';
import { Comparison, ComparisonItem } from '#docs';

export default () => {
	return (
		<Comparison>
			<ComparisonItem label="Small">
				<Button size="small">Save changes</Button>
			</ComparisonItem>
			<ComparisonItem label="Medium">
				<Button size="medium">Save changes</Button>
			</ComparisonItem>
		</Comparison>
	);
};
```

## Appearance [#appearance]

`button` is the default appearance. It has control sizing, truncates its label, and supports content
slots. Set `appearance="text"` when an action should use text-link presentation. Text Buttons wrap
and do not support a size, block layout, or content slots.

apps/docs/src/examples/button/appearance.tsx

```tsx
import { Button } from '@luke-ui/react/button';
import { Comparison, ComparisonItem } from '#docs';

export default () => {
	return (
		<Comparison>
			<ComparisonItem label="Button">
				<Button>Save changes</Button>
			</ComparisonItem>
			<ComparisonItem label="Text">
				<Button appearance="text">Save changes</Button>
			</ComparisonItem>
		</Comparison>
	);
};
```

## Tone [#tone]

`neutral` is the default tone for ordinary actions. Set `tone="critical"` for destructive actions.

apps/docs/src/examples/button/tones.tsx

```tsx
import { Button } from '@luke-ui/react/button';
import { Comparison, ComparisonItem } from '#docs';

export default () => {
	return (
		<Comparison>
			<ComparisonItem label="Neutral">
				<Button tone="neutral">Save changes</Button>
			</ComparisonItem>
			<ComparisonItem label="Critical">
				<Button tone="critical">Delete draft</Button>
			</ComparisonItem>
		</Comparison>
	);
};
```

## Prominence [#prominence]

`standard` is the default. Choose `low` for quiet secondary actions and `high` for the primary
action in a group. For ordinary actions, high prominence uses the theme’s primary accent treatment.

apps/docs/src/examples/button/prominence.tsx

```tsx
import { Button } from '@luke-ui/react/button';
import { Comparison, ComparisonItem } from '#docs';

export default () => {
	return (
		<Comparison>
			<ComparisonItem label="Low">
				<Button prominence="low">Save changes</Button>
			</ComparisonItem>
			<ComparisonItem label="Standard">
				<Button>Save changes</Button>
			</ComparisonItem>
			<ComparisonItem label="High">
				<Button prominence="high">Save changes</Button>
			</ComparisonItem>
		</Comparison>
	);
};
```

## Presentation reference [#presentation-reference]

apps/docs/src/examples/button/presentation-reference.tsx

```tsx
import { Box } from '@luke-ui/react/box';
import { Button } from '@luke-ui/react/button';
import { Text } from '@luke-ui/react/text';
import { Comparison, ComparisonItem } from '#docs';

export default () => {
	return (
		<Box display="grid" gap="sp24">
			<Box display="grid" gap="sp8">
				<Text typography="label">Button</Text>
				<Comparison>
					<ComparisonItem label="Neutral · Low">
						<Button prominence="low">Button</Button>
					</ComparisonItem>
					<ComparisonItem label="Neutral · Standard">
						<Button>Button</Button>
					</ComparisonItem>
					<ComparisonItem label="Neutral · High">
						<Button prominence="high">Button</Button>
					</ComparisonItem>
					<ComparisonItem label="Critical · Low">
						<Button tone="critical" prominence="low">
							Button
						</Button>
					</ComparisonItem>
					<ComparisonItem label="Critical · Standard">
						<Button tone="critical">Button</Button>
					</ComparisonItem>
					<ComparisonItem label="Critical · High">
						<Button tone="critical" prominence="high">
							Button
						</Button>
					</ComparisonItem>
				</Comparison>
			</Box>
			<Box display="grid" gap="sp8">
				<Text typography="label">Text</Text>
				<Comparison>
					<ComparisonItem label="Neutral · Low">
						<Button appearance="text" prominence="low">
							Button
						</Button>
					</ComparisonItem>
					<ComparisonItem label="Neutral · Standard">
						<Button appearance="text">Button</Button>
					</ComparisonItem>
					<ComparisonItem label="Neutral · High">
						<Button appearance="text" prominence="high">
							Button
						</Button>
					</ComparisonItem>
					<ComparisonItem label="Critical · Low">
						<Button appearance="text" tone="critical" prominence="low">
							Button
						</Button>
					</ComparisonItem>
					<ComparisonItem label="Critical · Standard">
						<Button appearance="text" tone="critical">
							Button
						</Button>
					</ComparisonItem>
				</Comparison>
			</Box>
		</Box>
	);
};
```

## Block layout [#block-layout]

Set `isBlock` when the button should fill the inline size of its container. A typical case is a
primary action at the end of a narrow form or panel.

apps/docs/src/examples/button/block-layout.tsx

```tsx
import { Button } from '@luke-ui/react/button';
import { Stack } from '@luke-ui/react/stack';

export default () => {
	return (
		<Stack maxInlineSize="20rem">
			<Button isBlock>Continue</Button>
		</Stack>
	);
};
```

## Content slots [#content-slots]

Use `startContent` or `endContent` for non-interactive adornments beside the label, such as an icon,
badge, count, or keyboard hint. Nested interactive controls are unsupported. `Button` sizes nested
icons for you, so an `Icon` needs no `size` prop. Pass one only to override it. Use
[`IconButton`](/components/actions/icon-button) only when the icon is familiar without a text label.

apps/docs/src/examples/button/content-slots.tsx

```tsx
import { Button } from '@luke-ui/react/button';
import { Cluster } from '@luke-ui/react/cluster';
import { Icon } from '@luke-ui/react/icon';
import { Kbd } from '@luke-ui/react/kbd';

export default () => {
	return (
		<Cluster alignItems="center" gap="sp16">
			<Button startContent={<Icon name="add" />}>Add item</Button>
			<Button endContent={<Kbd>⌘S</Kbd>}>Save</Button>
		</Cluster>
	);
};
```

## Pending and Actions [#pending-and-actions]

`onPress` handles the interaction. `pressAction` performs the resulting operation. When both are
set, `onPress` runs first, then `pressAction`.

Prefer a native form Action when the operation is a form submission. Pass the form’s pending state
to `Button`. This example uses React’s
[`useActionState`](https://react.dev/reference/react/useActionState).

apps/docs/src/examples/button/form-action.tsx

```tsx
import { Button } from '@luke-ui/react/button';
import { useActionState } from 'react';

export default () => {
	const [, formAction, isPending] = useActionState(save, null);

	return (
		<form action={formAction}>
			<Button isPending={isPending} type="submit">
				Save
			</Button>
		</form>
	);
};

async function save(_state: null, _formData: FormData) {
	await new Promise((resolve) => {
		setTimeout(resolve, 1200);
	});

	return null;
}
```

Use `pressAction` for Button-owned operations that are not form submissions. Combining `pressAction`
with `type="submit"` is usually the wrong pattern, because both paths may run.

`pressAction` creates pending state automatically. Explicit `isPending` shows a spinner immediately.
An Action-owned spinner waits briefly so a fast Action never flashes one.

apps/docs/src/examples/button/pending.tsx

```tsx
import { Button } from '@luke-ui/react/button';

export default () => {
	return <Button pressAction={save}>Save changes</Button>;
};

async function save() {
	await new Promise((resolve) => {
		setTimeout(resolve, 1200);
	});
}
```

Set `isPending` for externally owned pending state, such as a parent mutation or router transition.
Pending buttons stay focusable and ignore further presses.

apps/docs/src/examples/button/external-pending.tsx

```tsx
import { Button } from '@luke-ui/react/button';

export default () => {
	return <Button isPending>Save changes</Button>;
};
```

Unexpected failures from `pressAction` use React’s normal Action and Error Boundary behaviour.
Handle expected domain errors inside the Action.

apps/docs/src/examples/button/action-error.tsx

```tsx
import { Button } from '@luke-ui/react/button';
import { Cluster } from '@luke-ui/react/cluster';
import { Stack } from '@luke-ui/react/stack';
import { Text } from '@luke-ui/react/text';
import type { FallbackProps } from 'react-error-boundary';
import { ErrorBoundary } from 'react-error-boundary';

export default () => {
	return (
		<Stack minBlockSize="4.5rem">
			<ErrorBoundary FallbackComponent={ErrorFallback}>
				<Cluster>
					<Button pressAction={save}>Save changes</Button>
				</Cluster>
			</ErrorBoundary>
		</Stack>
	);
};

async function save() {
	await new Promise((resolve) => {
		setTimeout(resolve, 400);
	});
	throw new Error('Could not save changes');
}

function ErrorFallback({ error, resetErrorBoundary }: FallbackProps) {
	const message = error instanceof Error ? error.message : 'Something went wrong';

	return (
		<Stack gap="sp12">
			<Text color="danger" role="alert">
				{message}
			</Text>
			<Cluster>
				<Button onPress={resetErrorBoundary}>Try again</Button>
			</Cluster>
		</Stack>
	);
}
```

## Disabled [#disabled]

Set `isDisabled` only when the action is unavailable. Disabled buttons cannot receive focus or
respond to presses.

apps/docs/src/examples/button/disabled.tsx

```tsx
import { Button } from '@luke-ui/react/button';

export default () => {
	return <Button isDisabled>Edit profile</Button>;
};
```

## Accessibility [#accessibility]

The visible label provides the accessible name, so most buttons do not need `aria-label`. Write a
label that describes the action, such as “Save changes” or “Delete account”, rather than a vague
label such as “OK”.

The spinner is hidden from assistive technology. Pending state is announced through the button’s
pending semantics, so the label does not need to change while pending.

## API [#api]

<ComponentPropsTable
  id="type-table-button.tsx-ButtonProps"
  type="{
  &#x22;id&#x22;: &#x22;button.tsx-ButtonProps&#x22;,
  &#x22;name&#x22;: &#x22;ButtonProps&#x22;,
  &#x22;description&#x22;: &#x22;Props for `Button`.&#x22;,
  &#x22;entries&#x22;: [
    {
      &#x22;name&#x22;: &#x22;aria-label&#x22;,
      &#x22;description&#x22;: &#x22;Defines a string value that labels the current element.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;string | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;string&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;aria-labelledby&#x22;,
      &#x22;description&#x22;: &#x22;Identifies the element (or elements) that labels the current element.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;string | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;string&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;aria-describedby&#x22;,
      &#x22;description&#x22;: &#x22;Identifies the element (or elements) that describes the object.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;string | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;string&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;aria-details&#x22;,
      &#x22;description&#x22;: &#x22;Identifies the element (or elements) that provide a detailed, extended description for the\nobject.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;string | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;string&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;id&#x22;,
      &#x22;description&#x22;: &#x22;The element's unique identifier. See\n[MDN](https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes/id).&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;string | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;string&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;onKeyDown&#x22;,
      &#x22;description&#x22;: &#x22;Handler that is called when a key is pressed.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;((e: KeyboardEvent) => void) | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;function&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;onKeyUp&#x22;,
      &#x22;description&#x22;: &#x22;Handler that is called when a key is released.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;((e: KeyboardEvent) => void) | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;function&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;onFocus&#x22;,
      &#x22;description&#x22;: &#x22;Handler that is called when the element receives focus.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;((e: React.FocusEvent<Element, Element>) => void) | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;function&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;onBlur&#x22;,
      &#x22;description&#x22;: &#x22;Handler that is called when the element loses focus.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;((e: React.FocusEvent<Element, Element>) => void) | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;function&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;onFocusChange&#x22;,
      &#x22;description&#x22;: &#x22;Handler that is called when the element's focus status changes.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;((isFocused: boolean) => void) | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;function&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;onHoverStart&#x22;,
      &#x22;description&#x22;: &#x22;Handler that is called when a hover interaction starts.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;((e: HoverEvent) => void) | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;function&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;onHoverEnd&#x22;,
      &#x22;description&#x22;: &#x22;Handler that is called when a hover interaction ends.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;((e: HoverEvent) => void) | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;function&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;onHoverChange&#x22;,
      &#x22;description&#x22;: &#x22;Handler that is called when the hover state changes.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;((isHovering: boolean) => void) | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;function&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;onPressStart&#x22;,
      &#x22;description&#x22;: &#x22;Handler that is called when a press interaction starts.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;((e: PressEvent) => void) | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;function&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;onPressEnd&#x22;,
      &#x22;description&#x22;: &#x22;Handler that is called when a press interaction ends, either\nover the target or when the pointer leaves the target.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;((e: PressEvent) => void) | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;function&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;onPressChange&#x22;,
      &#x22;description&#x22;: &#x22;Handler that is called when the press state changes.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;((isPressed: boolean) => void) | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;function&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;onPressUp&#x22;,
      &#x22;description&#x22;: &#x22;Handler that is called when a press is released over the target, regardless of\nwhether it started on the target or not.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;((e: PressEvent) => void) | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;function&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;autoFocus&#x22;,
      &#x22;description&#x22;: &#x22;Whether the element should receive focus on render.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;boolean | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;children&#x22;,
      &#x22;description&#x22;: &#x22;The children of the component. A function may be provided to alter the children based on\ncomponent state.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;ChildrenOrFunction<ButtonRenderProps>&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;ChildrenOrFunction<object>&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;slot&#x22;,
      &#x22;description&#x22;: &#x22;A slot name for the component. Slots allow the component to receive props from a parent\ncomponent. An explicit `null` value indicates that the local props completely override all\nprops received from a parent.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;string | null | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;render&#x22;,
      &#x22;description&#x22;: &#x22;Overrides the default DOM element with a custom render function.\nThis allows rendering existing components with built-in styles and behaviors\nsuch as router links, animation libraries, and pre-styled components.\n\nRequirements:\n\n- You must render the expected element type (e.g. if `<button>` is expected, you cannot render an\n  `<a>`).\n- Only a single root DOM element can be rendered (no fragments).\n- You must pass through props and ref to the underlying DOM element, merging with your own prop\n  as appropriate.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;DOMRenderFunction<\&#x22;button\&#x22;, ButtonRenderProps> | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;DOMRenderFunction<\&#x22;button\&#x22;, object>&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;appearance&#x22;,
      &#x22;description&#x22;: &#x22;Sets whether the control uses button or text-link styling.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;button&#x22;
        },
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;button&#x22;
        },
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;button&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;\&#x22;button\&#x22; | \&#x22;text\&#x22; | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;isBlock&#x22;,
      &#x22;description&#x22;: &#x22;Whether the control fills the available inline size.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;false&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;boolean | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;prominence&#x22;,
      &#x22;description&#x22;: &#x22;Controls the strength of the control's visual treatment, from low to high.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;standard&#x22;
        },
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;standard&#x22;
        },
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;standard&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;Prominence | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;size&#x22;,
      &#x22;description&#x22;: &#x22;Sets the size of the control.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;medium&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;\&#x22;medium\&#x22; | \&#x22;small\&#x22; | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;tone&#x22;,
      &#x22;description&#x22;: &#x22;Sets the visual tone. Use `critical` for destructive actions.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;neutral&#x22;
        },
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;neutral&#x22;
        },
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;neutral&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;\&#x22;critical\&#x22; | \&#x22;neutral\&#x22; | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;isDisabled&#x22;,
      &#x22;description&#x22;: &#x22;Whether the button is disabled. Disabled buttons can't be focused or pressed.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;false&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;boolean | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;onPress&#x22;,
      &#x22;description&#x22;: &#x22;Press handler. Called on click, Enter, or Space.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;((e: PressEvent) => void) | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;function&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;type&#x22;,
      &#x22;description&#x22;: &#x22;HTML button type.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;\&#x22;button\&#x22; | \&#x22;reset\&#x22; | \&#x22;submit\&#x22; | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;ref&#x22;,
      &#x22;description&#x22;: &#x22;Ref forwarded to the underlying button element.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;React.Ref<HTMLButtonElement> | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;endContent&#x22;,
      &#x22;description&#x22;: &#x22;Non-interactive adornment shown after the label.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;ReactNode&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;ReactNode&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;startContent&#x22;,
      &#x22;description&#x22;: &#x22;Non-interactive adornment shown before the label.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;ReactNode&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;ReactNode&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;isPending&#x22;,
      &#x22;description&#x22;: &#x22;Externally owned pending state. When true, the button is non-interactive and shows a spinner\nimmediately. Prefer `pressAction` for Button-owned operations.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;false&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;boolean | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;name&#x22;: &#x22;pressAction&#x22;,
      &#x22;description&#x22;: &#x22;Button-owned operation run as a React Action. The button becomes pending automatically until\nthe Action settles. `onPress` handles the interaction. `pressAction` performs the resulting\noperation. Prefer a native `<form action>` when the operation is a form submission.&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;PressAction | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;PressAction&#x22;,
      &#x22;required&#x22;: false,
      &#x22;deprecated&#x22;: false
    },
    {
      &#x22;deprecated&#x22;: false,
      &#x22;description&#x22;: &#x22;`ButtonProps` also accepts compatible DOM and ARIA attributes and event handlers for its rendered element.&#x22;,
      &#x22;name&#x22;: &#x22;__nativePropsForwarding&#x22;,
      &#x22;required&#x22;: true,
      &#x22;simplifiedType&#x22;: &#x22;&#x22;,
      &#x22;tags&#x22;: [],
      &#x22;type&#x22;: &#x22;&#x22;
    }
  ]
}"
/>
