@@ -23,6 +23,7 @@ final class WizardWindowController {
2323 private var hostingView : NSView ?
2424 private var windowDelegate : WizardWindowDelegate ?
2525 private var onDismiss : ( ( ) -> Void ) ?
26+ private var onboardingViewModel : KanataViewModel ?
2627 private var sizeObserver : NSObjectProtocol ?
2728 private var resizeDebounceWorkItem : DispatchWorkItem ?
2829
@@ -35,6 +36,9 @@ final class WizardWindowController {
3536 onDismiss: ( ( ) -> Void ) ? = nil
3637 ) {
3738 self . onDismiss = onDismiss
39+ if let kanataViewModel {
40+ onboardingViewModel = kanataViewModel
41+ }
3842
3943 // If window already exists and is visible, just bring it to front
4044 if let existingWindow = window, existingWindow. isVisible {
@@ -49,7 +53,12 @@ final class WizardWindowController {
4953
5054 AppLogger . shared. log ( " 🔮 [WizardWindow] Opening wizard window (initialPage: \( initialPage? . displayName ?? " nil " ) ) " )
5155
52- let wizardView = InstallationWizardView ( initialPage: initialPage)
56+ let wizardView = InstallationWizardView (
57+ initialPage: initialPage,
58+ onFirstSuccess: { [ weak self] in
59+ self ? . showFirstSuccessOnboarding ( )
60+ }
61+ )
5362
5463 // Create hosting view - let SwiftUI determine ideal height
5564 let styledView = wizardView
@@ -211,6 +220,17 @@ final class WizardWindowController {
211220 onDismiss = nil
212221 }
213222
223+ private func showFirstSuccessOnboarding( ) {
224+ // Let AppKit complete the wizard close before presenting a separate
225+ // learning panel. This keeps the two moments spatially distinct.
226+ let viewModel = onboardingViewModel ?? ( NSApp . delegate as? AppDelegate ) ? . viewModel
227+ DispatchQueue . main. asyncAfter ( deadline: . now( ) + 0.25 ) {
228+ FirstSuccessOnboardingWindowController . show (
229+ kanataViewModel: viewModel
230+ )
231+ }
232+ }
233+
214234 /// Check if the wizard window is currently visible
215235 var isVisible : Bool {
216236 window? . isVisible ?? false
0 commit comments