# 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/comparison';

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

## Appearance [#appearance]

Use `appearance` to set a button's visual weight. `solid` is the default. Choose `subtle` or `ghost`
for secondary actions that should recede beside the main action. Appearance sets emphasis. Use
`tone` to communicate intent.

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

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

export default () => {
	return (
		<Comparison>
			<ComparisonItem label="Solid">
				<Button appearance="solid">Example button</Button>
			</ComparisonItem>
			<ComparisonItem label="Subtle">
				<Button appearance="subtle">Example button</Button>
			</ComparisonItem>
			<ComparisonItem label="Ghost">
				<Button appearance="ghost">Example button</Button>
			</ComparisonItem>
		</Comparison>
	);
};
```

## Tone [#tone]

Use `tone` to communicate intent. `neutral` is the default, `accent` identifies a primary action,
and `danger` marks a destructive one. Tone and appearance are independent, so every combination is
available.

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

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

export default () => {
	return (
		<Comparison>
			<ComparisonItem label="Neutral">
				<Button tone="neutral">Example button</Button>
			</ComparisonItem>
			<ComparisonItem label="Accent">
				<Button tone="accent">Example button</Button>
			</ComparisonItem>
			<ComparisonItem label="Danger">
				<Button tone="danger">Example button</Button>
			</ComparisonItem>
		</Comparison>
	);
};
```

## 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.

```tsx
<Button isBlock>Continue</Button>
```

## 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 { Box } from '@luke-ui/react/box';
import { Button } from '@luke-ui/react/button';
import { Icon } from '@luke-ui/react/icon';
import { Kbd } from '@luke-ui/react/kbd';

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

## 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 { Box } from '@luke-ui/react/box';
import { Button } from '@luke-ui/react/button';
import { Text } from '@luke-ui/react/text';
import type { FallbackProps } from 'react-error-boundary';
import { ErrorBoundary } from 'react-error-boundary';

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

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 (
		<Box display="flex" flexDirection="column" gap="sp12">
			<Text color="danger" role="alert">
				{message}
			</Text>
			<Button appearance="subtle" onPress={resetErrorBoundary}>
				Try again
			</Button>
		</Box>
	);
}
```

## 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.

## Related components [#related-components]

`Button` is the normal component for application UI. It wraps its label for truncation, provides
content slots, and supplies the pending spinner. Use the
[button primitive](/components/primitives/button) when you need to own the child layout or loading
treatment.

## 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;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;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;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;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;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;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;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;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;Visual emphasis.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;'solid'&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;\&#x22;solid\&#x22; | \&#x22;ghost\&#x22; | \&#x22;subtle\&#x22; | 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, such as an icon, badge, count, or keyboard\nhint. Nested interactive controls are unsupported.&#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;isBlock&#x22;,
      &#x22;description&#x22;: &#x22;Whether the button takes up the full inline size of its container.&#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;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;name&#x22;: &#x22;size&#x22;,
      &#x22;description&#x22;: &#x22;Sets the button size.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;'medium'&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;\&#x22;small\&#x22; | \&#x22;medium\&#x22; | undefined&#x22;,
      &#x22;simplifiedType&#x22;: &#x22;union&#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, such as an icon. Nested interactive controls\nare unsupported.&#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;tone&#x22;,
      &#x22;description&#x22;: &#x22;Visual tone. Controls colour scheme.&#x22;,
      &#x22;tags&#x22;: [
        {
          &#x22;name&#x22;: &#x22;default&#x22;,
          &#x22;text&#x22;: &#x22;'neutral'&#x22;
        }
      ],
      &#x22;type&#x22;: &#x22;\&#x22;neutral\&#x22; | \&#x22;accent\&#x22; | \&#x22;danger\&#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;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;
    }
  ]
}"
/>
