@gkucmierz/nano-ui 1.0.2 → 1.2.0

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/nano-ui.css CHANGED
@@ -1,2 +1,2 @@
1
- span.ripple{background-color:var(--nano-ripple-color,#fff6);pointer-events:none;border-radius:50%;animation:.6s linear nano-ripple-anim;position:absolute;transform:scale(0)}@keyframes nano-ripple-anim{to{opacity:0;transform:scale(4)}}
1
+ .global-tooltip[data-v-e8c73fc7]{--nu-tooltip-bg:#0f172af2;--nu-tooltip-color:#f8fafc;--nu-tooltip-radius:8px;--nu-tooltip-padding:8px 14px;--nu-tooltip-shadow:0 8px 24px #0000004d;--nu-tooltip-border:1px solid #ffffff1a;--nu-tooltip-arrow-border:#ffffff1a;z-index:99999;background:var(--nu-tooltip-bg);-webkit-backdrop-filter:blur(8px);color:var(--nu-tooltip-color);padding:var(--nu-tooltip-padding);border-radius:var(--nu-tooltip-radius);text-align:center;white-space:normal;word-wrap:break-word;pointer-events:none;width:max-content;max-width:min(350px,100vw - 32px);box-shadow:var(--nu-tooltip-shadow);border:var(--nu-tooltip-border);opacity:0;visibility:hidden;font-size:.85rem;font-weight:500;line-height:1.4;transition:opacity .2s cubic-bezier(.16,1,.3,1),transform .2s cubic-bezier(.16,1,.3,1);position:fixed;top:0;left:0;transform:translateY(4px)scale(.95)}.global-tooltip[data-v-e8c73fc7]:after{content:"";left:calc(50% + var(--arrow-offset,0px));background:var(--nu-tooltip-bg);-webkit-backdrop-filter:blur(8px);border-right:1px solid var(--nu-tooltip-arrow-border);border-bottom:1px solid var(--nu-tooltip-arrow-border);clip-path:polygon(100% 0,100% 100%,0 100%);border-radius:0 0 2px;width:10px;height:10px;margin-left:-5px;position:absolute;bottom:-5px;transform:rotate(45deg)}.global-tooltip.tooltip-bottom[data-v-e8c73fc7]:after{border-bottom:none;border-right:none;border-left:1px solid var(--nu-tooltip-arrow-border);border-top:1px solid var(--nu-tooltip-arrow-border);clip-path:polygon(0 0,100% 0,0 100%);border-radius:2px 0 0;top:-5px;bottom:auto}.global-tooltip.visible[data-v-e8c73fc7]{opacity:1;visibility:visible}:root[data-theme=light] .global-tooltip[data-v-e8c73fc7]{--nu-tooltip-bg:#fffffff2;--nu-tooltip-color:#0f172a;--nu-tooltip-border:1px solid #0f172a1a;--nu-tooltip-arrow-border:#0f172a1a;--nu-tooltip-shadow:0 4px 12px #0f172a1a}span.ripple{background-color:var(--nano-ripple-color,#fff6);pointer-events:none;border-radius:50%;animation:.6s linear nano-ripple-anim;position:absolute;transform:scale(0)}@keyframes nano-ripple-anim{to{opacity:0;transform:scale(4)}}
2
2
  /*$vite$:1*/
package/dist/nano-ui.js CHANGED
@@ -1,13 +1,115 @@
1
+ import { createElementBlock as e, nextTick as t, normalizeClass as n, normalizeStyle as r, openBlock as i, reactive as a, ref as o, toDisplayString as s, unref as c, watch as l } from "vue";
1
2
  //#region src/directives/ripple.js
2
- var e = { mounted(e, t) {
3
+ var u = { mounted(e, t) {
3
4
  e.style.position = "relative", e.style.overflow = "hidden", e.addEventListener("click", function(n) {
4
5
  let r = e.getBoundingClientRect(), i = n.clientX - r.left, a = n.clientY - r.top, o = document.createElement("span"), s = Math.max(r.width, r.height), c = s / 2;
5
6
  o.style.width = o.style.height = `${s}px`, o.style.left = `${i - c}px`, o.style.top = `${a - c}px`, o.classList.add("ripple"), t.value && typeof t.value == "string" && (o.style.backgroundColor = t.value), e.appendChild(o), setTimeout(() => {
6
7
  o.remove();
7
8
  }, 600);
8
9
  });
9
- } }, t = { install(t) {
10
- t.directive("ripple", e);
10
+ } }, d = a({
11
+ isVisible: !1,
12
+ text: "",
13
+ customClass: "",
14
+ targetRect: null
15
+ });
16
+ function f(e, t) {
17
+ if (!t) return;
18
+ let n = typeof t == "object" ? t.text : t, r = typeof t == "object" && t.class || "";
19
+ if (!n) return;
20
+ e.hasAttribute("aria-label") || e.setAttribute("aria-label", n);
21
+ let i = e.getBoundingClientRect();
22
+ d.targetRect = {
23
+ top: i.top,
24
+ left: i.left,
25
+ width: i.width,
26
+ bottom: i.bottom,
27
+ right: i.right
28
+ }, d.text = n, d.customClass = r, d.isVisible = !0;
29
+ }
30
+ typeof window < "u" && window.addEventListener("scroll", p, {
31
+ passive: !0,
32
+ capture: !0
33
+ });
34
+ function p() {
35
+ d.isVisible = !1;
36
+ }
37
+ //#endregion
38
+ //#region src/directives/tooltip.js
39
+ var m = {
40
+ mounted(e, t) {
41
+ e._tooltipOptions = t.value;
42
+ let n = null, r = !1;
43
+ e._handleMouseEnter = () => {
44
+ r || f(e, e._tooltipOptions);
45
+ }, e._handleMouseLeave = () => {
46
+ r || p();
47
+ }, e._handleFocus = () => {
48
+ r || f(e, e._tooltipOptions);
49
+ }, e._handleBlur = () => {
50
+ r || p();
51
+ }, e._handleTouchStart = () => {
52
+ r = !0, n && clearTimeout(n), n = setTimeout(() => {
53
+ f(e, e._tooltipOptions);
54
+ }, 400);
55
+ }, e._handleTouchEnd = () => {
56
+ n && clearTimeout(n), p(), setTimeout(() => {
57
+ r = !1;
58
+ }, 500);
59
+ }, e._handleTouchCancel = () => {
60
+ n && clearTimeout(n), p(), setTimeout(() => {
61
+ r = !1;
62
+ }, 500);
63
+ }, e._handleContextMenu = (t) => {
64
+ let n = typeof e._tooltipOptions == "object" ? e._tooltipOptions.text : e._tooltipOptions;
65
+ r && d.isVisible && d.text === n && t.preventDefault();
66
+ }, e.addEventListener("mouseenter", e._handleMouseEnter), e.addEventListener("mouseleave", e._handleMouseLeave), e.addEventListener("focus", e._handleFocus), e.addEventListener("blur", e._handleBlur), e.addEventListener("touchstart", e._handleTouchStart, { passive: !0 }), e.addEventListener("touchend", e._handleTouchEnd), e.addEventListener("touchmove", e._handleTouchCancel, { passive: !0 }), e.addEventListener("touchcancel", e._handleTouchCancel), e.addEventListener("contextmenu", e._handleContextMenu);
67
+ },
68
+ updated(e, t) {
69
+ e._tooltipOptions = t.value;
70
+ let n = typeof t.value == "object" ? t.value.text : t.value;
71
+ d.isVisible && d.text !== n && (e.matches(":hover") || document.activeElement === e) && f(e, t.value);
72
+ },
73
+ unmounted(e) {
74
+ e._handleMouseEnter && (e.removeEventListener("mouseenter", e._handleMouseEnter), e.removeEventListener("mouseleave", e._handleMouseLeave), e.removeEventListener("focus", e._handleFocus), e.removeEventListener("blur", e._handleBlur), e.removeEventListener("touchstart", e._handleTouchStart), e.removeEventListener("touchend", e._handleTouchEnd), e.removeEventListener("touchmove", e._handleTouchCancel), e.removeEventListener("touchcancel", e._handleTouchCancel), e.removeEventListener("contextmenu", e._handleContextMenu)), p();
75
+ }
76
+ }, h = /* @__PURE__ */ ((e, t) => {
77
+ let n = e.__vccOpts || e;
78
+ for (let [e, r] of t) n[e] = r;
79
+ return n;
80
+ })({
81
+ __name: "GlobalTooltip",
82
+ setup(a) {
83
+ let u = o(null), f = o(0), p = o(0), m = o(0), h = o(!1);
84
+ return l(() => d.isVisible, async (e) => {
85
+ if (e) {
86
+ if (await t(), !u.value || !d.targetRect) return;
87
+ let e = d.targetRect, n = u.value.getBoundingClientRect(), r = window.innerWidth, i = window.innerHeight, a = e.top, o = i - e.bottom, s = e.top - n.height - 8;
88
+ h.value = !1, (s < 8 || a < n.height + 8 && o > a) && (s = e.bottom + 8, h.value = !0), s + n.height > i - 8 && (s = i - n.height - 8), s < 8 && (s = 8);
89
+ let c = e.left + e.width / 2, l = c - n.width / 2;
90
+ l < 8 ? l = 8 : l + n.width > r - 8 && (l = r - n.width - 8);
91
+ let g = c - (l + n.width / 2), _ = n.width / 2 - 12;
92
+ g > _ && (g = _), g < -_ && (g = -_), m.value = g, f.value = l, p.value = s;
93
+ }
94
+ }), (t, a) => (i(), e("div", {
95
+ ref_key: "tooltipRef",
96
+ ref: u,
97
+ class: n([
98
+ "global-tooltip",
99
+ {
100
+ visible: c(d).isVisible,
101
+ "tooltip-bottom": h.value
102
+ },
103
+ c(d).customClass
104
+ ]),
105
+ style: r({
106
+ transform: `translate(${f.value}px, ${p.value}px)`,
107
+ "--arrow-offset": `${m.value}px`
108
+ })
109
+ }, s(c(d).text), 7));
110
+ }
111
+ }, [["__scopeId", "data-v-e8c73fc7"]]), g = { install(e) {
112
+ e.directive("ripple", u), e.directive("tooltip", m), e.component("GlobalTooltip", h);
11
113
  } };
12
114
  //#endregion
13
- export { e as Ripple, t as default };
115
+ export { h as GlobalTooltip, u as Ripple, g as default, p as hideTooltip, f as showTooltip, m as tooltipDirective, d as tooltipState };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@gkucmierz/nano-ui",
3
- "version": "1.0.2",
3
+ "version": "1.2.0",
4
4
  "description": "High-performance, minimal footprint Vue 3 UI library and directives.",
5
5
  "type": "module",
6
6
  "main": "./dist/nano-ui.js",
@@ -40,5 +40,8 @@
40
40
  "ripple",
41
41
  "nano",
42
42
  "glassmorphism"
43
- ]
43
+ ],
44
+ "dependencies": {
45
+ "vue-router": "^5.0.6"
46
+ }
44
47
  }