@gx-design-vue/pro-layout 0.1.0-alpha.2 → 0.1.0-alpha.21

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 (272) hide show
  1. package/dist/ProLayout.d.ts +4 -536
  2. package/dist/ProLayout.js +489 -358
  3. package/dist/components/AppPage/context.d.ts +4 -3
  4. package/dist/components/AppPage/context.js +3 -5
  5. package/dist/components/AppPage/index.d.ts +29 -52
  6. package/dist/components/AppPage/index.js +71 -54
  7. package/dist/components/AppPage/style.d.ts +8 -7
  8. package/dist/components/AppPage/style.js +16 -17
  9. package/dist/components/Breadcrumb/index.d.ts +19 -0
  10. package/dist/components/Breadcrumb/index.js +129 -0
  11. package/dist/components/Breadcrumb/interface.d.ts +33 -0
  12. package/dist/components/Breadcrumb/interface.js +1 -0
  13. package/dist/components/CollapseButton/Arrow.d.ts +4 -0
  14. package/dist/components/{SiderMenu → CollapseButton}/Arrow.js +2 -4
  15. package/dist/components/CollapseButton/index.d.ts +7 -0
  16. package/dist/components/CollapseButton/index.js +45 -0
  17. package/dist/components/CollapseButton/interface.d.ts +19 -0
  18. package/dist/components/CollapseButton/interface.js +1 -0
  19. package/dist/components/Footer/index.d.ts +10 -0
  20. package/dist/components/Footer/index.js +69 -0
  21. package/dist/components/Footer/interface.d.ts +22 -0
  22. package/dist/components/Footer/interface.js +1 -0
  23. package/dist/components/FooterToolbar/index.d.ts +5 -72
  24. package/dist/components/FooterToolbar/index.js +77 -90
  25. package/dist/components/FooterToolbar/style.d.ts +10 -0
  26. package/dist/components/FooterToolbar/style.js +34 -0
  27. package/dist/components/Header/index.d.ts +7 -0
  28. package/dist/components/Header/index.js +140 -0
  29. package/dist/components/Header/interface.d.ts +41 -0
  30. package/dist/components/Header/interface.js +1 -0
  31. package/dist/components/Logo/index.d.ts +9 -0
  32. package/dist/components/Logo/index.js +63 -0
  33. package/dist/components/Logo/interface.d.ts +13 -0
  34. package/dist/components/Logo/interface.js +1 -0
  35. package/dist/components/Menu/iconRender.d.ts +10 -0
  36. package/dist/components/Menu/iconRender.js +23 -0
  37. package/dist/components/Menu/index.d.ts +13 -0
  38. package/dist/components/Menu/index.js +778 -0
  39. package/dist/components/Menu/interface.d.ts +50 -0
  40. package/dist/components/Menu/interface.js +9 -0
  41. package/dist/components/Menu/overflow.d.ts +39 -0
  42. package/dist/components/Menu/overflow.js +81 -0
  43. package/dist/components/Menu/style/base.d.ts +12 -0
  44. package/dist/components/Menu/style/base.js +36 -0
  45. package/dist/components/Menu/style/horizontal.d.ts +19 -0
  46. package/dist/components/Menu/style/horizontal.js +303 -0
  47. package/dist/components/Menu/style/index.d.ts +356 -0
  48. package/dist/components/Menu/style/index.js +147 -0
  49. package/dist/components/Menu/style/inline.d.ts +13 -0
  50. package/dist/components/Menu/style/inline.js +292 -0
  51. package/dist/components/PageContainer/PageHeader.d.ts +30 -36
  52. package/dist/components/PageContainer/PageHeader.js +80 -46
  53. package/dist/components/PageContainer/index.d.ts +8 -194
  54. package/dist/components/PageContainer/index.js +297 -209
  55. package/dist/components/PageContainer/style.d.ts +5 -0
  56. package/dist/components/PageContainer/style.js +142 -0
  57. package/dist/components/PageTransition/animate.d.ts +41 -0
  58. package/dist/components/PageTransition/animate.js +106 -0
  59. package/dist/components/PageTransition/index.d.ts +57 -0
  60. package/dist/components/PageTransition/index.js +66 -0
  61. package/dist/components/{PageTranstion → PageTransition}/keyFrame/back.d.ts +4 -4
  62. package/dist/components/{PageTranstion → PageTransition}/keyFrame/back.js +2 -4
  63. package/dist/components/{PageTranstion → PageTransition}/keyFrame/bounce.d.ts +4 -4
  64. package/dist/components/{PageTranstion → PageTransition}/keyFrame/bounce.js +2 -4
  65. package/dist/components/{PageTranstion → PageTransition}/keyFrame/fade.d.ts +4 -4
  66. package/dist/components/{PageTranstion → PageTransition}/keyFrame/fade.js +2 -4
  67. package/dist/components/{PageTranstion → PageTransition}/keyFrame/flip.d.ts +4 -4
  68. package/dist/components/{PageTranstion → PageTransition}/keyFrame/flip.js +2 -4
  69. package/dist/components/{PageTranstion → PageTransition}/keyFrame/lightSpeed.d.ts +4 -4
  70. package/dist/components/{PageTranstion → PageTransition}/keyFrame/lightSpeed.js +2 -4
  71. package/dist/components/PageTransition/keyFrame/roll.d.ts +10 -0
  72. package/dist/components/{PageTranstion → PageTransition}/keyFrame/roll.js +2 -4
  73. package/dist/components/{PageTranstion → PageTransition}/keyFrame/rotate.d.ts +4 -4
  74. package/dist/components/{PageTranstion → PageTransition}/keyFrame/rotate.js +2 -4
  75. package/dist/components/{PageTranstion → PageTransition}/keyFrame/slide.d.ts +4 -4
  76. package/dist/components/{PageTranstion → PageTransition}/keyFrame/slide.js +2 -4
  77. package/dist/components/{PageTranstion → PageTransition}/keyFrame/zoom.d.ts +4 -4
  78. package/dist/components/{PageTranstion → PageTransition}/keyFrame/zoom.js +2 -4
  79. package/dist/components/PageTransition/style.d.ts +11 -0
  80. package/dist/components/{PageTranstion → PageTransition}/style.js +9 -13
  81. package/dist/components/Sider/index.d.ts +7 -0
  82. package/dist/components/Sider/index.js +206 -0
  83. package/dist/components/Sider/interface.d.ts +39 -0
  84. package/dist/components/Sider/interface.js +1 -0
  85. package/dist/components/Tabs/InnerTabs.d.ts +7 -0
  86. package/dist/components/Tabs/InnerTabs.js +117 -0
  87. package/dist/components/Tabs/contextMenu.d.ts +41 -0
  88. package/dist/components/Tabs/contextMenu.js +89 -0
  89. package/dist/components/Tabs/hooks/flipAnimate.d.ts +24 -0
  90. package/dist/components/Tabs/hooks/flipAnimate.js +40 -0
  91. package/dist/components/Tabs/hooks/useAutoScroll.d.ts +27 -0
  92. package/dist/components/Tabs/hooks/useAutoScroll.js +122 -0
  93. package/dist/components/Tabs/hooks/useTabDrag.d.ts +31 -0
  94. package/dist/components/Tabs/hooks/useTabDrag.js +252 -0
  95. package/dist/components/Tabs/index.d.ts +13 -0
  96. package/dist/components/Tabs/index.js +181 -0
  97. package/dist/components/Tabs/interface.d.ts +74 -0
  98. package/dist/components/Tabs/interface.js +1 -0
  99. package/dist/components/Tabs/style/index.d.ts +35 -0
  100. package/dist/components/Tabs/style/index.js +161 -0
  101. package/dist/components/WrapContent/index.d.ts +9 -0
  102. package/dist/components/WrapContent/index.js +26 -0
  103. package/dist/components/WrapContent/interface.d.ts +15 -0
  104. package/dist/components/WrapContent/interface.js +1 -0
  105. package/dist/context/index.d.ts +53 -0
  106. package/dist/context/index.js +5 -0
  107. package/dist/defaultConfig.d.ts +10 -0
  108. package/dist/defaultConfig.js +38 -0
  109. package/dist/hooks/useLayoutBase.d.ts +78 -0
  110. package/dist/hooks/useLayoutBase.js +86 -0
  111. package/dist/hooks/useMenu.d.ts +77 -0
  112. package/dist/hooks/useMenu.js +166 -0
  113. package/dist/hooks/useTabs.d.ts +54 -0
  114. package/dist/hooks/useTabs.js +388 -0
  115. package/dist/index.d.ts +22 -27
  116. package/dist/index.js +15 -24
  117. package/dist/interface.d.ts +516 -0
  118. package/dist/interface.js +34 -0
  119. package/dist/pro-layout.esm.js +5848 -5075
  120. package/dist/pro-layout.js +16 -37
  121. package/dist/style/breadcrumb.d.ts +8 -0
  122. package/dist/style/breadcrumb.js +77 -0
  123. package/dist/style/collapseButton.d.ts +8 -0
  124. package/dist/style/collapseButton.js +57 -0
  125. package/dist/style/content.d.ts +8 -0
  126. package/dist/style/content.js +29 -0
  127. package/dist/style/footer.d.ts +8 -0
  128. package/dist/style/footer.js +33 -0
  129. package/dist/style/header.d.ts +8 -0
  130. package/dist/style/header.js +76 -0
  131. package/dist/style/index.d.ts +3 -22
  132. package/dist/style/index.js +51 -55
  133. package/dist/style/logo.d.ts +8 -0
  134. package/dist/style/logo.js +76 -0
  135. package/dist/style/menu.d.ts +15 -0
  136. package/dist/style/menu.js +49 -0
  137. package/dist/style/rightContent.d.ts +12 -0
  138. package/dist/style/rightContent.js +74 -0
  139. package/dist/style/search.d.ts +12 -0
  140. package/dist/style/search.js +94 -0
  141. package/dist/style/sider.d.ts +8 -0
  142. package/dist/style/sider.js +92 -0
  143. package/dist/style/tabs.d.ts +14 -0
  144. package/dist/style/tabs.js +97 -0
  145. package/dist/theme/augment.d.ts +20 -0
  146. package/dist/theme/augment.js +1 -0
  147. package/dist/theme/interface/components.d.ts +20 -0
  148. package/dist/theme/interface/components.js +1 -0
  149. package/dist/utils/config.d.ts +12 -0
  150. package/dist/utils/config.js +18 -0
  151. package/dist/utils/menu.d.ts +111 -20
  152. package/dist/utils/menu.js +263 -118
  153. package/dist/utils/style.d.ts +4 -0
  154. package/dist/utils/style.js +21 -0
  155. package/dist/utils/themeComponents.d.ts +28 -0
  156. package/dist/utils/themeComponents.js +89 -0
  157. package/package.json +24 -15
  158. package/dist/Context/expose.d.ts +0 -6
  159. package/dist/Context/expose.js +0 -7
  160. package/dist/Context/index.d.ts +0 -43
  161. package/dist/Context/index.js +0 -18
  162. package/dist/WrapContent.d.ts +0 -100
  163. package/dist/WrapContent.js +0 -45
  164. package/dist/components/BaseMenu/index.d.ts +0 -255
  165. package/dist/components/BaseMenu/index.js +0 -381
  166. package/dist/components/BaseMenu/props.d.ts +0 -105
  167. package/dist/components/BaseMenu/props.js +0 -94
  168. package/dist/components/BaseMenu/style.d.ts +0 -6
  169. package/dist/components/BaseMenu/style.js +0 -155
  170. package/dist/components/BreadCrumb/Breadcrumb.d.ts +0 -33
  171. package/dist/components/BreadCrumb/Breadcrumb.js +0 -75
  172. package/dist/components/BreadCrumb/index.d.ts +0 -7
  173. package/dist/components/BreadCrumb/index.js +0 -44
  174. package/dist/components/BreadCrumb/style.d.ts +0 -8
  175. package/dist/components/BreadCrumb/style.js +0 -87
  176. package/dist/components/CollapsedIcon/index.d.ts +0 -33
  177. package/dist/components/CollapsedIcon/index.js +0 -51
  178. package/dist/components/CollapsedIcon/style.d.ts +0 -9
  179. package/dist/components/CollapsedIcon/style.js +0 -34
  180. package/dist/components/FooterToolbar/props.d.ts +0 -47
  181. package/dist/components/FooterToolbar/props.js +0 -33
  182. package/dist/components/FooterToolbar/style/index.d.ts +0 -14
  183. package/dist/components/FooterToolbar/style/index.js +0 -48
  184. package/dist/components/FooterToolbar/style/stylish.d.ts +0 -18
  185. package/dist/components/FooterToolbar/style/stylish.js +0 -16
  186. package/dist/components/GlobalFooter/index.d.ts +0 -73
  187. package/dist/components/GlobalFooter/index.js +0 -77
  188. package/dist/components/GlobalFooter/style.d.ts +0 -6
  189. package/dist/components/GlobalFooter/style.js +0 -29
  190. package/dist/components/GlobalHeader/DefaultHeader.d.ts +0 -164
  191. package/dist/components/GlobalHeader/DefaultHeader.js +0 -149
  192. package/dist/components/GlobalHeader/index.d.ts +0 -164
  193. package/dist/components/GlobalHeader/index.js +0 -78
  194. package/dist/components/GlobalHeader/props.d.ts +0 -70
  195. package/dist/components/GlobalHeader/props.js +0 -56
  196. package/dist/components/GlobalHeader/style/defaultHeader.d.ts +0 -6
  197. package/dist/components/GlobalHeader/style/defaultHeader.js +0 -108
  198. package/dist/components/GlobalHeader/style/header.d.ts +0 -6
  199. package/dist/components/GlobalHeader/style/header.js +0 -41
  200. package/dist/components/LogoContent/index.d.ts +0 -80
  201. package/dist/components/LogoContent/index.js +0 -90
  202. package/dist/components/LogoContent/props.d.ts +0 -57
  203. package/dist/components/LogoContent/props.js +0 -37
  204. package/dist/components/LogoContent/style.d.ts +0 -6
  205. package/dist/components/LogoContent/style.js +0 -63
  206. package/dist/components/PageContainer/props.d.ts +0 -138
  207. package/dist/components/PageContainer/props.js +0 -103
  208. package/dist/components/PageContainer/style/index.d.ts +0 -14
  209. package/dist/components/PageContainer/style/index.js +0 -52
  210. package/dist/components/PageContainer/style/pageHeader.d.ts +0 -6
  211. package/dist/components/PageContainer/style/pageHeader.js +0 -44
  212. package/dist/components/PageTranstion/index.d.ts +0 -40
  213. package/dist/components/PageTranstion/index.js +0 -71
  214. package/dist/components/PageTranstion/keyFrame/roll.d.ts +0 -10
  215. package/dist/components/PageTranstion/style.d.ts +0 -10
  216. package/dist/components/SiderMenu/Arrow.d.ts +0 -6
  217. package/dist/components/SiderMenu/SiderMenu.d.ts +0 -180
  218. package/dist/components/SiderMenu/SiderMenu.js +0 -265
  219. package/dist/components/SiderMenu/index.d.ts +0 -193
  220. package/dist/components/SiderMenu/index.js +0 -51
  221. package/dist/components/SiderMenu/props.d.ts +0 -77
  222. package/dist/components/SiderMenu/props.js +0 -67
  223. package/dist/components/SiderMenu/style/index.d.ts +0 -12
  224. package/dist/components/SiderMenu/style/index.js +0 -162
  225. package/dist/components/SiderMenu/typings.d.ts +0 -38
  226. package/dist/components/SiderMenu/typings.js +0 -1
  227. package/dist/components/TabsRoute/index.d.ts +0 -95
  228. package/dist/components/TabsRoute/index.js +0 -405
  229. package/dist/components/TabsRoute/props.d.ts +0 -78
  230. package/dist/components/TabsRoute/props.js +0 -47
  231. package/dist/components/TabsRoute/style.d.ts +0 -15
  232. package/dist/components/TabsRoute/style.js +0 -133
  233. package/dist/components/TabsRoute/utils/config.d.ts +0 -18
  234. package/dist/components/TabsRoute/utils/config.js +0 -64
  235. package/dist/config/animate.d.ts +0 -11
  236. package/dist/config/animate.js +0 -76
  237. package/dist/config/index.d.ts +0 -34
  238. package/dist/config/index.js +0 -30
  239. package/dist/hooks/collapsed/index.d.ts +0 -15
  240. package/dist/hooks/collapsed/index.js +0 -50
  241. package/dist/hooks/layout/useLayoutExpose.d.ts +0 -15
  242. package/dist/hooks/layout/useLayoutExpose.js +0 -22
  243. package/dist/hooks/layout/usePageContent.d.ts +0 -6
  244. package/dist/hooks/layout/usePageContent.js +0 -28
  245. package/dist/hooks/menu/context.d.ts +0 -21
  246. package/dist/hooks/menu/context.js +0 -7
  247. package/dist/hooks/menu/index.d.ts +0 -29
  248. package/dist/hooks/menu/index.js +0 -118
  249. package/dist/hooks/theme/index.d.ts +0 -11
  250. package/dist/hooks/theme/index.js +0 -13
  251. package/dist/props/collapsedProps.d.ts +0 -39
  252. package/dist/props/collapsedProps.js +0 -45
  253. package/dist/props/defaultSettings.d.ts +0 -62
  254. package/dist/props/defaultSettings.js +0 -56
  255. package/dist/props/index.d.ts +0 -226
  256. package/dist/props/index.js +0 -109
  257. package/dist/props/themeProps.d.ts +0 -14
  258. package/dist/props/themeProps.js +0 -10
  259. package/dist/types/Breadcrumb.d.ts +0 -22
  260. package/dist/types/Breadcrumb.js +0 -1
  261. package/dist/types/MenuTypings.d.ts +0 -46
  262. package/dist/types/MenuTypings.js +0 -1
  263. package/dist/types/RouteTypings.d.ts +0 -96
  264. package/dist/types/RouteTypings.js +0 -1
  265. package/dist/types/SlotsTypings.d.ts +0 -124
  266. package/dist/types/SlotsTypings.js +0 -32
  267. package/dist/types/typings.d.ts +0 -73
  268. package/dist/types/typings.js +0 -3
  269. package/dist/utils/index.d.ts +0 -7
  270. package/dist/utils/index.js +0 -17
  271. package/dist/utils/style/index.d.ts +0 -44
  272. package/dist/utils/style/index.js +0 -103
