Embed workspace transitions
Embed workspace transitions The workspace owns split-pane movement. It assigns the chat and embed their final layout once, then animates only transforms and ...
Embed workspace transitions
The workspace owns split-pane movement. It assigns the chat and embed their final layout once, then animates only transforms and opacity using the normal 200 ms motion token. Hiding chat releases its margin immediately, so the flexible embed does not reflow throughout the slide. The chat and its header remain mounted.
On split close, ActiveChat captures the outgoing pane’s bounds and takes it out of flex layout. A short Svelte outro retains that surface while the chat moves at its final width. The outgoing viewer is then destroyed; closed viewers are not cached. UnifiedEmbedFullscreen delegates split close immediately through the existing workspace context. Standalone overlays finish on their actual transform transition end, with a bounded fallback for interrupted CSS. Reduced motion bypasses animation waits. Entrance classes are cleared after completion events, rather than a timer racing the first painted frame.
Opening publishes a lightweight shell before resolving the parent. The shell has a working close control and a visible error state if resolution fails. Each request captures its own shell identity and chat ID; a late result cannot replace a newer request or reopen a closed pane. The selected component import can begin while the shell enters. The heavier viewer mounts after the entrance finishes. The workspace context marks the freshly resolved parent so the matching fullscreen does not immediately refetch it; nested results still fetch their own data.
Child hydration belongs to the viewer. Web-search children resolve in groups of four, available results are published progressively in source order, and only missing children retry (up to eight 400 ms waits). Retry timers are released on replacement, close and destruction. Generation checks reject stale work. Completion callbacks remain final-only because some consumers persist preview metadata; a partially loaded grid must not overwrite that metadata. This does not introduce an unbounded global cache or retain fullscreen DOM after close.
Focused checks live in components/embed-workspace.spec.ts and components/mindmap-fullscreen.spec.ts. The workspace preview uses fictional event data and no account/provider dependency. The manual Safari comparison should use the same chat, viewport, warm open/close, hide/restore, and idle frame samples. Frame scheduling, click-to-feedback, content readiness and process memory are separate measurements. Physical iPad Safari still needs device-specific verification.
Settings and the activity-history sidebar also assign final chat geometry once. Their lightweight surfaces reveal in 120 ms; width, gap and main-content inset are not animated. List/page mounting yields across a paint opportunity, is cancelled on close, and closed content is released. Reduced motion removes panel transitions.
The pending embed frame renders the shared gradient header and close control from already available metadata. It neither resolves extra embeds nor preloads viewers. Generic loading text remains an accessible status; a static body placeholder appears only after 150 ms. Missing metadata is left blank rather than showing IDs. The final viewer uses the same header component and outer pane; no crossfade duplicates the heavy viewer.