@@ -363,19 +363,17 @@ function addToSidebar(sessionId: string, name: string, hasActivePty: boolean) {
363363 <span class="truncate session-name-text" data-id="${ sessionId } ">${ name } </span>
364364 <input type="text" class="session-name-input hidden" data-id="${ sessionId } " value="${ name } " />
365365 </div>
366- <button class="session-delete-btn" data-id="${ sessionId } " title="Delete session">×</button>
366+ <div class="relative">
367+ <button class="session-menu-btn" data-id="${ sessionId } " title="Session options">⋯</button>
368+ <div class="session-menu hidden" data-id="${ sessionId } ">
369+ <button class="session-menu-item rename-session-btn" data-id="${ sessionId } ">Rename</button>
370+ <button class="session-menu-item delete-session-btn" data-id="${ sessionId } ">Delete</button>
371+ </div>
372+ </div>
367373 ` ;
368374
369- // Click on session name to edit
370- const nameText = item . querySelector ( ".session-name-text" ) ;
371- const nameInput = item . querySelector ( ".session-name-input" ) as HTMLInputElement ;
372-
373- nameText ?. addEventListener ( "click" , ( e ) => {
374- e . stopPropagation ( ) ;
375- startEditingSessionName ( sessionId ) ;
376- } ) ;
377-
378375 // Handle input blur and enter key
376+ const nameInput = item . querySelector ( ".session-name-input" ) as HTMLInputElement ;
379377 nameInput ?. addEventListener ( "blur" , ( ) => {
380378 finishEditingSessionName ( sessionId ) ;
381379 } ) ;
@@ -388,18 +386,46 @@ function addToSidebar(sessionId: string, name: string, hasActivePty: boolean) {
388386 }
389387 } ) ;
390388
389+ // Click on item to activate session
391390 item . addEventListener ( "click" , ( e ) => {
392391 const target = e . target as HTMLElement ;
393- if ( ! target . classList . contains ( "session-delete-btn" ) &&
394- ! target . classList . contains ( "session-name-text" ) &&
395- ! target . classList . contains ( "session-name-input" ) ) {
392+ if ( ! target . classList . contains ( "session-menu-btn" ) &&
393+ ! target . classList . contains ( "session-menu-item" ) &&
394+ ! target . classList . contains ( "session-name-input" ) &&
395+ ! target . closest ( ".session-menu" ) ) {
396396 handleSessionClick ( sessionId ) ;
397397 }
398398 } ) ;
399399
400- const deleteBtn = item . querySelector ( ".session-delete-btn" ) ;
400+ // Menu button toggle
401+ const menuBtn = item . querySelector ( ".session-menu-btn" ) ;
402+ const menu = item . querySelector ( ".session-menu" ) as HTMLElement ;
403+
404+ menuBtn ?. addEventListener ( "click" , ( e ) => {
405+ e . stopPropagation ( ) ;
406+
407+ // Close all other menus
408+ document . querySelectorAll ( ".session-menu" ) . forEach ( m => {
409+ if ( m !== menu ) m . classList . add ( "hidden" ) ;
410+ } ) ;
411+
412+ // Toggle this menu
413+ menu ?. classList . toggle ( "hidden" ) ;
414+ } ) ;
415+
416+ // Rename button
417+ const renameBtn = item . querySelector ( ".rename-session-btn" ) ;
418+ renameBtn ?. addEventListener ( "click" , ( e ) => {
419+ e . stopPropagation ( ) ;
420+ menu ?. classList . add ( "hidden" ) ;
421+ startEditingSessionName ( sessionId ) ;
422+ } ) ;
423+
424+ // Delete button
425+ const deleteBtn = item . querySelector ( ".delete-session-btn" ) ;
401426 deleteBtn ?. addEventListener ( "click" , ( e ) => {
402427 e . stopPropagation ( ) ;
428+ menu ?. classList . add ( "hidden" ) ;
403429 deleteSession ( sessionId ) ;
404430 } ) ;
405431
@@ -1464,3 +1490,13 @@ saveSettingsBtn?.addEventListener("click", async () => {
14641490
14651491// Load settings on startup
14661492loadSettings ( ) ;
1493+
1494+ // Close session menus when clicking outside
1495+ document . addEventListener ( "click" , ( e ) => {
1496+ const target = e . target as HTMLElement ;
1497+ if ( ! target . closest ( ".session-menu" ) && ! target . classList . contains ( "session-menu-btn" ) ) {
1498+ document . querySelectorAll ( ".session-menu" ) . forEach ( menu => {
1499+ menu . classList . add ( "hidden" ) ;
1500+ } ) ;
1501+ }
1502+ } ) ;
0 commit comments