Skip to content

feat: redesign onboarding flow, install/progress screens, and shared design tokens#556

Merged
Kosinkadink merged 27 commits into
Comfy-Org:mainfrom
MaanilVerma:feat/redesign-launcher-screens
May 18, 2026
Merged

feat: redesign onboarding flow, install/progress screens, and shared design tokens#556
Kosinkadink merged 27 commits into
Comfy-Org:mainfrom
MaanilVerma:feat/redesign-launcher-screens

Conversation

@MaanilVerma

@MaanilVerma MaanilVerma commented May 14, 2026

Copy link
Copy Markdown
Collaborator

Summary

This PR aligns first-run, install/configure, progress, migrate, and steady-state title bar under one visual and interaction system: frosted brand surfaces, Comfy yellow accents, shared typography tokens, minimal title-bar chrome during onboarding, and flows that read as intentional product steps—not unrelated modals stacked on top of each other.

Highlights

  • First-use: BrandTakeoverLayout, ChoiceCard, cloud vs local, consent with TermsModal, WhyTryCloudModal, legacy migrate vs start fresh list, and telemetry copy. chain-local passes { cameFromLocalBranch: true } when chaining into install after Start fresh so install can offer Back to the fork.
  • First-use → install: There is no separate first-use “name this install” step; naming happens on the Configure step inside NewInstallModal. PanelApp can Tier-3 swap back from configure to the localBranch step via handleNewInstallBackToLocalBranch when the user uses Back.
  • Beams: Light beams use CSS anchor positioning (anchor-name / position-anchor / anchor()) so the spotlight tracks the consent wordmark, cloud pick card, and branded progress wordmark. Beams live inside the inner frame with z-index tuned for content and logo row.
  • Install / configure: Brand-wrapped NewInstallModal and ProgressModal; shared .brand-checkbox, .brand-select, horizontal variant rows on the brand configure surface; PanelApp wires first-use → new install with brand-chrome, hide-back-to-dashboard, and optional open({ initialName }) where still relevant.
  • Progress: Brand progress header (glyph + ComfyWordmark); removed the old blurred circular mask; wordmark carries anchor-name: --brand-beam-target for beam alignment with takeover chrome.
  • Title bar: --titlebar-bg; center identity pill with ComfyCLogo, brand-surface fill and yellow outline; waffle, downloads tray, and Send Feedback stay hidden for the entire first-use takeover (consent + post-consent), not only consent-lockdown.
  • Migrate — two surfaces:
    • First-use chain: MigrateConfirmTakeover + MigrateConfirmBody — full-viewport brand takeover with loading → snapshot summary (counts), bullet list of what migration does, optional checkboxes, confirm/cancel, ESC, and focus restore. Wired via registerMigrateTakeover from PanelApp and useMigrateAction(..., { surface: 'takeover' }).
    • Other entry points (e.g. list/banner/detail): useMigrateAction default surface: 'modal' — legacy ModalDialog confirm path unchanged in role (preview + details + silent recommended variant).
  • Modal chrome (global): Frosted overlay, neutral-800 dialog surface, .modal-box--brand for opt-in brand continuity; ModalDialog no longer embeds the migrate brand layout (moved to takeover + MigrateConfirmBody).
  • Why try cloud: Footer uses shared .brand-primary / .brand-ghost.
  • i18n: English + Chinese for consent/terms, legacy-branch/name strings where keys exist on the branch, and configure/shared action labels as added.
  • A11y (modals): TermsModal and WhyTryCloudModal: initial focus on dismiss control, restore focus to trigger on close.

1. First-use takeover

Consent, ToS/privacy modal, cloud explainer, pick grid, legacy branch choices, and handoff into cloud, local install, or migrate—aligned with .brand-* primitives and main.css tokens.

2. Beams and anchor layout

BrandTakeoverLayout + FirstUseTakeover (and ProgressModal) define anchor targets so beams stay visually tied to wordmark/cards across resize.

3. Install, progress, and panel chaining

Wizard and in-flow progress reuse BrandTakeoverLayout where appropriate; PanelApp orchestrates overlays, chain flags, and back navigation from configure to localBranch when applicable.

4. Title bar during onboarding

Minimal identity bar until firstUseMode === 'none'; center pill carries Comfy C + install label with a reserved trailing slot for future picker UI.

5. Migrate

findBestVariant still selects the recommended variant without a user-facing device picker. First-use migrate uses the takeover surface; non–first-use callers keep the modal surface.

6. Design tokens and shared CSS

--brand-surface-*, --accent-primary, --titlebar-bg, primary button refresh, .brand-hero / .brand-title / .brand-lead, .brand-checkbox, .brand-select, .brand-primary / .brand-ghost, and global modal overlay/box rules.

Not in scope / follow-ups

  • Main-process / application menu (src/main/index.ts, menu.ts, menu.test.ts) — keep in a separate PR if not part of this branch.
  • Cleanup: retired instName / pendingFirstUseInstName bridge for a removed name step may still be marked with TODO in PanelApp for a fast follow-up delete once reviewers sign off.
  • Title bar: trailing slot wiring (instance picker / caret) when product spec is ready.

