zero-tooltip 1.0.5 → 1.0.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,196 +1,269 @@
1
- import { watch as st } from "vue";
2
- function it() {
1
+ import { watch as et } from "vue";
2
+ let M;
3
+ const rt = new Uint8Array(16);
4
+ function st() {
5
+ if (!M && (M = typeof crypto < "u" && crypto.getRandomValues && crypto.getRandomValues.bind(crypto), !M))
6
+ throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");
7
+ return M(rt);
8
+ }
9
+ const h = [];
10
+ for (let e = 0; e < 256; ++e)
11
+ h.push((e + 256).toString(16).slice(1));
12
+ function dt(e, t = 0) {
13
+ return h[e[t + 0]] + h[e[t + 1]] + h[e[t + 2]] + h[e[t + 3]] + "-" + h[e[t + 4]] + h[e[t + 5]] + "-" + h[e[t + 6]] + h[e[t + 7]] + "-" + h[e[t + 8]] + h[e[t + 9]] + "-" + h[e[t + 10]] + h[e[t + 11]] + h[e[t + 12]] + h[e[t + 13]] + h[e[t + 14]] + h[e[t + 15]];
14
+ }
15
+ const it = typeof crypto < "u" && crypto.randomUUID && crypto.randomUUID.bind(crypto), q = {
16
+ randomUUID: it
17
+ };
18
+ function ot(e, t, r) {
19
+ if (q.randomUUID && !t && !e)
20
+ return q.randomUUID();
21
+ e = e || {};
22
+ const s = e.random || (e.rng || st)();
23
+ if (s[6] = s[6] & 15 | 64, s[8] = s[8] & 63 | 128, t) {
24
+ r = r || 0;
25
+ for (let d = 0; d < 16; ++d)
26
+ t[r + d] = s[d];
27
+ return t;
28
+ }
29
+ return dt(s);
30
+ }
31
+ function pt() {
3
32
  let e = [];
4
- const t = (s, i) => {
5
- if (r(s), e.length > 0)
6
- for (const h of e)
7
- h.addEventListener("scroll", i);
33
+ const t = (d, i) => {
34
+ if (r(d), e.length > 0)
35
+ for (const o of e)
36
+ o.addEventListener("scroll", i);
8
37
  window.addEventListener("scroll", () => {
9
- i(), d(i);
38
+ i(), s(i);
10
39
  });
11
- }, r = (s) => {
12
- let i = s;
40
+ }, r = (d) => {
41
+ let i = d;
13
42
  for (; i !== null && i.tagName !== "HTML"; ) {
14
43
  if (i.scrollHeight !== i.clientHeight) {
15
- const h = window.getComputedStyle(i);
16
- (h.overflow === "auto" || h.overflow === "scroll") && e.push(i);
44
+ const o = window.getComputedStyle(i);
45
+ (o.overflow === "auto" || o.overflow === "scroll") && e.push(i);
17
46
  }
18
47
  i = i.parentElement;
19
48
  }
20
- }, d = (s) => {
49
+ }, s = (d) => {
21
50
  if (e.length > 0) {
22
51
  for (const i of e)
23
- i.removeEventListener("scroll", s);
52
+ i.removeEventListener("scroll", d);
24
53
  e = [];
25
54
  }
26
- window.removeEventListener("scroll", s);
55
+ window.removeEventListener("scroll", d);
27
56
  };
28
57
  return { handleHideOnScroll: t };
29
58
  }
30
- function dt() {
59
+ function ut() {
31
60
  let e = null, t = null;
32
- return { handleHideOnResize: (s, i) => {
33
- e = new ResizeObserver((h) => {
34
- const w = h[0].target;
61
+ return { handleHideOnResize: (d, i) => {
62
+ e = new ResizeObserver((o) => {
63
+ const p = o[0].target;
35
64
  if (t === null)
36
- t = s.getBoundingClientRect();
65
+ t = d.getBoundingClientRect();
37
66
  else {
38
- const m = w.getBoundingClientRect();
39
- (m.left !== t.left || m.top !== t.top || m.width !== t.width || m.height !== t.height) && i();
67
+ const u = p.getBoundingClientRect();
68
+ (u.left !== t.left || u.top !== t.top || u.width !== t.width || u.height !== t.height) && i();
40
69
  }
41
- }), e.observe(s);
70
+ }), e.observe(d);
42
71
  }, resetResizeReferences: () => {
43
72
  e !== null && e.disconnect(), e = null, t = null;
44
73
  } };
45
74
  }
46
- const { handleHideOnScroll: pt } = it(), { handleHideOnResize: ot, resetResizeReferences: ht } = dt(), B = "zero-tooltip__container", N = "zero-tooltip__text", et = "zero-tooltip__arrow", z = {
75
+ const { handleHideOnScroll: ht } = pt(), { handleHideOnResize: wt, resetResizeReferences: mt } = ut(), y = "zero-tooltip__container", j = "zero-tooltip__text", tt = "zero-tooltip__arrow", n = {
47
76
  left: ["left", "right", "top", "bottom"],
48
77
  top: ["top", "bottom", "right", "left"],
49
78
  right: ["right", "left", "top", "bottom"],
50
79
  bottom: ["bottom", "top", "right", "left"]
51
- }, Z = "top", D = 10, G = 20, J = 100, K = 250, Q = 0, U = "zt-fixed zt-opacity-0 zt-inline-block zt-w-fit zt-py-1.5 zt-px-2.5 zt-rounded-md zt-bg-[#495057] zt-shadow-[0_2px_12px_0_rgba(0,0,0,0.1)] zt-box-border", X = "zt-text-sm zt-text-white zt-whitespace-pre-wrap zt-break-words", Y = 5, nt = "zt-absolute zt-border-solid zt-border-[#495057]", R = 6, a = 1, l = !0;
52
- let rt, W, S, v, p, M, T, n, O, H, c, f, u, F, $, x, A, o, k = !1;
53
- const Wt = (e) => ({
54
- mounted: (t, r) => {
55
- E(r.value, e, r.arg), _(t), typeof r.value != "string" && st(r.value, (d) => {
56
- E(d, e, r.arg), _(t);
80
+ }, N = "top", R = 10, Z = 20, G = 100, J = 250, K = 0, Q = "zt-fixed zt-opacity-0 zt-inline-block zt-w-fit zt-py-1.5 zt-px-2.5 zt-rounded-md zt-bg-[#495057] zt-shadow-[0_2px_12px_0_rgba(0,0,0,0.1)] zt-box-border", X = "zt-text-sm zt-text-white zt-whitespace-pre-wrap zt-break-words", Y = 5, nt = "zt-absolute zt-border-solid zt-border-[#495057]", E = 6, l = 1, b = !0, c = {}, at = (e) => ({
81
+ created: (t, r, s) => {
82
+ const d = ot();
83
+ s.el.$_tooltip = { uuid: d }, V(r.value, e, r.arg, t, d), typeof r.value != "string" && et(r.value, (i) => {
84
+ c[d] && B(c[d]), V(i, e, r.arg, t, d);
57
85
  });
58
86
  },
59
- updated: (t, r) => {
60
- typeof r.value == "string" && (E(r.value, e, r.arg), _(t));
87
+ updated: (t, r, s) => {
88
+ if (typeof r.value == "string") {
89
+ const d = s.el.$_tooltip.uuid;
90
+ c[d] && B(c[d]), V(r.value, e, r.arg, t, d);
91
+ }
92
+ },
93
+ beforeUnmount: (t, r, s) => {
94
+ const d = s.el.$_tooltip.uuid;
95
+ c[d] && B(c[d]);
61
96
  }
62
97
  });
63
- function E(e, t, r) {
64
- var d, s, i, h, w, m, L, y, I, q, P, j;
65
- rt = ut(e), typeof e != "string" && (W = r ?? e.defaultPosition ?? (t == null ? void 0 : t.defaultPosition) ?? Z, S = {
66
- left: ((d = e.positions) == null ? void 0 : d.left) ?? ((s = t == null ? void 0 : t.positions) == null ? void 0 : s.left) ?? z.left,
67
- top: ((i = e.positions) == null ? void 0 : i.top) ?? ((h = t == null ? void 0 : t.positions) == null ? void 0 : h.top) ?? z.top,
68
- right: ((w = e.positions) == null ? void 0 : w.right) ?? ((m = t == null ? void 0 : t.positions) == null ? void 0 : m.right) ?? z.right,
69
- bottom: ((L = e.positions) == null ? void 0 : L.bottom) ?? ((y = t == null ? void 0 : t.positions) == null ? void 0 : y.bottom) ?? z.bottom
70
- }, v = e.offsetFromSource ?? (t == null ? void 0 : t.offsetFromSource) ?? D, p = e.offsetFromViewport ?? (t == null ? void 0 : t.offsetFromViewport) ?? G, M = e.minWidth ?? (t == null ? void 0 : t.minWidth) ?? J, T = e.maxWidth ?? (t == null ? void 0 : t.maxWidth) ?? K, n = e.tooltipBorderWidth ?? (t == null ? void 0 : t.tooltipBorderWidth) ?? Q, O = B + " " + U + " " + (e.tooltipClasses ?? (t == null ? void 0 : t.tooltipClasses) ?? ""), H = N + " " + X + " " + (e.textClasses ?? (t == null ? void 0 : t.textClasses) ?? ""), c = e.arrowSize ?? (t == null ? void 0 : t.arrowSize) ?? Y, f = e.arrowClasses ?? (t == null ? void 0 : t.arrowClasses) ?? "", u = e.arrowMinOffsetFromTooltipCorner ?? (t == null ? void 0 : t.arrowMinOffsetFromTooltipCorner) ?? R, F = e.zIndex ?? (t == null ? void 0 : t.zIndex) ?? a, $ = e.show ?? l), W === void 0 && (W = r ?? (t == null ? void 0 : t.defaultPosition) ?? Z), S === void 0 && (S = {
71
- left: ((I = t == null ? void 0 : t.positions) == null ? void 0 : I.left) ?? z.left,
72
- top: ((q = t == null ? void 0 : t.positions) == null ? void 0 : q.top) ?? z.top,
73
- right: ((P = t == null ? void 0 : t.positions) == null ? void 0 : P.right) ?? z.right,
74
- bottom: ((j = t == null ? void 0 : t.positions) == null ? void 0 : j.bottom) ?? z.bottom
75
- }), v === void 0 && (v = (t == null ? void 0 : t.offsetFromSource) ?? D), p === void 0 && (p = (t == null ? void 0 : t.offsetFromViewport) ?? G), M === void 0 && (M = (t == null ? void 0 : t.minWidth) ?? J), T === void 0 && (T = (t == null ? void 0 : t.maxWidth) ?? K), n === void 0 && (n = (t == null ? void 0 : t.tooltipBorderWidth) ?? Q), O === void 0 && (O = B + " " + U + " " + (t == null ? void 0 : t.tooltipClasses)), H === void 0 && (H = N + " " + X + " " + (t == null ? void 0 : t.textClasses)), c === void 0 && (c = (t == null ? void 0 : t.arrowSize) ?? Y), f === void 0 && (f = (t == null ? void 0 : t.arrowClasses) ?? ""), u === void 0 && (u = (t == null ? void 0 : t.arrowMinOffsetFromTooltipCorner) ?? R), F === void 0 && (F = (t == null ? void 0 : t.zIndex) ?? a), $ === void 0 && ($ = l);
76
- }
77
- function ut(e) {
98
+ function V(e, t, r, s, d) {
99
+ let i = ct(e, t, r);
100
+ const o = xt(s, i, d);
101
+ s.matches(":hover") && s.dispatchEvent(new Event("mouseenter")), c[d] = o;
102
+ }
103
+ function ct(e, t, r) {
104
+ var a, L, H, $, A, _, I, f, U, k, D, P;
105
+ let s, d, i, o, p, u, w, m, x, O, F, T, W, z, v;
106
+ return s = Ot(e), typeof e != "string" && (d = r ?? e.defaultPosition ?? (t == null ? void 0 : t.defaultPosition) ?? N, i = {
107
+ left: ((a = e.positions) == null ? void 0 : a.left) ?? ((L = t == null ? void 0 : t.positions) == null ? void 0 : L.left) ?? n.left,
108
+ top: ((H = e.positions) == null ? void 0 : H.top) ?? (($ = t == null ? void 0 : t.positions) == null ? void 0 : $.top) ?? n.top,
109
+ right: ((A = e.positions) == null ? void 0 : A.right) ?? ((_ = t == null ? void 0 : t.positions) == null ? void 0 : _.right) ?? n.right,
110
+ bottom: ((I = e.positions) == null ? void 0 : I.bottom) ?? ((f = t == null ? void 0 : t.positions) == null ? void 0 : f.bottom) ?? n.bottom
111
+ }, o = e.offsetFromSource ?? (t == null ? void 0 : t.offsetFromSource) ?? R, p = e.offsetFromViewport ?? (t == null ? void 0 : t.offsetFromViewport) ?? Z, u = e.minWidth ?? (t == null ? void 0 : t.minWidth) ?? G, w = e.maxWidth ?? (t == null ? void 0 : t.maxWidth) ?? J, m = e.tooltipBorderWidth ?? (t == null ? void 0 : t.tooltipBorderWidth) ?? K, x = y + " " + Q + " " + (e.tooltipClasses ?? (t == null ? void 0 : t.tooltipClasses) ?? ""), O = j + " " + X + " " + (e.textClasses ?? (t == null ? void 0 : t.textClasses) ?? ""), F = e.arrowSize ?? (t == null ? void 0 : t.arrowSize) ?? Y, T = e.arrowClasses ?? (t == null ? void 0 : t.arrowClasses) ?? "", W = e.arrowMinOffsetFromTooltipCorner ?? (t == null ? void 0 : t.arrowMinOffsetFromTooltipCorner) ?? E, z = e.zIndex ?? (t == null ? void 0 : t.zIndex) ?? l, v = e.show ?? b), d === void 0 && (d = r ?? (t == null ? void 0 : t.defaultPosition) ?? N), i === void 0 && (i = {
112
+ left: ((U = t == null ? void 0 : t.positions) == null ? void 0 : U.left) ?? n.left,
113
+ top: ((k = t == null ? void 0 : t.positions) == null ? void 0 : k.top) ?? n.top,
114
+ right: ((D = t == null ? void 0 : t.positions) == null ? void 0 : D.right) ?? n.right,
115
+ bottom: ((P = t == null ? void 0 : t.positions) == null ? void 0 : P.bottom) ?? n.bottom
116
+ }), o === void 0 && (o = (t == null ? void 0 : t.offsetFromSource) ?? R), p === void 0 && (p = (t == null ? void 0 : t.offsetFromViewport) ?? Z), u === void 0 && (u = (t == null ? void 0 : t.minWidth) ?? G), w === void 0 && (w = (t == null ? void 0 : t.maxWidth) ?? J), m === void 0 && (m = (t == null ? void 0 : t.tooltipBorderWidth) ?? K), x === void 0 && (x = y + " " + Q + " " + ((t == null ? void 0 : t.tooltipClasses) ?? "")), O === void 0 && (O = j + " " + X + " " + ((t == null ? void 0 : t.textClasses) ?? "")), F === void 0 && (F = (t == null ? void 0 : t.arrowSize) ?? Y), T === void 0 && (T = (t == null ? void 0 : t.arrowClasses) ?? ""), W === void 0 && (W = (t == null ? void 0 : t.arrowMinOffsetFromTooltipCorner) ?? E), z === void 0 && (z = (t == null ? void 0 : t.zIndex) ?? l), v === void 0 && (v = b), {
117
+ tooltipText: s,
118
+ tooltipPosition: d,
119
+ tooltipPositions: i,
120
+ tooltipOffsetFromSource: o,
121
+ tooltipOffsetFromViewport: p,
122
+ tooltipMinWidth: u,
123
+ tooltipMaxWidth: w,
124
+ tooltipBorderWidth: m,
125
+ tooltipClasses: x,
126
+ textClasses: O,
127
+ arrowSize: F,
128
+ arrowClasses: T,
129
+ arrowMinOffsetFromTooltipCorner: W,
130
+ zIndex: z,
131
+ shouldShow: v
132
+ };
133
+ }
134
+ function Ot(e) {
78
135
  const t = typeof e == "string" ? e : e.content;
79
136
  if (!t)
80
137
  throw new Error("Please enter valid tooltip value");
81
138
  return t;
82
139
  }
83
- function _(e) {
84
- x = e, x.removeEventListener("mouseenter", b), x.removeEventListener("mouseleave", C), wt(), mt(), x.addEventListener("mouseenter", b), x.addEventListener("mouseleave", C), k && (x.dispatchEvent(new Event("mouseleave")), x.dispatchEvent(new Event("mouseenter")));
140
+ function xt(e, t, r) {
141
+ let s = e, d = Ft(t.textClasses, t.tooltipText), i = Tt(t.tooltipClasses, t.tooltipBorderWidth);
142
+ i.append(d), i.dataset.uuid = r;
143
+ const o = new AbortController(), p = new AbortController();
144
+ return s.addEventListener("mouseenter", () => Wt(s, t, i), { signal: o.signal }), s.addEventListener("mouseleave", zt, { signal: p.signal }), {
145
+ anchorElement: s,
146
+ tooltipConfig: t,
147
+ tooltipElement: i,
148
+ mouseEnterEventController: o,
149
+ mouseLeaveEventController: p
150
+ };
85
151
  }
86
- function wt() {
87
- A = document.createElement("p"), A.classList.add(...H.trim().split(" ")), A.innerHTML = rt;
152
+ function Ft(e, t) {
153
+ let r = document.createElement("p");
154
+ return r.classList.add(...e.trim().split(" ")), r.innerHTML = t, r;
88
155
  }
89
- function mt() {
90
- o = document.createElement("div"), o.classList.add(...O.trim().split(" ")), o.style.borderWidth = `${n}px`, o.appendChild(A);
156
+ function Tt(e, t) {
157
+ let r = document.createElement("div");
158
+ return r.classList.add(...e.trim().split(" ")), r.style.borderWidth = `${t}px`, r;
91
159
  }
92
- function b() {
93
- if (k = !0, !$)
160
+ function Wt(e, t, r) {
161
+ if (!t.shouldShow)
94
162
  return;
95
- const e = x.getBoundingClientRect(), t = document.querySelector("body");
96
- t == null || t.appendChild(o);
97
- let r = !1, d = W;
98
- for (let s = 0; s < 4 && (d = S[W][s], d === "left" ? r = ct(e) : d === "top" ? r = vt(e) : d === "right" ? r = xt(e) : d === "bottom" && (r = zt(e)), !r); s++)
163
+ const s = e.getBoundingClientRect(), d = document.querySelector("body");
164
+ d == null || d.appendChild(r);
165
+ let i = !1, o = t.tooltipPosition;
166
+ for (let p = 0; p < 4 && (o = t.tooltipPositions[t.tooltipPosition][p], o === "left" ? i = vt(s, t, r) : o === "top" ? i = yt(s, t, r) : o === "right" ? i = Mt(s, t, r) : o === "bottom" && (i = St(s, t, r)), !i); p++)
99
167
  ;
100
- r && (Tt(e, d), o.style.opacity = "1", o.style.zIndex = F.toString(), pt(x, () => V()), ot(x, () => V()));
168
+ i && (Vt(s, o, t, r), r.style.opacity = "1", r.style.zIndex = t.zIndex.toString(), ht(e, () => S()), wt(e, () => S()));
101
169
  }
102
- function C() {
103
- V();
170
+ function zt() {
171
+ S();
104
172
  }
105
- function ct(e) {
106
- const t = Math.min(e.left - v - p, T), r = e.top >= p, d = window.innerHeight - e.bottom >= p;
107
- if (t < M || !r || !d)
173
+ function vt(e, t, r) {
174
+ const s = Math.min(e.left - t.tooltipOffsetFromSource - t.tooltipOffsetFromViewport, t.tooltipMaxWidth), d = e.top >= t.tooltipOffsetFromViewport, i = window.innerHeight - e.bottom >= t.tooltipOffsetFromViewport;
175
+ if (s < t.tooltipMinWidth || !d || !i)
108
176
  return !1;
109
- o.style.maxWidth = `${t}px`;
110
- const s = o.getBoundingClientRect();
111
- let i = e.top + e.height / 2 - s.height / 2;
112
- i < p ? i = p : i + s.height > window.innerHeight - p && (i = window.innerHeight - p - s.height);
113
- const h = e.left - v - s.width;
114
- return e.bottom < i + u * 2 || e.top > i + s.height - u * 2 ? !1 : (o.style.top = `${i}px`, o.style.left = `${h}px`, !0);
115
- }
116
- function xt(e) {
117
- const t = Math.min(window.innerWidth - (e.right + v) - p, T), r = e.top >= p, d = window.innerHeight - e.bottom >= p;
118
- if (t < M || !r || !d)
177
+ r.style.maxWidth = `${s}px`;
178
+ const o = r.getBoundingClientRect();
179
+ let p = e.top + e.height / 2 - o.height / 2;
180
+ p < t.tooltipOffsetFromViewport ? p = t.tooltipOffsetFromViewport : p + o.height > window.innerHeight - t.tooltipOffsetFromViewport && (p = window.innerHeight - t.tooltipOffsetFromViewport - o.height);
181
+ const u = e.left - t.tooltipOffsetFromSource - o.width;
182
+ return e.bottom < p + t.arrowMinOffsetFromTooltipCorner * 2 || e.top > p + o.height - t.arrowMinOffsetFromTooltipCorner * 2 ? !1 : (r.style.top = `${p}px`, r.style.left = `${u}px`, !0);
183
+ }
184
+ function Mt(e, t, r) {
185
+ const s = Math.min(window.innerWidth - (e.right + t.tooltipOffsetFromSource) - t.tooltipOffsetFromViewport, t.tooltipMaxWidth), d = e.top >= t.tooltipOffsetFromViewport, i = window.innerHeight - e.bottom >= t.tooltipOffsetFromViewport;
186
+ if (s < t.tooltipMinWidth || !d || !i)
119
187
  return !1;
120
- o.style.maxWidth = `${t}px`;
121
- const s = o.getBoundingClientRect();
122
- let i = e.top + e.height / 2 - s.height / 2;
123
- i < p ? i = p : i + s.height > window.innerHeight - p && (i = window.innerHeight - p - s.height);
124
- const h = e.right + v;
125
- return e.bottom < i + u * 2 || e.top > i + s.height - u * 2 ? !1 : (o.style.top = `${i}px`, o.style.left = `${h}px`, !0);
126
- }
127
- function vt(e) {
128
- const t = Math.min(window.innerWidth - p * 2, T);
129
- o.style.maxWidth = `${t}px`;
130
- const r = o.getBoundingClientRect();
131
- let d = e.top - v - r.height;
132
- if (d < p)
188
+ r.style.maxWidth = `${s}px`;
189
+ const o = r.getBoundingClientRect();
190
+ let p = e.top + e.height / 2 - o.height / 2;
191
+ p < t.tooltipOffsetFromViewport ? p = t.tooltipOffsetFromViewport : p + o.height > window.innerHeight - t.tooltipOffsetFromViewport && (p = window.innerHeight - t.tooltipOffsetFromViewport - o.height);
192
+ const u = e.right + t.tooltipOffsetFromSource;
193
+ return e.bottom < p + t.arrowMinOffsetFromTooltipCorner * 2 || e.top > p + o.height - t.arrowMinOffsetFromTooltipCorner * 2 ? !1 : (r.style.top = `${p}px`, r.style.left = `${u}px`, !0);
194
+ }
195
+ function yt(e, t, r) {
196
+ const s = Math.min(window.innerWidth - t.tooltipOffsetFromViewport * 2, t.tooltipMaxWidth);
197
+ r.style.maxWidth = `${s}px`;
198
+ const d = r.getBoundingClientRect();
199
+ let i = e.top - t.tooltipOffsetFromSource - d.height;
200
+ if (i < t.tooltipOffsetFromViewport)
133
201
  return !1;
134
- let s = e.left + e.width / 2 - r.width / 2;
135
- return s < p ? s = p : s + r.width > window.innerWidth - p && (s = window.innerWidth - p - r.width), e.left > s + r.width - u * 2 || e.right < s + u * 2 ? !1 : (o.style.top = `${d}px`, o.style.left = `${s}px`, !0);
136
- }
137
- function zt(e) {
138
- const t = Math.min(window.innerWidth - p * 2, T);
139
- o.style.maxWidth = `${t}px`;
140
- const r = o.getBoundingClientRect();
141
- let d = e.bottom + v;
142
- if (d + r.height > window.innerHeight - p)
202
+ let o = e.left + e.width / 2 - d.width / 2;
203
+ return o < t.tooltipOffsetFromViewport ? o = t.tooltipOffsetFromViewport : o + d.width > window.innerWidth - t.tooltipOffsetFromViewport && (o = window.innerWidth - t.tooltipOffsetFromViewport - d.width), e.left > o + d.width - t.arrowMinOffsetFromTooltipCorner * 2 || e.right < o + t.arrowMinOffsetFromTooltipCorner * 2 ? !1 : (r.style.top = `${i}px`, r.style.left = `${o}px`, !0);
204
+ }
205
+ function St(e, t, r) {
206
+ const s = Math.min(window.innerWidth - t.tooltipOffsetFromViewport * 2, t.tooltipMaxWidth);
207
+ r.style.maxWidth = `${s}px`;
208
+ const d = r.getBoundingClientRect();
209
+ let i = e.bottom + t.tooltipOffsetFromSource;
210
+ if (i + d.height > window.innerHeight - t.tooltipOffsetFromViewport)
143
211
  return !1;
144
- let s = e.left + e.width / 2 - r.width / 2;
145
- return s < p ? s = p : s + r.width > window.innerWidth - p && (s = window.innerWidth - p - r.width), e.left > s + r.width - u * 2 || e.right < s + u * 2 ? !1 : (o.style.top = `${d}px`, o.style.left = `${s}px`, !0);
212
+ let o = e.left + e.width / 2 - d.width / 2;
213
+ return o < t.tooltipOffsetFromViewport ? o = t.tooltipOffsetFromViewport : o + d.width > window.innerWidth - t.tooltipOffsetFromViewport && (o = window.innerWidth - t.tooltipOffsetFromViewport - d.width), e.left > o + d.width - t.arrowMinOffsetFromTooltipCorner * 2 || e.right < o + t.arrowMinOffsetFromTooltipCorner * 2 ? !1 : (r.style.top = `${i}px`, r.style.left = `${o}px`, !0);
146
214
  }
147
- function Tt(e, t) {
148
- var y;
149
- const r = document.createElement("div"), d = o.getBoundingClientRect(), s = Math.sin(45 * (180 / Math.PI)) * c, i = 1;
150
- let h = 0, w = 0, m = "";
215
+ function Vt(e, t, r, s) {
216
+ var O;
217
+ const d = document.createElement("div"), i = s.getBoundingClientRect(), o = Math.sin(45 * (180 / Math.PI)) * r.arrowSize, p = 1;
218
+ let u = 0, w = 0, m = "";
151
219
  switch (t) {
152
220
  case "left":
153
- m = "!zt-border-y-transparent !zt-border-r-transparent", h = e.top - d.top + e.height / 2 - s - n, w = d.width - n - i;
221
+ m = "!zt-border-y-transparent !zt-border-r-transparent", u = e.top - i.top + e.height / 2 - o - r.tooltipBorderWidth, w = i.width - r.tooltipBorderWidth - p;
154
222
  break;
155
223
  case "top":
156
- m = "!zt-border-x-transparent !zt-border-b-transparent", h = d.height - n - i, w = e.left - d.left + e.width / 2 - s - n;
224
+ m = "!zt-border-x-transparent !zt-border-b-transparent", u = i.height - r.tooltipBorderWidth - p, w = e.left - i.left + e.width / 2 - o - r.tooltipBorderWidth;
157
225
  break;
158
226
  case "right":
159
- m = "!zt-border-y-transparent !zt-border-l-transparent", h = e.top - d.top + e.height / 2 - s - n, w = -c * 2 - n + i;
227
+ m = "!zt-border-y-transparent !zt-border-l-transparent", u = e.top - i.top + e.height / 2 - o - r.tooltipBorderWidth, w = -r.arrowSize * 2 - r.tooltipBorderWidth + p;
160
228
  break;
161
229
  case "bottom":
162
- m = "!zt-border-x-transparent !zt-border-t-transparent", h = -c * 2 - n + i, w = e.left - d.left + e.width / 2 - s - n;
230
+ m = "!zt-border-x-transparent !zt-border-t-transparent", u = -r.arrowSize * 2 - r.tooltipBorderWidth + p, w = e.left - i.left + e.width / 2 - o - r.tooltipBorderWidth;
163
231
  break;
164
232
  }
165
- t === "left" || t === "right" ? g(t, d, h) || (h = tt(t, d, h)) : g(t, d, w) || (w = tt(t, d, w));
166
- const L = et + " " + nt + " " + m + " " + f;
167
- r.classList.add(...L.trim().split(" ")), r.style.top = `${h}px`, r.style.left = `${w}px`, r.style.borderWidth = `${c}px`, (y = document.querySelector(`.${B}`)) == null || y.appendChild(r);
233
+ t === "left" || t === "right" ? C(t, i, u, r) || (u = g(t, i, u, r)) : C(t, i, w, r) || (w = g(t, i, w, r));
234
+ const x = tt + " " + nt + " " + m + " " + r.arrowClasses;
235
+ d.classList.add(...x.trim().split(" ")), d.style.top = `${u}px`, d.style.left = `${w}px`, d.style.borderWidth = `${r.arrowSize}px`, (O = document.querySelector(`.${y}`)) == null || O.appendChild(d);
168
236
  }
169
- function g(e, t, r) {
237
+ function C(e, t, r, s) {
170
238
  switch (e) {
171
239
  case "left":
172
240
  case "right":
173
- return r > u - n && r < t.height + n - u - c * 2;
241
+ return r > s.arrowMinOffsetFromTooltipCorner - s.tooltipBorderWidth && r < t.height + s.tooltipBorderWidth - s.arrowMinOffsetFromTooltipCorner - s.arrowSize * 2;
174
242
  case "top":
175
243
  case "bottom":
176
- return r > u - n && r < t.width + n - u - c * 2;
244
+ return r > s.arrowMinOffsetFromTooltipCorner - s.tooltipBorderWidth && r < t.width + s.tooltipBorderWidth - s.arrowMinOffsetFromTooltipCorner - s.arrowSize * 2;
177
245
  }
178
246
  }
179
- function tt(e, t, r) {
247
+ function g(e, t, r, s) {
180
248
  switch (e) {
181
249
  case "left":
182
250
  case "right":
183
- return r < u - n ? u - n : t.height - n - u - c * 2;
251
+ return r < s.arrowMinOffsetFromTooltipCorner - s.tooltipBorderWidth ? s.arrowMinOffsetFromTooltipCorner - s.tooltipBorderWidth : t.height - s.tooltipBorderWidth - s.arrowMinOffsetFromTooltipCorner - s.arrowSize * 2;
184
252
  case "top":
185
253
  case "bottom":
186
- return r < u - n ? u - n : t.width - n - u - c * 2;
254
+ return r < s.arrowMinOffsetFromTooltipCorner - s.tooltipBorderWidth ? s.arrowMinOffsetFromTooltipCorner - s.tooltipBorderWidth : t.width - s.tooltipBorderWidth - s.arrowMinOffsetFromTooltipCorner - s.arrowSize * 2;
187
255
  }
188
256
  }
189
- function V() {
257
+ function S() {
190
258
  var t;
191
- const e = document.querySelector(`.${B}`);
192
- e && e instanceof HTMLElement && (ht(), (t = e.querySelector(`.${et}`)) == null || t.remove(), e.style.left = "0", e.style.top = "0", e.remove()), k = !1;
259
+ const e = document.querySelector(`.${y}`);
260
+ e && e instanceof HTMLElement && (mt(), (t = e.querySelector(`.${tt}`)) == null || t.remove(), e.style.left = "0", e.style.top = "0", e.remove());
261
+ }
262
+ function B(e) {
263
+ S(), e.mouseEnterEventController.abort(), e.mouseLeaveEventController.abort();
264
+ const t = e.tooltipElement.dataset.uuid;
265
+ t && delete c[t];
193
266
  }
194
267
  export {
195
- Wt as default
268
+ at as default
196
269
  };
@@ -1 +1 @@
1
- (function(y,W){typeof exports=="object"&&typeof module<"u"?module.exports=W(require("vue")):typeof define=="function"&&define.amd?define(["vue"],W):(y=typeof globalThis<"u"?globalThis:y||self,y.ZeroTooltip=W(y.Vue))})(this,function(y){"use strict";function W(){let e=[];const t=(s,i)=>{if(r(s),e.length>0)for(const n of e)n.addEventListener("scroll",i);window.addEventListener("scroll",()=>{i(),d(i)})},r=s=>{let i=s;for(;i!==null&&i.tagName!=="HTML";){if(i.scrollHeight!==i.clientHeight){const n=window.getComputedStyle(i);(n.overflow==="auto"||n.overflow==="scroll")&&e.push(i)}i=i.parentElement}},d=s=>{if(e.length>0){for(const i of e)i.removeEventListener("scroll",s);e=[]}window.removeEventListener("scroll",s)};return{handleHideOnScroll:t}}function dt(){let e=null,t=null;return{handleHideOnResize:(s,i)=>{e=new ResizeObserver(n=>{const w=n[0].target;if(t===null)t=s.getBoundingClientRect();else{const m=w.getBoundingClientRect();(m.left!==t.left||m.top!==t.top||m.width!==t.width||m.height!==t.height)&&i()}}),e.observe(s)},resetResizeReferences:()=>{e!==null&&e.disconnect(),e=null,t=null}}}const{handleHideOnScroll:pt}=W(),{handleHideOnResize:ot,resetResizeReferences:ht}=dt(),S="zero-tooltip__container",j="zero-tooltip__text",P="zero-tooltip__arrow",z={left:["left","right","top","bottom"],top:["top","bottom","right","left"],right:["right","left","top","bottom"],bottom:["bottom","top","right","left"]},Z="top",N=10,D=20,G=100,J=250,K=0,Q="zt-fixed zt-opacity-0 zt-inline-block zt-w-fit zt-py-1.5 zt-px-2.5 zt-rounded-md zt-bg-[#495057] zt-shadow-[0_2px_12px_0_rgba(0,0,0,0.1)] zt-box-border",U="zt-text-sm zt-text-white zt-whitespace-pre-wrap zt-break-words",X=5,nt="zt-absolute zt-border-solid zt-border-[#495057]",Y=6,R=1,a=!0;let l,f,O,v,p,M,T,h,H,F,c,$,u,A,B,x,E,o,_=!1;const ut=e=>({mounted:(t,r)=>{k(r.value,e,r.arg),I(t),typeof r.value!="string"&&y.watch(r.value,d=>{k(d,e,r.arg),I(t)})},updated:(t,r)=>{typeof r.value=="string"&&(k(r.value,e,r.arg),I(t))}});function k(e,t,r){var d,s,i,n,w,m,V,L,et,rt,st,it;l=wt(e),typeof e!="string"&&(f=r??e.defaultPosition??(t==null?void 0:t.defaultPosition)??Z,O={left:((d=e.positions)==null?void 0:d.left)??((s=t==null?void 0:t.positions)==null?void 0:s.left)??z.left,top:((i=e.positions)==null?void 0:i.top)??((n=t==null?void 0:t.positions)==null?void 0:n.top)??z.top,right:((w=e.positions)==null?void 0:w.right)??((m=t==null?void 0:t.positions)==null?void 0:m.right)??z.right,bottom:((V=e.positions)==null?void 0:V.bottom)??((L=t==null?void 0:t.positions)==null?void 0:L.bottom)??z.bottom},v=e.offsetFromSource??(t==null?void 0:t.offsetFromSource)??N,p=e.offsetFromViewport??(t==null?void 0:t.offsetFromViewport)??D,M=e.minWidth??(t==null?void 0:t.minWidth)??G,T=e.maxWidth??(t==null?void 0:t.maxWidth)??J,h=e.tooltipBorderWidth??(t==null?void 0:t.tooltipBorderWidth)??K,H=S+" "+Q+" "+(e.tooltipClasses??(t==null?void 0:t.tooltipClasses)??""),F=j+" "+U+" "+(e.textClasses??(t==null?void 0:t.textClasses)??""),c=e.arrowSize??(t==null?void 0:t.arrowSize)??X,$=e.arrowClasses??(t==null?void 0:t.arrowClasses)??"",u=e.arrowMinOffsetFromTooltipCorner??(t==null?void 0:t.arrowMinOffsetFromTooltipCorner)??Y,A=e.zIndex??(t==null?void 0:t.zIndex)??R,B=e.show??a),f===void 0&&(f=r??(t==null?void 0:t.defaultPosition)??Z),O===void 0&&(O={left:((et=t==null?void 0:t.positions)==null?void 0:et.left)??z.left,top:((rt=t==null?void 0:t.positions)==null?void 0:rt.top)??z.top,right:((st=t==null?void 0:t.positions)==null?void 0:st.right)??z.right,bottom:((it=t==null?void 0:t.positions)==null?void 0:it.bottom)??z.bottom}),v===void 0&&(v=(t==null?void 0:t.offsetFromSource)??N),p===void 0&&(p=(t==null?void 0:t.offsetFromViewport)??D),M===void 0&&(M=(t==null?void 0:t.minWidth)??G),T===void 0&&(T=(t==null?void 0:t.maxWidth)??J),h===void 0&&(h=(t==null?void 0:t.tooltipBorderWidth)??K),H===void 0&&(H=S+" "+Q+" "+(t==null?void 0:t.tooltipClasses)),F===void 0&&(F=j+" "+U+" "+(t==null?void 0:t.textClasses)),c===void 0&&(c=(t==null?void 0:t.arrowSize)??X),$===void 0&&($=(t==null?void 0:t.arrowClasses)??""),u===void 0&&(u=(t==null?void 0:t.arrowMinOffsetFromTooltipCorner)??Y),A===void 0&&(A=(t==null?void 0:t.zIndex)??R),B===void 0&&(B=a)}function wt(e){const t=typeof e=="string"?e:e.content;if(!t)throw new Error("Please enter valid tooltip value");return t}function I(e){x=e,x.removeEventListener("mouseenter",b),x.removeEventListener("mouseleave",C),mt(),ct(),x.addEventListener("mouseenter",b),x.addEventListener("mouseleave",C),_&&(x.dispatchEvent(new Event("mouseleave")),x.dispatchEvent(new Event("mouseenter")))}function mt(){E=document.createElement("p"),E.classList.add(...F.trim().split(" ")),E.innerHTML=l}function ct(){o=document.createElement("div"),o.classList.add(...H.trim().split(" ")),o.style.borderWidth=`${h}px`,o.appendChild(E)}function b(){if(_=!0,!B)return;const e=x.getBoundingClientRect(),t=document.querySelector("body");t==null||t.appendChild(o);let r=!1,d=f;for(let s=0;s<4&&(d=O[f][s],d==="left"?r=xt(e):d==="top"?r=zt(e):d==="right"?r=vt(e):d==="bottom"&&(r=Tt(e)),!r);s++);r&&(yt(e,d),o.style.opacity="1",o.style.zIndex=A.toString(),pt(x,()=>q()),ot(x,()=>q()))}function C(){q()}function xt(e){const t=Math.min(e.left-v-p,T),r=e.top>=p,d=window.innerHeight-e.bottom>=p;if(t<M||!r||!d)return!1;o.style.maxWidth=`${t}px`;const s=o.getBoundingClientRect();let i=e.top+e.height/2-s.height/2;i<p?i=p:i+s.height>window.innerHeight-p&&(i=window.innerHeight-p-s.height);const n=e.left-v-s.width;return e.bottom<i+u*2||e.top>i+s.height-u*2?!1:(o.style.top=`${i}px`,o.style.left=`${n}px`,!0)}function vt(e){const t=Math.min(window.innerWidth-(e.right+v)-p,T),r=e.top>=p,d=window.innerHeight-e.bottom>=p;if(t<M||!r||!d)return!1;o.style.maxWidth=`${t}px`;const s=o.getBoundingClientRect();let i=e.top+e.height/2-s.height/2;i<p?i=p:i+s.height>window.innerHeight-p&&(i=window.innerHeight-p-s.height);const n=e.right+v;return e.bottom<i+u*2||e.top>i+s.height-u*2?!1:(o.style.top=`${i}px`,o.style.left=`${n}px`,!0)}function zt(e){const t=Math.min(window.innerWidth-p*2,T);o.style.maxWidth=`${t}px`;const r=o.getBoundingClientRect();let d=e.top-v-r.height;if(d<p)return!1;let s=e.left+e.width/2-r.width/2;return s<p?s=p:s+r.width>window.innerWidth-p&&(s=window.innerWidth-p-r.width),e.left>s+r.width-u*2||e.right<s+u*2?!1:(o.style.top=`${d}px`,o.style.left=`${s}px`,!0)}function Tt(e){const t=Math.min(window.innerWidth-p*2,T);o.style.maxWidth=`${t}px`;const r=o.getBoundingClientRect();let d=e.bottom+v;if(d+r.height>window.innerHeight-p)return!1;let s=e.left+e.width/2-r.width/2;return s<p?s=p:s+r.width>window.innerWidth-p&&(s=window.innerWidth-p-r.width),e.left>s+r.width-u*2||e.right<s+u*2?!1:(o.style.top=`${d}px`,o.style.left=`${s}px`,!0)}function yt(e,t){var L;const r=document.createElement("div"),d=o.getBoundingClientRect(),s=Math.sin(45*(180/Math.PI))*c,i=1;let n=0,w=0,m="";switch(t){case"left":m="!zt-border-y-transparent !zt-border-r-transparent",n=e.top-d.top+e.height/2-s-h,w=d.width-h-i;break;case"top":m="!zt-border-x-transparent !zt-border-b-transparent",n=d.height-h-i,w=e.left-d.left+e.width/2-s-h;break;case"right":m="!zt-border-y-transparent !zt-border-l-transparent",n=e.top-d.top+e.height/2-s-h,w=-c*2-h+i;break;case"bottom":m="!zt-border-x-transparent !zt-border-t-transparent",n=-c*2-h+i,w=e.left-d.left+e.width/2-s-h;break}t==="left"||t==="right"?g(t,d,n)||(n=tt(t,d,n)):g(t,d,w)||(w=tt(t,d,w));const V=P+" "+nt+" "+m+" "+$;r.classList.add(...V.trim().split(" ")),r.style.top=`${n}px`,r.style.left=`${w}px`,r.style.borderWidth=`${c}px`,(L=document.querySelector(`.${S}`))==null||L.appendChild(r)}function g(e,t,r){switch(e){case"left":case"right":return r>u-h&&r<t.height+h-u-c*2;case"top":case"bottom":return r>u-h&&r<t.width+h-u-c*2}}function tt(e,t,r){switch(e){case"left":case"right":return r<u-h?u-h:t.height-h-u-c*2;case"top":case"bottom":return r<u-h?u-h:t.width-h-u-c*2}}function q(){var t;const e=document.querySelector(`.${S}`);e&&e instanceof HTMLElement&&(ht(),(t=e.querySelector(`.${P}`))==null||t.remove(),e.style.left="0",e.style.top="0",e.remove()),_=!1}return ut});
1
+ (function(F,m){typeof exports=="object"&&typeof module<"u"?module.exports=m(require("vue")):typeof define=="function"&&define.amd?define(["vue"],m):(F=typeof globalThis<"u"?globalThis:F||self,F.ZeroTooltip=m(F.Vue))})(this,function(F){"use strict";let m;const rt=new Uint8Array(16);function st(){if(!m&&(m=typeof crypto<"u"&&crypto.getRandomValues&&crypto.getRandomValues.bind(crypto),!m))throw new Error("crypto.getRandomValues() not supported. See https://github.com/uuidjs/uuid#getrandomvalues-not-supported");return m(rt)}const h=[];for(let e=0;e<256;++e)h.push((e+256).toString(16).slice(1));function dt(e,t=0){return h[e[t+0]]+h[e[t+1]]+h[e[t+2]]+h[e[t+3]]+"-"+h[e[t+4]]+h[e[t+5]]+"-"+h[e[t+6]]+h[e[t+7]]+"-"+h[e[t+8]]+h[e[t+9]]+"-"+h[e[t+10]]+h[e[t+11]]+h[e[t+12]]+h[e[t+13]]+h[e[t+14]]+h[e[t+15]]}const L={randomUUID:typeof crypto<"u"&&crypto.randomUUID&&crypto.randomUUID.bind(crypto)};function it(e,t,r){if(L.randomUUID&&!t&&!e)return L.randomUUID();e=e||{};const s=e.random||(e.rng||st)();if(s[6]=s[6]&15|64,s[8]=s[8]&63|128,t){r=r||0;for(let d=0;d<16;++d)t[r+d]=s[d];return t}return dt(s)}function ot(){let e=[];const t=(d,i)=>{if(r(d),e.length>0)for(const o of e)o.addEventListener("scroll",i);window.addEventListener("scroll",()=>{i(),s(i)})},r=d=>{let i=d;for(;i!==null&&i.tagName!=="HTML";){if(i.scrollHeight!==i.clientHeight){const o=window.getComputedStyle(i);(o.overflow==="auto"||o.overflow==="scroll")&&e.push(i)}i=i.parentElement}},s=d=>{if(e.length>0){for(const i of e)i.removeEventListener("scroll",d);e=[]}window.removeEventListener("scroll",d)};return{handleHideOnScroll:t}}function pt(){let e=null,t=null;return{handleHideOnResize:(d,i)=>{e=new ResizeObserver(o=>{const p=o[0].target;if(t===null)t=d.getBoundingClientRect();else{const u=p.getBoundingClientRect();(u.left!==t.left||u.top!==t.top||u.width!==t.width||u.height!==t.height)&&i()}}),e.observe(d)},resetResizeReferences:()=>{e!==null&&e.disconnect(),e=null,t=null}}}const{handleHideOnScroll:ut}=ot(),{handleHideOnResize:ht,resetResizeReferences:wt}=pt(),W="zero-tooltip__container",H="zero-tooltip__text",$="zero-tooltip__arrow",c={left:["left","right","top","bottom"],top:["top","bottom","right","left"],right:["right","left","top","bottom"],bottom:["bottom","top","right","left"]},f="top",A=10,_=20,I=100,U=250,k=0,D="zt-fixed zt-opacity-0 zt-inline-block zt-w-fit zt-py-1.5 zt-px-2.5 zt-rounded-md zt-bg-[#495057] zt-shadow-[0_2px_12px_0_rgba(0,0,0,0.1)] zt-box-border",P="zt-text-sm zt-text-white zt-whitespace-pre-wrap zt-break-words",q=5,nt="zt-absolute zt-border-solid zt-border-[#495057]",j=6,Z=1,N=!0,O={},mt=e=>({created:(t,r,s)=>{const d=it();s.el.$_tooltip={uuid:d},B(r.value,e,r.arg,t,d),typeof r.value!="string"&&F.watch(r.value,i=>{O[d]&&a(O[d]),B(i,e,r.arg,t,d)})},updated:(t,r,s)=>{if(typeof r.value=="string"){const d=s.el.$_tooltip.uuid;O[d]&&a(O[d]),B(r.value,e,r.arg,t,d)}},beforeUnmount:(t,r,s)=>{const d=s.el.$_tooltip.uuid;O[d]&&a(O[d])}});function B(e,t,r,s,d){let i=ct(e,t,r);const o=xt(s,i,d);s.matches(":hover")&&s.dispatchEvent(new Event("mouseenter")),O[d]=o}function ct(e,t,r){var J,K,Q,X,Y,E,l,b,C,g,tt,et;let s,d,i,o,p,u,w,n,T,x,z,y,M,S,V;return s=Ot(e),typeof e!="string"&&(d=r??e.defaultPosition??(t==null?void 0:t.defaultPosition)??f,i={left:((J=e.positions)==null?void 0:J.left)??((K=t==null?void 0:t.positions)==null?void 0:K.left)??c.left,top:((Q=e.positions)==null?void 0:Q.top)??((X=t==null?void 0:t.positions)==null?void 0:X.top)??c.top,right:((Y=e.positions)==null?void 0:Y.right)??((E=t==null?void 0:t.positions)==null?void 0:E.right)??c.right,bottom:((l=e.positions)==null?void 0:l.bottom)??((b=t==null?void 0:t.positions)==null?void 0:b.bottom)??c.bottom},o=e.offsetFromSource??(t==null?void 0:t.offsetFromSource)??A,p=e.offsetFromViewport??(t==null?void 0:t.offsetFromViewport)??_,u=e.minWidth??(t==null?void 0:t.minWidth)??I,w=e.maxWidth??(t==null?void 0:t.maxWidth)??U,n=e.tooltipBorderWidth??(t==null?void 0:t.tooltipBorderWidth)??k,T=W+" "+D+" "+(e.tooltipClasses??(t==null?void 0:t.tooltipClasses)??""),x=H+" "+P+" "+(e.textClasses??(t==null?void 0:t.textClasses)??""),z=e.arrowSize??(t==null?void 0:t.arrowSize)??q,y=e.arrowClasses??(t==null?void 0:t.arrowClasses)??"",M=e.arrowMinOffsetFromTooltipCorner??(t==null?void 0:t.arrowMinOffsetFromTooltipCorner)??j,S=e.zIndex??(t==null?void 0:t.zIndex)??Z,V=e.show??N),d===void 0&&(d=r??(t==null?void 0:t.defaultPosition)??f),i===void 0&&(i={left:((C=t==null?void 0:t.positions)==null?void 0:C.left)??c.left,top:((g=t==null?void 0:t.positions)==null?void 0:g.top)??c.top,right:((tt=t==null?void 0:t.positions)==null?void 0:tt.right)??c.right,bottom:((et=t==null?void 0:t.positions)==null?void 0:et.bottom)??c.bottom}),o===void 0&&(o=(t==null?void 0:t.offsetFromSource)??A),p===void 0&&(p=(t==null?void 0:t.offsetFromViewport)??_),u===void 0&&(u=(t==null?void 0:t.minWidth)??I),w===void 0&&(w=(t==null?void 0:t.maxWidth)??U),n===void 0&&(n=(t==null?void 0:t.tooltipBorderWidth)??k),T===void 0&&(T=W+" "+D+" "+((t==null?void 0:t.tooltipClasses)??"")),x===void 0&&(x=H+" "+P+" "+((t==null?void 0:t.textClasses)??"")),z===void 0&&(z=(t==null?void 0:t.arrowSize)??q),y===void 0&&(y=(t==null?void 0:t.arrowClasses)??""),M===void 0&&(M=(t==null?void 0:t.arrowMinOffsetFromTooltipCorner)??j),S===void 0&&(S=(t==null?void 0:t.zIndex)??Z),V===void 0&&(V=N),{tooltipText:s,tooltipPosition:d,tooltipPositions:i,tooltipOffsetFromSource:o,tooltipOffsetFromViewport:p,tooltipMinWidth:u,tooltipMaxWidth:w,tooltipBorderWidth:n,tooltipClasses:T,textClasses:x,arrowSize:z,arrowClasses:y,arrowMinOffsetFromTooltipCorner:M,zIndex:S,shouldShow:V}}function Ot(e){const t=typeof e=="string"?e:e.content;if(!t)throw new Error("Please enter valid tooltip value");return t}function xt(e,t,r){let s=e,d=Ft(t.textClasses,t.tooltipText),i=Tt(t.tooltipClasses,t.tooltipBorderWidth);i.append(d),i.dataset.uuid=r;const o=new AbortController,p=new AbortController;return s.addEventListener("mouseenter",()=>Wt(s,t,i),{signal:o.signal}),s.addEventListener("mouseleave",vt,{signal:p.signal}),{anchorElement:s,tooltipConfig:t,tooltipElement:i,mouseEnterEventController:o,mouseLeaveEventController:p}}function Ft(e,t){let r=document.createElement("p");return r.classList.add(...e.trim().split(" ")),r.innerHTML=t,r}function Tt(e,t){let r=document.createElement("div");return r.classList.add(...e.trim().split(" ")),r.style.borderWidth=`${t}px`,r}function Wt(e,t,r){if(!t.shouldShow)return;const s=e.getBoundingClientRect(),d=document.querySelector("body");d==null||d.appendChild(r);let i=!1,o=t.tooltipPosition;for(let p=0;p<4&&(o=t.tooltipPositions[t.tooltipPosition][p],o==="left"?i=zt(s,t,r):o==="top"?i=Mt(s,t,r):o==="right"?i=yt(s,t,r):o==="bottom"&&(i=St(s,t,r)),!i);p++);i&&(Vt(s,o,t,r),r.style.opacity="1",r.style.zIndex=t.zIndex.toString(),ut(e,()=>v()),ht(e,()=>v()))}function vt(){v()}function zt(e,t,r){const s=Math.min(e.left-t.tooltipOffsetFromSource-t.tooltipOffsetFromViewport,t.tooltipMaxWidth),d=e.top>=t.tooltipOffsetFromViewport,i=window.innerHeight-e.bottom>=t.tooltipOffsetFromViewport;if(s<t.tooltipMinWidth||!d||!i)return!1;r.style.maxWidth=`${s}px`;const o=r.getBoundingClientRect();let p=e.top+e.height/2-o.height/2;p<t.tooltipOffsetFromViewport?p=t.tooltipOffsetFromViewport:p+o.height>window.innerHeight-t.tooltipOffsetFromViewport&&(p=window.innerHeight-t.tooltipOffsetFromViewport-o.height);const u=e.left-t.tooltipOffsetFromSource-o.width;return e.bottom<p+t.arrowMinOffsetFromTooltipCorner*2||e.top>p+o.height-t.arrowMinOffsetFromTooltipCorner*2?!1:(r.style.top=`${p}px`,r.style.left=`${u}px`,!0)}function yt(e,t,r){const s=Math.min(window.innerWidth-(e.right+t.tooltipOffsetFromSource)-t.tooltipOffsetFromViewport,t.tooltipMaxWidth),d=e.top>=t.tooltipOffsetFromViewport,i=window.innerHeight-e.bottom>=t.tooltipOffsetFromViewport;if(s<t.tooltipMinWidth||!d||!i)return!1;r.style.maxWidth=`${s}px`;const o=r.getBoundingClientRect();let p=e.top+e.height/2-o.height/2;p<t.tooltipOffsetFromViewport?p=t.tooltipOffsetFromViewport:p+o.height>window.innerHeight-t.tooltipOffsetFromViewport&&(p=window.innerHeight-t.tooltipOffsetFromViewport-o.height);const u=e.right+t.tooltipOffsetFromSource;return e.bottom<p+t.arrowMinOffsetFromTooltipCorner*2||e.top>p+o.height-t.arrowMinOffsetFromTooltipCorner*2?!1:(r.style.top=`${p}px`,r.style.left=`${u}px`,!0)}function Mt(e,t,r){const s=Math.min(window.innerWidth-t.tooltipOffsetFromViewport*2,t.tooltipMaxWidth);r.style.maxWidth=`${s}px`;const d=r.getBoundingClientRect();let i=e.top-t.tooltipOffsetFromSource-d.height;if(i<t.tooltipOffsetFromViewport)return!1;let o=e.left+e.width/2-d.width/2;return o<t.tooltipOffsetFromViewport?o=t.tooltipOffsetFromViewport:o+d.width>window.innerWidth-t.tooltipOffsetFromViewport&&(o=window.innerWidth-t.tooltipOffsetFromViewport-d.width),e.left>o+d.width-t.arrowMinOffsetFromTooltipCorner*2||e.right<o+t.arrowMinOffsetFromTooltipCorner*2?!1:(r.style.top=`${i}px`,r.style.left=`${o}px`,!0)}function St(e,t,r){const s=Math.min(window.innerWidth-t.tooltipOffsetFromViewport*2,t.tooltipMaxWidth);r.style.maxWidth=`${s}px`;const d=r.getBoundingClientRect();let i=e.bottom+t.tooltipOffsetFromSource;if(i+d.height>window.innerHeight-t.tooltipOffsetFromViewport)return!1;let o=e.left+e.width/2-d.width/2;return o<t.tooltipOffsetFromViewport?o=t.tooltipOffsetFromViewport:o+d.width>window.innerWidth-t.tooltipOffsetFromViewport&&(o=window.innerWidth-t.tooltipOffsetFromViewport-d.width),e.left>o+d.width-t.arrowMinOffsetFromTooltipCorner*2||e.right<o+t.arrowMinOffsetFromTooltipCorner*2?!1:(r.style.top=`${i}px`,r.style.left=`${o}px`,!0)}function Vt(e,t,r,s){var x;const d=document.createElement("div"),i=s.getBoundingClientRect(),o=Math.sin(45*(180/Math.PI))*r.arrowSize,p=1;let u=0,w=0,n="";switch(t){case"left":n="!zt-border-y-transparent !zt-border-r-transparent",u=e.top-i.top+e.height/2-o-r.tooltipBorderWidth,w=i.width-r.tooltipBorderWidth-p;break;case"top":n="!zt-border-x-transparent !zt-border-b-transparent",u=i.height-r.tooltipBorderWidth-p,w=e.left-i.left+e.width/2-o-r.tooltipBorderWidth;break;case"right":n="!zt-border-y-transparent !zt-border-l-transparent",u=e.top-i.top+e.height/2-o-r.tooltipBorderWidth,w=-r.arrowSize*2-r.tooltipBorderWidth+p;break;case"bottom":n="!zt-border-x-transparent !zt-border-t-transparent",u=-r.arrowSize*2-r.tooltipBorderWidth+p,w=e.left-i.left+e.width/2-o-r.tooltipBorderWidth;break}t==="left"||t==="right"?R(t,i,u,r)||(u=G(t,i,u,r)):R(t,i,w,r)||(w=G(t,i,w,r));const T=$+" "+nt+" "+n+" "+r.arrowClasses;d.classList.add(...T.trim().split(" ")),d.style.top=`${u}px`,d.style.left=`${w}px`,d.style.borderWidth=`${r.arrowSize}px`,(x=document.querySelector(`.${W}`))==null||x.appendChild(d)}function R(e,t,r,s){switch(e){case"left":case"right":return r>s.arrowMinOffsetFromTooltipCorner-s.tooltipBorderWidth&&r<t.height+s.tooltipBorderWidth-s.arrowMinOffsetFromTooltipCorner-s.arrowSize*2;case"top":case"bottom":return r>s.arrowMinOffsetFromTooltipCorner-s.tooltipBorderWidth&&r<t.width+s.tooltipBorderWidth-s.arrowMinOffsetFromTooltipCorner-s.arrowSize*2}}function G(e,t,r,s){switch(e){case"left":case"right":return r<s.arrowMinOffsetFromTooltipCorner-s.tooltipBorderWidth?s.arrowMinOffsetFromTooltipCorner-s.tooltipBorderWidth:t.height-s.tooltipBorderWidth-s.arrowMinOffsetFromTooltipCorner-s.arrowSize*2;case"top":case"bottom":return r<s.arrowMinOffsetFromTooltipCorner-s.tooltipBorderWidth?s.arrowMinOffsetFromTooltipCorner-s.tooltipBorderWidth:t.width-s.tooltipBorderWidth-s.arrowMinOffsetFromTooltipCorner-s.arrowSize*2}}function v(){var t;const e=document.querySelector(`.${W}`);e&&e instanceof HTMLElement&&(wt(),(t=e.querySelector(`.${$}`))==null||t.remove(),e.style.left="0",e.style.top="0",e.remove())}function a(e){v(),e.mouseEnterEventController.abort(),e.mouseLeaveEventController.abort();const t=e.tooltipElement.dataset.uuid;t&&delete O[t]}return mt});
package/package.json CHANGED
@@ -20,7 +20,7 @@
20
20
  "dist",
21
21
  "src"
22
22
  ],
23
- "version": "1.0.5",
23
+ "version": "1.0.7",
24
24
  "type": "module",
25
25
  "scripts": {
26
26
  "dev": "vite",
@@ -57,5 +57,9 @@
57
57
  "bugs": {
58
58
  "url": "https://github.com/TheAliter/zero-tooltip/issues"
59
59
  },
60
- "homepage": "https://github.com/TheAliter/zero-tooltip#readme"
60
+ "homepage": "https://github.com/TheAliter/zero-tooltip#readme",
61
+ "dependencies": {
62
+ "@types/uuid": "^9.0.7",
63
+ "uuid": "^9.0.1"
64
+ }
61
65
  }
package/src/tooltip.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  import { Directive, watch } from "vue"
2
+ import { v4 as uuidv4 } from 'uuid'
2
3
  import TooltipConfig from "./types/tooltipConfig"
3
4
  import TooltipPosition from "./types/tooltipPosition"
4
5
  import TooltipPositions from "./types/tooltipPositions"
@@ -36,54 +37,78 @@ const defaultMinArrowOffsetFromTooltipCorner = 6
36
37
  const defaultZIndex = 1
37
38
  const defaultShouldShow = true
38
39
 
39
- // Tooltip config
40
- let tooltipText: string
41
- let tooltipPosition: TooltipPosition
42
- let tooltipPositions: TooltipPositions
43
- let tooltipOffsetFromSource: number
44
- let tooltipOffsetFromViewport: number
45
- let tooltipMinWidth: number
46
- let tooltipMaxWidth: number
47
- let tooltipBorderWidth: number
48
- let tooltipClasses: string
49
- let textClasses: string
50
- let arrowSize: number
51
- let arrowClasses: string
52
- let arrowMinOffsetFromTooltipCorner: number
53
- let zIndex: number
54
- let shouldShow: boolean
55
-
56
- // Tooltip elements
57
- let anchorElement: HTMLElement
58
- let tooltipTextElement: HTMLElement
59
- let tooltipElement: HTMLElement
60
-
61
- let isHovered = false
40
+ const tooltips: {[key: string]: ReturnType<typeof initTooltip>} = {}
62
41
 
63
42
  const ZeroTooltip = (globalConfig?: TooltipConfig): Directive => {
64
43
  return {
65
- mounted: (targetElement: HTMLElement, binding) => {
66
- setTooltipConfig(binding.value, globalConfig, binding.arg as TooltipPosition)
67
- initTooltip(targetElement)
44
+ created: (targetElement: HTMLElement, binding, vnode) => {
45
+ const uuid = uuidv4()
46
+ vnode.el.$_tooltip = { uuid: uuid }
47
+
48
+ buildTooltip(binding.value, globalConfig, binding.arg, targetElement, uuid)
68
49
 
69
50
  if (typeof(binding.value) !== 'string') {
70
51
  watch(binding.value, (newBindingValue) => {
71
- setTooltipConfig(newBindingValue as string | TooltipLocalConfig, globalConfig, binding.arg as TooltipPosition)
72
- initTooltip(targetElement)
52
+ if (tooltips[uuid]) {
53
+ destroyTooltip(tooltips[uuid])
54
+ }
55
+
56
+ buildTooltip(newBindingValue, globalConfig, binding.arg, targetElement, uuid)
73
57
  })
74
58
  }
75
59
  },
76
60
 
77
- updated: (targetElement: HTMLElement, binding) => {
61
+ updated: (targetElement: HTMLElement, binding, vnode) => {
78
62
  if (typeof(binding.value) === 'string') {
79
- setTooltipConfig(binding.value, globalConfig, binding.arg as TooltipPosition)
80
- initTooltip(targetElement)
63
+ const uuid = vnode.el.$_tooltip.uuid
64
+
65
+ if (tooltips[uuid]) {
66
+ destroyTooltip(tooltips[uuid])
67
+ }
68
+
69
+ buildTooltip(binding.value, globalConfig, binding.arg, targetElement, uuid)
70
+ }
71
+ },
72
+
73
+ beforeUnmount: (_, __, vnode) => {
74
+ const uuid = vnode.el.$_tooltip.uuid
75
+
76
+ if (tooltips[uuid]) {
77
+ destroyTooltip(tooltips[uuid])
81
78
  }
82
79
  }
83
80
  }
84
81
  }
85
82
 
86
- function setTooltipConfig(localConfig: string | TooltipLocalConfig, globalConfig?: TooltipConfig, position?: TooltipPosition) {
83
+ function buildTooltip(bindingValue: any, globalConfig: TooltipConfig | undefined, bindingArgument: string | undefined, targetElement: HTMLElement, uuid: string) {
84
+ let tooltipConfig = getTooltipConfig(bindingValue as string | TooltipLocalConfig, globalConfig, bindingArgument as TooltipPosition)
85
+ const tooltip = initTooltip(targetElement, tooltipConfig, uuid)
86
+
87
+ if (targetElement.matches(':hover')) {
88
+ targetElement.dispatchEvent(new Event('mouseenter'))
89
+ }
90
+
91
+ tooltips[uuid] = tooltip
92
+ }
93
+
94
+ function getTooltipConfig(localConfig: string | TooltipLocalConfig, globalConfig?: TooltipConfig, position?: TooltipPosition) {
95
+ // Tooltip config
96
+ let tooltipText: string | undefined
97
+ let tooltipPosition: TooltipPosition | undefined
98
+ let tooltipPositions: TooltipPositions | undefined
99
+ let tooltipOffsetFromSource: number | undefined
100
+ let tooltipOffsetFromViewport: number | undefined
101
+ let tooltipMinWidth: number | undefined
102
+ let tooltipMaxWidth: number | undefined
103
+ let tooltipBorderWidth: number | undefined
104
+ let tooltipClasses: string | undefined
105
+ let textClasses: string | undefined
106
+ let arrowSize: number | undefined
107
+ let arrowClasses: string | undefined
108
+ let arrowMinOffsetFromTooltipCorner: number | undefined
109
+ let zIndex: number | undefined
110
+ let shouldShow: boolean | undefined
111
+
87
112
  tooltipText = getTooltipText(localConfig)
88
113
 
89
114
  if (typeof(localConfig) !== 'string') {
@@ -120,13 +145,31 @@ function setTooltipConfig(localConfig: string | TooltipLocalConfig, globalConfig
120
145
  if (tooltipMinWidth === undefined) tooltipMinWidth = globalConfig?.minWidth ?? defaultTooltipMinWidth
121
146
  if (tooltipMaxWidth === undefined) tooltipMaxWidth = globalConfig?.maxWidth ?? defaultTooltipMaxWidth
122
147
  if (tooltipBorderWidth === undefined) tooltipBorderWidth = globalConfig?.tooltipBorderWidth ?? defaultTooltipBorderWidth
123
- if (tooltipClasses === undefined) tooltipClasses = tooltipElementClass + ' ' + defaultTooltipClasses + ' ' + globalConfig?.tooltipClasses ?? ''
124
- if (textClasses === undefined) textClasses = textElementClass + ' ' + defaultTextClasses + ' ' + globalConfig?.textClasses ?? ''
148
+ if (tooltipClasses === undefined) tooltipClasses = tooltipElementClass + ' ' + defaultTooltipClasses + ' ' + (globalConfig?.tooltipClasses ?? '')
149
+ if (textClasses === undefined) textClasses = textElementClass + ' ' + defaultTextClasses + ' ' + (globalConfig?.textClasses ?? '')
125
150
  if (arrowSize === undefined) arrowSize = globalConfig?.arrowSize ?? defaultArrowSize
126
151
  if (arrowClasses === undefined) arrowClasses = globalConfig?.arrowClasses ?? ''
127
152
  if (arrowMinOffsetFromTooltipCorner === undefined) arrowMinOffsetFromTooltipCorner = globalConfig?.arrowMinOffsetFromTooltipCorner ?? defaultMinArrowOffsetFromTooltipCorner
128
153
  if (zIndex === undefined) zIndex = globalConfig?.zIndex ?? defaultZIndex
129
154
  if (shouldShow === undefined) shouldShow = defaultShouldShow
155
+
156
+ return {
157
+ tooltipText,
158
+ tooltipPosition,
159
+ tooltipPositions,
160
+ tooltipOffsetFromSource,
161
+ tooltipOffsetFromViewport,
162
+ tooltipMinWidth,
163
+ tooltipMaxWidth,
164
+ tooltipBorderWidth,
165
+ tooltipClasses,
166
+ textClasses,
167
+ arrowSize,
168
+ arrowClasses,
169
+ arrowMinOffsetFromTooltipCorner,
170
+ zIndex,
171
+ shouldShow
172
+ }
130
173
  }
131
174
 
132
175
  function getTooltipText(localConfig: string | TooltipLocalConfig) {
@@ -139,40 +182,51 @@ function getTooltipText(localConfig: string | TooltipLocalConfig) {
139
182
  return tooltipText
140
183
  }
141
184
 
142
- function initTooltip(targetElement: HTMLElement) {
143
- anchorElement = targetElement
144
- anchorElement.removeEventListener('mouseenter', onMouseEnter)
145
- anchorElement.removeEventListener('mouseleave', onMouseLeave)
185
+ function initTooltip(targetElement: HTMLElement, tooltipConfig: ReturnType<typeof getTooltipConfig>, uuid: string) {
186
+ let anchorElement = targetElement
187
+
188
+ let tooltipTextElement = createTextElement(tooltipConfig.textClasses, tooltipConfig.tooltipText)
189
+ let tooltipElement = createTooltipElement(tooltipConfig.tooltipClasses, tooltipConfig.tooltipBorderWidth)
190
+ tooltipElement.append(tooltipTextElement)
191
+ tooltipElement.dataset.uuid = uuid
146
192
 
147
- createTextElement()
148
- createTooltipElement()
193
+ const mouseEnterEventController = new AbortController()
194
+ const mouseLeaveEventController = new AbortController()
149
195
 
150
- anchorElement.addEventListener('mouseenter', onMouseEnter)
151
- anchorElement.addEventListener('mouseleave', onMouseLeave)
196
+ anchorElement.addEventListener('mouseenter', () => onMouseEnter(anchorElement, tooltipConfig, tooltipElement), { signal: mouseEnterEventController.signal})
197
+ anchorElement.addEventListener('mouseleave', onMouseLeave, { signal: mouseLeaveEventController.signal})
152
198
 
153
- if (isHovered) {
154
- anchorElement.dispatchEvent(new Event('mouseleave'))
155
- anchorElement.dispatchEvent(new Event('mouseenter'))
199
+ return {
200
+ anchorElement,
201
+ tooltipConfig,
202
+ tooltipElement,
203
+ mouseEnterEventController,
204
+ mouseLeaveEventController
156
205
  }
157
206
  }
158
207
 
159
- function createTextElement() {
160
- tooltipTextElement = document.createElement('p')
208
+ function createTextElement(textClasses: string, tooltipText: string) {
209
+ let tooltipTextElement = document.createElement('p')
161
210
  tooltipTextElement.classList.add(...textClasses.trim().split(' '))
162
211
  tooltipTextElement.innerHTML = tooltipText
212
+
213
+ return tooltipTextElement
163
214
  }
164
215
 
165
- function createTooltipElement() {
166
- tooltipElement = document.createElement('div')
216
+ function createTooltipElement(tooltipClasses: string, tooltipBorderWidth: number) {
217
+ let tooltipElement = document.createElement('div')
167
218
  tooltipElement.classList.add(...tooltipClasses.trim().split(' '))
168
219
  tooltipElement.style.borderWidth = `${tooltipBorderWidth}px`
169
- tooltipElement.appendChild(tooltipTextElement)
170
- }
171
220
 
172
- function onMouseEnter() {
173
- isHovered = true
221
+ return tooltipElement
222
+ }
174
223
 
175
- if (!shouldShow) return
224
+ function onMouseEnter(
225
+ anchorElement: HTMLElement,
226
+ tooltipConfig: ReturnType<typeof getTooltipConfig>,
227
+ tooltipElement: HTMLDivElement
228
+ ) {
229
+ if (!tooltipConfig.shouldShow) return
176
230
 
177
231
  const anchorElementRect = anchorElement.getBoundingClientRect()
178
232
 
@@ -182,28 +236,28 @@ function onMouseEnter() {
182
236
 
183
237
  // Find suitable Tooltip position
184
238
  let hasNeededDisplaySpace = false
185
- let currentTooltipPosition = tooltipPosition
239
+ let currentTooltipPosition = tooltipConfig.tooltipPosition
186
240
  for (let i = 0; i < 4; i++) {
187
- currentTooltipPosition = tooltipPositions[tooltipPosition][i]
241
+ currentTooltipPosition = tooltipConfig.tooltipPositions[tooltipConfig.tooltipPosition][i]
188
242
 
189
243
  if (currentTooltipPosition === 'left') {
190
- hasNeededDisplaySpace = tryMountTooltipOnLeft(anchorElementRect)
244
+ hasNeededDisplaySpace = tryMountTooltipOnLeft(anchorElementRect, tooltipConfig, tooltipElement)
191
245
  } else if (currentTooltipPosition === 'top') {
192
- hasNeededDisplaySpace = tryMountTooltipOnTop(anchorElementRect)
246
+ hasNeededDisplaySpace = tryMountTooltipOnTop(anchorElementRect, tooltipConfig, tooltipElement)
193
247
  } else if (currentTooltipPosition === 'right') {
194
- hasNeededDisplaySpace = tryMountTooltipOnRight(anchorElementRect)
248
+ hasNeededDisplaySpace = tryMountTooltipOnRight(anchorElementRect, tooltipConfig, tooltipElement)
195
249
  } else if (currentTooltipPosition === 'bottom') {
196
- hasNeededDisplaySpace = tryMountTooltipOnBottom(anchorElementRect)
250
+ hasNeededDisplaySpace = tryMountTooltipOnBottom(anchorElementRect, tooltipConfig, tooltipElement)
197
251
  }
198
252
 
199
253
  if (hasNeededDisplaySpace) break
200
254
  }
201
255
 
202
256
  if (hasNeededDisplaySpace) {
203
- drawArrow(anchorElementRect, currentTooltipPosition)
257
+ drawArrow(anchorElementRect, currentTooltipPosition, tooltipConfig, tooltipElement)
204
258
 
205
259
  tooltipElement.style.opacity = '1'
206
- tooltipElement.style.zIndex = zIndex.toString()
260
+ tooltipElement.style.zIndex = tooltipConfig.zIndex.toString()
207
261
 
208
262
  handleHideOnScroll(anchorElement, () => hideTooltip())
209
263
  handleHideOnResize(anchorElement, () => hideTooltip())
@@ -214,13 +268,13 @@ function onMouseLeave() {
214
268
  hideTooltip()
215
269
  }
216
270
 
217
- function tryMountTooltipOnLeft(anchorElementRect: DOMRect) {
271
+ function tryMountTooltipOnLeft(anchorElementRect: DOMRect, tooltipConfig: ReturnType<typeof getTooltipConfig>, tooltipElement: HTMLDivElement) {
218
272
  // Check if Tooltip has enough available horizontal space, top and bottom offset from viewport
219
- const tooltipAvailableMaxWidth = Math.min(anchorElementRect.left - tooltipOffsetFromSource - tooltipOffsetFromViewport, tooltipMaxWidth)
220
- const isAnchorElementTopLowerThanOffsetFromViewport = anchorElementRect.top >= tooltipOffsetFromViewport
221
- const isAnchorElementBottomHigherThanOffsetFromViewport = (window.innerHeight - anchorElementRect.bottom) >= tooltipOffsetFromViewport
273
+ const tooltipAvailableMaxWidth = Math.min(anchorElementRect.left - tooltipConfig.tooltipOffsetFromSource - tooltipConfig.tooltipOffsetFromViewport, tooltipConfig.tooltipMaxWidth)
274
+ const isAnchorElementTopLowerThanOffsetFromViewport = anchorElementRect.top >= tooltipConfig.tooltipOffsetFromViewport
275
+ const isAnchorElementBottomHigherThanOffsetFromViewport = (window.innerHeight - anchorElementRect.bottom) >= tooltipConfig.tooltipOffsetFromViewport
222
276
 
223
- if (tooltipAvailableMaxWidth < tooltipMinWidth || !isAnchorElementTopLowerThanOffsetFromViewport || !isAnchorElementBottomHigherThanOffsetFromViewport) return false
277
+ if (tooltipAvailableMaxWidth < tooltipConfig.tooltipMinWidth || !isAnchorElementTopLowerThanOffsetFromViewport || !isAnchorElementBottomHigherThanOffsetFromViewport) return false
224
278
 
225
279
  // Set Tooltip maxWidth
226
280
  tooltipElement.style.maxWidth = `${tooltipAvailableMaxWidth}px`
@@ -229,17 +283,17 @@ function tryMountTooltipOnLeft(anchorElementRect: DOMRect) {
229
283
  const tooltipElementRect = tooltipElement.getBoundingClientRect()
230
284
  let tooltipTop = anchorElementRect.top + (anchorElementRect.height / 2) - (tooltipElementRect.height / 2)
231
285
 
232
- if (tooltipTop < tooltipOffsetFromViewport) {
233
- tooltipTop = tooltipOffsetFromViewport
234
- } else if (tooltipTop + tooltipElementRect.height > window.innerHeight - tooltipOffsetFromViewport) {
235
- tooltipTop = window.innerHeight - tooltipOffsetFromViewport - tooltipElementRect.height
286
+ if (tooltipTop < tooltipConfig.tooltipOffsetFromViewport) {
287
+ tooltipTop = tooltipConfig.tooltipOffsetFromViewport
288
+ } else if (tooltipTop + tooltipElementRect.height > window.innerHeight - tooltipConfig.tooltipOffsetFromViewport) {
289
+ tooltipTop = window.innerHeight - tooltipConfig.tooltipOffsetFromViewport - tooltipElementRect.height
236
290
  }
237
291
 
238
- const tooltipLeft = anchorElementRect.left - tooltipOffsetFromSource - tooltipElementRect.width
292
+ const tooltipLeft = anchorElementRect.left - tooltipConfig.tooltipOffsetFromSource - tooltipElementRect.width
239
293
 
240
294
  // Check if anchor element is directly on right of Tooltip
241
- if (anchorElementRect.bottom < tooltipTop + arrowMinOffsetFromTooltipCorner * 2
242
- || anchorElementRect.top > tooltipTop + tooltipElementRect.height - arrowMinOffsetFromTooltipCorner * 2) return false
295
+ if (anchorElementRect.bottom < tooltipTop + tooltipConfig.arrowMinOffsetFromTooltipCorner * 2
296
+ || anchorElementRect.top > tooltipTop + tooltipElementRect.height - tooltipConfig.arrowMinOffsetFromTooltipCorner * 2) return false
243
297
 
244
298
  // Set Tooltip position
245
299
  tooltipElement.style.top = `${tooltipTop}px`
@@ -248,13 +302,13 @@ function tryMountTooltipOnLeft(anchorElementRect: DOMRect) {
248
302
  return true
249
303
  }
250
304
 
251
- function tryMountTooltipOnRight(anchorElementRect: DOMRect) {
305
+ function tryMountTooltipOnRight(anchorElementRect: DOMRect, tooltipConfig: ReturnType<typeof getTooltipConfig>, tooltipElement: HTMLDivElement) {
252
306
  // Check if Tooltip has enough available horizontal space, top and bottom offset from viewport
253
- const tooltipAvailableMaxWidth = Math.min(window.innerWidth - (anchorElementRect.right + tooltipOffsetFromSource) - tooltipOffsetFromViewport, tooltipMaxWidth)
254
- const isAnchorElementTopLowerThanOffsetFromViewport = anchorElementRect.top >= tooltipOffsetFromViewport
255
- const isAnchorElementBottomHigherThanOffsetFromViewport = (window.innerHeight - anchorElementRect.bottom) >= tooltipOffsetFromViewport
307
+ const tooltipAvailableMaxWidth = Math.min(window.innerWidth - (anchorElementRect.right + tooltipConfig.tooltipOffsetFromSource) - tooltipConfig.tooltipOffsetFromViewport, tooltipConfig.tooltipMaxWidth)
308
+ const isAnchorElementTopLowerThanOffsetFromViewport = anchorElementRect.top >= tooltipConfig.tooltipOffsetFromViewport
309
+ const isAnchorElementBottomHigherThanOffsetFromViewport = (window.innerHeight - anchorElementRect.bottom) >= tooltipConfig.tooltipOffsetFromViewport
256
310
 
257
- if (tooltipAvailableMaxWidth < tooltipMinWidth || !isAnchorElementTopLowerThanOffsetFromViewport || !isAnchorElementBottomHigherThanOffsetFromViewport) return false
311
+ if (tooltipAvailableMaxWidth < tooltipConfig.tooltipMinWidth || !isAnchorElementTopLowerThanOffsetFromViewport || !isAnchorElementBottomHigherThanOffsetFromViewport) return false
258
312
 
259
313
  // Set tooltip maxWidth
260
314
  tooltipElement.style.maxWidth = `${tooltipAvailableMaxWidth}px`
@@ -264,17 +318,17 @@ function tryMountTooltipOnRight(anchorElementRect: DOMRect) {
264
318
 
265
319
  let tooltipTop = anchorElementRect.top + (anchorElementRect.height / 2) - (tooltipElementRect.height / 2)
266
320
 
267
- if (tooltipTop < tooltipOffsetFromViewport) {
268
- tooltipTop = tooltipOffsetFromViewport
269
- } else if (tooltipTop + tooltipElementRect.height > window.innerHeight - tooltipOffsetFromViewport) {
270
- tooltipTop = window.innerHeight - tooltipOffsetFromViewport - tooltipElementRect.height
321
+ if (tooltipTop < tooltipConfig.tooltipOffsetFromViewport) {
322
+ tooltipTop = tooltipConfig.tooltipOffsetFromViewport
323
+ } else if (tooltipTop + tooltipElementRect.height > window.innerHeight - tooltipConfig.tooltipOffsetFromViewport) {
324
+ tooltipTop = window.innerHeight - tooltipConfig.tooltipOffsetFromViewport - tooltipElementRect.height
271
325
  }
272
326
 
273
- const tooltipLeft = anchorElementRect.right + tooltipOffsetFromSource
327
+ const tooltipLeft = anchorElementRect.right + tooltipConfig.tooltipOffsetFromSource
274
328
 
275
329
  // Check if anchor element is directly on left of Tooltip
276
- if (anchorElementRect.bottom < tooltipTop + arrowMinOffsetFromTooltipCorner * 2
277
- || anchorElementRect.top > tooltipTop + tooltipElementRect.height - arrowMinOffsetFromTooltipCorner * 2) return false
330
+ if (anchorElementRect.bottom < tooltipTop + tooltipConfig.arrowMinOffsetFromTooltipCorner * 2
331
+ || anchorElementRect.top > tooltipTop + tooltipElementRect.height - tooltipConfig.arrowMinOffsetFromTooltipCorner * 2) return false
278
332
 
279
333
  // Set Tooltip position
280
334
  tooltipElement.style.top = `${tooltipTop}px`
@@ -283,30 +337,30 @@ function tryMountTooltipOnRight(anchorElementRect: DOMRect) {
283
337
  return true
284
338
  }
285
339
 
286
- function tryMountTooltipOnTop(anchorElementRect: DOMRect) {
340
+ function tryMountTooltipOnTop(anchorElementRect: DOMRect, tooltipConfig: ReturnType<typeof getTooltipConfig>, tooltipElement: HTMLDivElement) {
287
341
  // Calculate and set Tooltip width
288
- const tooltipAvailableMaxWidth = Math.min(window.innerWidth - (tooltipOffsetFromViewport * 2), tooltipMaxWidth)
342
+ const tooltipAvailableMaxWidth = Math.min(window.innerWidth - (tooltipConfig.tooltipOffsetFromViewport * 2), tooltipConfig.tooltipMaxWidth)
289
343
  tooltipElement.style.maxWidth = `${tooltipAvailableMaxWidth}px`
290
344
 
291
345
  // Calculate Tooltip top position
292
346
  const tooltipElementRect = tooltipElement.getBoundingClientRect()
293
- let tooltipTop = anchorElementRect.top - tooltipOffsetFromSource - tooltipElementRect.height
347
+ let tooltipTop = anchorElementRect.top - tooltipConfig.tooltipOffsetFromSource - tooltipElementRect.height
294
348
 
295
349
  // Check if Tooltip has enough available on top
296
- if (tooltipTop < tooltipOffsetFromViewport) return false
350
+ if (tooltipTop < tooltipConfig.tooltipOffsetFromViewport) return false
297
351
 
298
352
  // Calculate Tooltip left position
299
353
  let tooltipLeft = anchorElementRect.left + (anchorElementRect.width / 2) - (tooltipElementRect.width / 2)
300
354
 
301
- if (tooltipLeft < tooltipOffsetFromViewport) {
302
- tooltipLeft = tooltipOffsetFromViewport
303
- } else if (tooltipLeft + tooltipElementRect.width > window.innerWidth - tooltipOffsetFromViewport) {
304
- tooltipLeft = window.innerWidth - tooltipOffsetFromViewport - tooltipElementRect.width
355
+ if (tooltipLeft < tooltipConfig.tooltipOffsetFromViewport) {
356
+ tooltipLeft = tooltipConfig.tooltipOffsetFromViewport
357
+ } else if (tooltipLeft + tooltipElementRect.width > window.innerWidth - tooltipConfig.tooltipOffsetFromViewport) {
358
+ tooltipLeft = window.innerWidth - tooltipConfig.tooltipOffsetFromViewport - tooltipElementRect.width
305
359
  }
306
360
 
307
361
  // Check if anchor element is directly on below of Tooltip
308
- if (anchorElementRect.left > tooltipLeft + tooltipElementRect.width - arrowMinOffsetFromTooltipCorner * 2
309
- || anchorElementRect.right < tooltipLeft + arrowMinOffsetFromTooltipCorner * 2) return false
362
+ if (anchorElementRect.left > tooltipLeft + tooltipElementRect.width - tooltipConfig.arrowMinOffsetFromTooltipCorner * 2
363
+ || anchorElementRect.right < tooltipLeft + tooltipConfig.arrowMinOffsetFromTooltipCorner * 2) return false
310
364
 
311
365
  // Set Tooltip position
312
366
  tooltipElement.style.top = `${tooltipTop}px`
@@ -315,30 +369,30 @@ function tryMountTooltipOnTop(anchorElementRect: DOMRect) {
315
369
  return true
316
370
  }
317
371
 
318
- function tryMountTooltipOnBottom(anchorElementRect: DOMRect) {
372
+ function tryMountTooltipOnBottom(anchorElementRect: DOMRect, tooltipConfig: ReturnType<typeof getTooltipConfig>, tooltipElement: HTMLDivElement) {
319
373
  // Calculate and set Tooltip width
320
- const tooltipAvailableMaxWidth = Math.min(window.innerWidth - (tooltipOffsetFromViewport * 2), tooltipMaxWidth)
374
+ const tooltipAvailableMaxWidth = Math.min(window.innerWidth - (tooltipConfig.tooltipOffsetFromViewport * 2), tooltipConfig.tooltipMaxWidth)
321
375
  tooltipElement.style.maxWidth = `${tooltipAvailableMaxWidth}px`
322
376
 
323
377
  // Calculate Tooltip top position
324
378
  const tooltipElementRect = tooltipElement.getBoundingClientRect()
325
- let tooltipTop = anchorElementRect.bottom + tooltipOffsetFromSource
379
+ let tooltipTop = anchorElementRect.bottom + tooltipConfig.tooltipOffsetFromSource
326
380
 
327
381
  // Check if Tooltip has enough available on bottom
328
- if (tooltipTop + tooltipElementRect.height > window.innerHeight - tooltipOffsetFromViewport) return false
382
+ if (tooltipTop + tooltipElementRect.height > window.innerHeight - tooltipConfig.tooltipOffsetFromViewport) return false
329
383
 
330
384
  // Calculate Tooltip left position
331
385
  let tooltipLeft = anchorElementRect.left + (anchorElementRect.width / 2) - (tooltipElementRect.width / 2)
332
386
 
333
- if (tooltipLeft < tooltipOffsetFromViewport) {
334
- tooltipLeft = tooltipOffsetFromViewport
335
- } else if (tooltipLeft + tooltipElementRect.width > window.innerWidth - tooltipOffsetFromViewport) {
336
- tooltipLeft = window.innerWidth - tooltipOffsetFromViewport - tooltipElementRect.width
387
+ if (tooltipLeft < tooltipConfig.tooltipOffsetFromViewport) {
388
+ tooltipLeft = tooltipConfig.tooltipOffsetFromViewport
389
+ } else if (tooltipLeft + tooltipElementRect.width > window.innerWidth - tooltipConfig.tooltipOffsetFromViewport) {
390
+ tooltipLeft = window.innerWidth - tooltipConfig.tooltipOffsetFromViewport - tooltipElementRect.width
337
391
  }
338
392
 
339
393
  // Check if anchor element is directly on top of Tooltip
340
- if (anchorElementRect.left > tooltipLeft + tooltipElementRect.width - arrowMinOffsetFromTooltipCorner * 2
341
- || anchorElementRect.right < tooltipLeft + arrowMinOffsetFromTooltipCorner * 2) return false
394
+ if (anchorElementRect.left > tooltipLeft + tooltipElementRect.width - tooltipConfig.arrowMinOffsetFromTooltipCorner * 2
395
+ || anchorElementRect.right < tooltipLeft + tooltipConfig.arrowMinOffsetFromTooltipCorner * 2) return false
342
396
 
343
397
  // Set Tooltip position
344
398
  tooltipElement.style.top = `${tooltipTop}px`
@@ -347,13 +401,13 @@ function tryMountTooltipOnBottom(anchorElementRect: DOMRect) {
347
401
  return true
348
402
  }
349
403
 
350
- function drawArrow(anchorElementRect: DOMRect, currentTooltipPosition: TooltipPosition) {
404
+ function drawArrow(anchorElementRect: DOMRect, currentTooltipPosition: TooltipPosition, tooltipConfig: ReturnType<typeof getTooltipConfig>, tooltipElement: HTMLDivElement) {
351
405
  // Create Arrow element
352
406
  const arrowElement = document.createElement('div')
353
407
 
354
408
  // Calculate Arrow element size, positions and style/angle classes
355
409
  const tooltipElementRect = tooltipElement.getBoundingClientRect()
356
- const arrowHalfLengthOfLongSide = Math.sin(45 * (180 / Math.PI)) * arrowSize
410
+ const arrowHalfLengthOfLongSide = Math.sin(45 * (180 / Math.PI)) * tooltipConfig.arrowSize
357
411
 
358
412
  // Adjusts arrow position by `x` pixels to handle browsers sometimes not rendering border in it's full width, e.g., 4.8px instead of 5px
359
413
  const arrowPositionAdjuster = 1;
@@ -367,82 +421,82 @@ function drawArrow(anchorElementRect: DOMRect, currentTooltipPosition: TooltipPo
367
421
  switch (currentTooltipPosition) {
368
422
  case "left":
369
423
  arrowClassForCorrectAngle = '!zt-border-y-transparent !zt-border-r-transparent'
370
- arrowTop = anchorElementRect.top - tooltipElementRect.top + (anchorElementRect.height / 2) - arrowHalfLengthOfLongSide - tooltipBorderWidth
371
- arrowLeft = tooltipElementRect.width - tooltipBorderWidth - arrowPositionAdjuster
424
+ arrowTop = anchorElementRect.top - tooltipElementRect.top + (anchorElementRect.height / 2) - arrowHalfLengthOfLongSide - tooltipConfig.tooltipBorderWidth
425
+ arrowLeft = tooltipElementRect.width - tooltipConfig.tooltipBorderWidth - arrowPositionAdjuster
372
426
  break;
373
427
  case "top":
374
428
  arrowClassForCorrectAngle = '!zt-border-x-transparent !zt-border-b-transparent'
375
- arrowTop = tooltipElementRect.height - tooltipBorderWidth - arrowPositionAdjuster
376
- arrowLeft = anchorElementRect.left - tooltipElementRect.left + (anchorElementRect.width / 2) - arrowHalfLengthOfLongSide - tooltipBorderWidth
429
+ arrowTop = tooltipElementRect.height - tooltipConfig.tooltipBorderWidth - arrowPositionAdjuster
430
+ arrowLeft = anchorElementRect.left - tooltipElementRect.left + (anchorElementRect.width / 2) - arrowHalfLengthOfLongSide - tooltipConfig.tooltipBorderWidth
377
431
  break;
378
432
  case "right":
379
433
  arrowClassForCorrectAngle = '!zt-border-y-transparent !zt-border-l-transparent'
380
- arrowTop = anchorElementRect.top - tooltipElementRect.top + (anchorElementRect.height / 2) - arrowHalfLengthOfLongSide - tooltipBorderWidth
381
- arrowLeft = (-arrowSize * 2) - tooltipBorderWidth + arrowPositionAdjuster
434
+ arrowTop = anchorElementRect.top - tooltipElementRect.top + (anchorElementRect.height / 2) - arrowHalfLengthOfLongSide - tooltipConfig.tooltipBorderWidth
435
+ arrowLeft = (-tooltipConfig.arrowSize * 2) - tooltipConfig.tooltipBorderWidth + arrowPositionAdjuster
382
436
  break;
383
437
  case "bottom":
384
438
  arrowClassForCorrectAngle = '!zt-border-x-transparent !zt-border-t-transparent'
385
- arrowTop = (-arrowSize * 2) - tooltipBorderWidth + arrowPositionAdjuster
386
- arrowLeft = anchorElementRect.left - tooltipElementRect.left + (anchorElementRect.width / 2) - arrowHalfLengthOfLongSide - tooltipBorderWidth
439
+ arrowTop = (-tooltipConfig.arrowSize * 2) - tooltipConfig.tooltipBorderWidth + arrowPositionAdjuster
440
+ arrowLeft = anchorElementRect.left - tooltipElementRect.left + (anchorElementRect.width / 2) - arrowHalfLengthOfLongSide - tooltipConfig.tooltipBorderWidth
387
441
  break;
388
442
  }
389
443
 
390
444
  if (currentTooltipPosition === 'left' || currentTooltipPosition === 'right') {
391
- if (!isArrowPositionWithinLimits(currentTooltipPosition, tooltipElementRect, arrowTop)) {
392
- arrowTop = getArrowPositionMinLimit(currentTooltipPosition, tooltipElementRect, arrowTop)
445
+ if (!isArrowPositionWithinLimits(currentTooltipPosition, tooltipElementRect, arrowTop, tooltipConfig)) {
446
+ arrowTop = getArrowPositionMinLimit(currentTooltipPosition, tooltipElementRect, arrowTop, tooltipConfig)
393
447
  }
394
448
  } else {
395
- if (!isArrowPositionWithinLimits(currentTooltipPosition, tooltipElementRect, arrowLeft)) {
396
- arrowLeft = getArrowPositionMinLimit(currentTooltipPosition, tooltipElementRect, arrowLeft)
449
+ if (!isArrowPositionWithinLimits(currentTooltipPosition, tooltipElementRect, arrowLeft, tooltipConfig)) {
450
+ arrowLeft = getArrowPositionMinLimit(currentTooltipPosition, tooltipElementRect, arrowLeft, tooltipConfig)
397
451
  }
398
452
  }
399
453
 
400
454
  // Set Arrow element id, styling/angle
401
- const adjustedArrowClasses = arrowElementClass + ' ' + defaultArrowClasses + ' ' + arrowClassForCorrectAngle + ' ' + arrowClasses
455
+ const adjustedArrowClasses = arrowElementClass + ' ' + defaultArrowClasses + ' ' + arrowClassForCorrectAngle + ' ' + tooltipConfig.arrowClasses
402
456
 
403
457
  arrowElement.classList.add(...adjustedArrowClasses.trim().split(' '))
404
458
 
405
459
  // Set Arrow element size and position
406
460
  arrowElement.style.top = `${arrowTop}px`
407
461
  arrowElement.style.left = `${arrowLeft}px`
408
- arrowElement.style.borderWidth = `${arrowSize}px`
462
+ arrowElement.style.borderWidth = `${tooltipConfig.arrowSize}px`
409
463
 
410
464
  // Mount Arrow element
411
465
  document.querySelector(`.${tooltipElementClass}`)?.appendChild(arrowElement)
412
466
  }
413
467
 
414
- function isArrowPositionWithinLimits(currentTooltipPosition: TooltipPosition, tooltipElementRect: DOMRect, arrowPosition: number) {
468
+ function isArrowPositionWithinLimits(currentTooltipPosition: TooltipPosition, tooltipElementRect: DOMRect, arrowPosition: number, tooltipConfig: ReturnType<typeof getTooltipConfig>) {
415
469
  switch (currentTooltipPosition) {
416
470
  case "left":
417
471
  case "right":
418
- return arrowPosition > arrowMinOffsetFromTooltipCorner - tooltipBorderWidth
419
- && arrowPosition < tooltipElementRect.height + tooltipBorderWidth - arrowMinOffsetFromTooltipCorner - (arrowSize * 2)
472
+ return arrowPosition > tooltipConfig.arrowMinOffsetFromTooltipCorner - tooltipConfig.tooltipBorderWidth
473
+ && arrowPosition < tooltipElementRect.height + tooltipConfig.tooltipBorderWidth - tooltipConfig.arrowMinOffsetFromTooltipCorner - (tooltipConfig.arrowSize * 2)
420
474
  case "top":
421
475
  case "bottom":
422
- return arrowPosition > arrowMinOffsetFromTooltipCorner - tooltipBorderWidth
423
- && arrowPosition < tooltipElementRect.width + tooltipBorderWidth - arrowMinOffsetFromTooltipCorner - (arrowSize * 2)
476
+ return arrowPosition > tooltipConfig.arrowMinOffsetFromTooltipCorner - tooltipConfig.tooltipBorderWidth
477
+ && arrowPosition < tooltipElementRect.width + tooltipConfig.tooltipBorderWidth - tooltipConfig.arrowMinOffsetFromTooltipCorner - (tooltipConfig.arrowSize * 2)
424
478
  }
425
479
  }
426
480
 
427
- function getArrowPositionMinLimit(currentTooltipPosition: TooltipPosition, tooltipElementRect: DOMRect, arrowPosition: number) {
481
+ function getArrowPositionMinLimit(currentTooltipPosition: TooltipPosition, tooltipElementRect: DOMRect, arrowPosition: number, tooltipConfig: ReturnType<typeof getTooltipConfig>) {
428
482
  switch (currentTooltipPosition) {
429
483
  case "left":
430
484
  case "right":
431
- if (arrowPosition < arrowMinOffsetFromTooltipCorner - tooltipBorderWidth) {
485
+ if (arrowPosition < tooltipConfig.arrowMinOffsetFromTooltipCorner - tooltipConfig.tooltipBorderWidth) {
432
486
  // Arrow too close to viewport top
433
- return arrowMinOffsetFromTooltipCorner - tooltipBorderWidth
487
+ return tooltipConfig.arrowMinOffsetFromTooltipCorner - tooltipConfig.tooltipBorderWidth
434
488
  } else {
435
489
  // Arrow too close to viewport bottom
436
- return tooltipElementRect.height - tooltipBorderWidth - arrowMinOffsetFromTooltipCorner - (arrowSize * 2)
490
+ return tooltipElementRect.height - tooltipConfig.tooltipBorderWidth - tooltipConfig.arrowMinOffsetFromTooltipCorner - (tooltipConfig.arrowSize * 2)
437
491
  }
438
492
  case "top":
439
493
  case "bottom":
440
- if (arrowPosition < arrowMinOffsetFromTooltipCorner - tooltipBorderWidth) {
494
+ if (arrowPosition < tooltipConfig.arrowMinOffsetFromTooltipCorner - tooltipConfig.tooltipBorderWidth) {
441
495
  // Arrow too close to viewport left
442
- return arrowMinOffsetFromTooltipCorner - tooltipBorderWidth
496
+ return tooltipConfig.arrowMinOffsetFromTooltipCorner - tooltipConfig.tooltipBorderWidth
443
497
  } else {
444
498
  // Arrow too close to viewport right
445
- return tooltipElementRect.width - tooltipBorderWidth - arrowMinOffsetFromTooltipCorner - (arrowSize * 2)
499
+ return tooltipElementRect.width - tooltipConfig.tooltipBorderWidth - tooltipConfig.arrowMinOffsetFromTooltipCorner - (tooltipConfig.arrowSize * 2)
446
500
  }
447
501
  }
448
502
  }
@@ -462,8 +516,19 @@ function hideTooltip() {
462
516
 
463
517
  tooltipElement.remove()
464
518
  }
519
+ }
520
+
521
+ function destroyTooltip(tooltip: ReturnType<typeof initTooltip>) {
522
+ hideTooltip()
465
523
 
466
- isHovered = false
524
+ tooltip.mouseEnterEventController.abort()
525
+ tooltip.mouseLeaveEventController.abort()
526
+
527
+ const uuid = tooltip.tooltipElement.dataset.uuid
528
+
529
+ if (uuid) {
530
+ delete tooltips[uuid]
531
+ }
467
532
  }
468
533
 
469
534
  export default ZeroTooltip