@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
|
@@ -1,94 +1,86 @@
|
|
|
1
1
|
import e from "../../_virtual/_@oxc-project_runtime@0.146.0/helpers/esm/decorate.js";
|
|
2
2
|
import { normalizeLiteral as t, normalizeNumber as n } from "../../shared/normalize/index.js";
|
|
3
|
-
import {
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
3
|
+
import { dispatchOpenChangeEvent as r } from "../../shared/open-state/index.js";
|
|
4
|
+
import { overlayComposition as i } from "../../shared/overlay/composition.js";
|
|
5
|
+
import { defineOverlay as a } from "../../shared/overlay/overlay.js";
|
|
6
|
+
import { hideOverlayPresence as o, showOverlayPresence as s } from "../../shared/overlay/presence.js";
|
|
7
|
+
import { defineScrollLockLease as c } from "../../shared/scroll-lock/scroll-lock.js";
|
|
8
|
+
import { UserChangeController as l } from "../../shared/events/user-change.js";
|
|
7
9
|
import "../dropdown-divider/index.js";
|
|
8
10
|
import "../dropdown-header/index.js";
|
|
9
11
|
import "../dropdown-item/index.js";
|
|
10
|
-
import {
|
|
11
|
-
import {
|
|
12
|
-
import
|
|
13
|
-
import {
|
|
14
|
-
import {
|
|
12
|
+
import { captureFrameworkAnchors as u, focusMenuItem as d, getMenuChildren as f, getMenuItemFromEvent as p, hideNestedMenuChildren as m, moveMenuChildren as h, orderManagedMenuItems as g, reconcileManagedMenuItems as _, restoreFrameworkAnchors as v, returnManagedMenuItemsToSlot as y } from "../../shared/menu-portal/menu-tree.js";
|
|
13
|
+
import { createClosingSubmenuStack as b, createMenuHoverBinder as x, createMenuOutsideClickGuard as S, getEnabledMenuLevelItems as C, getFocusedMenuItemFromPanels as w, handleMenuKeyboard as T } from "../../shared/menu-behavior/index.js";
|
|
14
|
+
import { createMenuPortalOverlay as E } from "../../shared/menu-portal/menu-portal.js";
|
|
15
|
+
import { defineOverlayLifecycle as D } from "../../shared/overlay/lifecycle.js";
|
|
16
|
+
import { FLOATING_PLACEMENTS as O } from "../../shared/overlay/placement-props.js";
|
|
17
|
+
import k from "./style.js";
|
|
18
|
+
import { LitElement as A, html as j, unsafeCSS as M } from "lit";
|
|
19
|
+
import { customElement as N, property as P, state as F } from "lit/decorators.js";
|
|
15
20
|
//#region src/components/dropdown/index.ts
|
|
16
|
-
var
|
|
17
|
-
"top",
|
|
18
|
-
"top-start",
|
|
19
|
-
"top-end",
|
|
20
|
-
"right",
|
|
21
|
-
"right-start",
|
|
22
|
-
"right-end",
|
|
23
|
-
"bottom",
|
|
24
|
-
"bottom-start",
|
|
25
|
-
"bottom-end",
|
|
26
|
-
"left",
|
|
27
|
-
"left-start",
|
|
28
|
-
"left-end"
|
|
29
|
-
], M = class extends S {
|
|
21
|
+
var I = "web-ui-menu-level-", L = "wui-dropdown-menu-item", R = 0, z = class extends A {
|
|
30
22
|
constructor(...e) {
|
|
31
|
-
super(...e), this.open = !1, this.disabled = !1, this.matchWidth = !1, this.noScrollLock = !1, this._placement = "bottom-start", this._offset = 4, this._activePath = [], this._overlays = /* @__PURE__ */ new Map(), this.
|
|
23
|
+
super(...e), this.open = !1, this.disabled = !1, this.matchWidth = !1, this.noScrollLock = !1, this._placement = "bottom-start", this._offset = 4, this._activePath = [], this._overlays = /* @__PURE__ */ new Map(), this._lifecycle = D().make({
|
|
24
|
+
isConnected: () => this.isConnected,
|
|
25
|
+
isOpen: () => this.open
|
|
26
|
+
}), this._scrollLock = c().make(), this._outsideClickGuard = S(this, (e) => [...this._overlays.values()].some(({ overlay: t }) => i.contains(t, e))), this._closingSubmenus = b({
|
|
27
|
+
getPanel: (e) => e.overlay,
|
|
28
|
+
restoreItems: (e, t) => h(e.content, t),
|
|
29
|
+
dispose: (e) => {
|
|
30
|
+
i.unregisterPanel(e.overlay), e.overlay.remove(), e.api.dispose();
|
|
31
|
+
}
|
|
32
|
+
}), this._hoverDelegate = {
|
|
33
|
+
getOpenDepth: () => this._activePath.length,
|
|
34
|
+
getLevelItems: (e) => this._getLevelItems(e),
|
|
35
|
+
getActiveItem: (e) => this._getLevelItems(e)[this._activePath[e]],
|
|
36
|
+
isSubmenuItem: (e) => e.hasAttribute("submenu"),
|
|
37
|
+
openSubmenu: (e) => {
|
|
38
|
+
let t = this._getFocusedLevel(e);
|
|
39
|
+
if (t === void 0) return;
|
|
40
|
+
let n = this._getLevelItems(t).indexOf(e);
|
|
41
|
+
n >= 0 && this._toggleSubmenu(t, n);
|
|
42
|
+
},
|
|
43
|
+
closeFrom: (e) => this._closeSubmenuFrom(e + 1)
|
|
44
|
+
}, this._hoverBinder = x(this._hoverDelegate, "web-ui-dropdown-item"), this._keyboardDelegate = {
|
|
45
|
+
getFocusedItem: (e) => w(e, [...this._overlays.values()].map(({ overlay: e }) => e), "web-ui-dropdown-item"),
|
|
46
|
+
getLevelOf: (e) => this._getFocusedLevel(e),
|
|
47
|
+
getEnabledItems: (e) => C(this._overlays.get(e)?.content),
|
|
48
|
+
isSubmenuItem: (e) => e.hasAttribute("submenu"),
|
|
49
|
+
openSubmenuInstant: (e) => {
|
|
50
|
+
let t = this._getFocusedLevel(e);
|
|
51
|
+
if (t === void 0) return;
|
|
52
|
+
let n = this._getLevelItems(t).indexOf(e);
|
|
53
|
+
n >= 0 && this._toggleSubmenu(t, n, !0);
|
|
54
|
+
},
|
|
55
|
+
closeToParent: (e) => (this._closeSubmenuFrom(e), this._getLevelItems(e - 1)[this._activePath[e - 1]]),
|
|
56
|
+
closeDeepestOrAll: () => {
|
|
57
|
+
this._activePath.length > 0 ? this._closeSubmenuFrom(this._activePath.length) : this._closeAll(!0);
|
|
58
|
+
}
|
|
59
|
+
}, this._userOpenChange = new l(), this._shouldOpenInstantly = !0, this._menuSyncScheduled = !1, this._level0ItemAnchors = /* @__PURE__ */ new Map(), this._menuContentObserver = new MutationObserver(() => {
|
|
32
60
|
this.open && this._scheduleMenuSync();
|
|
33
61
|
}), this._onTriggerClick = (e) => {
|
|
34
62
|
this.disabled || (this.open ? this._closeAll(!0) : this._openMenu(e.detail === 0, !0));
|
|
35
63
|
}, this._onClickOutside = (e) => {
|
|
36
|
-
!this.isOpen || this.
|
|
64
|
+
!this.isOpen || this._outsideClickGuard.isArmed() || this._outsideClickGuard.isInside(e) || this._closeAll(!0);
|
|
37
65
|
}, this._onMenuClick = (e) => {
|
|
38
|
-
let t =
|
|
66
|
+
let t = p(e);
|
|
39
67
|
if (!t || t.hasAttribute("disabled") || !t.hasAttribute("submenu")) return;
|
|
40
68
|
let n = this._getFocusedLevel(t);
|
|
41
69
|
if (n === void 0) return;
|
|
42
70
|
let r = this._getLevelItems(n).indexOf(t);
|
|
43
71
|
r >= 0 && this._toggleSubmenu(n, r, e.detail === 0);
|
|
44
72
|
}, this._onKeydown = (e) => {
|
|
45
|
-
|
|
46
|
-
if (e.key === "Escape") {
|
|
47
|
-
this._activePath.length > 0 ? this._closeSubmenuFrom(this._activePath.length) : this._closeAll(!0), e.preventDefault();
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
let t = this._getFocusedItem(e), n = this._getFocusedLevel(t);
|
|
51
|
-
if (n === void 0) return;
|
|
52
|
-
let r = this._getEnabledLevelItems(n), i = t ? r.indexOf(t) : -1;
|
|
53
|
-
switch (e.key) {
|
|
54
|
-
case "ArrowDown":
|
|
55
|
-
this._focusMenuItem(r[(i + 1 + r.length) % r.length]);
|
|
56
|
-
break;
|
|
57
|
-
case "ArrowUp":
|
|
58
|
-
this._focusMenuItem(r[(i - 1 + r.length) % r.length]);
|
|
59
|
-
break;
|
|
60
|
-
case "Home":
|
|
61
|
-
this._focusMenuItem(r[0]);
|
|
62
|
-
break;
|
|
63
|
-
case "End":
|
|
64
|
-
this._focusMenuItem(r.at(-1));
|
|
65
|
-
break;
|
|
66
|
-
case "ArrowRight":
|
|
67
|
-
if (t?.hasAttribute("submenu")) {
|
|
68
|
-
let e = this._getLevelItems(n).indexOf(t);
|
|
69
|
-
this._toggleSubmenu(n, e, !0), requestAnimationFrame(() => requestAnimationFrame(() => this._focusMenuItem(this._getEnabledLevelItems(n + 1)[0])));
|
|
70
|
-
}
|
|
71
|
-
break;
|
|
72
|
-
case "ArrowLeft":
|
|
73
|
-
n > 0 && (this._closeSubmenuFrom(n), this._focusMenuItem(this._getLevelItems(n - 1)[this._activePath[n - 1]]));
|
|
74
|
-
break;
|
|
75
|
-
case "Enter":
|
|
76
|
-
case " ":
|
|
77
|
-
t?.click();
|
|
78
|
-
break;
|
|
79
|
-
default: return;
|
|
80
|
-
}
|
|
81
|
-
e.preventDefault(), e.stopPropagation();
|
|
73
|
+
this.disabled || !this.open || T(this._keyboardDelegate, e);
|
|
82
74
|
};
|
|
83
75
|
}
|
|
84
76
|
static {
|
|
85
|
-
this.styles =
|
|
77
|
+
this.styles = M(k);
|
|
86
78
|
}
|
|
87
79
|
get placement() {
|
|
88
80
|
return this._placement;
|
|
89
81
|
}
|
|
90
82
|
set placement(e) {
|
|
91
|
-
this._placement = t(e,
|
|
83
|
+
this._placement = t(e, O, "bottom-start");
|
|
92
84
|
}
|
|
93
85
|
get offset() {
|
|
94
86
|
return this._offset;
|
|
@@ -100,7 +92,7 @@ var O = "web-ui-menu-level-", k = "wui-dropdown-menu-item", A = 0, j = [
|
|
|
100
92
|
return this.open || this._activePath.length > 0;
|
|
101
93
|
}
|
|
102
94
|
connectedCallback() {
|
|
103
|
-
super.connectedCallback(), this.addEventListener("keydown", this._onKeydown), document.addEventListener("click", this._onClickOutside), this._menuContentObserver.observe(this, {
|
|
95
|
+
super.connectedCallback(), this._lifecycle.resume(), this.addEventListener("keydown", this._onKeydown), document.addEventListener("click", this._onClickOutside), this._menuContentObserver.observe(this, {
|
|
104
96
|
childList: !0,
|
|
105
97
|
subtree: !0
|
|
106
98
|
});
|
|
@@ -109,26 +101,22 @@ var O = "web-ui-menu-level-", k = "wui-dropdown-menu-item", A = 0, j = [
|
|
|
109
101
|
this.shadowRoot?.querySelector("slot[name=\"trigger\"]")?.addEventListener("slotchange", () => this.requestUpdate());
|
|
110
102
|
}
|
|
111
103
|
disconnectedCallback() {
|
|
112
|
-
super.disconnectedCallback(), this._menuContentObserver.disconnect(), this.removeEventListener("keydown", this._onKeydown), document.removeEventListener("click", this._onClickOutside),
|
|
104
|
+
super.disconnectedCallback(), this._menuContentObserver.disconnect(), this.removeEventListener("keydown", this._onKeydown), document.removeEventListener("click", this._onClickOutside), this._outsideClickGuard.dispose(), this._hoverBinder.dispose(), this._lifecycle.dispose(), this._scrollLock.release(), this._cleanupClosedMenu();
|
|
113
105
|
}
|
|
114
106
|
updated(e) {
|
|
115
|
-
this._syncTriggerAria(), e.has("open") && (this.open ? (this._restoreFocusTarget ??= document.activeElement instanceof HTMLElement ? document.activeElement : void 0, this.
|
|
116
|
-
this.
|
|
117
|
-
}), this._bindHoversAfterUpdate()) : (this._syncScrollLock(), this._closeRootAfterPresence()), this._userOpenChange.consume() && this.
|
|
118
|
-
detail: { open: this.open },
|
|
119
|
-
bubbles: !0,
|
|
120
|
-
composed: !0
|
|
121
|
-
}))), e.has("noScrollLock") && this._syncScrollLock(), (e.has("placement") || e.has("offset") || e.has("matchWidth")) && this._overlays.get(0)?.api.update({
|
|
107
|
+
this._syncTriggerAria(), e.has("open") && (this.open ? (this._restoreFocusTarget ??= document.activeElement instanceof HTMLElement ? document.activeElement : void 0, this._outsideClickGuard.arm(), this._syncScrollLock(), this._hideAllSubmenuChildren(), this._lifecycle.invalidate(), this._lifecycle.scheduleFrame(() => {
|
|
108
|
+
this._ensureOverlay(0, this._shouldOpenInstantly), this._shouldOpenInstantly = !0, d(C(this._overlays.get(0)?.content)[0]), this._syncTriggerAria();
|
|
109
|
+
}), this._bindHoversAfterUpdate()) : (this._lifecycle.invalidate(), this._syncScrollLock(), this._closeRootAfterPresence()), this._userOpenChange.consume() && r(this, this.open)), e.has("noScrollLock") && this._syncScrollLock(), (e.has("placement") || e.has("offset") || e.has("matchWidth")) && this._overlays.get(0)?.api.update({
|
|
122
110
|
placement: this.placement,
|
|
123
111
|
offset: this.offset,
|
|
124
112
|
matchWidth: this.matchWidth
|
|
125
|
-
}), this.
|
|
113
|
+
}), this._hoverBinder.bind();
|
|
126
114
|
}
|
|
127
115
|
openMenu() {
|
|
128
116
|
this._openMenu(!0, !1);
|
|
129
117
|
}
|
|
130
118
|
_openMenu(e, t) {
|
|
131
|
-
this.disabled || this.open || (this.
|
|
119
|
+
this.disabled || this.open || (this._outsideClickGuard.arm(), this._shouldOpenInstantly = e, t && this._userOpenChange.mark(), this.open = !0);
|
|
132
120
|
}
|
|
133
121
|
closeAll() {
|
|
134
122
|
this._closeAll(!1);
|
|
@@ -137,30 +125,30 @@ var O = "web-ui-menu-level-", k = "wui-dropdown-menu-item", A = 0, j = [
|
|
|
137
125
|
this.open &&= (e && this._userOpenChange.mark(), !1);
|
|
138
126
|
}
|
|
139
127
|
_closeAllSubmenus() {
|
|
140
|
-
this._closeSubmenuFrom(1, !0), this.
|
|
128
|
+
this._closeSubmenuFrom(1, !0), this._closingSubmenus.restoreAll(), this._syncActiveAttrs();
|
|
141
129
|
}
|
|
142
130
|
_cleanupClosedMenu() {
|
|
143
131
|
this._closeAllSubmenus(), this._returnLevel0Items(), this._disposeAll();
|
|
144
132
|
}
|
|
145
133
|
async _closeRootAfterPresence() {
|
|
146
134
|
let e = this._overlays.get(0)?.overlay;
|
|
147
|
-
e && !await
|
|
135
|
+
e && !await o(e) || this.open || !this.isConnected || (this._cleanupClosedMenu(), this._restoreFocusTarget?.focus(), this._restoreFocusTarget = void 0);
|
|
148
136
|
}
|
|
149
137
|
_hideAllSubmenuChildren() {
|
|
150
|
-
|
|
138
|
+
m(this, `${I}-hidden`);
|
|
151
139
|
}
|
|
152
140
|
_toggleSubmenu(e, t, n = !1) {
|
|
153
141
|
if (this._activePath[e] === t) return;
|
|
154
142
|
this._closeSubmenuFrom(e + 1), this._activePath = [...this._activePath.slice(0, e), t], this._syncActiveAttrs();
|
|
155
143
|
let r = this._getLevelItems(e)[t];
|
|
156
|
-
r?.hasAttribute("submenu") &&
|
|
144
|
+
r?.hasAttribute("submenu") && this._lifecycle.scheduleFrame(() => {
|
|
157
145
|
!this.open || this._activePath[e] !== t || this._ensureOverlay(e + 1, n, r) || this._populateOverlay(e + 1, r);
|
|
158
146
|
}), this._bindHoversAfterUpdate();
|
|
159
147
|
}
|
|
160
148
|
_closeSubmenuFrom(e, t = !1) {
|
|
161
149
|
for (let n = this._activePath.length; n >= e; n--) {
|
|
162
150
|
let e = this._overlays.get(n), r = this._getLevelItems(n - 1)[this._activePath[n - 1]];
|
|
163
|
-
e && (!r || t ? (this._depopulateOverlay(n, r), this._disposeOverlay(n)) : (this._overlays.delete(n), this.
|
|
151
|
+
e && (!r || t ? (this._depopulateOverlay(n, r), this._disposeOverlay(n)) : (this._overlays.delete(n), this._closingSubmenus.closeAsync(r, e)));
|
|
164
152
|
}
|
|
165
153
|
let n = this._activePath.slice(0, e - 1);
|
|
166
154
|
n.length !== this._activePath.length && (this._activePath = n), this._syncActiveAttrs();
|
|
@@ -177,11 +165,11 @@ var O = "web-ui-menu-level-", k = "wui-dropdown-menu-item", A = 0, j = [
|
|
|
177
165
|
}
|
|
178
166
|
_getLevelItems(e) {
|
|
179
167
|
let t = this._overlays.get(e)?.content;
|
|
180
|
-
return t ?
|
|
168
|
+
return t ? f(t) : [];
|
|
181
169
|
}
|
|
182
170
|
_populateLevel0() {
|
|
183
171
|
let e = this._overlays.get(0)?.content;
|
|
184
|
-
e && (
|
|
172
|
+
e && (_(this, e, this._level0ItemAnchors, L), g(this, e, this._level0ItemAnchors, L));
|
|
185
173
|
}
|
|
186
174
|
_scheduleMenuSync() {
|
|
187
175
|
this._menuSyncScheduled || (this._menuSyncScheduled = !0, requestAnimationFrame(() => {
|
|
@@ -191,43 +179,43 @@ var O = "web-ui-menu-level-", k = "wui-dropdown-menu-item", A = 0, j = [
|
|
|
191
179
|
_syncOpenMenuContent() {
|
|
192
180
|
let e = this._overlays.get(0)?.content;
|
|
193
181
|
if (this._hideAllSubmenuChildren(), e) {
|
|
194
|
-
|
|
195
|
-
let t =
|
|
196
|
-
|
|
182
|
+
_(this, e, this._level0ItemAnchors, L), m(e, `${I}-hidden`);
|
|
183
|
+
let t = u(e, L);
|
|
184
|
+
g(this, e, this._level0ItemAnchors, L), v(e, t);
|
|
197
185
|
}
|
|
198
186
|
for (let [e, t] of this._overlays) {
|
|
199
187
|
if (e === 0) continue;
|
|
200
188
|
let n = this._getLevelItems(e - 1)[this._activePath[e - 1]];
|
|
201
|
-
n &&
|
|
189
|
+
n && h(n, t.content), m(t.content, `${I}-hidden`);
|
|
202
190
|
}
|
|
203
|
-
this.
|
|
191
|
+
this._hoverBinder.bind();
|
|
204
192
|
}
|
|
205
193
|
_returnLevel0Items() {
|
|
206
194
|
let e = this._overlays.get(0)?.content;
|
|
207
|
-
e &&
|
|
195
|
+
e && y(this, e, this._level0ItemAnchors);
|
|
208
196
|
}
|
|
209
197
|
_populateOverlay(e, t) {
|
|
210
198
|
let n = this._overlays.get(e)?.content;
|
|
211
|
-
n &&
|
|
199
|
+
n && h(t, n);
|
|
212
200
|
}
|
|
213
201
|
_depopulateOverlay(e, t) {
|
|
214
202
|
let n = this._overlays.get(e)?.content;
|
|
215
203
|
if (!n) return;
|
|
216
204
|
let r = e - 1, i = t ?? this._getLevelItems(r)[this._activePath[r]];
|
|
217
|
-
i &&
|
|
205
|
+
i && h(n, i);
|
|
218
206
|
}
|
|
219
207
|
_ensureOverlay(e, t = !1, n) {
|
|
220
|
-
let r = n ? this.
|
|
221
|
-
if (r) return this.
|
|
208
|
+
let r = n ? this._closingSubmenus.take(n) : void 0;
|
|
209
|
+
if (r) return this._overlays.set(e, r), r.api.open(), s(r.overlay, { isInstant: t }), !0;
|
|
222
210
|
let i = this._overlays.get(e);
|
|
223
|
-
return i ? (i.api.open(),
|
|
211
|
+
return i ? (i.api.open(), s(i.overlay, { isInstant: t }), !1) : (this._buildOverlay(e, t), !1);
|
|
224
212
|
}
|
|
225
213
|
_buildOverlay(e, t = !1) {
|
|
226
|
-
let { panel: n, content:
|
|
227
|
-
n.setAttribute("role", "menu"), e === 0 && (n.id = `wui-dropdown-menu-${++
|
|
214
|
+
let { panel: n, content: r } = E("dropdown-overlay", this);
|
|
215
|
+
n.setAttribute("role", "menu"), e === 0 && (n.id = `wui-dropdown-menu-${++R}`), n.dataset.level = String(e), n.addEventListener("click", this._onMenuClick), n.addEventListener("keydown", this._onKeydown);
|
|
228
216
|
let o = e === 0 ? this._queryTriggerAnchor() : this._getSubmenuTriggerAnchor(e - 1);
|
|
229
217
|
if (o) {
|
|
230
|
-
let
|
|
218
|
+
let c = a().make({
|
|
231
219
|
anchor: o,
|
|
232
220
|
overlay: n,
|
|
233
221
|
placement: e === 0 ? this.placement : "right-start",
|
|
@@ -237,18 +225,18 @@ var O = "web-ui-menu-level-", k = "wui-dropdown-menu-item", A = 0, j = [
|
|
|
237
225
|
strategy: "fixed"
|
|
238
226
|
});
|
|
239
227
|
this._overlays.set(e, {
|
|
240
|
-
api:
|
|
228
|
+
api: c,
|
|
241
229
|
overlay: n,
|
|
242
|
-
content:
|
|
243
|
-
}), e === 0 && this._populateLevel0(), this._menuContentObserver.observe(
|
|
230
|
+
content: r
|
|
231
|
+
}), i.registerPanel(n, this._overlays.get(e - 1)?.overlay), e === 0 && this._populateLevel0(), this._menuContentObserver.observe(r, {
|
|
244
232
|
childList: !0,
|
|
245
233
|
subtree: !0
|
|
246
|
-
}),
|
|
234
|
+
}), c.open(), s(n, { isInstant: t });
|
|
247
235
|
}
|
|
248
236
|
}
|
|
249
237
|
_disposeOverlay(e) {
|
|
250
238
|
let t = this._overlays.get(e);
|
|
251
|
-
t?.overlay.removeEventListener("click", this._onMenuClick), t?.overlay.removeEventListener("keydown", this._onKeydown), t?.overlay.remove(), t?.api.dispose(), this._overlays.delete(e), this._rebindMenuContentObservers();
|
|
239
|
+
t && i.unregisterPanel(t.overlay), t?.overlay.removeEventListener("click", this._onMenuClick), t?.overlay.removeEventListener("keydown", this._onKeydown), t?.overlay.remove(), t?.api.dispose(), this._overlays.delete(e), this._rebindMenuContentObservers();
|
|
252
240
|
}
|
|
253
241
|
_rebindMenuContentObservers() {
|
|
254
242
|
this._menuContentObserver.disconnect(), this._menuContentObserver.observe(this, {
|
|
@@ -263,17 +251,6 @@ var O = "web-ui-menu-level-", k = "wui-dropdown-menu-item", A = 0, j = [
|
|
|
263
251
|
_disposeAll() {
|
|
264
252
|
for (let e of this._overlays.keys()) this._disposeOverlay(e);
|
|
265
253
|
}
|
|
266
|
-
async _closeSubmenuAfterPresence(e, t) {
|
|
267
|
-
await i(e.overlay) && this._closingSubmenuOverlays.get(t) === e && (this._closingSubmenuOverlays.delete(t), this._restoreSubmenuItems(e, t), e.api.dispose(), e.overlay.remove());
|
|
268
|
-
}
|
|
269
|
-
_disposeClosingSubmenuOverlays() {
|
|
270
|
-
this._closingSubmenuOverlays.forEach((e, t) => {
|
|
271
|
-
this._restoreSubmenuItems(e, t), e.api.dispose(), e.overlay.remove();
|
|
272
|
-
}), this._closingSubmenuOverlays.clear();
|
|
273
|
-
}
|
|
274
|
-
_restoreSubmenuItems(e, t) {
|
|
275
|
-
g(e.content, t);
|
|
276
|
-
}
|
|
277
254
|
_syncScrollLock(e = this.open) {
|
|
278
255
|
this._scrollLock.sync(e && !this.noScrollLock);
|
|
279
256
|
}
|
|
@@ -294,72 +271,39 @@ var O = "web-ui-menu-level-", k = "wui-dropdown-menu-item", A = 0, j = [
|
|
|
294
271
|
let n = this._getLevelItems(e)[t];
|
|
295
272
|
return n ? n.shadowRoot?.querySelector(".item-inner") ?? n : null;
|
|
296
273
|
}
|
|
297
|
-
|
|
298
|
-
let t = this._overlays.get(e)?.content;
|
|
299
|
-
return t ? f(t) : [];
|
|
300
|
-
}
|
|
301
|
-
_getFocusedItem(e) {
|
|
302
|
-
return e?.composedPath().find((e) => e instanceof HTMLElement && e.matches("web-ui-dropdown-item")) || u([...this._overlays.values()].map(({ overlay: e }) => e));
|
|
303
|
-
}
|
|
304
|
-
_getFocusedLevel(e = this._getFocusedItem()) {
|
|
274
|
+
_getFocusedLevel(e) {
|
|
305
275
|
if (e) return [...this._overlays.entries()].find(([, t]) => t.overlay.contains(e))?.[0];
|
|
306
276
|
}
|
|
307
|
-
_focusMenuItem(e) {
|
|
308
|
-
d(e);
|
|
309
|
-
}
|
|
310
|
-
_isInsideShadowRoot(e) {
|
|
311
|
-
for (let t of e.composedPath()) if (t === this || t === this.shadowRoot || t instanceof Node && t.getRootNode() === this.shadowRoot || t instanceof Node && [...this._overlays.values()].some(({ overlay: e }) => e.contains(t))) return !0;
|
|
312
|
-
return !1;
|
|
313
|
-
}
|
|
314
|
-
_ignoreCurrentOutsideClick() {
|
|
315
|
-
this._ignoreOutsideClick = !0, clearTimeout(this._ignoreOutsideClickTimer), this._ignoreOutsideClickTimer = setTimeout(() => {
|
|
316
|
-
this._ignoreOutsideClick = !1;
|
|
317
|
-
});
|
|
318
|
-
}
|
|
319
|
-
_bindLevelHovers() {
|
|
320
|
-
this._hoverCleanupFns.forEach((e) => e()), this._hoverCleanupFns.length = 0;
|
|
321
|
-
let e = this._activePath.length + 1;
|
|
322
|
-
for (let t = 0; t <= e; t++) {
|
|
323
|
-
let e = this._getLevelItems(t);
|
|
324
|
-
e.length && e.forEach((e, n) => {
|
|
325
|
-
if (!e.matches("web-ui-dropdown-item") || e.hasAttribute("disabled")) return;
|
|
326
|
-
let r = (r) => {
|
|
327
|
-
r.pointerType !== "touch" && (clearTimeout(this._openTimer), e.hasAttribute("submenu") ? this._activePath[t] !== n && (this._openTimer = setTimeout(() => this._toggleSubmenu(t, n), 200)) : this._activePath.length > t && this._closeSubmenuFrom(t + 1));
|
|
328
|
-
};
|
|
329
|
-
e.addEventListener("pointerenter", r, { passive: !0 }), this._hoverCleanupFns.push(() => e.removeEventListener("pointerenter", r));
|
|
330
|
-
});
|
|
331
|
-
}
|
|
332
|
-
}
|
|
333
277
|
_bindHoversAfterUpdate() {
|
|
334
|
-
requestAnimationFrame(() => this.
|
|
278
|
+
requestAnimationFrame(() => this._hoverBinder.bind());
|
|
335
279
|
}
|
|
336
280
|
render() {
|
|
337
|
-
return
|
|
281
|
+
return j`
|
|
338
282
|
<div class="dropdown-trigger" @click=${this._onTriggerClick}>
|
|
339
283
|
<slot name="trigger"></slot>
|
|
340
284
|
</div>
|
|
341
285
|
`;
|
|
342
286
|
}
|
|
343
287
|
};
|
|
344
|
-
e([
|
|
288
|
+
e([P({
|
|
345
289
|
type: Boolean,
|
|
346
290
|
reflect: !0
|
|
347
|
-
})],
|
|
291
|
+
})], z.prototype, "open", void 0), e([P({
|
|
348
292
|
type: Boolean,
|
|
349
293
|
reflect: !0
|
|
350
|
-
})],
|
|
294
|
+
})], z.prototype, "disabled", void 0), e([P({
|
|
351
295
|
type: Boolean,
|
|
352
296
|
reflect: !0,
|
|
353
297
|
attribute: "match-width"
|
|
354
|
-
})],
|
|
298
|
+
})], z.prototype, "matchWidth", void 0), e([P({
|
|
355
299
|
type: Boolean,
|
|
356
300
|
reflect: !0,
|
|
357
301
|
attribute: "no-scroll-lock"
|
|
358
|
-
})],
|
|
302
|
+
})], z.prototype, "noScrollLock", void 0), e([P({
|
|
359
303
|
type: String,
|
|
360
304
|
reflect: !0
|
|
361
|
-
})],
|
|
305
|
+
})], z.prototype, "placement", null), e([P({ type: Number })], z.prototype, "offset", null), e([F()], z.prototype, "_activePath", void 0), z = e([N("web-ui-dropdown")], z);
|
|
362
306
|
//#endregion
|
|
363
|
-
export {
|
|
307
|
+
export { z as WebUiDropdown };
|
|
364
308
|
|
|
365
309
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/dropdown/index.ts"],"sourcesContent":["import type { Placement } from '@floating-ui/dom'\nimport { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport '@/components/dropdown-divider'\nimport '@/components/dropdown-header'\nimport '@/components/dropdown-item'\nimport { UserChangeController } from '@/shared/events/user-change'\nimport { createMenuPortalOverlay } from '@/shared/menu-portal/menu-portal'\nimport {\n captureFrameworkAnchors,\n findFocusedMenuItem,\n focusMenuItem,\n getEnabledMenuItems,\n getMenuChildren,\n getMenuItemFromEvent,\n hideNestedMenuChildren,\n moveMenuChildren,\n orderManagedMenuItems,\n reconcileManagedMenuItems,\n restoreFrameworkAnchors,\n returnManagedMenuItemsToSlot,\n type MenuItemAnchors\n} from '@/shared/menu-portal/menu-tree'\nimport { normalizeLiteral, normalizeNumber } from '@/shared/normalize'\nimport { defineOverlay } from '@/shared/overlay/overlay'\nimport type { OverlayApi } from '@/shared/overlay/overlay'\nimport { hideOverlayPresence, showOverlayPresence } from '@/shared/overlay/presence'\nimport { defineScrollLockLease } from '@/shared/scroll-lock/scroll-lock'\n\nimport style from './style.css?inline'\n\nexport type { Placement }\n\nconst SLOT_PREFIX = 'web-ui-menu-level-'\n// 一级菜单项的模板位 marker(机制与 context-menu 共用,见 menu-tree 的托管项锚说明)。\nconst MENU_ITEM_MARKER = 'wui-dropdown-menu-item'\n\nlet dropdownIdCounter = 0\n\nconst ALLOWED_PLACEMENTS = [\n 'top',\n 'top-start',\n 'top-end',\n 'right',\n 'right-start',\n 'right-end',\n 'bottom',\n 'bottom-start',\n 'bottom-end',\n 'left',\n 'left-start',\n 'left-end'\n] as const\n\ninterface MenuOverlay {\n api: OverlayApi\n overlay: HTMLElement\n content: HTMLElement\n}\n\n@customElement('web-ui-dropdown')\nexport class WebUiDropdown extends LitElement {\n static override styles = unsafeCSS(style)\n\n @property({ type: Boolean, reflect: true }) open = false\n @property({ type: Boolean, reflect: true }) disabled = false\n @property({ type: Boolean, reflect: true, attribute: 'match-width' }) matchWidth = false\n @property({ type: Boolean, reflect: true, attribute: 'no-scroll-lock' }) noScrollLock = false\n\n private _placement: Placement = 'bottom-start'\n\n @property({ type: String, reflect: true })\n get placement(): Placement {\n return this._placement\n }\n set placement(v: string) {\n this._placement = normalizeLiteral(v, ALLOWED_PLACEMENTS, 'bottom-start')\n }\n\n private _offset = 4\n\n @property({ type: Number })\n get offset(): number {\n return this._offset\n }\n set offset(v: number) {\n this._offset = normalizeNumber(v, 0, 100, 4)\n }\n\n @state() private _activePath: number[] = []\n\n private readonly _overlays = new Map<number, MenuOverlay>()\n private readonly _closingSubmenuOverlays = new Map<HTMLElement, MenuOverlay>()\n private _openTimer?: ReturnType<typeof setTimeout>\n private _ignoreOutsideClick = false\n private _ignoreOutsideClickTimer?: ReturnType<typeof setTimeout>\n private _hoverCleanupFns: (() => void)[] = []\n private readonly _scrollLock = defineScrollLockLease().make()\n private readonly _userOpenChange = new UserChangeController()\n private _restoreFocusTarget?: HTMLElement\n private _shouldOpenInstantly = true\n private _menuSyncScheduled = false\n private readonly _level0ItemAnchors: MenuItemAnchors = new Map()\n // 打开期实时渲染:框架(Vue/React 条件渲染)可能在菜单打开期间持续插入菜单项。\n // 观察宿主子树(新增项可能被框架 wrapper 包裹)与各层级面板 content 的子树\n // (打开中的 submenu 父项已被迁入 content,其新增子项只在这里可见),下一帧统一\n // 把新子树迁入对应层级面板;面板尺寸变化由 defineOverlay 的 autoUpdate 跟进重定位。\n private readonly _menuContentObserver = new MutationObserver(() => {\n if (this.open) this._scheduleMenuSync()\n })\n\n get isOpen(): boolean {\n return this.open || this._activePath.length > 0\n }\n\n override connectedCallback() {\n super.connectedCallback()\n this.addEventListener('keydown', this._onKeydown)\n document.addEventListener('click', this._onClickOutside)\n this._menuContentObserver.observe(this, { childList: true, subtree: true })\n }\n\n override firstUpdated() {\n // trigger slot 内容增删不触发宿主响应式更新:显式请求一轮渲染,\n // 由 updated() 的 ARIA 回写覆盖晚到的 trigger 元素。\n this.shadowRoot\n ?.querySelector<HTMLSlotElement>('slot[name=\"trigger\"]')\n ?.addEventListener('slotchange', () => this.requestUpdate())\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback()\n this._menuContentObserver.disconnect()\n this.removeEventListener('keydown', this._onKeydown)\n document.removeEventListener('click', this._onClickOutside)\n clearTimeout(this._openTimer)\n clearTimeout(this._ignoreOutsideClickTimer)\n this._scrollLock.release()\n this._cleanupClosedMenu()\n this._hoverCleanupFns.forEach(fn => fn())\n }\n\n protected override updated(changed: Map<string, unknown>) {\n // ARIA 回写不依赖 open 分支,任何渲染后都保持与宿主状态同步。\n this._syncTriggerAria()\n\n if (changed.has('open')) {\n if (this.open) {\n this._restoreFocusTarget ??= document.activeElement instanceof HTMLElement ? document.activeElement : undefined\n this._ignoreCurrentOutsideClick()\n this._syncScrollLock()\n this._hideAllSubmenuChildren()\n requestAnimationFrame(() => {\n if (!this.open) return\n this._ensureOverlay(0, this._shouldOpenInstantly)\n this._shouldOpenInstantly = true\n this._focusMenuItem(this._getEnabledLevelItems(0)[0])\n // 面板 id 在 overlay 构建后才有:回写 aria-controls 指向。\n this._syncTriggerAria()\n })\n this._bindHoversAfterUpdate()\n } else {\n this._syncScrollLock()\n void this._closeRootAfterPresence()\n }\n if (this._userOpenChange.consume()) {\n this.dispatchEvent(\n new CustomEvent('open-change', {\n detail: { open: this.open },\n bubbles: true,\n composed: true\n })\n )\n }\n }\n if (changed.has('noScrollLock')) this._syncScrollLock()\n if (changed.has('placement') || changed.has('offset') || changed.has('matchWidth')) {\n this._overlays.get(0)?.api.update({\n placement: this.placement,\n offset: this.offset,\n matchWidth: this.matchWidth\n })\n }\n this._bindLevelHovers()\n }\n\n // 命令式打开,不派发 open-change。\n openMenu() {\n this._openMenu(true, false)\n }\n\n private _openMenu(isInstant: boolean, fromUser: boolean) {\n if (this.disabled || this.open) return\n this._ignoreCurrentOutsideClick()\n this._shouldOpenInstantly = isInstant\n if (fromUser) this._userOpenChange.mark()\n this.open = true\n }\n\n // 命令式关闭全部层级,不派发 open-change。\n closeAll() {\n this._closeAll(false)\n }\n\n private _closeAll(fromUser: boolean) {\n if (!this.open) return\n if (fromUser) this._userOpenChange.mark()\n this.open = false\n }\n\n // 不影响 open prop。\n private _closeAllSubmenus() {\n this._closeSubmenuFrom(1, true)\n this._disposeClosingSubmenuOverlays()\n this._syncActiveAttrs()\n }\n\n private _cleanupClosedMenu() {\n this._closeAllSubmenus()\n this._returnLevel0Items()\n this._disposeAll()\n }\n\n private async _closeRootAfterPresence() {\n const overlay = this._overlays.get(0)?.overlay\n if (overlay && !(await hideOverlayPresence(overlay))) return\n if (this.open || !this.isConnected) return\n\n this._cleanupClosedMenu()\n this._restoreFocusTarget?.focus()\n this._restoreFocusTarget = undefined\n }\n\n private _hideAllSubmenuChildren() {\n hideNestedMenuChildren(this, `${SLOT_PREFIX}-hidden`)\n }\n\n private _toggleSubmenu(level: number, itemIndex: number, isInstant = false) {\n if (this._activePath[level] === itemIndex) {\n return\n }\n\n this._closeSubmenuFrom(level + 1)\n\n this._activePath = [...this._activePath.slice(0, level), itemIndex]\n this._syncActiveAttrs()\n\n const item = this._getLevelItems(level)[itemIndex]\n if (item?.hasAttribute('submenu')) {\n requestAnimationFrame(() => {\n if (!this.open || this._activePath[level] !== itemIndex) return\n const restored = this._ensureOverlay(level + 1, isInstant, item)\n if (!restored) this._populateOverlay(level + 1, item)\n })\n }\n\n this._bindHoversAfterUpdate()\n }\n\n private _closeSubmenuFrom(level: number, isInstant = false) {\n for (let lv = this._activePath.length; lv >= level; lv--) {\n const overlay = this._overlays.get(lv)\n const parentItem = this._getLevelItems(lv - 1)[this._activePath[lv - 1]]\n if (!overlay) continue\n\n if (!parentItem || isInstant) {\n this._depopulateOverlay(lv, parentItem)\n this._disposeOverlay(lv)\n } else {\n this._overlays.delete(lv)\n this._closingSubmenuOverlays.set(parentItem, overlay)\n void this._closeSubmenuAfterPresence(overlay, parentItem)\n }\n }\n const nextActivePath = this._activePath.slice(0, level - 1)\n if (nextActivePath.length !== this._activePath.length) {\n this._activePath = nextActivePath\n }\n this._syncActiveAttrs()\n }\n\n private _syncActiveAttrs() {\n this.querySelectorAll('web-ui-dropdown-item').forEach(item => {\n item.removeAttribute('active')\n })\n this._overlays.forEach((_, level) => {\n this._getLevelItems(level).forEach(item => item.removeAttribute('active'))\n })\n this._activePath.forEach((itemIndex, level) => {\n const item = this._getLevelItems(level)[itemIndex]\n if (item?.matches('web-ui-dropdown-item')) {\n item.setAttribute('active', '')\n }\n })\n }\n\n private _getLevelItems(level: number): HTMLElement[] {\n const content = this._overlays.get(level)?.content\n return content ? getMenuChildren(content) : []\n }\n\n private _populateLevel0() {\n const content = this._overlays.get(0)?.content\n if (!content) return\n // 初次打开即建立 marker 锚:宿主此后始终持有模板序骨架,打开期框架插入与\n // 关闭归还都以它为基准(机制与 context-menu 共用,见 menu-tree)。\n reconcileManagedMenuItems(this, content, this._level0ItemAnchors, MENU_ITEM_MARKER)\n orderManagedMenuItems(this, content, this._level0ItemAnchors, MENU_ITEM_MARKER)\n }\n\n private _scheduleMenuSync() {\n if (this._menuSyncScheduled) return\n this._menuSyncScheduled = true\n requestAnimationFrame(() => {\n this._menuSyncScheduled = false\n if (!this.open) return\n this._syncOpenMenuContent()\n })\n }\n\n // 打开期的统一内容同步:把打开期间框架新增的菜单子树迁入对应层级面板。\n // 一级项走 marker 锚 reconcile(保序 + 关闭按模板位归还);面板尺寸变化由\n // defineOverlay 的 autoUpdate 跟进重定位。\n private _syncOpenMenuContent() {\n const level0Content = this._overlays.get(0)?.content\n // 迁移前隐藏宿主中新项的嵌套子项(hidden slot 属性随元素一起迁移)。\n this._hideAllSubmenuChildren()\n if (level0Content) {\n reconcileManagedMenuItems(this, level0Content, this._level0ItemAnchors, MENU_ITEM_MARKER)\n // 新迁入项的嵌套子项未打 hidden slot,会经 dropdown-item 默认 slot 渲染进\n // 父项 label 叠到菜单上;面板项在面板内渲染,宿主查询够不到,须对 content 补隐藏。\n hideNestedMenuChildren(level0Content, `${SLOT_PREFIX}-hidden`)\n // 框架注释锚点复位独立于元素重排:锚点漂移不收敛会破坏后续翻转的插入点(同 context-menu)。\n const frameworkAnchors = captureFrameworkAnchors(level0Content, MENU_ITEM_MARKER)\n orderManagedMenuItems(this, level0Content, this._level0ItemAnchors, MENU_ITEM_MARKER)\n restoreFrameworkAnchors(level0Content, frameworkAnchors)\n }\n for (const [level, overlay] of this._overlays) {\n if (level === 0) continue\n const parentItem = this._getLevelItems(level - 1)[this._activePath[level - 1]]\n if (parentItem) moveMenuChildren(parentItem, overlay.content)\n hideNestedMenuChildren(overlay.content, `${SLOT_PREFIX}-hidden`)\n }\n this._bindLevelHovers()\n }\n\n private _returnLevel0Items() {\n const content = this._overlays.get(0)?.content\n if (content) returnManagedMenuItemsToSlot(this, content, this._level0ItemAnchors)\n }\n\n private _populateOverlay(level: number, submenuItem: HTMLElement) {\n const content = this._overlays.get(level)?.content\n if (content) moveMenuChildren(submenuItem, content)\n }\n\n private _depopulateOverlay(level: number, parentItem?: HTMLElement) {\n const content = this._overlays.get(level)?.content\n if (!content) return\n const targetLevel = level - 1\n const submenuItem = parentItem ?? this._getLevelItems(targetLevel)[this._activePath[targetLevel]]\n if (submenuItem) moveMenuChildren(content, submenuItem)\n }\n\n private _ensureOverlay(level: number, isInstant = false, submenuItem?: HTMLElement): boolean {\n const closingOverlay = submenuItem ? this._closingSubmenuOverlays.get(submenuItem) : undefined\n if (closingOverlay) {\n this._closingSubmenuOverlays.delete(submenuItem!)\n this._overlays.set(level, closingOverlay)\n closingOverlay.api.open()\n showOverlayPresence(closingOverlay.overlay, { isInstant })\n return true\n }\n const existing = this._overlays.get(level)\n if (existing) {\n existing.api.open()\n showOverlayPresence(existing.overlay, { isInstant })\n return false\n }\n this._buildOverlay(level, isInstant)\n return false\n }\n\n private _buildOverlay(level: number, isInstant = false) {\n const { panel: overlay, content } = createMenuPortalOverlay('dropdown-overlay', this)\n overlay.setAttribute('role', 'menu')\n // 根层级面板带 id:trigger 的 aria-controls 指向它(Q9a)。\n if (level === 0) overlay.id = `wui-dropdown-menu-${++dropdownIdCounter}`\n overlay.dataset.level = String(level)\n overlay.addEventListener('click', this._onMenuClick)\n overlay.addEventListener('keydown', this._onKeydown)\n\n const anchor = level === 0 ? this._queryTriggerAnchor() : this._getSubmenuTriggerAnchor(level - 1)\n\n if (anchor) {\n const ctrl = defineOverlay().make({\n anchor,\n overlay,\n placement: level === 0 ? this.placement : 'right-start',\n offset: level === 0 ? this.offset : 0,\n // 菜单至少与 trigger/父项同宽,内容可更宽(floor 来自 --wui-overlay-min-width)\n minAnchorWidth: true,\n matchWidth: level === 0 ? this.matchWidth : false,\n strategy: 'fixed'\n })\n this._overlays.set(level, { api: ctrl, overlay, content })\n if (level === 0) this._populateLevel0()\n // submenu 父项在面板 content 内,其新增子项只有观察 content 子树才能看到\n this._menuContentObserver.observe(content, { childList: true, subtree: true })\n ctrl.open()\n showOverlayPresence(overlay, { isInstant })\n }\n }\n\n private _disposeOverlay(level: number) {\n const overlay = this._overlays.get(level)\n overlay?.overlay.removeEventListener('click', this._onMenuClick)\n overlay?.overlay.removeEventListener('keydown', this._onKeydown)\n overlay?.overlay.remove()\n overlay?.api.dispose()\n this._overlays.delete(level)\n this._rebindMenuContentObservers()\n }\n\n // jsdom 的 MutationObserver 不实现 unobserve;统一 disconnect 后重绑剩余目标。\n private _rebindMenuContentObservers() {\n this._menuContentObserver.disconnect()\n this._menuContentObserver.observe(this, { childList: true, subtree: true })\n for (const overlay of this._overlays.values()) {\n this._menuContentObserver.observe(overlay.content, { childList: true, subtree: true })\n }\n }\n\n private _disposeAll() {\n for (const level of this._overlays.keys()) {\n this._disposeOverlay(level)\n }\n }\n\n private async _closeSubmenuAfterPresence(overlay: MenuOverlay, parentItem: HTMLElement) {\n if (!(await hideOverlayPresence(overlay.overlay))) return\n if (this._closingSubmenuOverlays.get(parentItem) !== overlay) return\n\n this._closingSubmenuOverlays.delete(parentItem)\n this._restoreSubmenuItems(overlay, parentItem)\n overlay.api.dispose()\n overlay.overlay.remove()\n }\n\n private _disposeClosingSubmenuOverlays() {\n this._closingSubmenuOverlays.forEach((overlay, parentItem) => {\n this._restoreSubmenuItems(overlay, parentItem)\n overlay.api.dispose()\n overlay.overlay.remove()\n })\n this._closingSubmenuOverlays.clear()\n }\n\n private _restoreSubmenuItems(overlay: MenuOverlay, parentItem: HTMLElement) {\n moveMenuChildren(overlay.content, parentItem)\n }\n\n private _syncScrollLock(isOpen = this.open) {\n this._scrollLock.sync(isOpen && !this.noScrollLock)\n }\n\n private _queryTriggerAnchor(): HTMLElement | null {\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot[name=\"trigger\"]')\n const el = slot?.assignedElements()[0]\n return el instanceof HTMLElement ? el : null\n }\n\n /*\n * trigger 语义回写(Q9a):slot 进来的元素是真正的可聚焦交互元素,\n * aria-haspopup / aria-expanded / aria-controls 必须设在它身上;\n * 组件没有 trigger 包装 div,此前完全没有 ARIA 接线。\n */\n private _syncTriggerAria() {\n const trigger = this._queryTriggerAnchor()\n if (!trigger) return\n trigger.setAttribute('aria-haspopup', 'menu')\n trigger.setAttribute('aria-expanded', String(this.open))\n const rootOverlay = this._overlays.get(0)?.overlay\n if (rootOverlay?.id) trigger.setAttribute('aria-controls', rootOverlay.id)\n else trigger.removeAttribute('aria-controls')\n }\n\n private _getSubmenuTriggerAnchor(level: number): HTMLElement | null {\n const idx = this._activePath[level]\n if (idx === undefined) return null\n const items = this._getLevelItems(level)\n const item = items[idx]\n if (!item) return null\n return item.shadowRoot?.querySelector('.item-inner') ?? item\n }\n\n private _onTriggerClick = (event: MouseEvent) => {\n if (this.disabled) return\n if (this.open) {\n this._closeAll(true)\n } else {\n this._openMenu(event.detail === 0, true)\n }\n }\n\n private _onClickOutside = (e: MouseEvent) => {\n if (!this.isOpen || this._ignoreOutsideClick) return\n if (this._isInsideShadowRoot(e)) return\n this._closeAll(true)\n }\n\n private _onMenuClick = (e: MouseEvent) => {\n const item = getMenuItemFromEvent(e)\n if (!item || item.hasAttribute('disabled') || !item.hasAttribute('submenu')) return\n\n const level = this._getFocusedLevel(item)\n if (level === undefined) return\n const itemIndex = this._getLevelItems(level).indexOf(item)\n if (itemIndex >= 0) this._toggleSubmenu(level, itemIndex, e.detail === 0)\n }\n\n private _onKeydown = (e: KeyboardEvent) => {\n if (this.disabled || !this.open) return\n\n // overlay 上键盘事件 target 是菜单项而非组件自身,不能限定 e.target === this,\n // 否则鼠标打开、焦点在菜单项时 Escape 无法关闭\n if (e.key === 'Escape') {\n if (this._activePath.length > 0) this._closeSubmenuFrom(this._activePath.length)\n else this._closeAll(true)\n e.preventDefault()\n return\n }\n\n const focused = this._getFocusedItem(e)\n const level = this._getFocusedLevel(focused)\n if (level === undefined) return\n const items = this._getEnabledLevelItems(level)\n const currentIndex = focused ? items.indexOf(focused) : -1\n\n switch (e.key) {\n case 'ArrowDown':\n this._focusMenuItem(items[(currentIndex + 1 + items.length) % items.length])\n break\n case 'ArrowUp':\n this._focusMenuItem(items[(currentIndex - 1 + items.length) % items.length])\n break\n case 'Home':\n this._focusMenuItem(items[0])\n break\n case 'End':\n this._focusMenuItem(items.at(-1))\n break\n case 'ArrowRight':\n if (focused?.hasAttribute('submenu')) {\n const itemIndex = this._getLevelItems(level).indexOf(focused)\n this._toggleSubmenu(level, itemIndex, true)\n requestAnimationFrame(() =>\n requestAnimationFrame(() => this._focusMenuItem(this._getEnabledLevelItems(level + 1)[0]))\n )\n }\n break\n case 'ArrowLeft':\n if (level > 0) {\n this._closeSubmenuFrom(level)\n this._focusMenuItem(this._getLevelItems(level - 1)[this._activePath[level - 1]])\n }\n break\n case 'Enter':\n case ' ':\n focused?.click()\n break\n default:\n return\n }\n e.preventDefault()\n e.stopPropagation()\n }\n\n private _getEnabledLevelItems(level: number) {\n const content = this._overlays.get(level)?.content\n return content ? getEnabledMenuItems(content) : []\n }\n\n private _getFocusedItem(event?: KeyboardEvent): HTMLElement | undefined {\n const eventItem = event\n ?.composedPath()\n .find((node): node is HTMLElement => node instanceof HTMLElement && node.matches('web-ui-dropdown-item'))\n if (eventItem) return eventItem\n\n return findFocusedMenuItem([...this._overlays.values()].map(({ overlay }) => overlay))\n }\n\n private _getFocusedLevel(item = this._getFocusedItem()): number | undefined {\n if (!item) return undefined\n const overlay = [...this._overlays.entries()].find(([, value]) => value.overlay.contains(item))\n return overlay?.[0]\n }\n\n private _focusMenuItem(item: HTMLElement | undefined) {\n focusMenuItem(item)\n }\n\n private _isInsideShadowRoot(e: MouseEvent): boolean {\n for (const node of e.composedPath()) {\n if (node === this || node === this.shadowRoot) return true\n if (node instanceof Node && node.getRootNode() === this.shadowRoot) return true\n if (node instanceof Node && [...this._overlays.values()].some(({ overlay }) => overlay.contains(node)))\n return true\n }\n return false\n }\n\n private _ignoreCurrentOutsideClick() {\n this._ignoreOutsideClick = true\n clearTimeout(this._ignoreOutsideClickTimer)\n this._ignoreOutsideClickTimer = setTimeout(() => {\n this._ignoreOutsideClick = false\n })\n }\n\n private _bindLevelHovers() {\n this._hoverCleanupFns.forEach(fn => fn())\n this._hoverCleanupFns.length = 0\n\n const maxLevel = this._activePath.length + 1\n for (let lv = 0; lv <= maxLevel; lv++) {\n const items = this._getLevelItems(lv)\n if (!items.length) continue\n items.forEach((item, idx) => {\n if (!item.matches('web-ui-dropdown-item') || item.hasAttribute('disabled')) return\n const handler = (event: PointerEvent) => {\n if (event.pointerType === 'touch') return\n clearTimeout(this._openTimer)\n if (item.hasAttribute('submenu')) {\n if (this._activePath[lv] !== idx) {\n this._openTimer = setTimeout(() => this._toggleSubmenu(lv, idx), 200)\n }\n } else if (this._activePath.length > lv) {\n this._closeSubmenuFrom(lv + 1)\n }\n }\n item.addEventListener('pointerenter', handler, { passive: true })\n this._hoverCleanupFns.push(() => item.removeEventListener('pointerenter', handler))\n })\n }\n }\n\n private _bindHoversAfterUpdate() {\n requestAnimationFrame(() => this._bindLevelHovers())\n }\n\n override render() {\n return html`\n <div class=\"dropdown-trigger\" @click=${this._onTriggerClick}>\n <slot name=\"trigger\"></slot>\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-dropdown': WebUiDropdown\n }\n}\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","names":[],"sources":["../../../src/components/dropdown/index.ts"],"sourcesContent":["import type { Placement } from '@floating-ui/dom'\nimport { html, LitElement, unsafeCSS } from 'lit'\nimport { customElement, property, state } from 'lit/decorators.js'\n\nimport '@/components/dropdown-divider'\nimport '@/components/dropdown-header'\nimport '@/components/dropdown-item'\nimport { UserChangeController } from '@/shared/events/user-change'\nimport {\n createClosingSubmenuStack,\n createMenuHoverBinder,\n createMenuOutsideClickGuard,\n getEnabledMenuLevelItems,\n getFocusedMenuItemFromPanels,\n handleMenuKeyboard,\n type MenuHoverDelegate,\n type MenuKeyboardDelegate\n} from '@/shared/menu-behavior'\nimport { createMenuPortalOverlay } from '@/shared/menu-portal/menu-portal'\nimport {\n captureFrameworkAnchors,\n focusMenuItem,\n getMenuChildren,\n getMenuItemFromEvent,\n hideNestedMenuChildren,\n moveMenuChildren,\n orderManagedMenuItems,\n reconcileManagedMenuItems,\n restoreFrameworkAnchors,\n returnManagedMenuItemsToSlot,\n type MenuItemAnchors\n} from '@/shared/menu-portal/menu-tree'\nimport { normalizeLiteral, normalizeNumber } from '@/shared/normalize'\nimport { dispatchOpenChangeEvent } from '@/shared/open-state'\nimport { overlayComposition } from '@/shared/overlay/composition'\nimport { defineOverlayLifecycle } from '@/shared/overlay/lifecycle'\nimport { defineOverlay } from '@/shared/overlay/overlay'\nimport type { OverlayApi } from '@/shared/overlay/overlay'\nimport { FLOATING_PLACEMENTS } from '@/shared/overlay/placement-props'\nimport { hideOverlayPresence, showOverlayPresence } from '@/shared/overlay/presence'\nimport { defineScrollLockLease } from '@/shared/scroll-lock/scroll-lock'\n\nimport style from './style.css?inline'\n\nexport type { Placement }\n\nconst SLOT_PREFIX = 'web-ui-menu-level-'\n// 一级菜单项的模板位 marker(机制与 context-menu 共用,见 menu-tree 的托管项锚说明)。\nconst MENU_ITEM_MARKER = 'wui-dropdown-menu-item'\n\nlet dropdownIdCounter = 0\n\ninterface MenuOverlay {\n api: OverlayApi\n overlay: HTMLElement\n content: HTMLElement\n}\n\n@customElement('web-ui-dropdown')\nexport class WebUiDropdown extends LitElement {\n static override styles = unsafeCSS(style)\n\n @property({ type: Boolean, reflect: true }) open = false\n @property({ type: Boolean, reflect: true }) disabled = false\n @property({ type: Boolean, reflect: true, attribute: 'match-width' }) matchWidth = false\n @property({ type: Boolean, reflect: true, attribute: 'no-scroll-lock' }) noScrollLock = false\n\n private _placement: Placement = 'bottom-start'\n\n @property({ type: String, reflect: true })\n get placement(): Placement {\n return this._placement\n }\n set placement(v: string) {\n this._placement = normalizeLiteral(v, FLOATING_PLACEMENTS, 'bottom-start')\n }\n\n private _offset = 4\n\n @property({ type: Number })\n get offset(): number {\n return this._offset\n }\n set offset(v: number) {\n this._offset = normalizeNumber(v, 0, 100, 4)\n }\n\n @state() private _activePath: number[] = []\n\n private readonly _overlays = new Map<number, MenuOverlay>()\n private readonly _lifecycle = defineOverlayLifecycle().make({\n isConnected: () => this.isConnected,\n isOpen: () => this.open\n })\n private readonly _scrollLock = defineScrollLockLease().make()\n // 行为层(hover / outside-click / 键盘 / submenu 收尾)由 shared/menu-behavior 驱动\n private readonly _outsideClickGuard = createMenuOutsideClickGuard(this, node =>\n [...this._overlays.values()].some(({ overlay }) => overlayComposition.contains(overlay, node))\n )\n private readonly _closingSubmenus = createClosingSubmenuStack<MenuOverlay>({\n getPanel: container => container.overlay,\n restoreItems: (container, parentItem) => moveMenuChildren(container.content, parentItem),\n dispose: container => {\n overlayComposition.unregisterPanel(container.overlay)\n container.overlay.remove()\n container.api.dispose()\n }\n })\n private readonly _hoverDelegate: MenuHoverDelegate = {\n getOpenDepth: () => this._activePath.length,\n getLevelItems: level => this._getLevelItems(level),\n getActiveItem: level => this._getLevelItems(level)[this._activePath[level]],\n isSubmenuItem: item => item.hasAttribute('submenu'),\n openSubmenu: item => {\n const level = this._getFocusedLevel(item)\n if (level === undefined) return\n const itemIndex = this._getLevelItems(level).indexOf(item)\n if (itemIndex >= 0) this._toggleSubmenu(level, itemIndex)\n },\n closeFrom: level => this._closeSubmenuFrom(level + 1)\n }\n private readonly _hoverBinder = createMenuHoverBinder(this._hoverDelegate, 'web-ui-dropdown-item')\n private readonly _keyboardDelegate: MenuKeyboardDelegate = {\n getFocusedItem: event =>\n getFocusedMenuItemFromPanels(\n event,\n [...this._overlays.values()].map(({ overlay }) => overlay),\n 'web-ui-dropdown-item'\n ),\n getLevelOf: item => this._getFocusedLevel(item),\n getEnabledItems: level => getEnabledMenuLevelItems(this._overlays.get(level)?.content),\n isSubmenuItem: item => item.hasAttribute('submenu'),\n openSubmenuInstant: item => {\n const level = this._getFocusedLevel(item)\n if (level === undefined) return\n const itemIndex = this._getLevelItems(level).indexOf(item)\n if (itemIndex >= 0) this._toggleSubmenu(level, itemIndex, true)\n },\n closeToParent: level => {\n this._closeSubmenuFrom(level)\n return this._getLevelItems(level - 1)[this._activePath[level - 1]]\n },\n closeDeepestOrAll: () => {\n if (this._activePath.length > 0) this._closeSubmenuFrom(this._activePath.length)\n else this._closeAll(true)\n }\n }\n private readonly _userOpenChange = new UserChangeController()\n private _restoreFocusTarget?: HTMLElement\n private _shouldOpenInstantly = true\n private _menuSyncScheduled = false\n private readonly _level0ItemAnchors: MenuItemAnchors = new Map()\n // 打开期实时渲染:框架(Vue/React 条件渲染)可能在菜单打开期间持续插入菜单项。\n // 观察宿主子树(新增项可能被框架 wrapper 包裹)与各层级面板 content 的子树\n // (打开中的 submenu 父项已被迁入 content,其新增子项只在这里可见),下一帧统一\n // 把新子树迁入对应层级面板;面板尺寸变化由 defineOverlay 的 autoUpdate 跟进重定位。\n private readonly _menuContentObserver = new MutationObserver(() => {\n if (this.open) this._scheduleMenuSync()\n })\n\n get isOpen(): boolean {\n return this.open || this._activePath.length > 0\n }\n\n override connectedCallback() {\n super.connectedCallback()\n this._lifecycle.resume()\n this.addEventListener('keydown', this._onKeydown)\n document.addEventListener('click', this._onClickOutside)\n this._menuContentObserver.observe(this, { childList: true, subtree: true })\n }\n\n override firstUpdated() {\n // trigger slot 内容增删不触发宿主响应式更新:显式请求一轮渲染,\n // 由 updated() 的 ARIA 回写覆盖晚到的 trigger 元素。\n this.shadowRoot\n ?.querySelector<HTMLSlotElement>('slot[name=\"trigger\"]')\n ?.addEventListener('slotchange', () => this.requestUpdate())\n }\n\n override disconnectedCallback() {\n super.disconnectedCallback()\n this._menuContentObserver.disconnect()\n this.removeEventListener('keydown', this._onKeydown)\n document.removeEventListener('click', this._onClickOutside)\n this._outsideClickGuard.dispose()\n this._hoverBinder.dispose()\n this._lifecycle.dispose()\n this._scrollLock.release()\n this._cleanupClosedMenu()\n }\n\n protected override updated(changed: Map<string, unknown>) {\n // ARIA 回写不依赖 open 分支,任何渲染后都保持与宿主状态同步。\n this._syncTriggerAria()\n\n if (changed.has('open')) {\n if (this.open) {\n this._restoreFocusTarget ??= document.activeElement instanceof HTMLElement ? document.activeElement : undefined\n this._outsideClickGuard.arm()\n this._syncScrollLock()\n this._hideAllSubmenuChildren()\n this._lifecycle.invalidate()\n this._lifecycle.scheduleFrame(() => {\n this._ensureOverlay(0, this._shouldOpenInstantly)\n this._shouldOpenInstantly = true\n focusMenuItem(getEnabledMenuLevelItems(this._overlays.get(0)?.content)[0])\n // 面板 id 在 overlay 构建后才有:回写 aria-controls 指向。\n this._syncTriggerAria()\n })\n this._bindHoversAfterUpdate()\n } else {\n this._lifecycle.invalidate()\n this._syncScrollLock()\n void this._closeRootAfterPresence()\n }\n if (this._userOpenChange.consume()) {\n dispatchOpenChangeEvent(this, this.open)\n }\n }\n if (changed.has('noScrollLock')) this._syncScrollLock()\n if (changed.has('placement') || changed.has('offset') || changed.has('matchWidth')) {\n this._overlays.get(0)?.api.update({\n placement: this.placement,\n offset: this.offset,\n matchWidth: this.matchWidth\n })\n }\n this._hoverBinder.bind()\n }\n\n // 命令式打开,不派发 open-change。\n openMenu() {\n this._openMenu(true, false)\n }\n\n private _openMenu(isInstant: boolean, fromUser: boolean) {\n if (this.disabled || this.open) return\n this._outsideClickGuard.arm()\n this._shouldOpenInstantly = isInstant\n if (fromUser) this._userOpenChange.mark()\n this.open = true\n }\n\n // 命令式关闭全部层级,不派发 open-change。\n closeAll() {\n this._closeAll(false)\n }\n\n private _closeAll(fromUser: boolean) {\n if (!this.open) return\n if (fromUser) this._userOpenChange.mark()\n this.open = false\n }\n\n // 不影响 open prop。\n private _closeAllSubmenus() {\n this._closeSubmenuFrom(1, true)\n this._closingSubmenus.restoreAll()\n this._syncActiveAttrs()\n }\n\n private _cleanupClosedMenu() {\n this._closeAllSubmenus()\n this._returnLevel0Items()\n this._disposeAll()\n }\n\n private async _closeRootAfterPresence() {\n const overlay = this._overlays.get(0)?.overlay\n if (overlay && !(await hideOverlayPresence(overlay))) return\n if (this.open || !this.isConnected) return\n\n this._cleanupClosedMenu()\n this._restoreFocusTarget?.focus()\n this._restoreFocusTarget = undefined\n }\n\n private _hideAllSubmenuChildren() {\n hideNestedMenuChildren(this, `${SLOT_PREFIX}-hidden`)\n }\n\n private _toggleSubmenu(level: number, itemIndex: number, isInstant = false) {\n if (this._activePath[level] === itemIndex) {\n return\n }\n\n this._closeSubmenuFrom(level + 1)\n\n this._activePath = [...this._activePath.slice(0, level), itemIndex]\n this._syncActiveAttrs()\n\n const item = this._getLevelItems(level)[itemIndex]\n if (item?.hasAttribute('submenu')) {\n this._lifecycle.scheduleFrame(() => {\n if (!this.open || this._activePath[level] !== itemIndex) return\n const restored = this._ensureOverlay(level + 1, isInstant, item)\n if (!restored) this._populateOverlay(level + 1, item)\n })\n }\n\n this._bindHoversAfterUpdate()\n }\n\n private _closeSubmenuFrom(level: number, isInstant = false) {\n for (let lv = this._activePath.length; lv >= level; lv--) {\n const overlay = this._overlays.get(lv)\n const parentItem = this._getLevelItems(lv - 1)[this._activePath[lv - 1]]\n if (!overlay) continue\n\n if (!parentItem || isInstant) {\n this._depopulateOverlay(lv, parentItem)\n this._disposeOverlay(lv)\n } else {\n this._overlays.delete(lv)\n this._closingSubmenus.closeAsync(parentItem, overlay)\n }\n }\n const nextActivePath = this._activePath.slice(0, level - 1)\n if (nextActivePath.length !== this._activePath.length) {\n this._activePath = nextActivePath\n }\n this._syncActiveAttrs()\n }\n\n private _syncActiveAttrs() {\n this.querySelectorAll('web-ui-dropdown-item').forEach(item => {\n item.removeAttribute('active')\n })\n this._overlays.forEach((_, level) => {\n this._getLevelItems(level).forEach(item => item.removeAttribute('active'))\n })\n this._activePath.forEach((itemIndex, level) => {\n const item = this._getLevelItems(level)[itemIndex]\n if (item?.matches('web-ui-dropdown-item')) {\n item.setAttribute('active', '')\n }\n })\n }\n\n private _getLevelItems(level: number): HTMLElement[] {\n const content = this._overlays.get(level)?.content\n return content ? getMenuChildren(content) : []\n }\n\n private _populateLevel0() {\n const content = this._overlays.get(0)?.content\n if (!content) return\n // 初次打开即建立 marker 锚:宿主此后始终持有模板序骨架,打开期框架插入与\n // 关闭归还都以它为基准(机制与 context-menu 共用,见 menu-tree)。\n reconcileManagedMenuItems(this, content, this._level0ItemAnchors, MENU_ITEM_MARKER)\n orderManagedMenuItems(this, content, this._level0ItemAnchors, MENU_ITEM_MARKER)\n }\n\n private _scheduleMenuSync() {\n if (this._menuSyncScheduled) return\n this._menuSyncScheduled = true\n requestAnimationFrame(() => {\n this._menuSyncScheduled = false\n if (!this.open) return\n this._syncOpenMenuContent()\n })\n }\n\n // 打开期的统一内容同步:把打开期间框架新增的菜单子树迁入对应层级面板。\n // 一级项走 marker 锚 reconcile(保序 + 关闭按模板位归还);面板尺寸变化由\n // defineOverlay 的 autoUpdate 跟进重定位。\n private _syncOpenMenuContent() {\n const level0Content = this._overlays.get(0)?.content\n // 迁移前隐藏宿主中新项的嵌套子项(hidden slot 属性随元素一起迁移)。\n this._hideAllSubmenuChildren()\n if (level0Content) {\n reconcileManagedMenuItems(this, level0Content, this._level0ItemAnchors, MENU_ITEM_MARKER)\n // 新迁入项的嵌套子项未打 hidden slot,会经 dropdown-item 默认 slot 渲染进\n // 父项 label 叠到菜单上;面板项在面板内渲染,宿主查询够不到,须对 content 补隐藏。\n hideNestedMenuChildren(level0Content, `${SLOT_PREFIX}-hidden`)\n // 框架注释锚点复位独立于元素重排:锚点漂移不收敛会破坏后续翻转的插入点(同 context-menu)。\n const frameworkAnchors = captureFrameworkAnchors(level0Content, MENU_ITEM_MARKER)\n orderManagedMenuItems(this, level0Content, this._level0ItemAnchors, MENU_ITEM_MARKER)\n restoreFrameworkAnchors(level0Content, frameworkAnchors)\n }\n for (const [level, overlay] of this._overlays) {\n if (level === 0) continue\n const parentItem = this._getLevelItems(level - 1)[this._activePath[level - 1]]\n if (parentItem) moveMenuChildren(parentItem, overlay.content)\n hideNestedMenuChildren(overlay.content, `${SLOT_PREFIX}-hidden`)\n }\n this._hoverBinder.bind()\n }\n\n private _returnLevel0Items() {\n const content = this._overlays.get(0)?.content\n if (content) returnManagedMenuItemsToSlot(this, content, this._level0ItemAnchors)\n }\n\n private _populateOverlay(level: number, submenuItem: HTMLElement) {\n const content = this._overlays.get(level)?.content\n if (content) moveMenuChildren(submenuItem, content)\n }\n\n private _depopulateOverlay(level: number, parentItem?: HTMLElement) {\n const content = this._overlays.get(level)?.content\n if (!content) return\n const targetLevel = level - 1\n const submenuItem = parentItem ?? this._getLevelItems(targetLevel)[this._activePath[targetLevel]]\n if (submenuItem) moveMenuChildren(content, submenuItem)\n }\n\n private _ensureOverlay(level: number, isInstant = false, submenuItem?: HTMLElement): boolean {\n const closingOverlay = submenuItem ? this._closingSubmenus.take(submenuItem) : undefined\n if (closingOverlay) {\n this._overlays.set(level, closingOverlay)\n closingOverlay.api.open()\n showOverlayPresence(closingOverlay.overlay, { isInstant })\n return true\n }\n const existing = this._overlays.get(level)\n if (existing) {\n existing.api.open()\n showOverlayPresence(existing.overlay, { isInstant })\n return false\n }\n this._buildOverlay(level, isInstant)\n return false\n }\n\n private _buildOverlay(level: number, isInstant = false) {\n const { panel: overlay, content } = createMenuPortalOverlay('dropdown-overlay', this)\n overlay.setAttribute('role', 'menu')\n // 根层级面板带 id:trigger 的 aria-controls 指向它(Q9a)。\n if (level === 0) overlay.id = `wui-dropdown-menu-${++dropdownIdCounter}`\n overlay.dataset.level = String(level)\n overlay.addEventListener('click', this._onMenuClick)\n overlay.addEventListener('keydown', this._onKeydown)\n\n const anchor = level === 0 ? this._queryTriggerAnchor() : this._getSubmenuTriggerAnchor(level - 1)\n\n if (anchor) {\n const ctrl = defineOverlay().make({\n anchor,\n overlay,\n placement: level === 0 ? this.placement : 'right-start',\n offset: level === 0 ? this.offset : 0,\n // 菜单至少与 trigger/父项同宽,内容可更宽(floor 来自 --wui-overlay-min-width)\n minAnchorWidth: true,\n matchWidth: level === 0 ? this.matchWidth : false,\n strategy: 'fixed'\n })\n this._overlays.set(level, { api: ctrl, overlay, content })\n overlayComposition.registerPanel(overlay, this._overlays.get(level - 1)?.overlay)\n if (level === 0) this._populateLevel0()\n // submenu 父项在面板 content 内,其新增子项只有观察 content 子树才能看到\n this._menuContentObserver.observe(content, { childList: true, subtree: true })\n ctrl.open()\n showOverlayPresence(overlay, { isInstant })\n }\n }\n\n private _disposeOverlay(level: number) {\n const overlay = this._overlays.get(level)\n if (overlay) overlayComposition.unregisterPanel(overlay.overlay)\n overlay?.overlay.removeEventListener('click', this._onMenuClick)\n overlay?.overlay.removeEventListener('keydown', this._onKeydown)\n overlay?.overlay.remove()\n overlay?.api.dispose()\n this._overlays.delete(level)\n this._rebindMenuContentObservers()\n }\n\n // jsdom 的 MutationObserver 不实现 unobserve;统一 disconnect 后重绑剩余目标。\n private _rebindMenuContentObservers() {\n this._menuContentObserver.disconnect()\n this._menuContentObserver.observe(this, { childList: true, subtree: true })\n for (const overlay of this._overlays.values()) {\n this._menuContentObserver.observe(overlay.content, { childList: true, subtree: true })\n }\n }\n\n private _disposeAll() {\n for (const level of this._overlays.keys()) {\n this._disposeOverlay(level)\n }\n }\n\n private _syncScrollLock(isOpen = this.open) {\n this._scrollLock.sync(isOpen && !this.noScrollLock)\n }\n\n private _queryTriggerAnchor(): HTMLElement | null {\n const slot = this.shadowRoot?.querySelector<HTMLSlotElement>('slot[name=\"trigger\"]')\n const el = slot?.assignedElements()[0]\n return el instanceof HTMLElement ? el : null\n }\n\n /*\n * trigger 语义回写(Q9a):slot 进来的元素是真正的可聚焦交互元素,\n * aria-haspopup / aria-expanded / aria-controls 必须设在它身上;\n * 组件没有 trigger 包装 div,此前完全没有 ARIA 接线。\n */\n private _syncTriggerAria() {\n const trigger = this._queryTriggerAnchor()\n if (!trigger) return\n trigger.setAttribute('aria-haspopup', 'menu')\n trigger.setAttribute('aria-expanded', String(this.open))\n const rootOverlay = this._overlays.get(0)?.overlay\n if (rootOverlay?.id) trigger.setAttribute('aria-controls', rootOverlay.id)\n else trigger.removeAttribute('aria-controls')\n }\n\n private _getSubmenuTriggerAnchor(level: number): HTMLElement | null {\n const idx = this._activePath[level]\n if (idx === undefined) return null\n const items = this._getLevelItems(level)\n const item = items[idx]\n if (!item) return null\n return item.shadowRoot?.querySelector('.item-inner') ?? item\n }\n\n private _onTriggerClick = (event: MouseEvent) => {\n if (this.disabled) return\n if (this.open) {\n this._closeAll(true)\n } else {\n this._openMenu(event.detail === 0, true)\n }\n }\n\n private _onClickOutside = (e: MouseEvent) => {\n if (!this.isOpen || this._outsideClickGuard.isArmed()) return\n if (this._outsideClickGuard.isInside(e)) return\n this._closeAll(true)\n }\n\n private _onMenuClick = (e: MouseEvent) => {\n const item = getMenuItemFromEvent(e)\n if (!item || item.hasAttribute('disabled') || !item.hasAttribute('submenu')) return\n\n const level = this._getFocusedLevel(item)\n if (level === undefined) return\n const itemIndex = this._getLevelItems(level).indexOf(item)\n if (itemIndex >= 0) this._toggleSubmenu(level, itemIndex, e.detail === 0)\n }\n\n private _onKeydown = (e: KeyboardEvent) => {\n if (this.disabled || !this.open) return\n\n // overlay 上键盘事件 target 是菜单项而非组件自身,不能限定 e.target === this,\n // 否则鼠标打开、焦点在菜单项时 Escape 无法关闭\n handleMenuKeyboard(this._keyboardDelegate, e)\n }\n\n private _getFocusedLevel(item?: HTMLElement): number | undefined {\n if (!item) return undefined\n const overlay = [...this._overlays.entries()].find(([, value]) => value.overlay.contains(item))\n return overlay?.[0]\n }\n\n private _bindHoversAfterUpdate() {\n requestAnimationFrame(() => this._hoverBinder.bind())\n }\n\n override render() {\n return html`\n <div class=\"dropdown-trigger\" @click=${this._onTriggerClick}>\n <slot name=\"trigger\"></slot>\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-dropdown': WebUiDropdown\n }\n}\n"],"mappings":"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"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/components/dropdown-header/style.css?inline
|
|
2
|
-
var e = "*,:before,:after{box-sizing:border-box}:host{display:block}.header{-webkit-user-select:none;user-select:none;color:var(--wui-color-text-tertiary
|
|
2
|
+
var e = "*,:before,:after{box-sizing:border-box}:host{display:block}.header{-webkit-user-select:none;user-select:none;color:var(--wui-color-text-tertiary,color-mix(in srgb, var(--wui-color-text) 35%, transparent));padding:8px 8px 4px;font-size:12px;font-weight:600}";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { e as default };
|
|
5
5
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"style.js","names":[],"sources":["../../../src/components/dropdown-header/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: block;\n}\n\n.header {\n user-select: none;\n\n padding: 8px 8px 4px;\n\n font-size: 12px;\n font-weight: 600;\n color: var(--wui-color-text-tertiary,
|
|
1
|
+
{"version":3,"file":"style.js","names":[],"sources":["../../../src/components/dropdown-header/style.css?inline"],"sourcesContent":["*,\n*::before,\n*::after {\n box-sizing: border-box;\n}\n\n:host {\n display: block;\n}\n\n.header {\n user-select: none;\n\n padding: 8px 8px 4px;\n\n font-size: 12px;\n font-weight: 600;\n color: var(--wui-color-text-tertiary, color-mix(in srgb, var(--wui-color-text) 35%, transparent));\n}\n"],"mappings":""}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
//#region src/components/dropdown-item/style.css?inline
|
|
2
|
-
var e = "*,:before,:after{box-sizing:border-box}:host{display:block}:host([disabled]){cursor:not-allowed;opacity:.4}.item-inner{-webkit-user-select:none;user-select:none;height:32px;font-size:var(--wui-font-size,14px);color:inherit;white-space:nowrap;
|
|
2
|
+
var e = "*,:before,:after{box-sizing:border-box}:host{display:block}:host([disabled]){cursor:not-allowed;opacity:.4}.item-inner{-webkit-user-select:none;user-select:none;border-radius:var(--wui-radius-control,calc(infinity * 1px));height:32px;font-size:var(--wui-font-size,14px);color:inherit;white-space:nowrap;outline:none;align-items:center;gap:8px;padding:0 8px;display:flex}.item-inner:focus-visible{color:var(--wui-color-on-accent,#fff);background:var(--wui-color-accent,#08f)}:host([active]) .item-inner{color:inherit;background:var(--wui-color-border,#0000001a)}@media (hover:hover) and (pointer:fine){:host(:hover) .item-inner{color:var(--wui-color-on-accent,#fff);background:var(--wui-color-accent,#08f)}}.item-label{min-width:0;color:inherit;text-overflow:ellipsis;flex:1;overflow:hidden}.item-suffix{opacity:.4;flex:none}";
|
|
3
3
|
//#endregion
|
|
4
4
|
export { e as default };
|
|
5
5
|
|