@greypan/web-ui 8.1.0 → 9.1.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.
Files changed (163) hide show
  1. package/README.CN.md +309 -135
  2. package/README.md +311 -135
  3. package/dist/assets/glass.js +1 -1
  4. package/dist/assets/glass.js.map +1 -1
  5. package/dist/assets/menu-portal.js +1 -1
  6. package/dist/assets/menu-portal.js.map +1 -1
  7. package/dist/assets/modal-surface.js +6 -0
  8. package/dist/assets/modal-surface.js.map +1 -0
  9. package/dist/assets/selection-control.js +1 -1
  10. package/dist/assets/selection-control.js.map +1 -1
  11. package/dist/assets/toast-containers.js +1 -1
  12. package/dist/assets/toast-containers.js.map +1 -1
  13. package/dist/components/autocomplete/index.d.ts +3 -2
  14. package/dist/components/autocomplete/index.js +40 -44
  15. package/dist/components/autocomplete/index.js.map +1 -1
  16. package/dist/components/autocomplete/style.js +1 -1
  17. package/dist/components/autocomplete/style.js.map +1 -1
  18. package/dist/components/avatar/index.js.map +1 -1
  19. package/dist/components/avatar/style.js +1 -1
  20. package/dist/components/avatar/style.js.map +1 -1
  21. package/dist/components/back-top/style.js +1 -1
  22. package/dist/components/back-top/style.js.map +1 -1
  23. package/dist/components/badge/style.js +1 -1
  24. package/dist/components/badge/style.js.map +1 -1
  25. package/dist/components/button/style.js +1 -1
  26. package/dist/components/button/style.js.map +1 -1
  27. package/dist/components/button-group/index.js +0 -1
  28. package/dist/components/button-group/index.js.map +1 -1
  29. package/dist/components/button-group/style.js +1 -1
  30. package/dist/components/button-group/style.js.map +1 -1
  31. package/dist/components/checkbox/index.js +4 -4
  32. package/dist/components/checkbox/index.js.map +1 -1
  33. package/dist/components/checkbox-group/style.js +1 -1
  34. package/dist/components/checkbox-group/style.js.map +1 -1
  35. package/dist/components/context-menu/index.d.ts +182 -3
  36. package/dist/components/context-menu/index.js +166 -91
  37. package/dist/components/context-menu/index.js.map +1 -1
  38. package/dist/components/context-menu/scrim.js +6 -0
  39. package/dist/components/context-menu/scrim.js.map +1 -0
  40. package/dist/components/context-menu/style.js +1 -1
  41. package/dist/components/context-menu/style.js.map +1 -1
  42. package/dist/components/dialog/index.d.ts +9 -0
  43. package/dist/components/dialog/index.js +68 -46
  44. package/dist/components/dialog/index.js.map +1 -1
  45. package/dist/components/dialog/style.js +1 -1
  46. package/dist/components/dialog/style.js.map +1 -1
  47. package/dist/components/drawer/index.d.ts +45 -0
  48. package/dist/components/drawer/index.js +122 -53
  49. package/dist/components/drawer/index.js.map +1 -1
  50. package/dist/components/drawer/style.js +1 -1
  51. package/dist/components/drawer/style.js.map +1 -1
  52. package/dist/components/dropdown/index.d.ts +12 -0
  53. package/dist/components/dropdown/index.js +13 -10
  54. package/dist/components/dropdown/index.js.map +1 -1
  55. package/dist/components/dropdown-divider/style.js +1 -1
  56. package/dist/components/dropdown-divider/style.js.map +1 -1
  57. package/dist/components/dropdown-header/style.js +1 -1
  58. package/dist/components/dropdown-header/style.js.map +1 -1
  59. package/dist/components/dropdown-item/style.js +1 -1
  60. package/dist/components/dropdown-item/style.js.map +1 -1
  61. package/dist/components/editable-text/index.d.ts +39 -0
  62. package/dist/components/editable-text/index.js +6 -2
  63. package/dist/components/editable-text/index.js.map +1 -1
  64. package/dist/components/empty/index.d.ts +21 -4
  65. package/dist/components/empty/index.js +37 -32
  66. package/dist/components/empty/index.js.map +1 -1
  67. package/dist/components/empty/style.js +1 -1
  68. package/dist/components/empty/style.js.map +1 -1
  69. package/dist/components/image-preview/index.js +75 -63
  70. package/dist/components/image-preview/index.js.map +1 -1
  71. package/dist/components/image-preview/style.js +1 -1
  72. package/dist/components/image-preview/style.js.map +1 -1
  73. package/dist/components/index.d.ts +1 -0
  74. package/dist/components/index.js +38 -37
  75. package/dist/components/input/style.js +1 -1
  76. package/dist/components/input/style.js.map +1 -1
  77. package/dist/components/input-number/style.js +1 -1
  78. package/dist/components/input-number/style.js.map +1 -1
  79. package/dist/components/layout/index.d.ts +21 -6
  80. package/dist/components/layout/index.js +47 -27
  81. package/dist/components/layout/index.js.map +1 -1
  82. package/dist/components/layout/style.js +1 -1
  83. package/dist/components/layout/style.js.map +1 -1
  84. package/dist/components/middle-ellipsis/index.d.ts +100 -0
  85. package/dist/components/middle-ellipsis/index.js +112 -0
  86. package/dist/components/middle-ellipsis/index.js.map +1 -0
  87. package/dist/components/middle-ellipsis/style.js +6 -0
  88. package/dist/components/middle-ellipsis/style.js.map +1 -0
  89. package/dist/components/middle-ellipsis/truncate.d.ts +62 -0
  90. package/dist/components/middle-ellipsis/truncate.js +45 -0
  91. package/dist/components/middle-ellipsis/truncate.js.map +1 -0
  92. package/dist/components/option/style.js +1 -1
  93. package/dist/components/option/style.js.map +1 -1
  94. package/dist/components/popover/index.js.map +1 -1
  95. package/dist/components/popover/style.js +1 -1
  96. package/dist/components/popover/style.js.map +1 -1
  97. package/dist/components/radio/style.js +1 -1
  98. package/dist/components/radio/style.js.map +1 -1
  99. package/dist/components/radio-group/style.js +1 -1
  100. package/dist/components/radio-group/style.js.map +1 -1
  101. package/dist/components/segmented/index.d.ts +5 -0
  102. package/dist/components/segmented/index.js +45 -28
  103. package/dist/components/segmented/index.js.map +1 -1
  104. package/dist/components/segmented/style.js +1 -1
  105. package/dist/components/segmented/style.js.map +1 -1
  106. package/dist/components/segmented-trigger/style.js +1 -1
  107. package/dist/components/segmented-trigger/style.js.map +1 -1
  108. package/dist/components/select/index.js +0 -1
  109. package/dist/components/select/index.js.map +1 -1
  110. package/dist/components/select/style.js +1 -1
  111. package/dist/components/select/style.js.map +1 -1
  112. package/dist/components/slider/style.js +1 -1
  113. package/dist/components/slider/style.js.map +1 -1
  114. package/dist/components/spinner/style.js +1 -1
  115. package/dist/components/spinner/style.js.map +1 -1
  116. package/dist/components/svg-draw-lines/index.js.map +1 -1
  117. package/dist/components/switch/style.js +1 -1
  118. package/dist/components/switch/style.js.map +1 -1
  119. package/dist/components/textarea/index.js +2 -2
  120. package/dist/components/textarea/index.js.map +1 -1
  121. package/dist/components/textarea/style.js +1 -1
  122. package/dist/components/textarea/style.js.map +1 -1
  123. package/dist/components/theme/style.js +1 -1
  124. package/dist/components/theme/style.js.map +1 -1
  125. package/dist/components/toast/style.js +1 -1
  126. package/dist/components/toast/style.js.map +1 -1
  127. package/dist/components/tooltip/index.js.map +1 -1
  128. package/dist/components/tooltip/style.js +1 -1
  129. package/dist/components/tooltip/style.js.map +1 -1
  130. package/dist/icons/generated/akar-icons-circle-check.d.ts +6 -0
  131. package/dist/icons/generated/akar-icons-circle-check.js +10 -0
  132. package/dist/icons/generated/akar-icons-circle-check.js.map +1 -0
  133. package/dist/icons/generated/bi-check-lg.d.ts +6 -0
  134. package/dist/icons/generated/bi-check-lg.js +10 -0
  135. package/dist/icons/generated/bi-check-lg.js.map +1 -0
  136. package/dist/icons/generated/fluent-tag-search-24-regular.d.ts +6 -0
  137. package/dist/icons/generated/fluent-tag-search-24-regular.js +10 -0
  138. package/dist/icons/generated/fluent-tag-search-24-regular.js.map +1 -0
  139. package/dist/icons/generated/mdi-tag-search-outline.d.ts +6 -0
  140. package/dist/icons/generated/mdi-tag-search-outline.js +10 -0
  141. package/dist/icons/generated/mdi-tag-search-outline.js.map +1 -0
  142. package/dist/icons/index.d.ts +4 -0
  143. package/dist/icons/index.js +5 -1
  144. package/dist/scrollbars/index.d.ts +33 -0
  145. package/dist/scrollbars/index.js +18 -0
  146. package/dist/scrollbars/index.js.map +1 -0
  147. package/dist/scrollbars/style.css +10 -0
  148. package/dist/shared/element-height/index.js +47 -0
  149. package/dist/shared/element-height/index.js.map +1 -0
  150. package/dist/shared/element-width/index.js +37 -0
  151. package/dist/shared/element-width/index.js.map +1 -0
  152. package/dist/shared/menu-portal/menu-portal.js +11 -11
  153. package/dist/shared/menu-portal/menu-portal.js.map +1 -1
  154. package/dist/shared/menu-portal/menu-tree.js +2 -2
  155. package/dist/shared/menu-portal/menu-tree.js.map +1 -1
  156. package/dist/shared/overlay/anchored-panel.js.map +1 -1
  157. package/dist/shared/overlay/native-dialog-presence.js +23 -11
  158. package/dist/shared/overlay/native-dialog-presence.js.map +1 -1
  159. package/dist/shared/overlay/nested-drawer-layers.js +30 -23
  160. package/dist/shared/overlay/nested-drawer-layers.js.map +1 -1
  161. package/dist/shared/scroll-lock/scroll-lock.js +3 -3
  162. package/dist/shared/scroll-lock/scroll-lock.js.map +1 -1
  163. package/package.json +19 -5
