Merged
Conversation
…nditional UI - Fix false needsBootloaderUpdate when device already in bootloader mode (extractVersion returns BL version as fwVersion; use it for comparison) - Fix needsFirmwareUpdate in bootloader mode (always true, was comparing BL version against latest firmware) - Show hold-and-connect SVG + instructions only when device is NOT in bootloader mode; auto-start update when already in bootloader - Add pulsing "confirm on device" box and striped progress bar during firmware upload - Add verify-backup-skip hints for both bootloader and firmware updates - Add i18n keys for new UX elements Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Hide "Important" box once update starts (shown only in idle state) - Merge "confirm on device" and "verify backup" into single pulsing box - Remove separate red "do not unplug" box, inline it under progress bar - Remove redundant "uploading firmware" and "device will restart" labels - Progress bar now shows percentage left, do-not-unplug right Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Firmware flashing (firmwareErase + firmwareUpload) requires the device to be in bootloader mode. Previously the wizard blindly called startFirmwareUpdate() which failed with "Not in bootloader mode". Now the firmware step mirrors the bootloader step's flow: - If device is NOT in bootloader mode: show hold-and-connect SVG + 4-step instructions + "I'm Ready" button that polls for bootloader - If device IS in bootloader mode: auto-start firmware update - Event-driven detection via deviceStatus.bootloaderMode push Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…nect - Shrink hold-and-connect SVG to 140px with reduced opacity - Remove "I'm Ready" button — auto-start bootloader polling on step entry - Keep wizard open during disconnect when on bootloader/firmware steps (setupInProgress flag prevents phase flip to splash) - Compact instruction text (smaller font, tighter spacing) - Skip button demoted to subtle ghost link Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- RPC: timeoutMs=0 means no timeout (was 600s), used for all device-interactive ops (firmware flash, seed verify, PIN, wipe) - Electrobun RPC maxRequestTime set to Infinity - Setup wizard: collapsible seed length selector on create card, prominent selector on recovery card, remove top-level word count bar - Remove cursor:pointer from non-clickable create card container Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The wizard overlay now acts as a drag surface so the window can be moved during onboarding. The card itself uses stopPropagation to keep buttons interactive. All steps are significantly more compact: smaller icons, tighter padding, reduced font sizes, and a maxH constraint with overflow scroll so the wizard fits cleanly within any window size. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
When setupInProgress is true, the phase stays "setup" regardless of device state. Previously only "disconnected" was covered, so transient states like "connected_unpaired" during firmware update bootloader reboot would kick the user back to the splash screen. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Inset drag backdrop 6px from edges so native resize handles remain clickable while still allowing window move from the backdrop area. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Electrobun's native startWindowMove and resize are broken on Windows WS_POPUP windows. This adds custom JS-driven drag and resize for Windows while keeping macOS unchanged (platform-gated via IS_WINDOWS). - useWindowDrag hook: mousedown → getFrame → track deltas → setFrame - WindowResizeHandles: 8 invisible edge/corner handles with min 600x400 - rpcFire: fire-and-forget RPC for smooth drag/resize during mousemove - SplashScreen dragProps: drag works on all app phases (splash, claimed, ready) - installer.iss: always install WebView2 (fixes silent launch failure) Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ogic After bootloader/firmware flash, the wizard no longer uses a stale 5s timer to advance. Instead it enters a rebootPhase and waits for the device to reconnect with fresh features (firmwareVersion defined) before routing to the correct next step. All firmware update errors are suppressed from the UI (console-only) since USB disconnect errors are expected post-flash. Do-not-unplug warning changed from red to yellow. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…N loop After a firmware/bootloader flash the device reboots and the transport needs time to stabilise. Previously promptPin() fired immediately on needs_pin state, causing getPublicKeys to race with the freshly-booted device — the device responded with Failure(7) "Invalid PIN" before the user could enter their PIN, triggering a disconnect/reconnect loop. Now when updatePhase is 'rebooting', promptPin() is delayed 2s and updatePhase is reset to 'idle' so the wizard advancement effect sees fresh state. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…loop After firmware flash or USB detach, the keyring still tracked the old wallet connection. When pairRawDevice was called on reconnect, WebUSB rejected with "cannot connect an already-connected connection", causing an infinite retry loop. Added clearWallet() helper that nulls wallet/transport/features AND calls keyring.removeAll() so the next pair starts fresh. Used in all teardown paths: USB detach, lost connection, failed features, and all three flash completion sites (bootloader, firmware, custom firmware). Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Electrobun's drag system uses a document-level mousedown listener that
checks e.target.closest(".electrobun-webkit-app-region-drag"). The
wizard's full-viewport drag backdrop was intercepting clicks on inputs
because React's synthetic stopPropagation doesn't prevent native events
from reaching the document listener.
- Remove drag backdrop from OobSetupWizard entirely
- Add SplashNav component (drag-enabled nav bar + traffic lights) for
splash/setup/claimed phases
- Replace floating windowControls overlay with SplashNav
- Ready phase uses TopNav (already has drag region)
- All form inputs, buttons, copy/paste now work normally
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…ebView titleBarStyle: "hidden" (Titled: false + FullSizeContentView: true) breaks keyboard focus on form inputs in Electrobun's WKWebView on macOS. Reverted to default titlebar which restores all form input, resize, and drag. - Remove titleBarStyle: "hidden" from BrowserWindow config - Remove custom TrafficLights component (native macOS controls suffice) - Strip drag class/stopPropagation from TopNav (no longer needed) - Change ready-phase bg from transparent to kk.bg (solid #000000) - Add -webkit-app-region: no-drag CSS on interactive elements - Add PIN wipe-from-lockscreen with confirmation dialog (10 langs) - Cancel pending PIN request before wipe to prevent transport deadlock Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
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.
Summary
Test plan
🤖 Generated with Claude Code