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.
- package/dist/zero-tooltip.js +192 -119
- package/dist/zero-tooltip.umd.cjs +1 -1
- package/package.json +6 -2
- package/src/tooltip.ts +200 -135
package/dist/zero-tooltip.js
CHANGED
|
@@ -1,196 +1,269 @@
|
|
|
1
|
-
import { watch as
|
|
2
|
-
|
|
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 = (
|
|
5
|
-
if (r(
|
|
6
|
-
for (const
|
|
7
|
-
|
|
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(),
|
|
38
|
+
i(), s(i);
|
|
10
39
|
});
|
|
11
|
-
}, r = (
|
|
12
|
-
let i =
|
|
40
|
+
}, r = (d) => {
|
|
41
|
+
let i = d;
|
|
13
42
|
for (; i !== null && i.tagName !== "HTML"; ) {
|
|
14
43
|
if (i.scrollHeight !== i.clientHeight) {
|
|
15
|
-
const
|
|
16
|
-
(
|
|
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
|
-
},
|
|
49
|
+
}, s = (d) => {
|
|
21
50
|
if (e.length > 0) {
|
|
22
51
|
for (const i of e)
|
|
23
|
-
i.removeEventListener("scroll",
|
|
52
|
+
i.removeEventListener("scroll", d);
|
|
24
53
|
e = [];
|
|
25
54
|
}
|
|
26
|
-
window.removeEventListener("scroll",
|
|
55
|
+
window.removeEventListener("scroll", d);
|
|
27
56
|
};
|
|
28
57
|
return { handleHideOnScroll: t };
|
|
29
58
|
}
|
|
30
|
-
function
|
|
59
|
+
function ut() {
|
|
31
60
|
let e = null, t = null;
|
|
32
|
-
return { handleHideOnResize: (
|
|
33
|
-
e = new ResizeObserver((
|
|
34
|
-
const
|
|
61
|
+
return { handleHideOnResize: (d, i) => {
|
|
62
|
+
e = new ResizeObserver((o) => {
|
|
63
|
+
const p = o[0].target;
|
|
35
64
|
if (t === null)
|
|
36
|
-
t =
|
|
65
|
+
t = d.getBoundingClientRect();
|
|
37
66
|
else {
|
|
38
|
-
const
|
|
39
|
-
(
|
|
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(
|
|
70
|
+
}), e.observe(d);
|
|
42
71
|
}, resetResizeReferences: () => {
|
|
43
72
|
e !== null && e.disconnect(), e = null, t = null;
|
|
44
73
|
} };
|
|
45
74
|
}
|
|
46
|
-
const { handleHideOnScroll:
|
|
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
|
-
},
|
|
52
|
-
|
|
53
|
-
const
|
|
54
|
-
|
|
55
|
-
|
|
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"
|
|
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
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
}
|
|
77
|
-
|
|
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
|
|
84
|
-
|
|
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
|
|
87
|
-
|
|
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
|
|
90
|
-
|
|
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
|
|
93
|
-
if (
|
|
160
|
+
function Wt(e, t, r) {
|
|
161
|
+
if (!t.shouldShow)
|
|
94
162
|
return;
|
|
95
|
-
const
|
|
96
|
-
|
|
97
|
-
let
|
|
98
|
-
for (let
|
|
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
|
-
|
|
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
|
|
103
|
-
|
|
170
|
+
function zt() {
|
|
171
|
+
S();
|
|
104
172
|
}
|
|
105
|
-
function
|
|
106
|
-
const
|
|
107
|
-
if (
|
|
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
|
-
|
|
110
|
-
const
|
|
111
|
-
let
|
|
112
|
-
|
|
113
|
-
const
|
|
114
|
-
return e.bottom <
|
|
115
|
-
}
|
|
116
|
-
function
|
|
117
|
-
const
|
|
118
|
-
if (
|
|
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
|
-
|
|
121
|
-
const
|
|
122
|
-
let
|
|
123
|
-
|
|
124
|
-
const
|
|
125
|
-
return e.bottom <
|
|
126
|
-
}
|
|
127
|
-
function
|
|
128
|
-
const
|
|
129
|
-
|
|
130
|
-
const
|
|
131
|
-
let
|
|
132
|
-
if (
|
|
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
|
|
135
|
-
return
|
|
136
|
-
}
|
|
137
|
-
function
|
|
138
|
-
const
|
|
139
|
-
|
|
140
|
-
const
|
|
141
|
-
let
|
|
142
|
-
if (
|
|
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
|
|
145
|
-
return
|
|
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
|
|
148
|
-
var
|
|
149
|
-
const
|
|
150
|
-
let
|
|
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",
|
|
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",
|
|
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",
|
|
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",
|
|
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" ?
|
|
166
|
-
const
|
|
167
|
-
|
|
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
|
|
237
|
+
function C(e, t, r, s) {
|
|
170
238
|
switch (e) {
|
|
171
239
|
case "left":
|
|
172
240
|
case "right":
|
|
173
|
-
return r >
|
|
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 >
|
|
244
|
+
return r > s.arrowMinOffsetFromTooltipCorner - s.tooltipBorderWidth && r < t.width + s.tooltipBorderWidth - s.arrowMinOffsetFromTooltipCorner - s.arrowSize * 2;
|
|
177
245
|
}
|
|
178
246
|
}
|
|
179
|
-
function
|
|
247
|
+
function g(e, t, r, s) {
|
|
180
248
|
switch (e) {
|
|
181
249
|
case "left":
|
|
182
250
|
case "right":
|
|
183
|
-
return r <
|
|
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 <
|
|
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
|
|
257
|
+
function S() {
|
|
190
258
|
var t;
|
|
191
|
-
const e = document.querySelector(`.${
|
|
192
|
-
e && e instanceof HTMLElement && (
|
|
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
|
-
|
|
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.
|
|
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
|
-
|
|
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
|
-
|
|
66
|
-
|
|
67
|
-
|
|
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
|
-
|
|
72
|
-
|
|
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
|
-
|
|
80
|
-
|
|
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
|
|
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
|
-
|
|
145
|
-
|
|
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
|
-
|
|
148
|
-
|
|
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
|
-
|
|
154
|
-
anchorElement
|
|
155
|
-
|
|
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
|
-
|
|
173
|
-
|
|
221
|
+
return tooltipElement
|
|
222
|
+
}
|
|
174
223
|
|
|
175
|
-
|
|
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
|
-
|
|
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
|