@greypan/web-ui 2.1.1 → 2.1.3
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 +43 -39
- package/README.md +53 -48
- package/dist/assets/menu-portal.js +1 -1
- package/dist/assets/menu-portal.js.map +1 -1
- package/dist/assets/toast-containers.js +1 -1
- package/dist/assets/toast-containers.js.map +1 -1
- package/dist/components/back-top/index.d.ts +3 -1
- package/dist/components/back-top/index.js +16 -12
- package/dist/components/back-top/index.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/context-menu/index.d.ts +3 -4
- package/dist/components/context-menu/index.js +55 -69
- package/dist/components/context-menu/index.js.map +1 -1
- package/dist/components/context-menu/style.js +1 -1
- package/dist/components/context-menu/style.js.map +1 -1
- package/dist/components/dialog/index.d.ts +4 -11
- package/dist/components/dialog/index.js +29 -53
- package/dist/components/dialog/index.js.map +1 -1
- package/dist/components/drawer/index.d.ts +4 -11
- package/dist/components/drawer/index.js +42 -63
- package/dist/components/drawer/index.js.map +1 -1
- package/dist/components/dropdown/index.d.ts +3 -3
- package/dist/components/dropdown/index.js +70 -78
- package/dist/components/dropdown/index.js.map +1 -1
- package/dist/components/dropdown/style.js +1 -1
- package/dist/components/dropdown/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/option/style.js +1 -1
- package/dist/components/option/style.js.map +1 -1
- package/dist/components/popover/index.d.ts +2 -5
- package/dist/components/popover/index.js +47 -70
- package/dist/components/popover/index.js.map +1 -1
- package/dist/components/select/index.d.ts +4 -7
- package/dist/components/select/index.js +64 -74
- 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/switch/style.js +1 -1
- package/dist/components/switch/style.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 +1 -1
- package/dist/components/toast/manager.js.map +1 -1
- package/dist/components/toast/toast.d.ts +1 -1
- package/dist/components/toast/toast.js +26 -26
- package/dist/components/toast/toast.js.map +1 -1
- package/dist/components/tooltip/index.d.ts +3 -5
- package/dist/components/tooltip/index.js +61 -70
- package/dist/components/tooltip/index.js.map +1 -1
- package/dist/icons/generated/ooui-close.d.ts +6 -0
- package/dist/icons/generated/ooui-close.js +10 -0
- package/dist/icons/generated/ooui-close.js.map +1 -0
- package/dist/icons/index.d.ts +1 -0
- package/dist/icons/index.js +2 -1
- package/dist/shared/menu-portal/menu-portal.js +8 -1
- package/dist/shared/menu-portal/menu-portal.js.map +1 -1
- package/dist/shared/menu-portal/menu-tree.js +29 -0
- package/dist/shared/menu-portal/menu-tree.js.map +1 -0
- package/dist/shared/overlay/anchored-panel.js +49 -0
- package/dist/shared/overlay/anchored-panel.js.map +1 -0
- package/dist/shared/overlay/native-dialog-presence.js +45 -0
- package/dist/shared/overlay/native-dialog-presence.js.map +1 -0
- package/dist/shared/overlay/overlay.js +5 -2
- package/dist/shared/overlay/overlay.js.map +1 -1
- package/dist/shared/overlay/portal.js +3 -3
- package/dist/shared/overlay/portal.js.map +1 -1
- package/dist/shared/overlay/presence.js +1 -1
- package/dist/shared/overlay/presence.js.map +1 -1
- package/dist/shared/scroll-lock/scroll-lock.js +15 -1
- package/dist/shared/scroll-lock/scroll-lock.js.map +1 -1
- package/dist/types/vue.d.ts +2 -1
- package/package.json +1 -1
- package/dist/shared/property-converters/boolean-with-false-string.js +0 -9
- package/dist/shared/property-converters/boolean-with-false-string.js.map +0 -1
|
@@ -2,14 +2,13 @@ import e from "../../_virtual/_@oxc-project_runtime@0.140.0/helpers/esm/decorate
|
|
|
2
2
|
import t from "../../assets/glass.js";
|
|
3
3
|
import { normalizeLiteral as n, normalizeNumber as r } from "../../shared/normalize/index.js";
|
|
4
4
|
import i from "../../assets/overlay-motion.js";
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import
|
|
8
|
-
import l from "
|
|
9
|
-
import {
|
|
10
|
-
import { customElement as p, property as m } from "lit/decorators.js";
|
|
5
|
+
import { defineAnchoredPanel as a } from "../../shared/overlay/anchored-panel.js";
|
|
6
|
+
import { createOverlayPortal as o } from "../../shared/overlay/portal.js";
|
|
7
|
+
import s from "./style.js";
|
|
8
|
+
import { LitElement as c, html as l, unsafeCSS as u } from "lit";
|
|
9
|
+
import { customElement as d, property as f } from "lit/decorators.js";
|
|
11
10
|
//#region src/components/tooltip/index.ts
|
|
12
|
-
var
|
|
11
|
+
var p = [
|
|
13
12
|
"top",
|
|
14
13
|
"top-start",
|
|
15
14
|
"top-end",
|
|
@@ -22,10 +21,20 @@ var h = [
|
|
|
22
21
|
"right",
|
|
23
22
|
"right-start",
|
|
24
23
|
"right-end"
|
|
25
|
-
],
|
|
24
|
+
], m = 0, h = class extends c {
|
|
26
25
|
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._shouldOpenInstantly = !0, this.
|
|
28
|
-
|
|
26
|
+
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._shouldOpenInstantly = !0, this._panel = a().make({
|
|
27
|
+
getAnchor: () => this.shadowRoot?.querySelector(".tooltip-trigger") ?? null,
|
|
28
|
+
getLocalPanel: () => this.shadowRoot?.querySelector(".tooltip-panel") ?? null,
|
|
29
|
+
getPositioning: () => ({
|
|
30
|
+
placement: this.placement,
|
|
31
|
+
offset: this.offset,
|
|
32
|
+
strategy: this.portal ? "fixed" : "absolute"
|
|
33
|
+
}),
|
|
34
|
+
isPortal: () => this.portal,
|
|
35
|
+
createPortal: () => this._createPortal()
|
|
36
|
+
}), this._onPointerEnter = (e) => {
|
|
37
|
+
e.pointerType !== "touch" && (this.disabled || (clearTimeout(this._hideTimer), this._showTimer = setTimeout(() => this._show(), m > 0 ? 0 : this.showDelay)));
|
|
29
38
|
}, this._onPointerLeave = (e) => {
|
|
30
39
|
e.pointerType !== "touch" && (this.disabled || (clearTimeout(this._showTimer), this._hideTimer = setTimeout(() => this._hide(), this.hideDelay)));
|
|
31
40
|
}, this._onFocusIn = () => {
|
|
@@ -36,9 +45,9 @@ var h = [
|
|
|
36
45
|
}
|
|
37
46
|
static {
|
|
38
47
|
this.styles = [
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
48
|
+
u(t),
|
|
49
|
+
u(i),
|
|
50
|
+
u(s)
|
|
42
51
|
];
|
|
43
52
|
}
|
|
44
53
|
get placement() {
|
|
@@ -46,7 +55,7 @@ var h = [
|
|
|
46
55
|
}
|
|
47
56
|
set placement(e) {
|
|
48
57
|
let t = this._placement;
|
|
49
|
-
this._placement = n(e,
|
|
58
|
+
this._placement = n(e, p, "top"), this.requestUpdate("placement", t);
|
|
50
59
|
}
|
|
51
60
|
get showDelay() {
|
|
52
61
|
return this._showDelay;
|
|
@@ -76,13 +85,13 @@ var h = [
|
|
|
76
85
|
super.connectedCallback(), this.addEventListener("pointerenter", this._onPointerEnter), this.addEventListener("pointerleave", this._onPointerLeave), this.addEventListener("focusin", this._onFocusIn), this.addEventListener("focusout", this._onFocusOut);
|
|
77
86
|
}
|
|
78
87
|
disconnectedCallback() {
|
|
79
|
-
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.
|
|
88
|
+
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();
|
|
80
89
|
}
|
|
81
90
|
firstUpdated() {
|
|
82
|
-
this.
|
|
91
|
+
this.open && (this._openOverlay(this._shouldOpenInstantly), this._shouldOpenInstantly = !0);
|
|
83
92
|
}
|
|
84
93
|
updated(e) {
|
|
85
|
-
|
|
94
|
+
e.has("portal") || e.has("overlayContainer") ? requestAnimationFrame(() => 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._closeOverlay(), this._dispatchChange(this.open)), e.has("content") && this._syncPortalContent();
|
|
86
95
|
}
|
|
87
96
|
_show(e = !1) {
|
|
88
97
|
this.open ||= (this._shouldOpenInstantly = e, !0);
|
|
@@ -90,59 +99,41 @@ var h = [
|
|
|
90
99
|
_hide() {
|
|
91
100
|
this.open &&= !1;
|
|
92
101
|
}
|
|
93
|
-
_initLocalOverlay() {
|
|
94
|
-
let e = this.shadowRoot?.querySelector(".tooltip-trigger"), t = this.shadowRoot?.querySelector(".tooltip-panel");
|
|
95
|
-
!e || !t || (this._overlay = s.make({
|
|
96
|
-
anchor: e,
|
|
97
|
-
overlay: t,
|
|
98
|
-
placement: this.placement,
|
|
99
|
-
offset: this.offset
|
|
100
|
-
}));
|
|
101
|
-
}
|
|
102
102
|
_openOverlay(e = !1) {
|
|
103
|
-
|
|
104
|
-
else {
|
|
105
|
-
this._overlay?.open();
|
|
106
|
-
let t = this.shadowRoot?.querySelector(".tooltip-panel");
|
|
107
|
-
t && o(t, { isInstant: e });
|
|
108
|
-
}
|
|
103
|
+
this._panel.open(e);
|
|
109
104
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
this._overlay?.open(), o(this._portal.panel, { isInstant: e });
|
|
113
|
-
return;
|
|
114
|
-
}
|
|
115
|
-
let n = this.shadowRoot?.querySelector(".tooltip-trigger");
|
|
116
|
-
if (!n) return;
|
|
117
|
-
let r = c({
|
|
105
|
+
_createPortal() {
|
|
106
|
+
let e = o({
|
|
118
107
|
container: this.overlayContainer,
|
|
119
108
|
target: this,
|
|
120
|
-
style: `${t}\n${i}\n${
|
|
109
|
+
style: `${t}\n${i}\n${s}`,
|
|
121
110
|
className: "tooltip-panel portal wui-glass wui-floating-panel"
|
|
122
111
|
});
|
|
123
112
|
if (this.content) {
|
|
124
|
-
let
|
|
125
|
-
|
|
126
|
-
} else
|
|
127
|
-
|
|
128
|
-
anchor: n,
|
|
129
|
-
overlay: r.panel,
|
|
130
|
-
placement: this.placement,
|
|
131
|
-
offset: this.offset,
|
|
132
|
-
strategy: "fixed"
|
|
133
|
-
}), this._overlay.open(), o(r.panel, { isInstant: e });
|
|
113
|
+
let t = document.createElement("span");
|
|
114
|
+
t.className = "tooltip-text", t.textContent = this.content, e.panel.append(t);
|
|
115
|
+
} else e.moveContent(Array.from(this.querySelectorAll("[slot=\"content\"]")));
|
|
116
|
+
return e.panel.setAttribute("role", "tooltip"), e;
|
|
134
117
|
}
|
|
135
118
|
async _closeOverlay() {
|
|
136
|
-
this.
|
|
137
|
-
let e = this._portal?.panel ?? this.shadowRoot?.querySelector(".tooltip-panel");
|
|
138
|
-
e && !await a(e) || !this._portal || this.open || (this._portal.restoreContent(), this._portal.remove(), this._portal = void 0, this._overlay = void 0);
|
|
139
|
-
}
|
|
140
|
-
_disposeOverlay() {
|
|
141
|
-
this._overlay?.dispose(), this._overlay = void 0, this._portal?.restoreContent(), this._portal?.remove(), this._portal = void 0;
|
|
119
|
+
await this._panel.close(() => this.open);
|
|
142
120
|
}
|
|
143
121
|
_reconfigureOverlay() {
|
|
144
|
-
|
|
145
|
-
|
|
122
|
+
this._panel.reconfigure(this.open);
|
|
123
|
+
}
|
|
124
|
+
_syncPortalContent() {
|
|
125
|
+
if (!this.portal || !this.open) return;
|
|
126
|
+
let e = this._panel.getPanel();
|
|
127
|
+
if (!e) return;
|
|
128
|
+
let t = e.querySelector(".tooltip-text");
|
|
129
|
+
if (t) {
|
|
130
|
+
t.textContent = this.content;
|
|
131
|
+
return;
|
|
132
|
+
}
|
|
133
|
+
if (!this.content) return;
|
|
134
|
+
e.replaceChildren();
|
|
135
|
+
let n = document.createElement("span");
|
|
136
|
+
n.className = "tooltip-text", n.textContent = this.content, e.append(n);
|
|
146
137
|
}
|
|
147
138
|
_dispatchChange(e) {
|
|
148
139
|
this.dispatchEvent(new CustomEvent("open-change", {
|
|
@@ -152,39 +143,39 @@ var h = [
|
|
|
152
143
|
}));
|
|
153
144
|
}
|
|
154
145
|
_syncVisibleTooltipCount(e) {
|
|
155
|
-
e && !this._isCountedVisible ? (
|
|
146
|
+
e && !this._isCountedVisible ? (m += 1, this._isCountedVisible = !0) : !e && this._isCountedVisible && (m = Math.max(0, m - 1), this._isCountedVisible = !1);
|
|
156
147
|
}
|
|
157
148
|
render() {
|
|
158
|
-
return
|
|
149
|
+
return l`
|
|
159
150
|
<div class="tooltip-anchor">
|
|
160
151
|
<div class="tooltip-trigger"><slot></slot></div>
|
|
161
152
|
<div class="tooltip-panel wui-glass wui-floating-panel" hidden role="tooltip">
|
|
162
|
-
${this.content ?
|
|
153
|
+
${this.content ? l`<span class="tooltip-text">${this.content}</span>` : l`<slot name="content"></slot>`}
|
|
163
154
|
</div>
|
|
164
155
|
</div>
|
|
165
156
|
`;
|
|
166
157
|
}
|
|
167
158
|
};
|
|
168
|
-
e([
|
|
159
|
+
e([f({
|
|
169
160
|
type: String,
|
|
170
161
|
reflect: !0
|
|
171
|
-
})],
|
|
162
|
+
})], h.prototype, "placement", null), e([f({
|
|
172
163
|
type: Number,
|
|
173
164
|
attribute: "show-delay"
|
|
174
|
-
})],
|
|
165
|
+
})], h.prototype, "showDelay", null), e([f({
|
|
175
166
|
type: Number,
|
|
176
167
|
attribute: "hide-delay"
|
|
177
|
-
})],
|
|
168
|
+
})], h.prototype, "hideDelay", null), e([f({
|
|
178
169
|
type: Boolean,
|
|
179
170
|
reflect: !0
|
|
180
|
-
})],
|
|
171
|
+
})], h.prototype, "disabled", void 0), e([f({ type: Number })], h.prototype, "offset", null), e([f({ type: String })], h.prototype, "content", void 0), e([f({
|
|
181
172
|
type: Boolean,
|
|
182
173
|
reflect: !0
|
|
183
|
-
})],
|
|
174
|
+
})], h.prototype, "open", void 0), e([f({
|
|
184
175
|
type: Boolean,
|
|
185
176
|
reflect: !0
|
|
186
|
-
})],
|
|
177
|
+
})], h.prototype, "portal", void 0), e([f({ attribute: !1 })], h.prototype, "overlayContainer", void 0), h = e([d("web-ui-tooltip")], h);
|
|
187
178
|
//#endregion
|
|
188
|
-
export {
|
|
179
|
+
export { h as WebUiTooltip };
|
|
189
180
|
|
|
190
181
|
//# 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 { normalizeLiteral, normalizeNumber } from '@/shared/normalize'\nimport { withOverlay } from '@/shared/overlay/overlay'\nimport type { OverlayApi } from '@/shared/overlay/overlay'\nimport { createOverlayPortal } from '@/shared/overlay/portal'\nimport type { OverlayContainer, OverlayPortal } from '@/shared/overlay/portal'\nimport { hideOverlayPresence, showOverlayPresence } from '@/shared/overlay/presence'\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 _overlay?: OverlayApi & { anchor: HTMLElement; overlay: HTMLElement }\n private _showTimer?: ReturnType<typeof setTimeout>\n private _hideTimer?: ReturnType<typeof setTimeout>\n private _portal?: OverlayPortal\n private _isCountedVisible = false\n private _shouldOpenInstantly = true\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._disposeOverlay()\n }\n\n override firstUpdated() {\n this._initLocalOverlay()\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('placement') || changed.has('portal') || changed.has('overlayContainer')) {\n requestAnimationFrame(() => this._reconfigureOverlay())\n }\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 this._dispatchChange(this.open)\n }\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 = () => {\n if (this.disabled) return\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.open = true\n }\n\n private _hide() {\n if (!this.open) return\n this.open = false\n }\n\n private _initLocalOverlay() {\n const anchor = this.shadowRoot?.querySelector<HTMLElement>('.tooltip-trigger')\n const panel = this.shadowRoot?.querySelector<HTMLElement>('.tooltip-panel')\n if (!anchor || !panel) return\n this._overlay = withOverlay.make({\n anchor,\n overlay: panel,\n placement: this.placement,\n offset: this.offset\n })\n }\n\n private _openOverlay(isInstant = false) {\n if (this.portal) this._openPortal(isInstant)\n else {\n this._overlay?.open()\n const panel = this.shadowRoot?.querySelector<HTMLElement>('.tooltip-panel')\n if (panel) showOverlayPresence(panel, { isInstant })\n }\n }\n\n private _openPortal(isInstant = false) {\n if (this._portal) {\n this._overlay?.open()\n showOverlayPresence(this._portal.panel, { isInstant })\n return\n }\n const anchor = this.shadowRoot?.querySelector('.tooltip-trigger') as HTMLElement | null\n if (!anchor) return\n const portal = createOverlayPortal({\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 })\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 this._portal = portal\n this._overlay = withOverlay.make({\n anchor,\n overlay: portal.panel,\n placement: this.placement,\n offset: this.offset,\n strategy: 'fixed'\n })\n this._overlay.open()\n showOverlayPresence(portal.panel, { isInstant })\n }\n\n private async _closeOverlay() {\n this._overlay?.close()\n const panel = this._portal?.panel ?? this.shadowRoot?.querySelector<HTMLElement>('.tooltip-panel')\n if (panel && !(await hideOverlayPresence(panel))) return\n if (!this._portal || this.open) return\n this._portal.restoreContent()\n this._portal.remove()\n this._portal = undefined\n this._overlay = undefined\n }\n\n private _disposeOverlay() {\n this._overlay?.dispose()\n this._overlay = undefined\n this._portal?.restoreContent()\n this._portal?.remove()\n this._portal = undefined\n }\n\n private _reconfigureOverlay() {\n const panel = this._portal?.panel ?? this.shadowRoot?.querySelector<HTMLElement>('.tooltip-panel')\n const shouldAnimate = panel?.dataset.wuiPresence === 'entering'\n this._disposeOverlay()\n if (!this.portal) this._initLocalOverlay()\n if (this.open) this._openOverlay(!shouldAnimate)\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 { normalizeLiteral, normalizeNumber } from '@/shared/normalize'\nimport { defineAnchoredPanel } from '@/shared/overlay/anchored-panel'\nimport { createOverlayPortal } 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 _shouldOpenInstantly = true\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 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 = () => {\n if (this.disabled) return\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.open = true\n }\n\n private _hide() {\n if (!this.open) return\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 = createOverlayPortal({\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 })\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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"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
//#region src/icons/generated/ooui-close.ts
|
|
2
|
+
var e = {
|
|
3
|
+
body: "<path fill=\"currentColor\" d=\"M16.707 4.707L11.414 10l5.293 5.293l-1.414 1.414L10 11.414l-5.293 5.293l-1.414-1.414L8.586 10L3.293 4.707l1.414-1.414L10 8.586l5.293-5.293z\"/>",
|
|
4
|
+
width: 20,
|
|
5
|
+
height: 20
|
|
6
|
+
};
|
|
7
|
+
//#endregion
|
|
8
|
+
export { e as default };
|
|
9
|
+
|
|
10
|
+
//# sourceMappingURL=ooui-close.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ooui-close.js","names":[],"sources":["../../../src/icons/generated/ooui-close.ts"],"sourcesContent":["import type { IconifyIcon } from '@iconify/types'\n\nexport default {\n body: '<path fill=\"currentColor\" d=\"M16.707 4.707L11.414 10l5.293 5.293l-1.414 1.414L10 11.414l-5.293 5.293l-1.414-1.414L8.586 10L3.293 4.707l1.414-1.414L10 8.586l5.293-5.293z\"/>',\n width: 20,\n height: 20\n} satisfies IconifyIcon\n"],"mappings":";AAEA,IAAA,IAAe;CACb,MAAM;CACN,OAAO;CACP,QAAQ;AACV"}
|
package/dist/icons/index.d.ts
CHANGED
|
@@ -37,3 +37,4 @@ export { default as lucideMail } from './generated/lucide-mail';
|
|
|
37
37
|
export { default as lucideImage } from './generated/lucide-image';
|
|
38
38
|
export { default as lucideGlobe } from './generated/lucide-globe';
|
|
39
39
|
export { default as radixIconsPanelLeftMinimized } from './generated/radix-icons-panel-left-minimized';
|
|
40
|
+
export { default as oouiClose } from './generated/ooui-close';
|
package/dist/icons/index.js
CHANGED
|
@@ -37,4 +37,5 @@ import F from "./generated/lucide-mail.js";
|
|
|
37
37
|
import I from "./generated/lucide-image.js";
|
|
38
38
|
import L from "./generated/lucide-globe.js";
|
|
39
39
|
import R from "./generated/radix-icons-panel-left-minimized.js";
|
|
40
|
-
|
|
40
|
+
import z from "./generated/ooui-close.js";
|
|
41
|
+
export { 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, h as lucideClipboardPaste, m as lucideCopy, y as lucideDownload, f as lucideFile, p as lucideFolder, L as lucideGlobe, N as lucideHeart, I as lucideImage, e as lucideInbox, E as lucideInfo, t as lucideLoaderCircle, F as lucideMail, l as lucideMinus, c as lucidePlus, _ as lucidePrinter, S as lucideRedo2, C as lucideScissors, u as lucideSearch, v as lucideSettings, M as lucideStar, g as lucideTrash2, D as lucideTriangleAlert, x as lucideUndo2, b as lucideUpload, A as lucideUser, d as lucideX, z as oouiClose, R as radixIconsPanelLeftMinimized };
|
|
@@ -3,7 +3,14 @@ import { findNearestTheme as t, findRootTheme as n } from "../theme/theme-scope.
|
|
|
3
3
|
//#region src/shared/menu-portal/menu-portal.ts
|
|
4
4
|
function r(r, i) {
|
|
5
5
|
let a = document.createElement("div");
|
|
6
|
-
|
|
6
|
+
a.className = `wui-menu-portal-overlay wui-floating-panel wui-glass ${r}`, a.dataset.wuiPresence = "entering";
|
|
7
|
+
let o = document.createElement("div");
|
|
8
|
+
o.className = "wui-menu-scroll";
|
|
9
|
+
let s = document.createElement("div");
|
|
10
|
+
return s.className = "wui-menu-content", o.append(s), a.append(o), ((i ? t(i) : n())?.getOverlayRoot() ?? e()).appendChild(a), {
|
|
11
|
+
panel: a,
|
|
12
|
+
content: s
|
|
13
|
+
};
|
|
7
14
|
}
|
|
8
15
|
//#endregion
|
|
9
16
|
export { r as createMenuPortalOverlay };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"menu-portal.js","names":[],"sources":["../../../src/shared/menu-portal/menu-portal.ts"],"sourcesContent":["import { getFallbackOverlayRoot } from '@/shared/theme/overlay-root'\nimport { findNearestTheme, findRootTheme } from '@/shared/theme/theme-scope'\n\nexport function createMenuPortalOverlay(className: string, target?: Element):
|
|
1
|
+
{"version":3,"file":"menu-portal.js","names":[],"sources":["../../../src/shared/menu-portal/menu-portal.ts"],"sourcesContent":["import { getFallbackOverlayRoot } from '@/shared/theme/overlay-root'\nimport { findNearestTheme, findRootTheme } from '@/shared/theme/theme-scope'\n\nexport interface MenuPortalOverlay {\n readonly panel: HTMLElement\n readonly content: HTMLElement\n}\n\nexport function createMenuPortalOverlay(className: string, target?: Element): MenuPortalOverlay {\n const panel = document.createElement('div')\n panel.className = `wui-menu-portal-overlay wui-floating-panel wui-glass ${className}`\n panel.dataset.wuiPresence = 'entering'\n const scroll = document.createElement('div')\n scroll.className = 'wui-menu-scroll'\n const content = document.createElement('div')\n content.className = 'wui-menu-content'\n scroll.append(content)\n panel.append(scroll)\n\n const root = target ? findNearestTheme(target) : findRootTheme()\n const container = root?.getOverlayRoot() ?? getFallbackOverlayRoot()\n container.appendChild(panel)\n\n return { panel, content }\n}\n"],"mappings":";;;AAQA,SAAgB,EAAwB,GAAmB,GAAqC;CAC9F,IAAM,IAAQ,SAAS,cAAc,KAAK;CAE1C,AADA,EAAM,YAAY,wDAAwD,KAC1E,EAAM,QAAQ,cAAc;CAC5B,IAAM,IAAS,SAAS,cAAc,KAAK;CAC3C,EAAO,YAAY;CACnB,IAAM,IAAU,SAAS,cAAc,KAAK;CAS5C,OARA,EAAQ,YAAY,oBACpB,EAAO,OAAO,CAAO,GACrB,EAAM,OAAO,CAAM,KAEN,IAAS,EAAiB,CAAM,IAAI,EAAc,EAAA,EACvC,eAAe,KAAK,EAAuB,EAAA,CACzD,YAAY,CAAK,GAEpB;EAAE;EAAO;CAAQ;AAC1B"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
//#region src/shared/menu-portal/menu-tree.ts
|
|
2
|
+
var e = "web-ui-dropdown-item, web-ui-dropdown-divider, web-ui-dropdown-header", t = "web-ui-dropdown-item";
|
|
3
|
+
function n(e) {
|
|
4
|
+
return Array.from(e.children).filter((e) => e instanceof HTMLElement && e.matches("web-ui-dropdown-item, web-ui-dropdown-divider, web-ui-dropdown-header"));
|
|
5
|
+
}
|
|
6
|
+
function r(e) {
|
|
7
|
+
return n(e).filter((e) => e.matches(`${t}:not([disabled])`));
|
|
8
|
+
}
|
|
9
|
+
function i(e, t) {
|
|
10
|
+
n(e).forEach((e) => t.appendChild(e));
|
|
11
|
+
}
|
|
12
|
+
function a(e, t) {
|
|
13
|
+
e.querySelectorAll("web-ui-dropdown-item[submenu]").forEach((e) => {
|
|
14
|
+
n(e).forEach((e) => e.setAttribute("slot", t));
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
function o(e) {
|
|
18
|
+
return e.composedPath().find((e) => e instanceof HTMLElement && e.matches("web-ui-dropdown-item")) ?? null;
|
|
19
|
+
}
|
|
20
|
+
function s(e) {
|
|
21
|
+
!e || e.hasAttribute("disabled") || e.focusItem?.();
|
|
22
|
+
}
|
|
23
|
+
function c(e) {
|
|
24
|
+
return [...e].filter((e) => e !== void 0).flatMap((e) => Array.from(e.querySelectorAll(t))).find((e) => !!e.shadowRoot?.activeElement);
|
|
25
|
+
}
|
|
26
|
+
//#endregion
|
|
27
|
+
export { e as MENU_CONTENT_SELECTOR, t as MENU_ITEM_SELECTOR, c as findFocusedMenuItem, s as focusMenuItem, r as getEnabledMenuItems, n as getMenuChildren, o as getMenuItemFromEvent, a as hideNestedMenuChildren, i as moveMenuChildren };
|
|
28
|
+
|
|
29
|
+
//# sourceMappingURL=menu-tree.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"menu-tree.js","names":[],"sources":["../../../src/shared/menu-portal/menu-tree.ts"],"sourcesContent":["export const MENU_CONTENT_SELECTOR = 'web-ui-dropdown-item, web-ui-dropdown-divider, web-ui-dropdown-header'\nexport const MENU_ITEM_SELECTOR = 'web-ui-dropdown-item'\n\nexport function getMenuChildren(container: ParentNode): HTMLElement[] {\n return Array.from(container.children).filter(\n (child): child is HTMLElement => child instanceof HTMLElement && child.matches(MENU_CONTENT_SELECTOR)\n )\n}\n\nexport function getEnabledMenuItems(container: ParentNode): HTMLElement[] {\n return getMenuChildren(container).filter(item => item.matches(`${MENU_ITEM_SELECTOR}:not([disabled])`))\n}\n\nexport function moveMenuChildren(source: ParentNode, target: HTMLElement) {\n getMenuChildren(source).forEach(child => target.appendChild(child))\n}\n\nexport function hideNestedMenuChildren(root: ParentNode, slot: string) {\n root.querySelectorAll<HTMLElement>('web-ui-dropdown-item[submenu]').forEach(item => {\n getMenuChildren(item).forEach(child => child.setAttribute('slot', slot))\n })\n}\n\nexport function getMenuItemFromEvent(event: Event): HTMLElement | null {\n return (\n event\n .composedPath()\n .find((node): node is HTMLElement => node instanceof HTMLElement && node.matches(MENU_ITEM_SELECTOR)) ?? null\n )\n}\n\nexport function focusMenuItem(item: HTMLElement | undefined) {\n if (!item || item.hasAttribute('disabled')) return\n ;(item as HTMLElement & { focusItem?: () => void }).focusItem?.()\n}\n\nexport function findFocusedMenuItem(panels: Iterable<HTMLElement | undefined>): HTMLElement | undefined {\n return [...panels]\n .filter((panel): panel is HTMLElement => panel !== undefined)\n .flatMap(panel => Array.from(panel.querySelectorAll<HTMLElement>(MENU_ITEM_SELECTOR)))\n .find(item => Boolean(item.shadowRoot?.activeElement))\n}\n"],"mappings":";AAAA,IAAa,IAAwB,yEACxB,IAAqB;AAElC,SAAgB,EAAgB,GAAsC;CACpE,OAAO,MAAM,KAAK,EAAU,QAAQ,CAAC,CAAC,QACnC,MAAgC,aAAiB,eAAe,EAAM,QAAA,uEAA6B,CACtG;AACF;AAEA,SAAgB,EAAoB,GAAsC;CACxE,OAAO,EAAgB,CAAS,CAAC,CAAC,QAAO,MAAQ,EAAK,QAAQ,GAAG,EAAmB,iBAAiB,CAAC;AACxG;AAEA,SAAgB,EAAiB,GAAoB,GAAqB;CACxE,EAAgB,CAAM,CAAC,CAAC,SAAQ,MAAS,EAAO,YAAY,CAAK,CAAC;AACpE;AAEA,SAAgB,EAAuB,GAAkB,GAAc;CACrE,EAAK,iBAA8B,+BAA+B,CAAC,CAAC,SAAQ,MAAQ;EAClF,EAAgB,CAAI,CAAC,CAAC,SAAQ,MAAS,EAAM,aAAa,QAAQ,CAAI,CAAC;CACzE,CAAC;AACH;AAEA,SAAgB,EAAqB,GAAkC;CACrE,OACE,EACG,aAAa,CAAC,CACd,MAAM,MAA8B,aAAgB,eAAe,EAAK,QAAA,sBAA0B,CAAC,KAAK;AAE/G;AAEA,SAAgB,EAAc,GAA+B;CACvD,CAAC,KAAQ,EAAK,aAAa,UAAU,KACxC,EAAmD,YAAY;AAClE;AAEA,SAAgB,EAAoB,GAAoE;CACtG,OAAO,CAAC,GAAG,CAAM,CAAC,CACf,QAAQ,MAAgC,MAAU,KAAA,CAAS,CAAC,CAC5D,SAAQ,MAAS,MAAM,KAAK,EAAM,iBAA8B,CAAkB,CAAC,CAAC,CAAC,CACrF,MAAK,MAAQ,EAAQ,EAAK,YAAY,aAAc;AACzD"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import { hideOverlayPresence as e, showOverlayPresence as t } from "./presence.js";
|
|
2
|
+
import { defineOverlay as n } from "./overlay.js";
|
|
3
|
+
import { definePlugin as r } from "@greypan/js-kit";
|
|
4
|
+
//#region src/shared/overlay/anchored-panel.ts
|
|
5
|
+
var i = () => r((r) => {
|
|
6
|
+
let i, a, o = () => a?.panel ?? r.getLocalPanel(), s = () => {
|
|
7
|
+
a && (a.restoreContent(), a.remove(), a = void 0, i = void 0);
|
|
8
|
+
}, c = () => r.isPortal() ? (a ??= r.createPortal(), a.panel) : r.getLocalPanel(), l = (e, t) => {
|
|
9
|
+
if (i) {
|
|
10
|
+
i.updateAnchor(e), i.update(r.getPositioning());
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
i = n().make({
|
|
14
|
+
anchor: e,
|
|
15
|
+
overlay: t,
|
|
16
|
+
...r.getPositioning()
|
|
17
|
+
});
|
|
18
|
+
}, u = (e = !1) => {
|
|
19
|
+
let n = r.getAnchor();
|
|
20
|
+
if (!n) return;
|
|
21
|
+
let a = c();
|
|
22
|
+
a && (l(n, a), i?.open(), t(a, { isInstant: e }));
|
|
23
|
+
}, d = () => {
|
|
24
|
+
i?.dispose(), i = void 0, s();
|
|
25
|
+
};
|
|
26
|
+
return {
|
|
27
|
+
getPanel() {
|
|
28
|
+
return o();
|
|
29
|
+
},
|
|
30
|
+
open: u,
|
|
31
|
+
async close(t) {
|
|
32
|
+
i?.close();
|
|
33
|
+
let n = o();
|
|
34
|
+
return n && !await e(n) || t() ? !1 : (s(), !0);
|
|
35
|
+
},
|
|
36
|
+
updatePosition() {
|
|
37
|
+
i?.update(r.getPositioning());
|
|
38
|
+
},
|
|
39
|
+
reconfigure(e) {
|
|
40
|
+
let t = o()?.dataset.wuiPresence === "entering";
|
|
41
|
+
d(), e && u(!t);
|
|
42
|
+
},
|
|
43
|
+
dispose: d
|
|
44
|
+
};
|
|
45
|
+
});
|
|
46
|
+
//#endregion
|
|
47
|
+
export { i as defineAnchoredPanel };
|
|
48
|
+
|
|
49
|
+
//# sourceMappingURL=anchored-panel.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"anchored-panel.js","names":[],"sources":["../../../src/shared/overlay/anchored-panel.ts"],"sourcesContent":["import { definePlugin } from '@greypan/js-kit'\n\nimport type { OverlayOptions } from './overlay'\nimport { defineOverlay } from './overlay'\nimport type { OverlayApi } from './overlay'\nimport type { OverlayPortal } from './portal'\nimport { hideOverlayPresence, showOverlayPresence } from './presence'\n\nexport interface AnchoredPanelOptions {\n getAnchor(): HTMLElement | null\n getLocalPanel(): HTMLElement | null\n getPositioning(): OverlayOptions\n isPortal(): boolean\n createPortal(): OverlayPortal\n}\n\n/**\n * 管理锚定面板的本地/Portal 容器、定位器和可中断 presence。\n * 内容迁移与交互语义由各组件保留,避免把不同组件的 public contract 混入此模块。\n */\nexport interface AnchoredPanelApi {\n getPanel(): HTMLElement | null\n open(isInstant?: boolean): void\n close(isStillOpen: () => boolean): Promise<boolean>\n updatePosition(): void\n reconfigure(isOpen: boolean): void\n dispose(): void\n}\n\nexport const defineAnchoredPanel = () =>\n definePlugin<AnchoredPanelApi, AnchoredPanelOptions>(ctx => {\n let overlay: OverlayApi | undefined\n let portal: OverlayPortal | undefined\n\n const getPanel = () => portal?.panel ?? ctx.getLocalPanel()\n\n const disposePortal = () => {\n if (!portal) return\n portal.restoreContent()\n portal.remove()\n portal = undefined\n overlay = undefined\n }\n\n const getOrCreatePanel = (): HTMLElement | null => {\n if (!ctx.isPortal()) return ctx.getLocalPanel()\n portal ??= ctx.createPortal()\n return portal.panel\n }\n\n const ensureOverlay = (anchor: HTMLElement, panel: HTMLElement) => {\n if (overlay) {\n overlay.updateAnchor(anchor)\n overlay.update(ctx.getPositioning())\n return\n }\n overlay = defineOverlay().make({ anchor, overlay: panel, ...ctx.getPositioning() })\n }\n\n const open = (isInstant = false) => {\n const anchor = ctx.getAnchor()\n if (!anchor) return\n const panel = getOrCreatePanel()\n if (!panel) return\n ensureOverlay(anchor, panel)\n overlay?.open()\n showOverlayPresence(panel, { isInstant })\n }\n\n const dispose = () => {\n overlay?.dispose()\n overlay = undefined\n disposePortal()\n }\n\n return {\n getPanel() {\n return getPanel()\n },\n\n open,\n\n async close(isStillOpen) {\n overlay?.close()\n const panel = getPanel()\n if (panel && !(await hideOverlayPresence(panel))) return false\n if (isStillOpen()) return false\n disposePortal()\n return true\n },\n\n updatePosition() {\n overlay?.update(ctx.getPositioning())\n },\n\n reconfigure(isOpen) {\n const shouldAnimate = getPanel()?.dataset.wuiPresence === 'entering'\n dispose()\n if (isOpen) open(!shouldAnimate)\n },\n\n dispose\n }\n })\n"],"mappings":";;;;AA6BA,IAAa,UACX,GAAqD,MAAO;CAC1D,IAAI,GACA,GAEE,UAAiB,GAAQ,SAAS,EAAI,cAAc,GAEpD,UAAsB;EACrB,MACL,EAAO,eAAe,GACtB,EAAO,OAAO,GACd,IAAS,KAAA,GACT,IAAU,KAAA;CACZ,GAEM,UACC,EAAI,SAAS,KAClB,MAAW,EAAI,aAAa,GACrB,EAAO,SAFc,EAAI,cAAc,GAK1C,KAAiB,GAAqB,MAAuB;EACjE,IAAI,GAAS;GAEX,AADA,EAAQ,aAAa,CAAM,GAC3B,EAAQ,OAAO,EAAI,eAAe,CAAC;GACnC;EACF;EACA,IAAU,EAAc,CAAC,CAAC,KAAK;GAAE;GAAQ,SAAS;GAAO,GAAG,EAAI,eAAe;EAAE,CAAC;CACpF,GAEM,KAAQ,IAAY,OAAU;EAClC,IAAM,IAAS,EAAI,UAAU;EAC7B,IAAI,CAAC,GAAQ;EACb,IAAM,IAAQ,EAAiB;EAC1B,MACL,EAAc,GAAQ,CAAK,GAC3B,GAAS,KAAK,GACd,EAAoB,GAAO,EAAE,aAAU,CAAC;CAC1C,GAEM,UAAgB;EAGpB,AAFA,GAAS,QAAQ,GACjB,IAAU,KAAA,GACV,EAAc;CAChB;CAEA,OAAO;EACL,WAAW;GACT,OAAO,EAAS;EAClB;EAEA;EAEA,MAAM,MAAM,GAAa;GACvB,GAAS,MAAM;GACf,IAAM,IAAQ,EAAS;GAIvB,OAHI,KAAS,CAAE,MAAM,EAAoB,CAAK,KAC1C,EAAY,IAAU,MAC1B,EAAc,GACP;EACT;EAEA,iBAAiB;GACf,GAAS,OAAO,EAAI,eAAe,CAAC;EACtC;EAEA,YAAY,GAAQ;GAClB,IAAM,IAAgB,EAAS,CAAC,EAAE,QAAQ,gBAAgB;GAE1D,AADA,EAAQ,GACJ,KAAQ,EAAK,CAAC,CAAa;EACjC;EAEA;CACF;AACF,CAAC"}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import { getTransitionDuration as e } from "./presence.js";
|
|
2
|
+
import { definePlugin as t } from "@greypan/js-kit";
|
|
3
|
+
//#region src/shared/overlay/native-dialog-presence.ts
|
|
4
|
+
var n = () => t((t) => {
|
|
5
|
+
let n, r, i = !1, a = () => {
|
|
6
|
+
n !== void 0 && (clearTimeout(n), n = void 0);
|
|
7
|
+
}, o = () => {
|
|
8
|
+
r !== void 0 && (cancelAnimationFrame(r), r = void 0);
|
|
9
|
+
}, s = () => {
|
|
10
|
+
let e = t.getDialog();
|
|
11
|
+
!e || !i || t.isOpen() || (a(), i = !1, e.classList.remove("is-closing", "is-visible"), e.open && e.close?.());
|
|
12
|
+
}, c = () => {
|
|
13
|
+
let e = t.getDialog();
|
|
14
|
+
e && (i = !1, a(), e.classList.remove("is-closing"), e.open || e.showModal?.(), o(), r = requestAnimationFrame(() => {
|
|
15
|
+
r = void 0, !(!t.isConnected() || !t.isOpen() || !e.open) && e.classList.add("is-visible");
|
|
16
|
+
}));
|
|
17
|
+
}, l = () => {
|
|
18
|
+
let r = t.getDialog();
|
|
19
|
+
if (r?.open) {
|
|
20
|
+
if (o(), i = !0, !r.classList.contains("is-visible")) {
|
|
21
|
+
s();
|
|
22
|
+
return;
|
|
23
|
+
}
|
|
24
|
+
r.classList.add("is-closing"), r.classList.remove("is-visible"), a(), n = setTimeout(() => s(), e(r) + 80);
|
|
25
|
+
}
|
|
26
|
+
};
|
|
27
|
+
return {
|
|
28
|
+
sync(e) {
|
|
29
|
+
e ? c() : l();
|
|
30
|
+
},
|
|
31
|
+
handleTransitionEnd(e) {
|
|
32
|
+
e.target === t.getDialog() && e.propertyName === "transform" && s();
|
|
33
|
+
},
|
|
34
|
+
handleNativeClose() {
|
|
35
|
+
o(), a(), i = !1, t.getDialog()?.classList.remove("is-closing", "is-visible");
|
|
36
|
+
},
|
|
37
|
+
dispose() {
|
|
38
|
+
o(), a(), i = !1;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
});
|
|
42
|
+
//#endregion
|
|
43
|
+
export { n as defineNativeDialogPresence };
|
|
44
|
+
|
|
45
|
+
//# sourceMappingURL=native-dialog-presence.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"native-dialog-presence.js","names":[],"sources":["../../../src/shared/overlay/native-dialog-presence.ts"],"sourcesContent":["import { definePlugin } from '@greypan/js-kit'\n\nimport { getTransitionDuration } from './presence'\n\nexport interface NativeDialogPresenceOptions {\n getDialog(): HTMLDialogElement | null\n isConnected(): boolean\n isOpen(): boolean\n}\n\nexport interface NativeDialogPresenceApi {\n sync(open: boolean): void\n handleTransitionEnd(event: TransitionEvent): void\n handleNativeClose(): void\n dispose(): void\n}\n\n/** 管理原生 dialog 保持在 top layer 直至退出动画完成的生命周期。 */\nexport const defineNativeDialogPresence = () =>\n definePlugin<NativeDialogPresenceApi, NativeDialogPresenceOptions>(ctx => {\n let closeFallbackTimer: ReturnType<typeof setTimeout> | undefined\n let openFrame: number | undefined\n let isClosing = false\n\n const clearCloseFallback = () => {\n if (closeFallbackTimer === undefined) return\n clearTimeout(closeFallbackTimer)\n closeFallbackTimer = undefined\n }\n\n const cancelOpenFrame = () => {\n if (openFrame === undefined) return\n cancelAnimationFrame(openFrame)\n openFrame = undefined\n }\n\n const finishClosing = () => {\n const dialog = ctx.getDialog()\n if (!dialog || !isClosing || ctx.isOpen()) return\n clearCloseFallback()\n isClosing = false\n dialog.classList.remove('is-closing', 'is-visible')\n if (dialog.open) dialog.close?.()\n }\n\n const startOpening = () => {\n const dialog = ctx.getDialog()\n if (!dialog) return\n isClosing = false\n clearCloseFallback()\n dialog.classList.remove('is-closing')\n if (!dialog.open) dialog.showModal?.()\n\n cancelOpenFrame()\n openFrame = requestAnimationFrame(() => {\n openFrame = undefined\n if (!ctx.isConnected() || !ctx.isOpen() || !dialog.open) return\n dialog.classList.add('is-visible')\n })\n }\n\n const startClosing = () => {\n const dialog = ctx.getDialog()\n if (!dialog?.open) return\n cancelOpenFrame()\n isClosing = true\n if (!dialog.classList.contains('is-visible')) {\n finishClosing()\n return\n }\n\n dialog.classList.add('is-closing')\n dialog.classList.remove('is-visible')\n clearCloseFallback()\n closeFallbackTimer = setTimeout(() => finishClosing(), getTransitionDuration(dialog) + 80)\n }\n\n return {\n sync(open) {\n if (open) startOpening()\n else startClosing()\n },\n\n handleTransitionEnd(event) {\n if (event.target !== ctx.getDialog() || event.propertyName !== 'transform') return\n finishClosing()\n },\n\n handleNativeClose() {\n cancelOpenFrame()\n clearCloseFallback()\n isClosing = false\n ctx.getDialog()?.classList.remove('is-closing', 'is-visible')\n },\n\n dispose() {\n cancelOpenFrame()\n clearCloseFallback()\n isClosing = false\n }\n }\n })\n"],"mappings":";;;AAkBA,IAAa,UACX,GAAmE,MAAO;CACxE,IAAI,GACA,GACA,IAAY,IAEV,UAA2B;EAC3B,MAAuB,KAAA,MAC3B,aAAa,CAAkB,GAC/B,IAAqB,KAAA;CACvB,GAEM,UAAwB;EACxB,MAAc,KAAA,MAClB,qBAAqB,CAAS,GAC9B,IAAY,KAAA;CACd,GAEM,UAAsB;EAC1B,IAAM,IAAS,EAAI,UAAU;EACzB,CAAC,KAAU,CAAC,KAAa,EAAI,OAAO,MACxC,EAAmB,GACnB,IAAY,IACZ,EAAO,UAAU,OAAO,cAAc,YAAY,GAC9C,EAAO,QAAM,EAAO,QAAQ;CAClC,GAEM,UAAqB;EACzB,IAAM,IAAS,EAAI,UAAU;EACxB,MACL,IAAY,IACZ,EAAmB,GACnB,EAAO,UAAU,OAAO,YAAY,GAC/B,EAAO,QAAM,EAAO,YAAY,GAErC,EAAgB,GAChB,IAAY,4BAA4B;GACtC,IAAY,KAAA,GACR,GAAC,EAAI,YAAY,KAAK,CAAC,EAAI,OAAO,KAAK,CAAC,EAAO,SACnD,EAAO,UAAU,IAAI,YAAY;EACnC,CAAC;CACH,GAEM,UAAqB;EACzB,IAAM,IAAS,EAAI,UAAU;EACxB,OAAQ,MAGb;OAFA,EAAgB,GAChB,IAAY,IACR,CAAC,EAAO,UAAU,SAAS,YAAY,GAAG;IAC5C,EAAc;IACd;GACF;GAKA,AAHA,EAAO,UAAU,IAAI,YAAY,GACjC,EAAO,UAAU,OAAO,YAAY,GACpC,EAAmB,GACnB,IAAqB,iBAAiB,EAAc,GAAG,EAAsB,CAAM,IAAI,EAAE;EALzF;CAMF;CAEA,OAAO;EACL,KAAK,GAAM;GACT,AAAI,IAAM,EAAa,IAClB,EAAa;EACpB;EAEA,oBAAoB,GAAO;GACrB,EAAM,WAAW,EAAI,UAAU,KAAK,EAAM,iBAAiB,eAC/D,EAAc;EAChB;EAEA,oBAAoB;GAIlB,AAHA,EAAgB,GAChB,EAAmB,GACnB,IAAY,IACZ,EAAI,UAAU,CAAC,EAAE,UAAU,OAAO,cAAc,YAAY;EAC9D;EAEA,UAAU;GAGR,AAFA,EAAgB,GAChB,EAAmB,GACnB,IAAY;EACd;CACF;AACF,CAAC"}
|
|
@@ -14,7 +14,7 @@ function c(e) {
|
|
|
14
14
|
let [t, n] = e.split("-"), r = n === "start" ? "left" : n === "end" ? "right" : "center", i = n === "start" ? "top" : n === "end" ? "bottom" : "center";
|
|
15
15
|
return t === "top" ? `bottom ${r}` : t === "bottom" ? `top ${r}` : t === "left" ? `right ${i}` : `left ${i}`;
|
|
16
16
|
}
|
|
17
|
-
var l = o((o) => {
|
|
17
|
+
var l = () => o((o) => {
|
|
18
18
|
let l = {
|
|
19
19
|
placement: o.placement ?? s.placement,
|
|
20
20
|
offset: o.offset ?? s.offset,
|
|
@@ -54,6 +54,9 @@ var l = o((o) => {
|
|
|
54
54
|
toggle() {
|
|
55
55
|
d ? this.close() : this.open();
|
|
56
56
|
},
|
|
57
|
+
update(e) {
|
|
58
|
+
Object.assign(l, e), d && m();
|
|
59
|
+
},
|
|
57
60
|
updateAnchor(e) {
|
|
58
61
|
p = e, d && m();
|
|
59
62
|
},
|
|
@@ -63,6 +66,6 @@ var l = o((o) => {
|
|
|
63
66
|
};
|
|
64
67
|
});
|
|
65
68
|
//#endregion
|
|
66
|
-
export { l as
|
|
69
|
+
export { l as defineOverlay };
|
|
67
70
|
|
|
68
71
|
//# sourceMappingURL=overlay.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"overlay.js","names":[],"sources":["../../../src/shared/overlay/overlay.ts"],"sourcesContent":["import {\n autoUpdate,\n computePosition,\n flip,\n offset,\n shift,\n size,\n type Middleware,\n type Placement,\n type Strategy\n} from '@floating-ui/dom'\nimport { definePlugin } from '@greypan/js-kit'\n\nexport interface OverlayOptions {\n placement?: Placement\n offset?: number\n flip?: boolean\n shift?: boolean\n /** Sync overlay width to anchor width */\n matchWidth?: boolean\n /** Set overlay min-width to anchor width (content can expand wider) */\n minAnchorWidth?: boolean\n strategy?: Strategy\n}\n\nexport interface OverlayApi {\n isOpen(): boolean\n readonly options: Required<OverlayOptions>\n open(): void\n close(): void\n toggle(): void\n updateAnchor(anchor: HTMLElement): void\n dispose(): void\n}\n\nconst DEFAULT_OPTIONS: Required<OverlayOptions> = {\n placement: 'bottom-start',\n offset: 4,\n flip: true,\n shift: true,\n matchWidth: false,\n minAnchorWidth: false,\n strategy: 'absolute'\n}\n\nfunction getTransformOrigin(placement: Placement): string {\n const [side, alignment] = placement.split('-')\n const horizontalOrigin = alignment === 'start' ? 'left' : alignment === 'end' ? 'right' : 'center'\n const verticalOrigin = alignment === 'start' ? 'top' : alignment === 'end' ? 'bottom' : 'center'\n\n if (side === 'top') return `bottom ${horizontalOrigin}`\n if (side === 'bottom') return `top ${horizontalOrigin}`\n if (side === 'left') return `right ${verticalOrigin}`\n return `left ${verticalOrigin}`\n}\n\nexport const
|
|
1
|
+
{"version":3,"file":"overlay.js","names":[],"sources":["../../../src/shared/overlay/overlay.ts"],"sourcesContent":["import {\n autoUpdate,\n computePosition,\n flip,\n offset,\n shift,\n size,\n type Middleware,\n type Placement,\n type Strategy\n} from '@floating-ui/dom'\nimport { definePlugin } from '@greypan/js-kit'\n\nexport interface OverlayOptions {\n placement?: Placement\n offset?: number\n flip?: boolean\n shift?: boolean\n /** Sync overlay width to anchor width */\n matchWidth?: boolean\n /** Set overlay min-width to anchor width (content can expand wider) */\n minAnchorWidth?: boolean\n strategy?: Strategy\n}\n\nexport interface OverlayApi {\n isOpen(): boolean\n readonly options: Required<OverlayOptions>\n open(): void\n close(): void\n toggle(): void\n update(options: Partial<OverlayOptions>): void\n updateAnchor(anchor: HTMLElement): void\n dispose(): void\n}\n\nconst DEFAULT_OPTIONS: Required<OverlayOptions> = {\n placement: 'bottom-start',\n offset: 4,\n flip: true,\n shift: true,\n matchWidth: false,\n minAnchorWidth: false,\n strategy: 'absolute'\n}\n\nfunction getTransformOrigin(placement: Placement): string {\n const [side, alignment] = placement.split('-')\n const horizontalOrigin = alignment === 'start' ? 'left' : alignment === 'end' ? 'right' : 'center'\n const verticalOrigin = alignment === 'start' ? 'top' : alignment === 'end' ? 'bottom' : 'center'\n\n if (side === 'top') return `bottom ${horizontalOrigin}`\n if (side === 'bottom') return `top ${horizontalOrigin}`\n if (side === 'left') return `right ${verticalOrigin}`\n return `left ${verticalOrigin}`\n}\n\nexport const defineOverlay = () =>\n definePlugin<OverlayApi, { anchor: HTMLElement; overlay: HTMLElement } & OverlayOptions>(ctx => {\n const options: Required<OverlayOptions> = {\n placement: ctx.placement ?? DEFAULT_OPTIONS.placement,\n offset: ctx.offset ?? DEFAULT_OPTIONS.offset,\n flip: ctx.flip ?? DEFAULT_OPTIONS.flip,\n shift: ctx.shift ?? DEFAULT_OPTIONS.shift,\n matchWidth: ctx.matchWidth ?? DEFAULT_OPTIONS.matchWidth,\n minAnchorWidth: ctx.minAnchorWidth ?? DEFAULT_OPTIONS.minAnchorWidth,\n strategy: ctx.strategy ?? DEFAULT_OPTIONS.strategy\n }\n\n const overlay = ctx.overlay\n let isOpen = false\n let cleanup: (() => void) | null = null\n let anchor = ctx.anchor\n\n function updatePosition() {\n const middleware: Middleware[] = [offset(options.offset)]\n if (options.flip) middleware.push(flip())\n if (options.shift) middleware.push(shift({ padding: 8 }))\n if (options.matchWidth) {\n middleware.push(\n size({\n apply({ rects }) {\n overlay.style.width = `${rects.reference.width}px`\n }\n })\n )\n } else if (options.minAnchorWidth) {\n middleware.push(\n size({\n apply({ rects }) {\n overlay.style.minWidth = `${Math.max(rects.reference.width, 120)}px`\n }\n })\n )\n }\n\n cleanup?.()\n cleanup = autoUpdate(anchor, overlay, () => {\n void computePosition(anchor, overlay, {\n placement: options.placement,\n strategy: options.strategy,\n middleware\n }).then(({ x, y, placement }) => {\n overlay.style.left = `${x}px`\n overlay.style.top = `${y}px`\n overlay.style.setProperty('--wui-overlay-transform-origin', getTransformOrigin(placement))\n })\n })\n }\n\n return {\n isOpen() {\n return isOpen\n },\n options,\n\n open() {\n if (isOpen) return\n isOpen = true\n overlay.style.display = ''\n updatePosition()\n },\n\n close() {\n if (!isOpen) return\n isOpen = false\n cleanup?.()\n cleanup = null\n },\n\n toggle() {\n if (isOpen) this.close()\n else this.open()\n },\n\n update(nextOptions) {\n Object.assign(options, nextOptions)\n if (isOpen) updatePosition()\n },\n\n updateAnchor(newAnchor: HTMLElement) {\n anchor = newAnchor\n if (isOpen) updatePosition()\n },\n\n dispose() {\n this.close()\n }\n }\n })\n"],"mappings":";;;AAoCA,IAAM,IAA4C;CAChD,WAAW;CACX,QAAQ;CACR,MAAM;CACN,OAAO;CACP,YAAY;CACZ,gBAAgB;CAChB,UAAU;AACZ;AAEA,SAAS,EAAmB,GAA8B;CACxD,IAAM,CAAC,GAAM,KAAa,EAAU,MAAM,GAAG,GACvC,IAAmB,MAAc,UAAU,SAAS,MAAc,QAAQ,UAAU,UACpF,IAAiB,MAAc,UAAU,QAAQ,MAAc,QAAQ,WAAW;CAKxF,OAHI,MAAS,QAAc,UAAU,MACjC,MAAS,WAAiB,OAAO,MACjC,MAAS,SAAe,SAAS,MAC9B,QAAQ;AACjB;AAEA,IAAa,UACX,GAAyF,MAAO;CAC9F,IAAM,IAAoC;EACxC,WAAW,EAAI,aAAa,EAAgB;EAC5C,QAAQ,EAAI,UAAU,EAAgB;EACtC,MAAM,EAAI,QAAQ,EAAgB;EAClC,OAAO,EAAI,SAAS,EAAgB;EACpC,YAAY,EAAI,cAAc,EAAgB;EAC9C,gBAAgB,EAAI,kBAAkB,EAAgB;EACtD,UAAU,EAAI,YAAY,EAAgB;CAC5C,GAEM,IAAU,EAAI,SAChB,IAAS,IACT,IAA+B,MAC/B,IAAS,EAAI;CAEjB,SAAS,IAAiB;EACxB,IAAM,IAA2B,CAAC,EAAO,EAAQ,MAAM,CAAC;EAsBxD,AArBI,EAAQ,QAAM,EAAW,KAAK,EAAK,CAAC,GACpC,EAAQ,SAAO,EAAW,KAAK,EAAM,EAAE,SAAS,EAAE,CAAC,CAAC,GACpD,EAAQ,aACV,EAAW,KACT,EAAK,EACH,MAAM,EAAE,YAAS;GACf,EAAQ,MAAM,QAAQ,GAAG,EAAM,UAAU,MAAM;EACjD,EACF,CAAC,CACH,IACS,EAAQ,kBACjB,EAAW,KACT,EAAK,EACH,MAAM,EAAE,YAAS;GACf,EAAQ,MAAM,WAAW,GAAG,KAAK,IAAI,EAAM,UAAU,OAAO,GAAG,EAAE;EACnE,EACF,CAAC,CACH,GAGF,IAAU,GACV,IAAU,EAAW,GAAQ,SAAe;GAC1C,EAAqB,GAAQ,GAAS;IACpC,WAAW,EAAQ;IACnB,UAAU,EAAQ;IAClB;GACF,CAAC,CAAC,CAAC,MAAM,EAAE,MAAG,MAAG,mBAAgB;IAG/B,AAFA,EAAQ,MAAM,OAAO,GAAG,EAAE,KAC1B,EAAQ,MAAM,MAAM,GAAG,EAAE,KACzB,EAAQ,MAAM,YAAY,kCAAkC,EAAmB,CAAS,CAAC;GAC3F,CAAC;EACH,CAAC;CACH;CAEA,OAAO;EACL,SAAS;GACP,OAAO;EACT;EACA;EAEA,OAAO;GACD,MACJ,IAAS,IACT,EAAQ,MAAM,UAAU,IACxB,EAAe;EACjB;EAEA,QAAQ;GACD,MACL,IAAS,IACT,IAAU,GACV,IAAU;EACZ;EAEA,SAAS;GACP,AAAI,IAAQ,KAAK,MAAM,IAClB,KAAK,KAAK;EACjB;EAEA,OAAO,GAAa;GAElB,AADA,OAAO,OAAO,GAAS,CAAW,GAC9B,KAAQ,EAAe;EAC7B;EAEA,aAAa,GAAwB;GAEnC,AADA,IAAS,GACL,KAAQ,EAAe;EAC7B;EAEA,UAAU;GACR,KAAK,MAAM;EACb;CACF;AACF,CAAC"}
|
|
@@ -5,12 +5,12 @@ function n(e) {
|
|
|
5
5
|
let t = document.createElement("div"), n = t.attachShadow({ mode: "open" }), i = document.createElement("style");
|
|
6
6
|
i.textContent = e.style;
|
|
7
7
|
let a = document.createElement("div");
|
|
8
|
-
a.className = e.className, n.append(i, a), r(e.container, e.target).appendChild(t);
|
|
8
|
+
a.className = e.className, a.dataset.wuiPresence = "entering", n.append(i, a), r(e.container, e.target).appendChild(t);
|
|
9
9
|
let o = [];
|
|
10
10
|
return {
|
|
11
11
|
panel: a,
|
|
12
|
-
moveContent(e) {
|
|
13
|
-
o.splice(0, o.length, ...e),
|
|
12
|
+
moveContent(e, t = a) {
|
|
13
|
+
o.splice(0, o.length, ...e), t.append(...o);
|
|
14
14
|
},
|
|
15
15
|
restoreContent() {
|
|
16
16
|
e.target.append(...o), o.length = 0;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"portal.js","names":[],"sources":["../../../src/shared/overlay/portal.ts"],"sourcesContent":["import { getFallbackOverlayRoot } from '@/shared/theme/overlay-root'\nimport { findNearestTheme } from '@/shared/theme/theme-scope'\n\nexport type OverlayContainer = HTMLElement | (() => HTMLElement | undefined)\n\ninterface OverlayPortalOptions {\n container?: OverlayContainer\n target: Element\n style: string\n className: string\n}\n\nexport interface OverlayPortal {\n readonly panel: HTMLElement\n restoreContent(): void\n moveContent(nodes: Node[]): void\n remove(): void\n}\n\nexport function createOverlayPortal(options: OverlayPortalOptions): OverlayPortal {\n const host = document.createElement('div')\n const root = host.attachShadow({ mode: 'open' })\n const style = document.createElement('style')\n style.textContent = options.style\n const panel = document.createElement('div')\n panel.className = options.className\n root.append(style, panel)\n resolveOverlayContainer(options.container, options.target).appendChild(host)\n\n const nodes: Node[] = []\n return {\n panel,\n moveContent(content) {\n nodes.splice(0, nodes.length, ...content)\n
|
|
1
|
+
{"version":3,"file":"portal.js","names":[],"sources":["../../../src/shared/overlay/portal.ts"],"sourcesContent":["import { getFallbackOverlayRoot } from '@/shared/theme/overlay-root'\nimport { findNearestTheme } from '@/shared/theme/theme-scope'\n\nexport type OverlayContainer = HTMLElement | (() => HTMLElement | undefined)\n\ninterface OverlayPortalOptions {\n container?: OverlayContainer\n target: Element\n style: string\n className: string\n}\n\nexport interface OverlayPortal {\n readonly panel: HTMLElement\n restoreContent(): void\n moveContent(nodes: Node[], target?: HTMLElement): void\n remove(): void\n}\n\nexport function createOverlayPortal(options: OverlayPortalOptions): OverlayPortal {\n const host = document.createElement('div')\n const root = host.attachShadow({ mode: 'open' })\n const style = document.createElement('style')\n style.textContent = options.style\n const panel = document.createElement('div')\n panel.className = options.className\n panel.dataset.wuiPresence = 'entering'\n root.append(style, panel)\n resolveOverlayContainer(options.container, options.target).appendChild(host)\n\n const nodes: Node[] = []\n return {\n panel,\n moveContent(content, target = panel) {\n nodes.splice(0, nodes.length, ...content)\n target.append(...nodes)\n },\n restoreContent() {\n options.target.append(...nodes)\n nodes.length = 0\n },\n remove() {\n host.remove()\n }\n }\n}\n\nexport function resolveOverlayContainer(container: OverlayContainer | undefined, target: Element): HTMLElement {\n const explicit = typeof container === 'function' ? container() : container\n return explicit ?? findNearestTheme(target)?.getOverlayRoot() ?? getFallbackOverlayRoot()\n}\n"],"mappings":";;;AAmBA,SAAgB,EAAoB,GAA8C;CAChF,IAAM,IAAO,SAAS,cAAc,KAAK,GACnC,IAAO,EAAK,aAAa,EAAE,MAAM,OAAO,CAAC,GACzC,IAAQ,SAAS,cAAc,OAAO;CAC5C,EAAM,cAAc,EAAQ;CAC5B,IAAM,IAAQ,SAAS,cAAc,KAAK;CAI1C,AAHA,EAAM,YAAY,EAAQ,WAC1B,EAAM,QAAQ,cAAc,YAC5B,EAAK,OAAO,GAAO,CAAK,GACxB,EAAwB,EAAQ,WAAW,EAAQ,MAAM,CAAC,CAAC,YAAY,CAAI;CAE3E,IAAM,IAAgB,CAAC;CACvB,OAAO;EACL;EACA,YAAY,GAAS,IAAS,GAAO;GAEnC,AADA,EAAM,OAAO,GAAG,EAAM,QAAQ,GAAG,CAAO,GACxC,EAAO,OAAO,GAAG,CAAK;EACxB;EACA,iBAAiB;GAEf,AADA,EAAQ,OAAO,OAAO,GAAG,CAAK,GAC9B,EAAM,SAAS;EACjB;EACA,SAAS;GACP,EAAK,OAAO;EACd;CACF;AACF;AAEA,SAAgB,EAAwB,GAAyC,GAA8B;CAE7G,QADiB,OAAO,KAAc,aAAa,EAAU,IAAI,MAC9C,EAAiB,CAAM,CAAC,EAAE,eAAe,KAAK,EAAuB;AAC1F"}
|
|
@@ -13,7 +13,7 @@ function r(t, n = {}) {
|
|
|
13
13
|
t.dataset.wuiPresence = "open";
|
|
14
14
|
return;
|
|
15
15
|
}
|
|
16
|
-
t.dataset.wuiPresence = "entering", requestAnimationFrame(() => {
|
|
16
|
+
t.dataset.wuiPresence = "entering", t.offsetWidth, requestAnimationFrame(() => {
|
|
17
17
|
t.dataset.wuiPresence === "entering" && (t.dataset.wuiPresence = "open");
|
|
18
18
|
});
|
|
19
19
|
}
|