feat(desktop): onboarding polish — docked CTAs, backup key card, dot grid#2008
Merged
Conversation
Dock the primary/secondary CTAs of every onboarding step to the bottom of the viewport via a portal (OnboardingFooter) so they clear the transform containment that traps position:fixed, with a scrim so scrolled content fades under them. Add shared OnboardingChrome (top-left mark + step-dots pagination), replacing OnboardingStepDots. Applies across the machine, relay, and community flows and all steps. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…lors Backup step: frame the private key in a translucent white card (bg-white/50, 12px radius) with olive ink (--buzz-onboarding-backup-ink) on the key and the "never share" caption; large 36px mono key via a nsec-key token; no layout shift on reveal (same-length mask). Copy now works whether or not the key is revealed. Fix key overflow in WKWebView: WebKit will not line-break a run of U+2022 bullets even with break-all/overflow-wrap, so the masked key ran off its container (Chromium-based Playwright never caught it). Join the mask bullets with a zero-width space; the wrapping text is a block inside the flex item. Also: dot-grid pattern on all onboarding pages, and split the primary-CTA label color — chartreuse on the landing screen, light blue inside the steps. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- Guard NostrKeyImportForm handleSubmit against re-entry: the portaled submit button is now type=button, so the single-field form still submits on Enter — without the guard a second Enter during an in-flight import fired a duplicate onImport (double keyring write). - Restore variant-aware submit styling so KeyringLockedScreen (default variant, rendered outside the onboarding footer provider) keeps its full-width button instead of a mismatched docked pill. - Restore bottom padding on the avatar step so its tall emoji/color grid scrolls clear of the always-docked footer + scrim on short windows. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
- CommunityOnboardingFlow: derive the step-dot position from the same condition that picks the rendered page, so the dots no longer regress 6->5 while the starter-team page shows 'Preparing Welcome...' during the finalizing transient. - onboarding-avatar-skip / onboarding-backup specs: capture the full viewport instead of the step subtree, so the portaled docked CTAs actually appear in the QA screenshots again. - NsecMaskedDisplay: memoize the masked-bullet string on nsec instead of reallocating it every render. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
brow
approved these changes
Jul 17, 2026
Contributor
|
🤖 Review summary (approved — no blockers). Cross-posting from the Buzz review thread for the record. What I checked (full diff, all 19 files, base 2494926, head 307263d):
One nit posted inline (non-blocking): |
brow
reviewed
Jul 17, 2026
| import { useSystemColorScheme } from "@/shared/theme/useSystemColorScheme"; | ||
| import { Button } from "@/shared/ui/button"; | ||
| import { StartupWindowDragRegion } from "@/shared/ui/StartupWindowDragRegion"; | ||
| import { StepProgress } from "@/shared/ui/step-progress"; |
Contributor
There was a problem hiding this comment.
🤖 Non-blocking nit: with this last import gone (the AvatarStep usage is also removed in this PR), desktop/src/shared/ui/step-progress.tsx is now dead code — nothing references StepProgress anymore. Fine to drop in a follow-up polish PR.
Reconcile the onboarding polish PR (#2008) with main's onboarding reskin (#2003), which both redesigned the same screens. Resolution (per design sign-off): - Step chrome: keep our OnboardingChrome (static bee + centered progress bar); drop the OnboardingStepDots component. Bump the shared page count to 7 to include main's new Default-config step. WelcomeSetup now uses OnboardingChrome. - CTA placement: keep our bottom-docked OnboardingFooter across every step, including main's new/reskinned Setup, Default-config, and Community pages. - Keep main's newly shipped functionality: the Default-config step and the community inline avatar editor. - Keep our non-conflicting backup/key work (WebKit wrap fix, translucent key card, olive key color, copy-while-masked, double-import guard). - Align happy-path page titles to the text-title token (40px) for a consistent flow.
Remove machine-local Claude permissions, restart logs, and the stale process ID accidentally included while resolving onboarding conflicts. Co-authored-by: Pinky <44b8e82baa6e0e254e0208d68f335c283c94e7b78dd1fa10d5a49d3f13dd0435@sprout-oss.stage.blox.sqprod.co> Signed-off-by: Wes <wesbillman@users.noreply.github.com>
wesbillman
enabled auto-merge (squash)
July 17, 2026 03:27
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
Polish pass over the desktop onboarding flow.
OnboardingFooter), clearing the transform-containment that trapsposition: fixed, with a scrim so scrolled content fades under them. Applies across the machine, relay, and community flows.OnboardingChrome(top-left Buzz mark + step-dots pagination), replacingOnboardingStepDots.bg-white/50, 12px radius) with olive ink (--buzz-onboarding-backup-ink) on the key and the "never share" caption; 36px mono key via ansec-keytoken; no layout shift on reveal (same-length mask). Copy now works whether or not the key is revealed.The non-obvious bug (worth a look)
The masked key overflowed its container only in WKWebView — WebKit will not line-break a run of
•(U+2022) even withword-break: break-all/overflow-wrap: anywhere, while Chromium breaks it fine. Our Playwright suite runs Chromium, so it never caught this. Fix: the mask joins its bullets with a zero-width space (a break opportunity WebKit honors), and the wrapping text is a plain block inside the flex item. Verified in the WebKit engine that both masked and revealed states wrap and stay inside the card. SeeNsecMaskedDisplay.tsx.Testing
desktop-check,desktop-test,desktop-tauri-testpass;pnpm check:px-textandpnpm run buildclean.onboarding-docked-cta-screenshots.spec.ts;identity-lost.spec.tsupdated for the dot-grid background.🤖 Generated with Claude Code