---
title: Alert
description: Alerts surface time-sensitive status without blocking the interface.
category: Feedback
---
import { meta as AlertMeta, Default, InlineWarning, Banner, Dismissible } from '@/content/stories/alert';
import Canvas from '@/components/component-docs/canvas';
import Demo from '@/components/component-docs/demo';
export const config = {
dependencies: {
components: [Canvas, Demo],
scripts: [
'../../components/component-docs/demo.script.tsx',
'../../components/component-docs/canvas.script.tsx',
'../../components/component-docs/controls.script.tsx',
],
},
};
# Alert
Alerts surface time-sensitive status without blocking the interface. Use them for session warnings, sync failures, or confirmations that do not warrant a modal.
## Try it
## Usage
Compose `RuiAlert` with `RuiAlertIcon` and short text for `layout="inline"`, or `RuiAlertTitle` and `RuiAlertDescription` for `layout="banner"`. Banner layouts omit the icon. `RuiAlert` owns the `role="alert"` surface; the host handles dismiss.
```tsx
import { RuiAlert, RuiAlertIcon } from '@ecopages/radiant-ui/alert';
Your session will expire in 5 minutes.
```
Inject or reveal an alert when the status becomes relevant. Copy that is always on the page should not use `role="alert"`.
## Custom markup
`` coordinates any light-DOM tree that matches its query contract. The `Rui*` helpers stamp these targets; they are not required.
```tsx
import '@ecopages/radiant-ui/alert';
Your session will expire in 5 minutes.
```
BEM classes are presentation-only. The host only queries `[data-alert-close]`; authors own the `role="alert"` surface.
## Theming
Alert tones use **semantic status roles** from the active theme, not Tailwind palette steps (`blue-500`, `emerald-100`, …). Each `variant` maps to a role family:
| `variant` | Semantic role | Typical utilities on `.rui-alert--*` |
| --- | --- | --- |
| `info` | `info` | `bg-info-container`, `text-on-info-container`, `border-info/30` |
| `success` | `success` | `bg-success-container`, `text-on-success-container` |
| `warning` | `warning` | `bg-warning-container`, `text-on-warning-container` |
| `error` | `error` (destructive) | `bg-error-container`, `text-on-error-container` |
Banner layouts paint the left accent rail with the role accent (`bg-info`, `bg-warning`, …). Brand color packs remap all roles for light and dark mode.
Override at the theme layer (`tokens/presets/colors/*.css`), not in component CSS. Toasts and other notification UI should reuse the same `info` / `warning` / `success` / `error` families.
## Why a custom element?
`` is justified when the alert can **dismiss itself**: it emits `rui-close` and removes the host from the DOM without re-building the composed light-DOM surface. The `RuiAlert` view owns `role="alert"`, BEM classes, and the dismiss button markup; the CE owns dismiss behavior and event delegation.
For static, non-dismissible copy that is always visible, prefer plain markup without `role="alert"`; see Usage above.
## Match severity to variant
Reserve `error` for blocking problems the user must address. Use `warning` for recoverable risk, `success` for completed operations, and `info` for neutral context.
```tsx
Disk space is running low.
```
## Inline or banner layout
`inline` pairs `RuiAlertIcon` with a short message for compact status inside forms or page flow. `banner` spans the full width of a region with `RuiAlertTitle` and `RuiAlertDescription`.
```tsx
import { RuiAlert, RuiAlertDescription, RuiAlertTitle } from '@ecopages/radiant-ui/alert';
Documentation preview
This release includes breaking changes to the routing API.
```
## Dismissible alerts
Set `dismissible` when the user can clear the message. The host emits `rui-close` and then removes itself from the DOM.
```tsx
Your session will expire in 5 minutes.
```
## Accessibility
Follows the Alert pattern.
- The view renders an inner surface with `role="alert"` so screen readers announce the message when it appears.
- For inline alerts, pair `RuiAlertIcon` with text; do not rely on color or the icon alone to convey severity. The default icon is decorative (`aria-hidden="true"`).
- For banner alerts, use `RuiAlertTitle` for the headline and `RuiAlertDescription` for supporting detail.
- Prefer alerts for interruptions that do not require an immediate response. Use a dialog when the user must decide before continuing.
- When `dismissible`, the close control is a labeled button (`close-label`, default `Dismiss`).
## API
### Attributes
| Attribute | Type | Default | Description |
| --- | --- | --- | --- |
| `variant` | `info` · `success` · `warning` · `error` | `info` | Visual tone. |
| `layout` | `inline` · `banner` | `inline` | Compact row vs full-width advisory. |
| `dismissible` | `boolean` | `false` | Show dismiss control; enables `dismiss()`. |
| `close-label` | `string` | `Dismiss` | Accessible name for the dismiss control. |
### Light-DOM contract
| Target | Required | Host writes | Author owns |
| --- | --- | --- | --- |
| `[data-alert-close]` | no | — | presence, `aria-label` |
The host does not query alert content. Authors own the `role="alert"` surface (or use `RuiAlert`). Nested hosts: none.
### Events
| Event | Detail | Description |
| --- | --- | --- |
| `rui-close` | `{ reason: 'dismiss' }` | Fired when the alert is dismissed; the host is then removed. |
### Methods
| Method | Description |
| --- | --- |
| `dismiss()` | Emit `rui-close`, then remove the host from the DOM. |
### View helpers
| Component | Target stamped | Notes |
| --- | --- | --- |
| `RuiAlert` | `` + inner `role="alert"` surface | Appends `[data-alert-close]` when `dismissible`. |
| `RuiAlertIcon` | — | Presentation only (`inline` layout). |
| `RuiAlertTitle` | — | Presentation only (`banner` layout). |
| `RuiAlertDescription` | — | Presentation only (`banner` layout). |
### CSS classes
Public BEM classes on the light-DOM surface (documented via `@cssclass` on the JSX view helpers):
| Class | Description |
| --- | --- |
| `.rui-alert` | Root surface inside the host (`role="alert"`). |
| `.rui-alert--info` | Info tone (default). |
| `.rui-alert--success` | Success tone. |
| `.rui-alert--warning` | Warning tone. |
| `.rui-alert--error` | Error tone. |
| `.rui-alert--inline` | Compact row layout (icon + text). |
| `.rui-alert--banner` | Full-width advisory with left accent rail. |
| `.rui-alert--dismissible` | Layout adjustments for the dismiss control. |
| `.rui-alert__icon` | Icon wrapper (`RuiAlertIcon`, `inline` only). |
| `.rui-alert__title` | Banner headline (`RuiAlertTitle`). |
| `.rui-alert__description` | Banner body (`RuiAlertDescription`). |
| `.rui-alert__close` | Dismiss button when `dismissible` is set. |
### Theme roles (per `variant`)
| Variant | CSS variables consumed |
| --- | --- |
| `info` | `--info`, `--info-container`, `--on-info-container` |
| `success` | `--success`, `--success-container`, `--on-success-container` |
| `warning` | `--warning`, `--warning-container`, `--on-warning-container` |
| `error` | `--error`, `--error-container`, `--on-error-container` |
`error` is the destructive status role (same family as destructive buttons).