WebberUI

收件匣分割視圖

列表+閱讀窗格的郵件收件匣,選取滑動高亮、未讀徽章。

經典的郵件收件匣分割視圖:左側信件列表帶寄件人縮寫頭像、未讀圓點與標星指示,選中高亮條以 layoutId 在項目間流暢滑動;右側閱讀窗格以 AnimatePresence 切換信件內容,工具列支援標星與封存(封存後自動選取相鄰信件)。

載入預覽⋯

Playground

即時調整 props、程式碼片段同步更新——直接試出你要的樣子再複製。

360
<InboxSplitView />

安裝

npx shadcn@latest add https://webberui.com/r/inbox-split-view.json

或在 components.json 設定 registries 後,改用 @webberui/inbox-split-view 安裝。

安裝依賴後,從 registry JSON(/r/inbox-split-view.jsonfiles[0].content)複製 inbox-split-view.tsx 原始碼到你的 components/ui/ 目錄:

npm install motion lucide-react clsx tailwind-merge

使用

import { InboxSplitView, type InboxEmail } from "@/components/ui/inbox-split-view";

const emails: InboxEmail[] = [
  {
    id: "1",
    sender: "林佳蓉",
    subject: "Q3 產品路線圖初稿請過目",
    preview: "嗨,附上這季路線圖的初稿…",
    time: "上午 9:24",
    unread: true,
    body: ["嗨,附上這一季產品路線圖的初稿,麻煩你先看過一輪。"],
  },
];

<InboxSplitView
  emails={emails}
  onArchive={(email) => console.log("封存", email.id)}
  onToggleStar={(email, starred) => console.log(email.id, starred)}
/>

Props

InboxSplitView

Prop型別預設值說明
emailsInboxEmail[]初始信件資料,元件內部管理已讀 / 標星 / 封存狀態
defaultSelectedIdstring第一封的 id預設選中的信件 id
titlestring"收件匣"收件匣標題文字
heightnumber420面板高度(px),列表與內文各自內部捲動
onArchive(email: InboxEmail) => void封存信件時觸發
onToggleStar(email: InboxEmail, starred: boolean) => void切換標星時觸發,starred 為切換後的狀態
classNamestring透傳到外層容器

InboxEmail

Prop型別預設值說明
idstring唯一識別碼
senderstring寄件人名稱,頭像取第一個字元
subjectstring信件主旨
previewstring列表中的預覽摘要(單行截斷)
timestring顯示用時間字串,例如「上午 9:24」
bodystring[]閱讀窗格的內文段落
unreadbooleanfalse是否未讀(選取後自動標為已讀)
starredbooleanfalse是否已標星

可及性

  • 信件列表使用 role="listbox"role="option",選中項標記 aria-selected,並支援上下方向鍵切換信件
  • 標星按鈕以 aria-pressed 表達切換狀態,標星與封存按鈕皆有中文 aria-label
  • 未讀圓點附 aria-label="未讀",未讀信件同時以粗體字重區分,不只依賴顏色
  • 使用者系統開啟「減少動態效果」時,高亮條滑動、列表重排與窗格切換動畫皆改為即時切換
  • 寄件人縮寫頭像為裝飾性元素,以 aria-hidden 對輔助科技隱藏

On this page