Absolutely positioned at right 32 / bottom 32, width 100% capped by var(--tray-max-width) (488px), 15px radius, min-height 600px, --gray-7 fill, var(--glass-shadow), overflow hidden, and a column flex of three parts: TrayHeader, the scrolling .body at flex 1, and FooterNavigation. Height is set from the tsx as var(--tray-default-height) — calc(100dvh − 112px). The stylesheet declares max-height twice, 100vh then 100dvh, and the source comments why: dvh follows the iOS Safari visual viewport so the tray shrinks when the URL bar moves and the close button stays reachable, while the vh line is the fallback for browsers that ignore dvh. Keep both.
At max-width 767px the tray docks to the bottom edge and centres itself with right: 50%; transform: translateX(50%) rather than left/right — and the tsx separately sets both bottom corner radii to 0, so it reads as part of the viewport rather than a floating card. The large layout (modal.layout === 'large' && screenSize !== 'mobile') is 80vw × 80vh centred with top/left 50% and translate(-50%,-50%); every one of those nine declarations is an inline style in Tray/index.tsx, not a class, and none of it applies on mobile. The tray's own borderRadius is dealer config (tray.borderRadius, default 15px) and is written inline on all four corners.
Two things here are the card's, not the widget's. The frames are scaled down (0.55, 0.55, 0.38) so three variants fit side by side; the real tray is 488px wide. And each specimen tray takes a fixed pixel height with max-height: none, because the live rule is capped by 100dvh — which inside a card would measure the card's own viewport rather than the mocked dealer page, showing the tray below its documented 600px min-height. The dealer-page stages are fixed-size mocks for the same reason. Read the numbers from the notes, not by measuring the pixels above. The logo is a neutral placeholder: no Space or dealer mark ships in this repo.
The body holds exactly one thing: the custom tray content, or the active sub-tab, or the active tab's component — the same precedence the header uses. Everything inside is the locked step frame, which is why the tray needs no padding of its own. FooterNavigation renders only when hideTabs is false, and the Toast sits between the header and the body so it overlays the content rather than the chrome. Scaled here to fit the card; the real thing is 488px wide.