@@ -34,6 +34,7 @@ export interface AppControllerResult {
3434 zIndex : number ;
3535 showBanner : boolean ;
3636 animateBanner : boolean ;
37+ startupAnimationActive : boolean ;
3738 } ;
3839 isListeningDim : boolean ;
3940 listeningDimTop : number ;
@@ -65,13 +66,6 @@ export function useAppController({
6566 const [ isInitialLoad , setIsInitialLoad ] = useState ( true ) ;
6667 const [ startupIntroDone , setStartupIntroDone ] = useState ( false ) ;
6768
68- useEffect ( ( ) => {
69- // Delay idle UI chrome (status/hotkeys) so the banner can resolve first.
70- const delayMs = Math . max ( 0 , STARTUP_BANNER_DURATION_MS - STARTUP_IDLE_CHROME_LEAD_MS ) ;
71- const t = setTimeout ( ( ) => setStartupIntroDone ( true ) , delayMs ) ;
72- return ( ) => clearTimeout ( t ) ;
73- } , [ ] ) ;
74-
7569 // Update terminal size state on resize to trigger re-render
7670 useOnResize ( ( width , height ) => {
7771 setTerminalSize ( { width, height } ) ;
@@ -141,6 +135,19 @@ export function useAppController({
141135 preferencesLoaded,
142136 showDeviceMenu,
143137 } ) ;
138+ const onboardingComplete = preferencesLoaded && ! bootstrap . onboardingActive ;
139+
140+ useEffect ( ( ) => {
141+ if ( ! onboardingComplete ) {
142+ setStartupIntroDone ( false ) ;
143+ return ;
144+ }
145+ // Delay idle UI chrome (status/hotkeys) so the banner can resolve first.
146+ const delayMs = Math . max ( 0 , STARTUP_BANNER_DURATION_MS - STARTUP_IDLE_CHROME_LEAD_MS ) ;
147+ setStartupIntroDone ( false ) ;
148+ const t = setTimeout ( ( ) => setStartupIntroDone ( true ) , delayMs ) ;
149+ return ( ) => clearTimeout ( t ) ;
150+ } , [ onboardingComplete ] ) ;
144151
145152 const daemon = useDaemonRuntimeController ( {
146153 currentModelId,
@@ -408,6 +415,8 @@ export function useAppController({
408415 }
409416 } , [ daemon . hasInteracted , startupIntroDone ] ) ;
410417
418+ const startupAnimationActive = onboardingComplete && isInitialLoad ;
419+
411420 const appContextValue = useAppContextBuilder ( {
412421 menus : {
413422 showDeviceMenu,
@@ -521,10 +530,10 @@ export function useAppController({
521530 height : avatarHeight ,
522531 zIndex : isListening && daemon . hasInteracted ? 2 : 0 ,
523532 // Show banner only when idle, not interacted, and terminal is large enough
524- // Banner is 8 lines tall and ~94 chars wide
525- showBanner : ! daemon . hasInteracted && terminalSize . height >= 30 && terminalSize . width >= 100 ,
526- // Animate banner with glitch effect on initial app load
527- animateBanner : isInitialLoad ,
533+ showBanner :
534+ onboardingComplete && ! daemon . hasInteracted && terminalSize . height >= 30 && terminalSize . width >= 100 ,
535+ animateBanner : startupAnimationActive ,
536+ startupAnimationActive ,
528537 } ,
529538 isListeningDim,
530539 listeningDimTop : statusBarHeight ,
0 commit comments