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 +2 -1
- package/dist/zero-tooltip.js +192 -119
- package/dist/zero-tooltip.umd.cjs +1 -1
- package/package.json +10 -2
- package/src/tooltip.ts +198 -135
package/README.md
CHANGED
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), 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 = (
|
|
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", 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
|
-
},
|
|
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, 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"
|
|
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
|
|
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")), 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
|
|
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 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",
|
|
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`, (c = document.querySelector(`.${y}`)) == null || c.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 O[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",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.
|
|
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
|
-
|
|
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: () => {
|
|
74
|
+
for (let tooltip of Object.values(tooltips)) {
|
|
75
|
+
destroyTooltip(tooltip)
|
|
81
76
|
}
|
|
82
77
|
}
|
|
83
78
|
}
|
|
84
79
|
}
|
|
85
80
|
|
|
86
|
-
function
|
|
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
|
-
|
|
151
|
-
|
|
191
|
+
const mouseEnterEventController = new AbortController()
|
|
192
|
+
const mouseLeaveEventController = new AbortController()
|
|
152
193
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
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
|
-
|
|
173
|
-
|
|
219
|
+
return tooltipElement
|
|
220
|
+
}
|
|
174
221
|
|
|
175
|
-
|
|
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
|
-
|
|
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
|