fix(ui): defer live preview iframe rendering#15999
Merged
jacobsfletch merged 8 commits intomainfrom Mar 19, 2026
Merged
Conversation
Contributor
📦 esbuild Bundle Analysis for payloadThis analysis was generated by esbuild-bundle-analyzer. 🤖
Largest pathsThese visualization shows top 20 largest paths in the bundle.Meta file: packages/next/meta_index.json, Out file: esbuild/index.js
Meta file: packages/payload/meta_index.json, Out file: esbuild/index.js
Meta file: packages/payload/meta_shared.json, Out file: esbuild/exports/shared.js
Meta file: packages/richtext-lexical/meta_client.json, Out file: esbuild/exports/client_optimized/index.js
Meta file: packages/ui/meta_client.json, Out file: esbuild/exports/client_optimized/index.js
Meta file: packages/ui/meta_shared.json, Out file: esbuild/exports/shared_optimized/index.js
DetailsNext to the size is how much the size has increased or decreased compared with the base branch of this PR.
|
jacobsfletch
commented
Mar 19, 2026
| * Rendering the iframe is a one-way event, e.g. defer load and never unmount. | ||
| * This way, subsequent toggles will appear to load instantly. | ||
| */ | ||
| const setIsLivePreviewing = useCallback<LivePreviewContextType['setIsLivePreviewing']>( |
Member
Author
There was a problem hiding this comment.
Here we're intercepting the setter to perform a side-effect, which in this case, switches the one-way setShouldRenderIframe property on.
This is a good example of event-driven > effect-driven state.
jacobsfletch
commented
Mar 19, 2026
| let hasSavedPrefs = false | ||
| let hasClickedToggler = false | ||
|
|
||
| const onRoute = async (route: Route) => { |
Member
Author
There was a problem hiding this comment.
Another good example of event-driven patterns, this time to deflake the test helper by intercepting the route itself.
JarrodMFlesch
approved these changes
Mar 19, 2026
Contributor
|
🚀 This is included in version v3.80.0 |
jacobsfletch
added a commit
that referenced
this pull request
Mar 20, 2026
Continuation of #15999. Without optimistically loading the live preview window, the initial loading state is left unhandled when toggling into live preview for the first time. This causes users to see blank content until the iframe has loaded, without indication that something is happening. Now, we display a loading indicator while the iframe request is in flight, that notably: 1. Only shows if the load takes longer than x ms. 2. If shown, is forced to remain in place for _at least_ x ms to avoid flickering, even if the request finishes before then. Before: https://github.com/user-attachments/assets/70852e80-ac0e-4b96-b59e-8817c65629a6 After: https://github.com/user-attachments/assets/5fda30d9-8c87-42bc-ba20-a8f7ae8f1245 Related: - The `ShimmerEffect` component now accepts arbitrary HTML attributes and supports a new `transparent` prop --- - To see the specific tasks where the Asana app for GitHub is being used, see below: - https://app.asana.com/0/0/1213727956884086
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
When navigating to a document with live preview enabled, the respective site is optimistically loaded regardless of whether the user is actively previewing it.
This creates the following problems:
Now, the iframe window is conditionally mounted only when the user toggles into live preview mode. To maintain fast loads thereafter, the iframe doesn't unmount when toggled off. Live preview events themselves are paused, but the window itself remains dormant until reactivated.
In the future we may also want to consider adding callbacks to the live preview toggle event. That way you could reverse what your live preview endpoint has done, e.g. exit draft mode.
Before:
Screen.Recording.2026-03-19.at.11.10.22.AM.mp4
After:
Screen.Recording.2026-03-19.at.11.26.28.AM.mp4
Unrelated:
toggleLivePreviewtest helper by making is event-driven, e.g. it intercepts preference requests to ensure they are fulfilled before moving on.