Test plan

  • pnpm run typecheck
  • pnpm run lint
  • pnpm run build
  • pnpm run test
  • First-use (cold): consent → pick → if legacy, migrate vs start freshStart freshConfigure: name install; Back returns to migrate vs start fresh (not consent).
  • First-use migrate: from legacy path, Migrate opens brand takeover (not small centered modal); confirm/cancel and ESC behave correctly; focus returns to sensible element.
  • Migrate elsewhere: from chooser/install UI (non–first-use), confirm still uses modal path and completes with expected target.
  • Chain local install from first-use: branded install + progress; Back to dashboard behavior when chaining.
  • Title bar: during full takeover, no waffle / downloads / feedback; after completion, full chrome returns; pill shows logo + identity in steady state.
  • Beams: resize on consent, cloud pick, and branded progress; spotlight stays plausible vs wordmark/card.
  • Locales: spot-check zh on first-use + migrate-related strings on this branch.

Reviewer note: work is split across multiple conventional commits on this branch for bisect and review.

- Add BrandTakeoverLayout, ChoiceCard, WhyTryCloudModal, and ComfyCLogo
- Ship PP Formula ExtraBold, beam lighting art, and why-cloud hero SVG
- Refactor FirstUseTakeover.vue, expand main.css, and update en/zh copy
SVG icon components for the branded progress modal header.
- Add --brand-surface-* and --accent-primary; refresh global primary buttons
- Centralize .brand-hero / .brand-title / .brand-lead for reused chrome
- Wire ChoiceCard and BrandTakeoverLayout to the tokenized surfaces
Drop duplicated pick hero styles in favor of global .brand-* primitives
from main.css so configure/install flows stay visually aligned.
Add install.* configure/help-improve copy plus common continue/learnMore
labels in English and Chinese.
Redesign NewInstallModal and ProgressModal around BrandTakeoverLayout;
show wordmark/glyph progress chrome when appropriate. PanelApp passes
brand-chrome / hide-back-to-dashboard when chaining first-use into install.
Add TermsModal for in-app privacy policy and refresh first-use consent
layout and copy. Move checkbox chrome to main.css as .brand-checkbox and
reuse it from NewInstallModal; extend BrandTakeoverLayout for the flow.
- BrandTakeoverLayout: optional vignette, viewport-fixed beams aligned
  with centered wordmark, neutral-800 inner frame
- FirstUseTakeover: enable vignette on pick; use primary + consent CTA sizing
- ChoiceCard: drop redundant glow layers (beam carries the spotlight)
- main.css: brand-checkbox hover border state
Add .brand-select / .brand-tag-recommended for the configure surface,
soften .brand-title opacity, and ease primary hover transitions.
Shorter migrate/start-fresh labels, name-install step strings, and
nameInstallHint for the first-use chain.
Use --takeover-fs-body for description text so it steps down from the label.
…lName })

Restyle the brand-mode configure step with horizontal variant rows
(icons + check), invisible native select under .brand-select triggers,
and optional initialName pre-seed for the first-use chain.
Replace migrate/start-fresh ChoiceCards with stacked lb-cards; add
nameInstall step before chain-local; forward instName to PanelApp and
into NewInstallModal.open({ initialName }).
Mirror firstUse consent/terms keys and local-branch/name-install copy in
Chinese alongside the English additions.
Nudge checkbox top margin and size hints with takeover body type.
Paint ComfyWordmark in #F0FF41 and align consent chrome with isolated
stacking context.
Trap initial focus on the dismiss control and return focus to the
opening element on teardown.
Match terms-modal focus trap/restore, lighten panel shadow treatment,
and refine benefit/secondary action styling.
Move beams inside the inner frame, use anchor() / position-anchor so
spotlight tracks the consent wordmark and cloud ChoiceCard; expose
anchor names from FirstUseTakeover and tune z stacking for the logo row.
Remove the blurred circular mask behind the progress glyph/wordmark and
set anchor-name on the wordmark so TakeoverLayout beams can track the
same target as first-use flows.
- Add --titlebar-bg and use it for the title-bar surface
- Restyle the center identity pill with ComfyCLogo, brand-surface fill,
  and yellow outline; reserve trailing slot for future picker
- Hide waffle, downloads tray, and feedback for the whole first-use
  takeover (consent + post-consent), not only consent-lockdown
- Update TitleBarApp tests for the new gating
- ModalDialog: migrate flow uses brand shell and snapshot summary rows
  (counts only); drop user-facing device picker surface
- useMigrateAction: findBestVariant in-process; pass target without
  variant card confirmation
- main.css: frosted modal overlay, neutral-800 dialog surface,
  modal-box--brand tokens, list item contrast
- PanelApp: minor branch formatting
@Kosinkadink

Copy link
Copy Markdown
Member

Thanks! Will review today + over the weekend 🫡

- Add MigrateConfirmTakeover + MigrateConfirmBody (brand layout, focus
  trap); PanelApp registers the surface and routes first-use migrate
  through confirmMigration(..., { surface: 'takeover' })
- useMigrateAction: modal vs takeover branches share one result shape;
  other callsites keep the Modal path
- Retire the first-use name-install sub-step; naming stays on Configure;
  chain-local passes cameFromLocalBranch so NewInstallModal can show
  Back to the local-branch fork and PanelApp can Tier-3 swap back
- Trim ModalDialog by removing inline migrate brand layout
- WhyTryCloudModal: shared brand-primary / brand-ghost classes; CSS
  tweaks in main.css for those primitives and migrate chrome
Drop theme-backed background on the header so --titlebar-bg wins; remove
the unused themeBg destructure from useTitleBarIdentity.
@MaanilVerma MaanilVerma mentioned this pull request May 18, 2026
7 tasks
@Kosinkadink Kosinkadink merged commit 660518b into Comfy-Org:main May 18, 2026
9 checks passed
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