1( function () { 2 'use strict'; 3 4 var root = document.querySelector( '.lexum-chat-widget' ); 5 if ( ! root ) { 6 return; 7 } 8 9 var launcher = root.querySelector( '.lexum-chat-widget__launcher' ); 10 var panel = root.querySelector( '.lexum-chat-widget__panel' ); 11 var closeBtn = root.querySelector( '.lexum-chat-widget__close' ); 12 var newChatBtn = root.querySelector( '.lexum-chat-widget__newchat' ); 13 var chat = panel.querySelector( 'deep-chat' ); 14 var nudge = root.querySelector( '.lexum-chat-widget__nudge' ); 15 var nudgeHideTimer = null; 16 17 function isOpen() { 18 return root.getAttribute( 'data-state' ) === 'open'; 19 } 20 21 // Dismissible "chat exists here" callout: shown at most once per day 22 // (localStorage), 15s after load, auto-hides after 60s if not dismissed. 23 // Any appearance â dismissed, auto-hidden, or interrupted by opening the 24 // chat â counts toward the once-per-day cap (marked at show time, below). 25 function hideNudge() { 26 if ( ! nudge ) { 27 return; 28 } 29 nudge.setAttribute( 'hidden', '' ); 30 if ( nudgeHideTimer ) { 31 clearTimeout( nudgeHideTimer ); 32 nudgeHideTimer = null; 33 } 34 } 35 36 if ( nudge ) { 37 var NUDGE_SHOWN_KEY = 'lexum_ai_chat_nudge_shown'; 38 var nudgeClose = nudge.querySelector( '.lexum-chat-widget__nudge-close' ); 39 40 var nudgeShownToday = function () { 41 try { 42 return window.localStorage.getItem( NUDGE_SHOWN_KEY ) === new Date().toDateString(); 43 } catch ( e ) { 44 return false; 45 } 46 }; 47 48 var showNudge = function () { 49 if ( isOpen() || nudgeShownToday() ) { 50 return; 51 } 52 nudge.removeAttribute( 'hidden' ); 53 try { 54 window.localStorage.setItem( NUDGE_SHOWN_KEY, new Date().toDateString() ); 55 } catch ( e ) {} 56 nudgeHideTimer = setTimeout( hideNudge, 60000 ); 57 }; 58 59 if ( ! nudgeShownToday() ) { 60 setTimeout( showNudge, 15000 ); 61 } 62 63 if ( nudgeClose ) { 64 nudgeClose.addEventListener( 'click', hideNudge ); 65 } 66 } 67 68 function setOpen( open ) { 69 root.setAttribute( 'data-state', open ? 'open' : 'closed' ); 70 launcher.setAttribute( 'aria-expanded', open ? 'true' : 'false' ); 71 72 if ( open ) { 73 hideNudge(); 74 panel.removeAttribute( 'hidden' ); 75 if ( chat ) { 76 chat.dispatchEvent( new CustomEvent( 'lexum:opened' ) ); 77 } 78 setTimeout( function () { 79 try { 80 var input = chat && chat.shadowRoot && 81 chat.shadowRoot.querySelector( '[contenteditable], textarea, input' ); 82 if ( input ) { 83 input.focus(); 84 } 85 } catch ( e ) {} 86 }, 150 ); 87 } else { 88 panel.setAttribute( 'hidden', '' );
89 launcher.focus(); 90 } 91 } 92 93 launcher.addEventListener( 'click', function () { 94 setOpen( ! isOpen() ); 95 } ); 96 97 if ( closeBtn ) { 98 closeBtn.addEventListener( 'click', function () { 99 setOpen( false ); 100 } ); 101 } 102 103 if ( newChatBtn ) { 104 newChatBtn.addEventListener( 'click', function () { 105 if ( chat ) { 106 chat.dispatchEvent( new CustomEvent( 'lexum:new-chat' ) ); 107 } 108 } ); 109 } 110 111 document.addEventListener( 'keydown', function ( e ) { 112 if ( ( e.key === 'Escape' || e.key === 'Esc' ) && isOpen() ) { 113 setOpen( false ); 114 } 115 } ); 116} )();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.