wssf-kage-ui 0.1.1 → 0.1.2

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 (179) hide show
  1. package/dist/cjs/Avatar/index.d.ts +47 -0
  2. package/dist/cjs/Avatar/index.js +147 -0
  3. package/dist/cjs/Avatar/style.less +193 -0
  4. package/dist/cjs/Badge/index.d.ts +48 -0
  5. package/dist/cjs/Badge/index.js +141 -0
  6. package/dist/cjs/Badge/style.less +237 -0
  7. package/dist/cjs/Calendar/index.d.ts +33 -0
  8. package/dist/cjs/Calendar/index.js +296 -0
  9. package/dist/cjs/Calendar/style.less +384 -0
  10. package/dist/cjs/Card/index.d.ts +68 -0
  11. package/dist/cjs/Card/index.js +155 -0
  12. package/dist/cjs/Card/style.less +356 -0
  13. package/dist/cjs/Carousel/index.d.ts +33 -0
  14. package/dist/cjs/Carousel/index.js +169 -0
  15. package/dist/cjs/Carousel/style.less +232 -0
  16. package/dist/cjs/Collapse/index.d.ts +55 -0
  17. package/dist/cjs/Collapse/index.js +191 -0
  18. package/dist/cjs/Collapse/style.less +217 -0
  19. package/dist/cjs/Descriptions/index.d.ts +54 -0
  20. package/dist/cjs/Descriptions/index.js +181 -0
  21. package/dist/cjs/Descriptions/style.less +259 -0
  22. package/dist/cjs/Empty/index.d.ts +21 -0
  23. package/dist/cjs/Empty/index.js +115 -0
  24. package/dist/cjs/Empty/style.less +103 -0
  25. package/dist/cjs/Image/index.d.ts +30 -0
  26. package/dist/cjs/Image/index.js +153 -0
  27. package/dist/cjs/Image/style.less +156 -0
  28. package/dist/cjs/Input/index.d.ts +24 -0
  29. package/dist/cjs/Input/index.js +158 -0
  30. package/dist/cjs/Input/style.less +276 -0
  31. package/dist/cjs/InputNumber/index.d.ts +47 -0
  32. package/dist/cjs/InputNumber/index.js +323 -0
  33. package/dist/cjs/InputNumber/style.less +392 -0
  34. package/dist/cjs/Mentions/index.d.ts +57 -0
  35. package/dist/cjs/Mentions/index.js +378 -0
  36. package/dist/cjs/Mentions/style.less +297 -0
  37. package/dist/cjs/Popover/index.d.ts +30 -0
  38. package/dist/cjs/Popover/index.js +131 -0
  39. package/dist/cjs/Popover/style.less +279 -0
  40. package/dist/cjs/QRCode/index.d.ts +30 -0
  41. package/dist/cjs/QRCode/index.js +167 -0
  42. package/dist/cjs/QRCode/style.less +201 -0
  43. package/dist/cjs/Radio/index.d.ts +70 -0
  44. package/dist/cjs/Radio/index.js +199 -0
  45. package/dist/cjs/Radio/style.less +326 -0
  46. package/dist/cjs/Rate/index.d.ts +37 -0
  47. package/dist/cjs/Rate/index.js +151 -0
  48. package/dist/cjs/Rate/style.less +170 -0
  49. package/dist/cjs/Segmented/index.d.ts +31 -0
  50. package/dist/cjs/Segmented/index.js +121 -0
  51. package/dist/cjs/Segmented/style.less +167 -0
  52. package/dist/cjs/Select/index.d.ts +67 -0
  53. package/dist/cjs/Select/index.js +403 -0
  54. package/dist/cjs/Select/style.less +523 -0
  55. package/dist/cjs/Slider/index.d.ts +41 -0
  56. package/dist/cjs/Slider/index.js +325 -0
  57. package/dist/cjs/Slider/style.less +287 -0
  58. package/dist/cjs/Statistic/index.d.ts +26 -0
  59. package/dist/cjs/Statistic/index.js +71 -0
  60. package/dist/cjs/Statistic/style.less +94 -0
  61. package/dist/cjs/Switch/index.d.ts +28 -0
  62. package/dist/cjs/Switch/index.js +71 -0
  63. package/dist/cjs/Switch/style.less +212 -0
  64. package/dist/cjs/Table/index.d.ts +188 -0
  65. package/dist/cjs/Table/index.js +787 -0
  66. package/dist/cjs/Table/style.less +663 -0
  67. package/dist/cjs/Tag/index.d.ts +51 -0
  68. package/dist/cjs/Tag/index.js +142 -0
  69. package/dist/cjs/Tag/style.less +356 -0
  70. package/dist/cjs/TimePicker/index.d.ts +51 -0
  71. package/dist/cjs/TimePicker/index.js +332 -0
  72. package/dist/cjs/TimePicker/style.less +384 -0
  73. package/dist/cjs/Timeline/index.d.ts +47 -0
  74. package/dist/cjs/Timeline/index.js +127 -0
  75. package/dist/cjs/Timeline/style.less +265 -0
  76. package/dist/cjs/Tooltip/index.d.ts +53 -0
  77. package/dist/cjs/Tooltip/index.js +468 -0
  78. package/dist/cjs/Tooltip/style.less +237 -0
  79. package/dist/cjs/Transfer/index.d.ts +52 -0
  80. package/dist/cjs/Transfer/index.js +344 -0
  81. package/dist/cjs/Transfer/style.less +331 -0
  82. package/dist/cjs/TreeSelect/index.d.ts +54 -0
  83. package/dist/cjs/TreeSelect/index.js +373 -0
  84. package/dist/cjs/TreeSelect/style.less +471 -0
  85. package/dist/cjs/Upload/index.d.ts +65 -0
  86. package/dist/cjs/Upload/index.js +517 -0
  87. package/dist/cjs/Upload/style.less +424 -0
  88. package/dist/cjs/index.d.ts +58 -0
  89. package/dist/cjs/index.js +227 -0
  90. package/dist/esm/Avatar/index.d.ts +47 -0
  91. package/dist/esm/Avatar/index.js +142 -0
  92. package/dist/esm/Avatar/style.less +193 -0
  93. package/dist/esm/Badge/index.d.ts +48 -0
  94. package/dist/esm/Badge/index.js +137 -0
  95. package/dist/esm/Badge/style.less +237 -0
  96. package/dist/esm/Calendar/index.d.ts +33 -0
  97. package/dist/esm/Calendar/index.js +291 -0
  98. package/dist/esm/Calendar/style.less +384 -0
  99. package/dist/esm/Card/index.d.ts +68 -0
  100. package/dist/esm/Card/index.js +149 -0
  101. package/dist/esm/Card/style.less +356 -0
  102. package/dist/esm/Carousel/index.d.ts +33 -0
  103. package/dist/esm/Carousel/index.js +163 -0
  104. package/dist/esm/Carousel/style.less +232 -0
  105. package/dist/esm/Collapse/index.d.ts +55 -0
  106. package/dist/esm/Collapse/index.js +187 -0
  107. package/dist/esm/Collapse/style.less +217 -0
  108. package/dist/esm/Descriptions/index.d.ts +54 -0
  109. package/dist/esm/Descriptions/index.js +179 -0
  110. package/dist/esm/Descriptions/style.less +259 -0
  111. package/dist/esm/Empty/index.d.ts +21 -0
  112. package/dist/esm/Empty/index.js +109 -0
  113. package/dist/esm/Empty/style.less +103 -0
  114. package/dist/esm/Image/index.d.ts +30 -0
  115. package/dist/esm/Image/index.js +149 -0
  116. package/dist/esm/Image/style.less +156 -0
  117. package/dist/esm/Input/index.d.ts +24 -0
  118. package/dist/esm/Input/index.js +151 -0
  119. package/dist/esm/Input/style.less +276 -0
  120. package/dist/esm/InputNumber/index.d.ts +47 -0
  121. package/dist/esm/InputNumber/index.js +316 -0
  122. package/dist/esm/InputNumber/style.less +392 -0
  123. package/dist/esm/Mentions/index.d.ts +57 -0
  124. package/dist/esm/Mentions/index.js +374 -0
  125. package/dist/esm/Mentions/style.less +297 -0
  126. package/dist/esm/Popover/index.d.ts +30 -0
  127. package/dist/esm/Popover/index.js +126 -0
  128. package/dist/esm/Popover/style.less +279 -0
  129. package/dist/esm/QRCode/index.d.ts +30 -0
  130. package/dist/esm/QRCode/index.js +158 -0
  131. package/dist/esm/QRCode/style.less +201 -0
  132. package/dist/esm/Radio/index.d.ts +70 -0
  133. package/dist/esm/Radio/index.js +193 -0
  134. package/dist/esm/Radio/style.less +326 -0
  135. package/dist/esm/Rate/index.d.ts +37 -0
  136. package/dist/esm/Rate/index.js +143 -0
  137. package/dist/esm/Rate/style.less +170 -0
  138. package/dist/esm/Segmented/index.d.ts +31 -0
  139. package/dist/esm/Segmented/index.js +113 -0
  140. package/dist/esm/Segmented/style.less +167 -0
  141. package/dist/esm/Select/index.d.ts +67 -0
  142. package/dist/esm/Select/index.js +398 -0
  143. package/dist/esm/Select/style.less +523 -0
  144. package/dist/esm/Slider/index.d.ts +41 -0
  145. package/dist/esm/Slider/index.js +318 -0
  146. package/dist/esm/Slider/style.less +287 -0
  147. package/dist/esm/Statistic/index.d.ts +26 -0
  148. package/dist/esm/Statistic/index.js +65 -0
  149. package/dist/esm/Statistic/style.less +94 -0
  150. package/dist/esm/Switch/index.d.ts +28 -0
  151. package/dist/esm/Switch/index.js +63 -0
  152. package/dist/esm/Switch/style.less +212 -0
  153. package/dist/esm/Table/index.d.ts +188 -0
  154. package/dist/esm/Table/index.js +797 -0
  155. package/dist/esm/Table/style.less +663 -0
  156. package/dist/esm/Tag/index.d.ts +51 -0
  157. package/dist/esm/Tag/index.js +144 -0
  158. package/dist/esm/Tag/style.less +356 -0
  159. package/dist/esm/TimePicker/index.d.ts +51 -0
  160. package/dist/esm/TimePicker/index.js +327 -0
  161. package/dist/esm/TimePicker/style.less +384 -0
  162. package/dist/esm/Timeline/index.d.ts +47 -0
  163. package/dist/esm/Timeline/index.js +130 -0
  164. package/dist/esm/Timeline/style.less +265 -0
  165. package/dist/esm/Tooltip/index.d.ts +53 -0
  166. package/dist/esm/Tooltip/index.js +471 -0
  167. package/dist/esm/Tooltip/style.less +237 -0
  168. package/dist/esm/Transfer/index.d.ts +52 -0
  169. package/dist/esm/Transfer/index.js +340 -0
  170. package/dist/esm/Transfer/style.less +331 -0
  171. package/dist/esm/TreeSelect/index.d.ts +54 -0
  172. package/dist/esm/TreeSelect/index.js +369 -0
  173. package/dist/esm/TreeSelect/style.less +471 -0
  174. package/dist/esm/Upload/index.d.ts +65 -0
  175. package/dist/esm/Upload/index.js +513 -0
  176. package/dist/esm/Upload/style.less +424 -0
  177. package/dist/esm/index.d.ts +58 -0
  178. package/dist/esm/index.js +30 -1
  179. package/package.json +6 -3
