Skip to content

feat(app): show a startup splash while connecting to the device - #451

Merged
V3RON merged 4 commits into
mainfrom
claude/rozeniteloader-splash-screen-h5ist9
Aug 23, 2026
Merged

feat(app): show a startup splash while connecting to the device#451
V3RON merged 4 commits into
mainfrom
claude/rozeniteloader-splash-screen-h5ist9

Conversation

@V3RON

@V3RON V3RON commented Aug 21, 2026

Copy link
Copy Markdown
Contributor

Description

Covers the standalone app's window with a startup splash — RozeniteLoader centered on the app's own --background — for as long as the device handshake is in flight, then fades it off once the shell mounts.

  • New Splash component in @rozenite/app owning the whole show/fade/unmount sequence; App only tells it whether the shell is up yet.
  • Replaces the bare "Connecting to device…" empty state that used to fill that time.
  • The splash stays up behind the pre-connection status dialogs ("Can't reach the dev server", "Rozenite isn't set up in this app"), which now sit on it as their backdrop instead of on an empty window.
  • Speeds up RozeniteLoader itself: the default period drops from 3600ms to 2000ms per loop (~24 fps of visible dither flips with the default frames, up from ~13). Callers can pass period to 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

  • Fade, then unmount. The splash renders at opacity-100, transitions to opacity-0, and unmounts a full transition later, so it animates off rather than popping. Under prefers-reduced-motion the transition is dropped and it simply disappears at the end of that window.
  • Minimum visible time (450 ms). A device on the same machine can connect in a couple of hundred milliseconds; without a floor, the splash blinks in and straight back out, which reads as a glitch. The cost is a short hold on the fastest connections.
  • z-40, under Dialog's z-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.
  • Never comes back. Visibility is driven off the existing sticky shellMounted latch, so a mid-session disconnect shows its dialog over the still-mounted shell exactly as before, never over a re-shown splash.
  • The pre-shell branch now renders only WindowDragHandle, which sits above the splash so the Electron window can still be moved while it's up.
  • Loader speed. period is the only knob for it, and lower is faster; 2000ms keeps the sprite-strip cache and per-frame drawImage playback 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 new App.test.tsx cases: the splash covers the connecting state, fades (opacity-0) and then unmounts once the shell mounts, and stays opaque behind a rozeniteMissing dialog.
  • 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.

claude added 2 commits August 21, 2026 19:49
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
@vercel

vercel Bot commented Aug 22, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
rozenite Skipped Skipped Aug 22, 2026 7:22am

Request Review

@V3RON
V3RON merged commit b758637 into main Aug 23, 2026
6 checks passed
@V3RON
V3RON deleted the claude/rozeniteloader-splash-screen-h5ist9 branch August 23, 2026 19:29
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants