https://www.firelightvineyards.com/wp-content/themes/wp-spectratheme/js/sv-hover-intent.js?ver=7.1.2
1// https://github.com/svivian/sv-hover-intent-js 2// load namespace 3SV = window.SV || {}; 4 5SV.HoverIntent = (function() { 6 7 // constructor 8 return function(elements, userConfig) { 9 10 // private members 11 12 const defaultOptions = { 13 exitDelay: 400, 14 interval: 100, 15 sensitivity: 7, 16 }; 17 let config = {}; 18 19 let currX, currY, prevX, prevY; 20 let allElems, pollTimer, exitTimer; 21 22 // private methods 23 24 // override default options with user config 25 const extend = function(defaults, userArgs) { 26 for (let i in userArgs) { 27 defaults[i] = userArgs[i]; 28 } 29 30 return defaults; 31 }; 32 33 // update mouse position 34 const mouseTrack = function(ev) { 35 currX = ev.pageX; 36 currY = ev.pageY; 37 }; 38 39 // check if mouse movement has slowed enough to trigger active state 40 const mouseCompare = function(targetElem) { 41 const distX = prevX - currX, distY = prevY - currY; 42 const distance = Math.sqrt(distX*distX + distY*distY); 43 44 if (distance < config.sensitivity) { 45 // if we re-entered an element, cancel delayed exit and clear any active elements immediately 46 clearTimeout(exitTimer); 47 for (let elem of allElems) { 48 if (elem.isActive) { 49 config.onExit(elem); 50 elem.isActive = false; 51 } 52 } 53 54 // trigger hover 55 config.onEnter(targetElem); 56 targetElem.isActive = true; 57 } else { 58 // update previous coordinates and try again later 59 prevX = currX; 60 prevY = currY; 61 pollTimer = setTimeout(function() { 62 mouseCompare(targetElem); 63 }, config.interval); 64 } 65 }; 66 67 const init = function(elements, userConfig) { 68 if (!userConfig || !userConfig.onEnter || !userConfig.onExit) { 69 throw 'onEnter and onExit callbacks must be provided'; 70 } 71 config = extend(defaultOptions, userConfig); 72 allElems = elements; 73 74 for (let elem of allElems) { 75 // holds current element state 76 elem.isActive = false; 77 // keeps track of mouse position 78 elem.addEventListener('mousemove', mouseTrack); 79 80 elem.addEventListener('mouseenter', function(ev) { 81 // set initial entry position 82 prevX = ev.pageX; 83 prevY = ev.pageY; 84 // if this element is already active, cancel exit 85 if (elem.isActive) { 86 clearTimeout(exitTimer); 87 return; 88 } 89 90 // while mouse is over this element, check distance every 100ms 91 pollTimer = setTimeout(function() { 92 mouseCompare(elem); 93 }, config.interval); 94 }); 95 elem.addEventListener('mouseleave', function(ev) { 96 clearTimeout(pollTimer); 97 if (!elem.isActive) 98 return; 99 100 exitTimer = setTimeout(function() { 101 config.onExit(elem); 102 elem.isActive = false; 103 }, config.exitDelay); 104 }); 105 } 106 }; 107 108 init(elements, userConfig); 109 }; 110 111})();
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.