PluginProbe ʕ •ᴥ•ʔ
Hostinger Tools / 3.0.71
Hostinger Tools v3.0.71
3.0.71 3.0.70 3.0.69 3.0.68 3.0.67 3.0.66 1.8.1 1.8.2 1.8.3 1.9.1 1.9.4 1.9.5 1.9.6 1.9.7 1.9.8 1.9.9 2.0.0 2.0.1 2.0.4 2.0.6 2.0.7 2.0.8 2.0.9 2.1.0 2.1.1 2.1.2 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.1.9 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 3.0.0 3.0.10 3.0.11 3.0.12 3.0.13 3.0.14 3.0.15 3.0.16 3.0.17 3.0.18 3.0.19 3.0.2 3.0.20 3.0.21 3.0.22 3.0.23 3.0.24 3.0.25 3.0.26 3.0.27 3.0.28 3.0.29 3.0.3 3.0.30 3.0.31 3.0.32 3.0.33 3.0.34 3.0.35 3.0.36 3.0.37 3.0.38 3.0.39 3.0.4 3.0.40 3.0.41 3.0.42 3.0.43 3.0.44 3.0.45 3.0.46 3.0.47 3.0.48 3.0.49 3.0.5 3.0.50 3.0.51 3.0.52 3.0.53 3.0.54 3.0.55 3.0.56 3.0.57 3.0.58 3.0.59 3.0.6 3.0.60 3.0.61 3.0.62 3.0.65 3.0.7 3.0.8 3.0.9 trunk 1.8.0
hostinger / vue-frontend / src / utils / directives / tooltipDirective.ts
hostinger / vue-frontend / src / utils / directives Last commit date
index.ts 9 months ago tooltipDirective.ts 9 months ago
tooltipDirective.ts
121 lines
1 import { DirectiveBinding } from "vue";
2
3 import { MouseEvent } from "@/types/enums";
4
5 const TOOLTIP_ATTR = "tooltip";
6
7 interface ComplexTooltip {
8 content: string;
9 autoWidth?: boolean;
10 }
11
12 type TooltipBinding =
13 | DirectiveBinding<string>
14 | DirectiveBinding<ComplexTooltip>;
15
16 const isString = (value: unknown) => typeof value === "string";
17
18 const getCurrentRotation = (el: HTMLElement) => {
19 const computedStyles = window.getComputedStyle(el, null);
20 const transformProp =
21 computedStyles.getPropertyValue("-webkit-transform") ||
22 computedStyles.getPropertyValue("-moz-transform") ||
23 computedStyles.getPropertyValue("-ms-transform") ||
24 computedStyles.getPropertyValue("-o-transform") ||
25 computedStyles.getPropertyValue("transform") ||
26 "none";
27 if (transformProp != "none") {
28 const values = transformProp.split("(")[1].split(")")[0].split(",");
29
30 const angle = Math.round(
31 Math.atan2(Number(values[1]), Number(values[0])) * (180 / Math.PI)
32 );
33
34 return angle < 0 ? angle + 360 : angle;
35 }
36
37 return 0;
38 };
39
40 const getTooltipClass = (
41 { modifiers }: DirectiveBinding,
42 isRotated: boolean
43 ) => {
44 const position = Object.keys(modifiers)[0];
45
46 return `has-tooltip--${position || "bottom"}${isRotated ? "-rotated" : ""}`;
47 };
48
49 const getTooltipContent = (binding: TooltipBinding) => {
50 if (!binding.value) return null;
51
52 return isString(binding.value)
53 ? binding.value
54 : (binding.value as ComplexTooltip).content;
55 };
56
57 const addTooltip = (el: HTMLElement, binding: TooltipBinding) => {
58 const content = getTooltipContent(binding);
59
60 if (!content) return removeTooltip(el, binding);
61
62 const rotation = getCurrentRotation(el);
63
64 el.setAttribute(TOOLTIP_ATTR, content as string);
65
66 document.documentElement.style.setProperty(
67 "--tooltip-rotation",
68 `-${rotation}deg`
69 );
70
71 if (
72 !isString(binding.value) &&
73 (binding.value as ComplexTooltip).autoWidth
74 ) {
75 document.documentElement.style.setProperty("--tooltip-width", "auto");
76 }
77
78 el.style.transition = "0s";
79
80 const zIndex = getComputedStyle(document.documentElement).getPropertyValue(
81 "--z-index-child-2"
82 );
83 el.style.zIndex = zIndex;
84 el.style.position = "relative";
85
86 el.classList.add(getTooltipClass(binding, rotation === 180));
87 };
88
89 const removeTooltip = (el: HTMLElement, binding: TooltipBinding) => {
90 el.removeAttribute(TOOLTIP_ATTR);
91
92 el.style.zIndex = "";
93 el.style.position = "";
94
95 el.classList.remove(getTooltipClass(binding, true));
96 el.classList.remove(getTooltipClass(binding, false));
97 };
98
99 const unbind = (el: HTMLElement, binding: TooltipBinding) => {
100 el.removeEventListener(MouseEvent.MouseOver, () => addTooltip(el, binding));
101 el.removeEventListener(MouseEvent.MouseLeave, () =>
102 removeTooltip(el, binding)
103 );
104 el.removeEventListener(MouseEvent.Click, () => removeTooltip(el, binding));
105 };
106
107 const bind = (el: HTMLElement, binding: TooltipBinding) => {
108 el.addEventListener(MouseEvent.MouseOver, () => addTooltip(el, binding));
109 el.addEventListener(MouseEvent.MouseLeave, () =>
110 removeTooltip(el, binding)
111 );
112 el.addEventListener(MouseEvent.Click, () => removeTooltip(el, binding));
113 };
114
115 export const vTooltip = {
116 mounted: (el: HTMLElement, binding: TooltipBinding) => bind(el, binding),
117 updated: (el: HTMLElement, binding: TooltipBinding) => bind(el, binding),
118 beforeUnmount: (el: HTMLElement, binding: TooltipBinding) =>
119 unbind(el, binding)
120 };
121