Documentation
Measured against the real thing.
Every size, colour, radius and timing in this registry comes from a capture of Messages on iOS 26 in the iPhone 17 Pro simulator, or macOS 26.5 Messages. The numbers and how they were measured live in references/SPEC.md. Anything without a native capture is marked unverified there and in the component itself, so you can tell what is reproduced from what is inferred.
Two gates
Did our rendering change?
Playwright screenshots every scenario checkpoint on both platforms and themes, in Chromium and WebKit. These baselines catch regressions in this implementation. They are not evidence of fidelity to Apple, and are never copied into the reference set.
Do we match Apple?
A lab page is diffed against the native capture it reconstructs, at the device pixel ratio of the capture. The tool writes reference, actual and diff images side by side and prints the mismatched-pixel ratio. Text anti-aliasing differs between a simulator and a browser; geometry and colour must not.
Labs
- /harness Scenario lab: every state on a timeline, on both platforms, in both themes
- /lab Bubbles at native geometry, against the iOS conversation capture
- /lab/ios-chrome Status bar, nav bar, composer, conversation list, New Message sheet
- /lab/ios-screens Details, plus menu, selection mode, swipe for times, notices, attachments
- /lab/macos-chrome Window, sidebar, header, composer, plus menu
- /lab/list The message log: clusters, tails, date headers, motion
- /lab/tapback Balloons, the picker bar, and the long-press overlay
- /lab/effects Bubble and screen send effects
- /lab/reply Replies, photos, audio, edit in place
Install
bunx shadcn@latest add http://localhost:3100/r/index.json # everything bunx shadcn@latest add http://localhost:3100/r/ios-messages-app.json # one item
Or register @imessage in your components.json and run bunx shadcn@latest add @imessage/conversation. Components install under components/imessage/ and use your own cn helper.
Blocks
Conversation
A complete, composable conversation for either platform: header, scrolling log with clusters and reactions, typing state, and a composer. Bring your own data and send handler.
"use client";
import { useState } from "react";
import { Conversation } from "@/components/imessage/conversation";
import type { Message } from "@/components/imessage/message-list";
export function Chat() {
const [messages, setMessages] = useState<Message[]>([
{ id: "1", direction: "incoming", text: "Hey, you made it. đź‘‹", sentAt: Date.now() - 60_000 },
]);
return (
<Conversation
platform="ios"
name="Alex Morgan"
messages={messages}
onSend={(text) => setMessages(current => [
...current,
{ id: crypto.randomUUID(), direction: "outgoing", text, sentAt: Date.now() },
])}
/>
);
}iOS Messages app
The complete iOS 26 Messages app: list, conversation, New Message sheet, and the long-press overlay.
import { IosMessagesApp } from "@/components/imessage/ios-messages-app";
<IosMessagesApp
contact={{ name: "Alex Morgan" }}
messages={messages}
composer={{ onSend: sendMessage }}
/>macOS Messages app
The complete macOS 26 Messages window: sidebar, header, message log, composer, and the right-click menu.
import { MacMessagesApp } from "@/components/imessage/macos-messages-app";
<MacMessagesApp
contact={{ name: "Alex Morgan" }}
conversations={conversations}
selectedId="alex"
messages={messages}
composer={{ onSend: sendMessage }}
/>Components
- Platform context
@imessage/platformTells every iMessage component whether to render iOS 26 or macOS 26 metrics.
- Design tokens
@imessage/tokensMeasured colors, screen-space bubble gradients, type scale, and spacing for iOS and macOS.
- Bubble shape
@imessage/bubble-shapeThe traced native bubble outline and tail as SVG path and clip-path generators.
- Screen-space fill hook
@imessage/use-screen-spaceKeeps bubble fills aligned to the screen-space gradient while a list scrolls.
- Message bubble
@imessage/message-bubbleNative iOS 26 and macOS 26 bubbles: traced outline and tail, screen-space gradient fill, status, edited, reactions, and emoji-only messages.
- Tapback
@imessage/tapbackThe native reaction balloon: six classic Tapbacks and custom emoji, own and others' colors, counts, and the selected state.
- Tapback details
@imessage/tapback-detailsThe surface "Tapback Details…" opens: who reacted and with what, as a sheet on iOS and an anchored popover on macOS, with your own reaction removable.
- Typing indicator
@imessage/typing-indicatorThe native typing bubble with its three staggered dots and trailing circles.
- Date separator
@imessage/date-separatorDate headers: the iOS two-line header with its service line, the mid-list one-liner, and the macOS variant.
- Link preview
@imessage/link-previewThe measured compact link card, plus a rich variant with an image, title and host.
- Attachment
@imessage/message-attachmentThe document card Messages draws instead of a text bubble, with the file icon, name and size, in the bubble's own shape.
- Message motion
@imessage/message-motionThe measured send and receive animations, seekable so a harness can scrub them.
- FaceTime card
@imessage/facetime-cardA FaceTime link card in the native card style, plus the call states an application may want to show around it.
- Avatar
@imessage/avatarInitials on the measured Messages gradient, a photo, or the generic silhouette, at native sizes.
- macOS window
@imessage/macos-windowThe Messages window frame: traffic lights, sidebar and content slots, active and inactive states.
- macOS sidebar
@imessage/macos-sidebarThe conversation list sidebar with search, pinned conversations, rows, and selection states.
- macOS header
@imessage/macos-headerThe translucent conversation header with compose, contact, and video controls.
- macOS composer
@imessage/macos-composerThe message field with the plus, audio, and emoji controls; Return sends.
- Tapback bar
@imessage/tapback-barThe iOS Tapback picker pill with recent emoji and the emoji-picker bubble, plus the macOS two-row layout.
- Context menu
@imessage/context-menuiOS tinted message menu and the macOS NSMenu-style menu with Tapback rows.
- Message actions
@imessage/message-actionsThe iOS long-press overlay: dim and blur, lifted bubble, Tapback bar, and menu, with the measured transition.
- Long press hook
@imessage/use-long-pressA cancelable 500 ms hold with keyboard, double-click, and right-click alternatives.
- Message list
@imessage/message-listThe scrolling log: clusters and tails, date headers, status labels, sender names, emoji-only rows, link cards, attachments, and the typing indicator.
- iOS status bar
@imessage/ios-status-barTime, Dynamic Island, cellular, Wi-Fi, and battery exactly as iOS 26 draws them.
- iOS nav bar
@imessage/ios-nav-barThe conversation nav bar with the glass back button, large avatar, and name pill, plus the list's large title.
- iOS composer
@imessage/ios-composerThe glass message field with the plus button, microphone, auto-growing text, and the send pill.
- iOS conversation list
@imessage/ios-conversation-listThe Messages list screen: large title, rows with avatars and previews, search pill, and compose button.
- iOS new message sheet
@imessage/ios-new-message-sheetThe New Message sheet with its close button and To field.
- Palette
@imessage/paletteEmits the measured light and dark palette as CSS variables for one platform.
- macOS plus menu
@imessage/macos-plus-menuThe popover that opens from the composer's plus button: Photos, Stickers, Genmoji, Image Playground, #images, Message Effects.
- macOS conversation details
@imessage/macos-detailsThe inspector pane that slides in from the right of the window: contact, call actions, shared photos, links and documents, and the conversation options.
- Message effects
@imessage/message-effectsSend with effect on a bubble: the slam, loud and gentle animations and the Invisible Ink reveal, replayable on demand.
- Screen effects
@imessage/screen-effectsThe full-screen send effects, drawn deterministically on a canvas so they can be scrubbed and screenshotted.
- iOS effects picker
@imessage/ios-effects-pickerThe iOS "Send with effect" screen: the Bubble/Screen tabs, the effect rail, the preview bubble and its caption.
- Inline reply
@imessage/message-replyThe quoted stub above a reply, the reply-count affordance, and the focused thread view.
- Photo message
@imessage/message-imagePhotos and videos in the bubble's shape, tail included, with the native multi-photo grid.
- Photo viewer
@imessage/image-viewerThe full-screen viewer a photo opens into: zoom out of the tile, swipe between the message's photos, pinch and pan, react, and drag down to close.
- Audio message
@imessage/message-audioA voice message bubble with a waveform, play control, and a seekable position.
- Edit and undo send
@imessage/message-editEdit a sent message in place, the Edited label, and the undo-send removal.
- iOS conversation details
@imessage/ios-detailsThe details screen: contact, call actions, and the grouped settings cells.
- iOS group details
@imessage/group-detailsA group conversation's details screen: the stacked group photo, an editable name, the members, and the shared photos and links.
- iOS plus menu
@imessage/ios-plus-menuThe attachment sheet with its app rows and the embedded photo grid.
- iOS photo picker
@imessage/photo-pickerThe Photos panel under the composer: a scrolling three-column grid with the sheet grabber and tile selection.
- iOS sticker picker
@imessage/sticker-pickerThe sheet the plus menu's Stickers row opens: category tabs, a search field, the sticker grid, and drag to place a sticker on a message.
- iOS selection mode
@imessage/ios-select-modeSelection circles beside messages, the close button, and the bottom toolbar.
- iOS search
@imessage/ios-searchThe search state of the conversation list: the field rising under the nav, a Cancel button, and results grouped into Conversations, Messages, Photos and Links.
- Swipe for times
@imessage/ios-swipe-timesThe drag that shifts the conversation left to reveal per-message times.
- Conversation notices
@imessage/ios-noticesThe unknown-sender notice, the failed-send badge, and the Not Delivered label.
- System message
@imessage/system-messageThe centred grey lines that are not bubbles: group renames, joins and leaves, the group photo, a missed call, a reaction summary, and the unknown-sender sentence.
- Group avatar
@imessage/group-avatarThe stacked faces a group conversation shows in the list, the nav bar, the details header and the macOS sidebar.
- Audio recorder
@imessage/audio-recorderThe composer turning into a voice-message recorder: live waveform, running timer, and the send, stop and cancel controls.
Applications own transport, storage, uploads and real calls. Independent project, not affiliated with Apple.
Open the scenario lab