@@ -1,24 +1,24 @@
1
1
  import e from "../../_virtual/_@oxc-project_runtime@0.149.0/helpers/esm/decorate.js";
2
- import { dispatchOpenChangeEvent as t } from "../../shared/open-state/index.js";
3
- import { computePosition as n, shift as r } from "../../node_modules/.pnpm/@floating-ui_dom@1.8.0/node_modules/@floating-ui/dom/dist/floating-ui.dom.js";
4
- import { defineOverlayPositioningGeneration as i } from "../../shared/overlay/positioning-generation.js";
5
- import { hideOverlayPresence as a, showOverlayPresence as o } from "../../shared/overlay/presence.js";
6
- import { defineOpenOverlay as s } from "../../shared/overlay/open-overlay.js";
7
- import { defineScrollLockLease as c } from "../../shared/scroll-lock/scroll-lock.js";
8
- import { UserChangeController as l } from "../../shared/events/user-change.js";
9
- import "../dropdown-divider/index.js";
10
- import "../dropdown-header/index.js";
11
- import "../dropdown-item/index.js";
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 D from "./style.js";
16
- import { LitElement as O, html as k, unsafeCSS as A } from "lit";
17
- import { customElement as j, property as M, state as N } from "lit/decorators.js";
2
+ import { normalizeNumber as t } from "../../shared/normalize/index.js";
3
+ import { dispatchOpenChangeEvent as n } from "../../shared/open-state/index.js";
4
+ import { computePosition as r, flip as i, shift as a } from "../../node_modules/.pnpm/@floating-ui_dom@1.8.0/node_modules/@floating-ui/dom/dist/floating-ui.dom.js";
5
+ import { defineOverlayPositioningGeneration as o } from "../../shared/overlay/positioning-generation.js";
6
+ import { hideOverlayPresence as s, showOverlayPresence as c } from "../../shared/overlay/presence.js";
7
+ import { defineOpenOverlay as l } from "../../shared/overlay/open-overlay.js";
8
+ import { findNearestTheme as u } from "../../shared/overlay/theme-overlay-scope.js";
9
+ import { defineScrollLockLease as d } from "../../shared/scroll-lock/scroll-lock.js";
10
+ import { UserChangeController as f } from "../../shared/events/user-change.js";
11
+ import { captureFrameworkAnchors as p, findFocusedMenuItem as m, focusMenuItem as h, getMenuChildren as g, getMenuItemFromEvent as _, hideNestedMenuChildren as v, moveMenuChildren as y, orderManagedMenuItems as b, reconcileManagedMenuItems as x, restoreFrameworkAnchors as S, returnManagedMenuItemsToSlot as C } from "../../shared/menu-portal/menu-tree.js";
12
+ import { createClosingSubmenuStack as w, createMenuHoverBinder as T, createMenuOutsideClickGuard as E, getEnabledMenuLevelItems as D, getFocusedMenuItemFromPanels as O, handleMenuKeyboard as k } from "../../shared/menu-behavior/index.js";
13
+ import { createMenuPortalOverlay as A } from "../../shared/menu-portal/menu-portal.js";
14
+ import j from "./scrim.js";
15
+ import M from "./style.js";
16
+ import { LitElement as N, html as P, unsafeCSS as F } from "lit";
17
+ import { customElement as I, property as L, state as R } from "lit/decorators.js";
18
18
  //#region src/components/context-menu/index.ts
