@greypan/web-ui 6.0.0 → 6.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/README.CN.md +285 -93
- package/README.md +266 -87
- package/dist/assets/glass.js +1 -1
- package/dist/assets/glass.js.map +1 -1
- package/dist/assets/menu-portal.js +1 -1
- package/dist/assets/menu-portal.js.map +1 -1
- package/dist/assets/overlay-motion.js +1 -1
- package/dist/assets/overlay-motion.js.map +1 -1
- package/dist/components/autocomplete/index.d.ts +367 -4
- package/dist/components/autocomplete/index.js +87 -80
- package/dist/components/autocomplete/index.js.map +1 -1
- package/dist/components/autocomplete/style.js +1 -1
- package/dist/components/autocomplete/style.js.map +1 -1
- package/dist/components/avatar/style.js +1 -1
- package/dist/components/avatar/style.js.map +1 -1
- package/dist/components/back-top/style.js +1 -1
- package/dist/components/back-top/style.js.map +1 -1
- package/dist/components/badge/style.js +1 -1
- package/dist/components/badge/style.js.map +1 -1
- package/dist/components/button/index.js +36 -32
- package/dist/components/button/index.js.map +1 -1
- package/dist/components/button/style.js +1 -1
- package/dist/components/button/style.js.map +1 -1
- package/dist/components/button-group/style.js +1 -1
- package/dist/components/button-group/style.js.map +1 -1
- package/dist/components/checkbox/index.d.ts +366 -5
- package/dist/components/checkbox/index.js +19 -31
- package/dist/components/checkbox/index.js.map +1 -1
- package/dist/components/checkbox/style.js +1 -1
- package/dist/components/checkbox/style.js.map +1 -1
- package/dist/components/checkbox-group/index.d.ts +366 -4
- package/dist/components/checkbox-group/index.js +16 -25
- package/dist/components/checkbox-group/index.js.map +1 -1
- package/dist/components/collapse/index.d.ts +29 -1
- package/dist/components/collapse/index.js +105 -46
- package/dist/components/collapse/index.js.map +1 -1
- package/dist/components/collapse/style.js +1 -1
- package/dist/components/collapse/style.js.map +1 -1
- package/dist/components/context-menu/index.d.ts +7 -14
- package/dist/components/context-menu/index.js +113 -164
- package/dist/components/context-menu/index.js.map +1 -1
- package/dist/components/dialog/index.js +26 -25
- package/dist/components/dialog/index.js.map +1 -1
- package/dist/components/dialog/style.js +1 -1
- package/dist/components/dialog/style.js.map +1 -1
- package/dist/components/drawer/index.js +71 -64
- package/dist/components/drawer/index.js.map +1 -1
- package/dist/components/drawer/style.js +1 -1
- package/dist/components/drawer/style.js.map +1 -1
- package/dist/components/dropdown/index.d.ts +6 -14
- package/dist/components/dropdown/index.js +100 -156
- package/dist/components/dropdown/index.js.map +1 -1
- package/dist/components/dropdown-header/style.js +1 -1
- package/dist/components/dropdown-header/style.js.map +1 -1
- package/dist/components/dropdown-item/style.js +1 -1
- package/dist/components/dropdown-item/style.js.map +1 -1
- package/dist/components/empty/style.js +1 -1
- package/dist/components/empty/style.js.map +1 -1
- package/dist/components/image-preview/index.d.ts +58 -0
- package/dist/components/image-preview/index.js +481 -0
- package/dist/components/image-preview/index.js.map +1 -0
- package/dist/components/image-preview/style.js +6 -0
- package/dist/components/image-preview/style.js.map +1 -0
- package/dist/components/index.d.ts +1 -0
- package/dist/components/index.js +20 -19
- package/dist/components/input/index.d.ts +366 -5
- package/dist/components/input/index.js +35 -47
- package/dist/components/input/index.js.map +1 -1
- package/dist/components/input/style.js +1 -1
- package/dist/components/input/style.js.map +1 -1
- package/dist/components/input-number/index.d.ts +366 -5
- package/dist/components/input-number/index.js +31 -44
- package/dist/components/input-number/index.js.map +1 -1
- package/dist/components/input-number/style.js +1 -1
- package/dist/components/input-number/style.js.map +1 -1
- package/dist/components/layout/index.d.ts +1 -1
- package/dist/components/layout/index.js +5 -3
- package/dist/components/layout/index.js.map +1 -1
- package/dist/components/layout/style.js +1 -1
- package/dist/components/layout/style.js.map +1 -1
- package/dist/components/option/style.js +1 -1
- package/dist/components/option/style.js.map +1 -1
- package/dist/components/popover/index.d.ts +1 -0
- package/dist/components/popover/index.js +55 -60
- package/dist/components/popover/index.js.map +1 -1
- package/dist/components/popover/style.js +1 -1
- package/dist/components/popover/style.js.map +1 -1
- package/dist/components/radio/index.d.ts +366 -5
- package/dist/components/radio/index.js +21 -31
- package/dist/components/radio/index.js.map +1 -1
- package/dist/components/radio/style.js +1 -1
- package/dist/components/radio/style.js.map +1 -1
- package/dist/components/radio-group/index.d.ts +366 -4
- package/dist/components/radio-group/index.js +16 -25
- package/dist/components/radio-group/index.js.map +1 -1
- package/dist/components/segmented/index.d.ts +366 -4
- package/dist/components/segmented/index.js +28 -35
- package/dist/components/segmented/index.js.map +1 -1
- package/dist/components/segmented/style.js +1 -1
- package/dist/components/segmented/style.js.map +1 -1
- package/dist/components/segmented-trigger/index.js +17 -15
- package/dist/components/segmented-trigger/index.js.map +1 -1
- package/dist/components/segmented-trigger/style.js +1 -1
- package/dist/components/segmented-trigger/style.js.map +1 -1
- package/dist/components/select/index.d.ts +368 -5
- package/dist/components/select/index.js +71 -68
- package/dist/components/select/index.js.map +1 -1
- package/dist/components/select/style.js +1 -1
- package/dist/components/select/style.js.map +1 -1
- package/dist/components/slider/index.d.ts +366 -5
- package/dist/components/slider/index.js +40 -50
- package/dist/components/slider/index.js.map +1 -1
- package/dist/components/slider/style.js +1 -1
- package/dist/components/slider/style.js.map +1 -1
- package/dist/components/spinner/style.js +1 -1
- package/dist/components/spinner/style.js.map +1 -1
- package/dist/components/svg-draw-lines/index.js +1 -1
- package/dist/components/svg-draw-lines/index.js.map +1 -1
- package/dist/components/switch/index.d.ts +366 -5
- package/dist/components/switch/index.js +28 -38
- package/dist/components/switch/index.js.map +1 -1
- package/dist/components/switch/style.js +1 -1
- package/dist/components/switch/style.js.map +1 -1
- package/dist/components/textarea/index.d.ts +366 -5
- package/dist/components/textarea/index.js +43 -57
- package/dist/components/textarea/index.js.map +1 -1
- package/dist/components/textarea/style.js +1 -1
- package/dist/components/textarea/style.js.map +1 -1
- package/dist/components/theme/index.js +1 -1
- package/dist/components/theme/index.js.map +1 -1
- package/dist/components/theme/style.js +1 -1
- package/dist/components/theme/style.js.map +1 -1
- package/dist/components/toast/manager.js +2 -2
- package/dist/components/toast/manager.js.map +1 -1
- package/dist/components/toast/style.js +1 -1
- package/dist/components/toast/style.js.map +1 -1
- package/dist/components/tooltip/index.d.ts +1 -0
- package/dist/components/tooltip/index.js +43 -58
- package/dist/components/tooltip/index.js.map +1 -1
- package/dist/components/tooltip/style.js +1 -1
- package/dist/components/tooltip/style.js.map +1 -1
- package/dist/icons/generated/radix-icons-reset.d.ts +6 -0
- package/dist/icons/generated/radix-icons-reset.js +10 -0
- package/dist/icons/generated/radix-icons-reset.js.map +1 -0
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.js +2 -1
- package/dist/shared/focus/pointer-focus.js +37 -0
- package/dist/shared/focus/pointer-focus.js.map +1 -0
- package/dist/shared/form-association/index.js +31 -4
- package/dist/shared/form-association/index.js.map +1 -1
- package/dist/shared/gesture/drag-gesture.js +53 -30
- package/dist/shared/gesture/drag-gesture.js.map +1 -1
- package/dist/shared/gesture/pinch-gesture.js +84 -0
- package/dist/shared/gesture/pinch-gesture.js.map +1 -0
- package/dist/shared/group-management/index.js.map +1 -1
- package/dist/shared/menu-behavior/index.js +112 -0
- package/dist/shared/menu-behavior/index.js.map +1 -0
- package/dist/shared/menu-portal/menu-portal.js.map +1 -1
- package/dist/shared/open-state/index.js +12 -0
- package/dist/shared/open-state/index.js.map +1 -0
- package/dist/shared/option-portal/combobox-shell.js +43 -0
- package/dist/shared/option-portal/combobox-shell.js.map +1 -0
- package/dist/shared/option-portal/index.js +22 -21
- package/dist/shared/option-portal/index.js.map +1 -1
- package/dist/shared/overlay/anchored-panel.js +33 -30
- package/dist/shared/overlay/anchored-panel.js.map +1 -1
- package/dist/shared/overlay/composition.js +57 -0
- package/dist/shared/overlay/composition.js.map +1 -0
- package/dist/shared/overlay/lifecycle.js +41 -0
- package/dist/shared/overlay/lifecycle.js.map +1 -0
- package/dist/shared/overlay/native-dialog-presence.js +15 -15
- package/dist/shared/overlay/native-dialog-presence.js.map +1 -1
- package/dist/shared/{theme → overlay}/overlay-root.js +1 -1
- package/dist/shared/overlay/overlay-root.js.map +1 -0
- package/dist/shared/overlay/overlay.js +43 -41
- package/dist/shared/overlay/overlay.js.map +1 -1
- package/dist/shared/overlay/placement-props.js +19 -0
- package/dist/shared/overlay/placement-props.js.map +1 -0
- package/dist/shared/overlay/portal.js +6 -4
- package/dist/shared/overlay/portal.js.map +1 -1
- package/dist/shared/overlay/positioning-generation.js +20 -0
- package/dist/shared/overlay/positioning-generation.js.map +1 -0
- package/dist/shared/{theme/theme-scope.js → overlay/theme-overlay-scope.js} +2 -2
- package/dist/shared/overlay/theme-overlay-scope.js.map +1 -0
- package/package.json +6 -10
- package/dist/shared/theme/overlay-root.js.map +0 -1
- package/dist/shared/theme/theme-scope.js.map +0 -1
|
@@ -2,29 +2,22 @@ import e from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate
|
|
|
2
2
|
import t from "../../assets/glass.js";
|
|
3
3
|
import n from "../../assets/overlay-motion.js";
|
|
4
4
|
import { normalizeLiteral as r, normalizeNumber as i } from "../../shared/normalize/index.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import {
|
|
8
|
-
import c from "
|
|
9
|
-
import {
|
|
10
|
-
import {
|
|
5
|
+
import { dispatchOpenChangeEvent as a } from "../../shared/open-state/index.js";
|
|
6
|
+
import { defineAnchoredPanel as o } from "../../shared/overlay/anchored-panel.js";
|
|
7
|
+
import { defineOverlayPortal as s } from "../../shared/overlay/portal.js";
|
|
8
|
+
import { UserChangeController as c } from "../../shared/events/user-change.js";
|
|
9
|
+
import { defineOverlayLifecycle as l } from "../../shared/overlay/lifecycle.js";
|
|
10
|
+
import { FLOATING_PLACEMENTS as u } from "../../shared/overlay/placement-props.js";
|
|
11
|
+
import d from "./style.js";
|
|
12
|
+
import { LitElement as f, html as p, unsafeCSS as m } from "lit";
|
|
13
|
+
import { customElement as h, property as g } from "lit/decorators.js";
|
|
11
14
|
//#region src/components/tooltip/index.ts
|
|
12
|
-
var
|
|
13
|
-
"top",
|
|
14
|
-
"top-start",
|
|
15
|
-
"top-end",
|
|
16
|
-
"bottom",
|
|
17
|
-
"bottom-start",
|
|
18
|
-
"bottom-end",
|
|
19
|
-
"left",
|
|
20
|
-
"left-start",
|
|
21
|
-
"left-end",
|
|
22
|
-
"right",
|
|
23
|
-
"right-start",
|
|
24
|
-
"right-end"
|
|
25
|
-
], h = 0, g = class extends l {
|
|
15
|
+
var _ = 0, v = class extends f {
|
|
26
16
|
constructor(...e) {
|
|
27
|
-
super(...e), this._placement = "top", this._showDelay = 200, this._hideDelay = 100, this.disabled = !1, this._offset = 6, this.content = "", this.open = !1, this.portal = !1, this._isCountedVisible = !1, this._userOpenChange = new
|
|
17
|
+
super(...e), this._placement = "top", this._showDelay = 200, this._hideDelay = 100, this.disabled = !1, this._offset = 6, this.content = "", this.open = !1, this.portal = !1, this._isCountedVisible = !1, this._userOpenChange = new c(), this._shouldOpenInstantly = !0, this._lifecycle = l().make({
|
|
18
|
+
isConnected: () => this.isConnected,
|
|
19
|
+
isOpen: () => this.open
|
|
20
|
+
}), this._panel = o().make({
|
|
28
21
|
getAnchor: () => this.shadowRoot?.querySelector(".tooltip-trigger") ?? null,
|
|
29
22
|
getLocalPanel: () => this.shadowRoot?.querySelector(".tooltip-panel") ?? null,
|
|
30
23
|
getPositioning: () => ({
|
|
@@ -35,7 +28,7 @@ var m = [
|
|
|
35
28
|
isPortal: () => this.portal,
|
|
36
29
|
createPortal: () => this._createPortal()
|
|
37
30
|
}), this._onPointerEnter = (e) => {
|
|
38
|
-
e.pointerType !== "touch" && (this.disabled || (clearTimeout(this._hideTimer), this._showTimer = setTimeout(() => this._show(),
|
|
31
|
+
e.pointerType !== "touch" && (this.disabled || (clearTimeout(this._hideTimer), this._showTimer = setTimeout(() => this._show(), _ > 0 ? 0 : this.showDelay)));
|
|
39
32
|
}, this._onPointerLeave = (e) => {
|
|
40
33
|
e.pointerType !== "touch" && (this.disabled || (clearTimeout(this._showTimer), this._hideTimer = setTimeout(() => this._hide(), this.hideDelay)));
|
|
41
34
|
}, this._onFocusIn = (e) => {
|
|
@@ -46,9 +39,9 @@ var m = [
|
|
|
46
39
|
}
|
|
47
40
|
static {
|
|
48
41
|
this.styles = [
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
d
|
|
42
|
+
m(t),
|
|
43
|
+
m(n),
|
|
44
|
+
m(d)
|
|
52
45
|
];
|
|
53
46
|
}
|
|
54
47
|
get placement() {
|
|
@@ -56,7 +49,7 @@ var m = [
|
|
|
56
49
|
}
|
|
57
50
|
set placement(e) {
|
|
58
51
|
let t = this._placement;
|
|
59
|
-
this._placement = r(e,
|
|
52
|
+
this._placement = r(e, u, "top"), this.requestUpdate("placement", t);
|
|
60
53
|
}
|
|
61
54
|
get showDelay() {
|
|
62
55
|
return this._showDelay;
|
|
@@ -83,16 +76,16 @@ var m = [
|
|
|
83
76
|
return this.open;
|
|
84
77
|
}
|
|
85
78
|
connectedCallback() {
|
|
86
|
-
super.connectedCallback(), this.addEventListener("pointerenter", this._onPointerEnter), this.addEventListener("pointerleave", this._onPointerLeave), this.addEventListener("focusin", this._onFocusIn), this.addEventListener("focusout", this._onFocusOut);
|
|
79
|
+
super.connectedCallback(), this._lifecycle.resume(), this.addEventListener("pointerenter", this._onPointerEnter), this.addEventListener("pointerleave", this._onPointerLeave), this.addEventListener("focusin", this._onFocusIn), this.addEventListener("focusout", this._onFocusOut);
|
|
87
80
|
}
|
|
88
81
|
disconnectedCallback() {
|
|
89
|
-
super.disconnectedCallback(), this.removeEventListener("pointerenter", this._onPointerEnter), this.removeEventListener("pointerleave", this._onPointerLeave), this.removeEventListener("focusin", this._onFocusIn), this.removeEventListener("focusout", this._onFocusOut), clearTimeout(this._showTimer), clearTimeout(this._hideTimer), this._syncVisibleTooltipCount(!1), this._panel.dispose();
|
|
82
|
+
super.disconnectedCallback(), this.removeEventListener("pointerenter", this._onPointerEnter), this.removeEventListener("pointerleave", this._onPointerLeave), this.removeEventListener("focusin", this._onFocusIn), this.removeEventListener("focusout", this._onFocusOut), clearTimeout(this._showTimer), clearTimeout(this._hideTimer), this._lifecycle.dispose(), this._syncVisibleTooltipCount(!1), this._panel.dispose();
|
|
90
83
|
}
|
|
91
84
|
firstUpdated() {
|
|
92
85
|
this.open && (this._openOverlay(this._shouldOpenInstantly), this._shouldOpenInstantly = !0);
|
|
93
86
|
}
|
|
94
87
|
updated(e) {
|
|
95
|
-
e.has("portal") || e.has("overlayContainer") ?
|
|
88
|
+
e.has("portal") || e.has("overlayContainer") ? (this._lifecycle.invalidate(), this._lifecycle.scheduleFrame(() => this._reconfigureOverlay())) : (e.has("placement") || e.has("offset")) && requestAnimationFrame(() => this._panel.updatePosition()), e.has("open") && (this._syncVisibleTooltipCount(this.open), this.open ? (this._openOverlay(this._shouldOpenInstantly), this._shouldOpenInstantly = !0) : (this._lifecycle.invalidate(), this._closeOverlay()), this._userOpenChange.consume() && this._dispatchChange(this.open)), e.has("content") && this._syncPortalContent();
|
|
96
89
|
}
|
|
97
90
|
_show(e = !1) {
|
|
98
91
|
this.open ||= (this._shouldOpenInstantly = e, this._userOpenChange.mark(), !0);
|
|
@@ -104,15 +97,11 @@ var m = [
|
|
|
104
97
|
this._panel.open(e);
|
|
105
98
|
}
|
|
106
99
|
_createPortal() {
|
|
107
|
-
let e =
|
|
100
|
+
let e = s().make({
|
|
108
101
|
container: this.overlayContainer,
|
|
109
102
|
target: this,
|
|
110
|
-
style: `${t}\n${n}\n${
|
|
103
|
+
style: `${t}\n${n}\n${d}`,
|
|
111
104
|
className: "tooltip-panel portal wui-glass wui-floating-panel",
|
|
112
|
-
onContentChange: (e) => {
|
|
113
|
-
let t = new Set(e.flatMap((e) => [...e.addedNodes])), n = e.flatMap((e) => [...e.removedNodes]).filter((e) => !t.has(e));
|
|
114
|
-
n.length && this._portal?.removeContent(n);
|
|
115
|
-
},
|
|
116
105
|
migrateAddedNodes: (e) => e.filter((e) => e instanceof Element && e.getAttribute("slot") === "content")
|
|
117
106
|
});
|
|
118
107
|
if (this._portal = e, this.content) {
|
|
@@ -131,57 +120,53 @@ var m = [
|
|
|
131
120
|
if (!this.portal || !this.open) return;
|
|
132
121
|
let e = this._panel.getPanel();
|
|
133
122
|
if (!e) return;
|
|
134
|
-
let t = e.querySelector(".tooltip-text");
|
|
135
|
-
if (
|
|
136
|
-
|
|
123
|
+
let t = this._portal?.panel ?? e, n = e.querySelector(".tooltip-text");
|
|
124
|
+
if (n) {
|
|
125
|
+
n.textContent = this.content;
|
|
137
126
|
return;
|
|
138
127
|
}
|
|
139
128
|
if (!this.content) return;
|
|
140
|
-
|
|
141
|
-
let
|
|
142
|
-
|
|
129
|
+
t.replaceChildren();
|
|
130
|
+
let r = document.createElement("span");
|
|
131
|
+
r.className = "tooltip-text", r.textContent = this.content, t.append(r);
|
|
143
132
|
}
|
|
144
133
|
_dispatchChange(e) {
|
|
145
|
-
this
|
|
146
|
-
detail: { open: e },
|
|
147
|
-
bubbles: !0,
|
|
148
|
-
composed: !0
|
|
149
|
-
}));
|
|
134
|
+
a(this, e);
|
|
150
135
|
}
|
|
151
136
|
_syncVisibleTooltipCount(e) {
|
|
152
|
-
e && !this._isCountedVisible ? (
|
|
137
|
+
e && !this._isCountedVisible ? (_ += 1, this._isCountedVisible = !0) : !e && this._isCountedVisible && (_ = Math.max(0, _ - 1), this._isCountedVisible = !1);
|
|
153
138
|
}
|
|
154
139
|
render() {
|
|
155
|
-
return
|
|
140
|
+
return p`
|
|
156
141
|
<div class="tooltip-anchor">
|
|
157
142
|
<div class="tooltip-trigger"><slot></slot></div>
|
|
158
|
-
<div class="tooltip-panel wui-
|
|
159
|
-
${this.content ?
|
|
143
|
+
<div class="tooltip-panel wui-floating-panel wui-glass" hidden role="tooltip">
|
|
144
|
+
${this.content ? p`<span class="tooltip-text">${this.content}</span>` : p`<slot name="content"></slot>`}
|
|
160
145
|
</div>
|
|
161
146
|
</div>
|
|
162
147
|
`;
|
|
163
148
|
}
|
|
164
149
|
};
|
|
165
|
-
e([
|
|
150
|
+
e([g({
|
|
166
151
|
type: String,
|
|
167
152
|
reflect: !0
|
|
168
|
-
})],
|
|
153
|
+
})], v.prototype, "placement", null), e([g({
|
|
169
154
|
type: Number,
|
|
170
155
|
attribute: "show-delay"
|
|
171
|
-
})],
|
|
156
|
+
})], v.prototype, "showDelay", null), e([g({
|
|
172
157
|
type: Number,
|
|
173
158
|
attribute: "hide-delay"
|
|
174
|
-
})],
|
|
159
|
+
})], v.prototype, "hideDelay", null), e([g({
|
|
175
160
|
type: Boolean,
|
|
176
161
|
reflect: !0
|
|
177
|
-
})],
|
|
162
|
+
})], v.prototype, "disabled", void 0), e([g({ type: Number })], v.prototype, "offset", null), e([g({ type: String })], v.prototype, "content", void 0), e([g({
|
|
178
163
|
type: Boolean,
|
|
179
164
|
reflect: !0
|
|
180
|
-
})],
|
|
165
|
+
})], v.prototype, "open", void 0), e([g({
|
|
181
166
|
type: Boolean,
|
|
182
167
|
reflect: !0
|
|
183
|
-
})],
|
|
168
|
+
})], v.prototype, "portal", void 0), e([g({ attribute: !1 })], v.prototype, "overlayContainer", void 0), v = e([h("web-ui-tooltip")], v);
|
|
184
169
|
//#endregion
|
|
185
|
-
export {
|
|
170
|
+
export { v as WebUiTooltip };
|
|
186
171
|
|
|
187
172
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/tooltip/index.ts"],"sourcesContent":["import type { Placement } from '@floating-ui/dom'\nimport { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport glass from '@/assets/glass.css?inline'\nimport overlayMotion from '@/assets/overlay-motion.css?inline'\nimport { UserChangeController } from '@/shared/events/user-change'\nimport { normalizeLiteral, normalizeNumber } from '@/shared/normalize'\nimport { defineAnchoredPanel } from '@/shared/overlay/anchored-panel'\nimport { defineOverlayPortal } from '@/shared/overlay/portal'\nimport type { OverlayContainer, OverlayPortal } from '@/shared/overlay/portal'\n\nimport style from './style.css?inline'\n\nconst ALLOWED_PLACEMENTS = [\n 'top',\n 'top-start',\n 'top-end',\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n 'left',\n 'left-start',\n 'left-end',\n 'right',\n 'right-start',\n 'right-end'\n] as const\n\nlet visibleTooltipCount = 0\n\n@customElement('web-ui-tooltip')\nexport class WebUiTooltip extends LitElement {\n static override styles = [unsafeCSS(glass), unsafeCSS(overlayMotion), unsafeCSS(style)]\n\n @property({ type: String, reflect: true })\n get placement(): Placement {\n return this._placement\n }\n set placement(v: string) {\n const old = this._placement\n this._placement = normalizeLiteral(v, ALLOWED_PLACEMENTS, 'top')\n this.requestUpdate('placement', old)\n }\n private _placement: Placement = 'top'\n\n @property({ type: Number, attribute: 'show-delay' })\n get showDelay(): number {\n return this._showDelay\n }\n set showDelay(v: number) {\n const old = this._showDelay\n this._showDelay = normalizeNumber(v, 0, 5000, 200)\n this.requestUpdate('showDelay', old)\n }\n private _showDelay = 200\n\n @property({ type: Number, attribute: 'hide-delay' })\n get hideDelay(): number {\n return this._hideDelay\n }\n set hideDelay(v: number) {\n const old = this._hideDelay\n this._hideDelay = normalizeNumber(v, 0, 5000, 100)\n this.requestUpdate('hideDelay', old)\n }\n private _hideDelay = 100\n\n @property({ type: Boolean, reflect: true }) disabled = false\n\n @property({ type: Number })\n get offset(): number {\n return this._offset\n }\n set offset(v: number) {\n const old = this._offset\n this._offset = normalizeNumber(v, 0, 100, 6)\n this.requestUpdate('offset', old)\n }\n private _offset = 6\n\n @property({ type: String }) content = ''\n\n @property({ type: Boolean, reflect: true }) open = false\n @property({ type: Boolean, reflect: true }) portal = false\n @property({ attribute: false }) overlayContainer?: OverlayContainer\n\n private _showTimer?: ReturnType<typeof setTimeout>\n private _hideTimer?: ReturnType<typeof setTimeout>\n private _isCountedVisible = false\n private readonly _userOpenChange = new UserChangeController()\n private _shouldOpenInstantly = true\n private _portal?: OverlayPortal\n private readonly _panel = defineAnchoredPanel().make({\n getAnchor: () => this.shadowRoot?.querySelector<HTMLElement>('.tooltip-trigger') ?? null,\n getLocalPanel: () => this.shadowRoot?.querySelector<HTMLElement>('.tooltip-panel') ?? null,\n getPositioning: () => ({\n placement: this.placement,\n offset: this.offset,\n strategy: this.portal ? 'fixed' : 'absolute'\n }),\n isPortal: () => this.portal,\n createPortal: () => this._createPortal()\n })\n\n get isOpen(): boolean {\n return this.open\n }\n\n override connectedCallback() {\n super.connectedCallback()\n this.addEventListener('pointerenter', this._onPointerEnter)\n this.addEventListener('pointerleave', this._onPointerLeave)\n this.addEventListener('focusin', this._onFocusIn)\n this.addEventListener('focusout', this._onFocusOut)\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback()\n this.removeEventListener('pointerenter', this._onPointerEnter)\n this.removeEventListener('pointerleave', this._onPointerLeave)\n this.removeEventListener('focusin', this._onFocusIn)\n this.removeEventListener('focusout', this._onFocusOut)\n clearTimeout(this._showTimer)\n clearTimeout(this._hideTimer)\n this._syncVisibleTooltipCount(false)\n this._panel.dispose()\n }\n\n override firstUpdated() {\n if (this.open) {\n this._openOverlay(this._shouldOpenInstantly)\n this._shouldOpenInstantly = true\n }\n }\n\n protected override updated(changed: Map<string, unknown>) {\n if (changed.has('portal') || changed.has('overlayContainer')) {\n requestAnimationFrame(() => this._reconfigureOverlay())\n } else if (changed.has('placement') || changed.has('offset'))\n requestAnimationFrame(() => this._panel.updatePosition())\n\n if (changed.has('open')) {\n this._syncVisibleTooltipCount(this.open)\n if (this.open) {\n this._openOverlay(this._shouldOpenInstantly)\n this._shouldOpenInstantly = true\n } else {\n void this._closeOverlay()\n }\n if (this._userOpenChange.consume()) this._dispatchChange(this.open)\n }\n if (changed.has('content')) this._syncPortalContent()\n }\n\n private _onPointerEnter = (e: PointerEvent) => {\n if (e.pointerType === 'touch') return\n if (this.disabled) return\n clearTimeout(this._hideTimer)\n this._showTimer = setTimeout(() => this._show(), visibleTooltipCount > 0 ? 0 : this.showDelay)\n }\n\n private _onPointerLeave = (e: PointerEvent) => {\n if (e.pointerType === 'touch') return\n if (this.disabled) return\n clearTimeout(this._showTimer)\n this._hideTimer = setTimeout(() => this._hide(), this.hideDelay)\n }\n\n private _onFocusIn = (event: FocusEvent) => {\n if (this.disabled) return\n if (!(event.target instanceof Element) || !event.target.matches(':focus-visible')) return\n\n clearTimeout(this._hideTimer)\n this._show(true)\n }\n\n private _onFocusOut = () => {\n if (this.disabled) return\n clearTimeout(this._showTimer)\n this._hide()\n }\n\n private _show(isInstant = false) {\n if (this.open) return\n this._shouldOpenInstantly = isInstant\n this._userOpenChange.mark()\n this.open = true\n }\n\n private _hide() {\n if (!this.open) return\n this._userOpenChange.mark()\n this.open = false\n }\n\n private _openOverlay(isInstant = false) {\n this._panel.open(isInstant)\n }\n\n private _createPortal(): OverlayPortal {\n const portal = defineOverlayPortal().make({\n container: this.overlayContainer,\n target: this,\n style: `${glass}\\n${overlayMotion}\\n${style}`,\n className: 'tooltip-panel portal wui-glass wui-floating-panel',\n onContentChange: mutations => {\n // Vue 等框架在打开期物理删除已迁移节点:从追踪列表摘除,否则关闭恢复时\n // 会把已删除节点复活回宿主 light DOM。面板内部的移动(重排 insertBefore)\n // 在同一 mutation record 中同时出现在 removed/added,不属于删除,须排除。\n const addedNodes = new Set(mutations.flatMap(mutation => [...mutation.addedNodes]))\n const removedNodes = mutations\n .flatMap(mutation => [...mutation.removedNodes])\n .filter(node => !addedNodes.has(node))\n if (removedNodes.length) this._portal?.removeContent(removedNodes)\n },\n // 打开期实时渲染:新增的 slot=content 元素实时迁入面板(注释锚点无法携带\n // slot 属性,天然留在宿主作为框架 patch 的插入基准)。\n migrateAddedNodes: addedNodes =>\n addedNodes.filter(node => node instanceof Element && node.getAttribute('slot') === 'content')\n })\n this._portal = portal\n if (this.content) {\n const text = document.createElement('span')\n text.className = 'tooltip-text'\n text.textContent = this.content\n portal.panel.append(text)\n } else portal.moveContent(Array.from(this.querySelectorAll('[slot=\"content\"]')))\n portal.panel.setAttribute('role', 'tooltip')\n return portal\n }\n\n private async _closeOverlay() {\n await this._panel.close(() => this.open)\n }\n\n private _reconfigureOverlay() {\n this._panel.reconfigure(this.open)\n }\n\n private _syncPortalContent() {\n if (!this.portal || !this.open) return\n const panel = this._panel.getPanel()\n if (!panel) return\n const text = panel.querySelector<HTMLElement>('.tooltip-text')\n if (text) {\n text.textContent = this.content\n return\n }\n if (!this.content) return\n panel.replaceChildren()\n const nextText = document.createElement('span')\n nextText.className = 'tooltip-text'\n nextText.textContent = this.content\n panel.append(nextText)\n }\n\n private _dispatchChange(open: boolean) {\n this.dispatchEvent(\n new CustomEvent('open-change', {\n detail: { open },\n bubbles: true,\n composed: true\n })\n )\n }\n\n private _syncVisibleTooltipCount(isVisible: boolean) {\n if (isVisible && !this._isCountedVisible) {\n visibleTooltipCount += 1\n this._isCountedVisible = true\n } else if (!isVisible && this._isCountedVisible) {\n visibleTooltipCount = Math.max(0, visibleTooltipCount - 1)\n this._isCountedVisible = false\n }\n }\n\n override render() {\n return html`\n <div class=\"tooltip-anchor\">\n <div class=\"tooltip-trigger\"><slot></slot></div>\n <div class=\"tooltip-panel wui-glass wui-floating-panel\" hidden role=\"tooltip\">\n ${this.content ? html`<span class=\"tooltip-text\">${this.content}</span>` : html`<slot name=\"content\"></slot>`}\n </div>\n </div>\n `\n }\n\n declare readonly $events: {\n 'open-change': CustomEvent<{ open: boolean }>\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-tooltip': WebUiTooltip\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/tooltip/index.ts"],"sourcesContent":["import type { Placement } from '@floating-ui/dom'\nimport { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property } from 'lit/decorators.js'\n\nimport glass from '@/assets/glass.css?inline'\nimport overlayMotion from '@/assets/overlay-motion.css?inline'\nimport { UserChangeController } from '@/shared/events/user-change'\nimport { normalizeLiteral, normalizeNumber } from '@/shared/normalize'\nimport { dispatchOpenChangeEvent } from '@/shared/open-state'\nimport { defineAnchoredPanel } from '@/shared/overlay/anchored-panel'\nimport { defineOverlayLifecycle } from '@/shared/overlay/lifecycle'\nimport { FLOATING_PLACEMENTS } from '@/shared/overlay/placement-props'\nimport { defineOverlayPortal } from '@/shared/overlay/portal'\nimport type { OverlayContainer, OverlayPortal } from '@/shared/overlay/portal'\n\nimport style from './style.css?inline'\n\nlet visibleTooltipCount = 0\n\n@customElement('web-ui-tooltip')\nexport class WebUiTooltip extends LitElement {\n static override styles = [unsafeCSS(glass), unsafeCSS(overlayMotion), unsafeCSS(style)]\n\n @property({ type: String, reflect: true })\n get placement(): Placement {\n return this._placement\n }\n set placement(v: string) {\n const old = this._placement\n this._placement = normalizeLiteral(v, FLOATING_PLACEMENTS, 'top')\n this.requestUpdate('placement', old)\n }\n private _placement: Placement = 'top'\n\n @property({ type: Number, attribute: 'show-delay' })\n get showDelay(): number {\n return this._showDelay\n }\n set showDelay(v: number) {\n const old = this._showDelay\n this._showDelay = normalizeNumber(v, 0, 5000, 200)\n this.requestUpdate('showDelay', old)\n }\n private _showDelay = 200\n\n @property({ type: Number, attribute: 'hide-delay' })\n get hideDelay(): number {\n return this._hideDelay\n }\n set hideDelay(v: number) {\n const old = this._hideDelay\n this._hideDelay = normalizeNumber(v, 0, 5000, 100)\n this.requestUpdate('hideDelay', old)\n }\n private _hideDelay = 100\n\n @property({ type: Boolean, reflect: true }) disabled = false\n\n @property({ type: Number })\n get offset(): number {\n return this._offset\n }\n set offset(v: number) {\n const old = this._offset\n this._offset = normalizeNumber(v, 0, 100, 6)\n this.requestUpdate('offset', old)\n }\n private _offset = 6\n\n @property({ type: String }) content = ''\n\n @property({ type: Boolean, reflect: true }) open = false\n @property({ type: Boolean, reflect: true }) portal = false\n @property({ attribute: false }) overlayContainer?: OverlayContainer\n\n private _showTimer?: ReturnType<typeof setTimeout>\n private _hideTimer?: ReturnType<typeof setTimeout>\n private _isCountedVisible = false\n private readonly _userOpenChange = new UserChangeController()\n private _shouldOpenInstantly = true\n private _portal?: OverlayPortal\n private readonly _lifecycle = defineOverlayLifecycle().make({\n isConnected: () => this.isConnected,\n isOpen: () => this.open\n })\n private readonly _panel = defineAnchoredPanel().make({\n getAnchor: () => this.shadowRoot?.querySelector<HTMLElement>('.tooltip-trigger') ?? null,\n getLocalPanel: () => this.shadowRoot?.querySelector<HTMLElement>('.tooltip-panel') ?? null,\n getPositioning: () => ({\n placement: this.placement,\n offset: this.offset,\n strategy: this.portal ? 'fixed' : 'absolute'\n }),\n isPortal: () => this.portal,\n createPortal: () => this._createPortal()\n })\n\n get isOpen(): boolean {\n return this.open\n }\n\n override connectedCallback() {\n super.connectedCallback()\n this._lifecycle.resume()\n this.addEventListener('pointerenter', this._onPointerEnter)\n this.addEventListener('pointerleave', this._onPointerLeave)\n this.addEventListener('focusin', this._onFocusIn)\n this.addEventListener('focusout', this._onFocusOut)\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback()\n this.removeEventListener('pointerenter', this._onPointerEnter)\n this.removeEventListener('pointerleave', this._onPointerLeave)\n this.removeEventListener('focusin', this._onFocusIn)\n this.removeEventListener('focusout', this._onFocusOut)\n clearTimeout(this._showTimer)\n clearTimeout(this._hideTimer)\n this._lifecycle.dispose()\n this._syncVisibleTooltipCount(false)\n this._panel.dispose()\n }\n\n override firstUpdated() {\n if (this.open) {\n this._openOverlay(this._shouldOpenInstantly)\n this._shouldOpenInstantly = true\n }\n }\n\n protected override updated(changed: Map<string, unknown>) {\n if (changed.has('portal') || changed.has('overlayContainer')) {\n // 同帧 open + reconfigure 可能重复建事务;invalidate 保证 reconfigure 是当前唯一帧回调。\n this._lifecycle.invalidate()\n this._lifecycle.scheduleFrame(() => this._reconfigureOverlay())\n } else if (changed.has('placement') || changed.has('offset'))\n requestAnimationFrame(() => this._panel.updatePosition())\n\n if (changed.has('open')) {\n this._syncVisibleTooltipCount(this.open)\n if (this.open) {\n this._openOverlay(this._shouldOpenInstantly)\n this._shouldOpenInstantly = true\n } else {\n this._lifecycle.invalidate()\n void this._closeOverlay()\n }\n if (this._userOpenChange.consume()) this._dispatchChange(this.open)\n }\n if (changed.has('content')) this._syncPortalContent()\n }\n\n private _onPointerEnter = (e: PointerEvent) => {\n if (e.pointerType === 'touch') return\n if (this.disabled) return\n clearTimeout(this._hideTimer)\n this._showTimer = setTimeout(() => this._show(), visibleTooltipCount > 0 ? 0 : this.showDelay)\n }\n\n private _onPointerLeave = (e: PointerEvent) => {\n if (e.pointerType === 'touch') return\n if (this.disabled) return\n clearTimeout(this._showTimer)\n this._hideTimer = setTimeout(() => this._hide(), this.hideDelay)\n }\n\n private _onFocusIn = (event: FocusEvent) => {\n if (this.disabled) return\n if (!(event.target instanceof Element) || !event.target.matches(':focus-visible')) return\n\n clearTimeout(this._hideTimer)\n this._show(true)\n }\n\n private _onFocusOut = () => {\n if (this.disabled) return\n clearTimeout(this._showTimer)\n this._hide()\n }\n\n private _show(isInstant = false) {\n if (this.open) return\n this._shouldOpenInstantly = isInstant\n this._userOpenChange.mark()\n this.open = true\n }\n\n private _hide() {\n if (!this.open) return\n this._userOpenChange.mark()\n this.open = false\n }\n\n private _openOverlay(isInstant = false) {\n this._panel.open(isInstant)\n }\n\n private _createPortal(): OverlayPortal {\n const portal = defineOverlayPortal().make({\n container: this.overlayContainer,\n target: this,\n style: `${glass}\\n${overlayMotion}\\n${style}`,\n className: 'tooltip-panel portal wui-glass wui-floating-panel',\n // 已迁移节点被框架删除后的解除追踪是 portal 内建默认行为,这里无需 onContentChange\n // 打开期实时渲染:新增的 slot=content 元素实时迁入面板(注释锚点无法携带\n // slot 属性,天然留在宿主作为框架 patch 的插入基准)。\n migrateAddedNodes: addedNodes =>\n addedNodes.filter(node => node instanceof Element && node.getAttribute('slot') === 'content')\n })\n this._portal = portal\n if (this.content) {\n const text = document.createElement('span')\n text.className = 'tooltip-text'\n text.textContent = this.content\n portal.panel.append(text)\n } else portal.moveContent(Array.from(this.querySelectorAll('[slot=\"content\"]')))\n portal.panel.setAttribute('role', 'tooltip')\n return portal\n }\n\n private async _closeOverlay() {\n await this._panel.close(() => this.open)\n }\n\n private _reconfigureOverlay() {\n this._panel.reconfigure(this.open)\n }\n\n private _syncPortalContent() {\n if (!this.portal || !this.open) return\n const localPanel = this._panel.getPanel()\n if (!localPanel) return\n const panel = this._portal?.panel ?? localPanel\n const text = localPanel.querySelector<HTMLElement>('.tooltip-text')\n if (text) {\n text.textContent = this.content\n return\n }\n if (!this.content) return\n panel.replaceChildren()\n const nextText = document.createElement('span')\n nextText.className = 'tooltip-text'\n nextText.textContent = this.content\n panel.append(nextText)\n }\n\n private _dispatchChange(open: boolean) {\n dispatchOpenChangeEvent(this, open)\n }\n\n private _syncVisibleTooltipCount(isVisible: boolean) {\n if (isVisible && !this._isCountedVisible) {\n visibleTooltipCount += 1\n this._isCountedVisible = true\n } else if (!isVisible && this._isCountedVisible) {\n visibleTooltipCount = Math.max(0, visibleTooltipCount - 1)\n this._isCountedVisible = false\n }\n }\n\n override render() {\n return html`\n <div class=\"tooltip-anchor\">\n <div class=\"tooltip-trigger\"><slot></slot></div>\n <div class=\"tooltip-panel wui-floating-panel wui-glass\" hidden role=\"tooltip\">\n ${this.content ? html`<span class=\"tooltip-text\">${this.content}</span>` : html`<slot name=\"content\"></slot>`}\n </div>\n </div>\n `\n }\n\n declare readonly $events: {\n 'open-change': CustomEvent<{ open: boolean }>\n }\n}\n\ndeclare global {\n interface HTMLElementTagNameMap {\n 'web-ui-tooltip': WebUiTooltip\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/components/tooltip/style.css?inline
|
|
2
|
-
var e = "*,:before,:after{box-sizing:border-box}:host,.tooltip-trigger{display:inline-flex}.tooltip-anchor{display:inline-flex;position:relative}.tooltip-panel{--wui-internal-glass-shadow:var(--wui-shadow-panel,0 3px 9px #00000045);--wui-glass-corner-radius:
|
|
2
|
+
var e = "*,:before,:after{box-sizing:border-box}:host,.tooltip-trigger{display:inline-flex}.tooltip-anchor{display:inline-flex;position:relative}.tooltip-panel{--wui-internal-glass-shadow:var(--wui-shadow-panel,0 3px 9px #00000045);--wui-glass-corner-radius:var(--wui-radius-menu,18px);pointer-events:none;z-index:var(--wui-layer-inline-overlay,1);box-sizing:border-box;width:max-content;max-width:var(--wui-tooltip-max-width,240px);border-radius:var(--wui-radius-menu,18px);font-size:var(--wui-tooltip-font-size,13px);color:var(--wui-color-text,#1b1b1b);background-color:var(--wui-color-surface-menu,#f6f6f6d1);padding:6px 10px;position:absolute;top:-9999px;left:-9999px}.tooltip-panel.portal{z-index:var(--wui-layer-menu,100);position:fixed}.tooltip-panel.hidden{display:none}.tooltip-text{overflow-wrap:break-word;white-space:normal;display:block}:host([portal]) .tooltip-panel{display:none}";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { e as default };
|
|
5
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.js","names":[],"sources":["../../../src/components/tooltip/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: inline-flex;\n}\n\n.tooltip-trigger {\n display: inline-flex;\n}\n\n.tooltip-anchor {\n position: relative;\n display: inline-flex;\n}\n\n.tooltip-panel {\n --wui-internal-glass-shadow: var(--wui-shadow-panel, 0 3px 9px rgb(0 0 0 / 0.27));\n --wui-glass-corner-radius:
|
|
1
|
+
{"version":3,"file":"style.js","names":[],"sources":["../../../src/components/tooltip/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: inline-flex;\n}\n\n.tooltip-trigger {\n display: inline-flex;\n}\n\n.tooltip-anchor {\n position: relative;\n display: inline-flex;\n}\n\n.tooltip-panel {\n --wui-internal-glass-shadow: var(--wui-shadow-panel, 0 3px 9px rgb(0 0 0 / 0.27));\n --wui-glass-corner-radius: var(--wui-radius-menu, 18px);\n\n pointer-events: none;\n\n position: absolute;\n z-index: var(--wui-layer-inline-overlay, 1);\n top: -9999px;\n left: -9999px;\n\n box-sizing: border-box;\n width: max-content;\n max-width: var(--wui-tooltip-max-width, 240px);\n padding: 6px 10px;\n border-radius: var(--wui-radius-menu, 18px);\n\n font-size: var(--wui-tooltip-font-size, 13px);\n color: var(--wui-color-text, #1b1b1b);\n\n /* 玻璃背景:wui-glass 在面板自身,这里覆盖其默认玻璃底为菜单表面色 */\n background-color: var(--wui-color-surface-menu, rgb(246 246 246 / 0.82));\n}\n\n.tooltip-panel.portal {\n position: fixed;\n z-index: var(--wui-layer-menu, 100);\n}\n\n.tooltip-panel.hidden {\n display: none;\n}\n\n.tooltip-text {\n display: block;\n overflow-wrap: break-word;\n white-space: normal;\n}\n\n:host([portal]) .tooltip-panel {\n display: none;\n}\n"],"mappings":""}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//#region src/icons/generated/radix-icons-reset.ts
|
|
2
|
+
var e = {
|
|
3
|
+
body: "<path fill=\"currentColor\" d=\"M4.225 2.082a.5.5 0 0 1 .693.694l-.065.078L3.707 4H9a4.5 4.5 0 0 1 0 9H5a.5.5 0 1 1 0-1h4a3.5 3.5 0 1 0 0-7H3.707l1.146 1.147l.065.078a.5.5 0 0 1-.693.693l-.079-.064l-2-2a.5.5 0 0 1 0-.707l2-2z\"/>",
|
|
4
|
+
width: 15,
|
|
5
|
+
height: 15
|
|
6
|
+
};
|
|
7
|
+
//#endregion
|
|
8
|
+
export { e as default };
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=radix-icons-reset.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"radix-icons-reset.js","names":[],"sources":["../../../src/icons/generated/radix-icons-reset.ts"],"sourcesContent":["import type { IconifyIcon } from '@iconify/types'\n\nexport default {\n body: '<path fill=\"currentColor\" d=\"M4.225 2.082a.5.5 0 0 1 .693.694l-.065.078L3.707 4H9a4.5 4.5 0 0 1 0 9H5a.5.5 0 1 1 0-1h4a3.5 3.5 0 1 0 0-7H3.707l1.146 1.147l.065.078a.5.5 0 0 1-.693.693l-.079-.064l-2-2a.5.5 0 0 1 0-.707l2-2z\"/>',\n width: 15,\n height: 15\n} satisfies IconifyIcon\n"],"mappings":";AAEA,IAAA,IAAe;CACb,MAAM;CACN,OAAO;CACP,QAAQ;AACV"}
|
package/dist/icons/index.d.ts
CHANGED
|
@@ -64,3 +64,4 @@ export { default as lucideEllipsisVertical } from './generated/lucide-ellipsis-v
|
|
|
64
64
|
export { default as heroiconsBarsArrowDown16Solid } from './generated/heroicons-bars-arrow-down-16-solid';
|
|
65
65
|
export { default as heroiconsBarsArrowUp16Solid } from './generated/heroicons-bars-arrow-up-16-solid';
|
|
66
66
|
export { default as lucideListRestart } from './generated/lucide-list-restart';
|
|
67
|
+
export { default as radixIconsReset } from './generated/radix-icons-reset';
|
package/dist/icons/index.js
CHANGED
|
@@ -64,4 +64,5 @@ import ce from "./generated/lucide-ellipsis-vertical.js";
|
|
|
64
64
|
import le from "./generated/heroicons-bars-arrow-down-16-solid.js";
|
|
65
65
|
import ue from "./generated/heroicons-bars-arrow-up-16-solid.js";
|
|
66
66
|
import de from "./generated/lucide-list-restart.js";
|
|
67
|
-
|
|
67
|
+
import fe from "./generated/radix-icons-reset.js";
|
|
68
|
+
export { le as heroiconsBarsArrowDown16Solid, ue as heroiconsBarsArrowUp16Solid, k as heroiconsCheck16Solid, j as heroiconsXMark16Solid, w as jamCloseCircleF, r as lucideArrowDownToLine, n as lucideArrowUpToLine, P as lucideBell, T as lucideCheck, s as lucideChevronDown, i as lucideChevronLeft, a as lucideChevronRight, o as lucideChevronUp, O as lucideCircleAlert, te as lucideClapperboard, h as lucideClipboardPaste, se as lucideCode, m as lucideCopy, y as lucideDownload, ce as lucideEllipsisVertical, B as lucideExternalLink, ee as lucideEye, f as lucideFile, V as lucideFileText, H as lucideFilm, p as lucideFolder, U as lucideFolderOpen, L as lucideGlobe, ne as lucideHeadphones, N as lucideHeart, I as lucideImage, e as lucideInbox, E as lucideInfo, W as lucideLayoutGrid, $ as lucideLink, ae as lucideListFilter, de as lucideListRestart, t as lucideLoaderCircle, F as lucideMail, l as lucideMinus, G as lucideMusic, K as lucidePackage, re as lucidePenLine, q as lucidePencil, ie as lucidePlay, c as lucidePlus, _ as lucidePrinter, S as lucideRedo2, J as lucideRefreshCw, C as lucideScissors, u as lucideSearch, v as lucideSettings, Q as lucideSlidersHorizontal, M as lucideStar, Y as lucideTag, X as lucideTags, g as lucideTrash2, D as lucideTriangleAlert, x as lucideUndo2, b as lucideUpload, A as lucideUser, Z as lucideWrench, d as lucideX, z as oouiClose, R as radixIconsPanelLeftMinimized, fe as radixIconsReset, oe as tablerSortAscendingLetters };
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
//#region src/shared/focus/pointer-focus.ts
|
|
2
|
+
var e = !1, t = 0, n = !1;
|
|
3
|
+
function r() {
|
|
4
|
+
n = !0, t = Date.now();
|
|
5
|
+
}
|
|
6
|
+
function i() {
|
|
7
|
+
n = !1, t = 0;
|
|
8
|
+
}
|
|
9
|
+
function a() {
|
|
10
|
+
r();
|
|
11
|
+
}
|
|
12
|
+
function o(e) {
|
|
13
|
+
(e.key === "Tab" || e.key.startsWith("Arrow") || e.key === "Enter" || e.key === " " || e.key === "Home" || e.key === "End" || e.key === "PageUp" || e.key === "PageDown") && i();
|
|
14
|
+
}
|
|
15
|
+
function s(e) {
|
|
16
|
+
let r = e.target;
|
|
17
|
+
if (r instanceof HTMLElement) {
|
|
18
|
+
if (n && Date.now() - t <= 1e3) {
|
|
19
|
+
r.dataset.wuiPointerFocus = "true";
|
|
20
|
+
let e = r.getRootNode();
|
|
21
|
+
e instanceof ShadowRoot && e.host instanceof HTMLElement && (e.host.dataset.wuiPointerFocus = "true");
|
|
22
|
+
} else {
|
|
23
|
+
r.removeAttribute("data-wui-pointer-focus");
|
|
24
|
+
let e = r.getRootNode();
|
|
25
|
+
e instanceof ShadowRoot && e.host instanceof HTMLElement && e.host.removeAttribute("data-wui-pointer-focus");
|
|
26
|
+
}
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
function c() {
|
|
30
|
+
return typeof window > "u" || typeof document > "u" || e ? () => {} : (e = !0, document.addEventListener("pointerdown", a, !0), document.addEventListener("keydown", o, !0), document.addEventListener("focusin", s, !0), () => {
|
|
31
|
+
e = !1, document.removeEventListener("pointerdown", a, !0), document.removeEventListener("keydown", o, !0), document.removeEventListener("focusin", s, !0);
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
//#endregion
|
|
35
|
+
export { c as installPointerFocusSuppression };
|
|
36
|
+
|
|
37
|
+
//# sourceMappingURL=pointer-focus.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pointer-focus.js","names":[],"sources":["../../../src/shared/focus/pointer-focus.ts"],"sourcesContent":["/**\n * 指针输入期间的 focus ring 抑制。\n *\n * Safari 等浏览器在 pointer 点击后仍可能让 `:focus-visible` 命中新聚焦元素,\n * 导致点击打开 drawer/dialog 时内部按钮自动出现 focus ring。这里记录最近一次\n * 指针输入,并在 focusin 时给聚焦元素打 `data-wui-pointer-focus` 标记;组件样式\n * 用该标记将 focus ring 透明化,键盘导航(Tab/方向键等)会清除标记并恢复可见。\n */\n\nconst POINTER_FOCUS_WINDOW_MS = 1000\n\nlet installed = false\nlet lastPointerAt = 0\nlet pointerActive = false\n\nfunction markPointer() {\n pointerActive = true\n lastPointerAt = Date.now()\n}\n\nfunction markKeyboard() {\n pointerActive = false\n lastPointerAt = 0\n}\n\nfunction onPointerDown() {\n markPointer()\n}\n\nfunction onKeyDown(event: KeyboardEvent) {\n if (\n event.key === 'Tab' ||\n event.key.startsWith('Arrow') ||\n event.key === 'Enter' ||\n event.key === ' ' ||\n event.key === 'Home' ||\n event.key === 'End' ||\n event.key === 'PageUp' ||\n event.key === 'PageDown'\n ) {\n markKeyboard()\n }\n}\n\nfunction onFocusIn(event: FocusEvent) {\n const target = event.target\n if (!(target instanceof HTMLElement)) return\n\n if (pointerActive && Date.now() - lastPointerAt <= POINTER_FOCUS_WINDOW_MS) {\n target.dataset.wuiPointerFocus = 'true'\n const root = target.getRootNode()\n if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {\n root.host.dataset.wuiPointerFocus = 'true'\n }\n } else {\n target.removeAttribute('data-wui-pointer-focus')\n const root = target.getRootNode()\n if (root instanceof ShadowRoot && root.host instanceof HTMLElement) {\n root.host.removeAttribute('data-wui-pointer-focus')\n }\n }\n}\n\n/**\n * 安装一次全局 pointer/keyboard/focus 监听。重复调用幂等。\n */\nexport function installPointerFocusSuppression(): () => void {\n if (typeof window === 'undefined' || typeof document === 'undefined') return () => {}\n if (installed) return () => {}\n installed = true\n\n // 只用 document 一份 capture 监听:shadow DOM 内的 pointerdown/keydown/focusin\n // 都会 composed 冒泡到 document,避免 window/document 双份导致同一事件处理两次。\n document.addEventListener('pointerdown', onPointerDown, true)\n document.addEventListener('keydown', onKeyDown, true)\n document.addEventListener('focusin', onFocusIn, true)\n\n return () => {\n installed = false\n document.removeEventListener('pointerdown', onPointerDown, true)\n document.removeEventListener('keydown', onKeyDown, true)\n document.removeEventListener('focusin', onFocusIn, true)\n }\n}\n\n/**\n * 测试辅助:清除指针输入状态,避免用例间泄漏。\n */\nexport function resetPointerFocusState(): void {\n markKeyboard()\n}\n"],"mappings":";AASA,IAEI,IAAY,IACZ,IAAgB,GAChB,IAAgB;AAEpB,SAAS,IAAc;CAErB,AADA,IAAgB,IAChB,IAAgB,KAAK,IAAI;AAC3B;AAEA,SAAS,IAAe;CAEtB,AADA,IAAgB,IAChB,IAAgB;AAClB;AAEA,SAAS,IAAgB;CACvB,EAAY;AACd;AAEA,SAAS,EAAU,GAAsB;CACvC,CACE,EAAM,QAAQ,SACd,EAAM,IAAI,WAAW,OAAO,KAC5B,EAAM,QAAQ,WACd,EAAM,QAAQ,OACd,EAAM,QAAQ,UACd,EAAM,QAAQ,SACd,EAAM,QAAQ,YACd,EAAM,QAAQ,eAEd,EAAa;AAEjB;AAEA,SAAS,EAAU,GAAmB;CACpC,IAAM,IAAS,EAAM;CACf,iBAAkB,aAExB;MAAI,KAAiB,KAAK,IAAI,IAAI,KAAiB,KAAyB;GAC1E,EAAO,QAAQ,kBAAkB;GACjC,IAAM,IAAO,EAAO,YAAY;GAChC,AAAI,aAAgB,cAAc,EAAK,gBAAgB,gBACrD,EAAK,KAAK,QAAQ,kBAAkB;EAExC,OAAO;GACL,EAAO,gBAAgB,wBAAwB;GAC/C,IAAM,IAAO,EAAO,YAAY;GAChC,AAAI,aAAgB,cAAc,EAAK,gBAAgB,eACrD,EAAK,KAAK,gBAAgB,wBAAwB;EAEtD;;AACF;AAKA,SAAgB,IAA6C;CAW3D,OAVI,OAAO,SAAW,OAAe,OAAO,WAAa,OACrD,UAAwB,CAAC,KAC7B,IAAY,IAIZ,SAAS,iBAAiB,eAAe,GAAe,EAAI,GAC5D,SAAS,iBAAiB,WAAW,GAAW,EAAI,GACpD,SAAS,iBAAiB,WAAW,GAAW,EAAI,SAEvC;EAIX,AAHA,IAAY,IACZ,SAAS,oBAAoB,eAAe,GAAe,EAAI,GAC/D,SAAS,oBAAoB,WAAW,GAAW,EAAI,GACvD,SAAS,oBAAoB,WAAW,GAAW,EAAI;CACzD;AACF"}
|
|
@@ -1,6 +1,16 @@
|
|
|
1
1
|
import { definePlugin as e } from "@greypan/js-kit";
|
|
2
2
|
//#region src/shared/form-association/index.ts
|
|
3
|
-
function t(t) {
|
|
3
|
+
function t(e, t, n, r = !1) {
|
|
4
|
+
if (typeof e.setValidity != "function") return;
|
|
5
|
+
if (r || t.validity.valid) {
|
|
6
|
+
e.setValidity({});
|
|
7
|
+
return;
|
|
8
|
+
}
|
|
9
|
+
let i = {};
|
|
10
|
+
for (let e of n) t.validity[e] && (i[e] = !0);
|
|
11
|
+
e.setValidity(i, t.validationMessage, t);
|
|
12
|
+
}
|
|
13
|
+
function n(t) {
|
|
4
14
|
return e(() => {
|
|
5
15
|
let e, n, r = !1, i = !1, a = t.copyState ?? ((e) => e), o = () => {
|
|
6
16
|
e && (e.setFormValue?.(t.getFormValue(), t.getFormState()), t.syncValidity?.(e));
|
|
@@ -24,9 +34,26 @@ function t(t) {
|
|
|
24
34
|
};
|
|
25
35
|
});
|
|
26
36
|
}
|
|
27
|
-
|
|
37
|
+
function r(e) {
|
|
38
|
+
class t extends e {
|
|
39
|
+
static {
|
|
40
|
+
this.formAssociated = !0;
|
|
41
|
+
}
|
|
42
|
+
formResetCallback() {
|
|
43
|
+
this.__formLifecycleProvider?.().reset();
|
|
44
|
+
}
|
|
45
|
+
formDisabledCallback(e) {
|
|
46
|
+
this.__formLifecycleProvider?.().setDisabled(e);
|
|
47
|
+
}
|
|
48
|
+
formStateRestoreCallback(e) {
|
|
49
|
+
this.__formLifecycleProvider?.().restore(e);
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
return t;
|
|
53
|
+
}
|
|
54
|
+
var i = class {
|
|
28
55
|
constructor(e, t) {
|
|
29
|
-
this.host = e, this.lifecycle = t, e.addController(this);
|
|
56
|
+
this.host = e, this.lifecycle = t, e.addController(this), e.__formLifecycleProvider = () => t;
|
|
30
57
|
}
|
|
31
58
|
hostConnected() {
|
|
32
59
|
this.lifecycle.connect();
|
|
@@ -36,6 +63,6 @@ var n = class {
|
|
|
36
63
|
}
|
|
37
64
|
};
|
|
38
65
|
//#endregion
|
|
39
|
-
export {
|
|
66
|
+
export { r as FormAssociated, i as FormAssociationController, n as defineFormAssociation, t as forwardInputValidity };
|
|
40
67
|
|
|
41
68
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/shared/form-association/index.ts"],"sourcesContent":["import { definePlugin } from '@greypan/js-kit'\nimport type { ReactiveController, ReactiveControllerHost } from 'lit'\n\ntype FormSubmissionValue = File | FormData | string | null\ntype FormStateValue = File | FormData | string | null\n\ninterface FormAssociationHost extends HTMLElement, ReactiveControllerHost {}\n\nexport interface FormAssociationOptions<State> {\n readonly host: FormAssociationHost\n readonly initialize?: () => void\n readonly getState: () => State\n readonly setState: (state: State) => void\n readonly copyState?: (state: State) => State\n readonly getFormValue: () => FormSubmissionValue\n readonly getFormState: () => FormStateValue\n readonly restoreState: (state: FormStateValue) => void\n readonly isStateManaged?: () => boolean\n readonly syncValidity?: (internals: ElementInternals) => void\n}\n\nexport interface FormAssociationLifecycle {\n connect(): void\n sync(): void\n reset(): void\n restore(state: FormStateValue): void\n setDisabled(disabled: boolean): void\n isFormDisabled(): boolean\n getInternals(): ElementInternals | undefined\n}\n\n/**\n * 承接原生 custom element 表单生命周期,值序列化与校验语义仍由各控件组件自己表达。\n */\nexport function defineFormAssociation<State>(options: FormAssociationOptions<State>) {\n return definePlugin((): FormAssociationLifecycle => {\n let internals: ElementInternals | undefined\n let initialState: State | undefined\n let initialized = false\n let formDisabled = false\n const copyState = options.copyState ?? (state => state)\n\n const sync = () => {\n if (!internals) return\n internals.setFormValue?.(options.getFormValue(), options.getFormState())\n options.syncValidity?.(internals)\n }\n\n return {\n connect() {\n if (!internals) internals = options.host.attachInternals()\n if (!initialized) {\n options.initialize?.()\n initialState = copyState(options.getState())\n initialized = true\n }\n sync()\n },\n sync,\n reset() {\n if (!initialized || options.isStateManaged?.()) return\n options.setState(copyState(initialState as State))\n sync()\n },\n restore(state) {\n if (options.isStateManaged?.()) return\n options.restoreState(state)\n sync()\n },\n setDisabled(disabled) {\n if (formDisabled === disabled) return\n formDisabled = disabled\n options.host.requestUpdate()\n sync()\n },\n isFormDisabled: () => formDisabled,\n getInternals: () => internals\n }\n })\n}\n\n/**
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/shared/form-association/index.ts"],"sourcesContent":["import { definePlugin } from '@greypan/js-kit'\nimport type { ReactiveController, ReactiveControllerHost } from 'lit'\n\n// Lit 官方 mixin 签名需要构造器接受任意参数(paramCount 各异的子类构造器都要能赋给\n// 基座);never[] 变体在 extends 链上会丢失 Lit 静态侧类型。any 收敛在这个类型别名内。\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\ntype Constructor<T = object> = new (...args: any[]) => T\n\ntype FormSubmissionValue = File | FormData | string | null\ntype FormStateValue = File | FormData | string | null\n\ninterface FormAssociationHost extends HTMLElement, ReactiveControllerHost {}\n\nexport interface FormAssociationOptions<State> {\n readonly host: FormAssociationHost\n readonly initialize?: () => void\n readonly getState: () => State\n readonly setState: (state: State) => void\n readonly copyState?: (state: State) => State\n readonly getFormValue: () => FormSubmissionValue\n readonly getFormState: () => FormStateValue\n readonly restoreState: (state: FormStateValue) => void\n readonly isStateManaged?: () => boolean\n readonly syncValidity?: (internals: ElementInternals) => void\n}\n\nexport interface FormAssociationLifecycle {\n connect(): void\n sync(): void\n reset(): void\n restore(state: FormStateValue): void\n setDisabled(disabled: boolean): void\n isFormDisabled(): boolean\n getInternals(): ElementInternals | undefined\n}\n\n/**\n * 把原生 input 的 ValidityState 转发为 ElementInternals 的校验状态。\n * flagNames 是控件自己声明的校验契约(input 转发文本类 5 项、input-number\n * 转发范围类 4 项),这里只收敛 guard / valid 判定 / setValidity 接线。\n * disabled 元素被约束验证豁免,必须上报干净状态;isDisabled 传入控件的\n * 组合禁用态(含 formDisabled),因为 formDisabledCallback 触发时原生\n * input 的 disabled 属性可能尚未重渲染,不能依赖 input.validity.valid。\n */\nexport function forwardInputValidity(\n internals: ElementInternals,\n input: HTMLInputElement | HTMLTextAreaElement,\n flagNames: readonly (keyof ValidityStateFlags)[],\n isDisabled = false\n): void {\n if (typeof internals.setValidity !== 'function') return\n if (isDisabled || input.validity.valid) {\n internals.setValidity({})\n return\n }\n const flags: ValidityStateFlags = {}\n for (const name of flagNames) {\n if (input.validity[name]) flags[name] = true\n }\n internals.setValidity(flags, input.validationMessage, input)\n}\n\n/**\n * 承接原生 custom element 表单生命周期,值序列化与校验语义仍由各控件组件自己表达。\n */\nexport function defineFormAssociation<State>(options: FormAssociationOptions<State>) {\n return definePlugin((): FormAssociationLifecycle => {\n let internals: ElementInternals | undefined\n let initialState: State | undefined\n let initialized = false\n let formDisabled = false\n const copyState = options.copyState ?? (state => state)\n\n const sync = () => {\n if (!internals) return\n internals.setFormValue?.(options.getFormValue(), options.getFormState())\n options.syncValidity?.(internals)\n }\n\n return {\n connect() {\n if (!internals) internals = options.host.attachInternals()\n if (!initialized) {\n options.initialize?.()\n initialState = copyState(options.getState())\n initialized = true\n }\n sync()\n },\n sync,\n reset() {\n if (!initialized || options.isStateManaged?.()) return\n options.setState(copyState(initialState as State))\n sync()\n },\n restore(state) {\n if (options.isStateManaged?.()) return\n options.restoreState(state)\n sync()\n },\n setDisabled(disabled) {\n if (formDisabled === disabled) return\n formDisabled = disabled\n options.host.requestUpdate()\n sync()\n },\n isFormDisabled: () => formDisabled,\n getInternals: () => internals\n }\n })\n}\n\n/**\n * 表单关联元素 mixin:安装 `formAssociated` 与三个生命周期回调。\n *\n * 生命周期实现仍由 defineFormAssociation 表达;FormAssociationController\n * 在构造时把 lifecycle 注册到实例的 provider,回调经它转发。组件可继续\n * 覆写单个回调注入自己的额外逻辑(如 autocomplete 的禁用收口)。\n * 这是字段组合(mixin),不是共享基类:除回调接线外不继承任何实现。\n */\nexport interface FormAssociatedLifecycleProvider {\n __formLifecycleProvider?: () => FormAssociationLifecycle\n}\n\nexport function FormAssociated<T extends Constructor<HTMLElement>>(superClass: T) {\n class FormAssociatedElement extends superClass {\n static formAssociated = true\n\n formResetCallback(): void {\n ;(this as FormAssociatedLifecycleProvider).__formLifecycleProvider?.().reset()\n }\n\n formDisabledCallback(disabled: boolean): void {\n ;(this as FormAssociatedLifecycleProvider).__formLifecycleProvider?.().setDisabled(disabled)\n }\n\n formStateRestoreCallback(state: File | FormData | string | null): void {\n ;(this as FormAssociatedLifecycleProvider).__formLifecycleProvider?.().restore(state)\n }\n }\n return FormAssociatedElement\n}\n\n/** 把表单生命周期插件接入宿主(回调接线经 FormAssociated mixin,无需共享基类)。 */\nexport class FormAssociationController implements ReactiveController {\n constructor(\n private readonly host: FormAssociationHost,\n private readonly lifecycle: FormAssociationLifecycle\n ) {\n host.addController(this)\n ;(host as FormAssociationHost & FormAssociatedLifecycleProvider).__formLifecycleProvider = () => lifecycle\n }\n\n hostConnected() {\n this.lifecycle.connect()\n }\n\n hostUpdated() {\n this.lifecycle.sync()\n }\n}\n"],"mappings":";;AA4CA,SAAgB,EACd,GACA,GACA,GACA,IAAa,IACP;CACN,IAAI,OAAO,EAAU,eAAgB,YAAY;CACjD,IAAI,KAAc,EAAM,SAAS,OAAO;EACtC,EAAU,YAAY,CAAC,CAAC;EACxB;CACF;CACA,IAAM,IAA4B,CAAC;CACnC,KAAK,IAAM,KAAQ,GACjB,AAAI,EAAM,SAAS,OAAO,EAAM,KAAQ;CAE1C,EAAU,YAAY,GAAO,EAAM,mBAAmB,CAAK;AAC7D;AAKA,SAAgB,EAA6B,GAAwC;CACnF,OAAO,QAA6C;EAClD,IAAI,GACA,GACA,IAAc,IACd,IAAe,IACb,IAAY,EAAQ,eAAc,MAAS,IAE3C,UAAa;GACZ,MACL,EAAU,eAAe,EAAQ,aAAa,GAAG,EAAQ,aAAa,CAAC,GACvE,EAAQ,eAAe,CAAS;EAClC;EAEA,OAAO;GACL,UAAU;IAOR,AANA,AAAgB,MAAY,EAAQ,KAAK,gBAAgB,GACzD,AAGE,OAFA,EAAQ,aAAa,GACrB,IAAe,EAAU,EAAQ,SAAS,CAAC,GAC7B,KAEhB,EAAK;GACP;GACA;GACA,QAAQ;IACF,CAAC,KAAe,EAAQ,iBAAiB,MAC7C,EAAQ,SAAS,EAAU,CAAqB,CAAC,GACjD,EAAK;GACP;GACA,QAAQ,GAAO;IACT,EAAQ,iBAAiB,MAC7B,EAAQ,aAAa,CAAK,GAC1B,EAAK;GACP;GACA,YAAY,GAAU;IAChB,MAAiB,MACrB,IAAe,GACf,EAAQ,KAAK,cAAc,GAC3B,EAAK;GACP;GACA,sBAAsB;GACtB,oBAAoB;EACtB;CACF,CAAC;AACH;AAcA,SAAgB,EAAmD,GAAe;CAChF,MAAM,UAA8B,EAAW;;GACrB,KAAA,iBAAA;;EAExB,oBAA0B;GACvB,KAA0C,0BAA0B,CAAC,CAAC,MAAM;EAC/E;EAEA,qBAAqB,GAAyB;GAC3C,KAA0C,0BAA0B,CAAC,CAAC,YAAY,CAAQ;EAC7F;EAEA,yBAAyB,GAA8C;GACpE,KAA0C,0BAA0B,CAAC,CAAC,QAAQ,CAAK;EACtF;CACF;CACA,OAAO;AACT;AAGA,IAAa,IAAb,MAAqE;CACnE,YACE,GACA,GACA;EAEC,AAJgB,KAAA,OAAA,GACA,KAAA,YAAA,GAEjB,EAAK,cAAc,IAAI,GACtB,EAAgE,gCAAgC;CACnG;CAEA,gBAAgB;EACd,KAAK,UAAU,QAAQ;CACzB;CAEA,cAAc;EACZ,KAAK,UAAU,KAAK;CACtB;AACF"}
|
|
@@ -1,13 +1,33 @@
|
|
|
1
1
|
function e(e, t) {
|
|
2
|
-
let n = typeof PointerEvent < "u" && e instanceof PointerEvent, r = n ? e.currentTarget || e.target : e, { axis: i = "both", threshold: a = 0, onStart: o, onMove: s, onEnd: c, onTap: l, onCancel: u } = t, d = null, f = 0, p = 0, m = a <= 0, h = [], g = null;
|
|
3
|
-
function
|
|
2
|
+
let n = typeof PointerEvent < "u" && e instanceof PointerEvent, r = n ? e.currentTarget || e.target : e, { axis: i = "both", threshold: a = 0, onStart: o, onMove: s, onEnd: c, onTap: l, onCancel: u } = t, d = null, f = 0, p = 0, m = a <= 0, h = [], g = null, _ = null;
|
|
3
|
+
function v(e) {
|
|
4
|
+
e.cancelable && e.preventDefault();
|
|
5
|
+
}
|
|
6
|
+
function y(e) {
|
|
7
|
+
let t = /* @__PURE__ */ new Set(), n = typeof e.composedPath == "function" ? e.composedPath() : [];
|
|
8
|
+
for (let e of n) {
|
|
9
|
+
let n = e.nodeType;
|
|
10
|
+
(n === Node.ELEMENT_NODE || n === Node.DOCUMENT_FRAGMENT_NODE) && (e.addEventListener("touchmove", v, {
|
|
11
|
+
capture: !0,
|
|
12
|
+
passive: !1
|
|
13
|
+
}), t.add(e));
|
|
14
|
+
}
|
|
15
|
+
_ = t;
|
|
16
|
+
}
|
|
17
|
+
function b() {
|
|
18
|
+
if (_) {
|
|
19
|
+
for (let e of _) e.removeEventListener("touchmove", v, !0);
|
|
20
|
+
_ = null;
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
function x() {
|
|
4
24
|
if (h.length < 2) return {
|
|
5
25
|
vx: 0,
|
|
6
26
|
vy: 0,
|
|
7
27
|
v: 0
|
|
8
28
|
};
|
|
9
29
|
let e = h[0], t = h[h.length - 1], n = t.t - e.t;
|
|
10
|
-
if (n <
|
|
30
|
+
if (n < 2) return {
|
|
11
31
|
vx: 0,
|
|
12
32
|
vy: 0,
|
|
13
33
|
v: 0
|
|
@@ -19,25 +39,25 @@ function e(e, t) {
|
|
|
19
39
|
v: o
|
|
20
40
|
};
|
|
21
41
|
}
|
|
22
|
-
function
|
|
23
|
-
window.removeEventListener("pointermove",
|
|
42
|
+
function S() {
|
|
43
|
+
window.removeEventListener("pointermove", O, !0), window.removeEventListener("pointerup", k, !0), window.removeEventListener("pointercancel", A, !0), window.removeEventListener("lostpointercapture", j, !0);
|
|
24
44
|
}
|
|
25
|
-
function
|
|
26
|
-
window.addEventListener("pointermove",
|
|
45
|
+
function C() {
|
|
46
|
+
window.addEventListener("pointermove", O, !0), window.addEventListener("pointerup", k, !0), window.addEventListener("pointercancel", A, !0), window.addEventListener("lostpointercapture", j, !0);
|
|
27
47
|
}
|
|
28
|
-
function
|
|
29
|
-
r && (r.removeEventListener("pointermove",
|
|
48
|
+
function w() {
|
|
49
|
+
r && (r.removeEventListener("pointermove", O), r.removeEventListener("pointerup", k), r.removeEventListener("pointercancel", A), r.removeEventListener("lostpointercapture", j));
|
|
30
50
|
}
|
|
31
|
-
function
|
|
32
|
-
r && (r.addEventListener("pointermove",
|
|
51
|
+
function T() {
|
|
52
|
+
r && (r.addEventListener("pointermove", O), r.addEventListener("pointerup", k), r.addEventListener("pointercancel", A), r.addEventListener("lostpointercapture", j));
|
|
33
53
|
}
|
|
34
|
-
function
|
|
54
|
+
function E() {
|
|
35
55
|
if (d !== null && r && typeof r.hasPointerCapture == "function") try {
|
|
36
56
|
r.hasPointerCapture(d) && r.releasePointerCapture(d);
|
|
37
57
|
} catch {}
|
|
38
|
-
d = null, m = a <= 0, h = [], g = null,
|
|
58
|
+
d = null, m = a <= 0, h = [], g = null, S(), w(), b();
|
|
39
59
|
}
|
|
40
|
-
function
|
|
60
|
+
function D(e) {
|
|
41
61
|
if (d !== null || e.pointerType === "touch" && e.isPrimary === !1) return;
|
|
42
62
|
let t = {
|
|
43
63
|
pointerId: e.pointerId,
|
|
@@ -49,22 +69,22 @@ function e(e, t) {
|
|
|
49
69
|
t: e.timeStamp,
|
|
50
70
|
x: e.clientX,
|
|
51
71
|
y: e.clientY
|
|
52
|
-
}], g = null,
|
|
72
|
+
}], g = null, C(), T(), y(e), m)) try {
|
|
53
73
|
r?.setPointerCapture?.(e.pointerId);
|
|
54
74
|
} catch {}
|
|
55
75
|
}
|
|
56
|
-
function
|
|
76
|
+
function O(e) {
|
|
57
77
|
if (d !== e.pointerId || g === e) return;
|
|
58
78
|
g = e;
|
|
59
79
|
let t = e.clientX - f, n = e.clientY - p;
|
|
60
80
|
if (!m) {
|
|
61
81
|
if ((i === "x" ? Math.abs(t) : i === "y" ? Math.abs(n) : Math.hypot(t, n)) < a) return;
|
|
62
82
|
if (i === "x" && Math.abs(n) > Math.abs(t)) {
|
|
63
|
-
|
|
83
|
+
M();
|
|
64
84
|
return;
|
|
65
85
|
}
|
|
66
86
|
if (i === "y" && Math.abs(t) > Math.abs(n)) {
|
|
67
|
-
|
|
87
|
+
M();
|
|
68
88
|
return;
|
|
69
89
|
}
|
|
70
90
|
m = !0;
|
|
@@ -79,7 +99,7 @@ function e(e, t) {
|
|
|
79
99
|
x: e.clientX,
|
|
80
100
|
y: e.clientY
|
|
81
101
|
}); h.length > 2 && o - h[0].t > 100;) h.shift();
|
|
82
|
-
let { vx: c, vy: l, v: u } =
|
|
102
|
+
let { vx: c, vy: l, v: u } = x(), _ = {
|
|
83
103
|
pointerId: e.pointerId,
|
|
84
104
|
clientX: e.clientX,
|
|
85
105
|
clientY: e.clientY,
|
|
@@ -90,9 +110,9 @@ function e(e, t) {
|
|
|
90
110
|
velocity: u,
|
|
91
111
|
timeStamp: o
|
|
92
112
|
};
|
|
93
|
-
s?.(
|
|
113
|
+
s?.(_, e);
|
|
94
114
|
}
|
|
95
|
-
function
|
|
115
|
+
function k(e) {
|
|
96
116
|
if (d !== e.pointerId) return;
|
|
97
117
|
let t = e.timeStamp;
|
|
98
118
|
for (h.push({
|
|
@@ -100,7 +120,7 @@ function e(e, t) {
|
|
|
100
120
|
x: e.clientX,
|
|
101
121
|
y: e.clientY
|
|
102
122
|
}); h.length > 2 && t - h[0].t > 100;) h.shift();
|
|
103
|
-
let n = e.clientX - f, r = e.clientY - p, { vx: i, vy: a, v: o } =
|
|
123
|
+
let n = e.clientX - f, r = e.clientY - p, { vx: i, vy: a, v: o } = x(), s = {
|
|
104
124
|
pointerId: e.pointerId,
|
|
105
125
|
clientX: e.clientX,
|
|
106
126
|
clientY: e.clientY,
|
|
@@ -111,19 +131,22 @@ function e(e, t) {
|
|
|
111
131
|
velocity: o,
|
|
112
132
|
timeStamp: e.timeStamp
|
|
113
133
|
}, g = m;
|
|
114
|
-
|
|
134
|
+
E(), g ? c?.(s, e) : (l?.(s, e), u?.(e));
|
|
135
|
+
}
|
|
136
|
+
function A(e) {
|
|
137
|
+
d === e.pointerId && (E(), u?.(e));
|
|
115
138
|
}
|
|
116
|
-
function
|
|
117
|
-
d === e.pointerId && (
|
|
139
|
+
function j(e) {
|
|
140
|
+
d === e.pointerId && e.target === r && (E(), u?.(e));
|
|
118
141
|
}
|
|
119
|
-
function
|
|
120
|
-
d !== null && (
|
|
142
|
+
function M() {
|
|
143
|
+
d !== null && (E(), u?.());
|
|
121
144
|
}
|
|
122
|
-
return n ?
|
|
145
|
+
return n ? D(e) : r && (r.addEventListener("pointerdown", D), r.addEventListener("pointermove", O), r.addEventListener("pointerup", k), r.addEventListener("pointercancel", A)), {
|
|
123
146
|
isDragging: () => d !== null,
|
|
124
|
-
cancel:
|
|
147
|
+
cancel: M,
|
|
125
148
|
destroy: () => {
|
|
126
|
-
|
|
149
|
+
M(), !n && r && (r.removeEventListener("pointerdown", D), r.removeEventListener("pointermove", O), r.removeEventListener("pointerup", k), r.removeEventListener("pointercancel", A));
|
|
127
150
|
}
|
|
128
151
|
};
|
|
129
152
|
}
|