Rendered evidence · 21 Aug 2026 · shipped

Drawer Width, Bubble Color, Arrival

Three changes to the conversation surface, each measured on the running app rather than asserted. All merged.

#6057 drawer · #6058 + #6066 bubble · #6066 arrival viewport 1512×950

#6057

A drawer widens to three quarters of the viewport

The cap was 50% of the viewport and never past 800 px, so a 1440 px laptop stopped at 720. The ceiling turned out to live in nine places — eight call sites plus a wrapper default that no call site showed — so raising the shared cap alone would have changed nothing on five drawers.

Viewport fraction
0.500.75
Pixel ceiling
8001600
Measured aside
1134 px
1134 ÷ 1512
0.7500
Conversations page with its detail drawer dragged to maximum width, filling the right three quarters of the window.
Conversations — a direct DockedPanel consumer.
Agents session drawer at maximum width, matching the conversations drawer.
Agents session drawer — an EntityDetailDrawer, the surface that would have shown 780 px.
Why the second screenshot exists. The first proof was taken on the one surface that could not fail. Five drawers reach DockedPanel through the EntityDetailDrawer wrapper, which carried its own maxWidth = 780 default. Deleting that is what makes the agents drawer read 1134 instead of 780.

#6058, then #6066

The incoming bubble is iMessage gray

It was Clara violet (#F5F3FF), which beside the #007AFF outgoing bubble read as a washed-out second blue. It shipped first as #E9E9EB — and that was still too dark in use.

#F2F2F7  shipped · systemGray6 #3A3A3C  dark mode #007AFF  outgoing #E9E9EB  first attempt #F5F3FF  was
Conversation drawer in light mode: light gray incoming bubbles and blue outgoing bubbles.
Shipped, light.
The same drawer in dark mode: dark gray incoming bubbles and blue outgoing bubbles.
Shipped, dark.
The published value is the wrong one. iMessage's incoming bubble is normally cited as systemGray5, #E5E5EAdarker than the first attempt, so copying the documented hex would have moved away from the fix. Since iOS 26's Liquid Glass the real bubble is translucent: on a white thread it composites toward white and reads lighter than any solid swatch can, so a flat fill looks heavier than the thing it copies. Apple publishes no hex for the composited result, so rather than invent one this takes the lighter Apple gray that already exists, systemGray6.
One thing to know later. Separation from the page ground drops from 17 points per channel to 8/8/5 — blue is the tightest. The chat background is also a prop, not a constant: TraceDetailBody passes --color-bg-muted, where the old #E9E9EB sat 2/2/4 from its ground and was effectively invisible. That argues for the change, and it means the ground can move per host, not just per theme.

#6066

A conversation opens at the bottom

Arrival handed the descent to the browser with behavior: 'smooth', whose duration scales with the distance travelled — so the wait grew with the length of the thread, and the conversations most worth reading were the slowest to become readable.

Thread height
5004 px
Arrival scrollTop
5004 px
Arrival
smoothauto
Streaming nudge
smooth
A distinction, not a speed. A duration cap would clip a long thread's animation while a short one stayed slow. Messages doesn't animate arrival at all. So: arrival (open → land at the bottom or on an anchor) is instant; navigation (streaming ends → nudge the last line up) stays animated. Arrival is where the reader expects to already be — animating it makes them watch a journey to a place they never left.
PropFlow Docs