zero-tooltip 1.0.4 → 1.0.6

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.
package/README.md CHANGED
@@ -101,7 +101,8 @@ const tooltipConfig: ZeroTooltipLocalConfig = {
101
101
  arrowSize: ... ,
102
102
  arrowClasses: ... ,
103
103
  arrowMinOffsetFromTooltipCorner: ... ,
104
- zIndex: ...
104
+ zIndex: ... ,
105
+ show: ...
105
106
  }
106
107
  </script>
107
108
  ```
@@ -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), j = {
16
+ randomUUID: it
17
+ };
18
+ function ot(e, t, r) {
19
+ if (j.randomUUID && !t && !e)
20
+ return j.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", q = "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, O = {}, 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
+ O[d] && B(O[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
+ O[d] && B(O[d]), V(r.value, e, r.arg, t, d);
91
+ }
92
+ },
93
+ beforeUnmount: () => {
94
+ for (let t of Object.values(O))
95
+ B(t);
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")), O[d] = o;
102
+ }
103
+ function ct(e, t, r) {
104
+ var a, L, H, $, A, f, I, U, _, k, D, P;
105
+ let s, d, i, o, p, u, w, m, x, c, 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) ?? ((f = t == null ? void 0 : t.positions) == null ? void 0 : f.right) ?? n.right,
110
+ bottom: ((I = e.positions) == null ? void 0 : I.bottom) ?? ((U = t == null ? void 0 : t.positions) == null ? void 0 : U.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) ?? ""), c = q + " " + 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: ((_ = t == null ? void 0 : t.positions) == null ? void 0 : _.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) ?? "")), c === void 0 && (c = q + " " + 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: c,
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 c;
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`, (c = document.querySelector(`.${y}`)) == null || c.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 O[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",f="zero-tooltip__arrow",c={left:["left","right","top","bottom"],top:["top","bottom","right","left"],right:["right","left","top","bottom"],bottom:["bottom","top","right","left"]},$="top",A=10,I=20,U=100,_=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",j=5,nt="zt-absolute zt-border-solid zt-border-[#495057]",q=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:()=>{for(let t of Object.values(O))a(t)}});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)??$,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)??I,u=e.minWidth??(t==null?void 0:t.minWidth)??U,w=e.maxWidth??(t==null?void 0:t.maxWidth)??_,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)??j,y=e.arrowClasses??(t==null?void 0:t.arrowClasses)??"",M=e.arrowMinOffsetFromTooltipCorner??(t==null?void 0:t.arrowMinOffsetFromTooltipCorner)??q,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)??$),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)??I),u===void 0&&(u=(t==null?void 0:t.minWidth)??U),w===void 0&&(w=(t==null?void 0:t.maxWidth)??_),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)??j),y===void 0&&(y=(t==null?void 0:t.arrowClasses)??""),M===void 0&&(M=(t==null?void 0:t.arrowMinOffsetFromTooltipCorner)??q),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=f+" "+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(`.${f}`))==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
@@ -9,6 +9,10 @@
9
9
  "import": "./dist/zero-tooltip.js",
10
10
  "require": "./dist/zero-tooltip.umd.cjs",
11
11
  "types": "./dist/index.d.ts"
12
+ },
13
+ "./dist/styles.css": {
14
+ "import": "./dist/styles.css",
15
+ "require": "./dist/styles.css"
12
16
  }
13
17
  },
14
18
  "./package.json": "./package.json",
@@ -16,7 +20,7 @@
16
20
  "dist",
17
21
  "src"
18
22
  ],
19
- "version": "1.0.4",
23
+ "version": "1.0.6",
20
24
  "type": "module",
21
25
  "scripts": {
22
26
  "dev": "vite",
@@ -53,5 +57,9 @@
53
57
  "bugs": {
54
58
  "url": "https://github.com/TheAliter/zero-tooltip/issues"
55
59
  },
56
- "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
+ }
57
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,76 @@ 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: () => {
74
+ for (let tooltip of Object.values(tooltips)) {
75
+ destroyTooltip(tooltip)
81
76
  }
82
77
  }
83
78
  }
84
79
  }
85
80
 
