@@ -409,6 +409,30 @@ describe("app routing precedence", () => {
409409 assert . equal ( chordHits , 0 ) ;
410410 } ) ;
411411
412+ test ( "mouse up does not clear chord started after mouse down" , async ( ) => {
413+ const backend = new StubBackend ( ) ;
414+ let chordHits = 0 ;
415+
416+ const app = createApp ( { backend, initialState : 0 } ) ;
417+ app . keys ( {
418+ "g g" : ( ) => {
419+ chordHits ++ ;
420+ } ,
421+ } ) ;
422+ app . view ( ( ) => ui . text ( "No focusable widgets" ) ) ;
423+
424+ await app . start ( ) ;
425+ await pushEvents ( backend , [ { kind : "resize" , timeMs : 1 , cols : 40 , rows : 10 } ] ) ;
426+ await settleNextFrame ( backend ) ;
427+
428+ await pushEvents ( backend , [ { kind : "mouse" , timeMs : 2 , x : 0 , y : 0 , mouseKind : 3 , buttons : 1 } ] ) ;
429+ await pushEvents ( backend , [ { kind : "key" , timeMs : 3 , key : KEY_G , action : "down" } ] ) ;
430+ await pushEvents ( backend , [ { kind : "mouse" , timeMs : 4 , x : 0 , y : 0 , mouseKind : 4 , buttons : 0 } ] ) ;
431+ await pushEvents ( backend , [ { kind : "key" , timeMs : 5 , key : KEY_G , action : "down" } ] ) ;
432+
433+ assert . equal ( chordHits , 1 ) ;
434+ } ) ;
435+
412436 test ( "app-level keybinding consumes Enter before widget-level button routing" , async ( ) => {
413437 const backend = new StubBackend ( ) ;
414438 let keybindingHits = 0 ;
0 commit comments