> ## Documentation Index
> Fetch the complete documentation index at: https://docs.twenty.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Callout

> Feedback with node content, actions, and caller-owned dismissal.

export const StoryEmbed = ({storyId, title, height = 120}) => <>
    <Tabs>
      <Tab title="Light">
        <iframe title={`${title} (light)`} src={`https://storybook.twenty.com/iframe.html?id=${storyId}&viewMode=story&globals=colorScheme:light`} width="100%" height={height} loading="lazy" allow="clipboard-write" style={{
  border: 0
}} />
      </Tab>
      <Tab title="Dark">
        <iframe title={`${title} (dark)`} src={`https://storybook.twenty.com/iframe.html?id=${storyId}&viewMode=story&globals=colorScheme:dark`} width="100%" height={height} loading="lazy" allow="clipboard-write" style={{
  border: 0
}} />
      </Tab>
    </Tabs>
    <a href={`https://storybook.twenty.com/?path=/story/${storyId}`}>
      Open in Storybook
    </a>
  </>;

`Callout` combines title, description, icon, and action nodes. Use `status` for `neutral`, `info`, `success`, `warning`, or `error`. It defaults to `info` and supports the `soft` appearance. The status selects a gray, blue, green, orange, or red palette; `color` overrides that palette without changing the meaning.

<StoryEmbed storyId="ui-feedback-callout--display" title="Callout example" height={230} />

## Usage

```tsx theme={null}
import { Callout } from 'twenty-ui/components/feedback';

export const WorkflowNotice = () => (
  <Callout
    status="neutral"
    title="This form will appear in workflow runs."
    description="Because this workflow is not using a manual trigger, the form will not open on top of the interface. To fill it, open the corresponding workflow run and complete the form there."
    action={<Callout.Action>Learn more</Callout.Action>}
  />
);
```

## Visual options

Compare semantic statuses using the same content. Choose a status for the message meaning, and override color only when the surrounding design requires it.

<StoryEmbed storyId="ui-feedback-callout--catalog" title="Callout feedback statuses" height={1010} />

## Dismissible notice

```tsx theme={null}
import { useState } from 'react';
import { Callout } from 'twenty-ui/components/feedback';
import { IconAlertTriangle } from 'twenty-ui/icon';
import { Button } from 'twenty-ui/primitives/input';

export const ImportNotice = ({ onReview }: { onReview: () => void }) => {
  const [isVisible, setIsVisible] = useState(true);

  return (
    <>
      {isVisible && (
        <Callout
          status="warning"
          title="Some records need attention"
          description="Review the missing email addresses before importing."
          icon={<IconAlertTriangle size={16} aria-hidden="true" />}
          action={
            <Callout.Action onClick={onReview}>Review records</Callout.Action>
          }
          onDismiss={() => setIsVisible(false)}
          closeLabel="Dismiss import notice"
        />
      )}
      <Button onClick={() => setIsVisible(true)}>Show notice</Button>
    </>
  );
};
```

## Dismissal and labels

Passing `onDismiss` exposes an accessible close button. Each pointer or keyboard activation calls it once. The callout remains rendered until its caller hides it. Omit `onDismiss` for a persistent message. `closeLabel` defaults to `Close`.

Your application owns the content, actions, accessible names, and translations. Use `Callout.Action` for a small ghost button with regular font weight. It accepts Button props, including link attributes, disabled state, refs, and custom rendering; size and appearance are fixed. The action slot also accepts custom buttons, links, disabled controls, or multiple nodes. The default help icon is decorative; pass `icon={null}` to omit it or supply a node with appropriate accessible semantics. Twenty UI does not require an i18n provider.

## Native integration

Native attributes, `className`, `style`, and `ref` target the root `div`. Use `render` to compose a different root element or a callback receiving the root props and `{ status, variant, color }`. `title` and `description` are content slots. `fullWidth` removes the default 512px maximum width.

The component adds no live-region role or announcements. Supply native `role`, `aria-live`, and other accessible attributes when the surrounding workflow requires them.

## Migration

Replace the previous semantic `variant` with `status`, and constructor `Icon` with an `icon` node. Replace `{ label, onClick }` action objects with `Callout.Action` or custom controls. Replace `isClosable` and `onClose` with `onDismiss`, and conditionally render the callout in the caller when dismissal should hide it. Existing translated content and action labels stay in the application.

## Props

<ParamField body="action" type="ReactNode">
  Optional footer node. Use Callout.Action for the standard action or supply custom controls.
</ParamField>

<ParamField body="className" type="string">
  Additional class names merged onto the root.
</ParamField>

<ParamField body="closeLabel" type="string" default="Close">
  Accessible name of the dismiss button. Defaults to `Close`.
</ParamField>

