狀態與回饋系統

提示區塊

五種語意的 React 提示區塊元件:短淡入上移進場,關閉時以高度收合讓下方內容平順補位,內容更新時圖示輕彈一次。

表單頂部、設定頁與儀表板常用的提示區塊。variant 有 default、info、success、warning、destructive 五種,各自對應左側圖示、3px 色帶與配色;可放標題、說明與操作按鈕。設為 dismissible 時右上角出現關閉鈕——關閉不是瞬間消失,而是先淡出、同時把高度與外距收合到 0,下方內容平順上移補位,收合完成後才卸載並呼叫 onDismiss。開啟 live 後,標題或說明內容變更時圖示會輕彈一次,提醒使用者這則提示剛更新。

把這個效果裝進你的專案

在專案資料夾執行指令,CLI 會加入原始碼與依賴套件,再依下方使用範例引用元件。

npx webberui@latest add alert-callout

還沒有專案,或安裝遇到問題?看快速開始 →

Playground

即時調整 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"語意變體,決定左側圖示、色帶與配色
titleReactNode—標題文字
descriptionReactNode—說明內容
iconReactNode | null依 variant覆寫預設圖示;傳 null 隱藏圖示
actionReactNode—操作區(例如「重新整理」按鈕),渲染在說明下方
dismissiblebooleanfalse是否在右上角顯示關閉鈕
onDismiss() => void—關閉收合動畫完成、元件卸載後回呼
openboolean—受控的顯示狀態;未提供時由元件內部管理(非受控)
defaultOpenbooleantrue非受控模式的初始顯示狀態
onOpenChange(open: boolean) => void—顯示狀態變動時回呼(按下關閉鈕時以 false 呼叫)
livebooleanfalse開啟後 title/description 內容變更時,圖示輕彈一次
titleAs"h3" | "h4" | "h5" | "div""h5"標題使用的元素(不強制為標題層級)
durationnumber150進場淡入上移的時長(毫秒)
collapseDurationnumber180關閉時高度收合的時長(毫秒)
dismissLabelstring"關閉提示"關閉鈕的無障礙標籤
classNamestring—透傳到最外層容器(外距寫在這裡,關閉時會一併收合)

細節

  • 預設圖示(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 也不彈跳