86
- function setTooltipConfig(localConfig: string | TooltipLocalConfig, globalConfig?: TooltipConfig, position?: TooltipPosition) {
81
+ function buildTooltip(bindingValue: any, globalConfig: TooltipConfig | undefined, bindingArgument: string | undefined, targetElement: HTMLElement, uuid: string) {
82
+ let tooltipConfig = getTooltipConfig(bindingValue as string | TooltipLocalConfig, globalConfig, bindingArgument as TooltipPosition)
83
+ const tooltip = initTooltip(targetElement, tooltipConfig, uuid)
84
+
85
+ if (targetElement.matches(':hover')) {
86
+ targetElement.dispatchEvent(new Event('mouseenter'))
87
+ }
88
+
89
+ tooltips[uuid] = tooltip
90
+ }
91
+
92
+ function getTooltipConfig(localConfig: string | TooltipLocalConfig, globalConfig?: TooltipConfig, position?: TooltipPosition) {
93
+ // Tooltip config
94
+ let tooltipText: string | undefined
95
+ let tooltipPosition: TooltipPosition | undefined
96
+ let tooltipPositions: TooltipPositions | undefined
97
+ let tooltipOffsetFromSource: number | undefined
98
+ let tooltipOffsetFromViewport: number | undefined
99
+ let tooltipMinWidth: number | undefined
100
+ let tooltipMaxWidth: number | undefined
101
+ let tooltipBorderWidth: number | undefined
102
+ let tooltipClasses: string | undefined
103
+ let textClasses: string | undefined
104
+ let arrowSize: number | undefined
105
+ let arrowClasses: string | undefined
106
+ let arrowMinOffsetFromTooltipCorner: number | undefined
107
+ let zIndex: number | undefined
108
+ let shouldShow: boolean | undefined
109
+
87
110
  tooltipText = getTooltipText(localConfig)
88
111
 
89
112
  if (typeof(localConfig) !== 'string') {
@@ -120,13 +143,31 @@ function setTooltipConfig(localConfig: string | TooltipLocalConfig, globalConfig
120
143
  if (tooltipMinWidth === undefined) tooltipMinWidth = globalConfig?.minWidth ?? defaultTooltipMinWidth
121
144
  if (tooltipMaxWidth === undefined) tooltipMaxWidth = globalConfig?.maxWidth ?? defaultTooltipMaxWidth
122
145
  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 ?? ''
146
+ if (tooltipClasses === undefined) tooltipClasses = tooltipElementClass + ' ' + defaultTooltipClasses + ' ' + (globalConfig?.tooltipClasses ?? '')
147
+ if (textClasses === undefined) textClasses = textElementClass + ' ' + defaultTextClasses + ' ' + (globalConfig?.textClasses ?? '')
125
148
  if (arrowSize === undefined) arrowSize = globalConfig?.arrowSize ?? defaultArrowSize
126
149
  if (arrowClasses === undefined) arrowClasses = globalConfig?.arrowClasses ?? ''
127
150
  if (arrowMinOffsetFromTooltipCorner === undefined) arrowMinOffsetFromTooltipCorner = globalConfig?.arrowMinOffsetFromTooltipCorner ?? defaultMinArrowOffsetFromTooltipCorner
128
151
  if (zIndex === undefined) zIndex = globalConfig?.zIndex ?? defaultZIndex
129
152
  if (shouldShow === undefined) shouldShow = defaultShouldShow
153
+
154
+ return {
155
+ tooltipText,
156
+ tooltipPosition,
157
+ tooltipPositions,
158
+ tooltipOffsetFromSource,
159
+ tooltipOffsetFromViewport,
160
+ tooltipMinWidth,
161
+ tooltipMaxWidth,
162
+ tooltipBorderWidth,
163
+ tooltipClasses,
164
+ textClasses,
165
+ arrowSize,
166
+ arrowClasses,
167
+ arrowMinOffsetFromTooltipCorner,
168
+ zIndex,
169
+ shouldShow
170
+ }
130
171
  }
131
172
 
132
173
  function getTooltipText(localConfig: string | TooltipLocalConfig) {
@@ -139,40 +180,51 @@ function getTooltipText(localConfig: string | TooltipLocalConfig) {
139
180
  return tooltipText
140
181
  }
141
182
 
142
- function initTooltip(targetElement: HTMLElement) {
143
- anchorElement = targetElement
144
- anchorElement.removeEventListener('mouseenter', onMouseEnter)
145
- anchorElement.removeEventListener('mouseleave', onMouseLeave)
183
+ function initTooltip(targetElement: HTMLElement, tooltipConfig: ReturnType<typeof getTooltipConfig>, uuid: string) {
184
+ let anchorElement = targetElement
146
185
 
147
- createTextElement()
148
- createTooltipElement()
186
+ let tooltipTextElement = createTextElement(tooltipConfig.textClasses, tooltipConfig.tooltipText)
187
+ let tooltipElement = createTooltipElement(tooltipConfig.tooltipClasses, tooltipConfig.tooltipBorderWidth)
188
+ tooltipElement.append(tooltipTextElement)
189
+ tooltipElement.dataset.uuid = uuid
149
190
 
150
- anchorElement.addEventListener('mouseenter', onMouseEnter)
151
- anchorElement.addEventListener('mouseleave', onMouseLeave)
191
+ const mouseEnterEventController = new AbortController()
192
+ const mouseLeaveEventController = new AbortController()
152
193
 
153
- if (isHovered) {
154
- anchorElement.dispatchEvent(new Event('mouseleave'))
155
- anchorElement.dispatchEvent(new Event('mouseenter'))
194
+ anchorElement.addEventListener('mouseenter', () => onMouseEnter(anchorElement, tooltipConfig, tooltipElement), { signal: mouseEnterEventController.signal})
195
+ anchorElement.addEventListener('mouseleave', onMouseLeave, { signal: mouseLeaveEventController.signal})
196
+
197
+ return {
198
+ anchorElement,
199
+ tooltipConfig,
200
+ tooltipElement,
201
+ mouseEnterEventController,
202
+ mouseLeaveEventController
156
203
  }
157
204
  }
158
205
 
159
- function createTextElement() {
160
- tooltipTextElement = document.createElement('p')
206
+ function createTextElement(textClasses: string, tooltipText: string) {
207
+ let tooltipTextElement = document.createElement('p')
161
208
  tooltipTextElement.classList.add(...textClasses.trim().split(' '))
162
209
  tooltipTextElement.innerHTML = tooltipText
210
+
211
+ return tooltipTextElement
163
212
  }
164
213
 
165
- function createTooltipElement() {
166
- tooltipElement = document.createElement('div')
214
+ function createTooltipElement(tooltipClasses: string, tooltipBorderWidth: number) {
215
+ let tooltipElement = document.createElement('div')
167
216
  tooltipElement.classList.add(...tooltipClasses.trim().split(' '))
168
217
  tooltipElement.style.borderWidth = `${tooltipBorderWidth}px`
169
- tooltipElement.appendChild(tooltipTextElement)
170
- }
171
218
 
172
- function onMouseEnter() {
173
- isHovered = true
219
+ return tooltipElement
220
+ }
174
221
 
175
- if (!shouldShow) return
222
+ function onMouseEnter(
223
+ anchorElement: HTMLElement,
224
+ tooltipConfig: ReturnType<typeof getTooltipConfig>,
225
+ tooltipElement: HTMLDivElement
226
+ ) {
227
+ if (!tooltipConfig.shouldShow) return
176
228
 
177
229
  const anchorElementRect = anchorElement.getBoundingClientRect()
178
230
 
@@ -182,28 +234,28 @@ function onMouseEnter() {
182
234
 
183
235
  // Find suitable Tooltip position
184
236
  let hasNeededDisplaySpace = false
185
- let currentTooltipPosition = tooltipPosition
237
+ let currentTooltipPosition = tooltipConfig.tooltipPosition
186
238
  for (let i = 0; i < 4; i++) {
187
- currentTooltipPosition = tooltipPositions[tooltipPosition][i]
239
+ currentTooltipPosition = tooltipConfig.tooltipPositions[tooltipConfig.tooltipPosition][i]
188
240
 
189
241
  if (currentTooltipPosition === 'left') {
190
- hasNeededDisplaySpace = tryMountTooltipOnLeft(anchorElementRect)
242
+ hasNeededDisplaySpace = tryMountTooltipOnLeft(anchorElementRect, tooltipConfig, tooltipElement)
191
243
  } else if (currentTooltipPosition === 'top') {
192
- hasNeededDisplaySpace = tryMountTooltipOnTop(anchorElementRect)
244
+ hasNeededDisplaySpace = tryMountTooltipOnTop(anchorElementRect, tooltipConfig, tooltipElement)
193
245
  } else if (currentTooltipPosition === 'right') {
194
- hasNeededDisplaySpace = tryMountTooltipOnRight(anchorElementRect)
246
+ hasNeededDisplaySpace = tryMountTooltipOnRight(anchorElementRect, tooltipConfig, tooltipElement)
195
247
  } else if (currentTooltipPosition === 'bottom') {
196
- hasNeededDisplaySpace = tryMountTooltipOnBottom(anchorElementRect)
248
+ hasNeededDisplaySpace = tryMountTooltipOnBottom(anchorElementRect, tooltipConfig, tooltipElement)
197
249
  }
198
250
 
199
251
  if (hasNeededDisplaySpace) break
200
252
  }
201
253
 
202
254
  if (hasNeededDisplaySpace) {
203
- drawArrow(anchorElementRect, currentTooltipPosition)
255
+ drawArrow(anchorElementRect, currentTooltipPosition, tooltipConfig, tooltipElement)
204
256
 
205
257
  tooltipElement.style.opacity = '1'
206
- tooltipElement.style.zIndex = zIndex.toString()
258
+ tooltipElement.style.zIndex = tooltipConfig.zIndex.toString()
207
259
 
208
260
  handleHideOnScroll(anchorElement, () => hideTooltip())
209
261
  handleHideOnResize(anchorElement, () => hideTooltip())
@@ -214,13 +266,13 @@ function onMouseLeave() {
214
266
  hideTooltip()
215
267
  }
216
268
 
217
- function tryMountTooltipOnLeft(anchorElementRect: DOMRect) {
269
+ function tryMountTooltipOnLeft(anchorElementRect: DOMRect, tooltipConfig: ReturnType<typeof getTooltipConfig>, tooltipElement: HTMLDivElement) {
218
270
  // 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
271
+ const tooltipAvailableMaxWidth = Math.min(anchorElementRect.left - tooltipConfig.tooltipOffsetFromSource - tooltipConfig.tooltipOffsetFromViewport, tooltipConfig.tooltipMaxWidth)
272
+ const isAnchorElementTopLowerThanOffsetFromViewport = anchorElementRect.top >= tooltipConfig.tooltipOffsetFromViewport
273
+ const isAnchorElementBottomHigherThanOffsetFromViewport = (window.innerHeight - anchorElementRect.bottom) >= tooltipConfig.tooltipOffsetFromViewport
222
274
 
223
- if (tooltipAvailableMaxWidth < tooltipMinWidth || !isAnchorElementTopLowerThanOffsetFromViewport || !isAnchorElementBottomHigherThanOffsetFromViewport) return false
275
+ if (tooltipAvailableMaxWidth < tooltipConfig.tooltipMinWidth || !isAnchorElementTopLowerThanOffsetFromViewport || !isAnchorElementBottomHigherThanOffsetFromViewport) return false
224
276
 
225
277
  // Set Tooltip maxWidth
226
278
  tooltipElement.style.maxWidth = `${tooltipAvailableMaxWidth}px`
@@ -229,17 +281,17 @@ function tryMountTooltipOnLeft(anchorElementRect: DOMRect) {
229
281
  const tooltipElementRect = tooltipElement.getBoundingClientRect()
230
282
  let tooltipTop = anchorElementRect.top + (anchorElementRect.height / 2) - (tooltipElementRect.height / 2)
231
283
 
232
- if (tooltipTop < tooltipOffsetFromViewport) {
233
- tooltipTop = tooltipOffsetFromViewport
234
- } else if (tooltipTop + tooltipElementRect.height > window.innerHeight - tooltipOffsetFromViewport) {
235
- tooltipTop = window.innerHeight - tooltipOffsetFromViewport - tooltipElementRect.height
284
+ if (tooltipTop < tooltipConfig.tooltipOffsetFromViewport) {
285
+ tooltipTop = tooltipConfig.tooltipOffsetFromViewport
286
+ } else if (tooltipTop + tooltipElementRect.height > window.innerHeight - tooltipConfig.tooltipOffsetFromViewport) {
287
+ tooltipTop = window.innerHeight - tooltipConfig.tooltipOffsetFromViewport - tooltipElementRect.height
236
288
  }
237
289
 
238
- const tooltipLeft = anchorElementRect.left - tooltipOffsetFromSource - tooltipElementRect.width
290
+ const tooltipLeft = anchorElementRect.left - tooltipConfig.tooltipOffsetFromSource - tooltipElementRect.width
239
291
 
240
292
  // 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
293
+ if (anchorElementRect.bottom < tooltipTop + tooltipConfig.arrowMinOffsetFromTooltipCorner * 2
294
+ || anchorElementRect.top > tooltipTop + tooltipElementRect.height - tooltipConfig.arrowMinOffsetFromTooltipCorner * 2) return false
243
295
 
244
296
  // Set Tooltip position
245
297
  tooltipElement.style.top = `${tooltipTop}px`
@@ -248,13 +300,13 @@ function tryMountTooltipOnLeft(anchorElementRect: DOMRect) {
248
300
  return true
249
301
  }
250
302
 
251
- function tryMountTooltipOnRight(anchorElementRect: DOMRect) {
303
+ function tryMountTooltipOnRight(anchorElementRect: DOMRect, tooltipConfig: ReturnType<typeof getTooltipConfig>, tooltipElement: HTMLDivElement) {
252
304
  // 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
305
+ const tooltipAvailableMaxWidth = Math.min(window.innerWidth - (anchorElementRect.right + tooltipConfig.tooltipOffsetFromSource) - tooltipConfig.tooltipOffsetFromViewport, tooltipConfig.tooltipMaxWidth)
306
+ const isAnchorElementTopLowerThanOffsetFromViewport = anchorElementRect.top >= tooltipConfig.tooltipOffsetFromViewport
307
+ const isAnchorElementBottomHigherThanOffsetFromViewport = (window.innerHeight - anchorElementRect.bottom) >= tooltipConfig.tooltipOffsetFromViewport
256
308
 
257
- if (tooltipAvailableMaxWidth < tooltipMinWidth || !isAnchorElementTopLowerThanOffsetFromViewport || !isAnchorElementBottomHigherThanOffsetFromViewport) return false
309
+ if (tooltipAvailableMaxWidth < tooltipConfig.tooltipMinWidth || !isAnchorElementTopLowerThanOffsetFromViewport || !isAnchorElementBottomHigherThanOffsetFromViewport) return false
258
310
 
259
311
  // Set tooltip maxWidth
260
312
  tooltipElement.style.maxWidth = `${tooltipAvailableMaxWidth}px`
@@ -264,17 +316,17 @@ function tryMountTooltipOnRight(anchorElementRect: DOMRect) {
264
316
 
265
317
  let tooltipTop = anchorElementRect.top + (anchorElementRect.height / 2) - (tooltipElementRect.height / 2)
266
318
 
267
- if (tooltipTop < tooltipOffsetFromViewport) {
268
- tooltipTop = tooltipOffsetFromViewport
269
- } else if (tooltipTop + tooltipElementRect.height > window.innerHeight - tooltipOffsetFromViewport) {
270
- tooltipTop = window.innerHeight - tooltipOffsetFromViewport - tooltipElementRect.height
319
+ if (tooltipTop < tooltipConfig.tooltipOffsetFromViewport) {
320
+ tooltipTop = tooltipConfig.tooltipOffsetFromViewport
321
+ } else if (tooltipTop + tooltipElementRect.height > window.innerHeight - tooltipConfig.tooltipOffsetFromViewport) {
322
+ tooltipTop = window.innerHeight - tooltipConfig.tooltipOffsetFromViewport - tooltipElementRect.height
271
323
  }
272
324
 
273
- const tooltipLeft = anchorElementRect.right + tooltipOffsetFromSource
325
+ const tooltipLeft = anchorElementRect.right + tooltipConfig.tooltipOffsetFromSource
274
326
 
275
327
  // 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
328
+ if (anchorElementRect.bottom < tooltipTop + tooltipConfig.arrowMinOffsetFromTooltipCorner * 2
329
+ || anchorElementRect.top > tooltipTop + tooltipElementRect.height - tooltipConfig.arrowMinOffsetFromTooltipCorner * 2) return false
278
330
 
279
331
  // Set Tooltip position
280
332
  tooltipElement.style.top = `${tooltipTop}px`
@@ -283,30 +335,30 @@ function tryMountTooltipOnRight(anchorElementRect: DOMRect) {
283
335
  return true
284
336
  }
285
337
 
286
- function tryMountTooltipOnTop(anchorElementRect: DOMRect) {
338
+ function tryMountTooltipOnTop(anchorElementRect: DOMRect, tooltipConfig: ReturnType<typeof getTooltipConfig>, tooltipElement: HTMLDivElement) {
287
339
  // Calculate and set Tooltip width
288
- const tooltipAvailableMaxWidth = Math.min(window.innerWidth - (tooltipOffsetFromViewport * 2), tooltipMaxWidth)
340
+ const tooltipAvailableMaxWidth = Math.min(window.innerWidth - (tooltipConfig.tooltipOffsetFromViewport * 2), tooltipConfig.tooltipMaxWidth)
289
341
  tooltipElement.style.maxWidth = `${tooltipAvailableMaxWidth}px`
290
342
 
291
343
  // Calculate Tooltip top position
292
344
  const tooltipElementRect = tooltipElement.getBoundingClientRect()
293
- let tooltipTop = anchorElementRect.top - tooltipOffsetFromSource - tooltipElementRect.height
345
+ let tooltipTop = anchorElementRect.top - tooltipConfig.tooltipOffsetFromSource - tooltipElementRect.height
294
346
 
295
347
  // Check if Tooltip has enough available on top
296
- if (tooltipTop < tooltipOffsetFromViewport) return false
348
+ if (tooltipTop < tooltipConfig.tooltipOffsetFromViewport) return false
297
349
 
298
350
  // Calculate Tooltip left position
299
351
  let tooltipLeft = anchorElementRect.left + (anchorElementRect.width / 2) - (tooltipElementRect.width / 2)
300
352
 
301
- if (tooltipLeft < tooltipOffsetFromViewport) {
302
- tooltipLeft = tooltipOffsetFromViewport
303
- } else if (tooltipLeft + tooltipElementRect.width > window.innerWidth - tooltipOffsetFromViewport) {
304
- tooltipLeft = window.innerWidth - tooltipOffsetFromViewport - tooltipElementRect.width
353
+ if (tooltipLeft < tooltipConfig.tooltipOffsetFromViewport) {
354
+ tooltipLeft = tooltipConfig.tooltipOffsetFromViewport
355
+ } else if (tooltipLeft + tooltipElementRect.width > window.innerWidth - tooltipConfig.tooltipOffsetFromViewport) {
356
+ tooltipLeft = window.innerWidth - tooltipConfig.tooltipOffsetFromViewport - tooltipElementRect.width
305
357
  }
306
358
 
307
359
  // 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
360
+ if (anchorElementRect.left > tooltipLeft + tooltipElementRect.width - tooltipConfig.arrowMinOffsetFromTooltipCorner * 2
361
+ || anchorElementRect.right < tooltipLeft + tooltipConfig.arrowMinOffsetFromTooltipCorner * 2) return false
310
362
 
311
363
  // Set Tooltip position
312
364
  tooltipElement.style.top = `${tooltipTop}px`
@@ -315,30 +367,30 @@ function tryMountTooltipOnTop(anchorElementRect: DOMRect) {
315
367
  return true
316
368
  }
317
369
 
318
- function tryMountTooltipOnBottom(anchorElementRect: DOMRect) {
370
+ function tryMountTooltipOnBottom(anchorElementRect: DOMRect, tooltipConfig: ReturnType<typeof getTooltipConfig>, tooltipElement: HTMLDivElement) {
319
371
  // Calculate and set Tooltip width
320
- const tooltipAvailableMaxWidth = Math.min(window.innerWidth - (tooltipOffsetFromViewport * 2), tooltipMaxWidth)
372
+ const tooltipAvailableMaxWidth = Math.min(window.innerWidth - (tooltipConfig.tooltipOffsetFromViewport * 2), tooltipConfig.tooltipMaxWidth)
321
373
  tooltipElement.style.maxWidth = `${tooltipAvailableMaxWidth}px`
322
374
 
323
375
  // Calculate Tooltip top position
324
376
  const tooltipElementRect = tooltipElement.getBoundingClientRect()
325
- let tooltipTop = anchorElementRect.bottom + tooltipOffsetFromSource
377
+ let tooltipTop = anchorElementRect.bottom + tooltipConfig.tooltipOffsetFromSource
326
378
 
327
379
  // Check if Tooltip has enough available on bottom
328
- if (tooltipTop + tooltipElementRect.height > window.innerHeight - tooltipOffsetFromViewport) return false
380
+ if (tooltipTop + tooltipElementRect.height > window.innerHeight - tooltipConfig.tooltipOffsetFromViewport) return false
329
381
 
330
382
  // Calculate Tooltip left position
331
383
  let tooltipLeft = anchorElementRect.left + (anchorElementRect.width / 2) - (tooltipElementRect.width / 2)
332
384
 
333
- if (tooltipLeft < tooltipOffsetFromViewport) {
334
- tooltipLeft = tooltipOffsetFromViewport
335
- } else if (tooltipLeft + tooltipElementRect.width > window.innerWidth - tooltipOffsetFromViewport) {
336
- tooltipLeft = window.innerWidth - tooltipOffsetFromViewport - tooltipElementRect.width
385
+ if (tooltipLeft < tooltipConfig.tooltipOffsetFromViewport) {
386
+ tooltipLeft = tooltipConfig.tooltipOffsetFromViewport
387
+ } else if (tooltipLeft + tooltipElementRect.width > window.innerWidth - tooltipConfig.tooltipOffsetFromViewport) {
388
+ tooltipLeft = window.innerWidth - tooltipConfig.tooltipOffsetFromViewport - tooltipElementRect.width
337
389
  }
338
390
 
339
391
  // 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
392
+ if (anchorElementRect.left > tooltipLeft + tooltipElementRect.width - tooltipConfig.arrowMinOffsetFromTooltipCorner * 2
393
+ || anchorElementRect.right < tooltipLeft + tooltipConfig.arrowMinOffsetFromTooltipCorner * 2) return false
342
394
 
343
395
  // Set Tooltip position
344
396
  tooltipElement.style.top = `${tooltipTop}px`
@@ -347,13 +399,13 @@ function tryMountTooltipOnBottom(anchorElementRect: DOMRect) {
347
399
  return true
348
400
  }
349
401
 
350
- function drawArrow(anchorElementRect: DOMRect, currentTooltipPosition: TooltipPosition) {
402
+ function drawArrow(anchorElementRect: DOMRect, currentTooltipPosition: TooltipPosition, tooltipConfig: ReturnType<typeof getTooltipConfig>, tooltipElement: HTMLDivElement) {
351
403
  // Create Arrow element
352
404
  const arrowElement = document.createElement('div')
353
405
 
354
406
  // Calculate Arrow element size, positions and style/angle classes
355
407
  const tooltipElementRect = tooltipElement.getBoundingClientRect()
356
- const arrowHalfLengthOfLongSide = Math.sin(45 * (180 / Math.PI)) * arrowSize
408
+ const arrowHalfLengthOfLongSide = Math.sin(45 * (180 / Math.PI)) * tooltipConfig.arrowSize
357
409
 
358
410
  // 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
411
  const arrowPositionAdjuster = 1;
@@ -367,82 +419,82 @@ function drawArrow(anchorElementRect: DOMRect, currentTooltipPosition: TooltipPo
367
419
  switch (currentTooltipPosition) {
368
420
  case "left":
369
421
  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
422
+ arrowTop = anchorElementRect.top - tooltipElementRect.top + (anchorElementRect.height / 2) - arrowHalfLengthOfLongSide - tooltipConfig.tooltipBorderWidth
423
+ arrowLeft = tooltipElementRect.width - tooltipConfig.tooltipBorderWidth - arrowPositionAdjuster
372
424
  break;
373
425
  case "top":
374
426
  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
427
+ arrowTop = tooltipElementRect.height - tooltipConfig.tooltipBorderWidth - arrowPositionAdjuster
428
+ arrowLeft = anchorElementRect.left - tooltipElementRect.left + (anchorElementRect.width / 2) - arrowHalfLengthOfLongSide - tooltipConfig.tooltipBorderWidth
377
429
  break;
378
430
  case "right":
379
431
  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
432
+ arrowTop = anchorElementRect.top - tooltipElementRect.top + (anchorElementRect.height / 2) - arrowHalfLengthOfLongSide - tooltipConfig.tooltipBorderWidth
433
+ arrowLeft = (-tooltipConfig.arrowSize * 2) - tooltipConfig.tooltipBorderWidth + arrowPositionAdjuster
382
434
  break;
383
435
  case "bottom":
384
436
  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
437
+ arrowTop = (-tooltipConfig.arrowSize * 2) - tooltipConfig.tooltipBorderWidth + arrowPositionAdjuster
438
+ arrowLeft = anchorElementRect.left - tooltipElementRect.left + (anchorElementRect.width / 2) - arrowHalfLengthOfLongSide - tooltipConfig.tooltipBorderWidth
387
439
  break;
388
440
  }
389
441
 
390
442
  if (currentTooltipPosition === 'left' || currentTooltipPosition === 'right') {
391
- if (!isArrowPositionWithinLimits(currentTooltipPosition, tooltipElementRect, arrowTop)) {
392
- arrowTop = getArrowPositionMinLimit(currentTooltipPosition, tooltipElementRect, arrowTop)
443
+ if (!isArrowPositionWithinLimits(currentTooltipPosition, tooltipElementRect, arrowTop, tooltipConfig)) {
444
+ arrowTop = getArrowPositionMinLimit(currentTooltipPosition, tooltipElementRect, arrowTop, tooltipConfig)
393
445
  }
394
446
  } else {
395
- if (!isArrowPositionWithinLimits(currentTooltipPosition, tooltipElementRect, arrowLeft)) {
396
- arrowLeft = getArrowPositionMinLimit(currentTooltipPosition, tooltipElementRect, arrowLeft)
447
+ if (!isArrowPositionWithinLimits(currentTooltipPosition, tooltipElementRect, arrowLeft, tooltipConfig)) {
448
+ arrowLeft = getArrowPositionMinLimit(currentTooltipPosition, tooltipElementRect, arrowLeft, tooltipConfig)
397
449
  }
398
450
  }
399
451
 
400
452
  // Set Arrow element id, styling/angle
401
- const adjustedArrowClasses = arrowElementClass + ' ' + defaultArrowClasses + ' ' + arrowClassForCorrectAngle + ' ' + arrowClasses
453
+ const adjustedArrowClasses = arrowElementClass + ' ' + defaultArrowClasses + ' ' + arrowClassForCorrectAngle + ' ' + tooltipConfig.arrowClasses
402
454
 
403
455
  arrowElement.classList.add(...adjustedArrowClasses.trim().split(' '))
404
456
 
405
457
  // Set Arrow element size and position
406
458
  arrowElement.style.top = `${arrowTop}px`
407
459
  arrowElement.style.left = `${arrowLeft}px`
408
- arrowElement.style.borderWidth = `${arrowSize}px`
460
+ arrowElement.style.borderWidth = `${tooltipConfig.arrowSize}px`
409
461
 
410
462
  // Mount Arrow element
411
463
  document.querySelector(`.${tooltipElementClass}`)?.appendChild(arrowElement)
412
464
  }
413
465
 
414
- function isArrowPositionWithinLimits(currentTooltipPosition: TooltipPosition, tooltipElementRect: DOMRect, arrowPosition: number) {
466
+ function isArrowPositionWithinLimits(currentTooltipPosition: TooltipPosition, tooltipElementRect: DOMRect, arrowPosition: number, tooltipConfig: ReturnType<typeof getTooltipConfig>) {
415
467
  switch (currentTooltipPosition) {
416
468
  case "left":
417
469
  case "right":
418
- return arrowPosition > arrowMinOffsetFromTooltipCorner - tooltipBorderWidth
419
- && arrowPosition < tooltipElementRect.height + tooltipBorderWidth - arrowMinOffsetFromTooltipCorner - (arrowSize * 2)
470
+ return arrowPosition > tooltipConfig.arrowMinOffsetFromTooltipCorner - tooltipConfig.tooltipBorderWidth
471
+ && arrowPosition < tooltipElementRect.height + tooltipConfig.tooltipBorderWidth - tooltipConfig.arrowMinOffsetFromTooltipCorner - (tooltipConfig.arrowSize * 2)
420
472
  case "top":
421
473
  case "bottom":
422
- return arrowPosition > arrowMinOffsetFromTooltipCorner - tooltipBorderWidth
423
- && arrowPosition < tooltipElementRect.width + tooltipBorderWidth - arrowMinOffsetFromTooltipCorner - (arrowSize * 2)
474
+ return arrowPosition > tooltipConfig.arrowMinOffsetFromTooltipCorner - tooltipConfig.tooltipBorderWidth
475
+ && arrowPosition < tooltipElementRect.width + tooltipConfig.tooltipBorderWidth - tooltipConfig.arrowMinOffsetFromTooltipCorner - (tooltipConfig.arrowSize * 2)
424
476
  }
425
477
  }
426
478
 
427
- function getArrowPositionMinLimit(currentTooltipPosition: TooltipPosition, tooltipElementRect: DOMRect, arrowPosition: number) {
479
+ function getArrowPositionMinLimit(currentTooltipPosition: TooltipPosition, tooltipElementRect: DOMRect, arrowPosition: number, tooltipConfig: ReturnType<typeof getTooltipConfig>) {
428
480
  switch (currentTooltipPosition) {
429
481
  case "left":
430
482
  case "right":
431
- if (arrowPosition < arrowMinOffsetFromTooltipCorner - tooltipBorderWidth) {
483
+ if (arrowPosition < tooltipConfig.arrowMinOffsetFromTooltipCorner - tooltipConfig.tooltipBorderWidth) {
432
484
  // Arrow too close to viewport top
433
- return arrowMinOffsetFromTooltipCorner - tooltipBorderWidth
485
+ return tooltipConfig.arrowMinOffsetFromTooltipCorner - tooltipConfig.tooltipBorderWidth
434
486
  } else {
435
487
  // Arrow too close to viewport bottom
436
- return tooltipElementRect.height - tooltipBorderWidth - arrowMinOffsetFromTooltipCorner - (arrowSize * 2)
488
+ return tooltipElementRect.height - tooltipConfig.tooltipBorderWidth - tooltipConfig.arrowMinOffsetFromTooltipCorner - (tooltipConfig.arrowSize * 2)
437
489
  }
438
490
  case "top":
439
491
  case "bottom":
440
- if (arrowPosition < arrowMinOffsetFromTooltipCorner - tooltipBorderWidth) {
492
+ if (arrowPosition < tooltipConfig.arrowMinOffsetFromTooltipCorner - tooltipConfig.tooltipBorderWidth) {
441
493
  // Arrow too close to viewport left
442
- return arrowMinOffsetFromTooltipCorner - tooltipBorderWidth
494
+ return tooltipConfig.arrowMinOffsetFromTooltipCorner - tooltipConfig.tooltipBorderWidth
443
495
  } else {
444
496
  // Arrow too close to viewport right
445
- return tooltipElementRect.width - tooltipBorderWidth - arrowMinOffsetFromTooltipCorner - (arrowSize * 2)
497
+ return tooltipElementRect.width - tooltipConfig.tooltipBorderWidth - tooltipConfig.arrowMinOffsetFromTooltipCorner - (tooltipConfig.arrowSize * 2)
446
498
  }
447
499
  }
448
500
  }
@@ -462,8 +514,19 @@ function hideTooltip() {
462
514
 
463
515
  tooltipElement.remove()
464
516
  }
517
+ }
518
+
519
+ function destroyTooltip(tooltip: ReturnType<typeof initTooltip>) {
520
+ hideTooltip()
465
521
 
466
- isHovered = false
522
+ tooltip.mouseEnterEventController.abort()
523
+ tooltip.mouseLeaveEventController.abort()
524
+
525
+ const uuid = tooltip.tooltipElement.dataset.uuid
526
+
527
+ if (uuid) {
528
+ delete tooltips[uuid]
529
+ }
467
530
  }
468
531
 
469
532
  export default ZeroTooltip