PageSourceSearch

https://www.firelightvineyards.com/wp-content/themes/wp-spectratheme/js/sv-hover-intent.js?ver=7.1.2

js firelightvineyards.com collected 2026-10-04 10:43:16 UTC 2,712 bytes, 111 lines download raw bytes

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.