build69
build69  /  Components  /  Chat & Collab  /  EmailThreeColumn

EmailThreeColumn

v1.0.25Updated 20 Oct 2026

Classic three-column email layout: folders pane, message-list pane, reading pane. Resizable panels.

Preview

Live · 13 stories
DefaultOpen ↗
▸Why this is recommendedemailmailinboxthree-column+2

The default, out-of-the-box EmailThreeColumn.

Recommended for+14
  • ✓Inbox-style email clients
  • ✓Support ticket inbox
  • ✓Notification mailbox
Tags+6
emailmailinboxthree-columnreading-panedefault
Features+4
  • Folders / labels pane
  • Message list with sender + subject + preview + time
  • Reading pane with full body
  • Resizable panels (react-resizable-panels)
  • Selection moves through list
  • Unread / starred / important indicators
  • Reply / forward action bar
  • i18n (FB-18): uiLabels prop overrides every built-in string (chrome, placeholders, aria-labels, snooze menu, keyboard hints, compose dialog)
Not recommended for−2
  • ✕Single thread (just render message body)
  • ✕Chat (use Chat)

Install

Ask your agent, or call the MCP tool directly. The resolved bundle is written into your project.

get_registry_item({ name: "EmailThreeColumn" })

Usage

import { EmailThreeColumn } from '@/components/patterns/email-three-column';

<EmailThreeColumn folders={folders} messages={messages} />

Tick variants in the left menu — each adds a tab with that variant’s real story source, the same code the preview above renders.

Props

PropTypeRequired
folders

Folder list

Folder[]yes
messages

Messages in active folder

EmailMessage[]yes
selectedId

The open message, CONTROLLED: the reading pane shows what the host says and nothing else, so declining to change it on onSelectMessage really keeps the reader where they are (a router-held selection, a move blocked over an unsaved reply).

string—
defaultSelectedId

Message to open first, when the selection is not controlled.

string—
composeOpen

Compose dialog, controlled in the same way as selectedId.

boolean—
defaultComposeOpen

Compose dialog open on first render, when composeOpen is not given.

boolean—
uiLabels

Override any built-in UI string (i18n); named uiLabels because labels is already the sidebar label-rows data prop

Partial<EmailThreeColumnLabels>—

Related