@@ -0,0 +1,57 @@
1
+ import React from 'react';
2
+ import './style.less';
3
+ export interface MentionOption {
4
+ /** 选项值 */
5
+ value: string;
6
+ /** 显示文本 */
7
+ label?: React.ReactNode;
8
+ /** 是否禁用 */
9
+ disabled?: boolean;
10
+ }
11
+ export interface MentionsProps extends Omit<React.TextareaHTMLAttributes<HTMLTextAreaElement>, 'value' | 'defaultValue' | 'onChange' | 'prefix' | 'onSelect'> {
12
+ /** 当前值 */
13
+ value?: string;
14
+ /** 默认值 */
15
+ defaultValue?: string;
16
+ /** 提及选项 */
17
+ options?: MentionOption[] | string[];
18
+ /** 触发字符 */
19
+ prefix?: string | string[];
20
+ /** 分隔符 */
21
+ split?: string;
22
+ /** 占位符 */
23
+ placeholder?: string;
24
+ /** 是否禁用 */
25
+ disabled?: boolean;
26
+ /** 尺寸 */
27
+ size?: 'large' | 'middle' | 'small';
28
+ /** 状态 */
29
+ status?: 'error' | 'warning';
30
+ /** 自动调整高度 */
31
+ autoSize?: boolean | {
32
+ minRows?: number;
33
+ maxRows?: number;
34
+ };
35
+ /** 过滤选项 */
36
+ filterOption?: boolean | ((input: string, option: MentionOption) => boolean);
37
+ /** 无匹配时的内容 */
38
+ notFoundContent?: React.ReactNode;
39
+ /** 获取选项时的加载状态 */
40
+ loading?: boolean;
41
+ /** 值变化回调 */
42
+ onChange?: (value: string) => void;
43
+ /** 选中回调 */
44
+ onSelect?: (option: MentionOption, prefix: string) => void;
45
+ /** 搜索回调 */
46
+ onSearch?: (text: string, prefix: string) => void;
47
+ /** 失焦回调 */
48
+ onBlur?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;
49
+ /** 聚焦回调 */
50
+ onFocus?: (e: React.FocusEvent<HTMLTextAreaElement>) => void;
51
+ /** 自定义类名 */
52
+ className?: string;
53
+ /** 自定义样式 */
54
+ style?: React.CSSProperties;
55
+ }
56
+ export declare const Mentions: React.ForwardRefExoticComponent<MentionsProps & React.RefAttributes<HTMLTextAreaElement>>;
57
+ export default Mentions;
@@ -0,0 +1,374 @@
1
+ function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
2
+ var _excluded = ["value", "defaultValue", "options", "prefix", "split", "placeholder", "disabled", "size", "status", "autoSize", "filterOption", "notFoundContent", "loading", "onChange", "onSelect", "onSearch", "onFocus", "onBlur", "className", "style", "rows"];
3
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
4
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
5
+ function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
6
+ function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
7
+ function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
8
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
9
+ function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
10
+ function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
11
+ function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
12
+ function _iterableToArrayLimit(r, l) { var t = null == r ? null : "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (null != t) { var e, n, i, u, a = [], f = !0, o = !1; try { if (i = (t = t.call(r)).next, 0 === l) { if (Object(t) !== t) return; f = !1; } else for (; !(f = (e = i.call(t)).done) && (a.push(e.value), a.length !== l); f = !0); } catch (r) { o = !0, n = r; } finally { try { if (!f && null != t.return && (u = t.return(), Object(u) !== u)) return; } finally { if (o) throw n; } } return a; } }
13
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
14
+ function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; }
15
+ function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; }
16
+ import React, { forwardRef, useCallback, useRef, useState, useEffect } from 'react';
17
+ import "./style.less";
18
+
19
+ // ============ Option Type ============
20
+
21
+ // ============ Mentions Props ============
22
+ import { jsx as _jsx } from "react/jsx-runtime";
23
+ import { jsxs as _jsxs } from "react/jsx-runtime";
24
+ // ============ Mentions Component ============
25
+ export var Mentions = /*#__PURE__*/forwardRef(function (props, ref) {
26
+ var controlledValue = props.value,
27
+ _props$defaultValue = props.defaultValue,
28
+ defaultValue = _props$defaultValue === void 0 ? '' : _props$defaultValue,
29
+ _props$options = props.options,
30
+ options = _props$options === void 0 ? [] : _props$options,
31
+ _props$prefix = props.prefix,
32
+ prefixConfig = _props$prefix === void 0 ? '@' : _props$prefix,
33
+ _props$split = props.split,
34
+ split = _props$split === void 0 ? ' ' : _props$split,
35
+ placeholder = props.placeholder,
36
+ _props$disabled = props.disabled,
37
+ disabled = _props$disabled === void 0 ? false : _props$disabled,
38
+ _props$size = props.size,
39
+ size = _props$size === void 0 ? 'middle' : _props$size,
40
+ status = props.status,
41
+ _props$autoSize = props.autoSize,
42
+ autoSize = _props$autoSize === void 0 ? false : _props$autoSize,
43
+ _props$filterOption = props.filterOption,
44
+ filterOption = _props$filterOption === void 0 ? true : _props$filterOption,
45
+ _props$notFoundConten = props.notFoundContent,
46
+ notFoundContent = _props$notFoundConten === void 0 ? '无匹配结果' : _props$notFoundConten,
47
+ _props$loading = props.loading,
48
+ loading = _props$loading === void 0 ? false : _props$loading,
49
+ onChange = props.onChange,
50
+ onSelect = props.onSelect,
51
+ onSearch = props.onSearch,
52
+ onFocus = props.onFocus,
53
+ onBlur = props.onBlur,
54
+ _props$className = props.className,
55
+ className = _props$className === void 0 ? '' : _props$className,
56
+ style = props.style,
57
+ _props$rows = props.rows,
58
+ rows = _props$rows === void 0 ? 3 : _props$rows,
59
+ rest = _objectWithoutProperties(props, _excluded);
60
+ var _useState = useState(defaultValue),
61
+ _useState2 = _slicedToArray(_useState, 2),
62
+ internalValue = _useState2[0],
63
+ setInternalValue = _useState2[1];
64
+ var _useState3 = useState(false),
65
+ _useState4 = _slicedToArray(_useState3, 2),
66
+ isOpen = _useState4[0],
67
+ setIsOpen = _useState4[1];
68
+ var _useState5 = useState(-1),
69
+ _useState6 = _slicedToArray(_useState5, 2),
70
+ activeIndex = _useState6[0],
71
+ setActiveIndex = _useState6[1];
72
+ var _useState7 = useState(''),
73
+ _useState8 = _slicedToArray(_useState7, 2),
74
+ searchText = _useState8[0],
75
+ setSearchText = _useState8[1];
76
+ var _useState9 = useState(''),
77
+ _useState10 = _slicedToArray(_useState9, 2),
78
+ currentPrefix = _useState10[0],
79
+ setCurrentPrefix = _useState10[1];
80
+ var _useState11 = useState({
81
+ start: 0,
82
+ end: 0
83
+ }),
84
+ _useState12 = _slicedToArray(_useState11, 2),
85
+ mentionPosition = _useState12[0],
86
+ setMentionPosition = _useState12[1];
87
+ var _useState13 = useState({
88
+ top: 0,
89
+ left: 0
90
+ }),
91
+ _useState14 = _slicedToArray(_useState13, 2),
92
+ dropdownPosition = _useState14[0],
93
+ setDropdownPosition = _useState14[1];
94
+ var containerRef = useRef(null);
95
+ var textareaRef = useRef(null);
96
+ var dropdownRef = useRef(null);
97
+ var measureRef = useRef(null);
98
+ var value = controlledValue !== undefined ? controlledValue : internalValue;
99
+
100
+ // 标准化前缀配置
101
+ var prefixes = Array.isArray(prefixConfig) ? prefixConfig : [prefixConfig];
102
+
103
+ // 标准化选项
104
+ var normalizedOptions = options.map(function (opt) {
105
+ return typeof opt === 'string' ? {
106
+ value: opt,
107
+ label: opt
108
+ } : opt;
109
+ });
110
+
111
+ // 过滤选项
112
+ var filteredOptions = normalizedOptions.filter(function (option) {
113
+ if (!filterOption) return true;
114
+ if (typeof filterOption === 'function') {
115
+ return filterOption(searchText, option);
116
+ }
117
+ // 默认过滤:值包含搜索内容(不区分大小写)
118
+ return option.value.toLowerCase().includes(searchText.toLowerCase());
119
+ });
120
+
121
+ // 设置 ref
122
+ var setTextareaRef = useCallback(function (node) {
123
+ textareaRef.current = node;
124
+ if (typeof ref === 'function') {
125
+ ref(node);
126
+ } else if (ref && 'current' in ref) {
127
+ ref.current = node;
128
+ }
129
+ }, [ref]);
130
+
131
+ // 计算光标位置对应的坐标
132
+ var getCursorCoordinates = useCallback(function (textarea, position) {
133
+ if (!measureRef.current) return {
134
+ top: 0,
135
+ left: 0
136
+ };
137
+ var div = measureRef.current;
138
+ var textBeforeCursor = textarea.value.substring(0, position);
139
+
140
+ // 复制 textarea 的样式到测量元素
141
+ var computedStyle = window.getComputedStyle(textarea);
142
+ div.style.font = computedStyle.font;
143
+ div.style.padding = computedStyle.padding;
144
+ div.style.border = computedStyle.border;
145
+ div.style.width = "".concat(textarea.clientWidth, "px");
146
+ div.textContent = textBeforeCursor;
147
+
148
+ // 添加一个光标标记
149
+ var cursor = document.createElement('span');
150
+ cursor.textContent = '|';
151
+ div.appendChild(cursor);
152
+ var rect = textarea.getBoundingClientRect();
153
+ var cursorRect = cursor.getBoundingClientRect();
154
+ return {
155
+ top: cursorRect.top - rect.top + textarea.scrollTop + 20,
156
+ left: cursorRect.left - rect.left
157
+ };
158
+ }, []);
159
+
160
+ // 检测提及触发
161
+ var detectMention = useCallback(function (text, cursorPos) {
162
+ // 从光标位置向前查找最近的前缀
163
+ var mentionStart = -1;
164
+ var detectedPrefix = '';
165
+ for (var i = cursorPos - 1; i >= 0; i--) {
166
+ var char = text[i];
167
+
168
+ // 遇到空格或换行,停止查找
169
+ if (char === ' ' || char === '\n') {
170
+ break;
171
+ }
172
+
173
+ // 检查是否是前缀字符
174
+ if (prefixes.includes(char)) {
175
+ mentionStart = i;
176
+ detectedPrefix = char;
177
+ break;
178
+ }
179
+ }
180
+ if (mentionStart >= 0) {
181
+ var mentionEnd = cursorPos;
182
+ var search = text.substring(mentionStart + 1, mentionEnd);
183
+ return {
184
+ active: true,
185
+ prefix: detectedPrefix,
186
+ start: mentionStart,
187
+ end: mentionEnd,
188
+ search: search
189
+ };
190
+ }
191
+ return {
192
+ active: false,
193
+ prefix: '',
194
+ start: 0,
195
+ end: 0,
196
+ search: ''
197
+ };
198
+ }, [prefixes]);
199
+
200
+ // 输入变化
201
+ var handleChange = useCallback(function (e) {
202
+ var newValue = e.target.value;
203
+ var cursorPos = e.target.selectionStart || 0;
204
+ if (controlledValue === undefined) {
205
+ setInternalValue(newValue);
206
+ }
207
+ onChange === null || onChange === void 0 || onChange(newValue);
208
+
209
+ // 检测提及
210
+ var mention = detectMention(newValue, cursorPos);
211
+ if (mention.active) {
212
+ setSearchText(mention.search);
213
+ setCurrentPrefix(mention.prefix);
214
+ setMentionPosition({
215
+ start: mention.start,
216
+ end: mention.end
217
+ });
218
+ setIsOpen(true);
219
+ setActiveIndex(-1);
220
+ onSearch === null || onSearch === void 0 || onSearch(mention.search, mention.prefix);
221
+
222
+ // 计算下拉框位置
223
+ if (textareaRef.current) {
224
+ var coords = getCursorCoordinates(textareaRef.current, mention.start);
225
+ setDropdownPosition(coords);
226
+ }
227
+ } else {
228
+ setIsOpen(false);
229
+ setSearchText('');
230
+ setCurrentPrefix('');
231
+ }
232
+ }, [controlledValue, onChange, detectMention, onSearch, getCursorCoordinates]);
233
+
234
+ // 选择选项
235
+ var handleSelect = useCallback(function (option) {
236
+ if (option.disabled || !textareaRef.current) return;
237
+ var textarea = textareaRef.current;
238
+ var before = value.substring(0, mentionPosition.start);
239
+ var after = value.substring(mentionPosition.end);
240
+ var newValue = "".concat(before).concat(currentPrefix).concat(option.value).concat(split).concat(after);
241
+ var newCursorPos = before.length + currentPrefix.length + option.value.length + split.length;
242
+ if (controlledValue === undefined) {
243
+ setInternalValue(newValue);
244
+ }
245
+ onChange === null || onChange === void 0 || onChange(newValue);
246
+ onSelect === null || onSelect === void 0 || onSelect(option, currentPrefix);
247
+ setIsOpen(false);
248
+ setSearchText('');
249
+ setCurrentPrefix('');
250
+
251
+ // 恢复焦点并设置光标位置
252
+ setTimeout(function () {
253
+ textarea.focus();
254
+ textarea.setSelectionRange(newCursorPos, newCursorPos);
255
+ }, 0);
256
+ }, [value, mentionPosition, currentPrefix, split, controlledValue, onChange, onSelect]);
257
+
258
+ // 键盘导航
259
+ var handleKeyDown = useCallback(function (e) {
260
+ if (!isOpen || filteredOptions.length === 0) return;
261
+ switch (e.key) {
262
+ case 'ArrowDown':
263
+ e.preventDefault();
264
+ setActiveIndex(function (prev) {
265
+ var next = prev + 1;
266
+ return next >= filteredOptions.length ? 0 : next;
267
+ });
268
+ break;
269
+ case 'ArrowUp':
270
+ e.preventDefault();
271
+ setActiveIndex(function (prev) {
272
+ var next = prev - 1;
273
+ return next < 0 ? filteredOptions.length - 1 : next;
274
+ });
275
+ break;
276
+ case 'Enter':
277
+ if (activeIndex >= 0 && activeIndex < filteredOptions.length) {
278
+ e.preventDefault();
279
+ handleSelect(filteredOptions[activeIndex]);
280
+ }
281
+ break;
282
+ case 'Escape':
283
+ e.preventDefault();
284
+ setIsOpen(false);
285
+ break;
286
+ }
287
+ }, [isOpen, filteredOptions, activeIndex, handleSelect]);
288
+
289
+ // 聚焦
290
+ var handleFocus = useCallback(function (e) {
291
+ onFocus === null || onFocus === void 0 || onFocus(e);
292
+ }, [onFocus]);
293
+
294
+ // 失焦
295
+ var handleBlur = useCallback(function (e) {
296
+ // 延迟关闭,允许点击选项
297
+ setTimeout(function () {
298
+ setIsOpen(false);
299
+ }, 150);
300
+ onBlur === null || onBlur === void 0 || onBlur(e);
301
+ }, [onBlur]);
302
+
303
+ // 滚动到激活项
304
+ useEffect(function () {
305
+ if (activeIndex >= 0 && dropdownRef.current) {
306
+ var activeItem = dropdownRef.current.querySelector('.kage-mentions-option-active');
307
+ activeItem === null || activeItem === void 0 || activeItem.scrollIntoView({
308
+ block: 'nearest'
309
+ });
310
+ }
311
+ }, [activeIndex]);
312
+
313
+ // 点击外部关闭
314
+ useEffect(function () {
315
+ var handleClickOutside = function handleClickOutside(e) {
316
+ if (containerRef.current && !containerRef.current.contains(e.target)) {
317
+ setIsOpen(false);
318
+ }
319
+ };
320
+ document.addEventListener('mousedown', handleClickOutside);
321
+ return function () {
322
+ return document.removeEventListener('mousedown', handleClickOutside);
323
+ };
324
+ }, []);
325
+ var classNames = ['kage-mentions', "kage-mentions-".concat(size), disabled && 'kage-mentions-disabled', status && "kage-mentions-status-".concat(status), isOpen && 'kage-mentions-open', className].filter(Boolean).join(' ');
326
+ return /*#__PURE__*/_jsxs("div", {
327
+ ref: containerRef,
328
+ className: classNames,
329
+ style: style,
330
+ children: [/*#__PURE__*/_jsx("textarea", _objectSpread({
331
+ ref: setTextareaRef,
332
+ className: "kage-mentions-textarea",
333
+ value: value,
334
+ placeholder: placeholder,
335
+ disabled: disabled,
336
+ rows: rows,
337
+ onChange: handleChange,
338
+ onFocus: handleFocus,
339
+ onBlur: handleBlur,
340
+ onKeyDown: handleKeyDown
341
+ }, rest)), /*#__PURE__*/_jsx("div", {
342
+ ref: measureRef,
343
+ className: "kage-mentions-measure"
344
+ }), isOpen && /*#__PURE__*/_jsx("div", {
345
+ ref: dropdownRef,
346
+ className: "kage-mentions-dropdown",
347
+ style: {
348
+ top: dropdownPosition.top,
349
+ left: dropdownPosition.left
350
+ },
351
+ children: loading ? /*#__PURE__*/_jsx("div", {
352
+ className: "kage-mentions-loading",
353
+ children: "\u52A0\u8F7D\u4E2D..."
354
+ }) : filteredOptions.length > 0 ? filteredOptions.map(function (option, index) {
355
+ var optionClassNames = ['kage-mentions-option', option.disabled && 'kage-mentions-option-disabled', index === activeIndex && 'kage-mentions-option-active'].filter(Boolean).join(' ');
356
+ return /*#__PURE__*/_jsx("div", {
357
+ className: optionClassNames,
358
+ onClick: function onClick() {
359
+ return handleSelect(option);
360
+ },
361
+ onMouseEnter: function onMouseEnter() {
362
+ return setActiveIndex(index);
363
+ },
364
+ children: option.label || option.value
365
+ }, option.value);
366
+ }) : /*#__PURE__*/_jsx("div", {
367
+ className: "kage-mentions-empty",
368
+ children: notFoundContent
369
+ })
370
+ })]
371
+ });
372
+ });
373
+ Mentions.displayName = 'Mentions';
374
+ export default Mentions;