<ParamField body="color" type="&#x22;blue&#x22; | &#x22;gray&#x22; | &#x22;green&#x22; | &#x22;orange&#x22; | &#x22;red&#x22;" default="status palette">
  Palette override: gray, blue, green, orange, or red. Defaults to the status palette.
</ParamField>

<ParamField body="description" type="ReactNode">
  Optional supporting content node. Empty slots are hidden.
</ParamField>

<ParamField body="fullWidth" type="boolean" default="false">
  Removes the default 512px maximum width.
</ParamField>

<ParamField body="icon" type="ReactNode" default="decorative help icon">
  Leading icon node. Defaults to a decorative help icon. Pass null to omit it.
</ParamField>

<ParamField body="onDismiss" type="(() => void)">
  Shows a dismiss button and notifies the caller once per activation. The caller owns visibility.
</ParamField>

<ParamField body="ref" type="Ref<HTMLDivElement>">
  Ref to the root div, or the element supplied through render.
</ParamField>

<ParamField body="render" type="ReactElement<unknown, string | JSXElementConstructor<any>> | ComponentRenderFn<HTMLProps, CalloutState>">
  Element or callback composition for the root. Receives status, variant, and color state.
</ParamField>

<ParamField body="status" type="&#x22;error&#x22; | &#x22;info&#x22; | &#x22;neutral&#x22; | &#x22;success&#x22; | &#x22;warning&#x22;" default="info">
  Feedback meaning: neutral, info, success, warning, or error. Defaults to info.
</ParamField>

<ParamField body="style" type="CSSProperties">
  Inline styles forwarded to the root.
</ParamField>

<ParamField body="title" type="ReactNode" required>
  Main message node displayed beside the icon.
</ParamField>

<ParamField body="variant" type="&#x22;soft&#x22;" default="soft">
  Supported appearance: soft.
</ParamField>

### Callout.Action

<ParamField body="Action.className" type="string | ((state: ButtonState) => string | undefined)">
  CSS class applied to the element, or a function that
  returns a class based on the component's state.
</ParamField>

<ParamField body="Action.color" type="&#x22;accent&#x22; | &#x22;danger&#x22; | &#x22;neutral&#x22; | &#x22;success&#x22;">
  Semantic color of the button.
</ParamField>

<ParamField body="Action.elevated" type="boolean">
  Adds a shadow and backdrop blur. Neutral outline buttons also use elevated surface colors.
</ParamField>

<ParamField body="Action.endIcon" type="ReactNode">
  Decorative content displayed after the label.
</ParamField>

<ParamField body="Action.focusableWhenDisabled" type="boolean" default="false">
  Whether the button should be focusable when disabled.
</ParamField>

<ParamField body="Action.fullWidth" type="boolean">
  Expands the button to fill its container width.
</ParamField>

<ParamField body="Action.href" type="string">
  Destination URL. Renders a native anchor when `render` is omitted unless `nativeButton` is explicitly true. Custom renderers retain their own element contract.
</ParamField>

<ParamField body="Action.loading" type="boolean">
  Shows a loading indicator and disables activation.
</ParamField>

<ParamField body="Action.loadingPosition" type="&#x22;center&#x22; | &#x22;end&#x22; | &#x22;start&#x22;">
  Where the loading indicator appears. `center` hides the content while preserving its layout space; `start` and `end` keep children and the opposite icon visible and replace the corresponding icon with the spinner.
</ParamField>

<ParamField body="Action.nativeButton" type="boolean" default="true">
  Whether the rendered root is a native button. Defaults to true for custom renderers. The built-in `href` anchor defaults to false; an explicit value takes precedence.
</ParamField>

<ParamField body="Action.render" type="ReactElement<unknown, string | JSXElementConstructor<any>> | ComponentRenderFn<HTMLProps, ButtonState>">
  Caller-supplied root element or renderer. Native attributes, handlers, event details, and refs reach the rendered root. Use `nativeButton={false}` and `role="link"` for a custom navigation anchor. Router integration belongs to the caller.
</ParamField>

<ParamField body="Action.role" type="AriaRole">
  Role of the root element. Use `link` for custom navigation renderers.
</ParamField>

<ParamField body="Action.shortcut" type="ShortcutDefinition">
  Flat key array for simultaneous keys, or nested key arrays for an ordered sequence. Displayed on non-mobile screens.
</ParamField>

<ParamField body="Action.shortcutJoinLabel" type="string">
  Localized text between sequence steps. Defaults to then.
</ParamField>

<ParamField body="Action.startIcon" type="ReactNode">
  Decorative content displayed before the label.
</ParamField>

<ParamField body="Action.style" type="CSSProperties | ((state: ButtonState) => CSSProperties | undefined)">
  Style applied to the element, or a function that
  returns a style object based on the component's state.
</ParamField>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.