1(function ($) { 2 'use strict'; 3 4 var expandedClass = 'wp-chatbot-is-expanded'; 5 var bodyExpandedClass = 'wp-chatbot-expanded-active'; 6 7 function getBotConfig() { 8 return window.wp_chatbot_obj || window.wpChatBotVar || {}; 9 } 10 11 function isExpandSupported() { 12 return $('#wp-chatbot-desktop-expand').length > 0; 13 } 14 15 function isMobileFullScreenViewport() { 16 return ( 17 window.matchMedia('(max-width: 1024px)').matches && 18 $('#wp-chatbot-chat-container').hasClass('wp-chatbot-mobile-full-screen') 19 ); 20 } 21 22 function getDefaultContentHeight() { 23 var maxHeight = parseInt(getBotConfig().chatbot_content, 10); 24 25 if (isNaN(maxHeight) || maxHeight <= 0) { 26 maxHeight = 650; 27 } 28 29 return Math.max(280, maxHeight - 50); 30 } 31 32 var expandAnimMs = 420; 33 var collapseAnimMs = 420; 34 var isExpandAnimating = false; 35 36 function getExpandedContentHeight() { 37 var defaultH = getDefaultContentHeight(); 38 var expandedMax = 560; 39 var expandedMin = 420; 40 var boost = 130; 41 42 return Math.min( 43 expandedMax, 44 Math.max(expandedMin, defaultH + boost) 45 ); 46 } 47 48 function getOpenOrigin() { 49 var $board = $('#wp-chatbot-board-container'); 50 return $board.attr('data-wpbot-open-origin') === 'bl' ? 'bl' : 'br'; 51 } 52 53 function playExpandMotion(expanding) { 54 var $board = $('#wp-chatbot-board-container'); 55 var origin = getOpenOrigin(); 56 var expandCls = 'wp-chatbot-board-expand-animate'; 57 var collapseCls = 'wp-chatbot-board-expand-collapsing'; 58 var originCls = 59 'wp-chatbot-board-expand-origin-' + (origin === 'bl' ? 'bl' : 'br'); 60 61 $board.removeClass( 62 expandCls + 63 ' ' + 64 collapseCls + 65 ' wp-chatbot-board-expand-origin-bl wp-chatbot-board-expand-origin-br' 66 ); 67 68 if (!$board.length || !$board[0].offsetParent) { 69 return; 70 } 71 72 void $board[0].offsetWidth; 73 $board.addClass(originCls); 74 $board.addClass(expanding ? expandCls : collapseCls); 75 76 window.setTimeout( 77 function () { 78 $board.removeClass( 79 expandCls + 80 ' ' + 81 collapseCls + 82 ' wp-chatbot-board-expand-origin-bl wp-chatbot-board-expand-origin-br' 83 ); 84 }, 85 expanding ? expandAnimMs : collapseAnimMs 86 ); 87 } 88 89 function applyExpandedClasses(expanded) { 90 var $chat = $('#wp-chatbot-chat-container'); 91 var $ball = $('#wp-chatbot-ball-container'); 92 var $board = $('#wp-chatbot-board-container'); 93 var $start = $('#wp-chatbot-ball-container .wp-chatbot-start-container'); 94 95 $('body').toggleClass(bodyExpandedClass, expanded); 96 $chat.toggleClass(expandedClass, expanded); 97 $ball.toggleClass(expandedClass, expanded); 98 $board.toggleClass(expandedClass, expanded); 99 $start.toggleClass(expandedClass, expanded); 100 } 101 102 function updateExpandButton(expanded) { 103 var $btn = $('#wp-chatbot-desktop-expand'); 104 105 $btn.attr('aria-pressed', expanded ? 'true' : 'false'); 106 $btn.attr( 107 'title', 108 expanded ? $btn.data('collapse-label') : $btn.data('expand-label') 109 ); 110 $btn 111 .find('i') 112 .toggleClass('fa-expand', !expanded) 113 .toggleClass('fa-compress', expanded); 114 } 115 116 function runCollapseAnimation() { 117 var $content = $('#wp-chatbot-ball-container .wp-chatbot-content'); 118 var expandedH = getExpandedContentHeight(); 119 var defaultH = getDefaultContentHeight(); 120 121 isExpandAnimating = true; 122 updateExpandButton(false); 123 playExpandMotion(false); 124 125 // Lock current size, then remove expanded state so width/height can transition. 126 $content.css({ 127 height: expandedH + 'px', 128 maxHeight: expandedH + 'px', 129 }); 130 131 window.requestAnimationFrame(function () { 132 window.requestAnimationFrame(function () { 133 applyExpandedClasses(false); 134 135 $content.css({ 136 height: defaultH + 'px', 137 maxHeight: defaultH + 'px', 138 }); 139 }); 140 }); 141 142 window.setTimeout(function () { 143 $content.css({ height: '', maxHeight: '' }); 144 updateSlimScroll(defaultH); 145 isExpandAnimating = false; 146 }, collapseAnimMs); 147 } 148 149 function updateSlimScroll(height) { 150 var $inner = $('#wp-chatbot-ball-container .wp-chatbot-ball-inner'); 151 152 if (!$inner.length || isMobileFullScreenViewport()) { 153 return; 154 } 155 156 try { 157 if ($inner.parent().hasClass('slimScrollDiv')) { 158 $inner.slimScroll({ destroy: true }); 159 } 160 161 $inner.css({ height: height + 'px', maxHeight: height + 'px' }); 162 $inner.slimScroll({ 163 height: height + 'px', 164 start: 'bottom', 165 }); 166 } catch (err) { 167 $inner.css({ 168 height: height + 'px', 169 maxHeight: height + 'px', 170 overflowY: 'auto', 171 }); 172 } 173 } 174 175 function setExpanded(expanded) { 176 var $btn = $('#wp-chatbot-desktop-expand');
177 var $content = $('#wp-chatbot-ball-container .wp-chatbot-content'); 178 var isExpanded = $('#wp-chatbot-chat-container').hasClass( 179 expandedClass 180 ); 181 182 if (!$btn.length || isExpandAnimating) { 183 return; 184 } 185 186 if (!expanded) { 187 if (!isExpanded) { 188 return; 189 } 190 runCollapseAnimation(); 191 return; 192 } 193 194 if (isExpanded) { 195 return; 196 } 197 198 playExpandMotion(true); 199 applyExpandedClasses(true); 200 updateExpandButton(true); 201 202 var contentHeight = getExpandedContentHeight(); 203 204 $content.css({ 205 height: contentHeight + 'px', 206 maxHeight: contentHeight + 'px', 207 }); 208 209 window.setTimeout(function () { 210 updateSlimScroll(contentHeight); 211 }, expandAnimMs + 40); 212 } 213 214 function collapseIfExpanded() { 215 if ($('#wp-chatbot-chat-container').hasClass(expandedClass)) { 216 setExpanded(false); 217 } 218 } 219 220 function toggleExpanded() { 221 if (!isExpandSupported()) { 222 return; 223 } 224 225 setExpanded(!$('#wp-chatbot-chat-container').hasClass(expandedClass)); 226 } 227 228 // Capture phase so header controls are not swallowed by other handlers. 229 document.addEventListener( 230 'click', 231 function (event) { 232 if (!event.target.closest('#wp-chatbot-desktop-expand')) { 233 return; 234 } 235 236 event.preventDefault(); 237 event.stopPropagation(); 238 event.stopImmediatePropagation(); 239 toggleExpanded(); 240 }, 241 true 242 ); 243 244 $(document).on('keydown', '#wp-chatbot-desktop-expand', function (e) { 245 if (e.key === 'Enter' || e.key === ' ') { 246 e.preventDefault(); 247 toggleExpanded(); 248 } 249 }); 250 251 $(document).on( 252 'click', 253 '#wp-chatbot-desktop-close, #wp-chatbot-mobile-close', 254 collapseIfExpanded 255 ); 256 257 $(document).on('click', '#wp-chatbot-ball', function () { 258 window.setTimeout(function () { 259 if ( 260 !$('#wp-chatbot-board-container').hasClass('active-chat-board') 261 ) { 262 collapseIfExpanded(); 263 } 264 }, 450); 265 }); 266 267 $(window).on('resize.wpbotBoardExpand', function () { 268 if (!$('#wp-chatbot-chat-container').hasClass(expandedClass)) { 269 return; 270 } 271 272 var height = getExpandedContentHeight(); 273 $('#wp-chatbot-ball-container .wp-chatbot-content').css({ 274 height: height + 'px', 275 maxHeight: height + 'px', 276 }); 277 updateSlimScroll(height); 278 }); 279})(jQuery);
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.