@@ -3294,24 +3294,29 @@ function handleMinimapClick(event: MouseEvent): void {
32943294let minimapPreviewTimer : ReturnType < typeof setTimeout > | null = null ;
32953295let minimapPreviewHideTimer : ReturnType < typeof setTimeout > | null = null ;
32963296let minimapPreviewLine = - 1 ;
3297+ let minimapPreviewLastY = - 1 ; // Last Y that triggered a preview render
3298+ let minimapPreviewLocked = false ; // True when user is interacting with preview
32973299
32983300function isMinimapPreviewEnabled ( ) : boolean {
32993301 return userSettings . minimapPreview ;
33003302}
33013303
33023304function setupMinimapPreviewListeners ( previewEl : HTMLElement ) : void {
33033305 previewEl . addEventListener ( 'mouseenter' , ( ) => {
3304- // Cancel any pending hide when mouse enters preview
3306+ // Lock preview in place while user is inside it
3307+ minimapPreviewLocked = true ;
33053308 if ( minimapPreviewHideTimer ) { clearTimeout ( minimapPreviewHideTimer ) ; minimapPreviewHideTimer = null ; }
33063309 } ) ;
33073310 previewEl . addEventListener ( 'mouseleave' , ( ) => {
3308- // Hide after a short delay when mouse leaves preview
3309- minimapPreviewHideTimer = setTimeout ( ( ) => hideMinimapPreviewNow ( ) , 200 ) ;
3311+ minimapPreviewLocked = false ;
3312+ minimapPreviewHideTimer = setTimeout ( ( ) => hideMinimapPreviewNow ( ) , 300 ) ;
33103313 } ) ;
33113314}
33123315
33133316function handleMinimapHover ( event : MouseEvent ) : void {
33143317 if ( ! minimapElement || isDraggingMinimap || ! isMinimapPreviewEnabled ( ) ) return ;
3318+ // Don't reposition if the user is interacting with the preview
3319+ if ( minimapPreviewLocked ) return ;
33153320 // Cancel any pending hide
33163321 if ( minimapPreviewHideTimer ) { clearTimeout ( minimapPreviewHideTimer ) ; minimapPreviewHideTimer = null ; }
33173322
@@ -3321,9 +3326,13 @@ function handleMinimapHover(event: MouseEvent): void {
33213326 const totalLines = getTotalLines ( ) ;
33223327 if ( totalLines === 0 ) return ;
33233328
3329+ // Require at least 15px vertical movement before repositioning the preview
3330+ if ( minimapPreviewLastY >= 0 && Math . abs ( hoverY - minimapPreviewLastY ) < 15 ) return ;
3331+
33243332 const targetLine = Math . floor ( ( hoverY / minimapHeight ) * totalLines ) ;
33253333 if ( targetLine === minimapPreviewLine ) return ;
33263334 minimapPreviewLine = targetLine ;
3335+ minimapPreviewLastY = hoverY ;
33273336
33283337 if ( minimapPreviewTimer ) clearTimeout ( minimapPreviewTimer ) ;
33293338 minimapPreviewTimer = setTimeout ( async ( ) => {
@@ -3364,6 +3373,8 @@ function hideMinimapPreviewNow(): void {
33643373 if ( minimapPreviewTimer ) { clearTimeout ( minimapPreviewTimer ) ; minimapPreviewTimer = null ; }
33653374 if ( minimapPreviewHideTimer ) { clearTimeout ( minimapPreviewHideTimer ) ; minimapPreviewHideTimer = null ; }
33663375 minimapPreviewLine = - 1 ;
3376+ minimapPreviewLastY = - 1 ;
3377+ minimapPreviewLocked = false ;
33673378 const preview = document . getElementById ( 'minimap-preview' ) ;
33683379 if ( preview ) preview . classList . add ( 'hidden' ) ;
33693380}
@@ -4192,6 +4203,11 @@ async function toggleRecentFilesPopup(): Promise<void> {
41924203 }
41934204
41944205 popup . innerHTML = html ;
4206+
4207+ // Position below the Open File button using fixed positioning
4208+ const btnRect = elements . btnOpenFile . getBoundingClientRect ( ) ;
4209+ popup . style . top = `${ btnRect . bottom + 4 } px` ;
4210+ popup . style . left = `${ btnRect . left } px` ;
41954211 popup . classList . remove ( 'hidden' ) ;
41964212
41974213 // Wire up clicks
@@ -12704,7 +12720,11 @@ function init(): void {
1270412720 elements . logo . style . cursor = 'pointer' ;
1270512721
1270612722 // File operations
12707- elements . btnOpenFile . addEventListener ( 'click' , openFile ) ;
12723+ elements . btnOpenFile . addEventListener ( 'click' , ( e ) => {
12724+ // Don't open file dialog if the recent files chevron was clicked
12725+ if ( ( e . target as HTMLElement ) . id === 'btn-recent-files' ) return ;
12726+ openFile ( ) ;
12727+ } ) ;
1270812728 elements . btnRecentFiles . addEventListener ( 'click' , ( e ) => {
1270912729 e . stopPropagation ( ) ;
1271012730 e . preventDefault ( ) ;
0 commit comments