Windows that do not fit the dock stand in rows behind it

Featurekamo-internal
Shipped
September 17, 2026 at 3:53 AM UTC
Author
Kamo
Commit
54cab63

A tool window that does not fit the front row now stands in a row BEHIND it, one title strip higher per row: its 42px title bar and 10px of body show above the row in front, like the tabs of a stack of folders. This replaces the cascade, which placed every window over the row and buried most of them. The rows are the window order laid out first-fit (toolDockPlacement, layoutDockStack): a window goes into the front-most row with room for it, so the front row is never left half empty while a window that fits waits behind. Every row shares one height. When the rearmost strip would pass the top margin, every window gives way together, and the height comes back as the rows empty out. The row, the lift and the strip height are written onto each window in the same relayout as dockX (dockRows), and are never persisted. Who stands in front is a reorder (toolDockTiers): - A click on a strip trades places with the front window the member used most recently. Recency is tracked from member gestures only (dockMemberUse), because the z counter also climbs for incoming raises. - A window the member opens, restores from its hexhead, puts back from the pane, docks or raises from a notification is seated in front, trading with the front window used LEAST recently. Windows raised by incoming messages go wherever there is room, so they never take the place of the one in use. - A drop into the dock keeps the place it was dropped at; the least recently used front windows step back to make room. - A front window closing or minimized is replaced by the window standing nearest behind it, and nothing else moves. - A wider window coming forward steps least-recently-used front windows back until it fits. On screen (ToolWindowShell, ToolDock): - A window behind is clipped to its strip, which is also its hit area. Its body is inert, so it takes no focus or keystroke and paints no scrollbar. It paints under every front window and is never told it is focused. - The strip's title is a button (bring forward, keyboard reachable), shows the unread count, and dims with each row further back. - Its close, minimize, maximize and float buttons act on it where it stands. A drag that starts on a strip is not also a click, and neither is a double-click. - Coming forward, the window drops and unfolds into the slot while the traded one folds and rises behind. Both run on the dock's 340ms curve, then a shadow bloom and a light sweep mark the arrival. Hovering a strip lifts it and uncovers a little more of it. A window born behind peeks up from behind the row in front; one born in front rises out of the bottom edge, opaque. - Reduced motion keeps the rows and the shading and drops all movement. - Resize seams are front-row only. The height seam stops where the rearmost strip meets the top margin, and announces that ceiling. Found on the way, and fixed: the dock rendered windows in store order, so any reorder (including drag-reorder, before this change) made React move window elements around the document. A moved element loses DOM state: a log scrolled to 300 came back at 0, a playing media element is paused, and the transition carrying a window to its new slot is dropped. ToolDock now renders windows in creation order, which is safe because every window is fixed at its own painted level. Verified in real Chrome with the whole dock on stubbed window bodies: 64 measured checks. They cover rows, clip and hit-testing, inert bodies and scrollbars, focus, hover, both swap directions, keyboard, strip buttons, height give-and-take, drag from a strip, reduced motion, maximize and restore, viewport re-flow, a drop past the front row, the seam ceiling and preserved scroll positions, plus real-time screencasts of every transition. New unit and provider tests cover the layout, reorders, stacking, shell and dock.

All changes

Like what you see shipping?

All of it arrives in your workspace on its own. Start on the free plan and read this page again in a month.

Start Free ForeverView Pricing