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