狀態與回饋系統
提示區塊
五種語意的 React 提示區塊元件:短淡入上移進場,關閉時以高度收合讓下方內容平順補位,內容更新時圖示輕彈一次。
表單頂部、設定頁與儀表板常用的提示區塊。variant 有 default、info、success、warning、destructive 五種,各自對應左側圖示、3px 色帶與配色;可放標題、說明與操作按鈕。設為 dismissible 時右上角出現關閉鈕——關閉不是瞬間消失,而是先淡出、同時把高度與外距收合到 0,下方內容平順上移補位,收合完成後才卸載並呼叫 onDismiss。開啟 live 後,標題或說明內容變更時圖示會輕彈一次,提醒使用者這則提示剛更新。
把這個效果裝進你的專案
在專案資料夾執行指令,CLI 會加入原始碼與依賴套件,再依下方使用範例引用元件。
npx webberui@latest add alert-calloutPlayground
即時調整 props、程式碼片段同步更新——直接試出你要的樣子再複製。
150
180
編輯中的呼叫預設屬性
<AlertCallout/>
完整範例包含預覽的排版與資料。先安裝元件,再把範例檔貼入你的專案。
安裝
npx webberui@latest add https://webberui.com/r/alert-callout.json或在 components.json 設定 registries 後,改用 @webberui/alert-callout 安裝。
使用
import { AlertCallout } from "@/components/ui/alert-callout";
<AlertCallout
className="mb-3"
variant="warning"
title="你的付款方式將於 11 月 30 日到期"
description="到期後將無法自動續訂,請先更新卡片資訊。"
action={<button type="button">更新付款方式</button>}
/>
<AlertCallout
className="mb-3"
variant="success"
title="變更已儲存"
description={`已於 ${savedAt} 儲存`}
dismissible
live
onDismiss={() => console.log("已關閉")}
/>Props
| Prop | 型別 | 預設值 | 說明 |
|---|---|---|---|
variant | "default" | "info" | "success" | "warning" | "destructive" | "default" | 語意變體,決定左側圖示、色帶與配色 |
title | ReactNode | — | 標題文字 |
description | ReactNode | — | 說明內容 |
icon | ReactNode | null | 依 variant | 覆寫預設圖示;傳 null 隱藏圖示 |
action | ReactNode | — | 操作區(例如「重新整理」按鈕),渲染在說明下方 |
dismissible | boolean | false | 是否在右上角顯示關閉鈕 |
onDismiss | () => void | — | 關閉收合動畫完成、元件卸載後回呼 |
open | boolean | — | 受控的顯示狀態;未提供時由元件內部管理(非受控) |
defaultOpen | boolean | true | 非受控模式的初始顯示狀態 |
onOpenChange | (open: boolean) => void | — | 顯示狀態變動時回呼(按下關閉鈕時以 false 呼叫) |
live | boolean | false | 開啟後 title/description 內容變更時,圖示輕彈一次 |
titleAs | "h3" | "h4" | "h5" | "div" | "h5" | 標題使用的元素(不強制為標題層級) |
duration | number | 150 | 進場淡入上移的時長(毫秒) |
collapseDuration | number | 180 | 關閉時高度收合的時長(毫秒) |
dismissLabel | string | "關閉提示" | 關閉鈕的無障礙標籤 |
className | string | — | 透傳到最外層容器(外距寫在這裡,關閉時會一併收合) |
細節
- 預設圖示(lucide):default 與 info 為
Info、success 為CircleCheck、warning 為TriangleAlert、destructive 為CircleX。 - 色帶顏色可用 CSS 變數
--wb-alert-callout-accent覆寫(例如className="[--wb-alert-callout-accent:#7c3aed]"),未設定時依variant使用對應色階。 - 根元素會寫入
--wb-alert-callout-duration與--wb-alert-callout-collapse-duration,關閉鈕的 hover 色彩過渡使用前者。 - 收合動畫:opacity 在前 1/3 時間內淡出,height、marginTop、marginBottom 同時以 easeInOut 收合到 0;多則提示堆疊時,請用每則提示自己的
className="mb-3"拉開間距(而非父層gap),間距才會跟著收合、不會在卸載時跳一下。 overflow: hidden只在收合期間開啟,平時不會裁掉關閉鈕的焦點框或你加上的陰影。live比對的是標題與說明實際渲染出的文字,傳入新的 JSX 但文字沒變時不會彈跳。
可及性
- destructive 與 warning 使用
role="alert"(立即朗讀),其他變體使用role="status";以aria-labelledby/aria-describedby關聯標題與說明 - 標題預設以
h5渲染,可用titleAs改成符合頁面層級的元素或div - 關閉鈕為
type="button"、aria-label="關閉提示",有可見的 focus-visible 外框 - 關閉時若焦點在這則提示內,焦點會移到下一則提示的關閉鈕;沒有下一則就移到上一則,再沒有就移到父容器,避免焦點遺失;退場期間設為
inert,無法再被點擊或 Tab 走到 - 使用者系統開啟「減少動態效果」時,進場只淡入(不位移)、關閉以 100ms 淡出直接消失(不收合),
live也不彈跳