19
- var P = "wui-context-menu-item", F = class extends O {
19
+ var z = "wui-context-menu-item", B = 500, V = 5e3, H = 10, U = 1e3, W = "data-wui-menu-scrim", G = 5, K = 8, q = class extends N {
20
20
  constructor(...e) {
21
- super(...e), this.disabled = !1, this.noScrollLock = !1, this._isOpen = !1, this._x = 0, this._y = 0, this._activeSubmenus = [], this._activeSubmenuItems = [], this._submenuPositionEpochs = /* @__PURE__ */ new WeakMap(), this._menuHandle = null, this._submenuHandles = /* @__PURE__ */ new Map(), this._outsideClickGuard = S(this, (e) => this._menuHandle?.contains(e) ?? !1), this._closingSubmenus = b({
21
+ super(...e), this.disabled = !1, this.noScrollLock = !1, this.longPress = !1, this._longPressDelay = B, this._isOpen = !1, this._x = 0, this._y = 0, this._activeSubmenus = [], this._activeSubmenuItems = [], this._longPressOpenedAt = null, this._submenuPositionEpochs = /* @__PURE__ */ new WeakMap(), this._centerOnPressPoint = !1, this._closeSource = "default", this._menuHandle = null, this._submenuHandles = /* @__PURE__ */ new Map(), this._outsideClickGuard = E(this, (e) => this._menuHandle?.contains(e) ?? !1), this._closingSubmenus = w({
22
22
  getPanel: (e) => e.panel,
23
23
  restoreItems: (e, t) => this._restoreSubmenuItems(e, t),
24
24
  dispose: (e) => {
@@ -33,13 +33,13 @@ var P = "wui-context-menu-item", F = class extends O {
33
33
  closeFrom: (e) => {
34
34
  this._closeSubmenusFrom(e), this._hoverBinder.bind();
35
35
  }
36
- }, this._hoverBinder = x(this._hoverDelegate, "web-ui-dropdown-item"), this._keyboardDelegate = {
37
- getFocusedItem: (e) => w(e, [this._menu?.content, ...this._activeSubmenus.map((e) => e.content)], "web-ui-dropdown-item"),
36
+ }, this._hoverBinder = T(this._hoverDelegate, "web-ui-dropdown-item"), this._keyboardDelegate = {
37
+ getFocusedItem: (e) => O(e, [this._menu?.content, ...this._activeSubmenus.map((e) => e.content)], "web-ui-dropdown-item"),
38
38
  getLevelOf: (e) => {
39
39
  let t = this._getItemLevel(e);
40
40
  return t === -1 ? void 0 : t;
41
41
  },
42
- getEnabledItems: (e) => C(this._getLevelContainer(e)?.content),
42
+ getEnabledItems: (e) => D(this._getLevelContainer(e)?.content),
43
43
  isSubmenuItem: (e) => e.hasAttribute("submenu"),
44
44
  openSubmenuInstant: (e) => this._openSubmenu(e, !0),
45
45
  closeToParent: (e) => {
@@ -47,15 +47,42 @@ var P = "wui-context-menu-item", F = class extends O {
47
47
  return this._closeSubmenusFrom(e - 1), this._hoverBinder.bind(), t;
48
48
  },
49
49
  closeDeepestOrAll: () => this._closeLastSubmenuOrMenu()
50
- }, this._overlay = s().make({
50
+ }, this._overlay = l().make({
51
51
  requestClose: () => this._keyboardDelegate.closeDeepestOrAll(),
52
52
  isConnected: () => this.isConnected
53
- }), this._menuItemAnchors = /* @__PURE__ */ new Map(), this._scrollLock = c().make(), this._userOpenChange = new l(), this._shouldOpenInstantly = !0, this._refreshScheduled = !1, this._menuPositionGeneration = i().make(), this._contentObserver = new MutationObserver(() => {
53
+ }), this._menuItemAnchors = /* @__PURE__ */ new Map(), this._scrollLock = d().make(), this._userOpenChange = new f(), this._shouldOpenInstantly = !0, this._suppressInitialFocusVisible = !0, this._refreshScheduled = !1, this._menuPositionGeneration = o().make(), this._contentObserver = new MutationObserver(() => {
54
54
  this._isOpen && this._scheduleRefresh();
55
- }), this._closeFromUser = () => {
56
- this._isOpen && (this._userOpenChange.mark(), this.close());
55
+ }), this._closeFromUser = (e = "default") => {
56
+ this._isOpen && (this._userOpenChange.mark(), this._closeSource = e, this.close());
57
+ }, this._onScrimClick = (e) => {
58
+ e.target === this._scrim && (this._isLongPressFollowUp() || this._closeFromUser());
59
+ }, this._onScrimCancel = (e) => {
60
+ e.preventDefault();
61
+ }, this._onPointerDown = (e) => {
62
+ this._longPressOpenedAt = null, this.longPress && !this.disabled && e.pointerType === "touch" && (this._cancelLongPress(), this._longPressOrigin = {
63
+ x: e.clientX,
64
+ y: e.clientY
65
+ }, this._longPressTimer = setTimeout(() => {
66
+ this._longPressTimer = void 0;
67
+ let e = this._longPressOrigin;
68
+ e && (this._longPressOrigin = void 0, !this._isOpen && (this._longPressOpenedAt = performance.now(), this._openAt(e.x, e.y, !1, !0, !0) && this._userOpenChange.mark()));
69
+ }, this.longPressDelay));
70
+ }, this._onPointerMove = (e) => {
71
+ if (e.pointerType !== "touch") return;
72
+ let t = this._longPressOrigin;
73
+ t && Math.hypot(e.clientX - t.x, e.clientY - t.y) > H && this._cancelLongPress();
74
+ }, this._onPointerUp = (e) => {
75
+ e.pointerType === "touch" && this._cancelLongPress();
76
+ }, this._onPointerCancel = () => {
77
+ this._cancelLongPress();
57
78
  }, this._onContextMenu = (e) => {
58
- this.disabled || (e.preventDefault(), this._restoreFocusTarget = e.target instanceof HTMLElement ? e.target : void 0, this._openAt(e.clientX, e.clientY, !1) && this._userOpenChange.mark());
79
+ if (!this.disabled) {
80
+ if (this._isLongPressFollowUp()) {
81
+ e.preventDefault();
82
+ return;
83
+ }
84
+ e.preventDefault(), this._openAt(e.clientX, e.clientY, !1, !0) && this._userOpenChange.mark();
85
+ }
59
86
  }, this._onContextMenuOutside = (e) => {
60
87
  this._isOpen && !this._outsideClickGuard.isInside(e) && this._closeFromUser();
61
88
  }, this._onKeydown = (e) => {
@@ -64,37 +91,42 @@ var P = "wui-context-menu-item", F = class extends O {
64
91
  let t = document.activeElement;
65
92
  if (t && t !== document.body) {
66
93
  let e = t.getBoundingClientRect();
67
- this._openAt(e.left, e.bottom, !0) && this._userOpenChange.mark();
68
- } else this._openAt(window.innerWidth / 2, window.innerHeight / 2, !0) && this._userOpenChange.mark();
94
+ this._openAt(e.left, e.bottom, !0, !1) && this._userOpenChange.mark();
95
+ } else this._openAt(window.innerWidth / 2, window.innerHeight / 2, !0, !1) && this._userOpenChange.mark();
69
96
  return;
70
97
  }
71
- }, this._onClickOutside = (e) => {
72
- this._isOpen && !this._outsideClickGuard.isArmed() && (this._outsideClickGuard.isInside(e) || this._closeFromUser());
73
98
  }, this._onMenuClick = (e) => {
74
- let t = p(e);
99
+ let t = _(e);
75
100
  if (t && !t.hasAttribute("disabled")) {
76
101
  if (t.hasAttribute("submenu")) {
77
102
  this._openSubmenu(t);
78
103
  return;
79
104
  }
80
- this._closeFromUser();
105
+ this._closeFromUser("menu-item");
81
106
  }
82
107
  }, this._onWheel = (e) => {
83
108
  this._preventBackgroundScroll(e);
84
109
  }, this._onTouchMove = (e) => {
85
110
  this._preventBackgroundScroll(e);
86
111
  }, this._onDocumentKeydown = (e) => {
87
- this._isOpen && T(this._keyboardDelegate, e);
112
+ this._isOpen && k(this._keyboardDelegate, e);
88
113
  };
89
114
  }
90
115
  static {
91
- this.styles = A(D);
116
+ this.styles = F(M);
117
+ }
118
+ get longPressDelay() {
119
+ return this._longPressDelay;
120
+ }
121
+ set longPressDelay(e) {
122
+ let n = this._longPressDelay;
123
+ this._longPressDelay = t(e, 0, V, B), this.requestUpdate("longPressDelay", n);
92
124
  }
93
125
  get isOpen() {
94
126
  return this._isOpen;
95
127
  }
96
128
  connectedCallback() {
97
- super.connectedCallback(), this._hideMenuItems(), this.addEventListener("contextmenu", this._onContextMenu), this.addEventListener("keydown", this._onKeydown), this.addEventListener("click", this._onMenuClick), document.addEventListener("click", this._onClickOutside), document.addEventListener("contextmenu", this._onContextMenuOutside), document.addEventListener("wheel", this._onWheel, {
129
+ super.connectedCallback(), this._hideMenuItems(), this.addEventListener("contextmenu", this._onContextMenu), this.addEventListener("keydown", this._onKeydown), this.addEventListener("click", this._onMenuClick), this.addEventListener("pointerdown", this._onPointerDown), this.addEventListener("pointermove", this._onPointerMove), this.addEventListener("pointerup", this._onPointerUp), this.addEventListener("pointercancel", this._onPointerCancel), document.addEventListener("contextmenu", this._onContextMenuOutside), document.addEventListener("wheel", this._onWheel, {
98
130
  capture: !0,
99
131
  passive: !1
100
132
  }), document.addEventListener("touchmove", this._onTouchMove, {
@@ -103,7 +135,7 @@ var P = "wui-context-menu-item", F = class extends O {
103
135
  }), document.addEventListener("keydown", this._onDocumentKeydown);
104
136
  }
105
137
  disconnectedCallback() {
106
- super.disconnectedCallback(), this.removeEventListener("contextmenu", this._onContextMenu), this.removeEventListener("keydown", this._onKeydown), this.removeEventListener("click", this._onMenuClick), document.removeEventListener("click", this._onClickOutside), document.removeEventListener("contextmenu", this._onContextMenuOutside), document.removeEventListener("wheel", this._onWheel, !0), document.removeEventListener("touchmove", this._onTouchMove, !0), document.removeEventListener("keydown", this._onDocumentKeydown), this._contentObserver.disconnect(), this._menuPositionGeneration.invalidate(), this._outsideClickGuard.dispose(), this._hoverBinder.dispose(), this._scrollLock.release(), this._menuHandle?.release(), this._menuHandle = null, this._returnItemsToSlot(), this._menu?.panel.remove(), this._menu = void 0, this._closeSubmenusFrom(0, !0), this._closingSubmenus.restoreAll(), this._isOpen = !1, this._restoreFocusTarget = void 0;
138
+ super.disconnectedCallback(), this.removeEventListener("contextmenu", this._onContextMenu), this.removeEventListener("keydown", this._onKeydown), this.removeEventListener("click", this._onMenuClick), this.removeEventListener("pointerdown", this._onPointerDown), this.removeEventListener("pointermove", this._onPointerMove), this.removeEventListener("pointerup", this._onPointerUp), this.removeEventListener("pointercancel", this._onPointerCancel), document.removeEventListener("contextmenu", this._onContextMenuOutside), document.removeEventListener("wheel", this._onWheel, !0), document.removeEventListener("touchmove", this._onTouchMove, !0), document.removeEventListener("keydown", this._onDocumentKeydown), this._contentObserver.disconnect(), this._menuPositionGeneration.invalidate(), this._outsideClickGuard.dispose(), this._hoverBinder.dispose(), this._scrollLock.release(), this._menuHandle?.release(), this._menuHandle = null, this._returnItemsToSlot(), this._menu?.panel.remove(), this._menu = void 0, this._closeSubmenusFrom(0, !0), this._closingSubmenus.restoreAll(), this._closeScrim(), this._isOpen = !1, this._cancelLongPress(), this._longPressOpenedAt = null;
107
139
  }
108
140
  updated(e) {
109
141
  if (!this.isConnected) {
@@ -112,7 +144,11 @@ var P = "wui-context-menu-item", F = class extends O {
112
144
  }
113
145
  if (e.has("_isOpen")) {
114
146
  if (this._isOpen) {
115
- if (this._syncScrollLock(), this._menu || (this._menu = E("context-menu", this), this._menu.panel.setAttribute("role", "menu"), this._menu.panel.setAttribute("aria-label", "上下文菜单"), this._menu.panel.addEventListener("click", this._onMenuClick)), !this._menuHandle) {
147
+ if (this._syncScrollLock(), !this._menu) {
148
+ let e = this._openScrim();
149
+ this._menu = A("context-menu", this, e), this._menu.panel.setAttribute("role", "menu"), this._menu.panel.setAttribute("aria-label", "上下文菜单"), this._menu.panel.addEventListener("click", this._onMenuClick);
150
+ }
151
+ if (!this._menuHandle) {
116
152
  this._menuHandle = this._overlay.claim(this._menu.panel);
117
153
  for (let e of this._activeSubmenus) this._submenuHandles.delete(e.panel), this._submenuHandles.set(e.panel, this._menuHandle.adopt(e.panel));
118
154
  for (let e of this._closingSubmenus.closing()) this._submenuHandles.set(e.panel, this._menuHandle.adopt(e.panel));
@@ -121,21 +157,23 @@ var P = "wui-context-menu-item", F = class extends O {
121
157
  childList: !0,
122
158
  subtree: !0
123
159
  }), requestAnimationFrame(() => {
124
- this._isOpen && this._menu && (this._refreshMenu(), o(this._menu.panel, { isInstant: this._shouldOpenInstantly }), this._shouldOpenInstantly = !0, this._focusFirstItem());
160
+ this._isOpen && this._menu && (this._refreshMenu(), c(this._menu.panel, { isInstant: this._shouldOpenInstantly }), this._shouldOpenInstantly = !0, requestAnimationFrame(() => {
161
+ this._isOpen && this._menu && this._focusFirstItem();
162
+ }));
125
163
  });
126
- } else this._syncScrollLock(!1), this._menuHandle?.release(), this._menuHandle = null, this._contentObserver.disconnect(), this._menuPositionGeneration.invalidate(), this._refreshScheduled = !1, this._closeMenuAfterPresence();
164
+ } else this._syncScrollLock(!1), this._longPressOpenedAt = null, this._menuHandle?.release(), this._menuHandle = null, this._contentObserver.disconnect(), this._menuPositionGeneration.invalidate(), this._refreshScheduled = !1, this._closeMenuAfterPresence();
127
165
  this._userOpenChange.consume() && this._dispatchChange(this._isOpen);
128
166
  }
129
167
  e.has("noScrollLock") && this._syncScrollLock();
130
168
  }
131
169
  openAt(e, t) {
132
- this._openAt(e, t, !0);
170
+ this._openAt(e, t, !0, !0);
133
171
  }
134
- _openAt(e, t, n) {
135
- return !this.disabled && (this._x = e, this._y = t, this._shouldOpenInstantly = n, this._outsideClickGuard.arm(), this._isOpen ? (this._closeSubmenusFrom(0, !0), this._closingSubmenus.restoreAll(), this._menuPositionGeneration.invalidate(), this._scheduleRefresh(), !1) : (this._restoreFocusTarget ??= document.activeElement instanceof HTMLElement ? document.activeElement : void 0, this._isOpen = !0, !0));
172
+ _openAt(e, t, n, r, i = !1) {
173
+ return !this.disabled && (this._x = e, this._y = t, this._shouldOpenInstantly = n, this._suppressInitialFocusVisible = r, this._centerOnPressPoint = i, this._outsideClickGuard.arm(), this._isOpen ? (this._closeSubmenusFrom(0, !0), this._closingSubmenus.restoreAll(), this._menuPositionGeneration.invalidate(), this._scheduleRefresh(), !1) : (this._isOpen = !0, !0));
136
174
  }
137
175
  close() {
138
- this._isOpen && (this._isOpen = !1, this._menuPositionGeneration.invalidate());
176
+ this._isOpen && (this._isOpen = !1, this._menuPositionGeneration.invalidate(), this._closeSource === "menu-item" && this._releaseScrimModality(), this._closeSource = "default");
139
177
  }
140
178
  _scheduleRefresh() {
141
179
  !this._refreshScheduled && this._isOpen && (this._refreshScheduled = !0, requestAnimationFrame(() => {
@@ -148,55 +186,78 @@ var P = "wui-context-menu-item", F = class extends O {
148
186
  _positionMenu() {
149
187
  let e = this._menu?.panel;
150
188
  if (!e) return;
151
- if (e.style.visibility = "hidden", e.style.display = "", !(e.parentElement instanceof HTMLDialogElement && e.parentElement.open)) {
152
- this._positionMenuInViewport(e);
153
- return;
154
- }
155
- let t = this._menuPositionGeneration.next();
156
- n({ getBoundingClientRect: () => new DOMRect(this._x, this._y, 0, 0) }, e, {
189
+ let t = this._safeAreaBottom();
190
+ e.style.visibility = "hidden", e.style.display = "";
191
+ let n = this._menuPositionGeneration.next(), o = {
192
+ top: K,
193
+ bottom: K + t,
194
+ left: K,
195
+ right: K
196
+ }, s = this._centerOnPressPoint ? ["bottom", "top"] : ["bottom-start", "top-start"];
197
+ r({ getBoundingClientRect: () => new DOMRect(this._x, this._y, 0, 0) }, e, {
157
198
  strategy: "fixed",
158
- placement: "bottom-start",
159
- middleware: [r({
160
- padding: 8,
199
+ placement: s[0],
200
+ middleware: [i({
201
+ fallbackPlacements: [...s],
202
+ padding: o
203
+ }), a({
204
+ padding: o,
161
205
  crossAxis: !0
162
206
  })]
163
- }).then(({ x: n, y: r, middlewareData: i }) => {
164
- if (!this._isOpen || this._menu?.panel !== e || !this._menuPositionGeneration.isCurrent(t)) return;
165
- let a = i.shift?.x ?? 0, o = i.shift?.y ?? 0;
166
- this._applyMenuPosition(e, n, r, a < 0 ? "right" : "left", o < 0 ? "bottom" : "top");
207
+ }).then(({ x: t, y: r, placement: i, middlewareData: a }) => {
208
+ if (!this._isOpen || this._menu?.panel !== e || !this._menuPositionGeneration.isCurrent(n)) return;
209
+ let o = a.shift?.x ?? 0, s = i.includes("-") ? o < 0 ? "right" : "left" : o === 0 ? "center" : o < 0 ? "right" : "left";
210
+ this._applyMenuPosition(e, t, r, s, i.startsWith("bottom") ? "top" : "bottom");
167
211
  });
168
212
  }
169
- _positionMenuInViewport(e) {
170
- let { width: t, height: n } = e.getBoundingClientRect(), r = window.innerWidth, i = window.innerHeight, a = this._x, o = this._y;
171
- a + t > r && (a = r - t - 8), o + n > i && (o = i - n - 8), a < 0 && (a = 8), o < 0 && (o = 8), this._applyMenuPosition(e, a, o);
213
+ _safeAreaBottom() {
214
+ let e = Number.parseFloat(getComputedStyle(this).getPropertyValue("--wui-context-menu-safe-area-bottom"));
215
+ return Number.isFinite(e) ? e : 0;
172
216
  }
173
217
  _applyMenuPosition(e, t, n, r, i) {
174
- e.style.left = `${t}px`, e.style.top = `${n}px`;
175
- let a = r ?? (t < this._x ? "right" : "left"), o = i ?? (n < this._y ? "bottom" : "top");
176
- e.style.setProperty("--wui-internal-overlay-transform-origin", `${o} ${a}`), e.style.visibility = "";
218
+ e.style.left = `${t}px`, e.style.top = `${n}px`, e.style.setProperty("--wui-internal-overlay-transform-origin", `${i} ${r}`), e.style.visibility = "";
177
219
  }
178
- _focusFirstItem() {
179
- let e = this._menu?.content.querySelectorAll("web-ui-dropdown-item:not([disabled])")?.[0];
180
- e && d(e);
220
+ _focusFirstItem(e = 0) {
221
+ let t = this._menu?.content.querySelectorAll("web-ui-dropdown-item:not([disabled])")?.[0];
222
+ t && (h(t, { suppressFocusVisible: this._suppressInitialFocusVisible }), !(e + 1 >= G) && (m([this._menu?.panel]) || requestAnimationFrame(() => {
223
+ this._isOpen && this._menu && this._focusFirstItem(e + 1);
224
+ })));
181
225
  }
182
226
  _setupMenuItems() {
183
227
  let e = this._menu;
184
228
  if (!e) return;
185
229
  let t = e.content;
186
- _(this, t, this._menuItemAnchors, P), this._hideMenuItems(), m(t, "context-menu-hidden");
187
- let n = u(t, P);
188
- g(this, t, this._menuItemAnchors, P), v(t, n);
230
+ x(this, t, this._menuItemAnchors, z), this._hideMenuItems(), v(t, "context-menu-hidden");
231
+ let n = p(t, z);
232
+ b(this, t, this._menuItemAnchors, z), S(t, n);
189
233
  }
190
234
  _returnItemsToSlot() {
191
235
  let e = this._menu;
192
- e && (this._closeSubmenusFrom(0, !0), this._closingSubmenus.restoreAll(), y(this, e.content, this._menuItemAnchors));
236
+ e && (this._closeSubmenusFrom(0, !0), this._closingSubmenus.restoreAll(), C(this, e.content, this._menuItemAnchors));
237
+ }
238
+ _openScrim() {
239
+ let e = document.createElement("dialog");
240
+ e.className = "wui-context-menu-scrim";
241
+ let t = document.createElement("style");
242
+ return t.textContent = j, e.append(t), e.setAttribute(W, ""), e.addEventListener("click", this._onScrimClick), e.addEventListener("cancel", this._onScrimCancel), this._scrimParent().append(e), e.showModal(), this._scrim = e, e;
243
+ }
244
+ _scrimParent() {
245
+ return u(this)?.getOverlayRoot() ?? document.body;
246
+ }
247
+ _closeScrim() {
248
+ let e = this._scrim;
249
+ e && (this._scrim = void 0, e.open && e.close(), e.remove());
250
+ }
251
+ _releaseScrimModality() {
252
+ let e = this._scrim;
253
+ e?.open && e.close();
193
254
  }
194
255
  async _closeMenuAfterPresence() {
195
256
  let e = this._menu;
196
- (!e || await a(e.panel)) && !this._isOpen && this.isConnected && this._menu === e && (this._returnItemsToSlot(), e?.panel.remove(), this._menu = void 0, this._restoreFocusTarget?.focus(), this._restoreFocusTarget = void 0);
257
+ (!e || await s(e.panel)) && !this._isOpen && this.isConnected && this._menu === e && (this._closeScrim(), this._returnItemsToSlot(), e?.panel.remove(), this._menu = void 0);
197
258
  }
198
259
  _hideMenuItems() {
199
- f(this).forEach((e) => e.setAttribute("slot", "context-menu-hidden")), m(this, "context-menu-hidden");
260
+ g(this).forEach((e) => e.setAttribute("slot", "context-menu-hidden")), v(this, "context-menu-hidden");
200
261
  }
201
262
  _openSubmenu(e, t = !1) {
202
263
  if (!this._isOpen || !e.hasAttribute("submenu") || e.hasAttribute("disabled")) return;
@@ -205,12 +266,12 @@ var P = "wui-context-menu-item", F = class extends O {
205
266
  this._closeSubmenusFrom(n);
206
267
  let r = this._closingSubmenus.take(e);
207
268
  if (r) {
208
- this._activeSubmenus[n] = r, this._activeSubmenuItems[n] = e, this._menuHandle && this._submenuHandles.set(r.panel, this._menuHandle.adopt(r.panel)), e.setAttribute("active", ""), this._positionSubmenu(e, r), o(r.panel, { isInstant: t }), this._hoverBinder.bind();
269
+ this._activeSubmenus[n] = r, this._activeSubmenuItems[n] = e, this._menuHandle && this._submenuHandles.set(r.panel, this._menuHandle.adopt(r.panel)), e.setAttribute("active", ""), this._positionSubmenu(e, r), c(r.panel, { isInstant: t }), this._hoverBinder.bind();
209
270
  return;
210
271
  }
211
- if (f(e).length === 0) return;
212
- let i = E("context-submenu", this);
213
- i.panel.dataset.level = String(n), i.panel.setAttribute("role", "menu"), i.panel.setAttribute("aria-label", "子菜单"), i.panel.style.visibility = "hidden", i.panel.addEventListener("click", this._onMenuClick), h(e, i.content), this._activeSubmenus[n] = i, this._activeSubmenuItems[n] = e, this._menuHandle && this._submenuHandles.set(i.panel, this._menuHandle.adopt(i.panel)), e.setAttribute("active", ""), this._positionSubmenu(e, i), o(i.panel, { isInstant: t }), this._hoverBinder.bind();
272
+ if (g(e).length === 0) return;
273
+ let i = A("context-submenu", this, this._scrim);
274
+ i.panel.dataset.level = String(n), i.panel.setAttribute("role", "menu"), i.panel.setAttribute("aria-label", "子菜单"), i.panel.style.visibility = "hidden", i.panel.addEventListener("click", this._onMenuClick), y(e, i.content), this._activeSubmenus[n] = i, this._activeSubmenuItems[n] = e, this._menuHandle && this._submenuHandles.set(i.panel, this._menuHandle.adopt(i.panel)), e.setAttribute("active", ""), this._positionSubmenu(e, i), c(i.panel, { isInstant: t }), this._hoverBinder.bind();
214
275
  }
215
276
  _closeSubmenusFrom(e, t = !1) {
216
277
  for (let n = this._activeSubmenus.length - 1; n >= e; n--) {
@@ -220,7 +281,7 @@ var P = "wui-context-menu-item", F = class extends O {
220
281
  this._activeSubmenus.length = e, this._activeSubmenuItems.length = e;
221
282
  }
222
283
  _restoreSubmenuItems(e, t) {
223
- t && (h(e.content, t), m(t, "context-menu-hidden"));
284
+ t && (y(e.content, t), v(t, "context-menu-hidden"));
224
285
  }
225
286
  _getItemLevel(e) {
226
287
  if (this._menu?.panel.contains(e)) return 0;
@@ -229,38 +290,45 @@ var P = "wui-context-menu-item", F = class extends O {
229
290
  }
230
291
  _positionSubmenu(e, t) {
231
292
  if (t.panel.parentElement instanceof HTMLDialogElement && t.panel.parentElement.open) {
232
- let i = e.getBoundingClientRect().right + t.panel.getBoundingClientRect().width + 8 <= window.innerWidth, a = (this._submenuPositionEpochs.get(t.panel) ?? 0) + 1;
233
- this._submenuPositionEpochs.set(t.panel, a), n(e, t.panel, {
293
+ let n = e.getBoundingClientRect().right + t.panel.getBoundingClientRect().width + 8 <= window.innerWidth, i = (this._submenuPositionEpochs.get(t.panel) ?? 0) + 1;
294
+ this._submenuPositionEpochs.set(t.panel, i), r(e, t.panel, {
234
295
  strategy: "fixed",
235
- placement: i ? "right-start" : "left-start",
236
- middleware: [r({
296
+ placement: n ? "right-start" : "left-start",
297
+ middleware: [a({
237
298
  padding: 8,
238
299
  crossAxis: !0
239
300
  })]
240
301
  }).then(({ x: e, y: n, middlewareData: r }) => {
241
- if (!this._activeSubmenus.includes(t) || a !== this._submenuPositionEpochs.get(t.panel)) return;
242
- let i = r.shift?.x ?? 0, o = r.shift?.y ?? 0, s = i < 0 ? "right" : "left", c = o < 0 ? "bottom" : "top";
302
+ if (!this._activeSubmenus.includes(t) || i !== this._submenuPositionEpochs.get(t.panel)) return;
303
+ let a = r.shift?.x ?? 0, o = r.shift?.y ?? 0, s = a < 0 ? "right" : "left", c = o < 0 ? "bottom" : "top";
243
304
  t.panel.style.left = `${e}px`, t.panel.style.top = `${n}px`, t.panel.style.setProperty("--wui-internal-overlay-transform-origin", `${c} ${s}`), t.panel.style.visibility = "";
244
305
  });
245
306
  return;
246
307
  }
247
- let i = e.getBoundingClientRect(), a = t.panel.getBoundingClientRect(), o = i.right + a.width + 8 <= window.innerWidth, s = o ? i.right : Math.max(8, i.left - a.width), c = Math.min(Math.max(8, i.top), window.innerHeight - a.height - 8);
308
+ let n = e.getBoundingClientRect(), i = t.panel.getBoundingClientRect(), o = n.right + i.width + 8 <= window.innerWidth, s = o ? n.right : Math.max(8, n.left - i.width), c = Math.min(Math.max(8, n.top), window.innerHeight - i.height - 8);
248
309
  t.panel.style.left = `${s}px`, t.panel.style.top = `${c}px`, t.panel.style.setProperty("--wui-internal-overlay-transform-origin", o ? "top left" : "top right"), t.panel.style.visibility = "";
249
310
  }
250
311
  _dispatchChange(e) {
251
- t(this, e);
312
+ n(this, e);
313
+ }
314
+ _cancelLongPress() {
315
+ this._longPressTimer !== void 0 && (clearTimeout(this._longPressTimer), this._longPressTimer = void 0), this._longPressOrigin = void 0;
316
+ }
317
+ _isLongPressFollowUp() {
318
+ let e = this._longPressOpenedAt;
319
+ return e === null ? !1 : performance.now() - e > U ? (this._longPressOpenedAt = null, !1) : !0;
252
320
  }
253
321
  _getLevelContainer(e) {
254
322
  return e === 0 ? this._menu : this._activeSubmenus[e - 1];
255
323
  }
256
324
  _getLevelItems(e) {
257
325
  let t = this._getLevelContainer(e);
258
- return t ? f(t.content) : [];
326
+ return t ? g(t.content) : [];
259
327
  }
260
328
  _closeLastSubmenuOrMenu() {
261
329
  if (this._activeSubmenus.length > 0) {
262
330
  let e = this._activeSubmenus.length - 1, t = this._activeSubmenuItems[e];
263
- this._closeSubmenusFrom(e), d(t), this._hoverBinder.bind();
331
+ this._closeSubmenusFrom(e), h(t), this._hoverBinder.bind();
264
332
  } else this._closeFromUser();
265
333
  }
266
334
  _preventBackgroundScroll(e) {
@@ -276,7 +344,7 @@ var P = "wui-context-menu-item", F = class extends O {
276
344
  return this._menuHandle?.containsEvent(e) ?? !1;
277
345
  }
278
346
  render() {
279
- return k`
347
+ return P`
280
348
  <div class="context-menu-anchor">
281
349
  <slot @slotchange=${this._onSlotChange}></slot>
282
350
  </div>
@@ -286,15 +354,22 @@ var P = "wui-context-menu-item", F = class extends O {
286
354
  this._hideMenuItems(), this._isOpen && this._scheduleRefresh();
287
355
  }
288
356
  };
289
- e([M({
357
+ e([L({
290
358
  type: Boolean,
291
359
  reflect: !0
292
- })], F.prototype, "disabled", void 0), e([M({
360
+ })], q.prototype, "disabled", void 0), e([L({
293
361
  type: Boolean,
294
362
  reflect: !0,
295
363
  attribute: "no-scroll-lock"
296
- })], F.prototype, "noScrollLock", void 0), e([N()], F.prototype, "_isOpen", void 0), e([N()], F.prototype, "_x", void 0), e([N()], F.prototype, "_y", void 0), F = e([j("web-ui-context-menu")], F);
364
+ })], q.prototype, "noScrollLock", void 0), e([L({
365
+ type: Boolean,
366
+ reflect: !0,
367
+ attribute: "long-press"
368
+ })], q.prototype, "longPress", void 0), e([L({
369
+ type: Number,
370
+ attribute: "long-press-delay"
371
+ })], q.prototype, "longPressDelay", null), e([R()], q.prototype, "_isOpen", void 0), e([R()], q.prototype, "_x", void 0), e([R()], q.prototype, "_y", void 0), q = e([I("web-ui-context-menu")], q);
297
372
  //#endregion
298
- export { F as WebUiContextMenu };
373
+ export { q as WebUiContextMenu };
299
374
 
300
375
  //# sourceMappingURL=index.js.map