@@ -0,0 +1,778 @@
1
+ import { useLayoutBase } from "../../hooks/useLayoutBase.js";
2
+ import { renderMenuIcon } from "./iconRender.js";
3
+ import { buildHeaderProMenuTokens, buildSiderProMenuTokens } from "../../utils/themeComponents.js";
4
+ import { PRO_MENU_SLOT_KEYS } from "./interface.js";
5
+ import { useMenuOverflow } from "./overflow.js";
6
+ import style_default from "./style/index.js";
7
+ import { Transition, computed, createTextVNode, createVNode, defineComponent, isVNode, mergeProps, nextTick, onBeforeUnmount, ref, vShow, watch, withDirectives } from "vue";
8
+ import { useProToken } from "@gx-design-vue/pro-provider";
9
+ import { classNames, getSlotsProps } from "@gx-design-vue/pro-utils";
10
+ import { ConfigProvider, Popover, Tooltip } from "antdv-next";
11
+ import { useBaseConfig } from "antdv-next/config-provider/context";
12
+ import useCSSVarCls from "antdv-next/config-provider/hooks/useCSSVarCls";
13
+ import { omit } from "es-toolkit";
14
+ //#region src/components/Menu/index.tsx
15
+ function _isSlot(s) {
16
+ return typeof s === "function" || Object.prototype.toString.call(s) === "[object Object]" && !isVNode(s);
17
+ }
18
+ const DEFAULT_INLINE_INDENT = 24;
19
+ const POPUP_CLOSE_DELAY = 120;
20
+ /** horizontal 模式溢出「...」submenu 的合成 key */
21
+ const OVERFLOW_MENU_KEY = "__overflow__";
22
+ /** horizontal 模式溢出隐藏态:脱离文档流(不挤占可见项)但保留 offsetWidth 可测(参考 @v-c/overflow Item) */
23
+ const OVERFLOW_HIDDEN_STYLE = {
24
+ opacity: 0,
25
+ position: "absolute",
26
+ height: 0,
27
+ overflow: "hidden",
28
+ pointerEvents: "none"
29
+ };
30
+ const SIDER_POPUP_BUILTIN_PLACEMENTS = { rightTop: {
31
+ points: ["tl", "tr"],
32
+ offset: [0, 0],
33
+ overflow: {
34
+ adjustX: true,
35
+ adjustY: true
36
+ },
37
+ autoArrow: false
38
+ } };
39
+ const SIDER_NESTED_POPUP_BUILTIN_PLACEMENTS = { rightTop: {
40
+ points: ["tl", "tr"],
41
+ offset: [-4, 0],
42
+ overflow: {
43
+ adjustX: true,
44
+ adjustY: true
45
+ },
46
+ autoArrow: false
47
+ } };
48
+ /** horizontal 模式一级子菜单向下展开(bottomLeft),参考 vue-components placements.ts */
49
+ const HEADER_POPUP_BUILTIN_PLACEMENTS = { bottomLeft: {
50
+ points: ["tl", "bl"],
51
+ offset: [0, 0],
52
+ overflow: {
53
+ adjustX: true,
54
+ adjustY: true
55
+ },
56
+ autoArrow: false
57
+ } };
58
+ let hasProMenuInitialAutoScrolled = false;
59
+ function isPathPrefix(prefix, path) {
60
+ return prefix.length <= path.length && prefix.every((key, index) => key === path[index]);
61
+ }
62
+ function isSamePath(path, target) {
63
+ return path.length === target.length && isPathPrefix(path, target);
64
+ }
65
+ function getPathKey(path) {
66
+ return path.join("\0");
67
+ }
68
+ function getMenuTitleSymbol(title) {
69
+ return title ? title.charAt(0).toUpperCase() : null;
70
+ }
71
+ function getVisibleChildren(route) {
72
+ return route.children?.filter((child) => !child.meta?.hideInMenu) ?? [];
73
+ }
74
+ function hasSelectedDescendant(route, selectedKeys) {
75
+ if (selectedKeys.has(route.name)) return true;
76
+ return getVisibleChildren(route).some((child) => hasSelectedDescendant(child, selectedKeys));
77
+ }
78
+ function toMenuRenderItem(route, type) {
79
+ return {
80
+ key: route.name,
81
+ label: route.meta?.title,
82
+ icon: route.meta?.icon,
83
+ disabled: route.meta?.disabled,
84
+ title: route.meta?.title,
85
+ type,
86
+ route
87
+ };
88
+ }
89
+ function getMenuRenderItemIcon(item, route) {
90
+ return item.icon ?? route.meta?.icon;
91
+ }
92
+ function resetCollapseStyle(el) {
93
+ el.style.maxHeight = "";
94
+ el.style.overflow = el.dataset.oldOverflow ?? "";
95
+ }
96
+ /**
97
+ * Vue 3 <Transition> 在 JSX 中只认 onXxx 前缀的 props。
98
+ * 参考 Vue 源码 getTransitionRawProps —— 只收集 key.startsWith('on') 的函数。
99
+ */
100
+ const collapseTransitionHooks = {
101
+ onBeforeEnter(el) {
102
+ const target = el;
103
+ target.dataset.oldOverflow = target.style.overflow;
104
+ target.style.maxHeight = "0";
105
+ target.style.overflow = "hidden";
106
+ },
107
+ onEnter(el) {
108
+ const target = el;
109
+ requestAnimationFrame(() => {
110
+ target.style.maxHeight = target.scrollHeight === 0 ? "0" : `${target.scrollHeight}px`;
111
+ target.style.overflow = "hidden";
112
+ });
113
+ },
114
+ onAfterEnter(el) {
115
+ resetCollapseStyle(el);
116
+ },
117
+ onEnterCancelled(el) {
118
+ resetCollapseStyle(el);
119
+ },
120
+ onBeforeLeave(el) {
121
+ const target = el;
122
+ target.dataset.oldOverflow = target.style.overflow;
123
+ target.style.maxHeight = `${target.scrollHeight}px`;
124
+ target.style.overflow = "hidden";
125
+ },
126
+ onLeave(el) {
127
+ const target = el;
128
+ if (target.scrollHeight !== 0) target.style.maxHeight = "0";
129
+ },
130
+ onAfterLeave(el) {
131
+ resetCollapseStyle(el);
132
+ },
133
+ onLeaveCancelled(el) {
134
+ resetCollapseStyle(el);
135
+ }
136
+ };
137
+ const ProMenuContent = /* @__PURE__ */ defineComponent((props, { emit, slots }) => {
138
+ const { proClasses, proStyles, collapsed } = useLayoutBase(props);
139
+ const { prefixCls } = useBaseConfig("pro-menu", props);
140
+ const rootCls = useCSSVarCls(prefixCls);
141
+ const [hashId, cssVarCls] = style_default(prefixCls, rootCls);
142
+ const { proLayoutToken } = useProToken();
143
+ const mode = computed(() => props.mode ?? (props.placement === "header" ? "horizontal" : "inline"));
144
+ const isHorizontal = computed(() => mode.value === "horizontal");
145
+ const inlineCollapsed = computed(() => !isHorizontal.value && collapsed.value);
146
+ const popupOpenPath = ref([]);
147
+ const menuRef = ref();
148
+ const overflow = useMenuOverflow({
149
+ enabled: isHorizontal,
150
+ totalCount: computed(() => (props.menus ?? []).filter((route) => !route.meta?.hideInMenu).length)
151
+ });
152
+ const hasInitialScrolled = ref(false);
153
+ const popupCloseTimers = /* @__PURE__ */ new Map();
154
+ const pendingPopupCloseKeys = /* @__PURE__ */ new Set();
155
+ let initialScrollFrame;
156
+ const selectedKeySet = computed(() => new Set(props.selectedKeys ?? []));
157
+ const openKeySet = computed(() => new Set(props.openKeys ?? []));
158
+ const customRenders = computed(() => getSlotsProps({
159
+ slots,
160
+ props,
161
+ keys: PRO_MENU_SLOT_KEYS,
162
+ render: false
163
+ }));
164
+ const menuClassNames = computed(() => classNames(`${prefixCls.value}`, `${prefixCls.value}-root`, proClasses.value.menu, hashId.value, cssVarCls.value, rootCls.value, {
165
+ [`${prefixCls.value}-collapsed`]: inlineCollapsed.value,
166
+ [`${prefixCls.value}-inline`]: !isHorizontal.value,
167
+ [`${prefixCls.value}-horizontal`]: isHorizontal.value
168
+ }, props.class));
169
+ const popupClassName = computed(() => classNames(`${prefixCls.value}-popover`, hashId.value, cssVarCls.value, rootCls.value));
170
+ function isPopupInteraction(ctx) {
171
+ return inlineCollapsed.value || ctx.popup;
172
+ }
173
+ function getPopupPath(route, ctx) {
174
+ return ctx.popup ? [...ctx.popupPath, route.name] : [route.name];
175
+ }
176
+ function isPopupPathOpen(path) {
177
+ return isPathPrefix(path, popupOpenPath.value);
178
+ }
179
+ function isSubMenuOpen(route, ctx) {
180
+ if (ctx.popup) return isPopupPathOpen(getPopupPath(route, ctx));
181
+ if (inlineCollapsed.value && ctx.depth === 0) return isPopupPathOpen([route.name]);
182
+ return openKeySet.value.has(route.name);
183
+ }
184
+ function getInlineIndent(route, ctx) {
185
+ return route.meta?.inlineIndent ?? ctx.inlineIndent;
186
+ }
187
+ function getItemStyle(route, ctx) {
188
+ const indent = getInlineIndent(route, ctx);
189
+ return {
190
+ "--pro-menu-level": ctx.depth,
191
+ "--pro-menu-indent": `${indent}px`
192
+ };
193
+ }
194
+ function emitOpenKeys(nextKeys) {
195
+ emit("openChange", nextKeys);
196
+ emit("update:openKeys", nextKeys);
197
+ }
198
+ function cancelPopupClose(path) {
199
+ (path ? Array.from({ length: path.length }, (_, index) => getPathKey(path.slice(0, index + 1))) : Array.from(popupCloseTimers.keys())).forEach((key) => {
200
+ const timer = popupCloseTimers.get(key);
201
+ if (timer !== void 0) {
202
+ clearTimeout(timer);
203
+ popupCloseTimers.delete(key);
204
+ }
205
+ pendingPopupCloseKeys.delete(key);
206
+ });
207
+ }
208
+ function openPopupPath(path) {
209
+ cancelPopupClose(path);
210
+ popupOpenPath.value = path;
211
+ }
212
+ function closePopupPath(path) {
213
+ const key = getPathKey(path);
214
+ pendingPopupCloseKeys.delete(key);
215
+ if (isSamePath(path, popupOpenPath.value)) {
216
+ const nextPath = path.slice(0, -1);
217
+ popupOpenPath.value = nextPath;
218
+ const nextKey = getPathKey(nextPath);
219
+ if (nextPath.length > 0 && pendingPopupCloseKeys.has(nextKey)) closePopupPath(nextPath);
220
+ return;
221
+ }
222
+ if (isPathPrefix(path, popupOpenPath.value)) pendingPopupCloseKeys.add(key);
223
+ }
224
+ function schedulePopupPathClose(path) {
225
+ const key = getPathKey(path);
226
+ cancelPopupClose(path);
227
+ const timer = setTimeout(() => {
228
+ popupCloseTimers.delete(key);
229
+ closePopupPath(path);
230
+ }, POPUP_CLOSE_DELAY);
231
+ popupCloseTimers.set(key, timer);
232
+ }
233
+ function clearPopupPath() {
234
+ cancelPopupClose();
235
+ pendingPopupCloseKeys.clear();
236
+ popupOpenPath.value = [];
237
+ }
238
+ function handleSubMenuClick(route, ctx) {
239
+ if (route.meta?.disabled) return;
240
+ if (isPopupInteraction(ctx)) {
241
+ openPopupPath(getPopupPath(route, ctx));
242
+ return;
243
+ }
244
+ emitOpenKeys(openKeySet.value.has(route.name) ? (props.openKeys ?? []).filter((key) => key !== route.name) : [...props.openKeys ?? [], route.name]);
245
+ }
246
+ function handleItemClick(route, ctx) {
247
+ if (route.meta?.disabled) return;
248
+ const keyPath = [route.name, ...ctx.parentKeys].filter(Boolean);
249
+ const selectedKeys = [route.name];
250
+ emit("select", {
251
+ key: route.name,
252
+ keys: selectedKeys,
253
+ keyPath,
254
+ route
255
+ });
256
+ emit("update:selectedKeys", selectedKeys);
257
+ if (ctx.popup) clearPopupPath();
258
+ }
259
+ function handleKeydown(event, action) {
260
+ if (event.key !== "Enter" && event.key !== " ") return;
261
+ event.preventDefault();
262
+ action();
263
+ }
264
+ function scrollSelectedIntoView() {
265
+ if (hasInitialScrolled.value || hasProMenuInitialAutoScrolled || inlineCollapsed.value) return;
266
+ const menuEl = menuRef.value;
267
+ if (!menuEl) return;
268
+ const scrollContainer = props.getScrollContainer?.() ?? menuEl.closest(`.${prefixCls.value}-container`);
269
+ const selectedItem = menuEl.querySelector(`.${prefixCls.value}-item-selected`);
270
+ if (!scrollContainer || !selectedItem) return;
271
+ hasInitialScrolled.value = true;
272
+ hasProMenuInitialAutoScrolled = true;
273
+ const containerRect = scrollContainer.getBoundingClientRect();
274
+ const selectedRect = selectedItem.getBoundingClientRect();
275
+ if (selectedRect.top >= containerRect.top && selectedRect.bottom <= containerRect.bottom) return;
276
+ const nextTop = selectedRect.top - containerRect.top + scrollContainer.scrollTop - scrollContainer.clientHeight / 2 + selectedItem.offsetHeight / 2;
277
+ scrollContainer.scrollTo({
278
+ top: Math.max(0, nextTop),
279
+ behavior: "auto"
280
+ });
281
+ }
282
+ function scheduleInitialScroll() {
283
+ if (hasInitialScrolled.value || hasProMenuInitialAutoScrolled) return;
284
+ nextTick(() => {
285
+ if (hasInitialScrolled.value || hasProMenuInitialAutoScrolled) return;
286
+ if (initialScrollFrame !== void 0) cancelAnimationFrame(initialScrollFrame);
287
+ initialScrollFrame = requestAnimationFrame(() => {
288
+ initialScrollFrame = void 0;
289
+ scrollSelectedIntoView();
290
+ });
291
+ });
292
+ }
293
+ watch(() => [
294
+ props.menus?.length ?? 0,
295
+ props.selectedKeys?.join("|") ?? "",
296
+ props.openKeys?.join("|") ?? ""
297
+ ], scheduleInitialScroll, {
298
+ immediate: true,
299
+ flush: "post"
300
+ });
301
+ onBeforeUnmount(() => {
302
+ if (initialScrollFrame !== void 0) cancelAnimationFrame(initialScrollFrame);
303
+ cancelPopupClose();
304
+ });
305
+ function renderIcon(route, item, firstLevelCollapsed) {
306
+ if (customRenders.value.menuItemIcon) return customRenders.value.menuItemIcon({
307
+ item,
308
+ route
309
+ });
310
+ const icon = renderMenuIcon(getMenuRenderItemIcon(item, route));
311
+ const iconNode = !icon && firstLevelCollapsed ? getMenuTitleSymbol(route.meta?.title) : icon;
312
+ if (!iconNode) return null;
313
+ return createVNode("span", {
314
+ "class": classNames(`${prefixCls.value}-icon`, route.meta?.classNames?.itemIcon),
315
+ "style": route.meta?.styles?.itemIcon
316
+ }, [iconNode]);
317
+ }
318
+ function renderLabel(route, item) {
319
+ const label = customRenders.value.menuItemLabel ? customRenders.value.menuItemLabel({
320
+ item,
321
+ route
322
+ }) : route.meta?.classNames?.itemTitleText || route.meta?.styles?.itemTitleText ? createVNode("span", {
323
+ "class": route.meta?.classNames?.itemTitleText,
324
+ "style": route.meta?.styles?.itemTitleText
325
+ }, [item.label]) : item.label;
326
+ return createVNode("span", {
327
+ "class": classNames(`${prefixCls.value}-title`, route.meta?.classNames?.itemTitle),
328
+ "style": route.meta?.styles?.itemTitle
329
+ }, [label]);
330
+ }
331
+ function renderExtra(route, item) {
332
+ if (customRenders.value.menuItemExtra) return customRenders.value.menuItemExtra({
333
+ item,
334
+ route
335
+ });
336
+ if (!route.meta?.rightContent) return null;
337
+ const extra = route.meta.rightContent(route.meta);
338
+ if (extra == null || extra === false) return null;
339
+ return createVNode("span", {
340
+ "class": classNames(`${prefixCls.value}-extra`, route.meta.classNames?.itemRight),
341
+ "style": route.meta.styles?.itemRight
342
+ }, [extra]);
343
+ }
344
+ function renderMenuItem(route, ctx) {
345
+ const item = toMenuRenderItem(route, "item");
346
+ const firstLevelCollapsed = inlineCollapsed.value && !ctx.popup && ctx.depth === 0;
347
+ const selected = selectedKeySet.value.has(route.name);
348
+ const disabled = !!route.meta?.disabled;
349
+ const showCollapsedTooltip = firstLevelCollapsed && !!route.meta?.title;
350
+ const itemNode = createVNode("div", {
351
+ "class": classNames(`${prefixCls.value}-item`, route.meta?.classNames?.item, {
352
+ [`${prefixCls.value}-item-selected`]: selected,
353
+ [`${prefixCls.value}-item-disabled`]: disabled,
354
+ [`${prefixCls.value}-item-collapsed`]: firstLevelCollapsed
355
+ }),
356
+ "style": {
357
+ ...getItemStyle(route, ctx),
358
+ ...route.meta?.styles?.item
359
+ },
360
+ "role": "menuitem",
361
+ "tabindex": disabled ? -1 : 0,
362
+ "onClick": () => handleItemClick(route, ctx),
363
+ "onKeydown": (event) => handleKeydown(event, () => handleItemClick(route, ctx))
364
+ }, [
365
+ renderIcon(route, item, firstLevelCollapsed),
366
+ !firstLevelCollapsed && renderLabel(route, item),
367
+ !firstLevelCollapsed && renderExtra(route, item)
368
+ ]);
369
+ return createVNode("li", {
370
+ "key": route.name,
371
+ "class": `${prefixCls.value}-node`,
372
+ "data-overflow-item": ctx.overflowTopLevel ? "" : void 0,
373
+ "style": ctx.overflowHidden ? OVERFLOW_HIDDEN_STYLE : void 0,
374
+ "role": "none"
375
+ }, [showCollapsedTooltip ? createVNode(Tooltip, {
376
+ "title": route.meta?.title,
377
+ "placement": "right",
378
+ "classes": { root: `${prefixCls.value}-inline-collapsed-tooltip` }
379
+ }, _isSlot(itemNode) ? itemNode : { default: () => [itemNode] }) : itemNode]);
380
+ }
381
+ function renderSubMenuTitle(route, ctx, opened, active) {
382
+ const item = toMenuRenderItem(route, "submenu");
383
+ const firstLevelCollapsed = inlineCollapsed.value && !ctx.popup && ctx.depth === 0;
384
+ const disabled = !!route.meta?.disabled;
385
+ return createVNode("div", {
386
+ "class": classNames(`${prefixCls.value}-item`, `${prefixCls.value}-submenu-title`, {
387
+ [`${prefixCls.value}-item-open`]: opened,
388
+ [`${prefixCls.value}-item-active`]: active,
389
+ [`${prefixCls.value}-item-disabled`]: disabled,
390
+ [`${prefixCls.value}-item-collapsed`]: firstLevelCollapsed,
391
+ [`${prefixCls.value}-submenu-title-popup`]: ctx.popup
392
+ }),
393
+ "style": getItemStyle(route, ctx),
394
+ "role": "menuitem",
395
+ "aria-expanded": opened,
396
+ "tabindex": disabled ? -1 : 0,
397
+ "title": firstLevelCollapsed ? route.meta?.title : void 0,
398
+ "onClick": () => handleSubMenuClick(route, ctx),
399
+ "onKeydown": (event) => handleKeydown(event, () => handleSubMenuClick(route, ctx))
400
+ }, [
401
+ renderIcon(route, item, firstLevelCollapsed),
402
+ !firstLevelCollapsed && renderLabel(route, item),
403
+ !firstLevelCollapsed && renderExtra(route, item),
404
+ !firstLevelCollapsed && createVNode("i", { "class": `${prefixCls.value}-arrow` }, null)
405
+ ]);
406
+ }
407
+ function renderSubMenu(route, children, ctx) {
408
+ let _slot;
409
+ const opened = isSubMenuOpen(route, ctx);
410
+ const active = hasSelectedDescendant(route, selectedKeySet.value);
411
+ const disabled = !!route.meta?.disabled;
412
+ const titleNode = renderSubMenuTitle(route, ctx, opened, active);
413
+ const popupPlacement = ctx.horizontal && ctx.depth === 0 && !ctx.popup ? "bottomLeft" : "rightTop";
414
+ const popupBuiltinPlacements = popupPlacement === "bottomLeft" ? HEADER_POPUP_BUILTIN_PLACEMENTS : ctx.popup ? SIDER_NESTED_POPUP_BUILTIN_PLACEMENTS : SIDER_POPUP_BUILTIN_PLACEMENTS;
415
+ const usePopup = ctx.popup || !ctx.popup && ctx.depth === 0 && (inlineCollapsed.value || ctx.horizontal);
416
+ const nextCtx = {
417
+ depth: ctx.depth + 1,
418
+ parentKeys: [route.name, ...ctx.parentKeys],
419
+ popup: ctx.popup,
420
+ popupPath: ctx.popupPath,
421
+ inlineIndent: getInlineIndent(route, ctx),
422
+ horizontal: ctx.horizontal
423
+ };
424
+ if (usePopup) {
425
+ const popupPath = getPopupPath(route, ctx);
426
+ const popoverOpen = isPopupPathOpen(popupPath);
427
+ return createVNode("li", {
428
+ "key": route.name,
429
+ "class": classNames(`${prefixCls.value}-node`, `${prefixCls.value}-submenu`, route.meta?.classNames?.subMenu, {
430
+ [`${prefixCls.value}-submenu-open`]: popoverOpen,
431
+ [`${prefixCls.value}-submenu-active`]: active
432
+ }),
433
+ "data-overflow-item": ctx.overflowTopLevel ? "" : void 0,
434
+ "style": {
435
+ ...ctx.overflowHidden ? OVERFLOW_HIDDEN_STYLE : null,
436
+ ...route.meta?.styles?.subMenu
437
+ },
438
+ "role": "none"
439
+ }, [createVNode(Popover, {
440
+ "trigger": "hover",
441
+ "placement": popupPlacement,
442
+ "builtinPlacements": popupBuiltinPlacements,
443
+ "arrow": false,
444
+ "open": popoverOpen,
445
+ "classes": {
446
+ root: classNames(popupClassName.value, `${prefixCls.value}-submenu-placement-${popupPlacement}`, `${prefixCls.value}-${ctx.horizontal ? "horizontal" : "inline"}-popover`, { [`${prefixCls.value}-submenu-placement-nested`]: ctx.popup }, route.meta?.classNames?.subMenuPopup),
447
+ container: `${prefixCls.value}-popover-container`,
448
+ content: `${prefixCls.value}-popover-content`
449
+ },
450
+ "onOpenChange": (open) => {
451
+ if (disabled) return;
452
+ if (open) openPopupPath(popupPath);
453
+ else schedulePopupPathClose(popupPath);
454
+ }
455
+ }, {
456
+ default: () => [titleNode],
457
+ content: () => createVNode("div", { "class": `${prefixCls.value}-submenu-popup` }, [renderMenuList(children, {
458
+ depth: 0,
459
+ parentKeys: [route.name, ...ctx.parentKeys],
460
+ popup: true,
461
+ popupPath,
462
+ inlineIndent: getInlineIndent(route, ctx),
463
+ horizontal: ctx.horizontal
464
+ })])
465
+ })]);
466
+ }
467
+ return createVNode("li", {
468
+ "key": route.name,
469
+ "class": classNames(`${prefixCls.value}-node`, `${prefixCls.value}-submenu`, route.meta?.classNames?.subMenu, {
470
+ [`${prefixCls.value}-submenu-open`]: opened,
471
+ [`${prefixCls.value}-submenu-active`]: active
472
+ }),
473
+ "style": route.meta?.styles?.subMenu,
474
+ "role": "none"
475
+ }, [titleNode, createVNode(Transition, mergeProps({ "name": `${prefixCls.value}-collapse` }, collapseTransitionHooks), _isSlot(_slot = withDirectives(renderMenuList(children, nextCtx), [[vShow, opened]])) ? _slot : { default: () => [_slot] })]);
476
+ }
477
+ function renderGroup(route, children, ctx) {
478
+ const item = toMenuRenderItem(route, "group");
479
+ return createVNode("li", {
480
+ "key": route.name,
481
+ "class": classNames(`${prefixCls.value}-group`, route.meta?.classNames?.subMenu),
482
+ "style": route.meta?.styles?.subMenu,
483
+ "role": "presentation"
484
+ }, [createVNode("div", {
485
+ "class": `${prefixCls.value}-group-title`,
486
+ "style": getItemStyle(route, ctx)
487
+ }, [renderLabel(route, item)]), renderMenuList(children, {
488
+ depth: ctx.depth + 1,
489
+ parentKeys: [route.name, ...ctx.parentKeys],
490
+ popup: ctx.popup,
491
+ popupPath: ctx.popupPath,
492
+ inlineIndent: getInlineIndent(route, ctx),
493
+ horizontal: ctx.horizontal
494
+ })]);
495
+ }
496
+ function renderRoute(route, ctx) {
497
+ if (route.meta?.hideInMenu) return null;
498
+ const children = getVisibleChildren(route);
499
+ const divider = route.meta?.divider ? createVNode("li", {
500
+ "key": `${route.name}-divider`,
501
+ "class": `${prefixCls.value}-divider`,
502
+ "role": "separator"
503
+ }, null) : null;
504
+ const node = children.length > 0 ? route.meta?.menuItemType === "group" ? renderGroup(route, children, ctx) : renderSubMenu(route, children, ctx) : renderMenuItem(route, ctx);
505
+ return divider ? [divider, node] : node;
506
+ }
507
+ function renderMenuList(menus, ctx) {
508
+ return createVNode("ul", {
509
+ "class": classNames(`${prefixCls.value}`, {
510
+ [`${prefixCls.value}-inline`]: !ctx.horizontal,
511
+ [`${prefixCls.value}-horizontal`]: ctx.horizontal && !ctx.popup,
512
+ [`${prefixCls.value}-sub`]: ctx.depth > 0 || ctx.popup,
513
+ [`${prefixCls.value}-popup-list`]: ctx.popup,
514
+ [`${prefixCls.value}-${ctx.horizontal ? "horizontal" : "inline"}-popup-list`]: ctx.popup
515
+ }),
516
+ "role": ctx.popup ? "menu" : void 0
517
+ }, [menus.map((route) => renderRoute(route, ctx))]);
518
+ }
519
+ /** horizontal 模式溢出「...」触发器,popup 内容为被收起的一级项 */
520
+ function renderOverflowRest(allRoutes) {
521
+ const hiddenRoutes = overflow.hiddenIndexes.value.map((index) => allRoutes[index]).filter(Boolean);
522
+ if (hiddenRoutes.length === 0) return null;
523
+ const restActive = hiddenRoutes.some((route) => selectedKeySet.value.has(route.name) || hasSelectedDescendant(route, selectedKeySet.value));
524
+ const popupPath = [OVERFLOW_MENU_KEY];
525
+ const popoverOpen = isPopupPathOpen(popupPath);
526
+ return createVNode("li", {
527
+ "key": OVERFLOW_MENU_KEY,
528
+ "class": classNames(`${prefixCls.value}-node`, `${prefixCls.value}-submenu`, {
529
+ [`${prefixCls.value}-submenu-open`]: popoverOpen,
530
+ [`${prefixCls.value}-submenu-active`]: restActive
531
+ }),
532
+ "data-overflow-rest": "",
533
+ "role": "none"
534
+ }, [createVNode(Popover, {
535
+ "trigger": "hover",
536
+ "placement": "bottomLeft",
537
+ "builtinPlacements": HEADER_POPUP_BUILTIN_PLACEMENTS,
538
+ "arrow": false,
539
+ "open": popoverOpen,
540
+ "classes": {
541
+ root: classNames(popupClassName.value, `${prefixCls.value}-submenu-placement-bottomLeft`, `${prefixCls.value}-horizontal-popover`),
542
+ container: `${prefixCls.value}-popover-container`,
543
+ content: `${prefixCls.value}-popover-content`
544
+ },
545
+ "onOpenChange": (open) => {
546
+ if (open) openPopupPath(popupPath);
547
+ else schedulePopupPathClose(popupPath);
548
+ }
549
+ }, {
550
+ default: () => [createVNode("div", {
551
+ "class": classNames(`${prefixCls.value}-item`, `${prefixCls.value}-submenu-title`, { [`${prefixCls.value}-item-active`]: restActive }),
552
+ "role": "menuitem",
553
+ "tabindex": 0
554
+ }, [createVNode("span", { "class": `${prefixCls.value}-title` }, [createTextVNode("···")])])],
555
+ content: () => createVNode("div", { "class": `${prefixCls.value}-submenu-popup` }, [renderMenuList(hiddenRoutes, {
556
+ depth: 0,
557
+ parentKeys: [],
558
+ popup: true,
559
+ popupPath,
560
+ inlineIndent: DEFAULT_INLINE_INDENT,
561
+ horizontal: true
562
+ })])
563
+ })]);
564
+ }
565
+ return () => {
566
+ const menus = props.menus ?? [];
567
+ if (menus.length === 0) return null;
568
+ if (!isHorizontal.value) return createVNode("ul", {
569
+ "ref": menuRef,
570
+ "class": menuClassNames.value,
571
+ "style": {
572
+ ...props.style,
573
+ ...proStyles.value.menu
574
+ },
575
+ "role": "menu",
576
+ "data-pro-menu-token-key": proLayoutToken.value.key
577
+ }, [menus.map((route) => renderRoute(route, {
578
+ depth: 0,
579
+ parentKeys: [],
580
+ popup: false,
581
+ popupPath: [],
582
+ inlineIndent: DEFAULT_INLINE_INDENT,
583
+ horizontal: false
584
+ }))]);
585
+ const visibleMenus = menus.filter((route) => !route.meta?.hideInMenu);
586
+ return createVNode("ul", {
587
+ "ref": overflow.containerRef,
588
+ "class": classNames(menuClassNames.value, `${prefixCls.value}-overflow`),
589
+ "style": {
590
+ ...props.style,
591
+ ...proStyles.value.menu
592
+ },
593
+ "role": "menubar",
594
+ "data-pro-menu-token-key": proLayoutToken.value.key
595
+ }, [visibleMenus.map((route, index) => renderRoute(route, {
596
+ depth: 0,
597
+ parentKeys: [],
598
+ popup: false,
599
+ popupPath: [],
600
+ inlineIndent: DEFAULT_INLINE_INDENT,
601
+ horizontal: true,
602
+ overflowTopLevel: true,
603
+ overflowHidden: overflow.isItemHidden(index)
604
+ })), overflow.restVisible.value && renderOverflowRest(visibleMenus)]);
605
+ };
606
+ }, {
607
+ props: {
608
+ prefixCls: {
609
+ type: String,
610
+ required: false
611
+ },
612
+ placement: {
613
+ type: String,
614
+ required: false
615
+ },
616
+ getScrollContainer: {
617
+ type: Function,
618
+ required: false
619
+ },
620
+ class: {
621
+ type: String,
622
+ required: false
623
+ },
624
+ style: {
625
+ type: Object,
626
+ required: false
627
+ },
628
+ menus: {
629
+ type: Array,
630
+ required: false
631
+ },
632
+ selectedKeys: {
633
+ type: Array,
634
+ required: false
635
+ },
636
+ openKeys: {
637
+ type: Array,
638
+ required: false
639
+ },
640
+ theme: {
641
+ type: String,
642
+ required: false
643
+ },
644
+ mode: {
645
+ type: String,
646
+ required: false
647
+ },
648
+ collapsed: {
649
+ type: Boolean,
650
+ required: false,
651
+ default: void 0
652
+ },
653
+ proClasses: {
654
+ type: Object,
655
+ required: false
656
+ },
657
+ proStyles: {
658
+ type: Object,
659
+ required: false
660
+ },
661
+ menuItemIcon: {
662
+ type: Function,
663
+ required: false
664
+ },
665
+ menuItemLabel: {
666
+ type: Function,
667
+ required: false
668
+ },
669
+ menuItemExtra: {
670
+ type: Function,
671
+ required: false
672
+ }
673
+ },
674
+ emits: [
675
+ "select",
676
+ "openChange",
677
+ "update:selectedKeys",
678
+ "update:openKeys"
679
+ ],
680
+ name: "ProMenuContent",
681
+ inheritAttrs: false
682
+ });
683
+ const ProMenu = /* @__PURE__ */ defineComponent((props, { emit, slots }) => {
684
+ const { token, proLayoutToken } = useProToken();
685
+ const mode = computed(() => props.mode ?? (props.placement === "header" ? "horizontal" : "inline"));
686
+ const isHorizontal = computed(() => mode.value === "horizontal");
687
+ const proMenuTokens = computed(() => isHorizontal.value ? buildHeaderProMenuTokens(proLayoutToken.value, token.value.Menu) : buildSiderProMenuTokens(proLayoutToken.value, token.value.Menu));
688
+ return () => createVNode(ConfigProvider, { "theme": { components: { ProMenu: proMenuTokens.value } } }, { default: () => [createVNode(ProMenuContent, mergeProps(omit(props, [
689
+ "onSelect",
690
+ "onOpenChange",
691
+ "onUpdate:selectedKeys",
692
+ "onUpdate:openKeys"
693
+ ]), {
694
+ "onSelect": (info) => emit("select", info),
695
+ "onOpenChange": (keys) => emit("openChange", keys)
696
+ }, {
697
+ "onUpdate:selectedKeys": (keys) => emit("update:selectedKeys", keys),
698
+ "onUpdate:openKeys": (keys) => emit("update:openKeys", keys)
699
+ }), slots)] });
700
+ }, {
701
+ props: {
702
+ prefixCls: {
703
+ type: String,
704
+ required: false
705
+ },
706
+ placement: {
707
+ type: String,
708
+ required: false
709
+ },
710
+ getScrollContainer: {
711
+ type: Function,
712
+ required: false
713
+ },
714
+ class: {
715
+ type: String,
716
+ required: false
717
+ },
718
+ style: {
719
+ type: Object,
720
+ required: false
721
+ },
722
+ menus: {
723
+ type: Array,
724
+ required: false
725
+ },
726
+ selectedKeys: {
727
+ type: Array,
728
+ required: false
729
+ },
730
+ openKeys: {
731
+ type: Array,
732
+ required: false
733
+ },
734
+ theme: {
735
+ type: String,
736
+ required: false
737
+ },
738
+ mode: {
739
+ type: String,
740
+ required: false
741
+ },
742
+ collapsed: {
743
+ type: Boolean,
744
+ required: false,
745
+ default: void 0
746
+ },
747
+ proClasses: {
748
+ type: Object,
749
+ required: false
750
+ },
751
+ proStyles: {
752
+ type: Object,
753
+ required: false
754
+ },
755
+ menuItemIcon: {
756
+ type: Function,
757
+ required: false
758
+ },
759
+ menuItemLabel: {
760
+ type: Function,
761
+ required: false
762
+ },
763
+ menuItemExtra: {
764
+ type: Function,
765
+ required: false
766
+ }
767
+ },
768
+ emits: [
769
+ "select",
770
+ "openChange",
771
+ "update:selectedKeys",
772
+ "update:openKeys"
773
+ ],
774
+ name: "ProMenu",
775
+ inheritAttrs: false
776
+ });
777
+ //#endregion
778
+ export { ProMenu as default };