@hi-ui/menu 5.0.0-canary.2 → 5.0.0-canary.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.
@@ -69,16 +69,20 @@ var MenuItem = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
69
69
  clickSubMenu = _useContext.clickSubMenu,
70
70
  closeAllPopper = _useContext.closeAllPopper,
71
71
  activeParents = _useContext.activeParents,
72
- overlayClassName = _useContext.overlayClassName;
72
+ overlayClassName = _useContext.overlayClassName,
73
+ showTitleOnMini = _useContext.showTitleOnMini,
74
+ semanticClassNames = _useContext.semanticClassNames,
75
+ semanticStyles = _useContext.semanticStyles;
73
76
  var _parentIds = (parentIds || []).concat(id);
74
77
  var hasChildren = typeAssertion.isArrayNonEmpty(children);
75
78
  var mergedRef = useMergeRefs.useMergeRefs(itemRef, ref);
76
79
  return /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("li", {
77
80
  ref: mergedRef,
78
- className: classname.cx(prefixCls + "-item", (_cx = {}, _cx[prefixCls + "-item__inner--mini"] = mini, _cx[prefixCls + "-item--disabled"] = disabled, _cx[prefixCls + "-item--active"] = placement === 'horizontal' && (activeId === id || (activeParents === null || activeParents === void 0 ? void 0 : activeParents.includes(id))) && level === 1, _cx), className),
79
- style: hidden ? hiddenStyle : undefined
81
+ className: classname.cx(prefixCls + "-item", (_cx = {}, _cx[prefixCls + "-item__inner--mini"] = mini, _cx[prefixCls + "-item--disabled"] = disabled, _cx[prefixCls + "-item--active"] = placement === 'horizontal' && (activeId === id || (activeParents === null || activeParents === void 0 ? void 0 : activeParents.includes(id))) && level === 1, _cx), className, semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.item),
82
+ style: Object.assign(Object.assign({}, hidden ? hiddenStyle : undefined), semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.item)
80
83
  }, /*#__PURE__*/React__default["default"].createElement("div", {
81
- className: classname.cx(prefixCls + "-item__inner", (_cx2 = {}, _cx2[prefixCls + "-item__inner--active"] = activeId === id, _cx2[prefixCls + "-item__inner--active-p"] = activeParents === null || activeParents === void 0 ? void 0 : activeParents.includes(id), _cx2[prefixCls + "-item__inner--expanded"] = expandedIds === null || expandedIds === void 0 ? void 0 : expandedIds.includes(id), _cx2[prefixCls + "-item__inner--hasIcon"] = icon, _cx2)),
84
+ className: classname.cx(prefixCls + "-item__inner", (_cx2 = {}, _cx2[prefixCls + "-item__inner--active"] = activeId === id, _cx2[prefixCls + "-item__inner--active-p"] = activeParents === null || activeParents === void 0 ? void 0 : activeParents.includes(id), _cx2[prefixCls + "-item__inner--expanded"] = expandedIds === null || expandedIds === void 0 ? void 0 : expandedIds.includes(id), _cx2[prefixCls + "-item__inner--hasIcon"] = icon, _cx2), semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.itemInner),
85
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.itemInner,
82
86
  onClick: function onClick() {
83
87
  if (typeAssertion.isArrayNonEmpty(children)) {
84
88
  !disabled && (clickSubMenu === null || clickSubMenu === void 0 ? void 0 : clickSubMenu(id));
@@ -92,36 +96,53 @@ var MenuItem = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
92
96
  }, placement === 'vertical' && expandedType === 'collapse' && !mini ? renderIndent({
93
97
  prefixCls: prefixCls + "-item",
94
98
  depth: level - 1
95
- }) : null, icon ? /*#__PURE__*/React__default["default"].createElement("span", {
96
- className: prefixCls + "-item__icon"
97
- }, icon) : null, /*#__PURE__*/React__default["default"].createElement("span", {
98
- className: prefixCls + "-item__content"
99
+ }) : null, icon ? ( /*#__PURE__*/React__default["default"].createElement("span", {
100
+ className: classname.cx(prefixCls + "-item__icon", semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.itemIcon),
101
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.itemIcon
102
+ }, icon)) : null, /*#__PURE__*/React__default["default"].createElement("span", {
103
+ className: classname.cx(prefixCls + "-item__content", semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.itemContent),
104
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.itemContent
99
105
  }, typeAssertion.isFunction(render) ? render(Object.assign(Object.assign({}, raw), {
100
106
  id: id,
101
107
  icon: icon,
102
108
  title: title
103
109
  }), level) : title), hasChildren && !mini && placement === 'vertical' && expandedType === 'collapse' && !showAllSubMenus && (!disabled && (expandedIds === null || expandedIds === void 0 ? void 0 : expandedIds.includes(id)) ? ( /*#__PURE__*/React__default["default"].createElement(Arrow, {
104
110
  prefixCls: prefixCls + "-item",
105
- direction: "up"
111
+ direction: "up",
112
+ className: semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.itemArrow,
113
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.itemArrow
106
114
  })) : ( /*#__PURE__*/React__default["default"].createElement(Arrow, {
107
115
  prefixCls: prefixCls + "-item",
108
- direction: "down"
116
+ direction: "down",
117
+ className: semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.itemArrow,
118
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.itemArrow
109
119
  }))), hasChildren && mini && level > 1 && placement === 'vertical' ? ( /*#__PURE__*/React__default["default"].createElement(Arrow, {
110
- prefixCls: prefixCls + "-item"
120
+ prefixCls: prefixCls + "-item",
121
+ className: semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.itemArrow,
122
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.itemArrow
111
123
  })) : null, hasChildren && !mini && placement === 'vertical' && (expandedType === 'pop' || showAllSubMenus) ? ( /*#__PURE__*/React__default["default"].createElement(Arrow, {
112
- prefixCls: prefixCls + "-item"
124
+ prefixCls: prefixCls + "-item",
125
+ className: semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.itemArrow,
126
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.itemArrow
113
127
  })) : null, hasChildren && placement === 'horizontal' && level > 1 ? ( /*#__PURE__*/React__default["default"].createElement(Arrow, {
114
- prefixCls: prefixCls + "-item"
128
+ prefixCls: prefixCls + "-item",
129
+ className: semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.itemArrow,
130
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.itemArrow
115
131
  })) : null, hasChildren && placement === 'horizontal' && level === 1 && (!disabled && (expandedIds === null || expandedIds === void 0 ? void 0 : expandedIds.includes(id)) ? ( /*#__PURE__*/React__default["default"].createElement(Arrow, {
116
132
  prefixCls: prefixCls + "-item",
117
- direction: "up"
133
+ direction: "up",
134
+ className: semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.itemArrow,
135
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.itemArrow
118
136
  })) : ( /*#__PURE__*/React__default["default"].createElement(Arrow, {
119
137
  prefixCls: prefixCls + "-item",
120
- direction: "down"
138
+ direction: "down",
139
+ className: semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.itemArrow,
140
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.itemArrow
121
141
  })))), hasChildren && placement === 'vertical' && !mini && !showAllSubMenus && expandedType === 'collapse' ? ( /*#__PURE__*/React__default["default"].createElement(Expander.Expander, {
122
142
  visible: !disabled && !!(expandedIds === null || expandedIds === void 0 ? void 0 : expandedIds.includes(id))
123
143
  }, /*#__PURE__*/React__default["default"].createElement("ul", {
124
- className: prefixCls + "-submenu"
144
+ className: classname.cx(prefixCls + "-submenu", semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.submenu),
145
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.submenu
125
146
  }, children.map(function (child) {
126
147
  return /*#__PURE__*/React__default["default"].createElement(MenuItem, Object.assign({}, child, {
127
148
  key: child.id,
@@ -135,13 +156,14 @@ var MenuItem = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
135
156
  visible: !!(expandedIds === null || expandedIds === void 0 ? void 0 : expandedIds.includes(id)),
136
157
  attachEl: itemRef.current,
137
158
  placement: 'right-start',
138
- gutterGap: 16,
159
+ gutterGap: showTitleOnMini ? 8 : 16,
139
160
  className: overlayClassName,
140
161
  onClose: function onClose() {
141
162
  closePopper === null || closePopper === void 0 ? void 0 : closePopper(id);
142
163
  }
143
164
  }, /*#__PURE__*/React__default["default"].createElement("ul", {
144
- className: prefixCls + "-popmenu " + prefixCls + "--size-" + size
165
+ className: classname.cx(prefixCls + "-popmenu", prefixCls + "--size-" + size, semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.popmenu),
166
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.popmenu
145
167
  }, children.map(function (child) {
146
168
  return /*#__PURE__*/React__default["default"].createElement(MenuItem, Object.assign({}, child, {
147
169
  key: child.id,
@@ -155,14 +177,15 @@ var MenuItem = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
155
177
  visible: !!(expandedIds === null || expandedIds === void 0 ? void 0 : expandedIds.includes(id)),
156
178
  attachEl: itemRef.current,
157
179
  placement: 'right-start',
158
- gutterGap: 16,
180
+ gutterGap: showTitleOnMini ? 12 : 16,
159
181
  disabledPortal: true,
160
182
  className: overlayClassName,
161
183
  onClose: function onClose() {
162
184
  closePopper === null || closePopper === void 0 ? void 0 : closePopper(id);
163
185
  }
164
186
  }, /*#__PURE__*/React__default["default"].createElement("ul", {
165
- className: prefixCls + "-popmenu " + prefixCls + "--size-" + size
187
+ className: classname.cx(prefixCls + "-popmenu", prefixCls + "--size-" + size, semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.popmenu),
188
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.popmenu
166
189
  }, children.map(function (child) {
167
190
  return /*#__PURE__*/React__default["default"].createElement(MenuItem, Object.assign({}, child, {
168
191
  key: child.id,
@@ -182,7 +205,8 @@ var MenuItem = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
182
205
  closePopper === null || closePopper === void 0 ? void 0 : closePopper(id);
183
206
  }
184
207
  }, /*#__PURE__*/React__default["default"].createElement("ul", {
185
- className: prefixCls + "-popmenu " + prefixCls + "--size-" + size
208
+ className: classname.cx(prefixCls + "-popmenu", prefixCls + "--size-" + size, semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.popmenu),
209
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.popmenu
186
210
  }, children.map(function (child) {
187
211
  return /*#__PURE__*/React__default["default"].createElement(MenuItem, Object.assign({}, child, {
188
212
  key: child.id,
@@ -203,7 +227,8 @@ var MenuItem = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
203
227
  closePopper === null || closePopper === void 0 ? void 0 : closePopper(id);
204
228
  }
205
229
  }, /*#__PURE__*/React__default["default"].createElement("ul", {
206
- className: prefixCls + "-popmenu " + prefixCls + "--size-" + size
230
+ className: classname.cx(prefixCls + "-popmenu", prefixCls + "--size-" + size, semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.popmenu),
231
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.popmenu
207
232
  }, children.map(function (child) {
208
233
  return /*#__PURE__*/React__default["default"].createElement(MenuItem, Object.assign({}, child, {
209
234
  key: child.id,
@@ -253,7 +278,8 @@ var MenuItem = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
253
278
  closePopper === null || closePopper === void 0 ? void 0 : closePopper(id);
254
279
  }
255
280
  }, /*#__PURE__*/React__default["default"].createElement("ul", {
256
- className: prefixCls + "-popmenu " + prefixCls + "--size-" + size
281
+ className: classname.cx(prefixCls + "-popmenu", prefixCls + "--size-" + size, semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.popmenu),
282
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.popmenu
257
283
  }, children.map(function (child) {
258
284
  return /*#__PURE__*/React__default["default"].createElement(MenuItem, Object.assign({}, child, {
259
285
  key: child.id,
@@ -274,7 +300,8 @@ var MenuItem = /*#__PURE__*/React.forwardRef(function (_ref, ref) {
274
300
  closePopper === null || closePopper === void 0 ? void 0 : closePopper(id);
275
301
  }
276
302
  }, /*#__PURE__*/React__default["default"].createElement("ul", {
277
- className: prefixCls + "-popmenu " + prefixCls + "--size-" + size
303
+ className: classname.cx(prefixCls + "-popmenu", prefixCls + "--size-" + size, semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.popmenu),
304
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.popmenu
278
305
  }, children.map(function (child) {
279
306
  return /*#__PURE__*/React__default["default"].createElement(MenuItem, Object.assign({}, child, {
280
307
  key: child.id,
@@ -321,7 +348,9 @@ if (env.__DEV__) {
321
348
  }
322
349
  var Arrow = function Arrow(_ref2) {
323
350
  var prefixCls = _ref2.prefixCls,
324
- direction = _ref2.direction;
351
+ direction = _ref2.direction,
352
+ className = _ref2.className,
353
+ style = _ref2.style;
325
354
  var icon;
326
355
  switch (direction) {
327
356
  case 'up':
@@ -334,7 +363,8 @@ var Arrow = function Arrow(_ref2) {
334
363
  icon = /*#__PURE__*/React__default["default"].createElement(icons.RightOutlined, null);
335
364
  }
336
365
  return /*#__PURE__*/React__default["default"].createElement("span", {
337
- className: prefixCls + "__arrow"
366
+ className: classname.cx(prefixCls + "__arrow", className),
367
+ style: style
338
368
  }, icon);
339
369
  };
340
370
  /**
@@ -0,0 +1,365 @@
1
+ /** @LICENSE
2
+ * @hi-ui/menu
3
+ * https://github.com/XiaoMi/hiui/tree/master/packages/ui/menu#readme
4
+ *
5
+ * Copyright (c) HiUI <mi-hiui@xiaomi.com>.
6
+ *
7
+ * This source code is licensed under the MIT license found in the
8
+ * LICENSE file in the root directory of this source tree.
9
+ */
10
+ 'use strict';
11
+
12
+ var _typeof = require("@babel/runtime/helpers/typeof");
13
+ Object.defineProperty(exports, '__esModule', {
14
+ value: true
15
+ });
16
+ var tslib = require('tslib');
17
+ var React = require('react');
18
+ var core = require('@hi-ui/core');
19
+ var useMergeSemantic = require('@hi-ui/use-merge-semantic');
20
+ var env = require('@hi-ui/env');
21
+ var classname = require('@hi-ui/classname');
22
+ var icons = require('@hi-ui/icons');
23
+ var IconButton = require('@hi-ui/icon-button');
24
+ var Button = require('@hi-ui/button');
25
+ var Input = require('@hi-ui/input');
26
+ var Highlighter = require('@hi-ui/highlighter');
27
+ var useUncontrolledState = require('@hi-ui/use-uncontrolled-state');
28
+ var useToggle = require('@hi-ui/use-toggle');
29
+ var EllipsisTooltip = require('@hi-ui/ellipsis-tooltip');
30
+ var EnterIcon = require('./EnterIcon.js');
31
+ var util = require('./util.js');
32
+ function _interopDefaultCompat(e) {
33
+ return e && _typeof(e) === 'object' && 'default' in e ? e : {
34
+ 'default': e
35
+ };
36
+ }
37
+ var React__default = /*#__PURE__*/_interopDefaultCompat(React);
38
+ var IconButton__default = /*#__PURE__*/_interopDefaultCompat(IconButton);
39
+ var Button__default = /*#__PURE__*/_interopDefaultCompat(Button);
40
+ var Input__default = /*#__PURE__*/_interopDefaultCompat(Input);
41
+ var Highlighter__default = /*#__PURE__*/_interopDefaultCompat(Highlighter);
42
+ var EllipsisTooltip__default = /*#__PURE__*/_interopDefaultCompat(EllipsisTooltip);
43
+ var _role = 'menu-search';
44
+ var _prefix = classname.getPrefixCls(_role);
45
+ var MenuSearch = /*#__PURE__*/React.forwardRef(function (_a, ref) {
46
+ var _cx, _cx2;
47
+ var _b, _c;
48
+ var innerRef = _a.innerRef,
49
+ _a$prefixCls = _a.prefixCls,
50
+ prefixCls = _a$prefixCls === void 0 ? _prefix : _a$prefixCls,
51
+ className = _a.className,
52
+ classNamesProp = _a.classNames,
53
+ stylesProp = _a.styles,
54
+ placeholder = _a.placeholder,
55
+ width = _a.width,
56
+ style = _a.style,
57
+ visibleProp = _a.visible,
58
+ data = _a.data,
59
+ _a$defaultValue = _a.defaultValue,
60
+ defaultValue = _a$defaultValue === void 0 ? '' : _a$defaultValue,
61
+ valueProp = _a.value,
62
+ onChange = _a.onChange,
63
+ onSelect = _a.onSelect,
64
+ onClear = _a.onClear,
65
+ onClose = _a.onClose,
66
+ onEsc = _a.onEsc,
67
+ rest = tslib.__rest(_a, ["innerRef", "prefixCls", "className", "classNames", "styles", "clearText", "placeholder", "notFoundContent", "width", "style", "visible", "data", "defaultValue", "value", "onChange", "onSearch", "onSelect", "onClear", "onClose", "onEsc"]);
68
+ var i18n = core.useLocaleContext();
69
+ var _useGlobalContext = core.useGlobalContext(),
70
+ menuSearchConfig = _useGlobalContext.menuSearch;
71
+ var _useMergeSemantic = useMergeSemantic.useMergeSemantic({
72
+ classNamesList: [menuSearchConfig === null || menuSearchConfig === void 0 ? void 0 : menuSearchConfig.classNames, classNamesProp],
73
+ stylesList: [menuSearchConfig === null || menuSearchConfig === void 0 ? void 0 : menuSearchConfig.styles, stylesProp],
74
+ info: {
75
+ props: Object.assign(Object.assign({}, rest), {
76
+ data: data,
77
+ placeholder: placeholder,
78
+ width: width,
79
+ visible: visibleProp,
80
+ defaultValue: defaultValue,
81
+ value: valueProp
82
+ })
83
+ }
84
+ }),
85
+ classNames = _useMergeSemantic.classNames,
86
+ styles = _useMergeSemantic.styles;
87
+ var _useUncontrolledToggl = useToggle.useUncontrolledToggle({
88
+ visible: visibleProp
89
+ }),
90
+ visible = _useUncontrolledToggl[0],
91
+ visibleAction = _useUncontrolledToggl[1];
92
+ var _useUncontrolledState = useUncontrolledState.useUncontrolledState(defaultValue, valueProp, onChange),
93
+ value = _useUncontrolledState[0],
94
+ tryChangeValue = _useUncontrolledState[1];
95
+ var _useState = React.useState(-1),
96
+ currentIndex = _useState[0],
97
+ setCurrentIndex = _useState[1];
98
+ var listRef = React.useRef(null);
99
+ React.useLayoutEffect(function () {
100
+ if (currentIndex === -1 || !listRef.current) return;
101
+ var listContainer = listRef.current;
102
+ var selectedItem = listContainer.children[currentIndex];
103
+ if (!selectedItem) return;
104
+ var containerScrollTop = listContainer.scrollTop;
105
+ var containerHeight = listContainer.clientHeight;
106
+ var itemTop = selectedItem.offsetTop;
107
+ var itemHeight = selectedItem.offsetHeight;
108
+ // 计算元素的可见范围
109
+ var itemBottom = itemTop + itemHeight;
110
+ var visibleTop = containerScrollTop;
111
+ var visibleBottom = containerScrollTop + containerHeight;
112
+ // 判断是否需要滚动
113
+ var isItemAboveViewport = itemTop < visibleTop;
114
+ var isItemBelowViewport = itemBottom > visibleBottom;
115
+ if (isItemAboveViewport) {
116
+ // 如果元素在可视区域上方,滚动到元素顶部
117
+ listContainer.scrollTop = itemTop;
118
+ } else if (isItemBelowViewport) {
119
+ // 如果元素在可视区域下方,滚动到元素底部刚好可见
120
+ listContainer.scrollTop = itemBottom - containerHeight;
121
+ }
122
+ }, [currentIndex]);
123
+ var resultMemo = React__default["default"].useMemo(function () {
124
+ if (!data || !value) return [];
125
+ // 使用新的搜索算法
126
+ var searchResults = util.searchMenuWithPath(data, value);
127
+ return searchResults.map(function (result) {
128
+ return Object.assign(Object.assign({}, result.node), {
129
+ level: result.level,
130
+ path: result.path,
131
+ // 添加路径信息用于显示
132
+ pathTitles: result.path.map(function (p) {
133
+ var _a;
134
+ return (_a = p.title) === null || _a === void 0 ? void 0 : _a.toString();
135
+ }).filter(Boolean)
136
+ });
137
+ });
138
+ }, [data, value]);
139
+ var handleChange = React.useCallback(function (value) {
140
+ tryChangeValue(value);
141
+ }, [tryChangeValue]);
142
+ var handleSelect = React.useCallback(function (id, item, index) {
143
+ var _a;
144
+ setCurrentIndex(index);
145
+ visibleAction.off();
146
+ // 让列表容器获取焦点,确保键盘导航可用
147
+ (_a = listRef.current) === null || _a === void 0 ? void 0 : _a.focus();
148
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect(id, item);
149
+ }, [onSelect, visibleAction]);
150
+ var handleMove = React.useCallback(function (direction) {
151
+ if (!resultMemo) return;
152
+ setCurrentIndex(function (prev) {
153
+ if (direction === 'up') {
154
+ return prev - 1 < 0 ? (resultMemo === null || resultMemo === void 0 ? void 0 : resultMemo.length) - 1 : prev - 1;
155
+ } else {
156
+ return prev + 1 > (resultMemo === null || resultMemo === void 0 ? void 0 : resultMemo.length) - 1 ? 0 : prev + 1;
157
+ }
158
+ });
159
+ }, [resultMemo]);
160
+ var handleEnter = React.useCallback(function () {
161
+ if (!resultMemo) return;
162
+ if (currentIndex === -1) {
163
+ setCurrentIndex(0);
164
+ }
165
+ visibleAction.off();
166
+ onSelect === null || onSelect === void 0 ? void 0 : onSelect(resultMemo[currentIndex].id, resultMemo[currentIndex]);
167
+ }, [resultMemo, currentIndex, onSelect, visibleAction]);
168
+ var handleClear = React.useCallback(function () {
169
+ tryChangeValue('');
170
+ setCurrentIndex(-1);
171
+ onClear === null || onClear === void 0 ? void 0 : onClear();
172
+ }, [onClear, tryChangeValue]);
173
+ var handleClose = React.useCallback(function () {
174
+ visibleAction.off();
175
+ onClose === null || onClose === void 0 ? void 0 : onClose();
176
+ }, [onClose, visibleAction]);
177
+ var handleEscape = React.useCallback(function () {
178
+ handleClose();
179
+ onEsc === null || onEsc === void 0 ? void 0 : onEsc();
180
+ }, [handleClose, onEsc]);
181
+ var handleKeyDown = React.useCallback(function (e) {
182
+ if (e.key === 'ArrowUp') {
183
+ handleMove('up');
184
+ }
185
+ if (e.key === 'ArrowDown') {
186
+ handleMove('down');
187
+ }
188
+ if (e.key === 'Enter') {
189
+ handleEnter();
190
+ }
191
+ if (e.key === 'Escape') {
192
+ handleEscape();
193
+ }
194
+ }, [handleEnter, handleMove, handleEscape]);
195
+ var _useState2 = React.useState(null),
196
+ inputRef = _useState2[0],
197
+ setInputRef = _useState2[1];
198
+ React.useEffect(function () {
199
+ if (!value || !inputRef) {
200
+ visibleAction.off();
201
+ } else {
202
+ visibleAction.on();
203
+ }
204
+ }, [inputRef, value, visibleAction]);
205
+ React.useImperativeHandle(innerRef, function () {
206
+ return {
207
+ show: function show() {
208
+ visibleAction.on();
209
+ },
210
+ hide: function hide() {
211
+ visibleAction.off();
212
+ },
213
+ focus: function focus() {
214
+ inputRef === null || inputRef === void 0 ? void 0 : inputRef.focus();
215
+ }
216
+ };
217
+ });
218
+ var cls = classname.cx(prefixCls, className, classNames === null || classNames === void 0 ? void 0 : classNames.root, (_cx = {}, _cx[prefixCls + "--open"] = visible, _cx));
219
+ return /*#__PURE__*/React__default["default"].createElement("div", {
220
+ className: cls,
221
+ style: Object.assign(Object.assign({}, style), styles === null || styles === void 0 ? void 0 : styles.root)
222
+ }, /*#__PURE__*/React__default["default"].createElement(MenuSearchInput, {
223
+ width: width,
224
+ prefixCls: prefixCls,
225
+ placeholder: placeholder,
226
+ value: value,
227
+ onChange: handleChange,
228
+ onClear: handleClear,
229
+ onClose: handleClose,
230
+ onKeyDown: handleKeyDown,
231
+ inputRef: setInputRef,
232
+ semanticClassNames: classNames,
233
+ semanticStyles: styles
234
+ }), /*#__PURE__*/React__default["default"].createElement("div", {
235
+ className: classname.cx(prefixCls + "__content", (_cx2 = {}, _cx2[prefixCls + "__content--visible"] = visible, _cx2), classNames === null || classNames === void 0 ? void 0 : classNames.content),
236
+ style: styles === null || styles === void 0 ? void 0 : styles.content
237
+ }, (resultMemo === null || resultMemo === void 0 ? void 0 : resultMemo.length) > 0 ? ( /*#__PURE__*/React__default["default"].createElement(React__default["default"].Fragment, null, /*#__PURE__*/React__default["default"].createElement("div", {
238
+ className: classname.cx(prefixCls + "__header", classNames === null || classNames === void 0 ? void 0 : classNames.header),
239
+ style: styles === null || styles === void 0 ? void 0 : styles.header
240
+ }, /*#__PURE__*/React__default["default"].createElement(Highlighter__default["default"], {
241
+ keyword: String((_b = resultMemo === null || resultMemo === void 0 ? void 0 : resultMemo.length) !== null && _b !== void 0 ? _b : 0)
242
+ }, i18n.get('menuSearch.searchResult', {
243
+ count: (_c = resultMemo === null || resultMemo === void 0 ? void 0 : resultMemo.length) !== null && _c !== void 0 ? _c : 0,
244
+ keyword: value
245
+ }))), /*#__PURE__*/React__default["default"].createElement("div", {
246
+ className: classname.cx(prefixCls + "__list", classNames === null || classNames === void 0 ? void 0 : classNames.list),
247
+ style: styles === null || styles === void 0 ? void 0 : styles.list,
248
+ ref: listRef,
249
+ tabIndex: -1,
250
+ onKeyDown: handleKeyDown
251
+ }, resultMemo === null || resultMemo === void 0 ? void 0 : resultMemo.map(function (item, index) {
252
+ var _cx3;
253
+ return /*#__PURE__*/React__default["default"].createElement("div", {
254
+ key: item.id,
255
+ className: classname.cx(prefixCls + "__list-item", (_cx3 = {}, _cx3[prefixCls + "__list-item--selected"] = currentIndex === index, _cx3), classNames === null || classNames === void 0 ? void 0 : classNames.listItem),
256
+ style: styles === null || styles === void 0 ? void 0 : styles.listItem,
257
+ onClick: function onClick() {
258
+ return handleSelect(item.id, item, index);
259
+ }
260
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
261
+ className: classname.cx(prefixCls + "__list-item__title", classNames === null || classNames === void 0 ? void 0 : classNames.listItemTitle),
262
+ style: styles === null || styles === void 0 ? void 0 : styles.listItemTitle
263
+ }, /*#__PURE__*/React__default["default"].createElement(EllipsisTooltip__default["default"], {
264
+ tooltipProps: {
265
+ style: {
266
+ maxWidth: 320
267
+ }
268
+ }
269
+ }, /*#__PURE__*/React__default["default"].createElement(Highlighter__default["default"], {
270
+ keyword: value
271
+ }, item.pathTitles.join('/')))));
272
+ })))) : ( /*#__PURE__*/React__default["default"].createElement("div", {
273
+ className: classname.cx(prefixCls + "__empty", classNames === null || classNames === void 0 ? void 0 : classNames.empty),
274
+ style: styles === null || styles === void 0 ? void 0 : styles.empty
275
+ }, /*#__PURE__*/React__default["default"].createElement("div", null, i18n.menuSearch.searchEmptyResult)))), (resultMemo === null || resultMemo === void 0 ? void 0 : resultMemo.length) > 0 && ( /*#__PURE__*/React__default["default"].createElement("div", {
276
+ className: classname.cx(prefixCls + "__footer", classNames === null || classNames === void 0 ? void 0 : classNames.footer),
277
+ style: styles === null || styles === void 0 ? void 0 : styles.footer
278
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
279
+ className: classname.cx(prefixCls + "__footer-item", classNames === null || classNames === void 0 ? void 0 : classNames.footerItem),
280
+ style: styles === null || styles === void 0 ? void 0 : styles.footerItem
281
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
282
+ className: classname.cx(prefixCls + "__footer-item__icon", classNames === null || classNames === void 0 ? void 0 : classNames.footerItemIcon),
283
+ style: styles === null || styles === void 0 ? void 0 : styles.footerItemIcon
284
+ }, /*#__PURE__*/React__default["default"].createElement(icons.ArrowUpOutlined, null), /*#__PURE__*/React__default["default"].createElement(icons.ArrowDownOutlined, null)), /*#__PURE__*/React__default["default"].createElement("span", {
285
+ className: classname.cx(prefixCls + "__footer-item__text", classNames === null || classNames === void 0 ? void 0 : classNames.footerItemText),
286
+ style: styles === null || styles === void 0 ? void 0 : styles.footerItemText
287
+ }, i18n.menuSearch.moveCursor)), /*#__PURE__*/React__default["default"].createElement("div", {
288
+ className: classname.cx(prefixCls + "__footer-item", classNames === null || classNames === void 0 ? void 0 : classNames.footerItem),
289
+ style: styles === null || styles === void 0 ? void 0 : styles.footerItem
290
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
291
+ className: classname.cx(prefixCls + "__footer-item__icon", classNames === null || classNames === void 0 ? void 0 : classNames.footerItemIcon),
292
+ style: styles === null || styles === void 0 ? void 0 : styles.footerItemIcon
293
+ }, /*#__PURE__*/React__default["default"].createElement(EnterIcon.EnterIcon, null)), /*#__PURE__*/React__default["default"].createElement("span", {
294
+ className: classname.cx(prefixCls + "__footer-item__text", classNames === null || classNames === void 0 ? void 0 : classNames.footerItemText),
295
+ style: styles === null || styles === void 0 ? void 0 : styles.footerItemText
296
+ }, i18n.menuSearch.confirmSelect)), /*#__PURE__*/React__default["default"].createElement("div", {
297
+ className: classname.cx(prefixCls + "__footer-item", classNames === null || classNames === void 0 ? void 0 : classNames.footerItem),
298
+ style: styles === null || styles === void 0 ? void 0 : styles.footerItem
299
+ }, /*#__PURE__*/React__default["default"].createElement("div", {
300
+ className: classname.cx(prefixCls + "__footer-item__icon", classNames === null || classNames === void 0 ? void 0 : classNames.footerItemIcon),
301
+ style: styles === null || styles === void 0 ? void 0 : styles.footerItemIcon
302
+ }, "esc"), /*#__PURE__*/React__default["default"].createElement("span", {
303
+ className: classname.cx(prefixCls + "__footer-item__text", classNames === null || classNames === void 0 ? void 0 : classNames.footerItemText),
304
+ style: styles === null || styles === void 0 ? void 0 : styles.footerItemText
305
+ }, i18n.menuSearch.hideWindow)))));
306
+ });
307
+ if (env.__DEV__) {
308
+ MenuSearch.displayName = 'MenuSearch';
309
+ }
310
+ var MenuSearchInput = /*#__PURE__*/React.forwardRef(function (_a, ref) {
311
+ var prefixCls = _a.prefixCls,
312
+ placeholder = _a.placeholder,
313
+ width = _a.width,
314
+ value = _a.value,
315
+ _onChange = _a.onChange,
316
+ onClear = _a.onClear,
317
+ onClose = _a.onClose,
318
+ onKeyDown = _a.onKeyDown,
319
+ inputRef = _a.inputRef,
320
+ semanticClassNames = _a.semanticClassNames,
321
+ semanticStyles = _a.semanticStyles,
322
+ rest = tslib.__rest(_a, ["prefixCls", "placeholder", "width", "value", "onChange", "onClear", "onClose", "onKeyDown", "inputRef", "semanticClassNames", "semanticStyles"]);
323
+ var i18n = core.useLocaleContext();
324
+ return /*#__PURE__*/React__default["default"].createElement("div", {
325
+ ref: ref,
326
+ className: classname.cx(prefixCls + "__input-wrapper", semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.inputWrapper),
327
+ style: Object.assign({
328
+ width: width
329
+ }, semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.inputWrapper)
330
+ }, /*#__PURE__*/React__default["default"].createElement(Input__default["default"], Object.assign({
331
+ ref: inputRef,
332
+ className: classname.cx(prefixCls + "__input", semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.input),
333
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.input,
334
+ classNames: {
335
+ prefix: prefixCls + "__input-prefix"
336
+ },
337
+ appearance: "unset",
338
+ placeholder: placeholder,
339
+ prefix: /*#__PURE__*/React__default["default"].createElement(icons.SearchOutlined, null),
340
+ suffix: /*#__PURE__*/React__default["default"].createElement(Button__default["default"], {
341
+ className: classname.cx(prefixCls + "__input-clear", semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.inputClear),
342
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.inputClear,
343
+ appearance: "link",
344
+ size: "xs",
345
+ onClick: onClear
346
+ }, i18n.menuSearch.clear),
347
+ value: value,
348
+ onChange: function onChange(e) {
349
+ return _onChange === null || _onChange === void 0 ? void 0 : _onChange(e.target.value);
350
+ },
351
+ onKeyDown: onKeyDown
352
+ }, rest)), /*#__PURE__*/React__default["default"].createElement("span", {
353
+ className: classname.cx(prefixCls + "__close", semanticClassNames === null || semanticClassNames === void 0 ? void 0 : semanticClassNames.close),
354
+ style: semanticStyles === null || semanticStyles === void 0 ? void 0 : semanticStyles.close
355
+ }, /*#__PURE__*/React__default["default"].createElement(IconButton__default["default"], {
356
+ icon: /*#__PURE__*/React__default["default"].createElement(icons.CloseOutlined, null),
357
+ effect: true,
358
+ onClick: onClose
359
+ })));
360
+ });
361
+ if (env.__DEV__) {
362
+ MenuSearchInput.displayName = 'MenuSearchInput';
363
+ }
364
+ exports.MenuSearch = MenuSearch;
365
+ exports.MenuSearchInput = MenuSearchInput;