feat(app): show a startup splash while connecting to the device - #451
Merged
Conversation
The standalone app spent the device handshake on a bare "Connecting to device…" empty state. Cover the window with the Rozenite loader on the app's own background instead, and fade it off once the shell mounts. The splash stays up behind the pre-connection status dialogs (dev server unreachable, Rozenite not set up), which now sit on it as their backdrop, and never returns once the shell is mounted. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NGQg2w55Sa3MzH1NfCkcLY
3600ms per loop read as sluggish next to a conventional spinner. 2000ms puts the visible flips at ~24fps with the default frame count, which reads as active without turning the dithering into noise. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NGQg2w55Sa3MzH1NfCkcLY
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NGQg2w55Sa3MzH1NfCkcLY
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01NGQg2w55Sa3MzH1NfCkcLY
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.
Description
Covers the standalone app's window with a startup splash —
RozeniteLoadercentered on the app's own--background— for as long as the device handshake is in flight, then fades it off once the shell mounts.Splashcomponent in@rozenite/appowning the whole show/fade/unmount sequence;Apponly tells it whether the shell is up yet.RozeniteLoaderitself: the defaultperioddrops from 3600ms to 2000ms per loop (~24 fps of visible dither flips with the defaultframes, up from ~13). Callers can passperiodto keep the old pace.Related Issue
No tracking issue — this is a follow-up to #446 (
RozeniteLoader), which this puts to use in the standalone app.Context
opacity-100, transitions toopacity-0, and unmounts a full transition later, so it animates off rather than popping. Underprefers-reduced-motionthe transition is dropped and it simply disappears at the end of that window.z-40, underDialog'sz-50. That's what lets the dialogs render over the splash — and keeps a dialog that comes up mid-fade from being covered by the tail of the animation.aria-hidden. The splash is a purely visual cover; the footer's status badge and the dialogs stay in the accessibility tree underneath, so the loader must not duplicate them as a second status.shellMountedlatch, so a mid-session disconnect shows its dialog over the still-mounted shell exactly as before, never over a re-shown splash.WindowDragHandle, which sits above the splash so the Electron window can still be moved while it's up.periodis the only knob for it, and lower is faster; 2000ms keeps the sprite-strip cache and per-framedrawImageplayback unchanged, so this costs nothing at runtime. It's a behavior change for anyone already using the component at its default, hence its own version plan.Testing
pnpm --filter @rozenite/app test— 74 tests passed, including three newApp.test.tsxcases: the splash covers the connecting state, fades (opacity-0) and then unmounts once the shell mounts, and stays opaque behind arozeniteMissingdialog.pnpm checks:affected— typecheck, lint, and format clean across 102 tasks.pnpm test:affected— 63 tasks passing.Note: the last two ran against an earlier revision, before the splash was switched to stay up behind the status dialogs and before the loader default changed; the app tests above are from the final state. Not verified manually against a real device.