資料展示
議題瀑布看板
暗色環境光暈上的議題列表:議題卡依序瀑布滑入,狀態膠囊切換時以版面動畫重排,hover 時卡片邊緣微光,適合產品發表區塊。
把一份議題清單做成產品發表區塊裡的「工作正在流動」畫面:暗底上漂著兩三顆模糊光暈,議題列捲進視窗時由上而下瀑布滑入;點狀態膠囊會在待辦、進行中、審查中、完成之間循環,膠囊改寬、文字交叉淡接,狀態圖示重新描繪。開啟分組後,列會從原群組飛到新群組;開啟自動播放則每隔幾秒把下一張卡往前推一格。所有圖示與子結構都在元件內自行實作。
把這個效果裝進你的專案
在專案資料夾執行指令,CLI 會加入原始碼與依賴套件,再依下方使用範例引用元件。
npx webberui@latest add "https://webberui.com/r/issue-cascade-board.json?t=<安裝 token>"Playground
即時調整 props、程式碼片段同步更新——直接試出你要的樣子再複製。
2200
編輯中的呼叫預設屬性
<IssueCascadeBoard/>
完整範例包含預覽的排版與資料。先安裝元件,再把範例檔貼入你的專案。
安裝
npx webberui@latest add "https://webberui.com/r/issue-cascade-board.json?t=<安裝 token>"或在 components.json 設定 registries 後,改用 @webberui/issue-cascade-board 安裝。
使用
import * as React from "react";
import {
IssueCascadeBoard,
type IssueItem,
} from "@/components/ui/issue-cascade-board";
const initial: IssueItem[] = [
{ id: "1", key: "HX-142", title: "結帳頁金額四捨五入錯誤", status: "doing", labels: ["錯誤"], assignee: "林以晴", priority: 3 },
{ id: "2", key: "HX-138", title: "新增繁中排序選項", status: "review", labels: ["功能"], assignee: "陳柏宇", priority: 2 },
{ id: "3", key: "HX-151", title: "行程卡片在窄螢幕換行跑版", status: "todo", assignee: "張書豪", priority: 1 },
];
export function LaunchBoard() {
const [items, setItems] = React.useState(initial);
return (
<IssueCascadeBoard
items={items}
onStatusChange={(id, status) =>
setItems((prev) => prev.map((it) => (it.id === id ? { ...it, status } : it)))
}
groupBy="status"
autoPlay
/>
);
}Props
| Prop | 型別 | 預設值 | 說明 |
|---|---|---|---|
items | IssueItem[] | — | 受控議題列表;提供時狀態變更只透過 onStatusChange 通知,由外部更新 |
defaultItems | IssueItem[] | [] | 非受控模式的初始議題列表 |
onStatusChange | (id: string, status: IssueStatus) => void | — | 點狀態膠囊或自動播放推進時回呼 |
groupBy | "none" | "status" | "none" | status 依狀態分成四組,列在群組間以版面動畫飛到新位置 |
autoPlay | boolean | false | 每隔 interval 把下一張未完成的卡往前推一個狀態 |
interval | number | 2200 | 自動播放間隔(毫秒,最小 400) |
glow | boolean | true | 是否顯示背景的模糊光暈球 |
theme | "dark" | "auto" | "dark" | dark 永遠暗底;auto 跟隨頁面亮暗模式 |
accent | string | "#6366f1" | 進行中狀態與光暈主色;未提供時讀 --wb-issue-cascade-accent |
statusLabels | Partial<Record<IssueStatus, string>> | 待辦/進行中/審查中/完成 | 覆寫狀態顯示文字 |
className | string | — | 併入最外層容器 |
IssueItem
| 欄位 | 型別 | 預設值 | 說明 |
|---|---|---|---|
id | string | — | 唯一識別值 |
key | string | — | 顯示用識別碼,例如 HX-142,以等寬字型呈現 |
title | string | — | 議題標題,過長時截斷 |
status | "todo" | "doing" | "review" | "done" | — | 目前狀態 |
labels | string[] | — | 標籤 chip(寬度 768px 以上才顯示) |
assignee | string | — | 負責人名稱,顯示為縮寫頭像(中文名取最後一字) |
priority | 0 | 1 | 2 | 3 | 0 | 優先度條:無/低/中/高 |
另外具名匯出 IssueItem、IssueStatus 與 IssueCascadeBoardProps 型別。
細節
- CSS 變數:
--wb-issue-cascade-stagger(預設70ms,進場時每列的延遲)、--wb-issue-cascade-accent(預設#6366f1)、--wb-issue-cascade-glow-duration(預設1.6s,hover 邊框光暈轉一圈的時間)。可在主題層覆寫 - 進場:IntersectionObserver 偵測元件進入視窗後才觸發一次,每列
y: 16 → 0、透明度與blur(6px)淡出,位移用彈簧(stiffness 260、damping 26) - 狀態圖示:待辦是空心圓、進行中是圓環加半填、審查中是六段虛線弧、完成是實心圓加打勾,切換時都以
pathLength重新描繪 - 自動播放:依序挑下一張未完成的卡推進一格;全部完成後從游標處循環回待辦。元件離開視窗時暫停,光暈漂移也一併停止
- 受控模式:傳入
items時元件不會自行改狀態,請在onStatusChange裡更新陣列;自動播放同樣透過這個回呼推進
可及性
- 議題列表為
role="list",分組模式下每組是以標題命名的section - 狀態膠囊是
button,aria-label例如「HX-142 狀態:進行中,點擊切換」,可用 Tab 聚焦、Enter/空白鍵切換,並有focus-visible外框 - 狀態變更(點擊、自動播放或外部受控更新)會透過
aria-live="polite"區域宣告 - 自動播放時提供「暫停自動播放」按鈕(WCAG 2.2.2),
aria-pressed反映暫停狀態 - 優先度條與負責人頭像都有
role="img"與文字標籤 - 使用者系統開啟「減少動態效果」時,取消瀑布進場與版面動畫、光暈球不漂移、hover 邊框不旋轉,狀態直接切換