wssf-kage-ui 0.1.0 → 0.1.1

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 (132) hide show
  1. package/README.md +4 -4
  2. package/dist/cjs/Anchor/index.d.ts +56 -0
  3. package/dist/cjs/Anchor/index.js +307 -0
  4. package/dist/cjs/Anchor/style.less +183 -0
  5. package/dist/cjs/AutoComplete/index.d.ts +54 -0
  6. package/dist/cjs/AutoComplete/index.js +273 -0
  7. package/dist/cjs/AutoComplete/style.less +325 -0
  8. package/dist/cjs/Breadcrumb/index.d.ts +51 -0
  9. package/dist/cjs/Breadcrumb/index.js +129 -0
  10. package/dist/cjs/Breadcrumb/style.less +96 -0
  11. package/dist/cjs/Cascader/index.d.ts +53 -0
  12. package/dist/cjs/Cascader/index.js +338 -0
  13. package/dist/cjs/Cascader/style.less +457 -0
  14. package/dist/cjs/Checkbox/index.d.ts +52 -0
  15. package/dist/cjs/Checkbox/index.js +158 -0
  16. package/dist/cjs/Checkbox/style.less +211 -0
  17. package/dist/cjs/ColorPicker/index.d.ts +28 -0
  18. package/dist/cjs/ColorPicker/index.js +381 -0
  19. package/dist/cjs/ColorPicker/style.less +276 -0
  20. package/dist/cjs/DatePicker/index.d.ts +32 -0
  21. package/dist/cjs/DatePicker/index.js +377 -0
  22. package/dist/cjs/DatePicker/style.less +498 -0
  23. package/dist/cjs/Divider/index.d.ts +24 -0
  24. package/dist/cjs/Divider/index.js +75 -0
  25. package/dist/cjs/Divider/style.less +144 -0
  26. package/dist/cjs/Dropdown/index.d.ts +88 -0
  27. package/dist/cjs/Dropdown/index.js +253 -0
  28. package/dist/cjs/Dropdown/style.less +430 -0
  29. package/dist/cjs/Flex/index.d.ts +37 -0
  30. package/dist/cjs/Flex/index.js +76 -0
  31. package/dist/cjs/Flex/style.less +13 -0
  32. package/dist/cjs/Form/index.d.ts +89 -0
  33. package/dist/cjs/Form/index.js +421 -0
  34. package/dist/cjs/Form/style.less +203 -0
  35. package/dist/cjs/Grid/index.d.ts +69 -0
  36. package/dist/cjs/Grid/index.js +171 -0
  37. package/dist/cjs/Grid/style.less +273 -0
  38. package/dist/cjs/Layout/index.d.ts +74 -0
  39. package/dist/cjs/Layout/index.js +166 -0
  40. package/dist/cjs/Layout/style.less +145 -0
  41. package/dist/cjs/Masonry/index.d.ts +18 -0
  42. package/dist/cjs/Masonry/index.js +146 -0
  43. package/dist/cjs/Masonry/style.less +15 -0
  44. package/dist/cjs/Menu/index.d.ts +87 -0
  45. package/dist/cjs/Menu/index.js +306 -0
  46. package/dist/cjs/Menu/style.less +363 -0
  47. package/dist/cjs/Pagination/index.d.ts +38 -0
  48. package/dist/cjs/Pagination/index.js +255 -0
  49. package/dist/cjs/Pagination/style.less +353 -0
  50. package/dist/cjs/Space/index.d.ts +41 -0
  51. package/dist/cjs/Space/index.js +137 -0
  52. package/dist/cjs/Space/style.less +116 -0
  53. package/dist/cjs/Splitter/index.d.ts +43 -0
  54. package/dist/cjs/Splitter/index.js +219 -0
  55. package/dist/cjs/Splitter/style.less +99 -0
  56. package/dist/cjs/Steps/index.d.ts +58 -0
  57. package/dist/cjs/Steps/index.js +180 -0
  58. package/dist/cjs/Steps/style.less +507 -0
  59. package/dist/cjs/Tabs/index.d.ts +58 -0
  60. package/dist/cjs/Tabs/index.js +196 -0
  61. package/dist/cjs/Tabs/style.less +423 -0
  62. package/dist/cjs/Typography/index.d.ts +102 -0
  63. package/dist/cjs/Typography/index.js +168 -0
  64. package/dist/cjs/Typography/style.less +246 -0
  65. package/dist/cjs/index.d.ts +42 -0
  66. package/dist/cjs/index.js +260 -1
  67. package/dist/esm/Anchor/index.d.ts +56 -0
  68. package/dist/esm/Anchor/index.js +302 -0
  69. package/dist/esm/Anchor/style.less +183 -0
  70. package/dist/esm/AutoComplete/index.d.ts +54 -0
  71. package/dist/esm/AutoComplete/index.js +268 -0
  72. package/dist/esm/AutoComplete/style.less +325 -0
  73. package/dist/esm/Breadcrumb/index.d.ts +51 -0
  74. package/dist/esm/Breadcrumb/index.js +124 -0
  75. package/dist/esm/Breadcrumb/style.less +96 -0
  76. package/dist/esm/Cascader/index.d.ts +53 -0
  77. package/dist/esm/Cascader/index.js +333 -0
  78. package/dist/esm/Cascader/style.less +457 -0
  79. package/dist/esm/Checkbox/index.d.ts +52 -0
  80. package/dist/esm/Checkbox/index.js +152 -0
  81. package/dist/esm/Checkbox/style.less +211 -0
  82. package/dist/esm/ColorPicker/index.d.ts +28 -0
  83. package/dist/esm/ColorPicker/index.js +375 -0
  84. package/dist/esm/ColorPicker/style.less +276 -0
  85. package/dist/esm/DatePicker/index.d.ts +32 -0
  86. package/dist/esm/DatePicker/index.js +371 -0
  87. package/dist/esm/DatePicker/style.less +498 -0
  88. package/dist/esm/Divider/index.d.ts +24 -0
  89. package/dist/esm/Divider/index.js +68 -0
  90. package/dist/esm/Divider/style.less +144 -0
  91. package/dist/esm/Dropdown/index.d.ts +88 -0
  92. package/dist/esm/Dropdown/index.js +249 -0
  93. package/dist/esm/Dropdown/style.less +430 -0
  94. package/dist/esm/Flex/index.d.ts +37 -0
  95. package/dist/esm/Flex/index.js +69 -0
  96. package/dist/esm/Flex/style.less +13 -0
  97. package/dist/esm/Form/index.d.ts +89 -0
  98. package/dist/esm/Form/index.js +416 -0
  99. package/dist/esm/Form/style.less +203 -0
  100. package/dist/esm/Grid/index.d.ts +69 -0
  101. package/dist/esm/Grid/index.js +165 -0
  102. package/dist/esm/Grid/style.less +273 -0
  103. package/dist/esm/Layout/index.d.ts +74 -0
  104. package/dist/esm/Layout/index.js +161 -0
  105. package/dist/esm/Layout/style.less +145 -0
  106. package/dist/esm/Masonry/index.d.ts +18 -0
  107. package/dist/esm/Masonry/index.js +138 -0
  108. package/dist/esm/Masonry/style.less +15 -0
  109. package/dist/esm/Menu/index.d.ts +87 -0
  110. package/dist/esm/Menu/index.js +301 -0
  111. package/dist/esm/Menu/style.less +363 -0
  112. package/dist/esm/Pagination/index.d.ts +38 -0
  113. package/dist/esm/Pagination/index.js +247 -0
  114. package/dist/esm/Pagination/style.less +353 -0
  115. package/dist/esm/Space/index.d.ts +41 -0
  116. package/dist/esm/Space/index.js +131 -0
  117. package/dist/esm/Space/style.less +116 -0
  118. package/dist/esm/Splitter/index.d.ts +43 -0
  119. package/dist/esm/Splitter/index.js +214 -0
  120. package/dist/esm/Splitter/style.less +99 -0
  121. package/dist/esm/Steps/index.d.ts +58 -0
  122. package/dist/esm/Steps/index.js +174 -0
  123. package/dist/esm/Steps/style.less +507 -0
  124. package/dist/esm/Tabs/index.d.ts +58 -0
  125. package/dist/esm/Tabs/index.js +193 -0
  126. package/dist/esm/Tabs/style.less +423 -0
  127. package/dist/esm/Typography/index.d.ts +102 -0
  128. package/dist/esm/Typography/index.js +161 -0
  129. package/dist/esm/Typography/style.less +246 -0
  130. package/dist/esm/index.d.ts +42 -0
  131. package/dist/esm/index.js +22 -1
  132. package/package.json +13 -10
@@ -0,0 +1,183 @@
1
+ // Anchor 锚点组件样式
2
+
3
+ @prefix: kage-anchor;
4
+
5
+ // 颜色变量
6
+ @anchor-bg: transparent;
7
+ @anchor-border-color: #f0f0f0;
8
+ @anchor-link-color: rgba(0, 0, 0, 0.65);
9
+ @anchor-link-hover-color: #1f1f1f;
10
+ @anchor-link-active-color: #6366f1;
11
+ @anchor-ink-color: #6366f1;
12
+
13
+ .@{prefix} {
14
+ position: relative;
15
+ padding-left: 2px;
16
+ box-sizing: border-box;
17
+
18
+ // ============ 垂直方向 ============
19
+ &-vertical {
20
+ &::before {
21
+ content: '';
22
+ position: absolute;
23
+ left: 0;
24
+ top: 0;
25
+ bottom: 0;
26
+ width: 2px;
27
+ background: @anchor-border-color;
28
+ }
29
+
30
+ .@{prefix}-ink {
31
+ position: absolute;
32
+ left: 0;
33
+ width: 2px;
34
+ height: 8px;
35
+ background: @anchor-ink-color;
36
+ border-radius: 1px;
37
+ transition: top 0.2s ease, opacity 0.2s ease;
38
+ opacity: 0;
39
+
40
+ &-visible {
41
+ opacity: 1;
42
+ }
43
+ }
44
+
45
+ .@{prefix}-link {
46
+ display: block;
47
+ padding: 4px 0 4px 16px;
48
+ }
49
+ }
50
+
51
+ // ============ 水平方向 ============
52
+ &-horizontal {
53
+ position: relative;
54
+ padding-left: 0;
55
+ padding-bottom: 2px;
56
+
57
+ &::before {
58
+ content: '';
59
+ position: absolute;
60
+ left: 0;
61
+ right: 0;
62
+ bottom: 0;
63
+ height: 2px;
64
+ background: @anchor-border-color;
65
+ }
66
+
67
+ .@{prefix}-ink {
68
+ position: absolute;
69
+ bottom: 0;
70
+ width: 20px;
71
+ height: 2px;
72
+ background: @anchor-ink-color;
73
+ border-radius: 1px;
74
+ transition: left 0.2s ease, opacity 0.2s ease;
75
+ opacity: 0;
76
+
77
+ &-visible {
78
+ opacity: 1;
79
+ }
80
+ }
81
+
82
+ .@{prefix}-content {
83
+ display: flex;
84
+ gap: 0;
85
+ }
86
+
87
+ .@{prefix}-link-wrapper {
88
+ display: inline-flex;
89
+ }
90
+
91
+ .@{prefix}-link {
92
+ display: inline-block;
93
+ padding: 8px 16px;
94
+ }
95
+
96
+ .@{prefix}-link-children {
97
+ display: none;
98
+ }
99
+ }
100
+
101
+ // ============ 固定模式 ============
102
+ &-fixed {
103
+ background: #fff;
104
+ padding: 8px 12px;
105
+ border-radius: 8px;
106
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
107
+ }
108
+ }
109
+
110
+ // ============ 链接样式 ============
111
+ .@{prefix}-link-wrapper {
112
+ position: relative;
113
+ }
114
+
115
+ .@{prefix}-link {
116
+ color: @anchor-link-color;
117
+ text-decoration: none;
118
+ font-size: 14px;
119
+ line-height: 1.5;
120
+ transition: color 0.2s ease;
121
+ white-space: nowrap;
122
+ overflow: hidden;
123
+ text-overflow: ellipsis;
124
+
125
+ &:hover {
126
+ color: @anchor-link-hover-color;
127
+ }
128
+
129
+ &-active {
130
+ color: @anchor-link-active-color;
131
+ font-weight: 500;
132
+ }
133
+ }
134
+
135
+ .@{prefix}-link-children {
136
+ .@{prefix}-link {
137
+ font-size: 13px;
138
+ }
139
+ }
140
+
141
+ // ============ 暗色模式适配 ============
142
+ // 仅通过 dumi 主题选择器,不使用 prefers-color-scheme
143
+ // 避免系统暗色+dumi浅色主题时的冲突
144
+
145
+ [data-theme='dark'],
146
+ [data-prefers-color-scheme='dark'],
147
+ [data-prefers-color='dark'] {
148
+ .@{prefix} {
149
+ &::before {
150
+ background: rgba(255, 255, 255, 0.2);
151
+ }
152
+
153
+ &-fixed {
154
+ background: #1f1f1f;
155
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.3);
156
+ }
157
+ }
158
+
159
+ .@{prefix}-vertical::before {
160
+ background: rgba(255, 255, 255, 0.2);
161
+ }
162
+
163
+ .@{prefix}-horizontal::before {
164
+ background: rgba(255, 255, 255, 0.2);
165
+ }
166
+
167
+ .@{prefix}-link {
168
+ color: rgba(255, 255, 255, 0.65);
169
+
170
+ &:hover {
171
+ color: rgba(255, 255, 255, 0.85);
172
+ }
173
+ }
174
+
175
+ .@{prefix}-link-active {
176
+ color: #818cf8;
177
+ }
178
+
179
+ .@{prefix}-ink {
180
+ background: #818cf8;
181
+ }
182
+ }
183
+
@@ -0,0 +1,54 @@
1
+ import React from 'react';
2
+ import './style.less';
3
+ export interface AutoCompleteOption {
4
+ /** 选项值 */
5
+ value: string;
6
+ /** 显示文本 */
7
+ label?: React.ReactNode;
8
+ /** 是否禁用 */
9
+ disabled?: boolean;
10
+ }
11
+ export interface AutoCompleteProps {
12
+ /** 选项数据 */
13
+ options?: AutoCompleteOption[] | string[];
14
+ /** 当前值 */
15
+ value?: string;
16
+ /** 默认值 */
17
+ defaultValue?: string;
18
+ /** 占位符 */
19
+ placeholder?: string;
20
+ /** 是否禁用 */
21
+ disabled?: boolean;
22
+ /** 允许清除 */
23
+ allowClear?: boolean;
24
+ /** 尺寸 */
25
+ size?: 'large' | 'middle' | 'small';
26
+ /** 状态 */
27
+ status?: 'error' | 'warning';
28
+ /** 下拉菜单是否与输入框同宽 */
29
+ popupMatchSelectWidth?: boolean | number;
30
+ /** 选中回调 */
31
+ onSelect?: (value: string, option: AutoCompleteOption) => void;
32
+ /** 搜索回调 */
33
+ onSearch?: (value: string) => void;
34
+ /** 值改变回调 */
35
+ onChange?: (value: string) => void;
36
+ /** 失焦回调 */
37
+ onBlur?: (e: React.FocusEvent) => void;
38
+ /** 聚焦回调 */
39
+ onFocus?: (e: React.FocusEvent) => void;
40
+ /** 下拉菜单打开/关闭回调 */
41
+ onDropdownVisibleChange?: (open: boolean) => void;
42
+ /** 自定义过滤 */
43
+ filterOption?: boolean | ((inputValue: string, option: AutoCompleteOption) => boolean);
44
+ /** 无匹配时的内容 */
45
+ notFoundContent?: React.ReactNode;
46
+ /** 自定义类名 */
47
+ className?: string;
48
+ /** 自定义样式 */
49
+ style?: React.CSSProperties;
50
+ /** 自定义输入框 */
51
+ children?: React.ReactElement;
52
+ }
53
+ export declare const AutoComplete: React.FC<AutoCompleteProps>;
54
+ export default AutoComplete;
@@ -0,0 +1,268 @@
1
+ function _slicedToArray(arr, i) { return _arrayWithHoles(arr) || _iterableToArrayLimit(arr, i) || _unsupportedIterableToArray(arr, i) || _nonIterableRest(); }
2
+ 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."); }
3
+ 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); }
4
+ 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; }
5
+ 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; } }
6
+ function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
7
+ import React, { useState, useRef, useEffect, useCallback } from 'react';
8
+ import "./style.less";
9
+
10
+ // ============ Option Type ============
11
+
12
+ // ============ AutoComplete Props ============
13
+ import { jsx as _jsx } from "react/jsx-runtime";
14
+ import { jsxs as _jsxs } from "react/jsx-runtime";
15
+ // ============ AutoComplete Component ============
16
+ export var AutoComplete = function AutoComplete(_ref) {
17
+ var _ref$options = _ref.options,
18
+ options = _ref$options === void 0 ? [] : _ref$options,
19
+ controlledValue = _ref.value,
20
+ _ref$defaultValue = _ref.defaultValue,
21
+ defaultValue = _ref$defaultValue === void 0 ? '' : _ref$defaultValue,
22
+ placeholder = _ref.placeholder,
23
+ _ref$disabled = _ref.disabled,
24
+ disabled = _ref$disabled === void 0 ? false : _ref$disabled,
25
+ _ref$allowClear = _ref.allowClear,
26
+ allowClear = _ref$allowClear === void 0 ? false : _ref$allowClear,
27
+ _ref$size = _ref.size,
28
+ size = _ref$size === void 0 ? 'middle' : _ref$size,
29
+ status = _ref.status,
30
+ _ref$popupMatchSelect = _ref.popupMatchSelectWidth,
31
+ popupMatchSelectWidth = _ref$popupMatchSelect === void 0 ? true : _ref$popupMatchSelect,
32
+ onSelect = _ref.onSelect,
33
+ onSearch = _ref.onSearch,
34
+ onChange = _ref.onChange,
35
+ onBlur = _ref.onBlur,
36
+ onFocus = _ref.onFocus,
37
+ onDropdownVisibleChange = _ref.onDropdownVisibleChange,
38
+ _ref$filterOption = _ref.filterOption,
39
+ filterOption = _ref$filterOption === void 0 ? true : _ref$filterOption,
40
+ _ref$notFoundContent = _ref.notFoundContent,
41
+ notFoundContent = _ref$notFoundContent === void 0 ? '无匹配结果' : _ref$notFoundContent,
42
+ _ref$className = _ref.className,
43
+ className = _ref$className === void 0 ? '' : _ref$className,
44
+ style = _ref.style,
45
+ children = _ref.children;
46
+ var _useState = useState(defaultValue),
47
+ _useState2 = _slicedToArray(_useState, 2),
48
+ internalValue = _useState2[0],
49
+ setInternalValue = _useState2[1];
50
+ var _useState3 = useState(false),
51
+ _useState4 = _slicedToArray(_useState3, 2),
52
+ isOpen = _useState4[0],
53
+ setIsOpen = _useState4[1];
54
+ var _useState5 = useState(-1),
55
+ _useState6 = _slicedToArray(_useState5, 2),
56
+ activeIndex = _useState6[0],
57
+ setActiveIndex = _useState6[1];
58
+ var containerRef = useRef(null);
59
+ var inputRef = useRef(null);
60
+ var dropdownRef = useRef(null);
61
+ var value = controlledValue !== null && controlledValue !== void 0 ? controlledValue : internalValue;
62
+
63
+ // 标准化选项
64
+ var normalizedOptions = options.map(function (opt) {
65
+ return typeof opt === 'string' ? {
66
+ value: opt,
67
+ label: opt
68
+ } : opt;
69
+ });
70
+
71
+ // 过滤选项
72
+ var filteredOptions = normalizedOptions.filter(function (option) {
73
+ if (!filterOption) return true;
74
+ if (typeof filterOption === 'function') {
75
+ return filterOption(value, option);
76
+ }
77
+ // 默认过滤:值包含输入内容(不区分大小写)
78
+ return option.value.toLowerCase().includes(value.toLowerCase());
79
+ });
80
+
81
+ // 打开/关闭下拉
82
+ var setOpen = useCallback(function (open) {
83
+ setIsOpen(open);
84
+ onDropdownVisibleChange === null || onDropdownVisibleChange === void 0 || onDropdownVisibleChange(open);
85
+ if (!open) {
86
+ setActiveIndex(-1);
87
+ }
88
+ }, [onDropdownVisibleChange]);
89
+
90
+ // 输入变化
91
+ var handleInputChange = useCallback(function (e) {
92
+ var newValue = e.target.value;
93
+ if (controlledValue === undefined) {
94
+ setInternalValue(newValue);
95
+ }
96
+ onChange === null || onChange === void 0 || onChange(newValue);
97
+ onSearch === null || onSearch === void 0 || onSearch(newValue);
98
+ setOpen(true);
99
+ setActiveIndex(-1);
100
+ }, [controlledValue, onChange, onSearch, setOpen]);
101
+
102
+ // 选择选项
103
+ var handleSelect = useCallback(function (option) {
104
+ var _inputRef$current;
105
+ if (option.disabled) return;
106
+ if (controlledValue === undefined) {
107
+ setInternalValue(option.value);
108
+ }
109
+ onChange === null || onChange === void 0 || onChange(option.value);
110
+ onSelect === null || onSelect === void 0 || onSelect(option.value, option);
111
+ setOpen(false);
112
+ (_inputRef$current = inputRef.current) === null || _inputRef$current === void 0 || _inputRef$current.blur();
113
+ }, [controlledValue, onChange, onSelect, setOpen]);
114
+
115
+ // 清除
116
+ var handleClear = useCallback(function (e) {
117
+ var _inputRef$current2;
118
+ e.stopPropagation();
119
+ if (controlledValue === undefined) {
120
+ setInternalValue('');
121
+ }
122
+ onChange === null || onChange === void 0 || onChange('');
123
+ onSearch === null || onSearch === void 0 || onSearch('');
124
+ (_inputRef$current2 = inputRef.current) === null || _inputRef$current2 === void 0 || _inputRef$current2.focus();
125
+ }, [controlledValue, onChange, onSearch]);
126
+
127
+ // 聚焦
128
+ var handleFocus = useCallback(function (e) {
129
+ setOpen(true);
130
+ onFocus === null || onFocus === void 0 || onFocus(e);
131
+ }, [setOpen, onFocus]);
132
+
133
+ // 失焦
134
+ var handleBlur = useCallback(function (e) {
135
+ // 延迟关闭,允许点击选项
136
+ setTimeout(function () {
137
+ setOpen(false);
138
+ }, 150);
139
+ onBlur === null || onBlur === void 0 || onBlur(e);
140
+ }, [setOpen, onBlur]);
141
+
142
+ // 键盘导航
143
+ var handleKeyDown = useCallback(function (e) {
144
+ if (!isOpen) {
145
+ if (e.key === 'ArrowDown' || e.key === 'ArrowUp') {
146
+ setOpen(true);
147
+ }
148
+ return;
149
+ }
150
+ switch (e.key) {
151
+ case 'ArrowDown':
152
+ e.preventDefault();
153
+ setActiveIndex(function (prev) {
154
+ var next = prev + 1;
155
+ return next >= filteredOptions.length ? 0 : next;
156
+ });
157
+ break;
158
+ case 'ArrowUp':
159
+ e.preventDefault();
160
+ setActiveIndex(function (prev) {
161
+ var next = prev - 1;
162
+ return next < 0 ? filteredOptions.length - 1 : next;
163
+ });
164
+ break;
165
+ case 'Enter':
166
+ e.preventDefault();
167
+ if (activeIndex >= 0 && activeIndex < filteredOptions.length) {
168
+ handleSelect(filteredOptions[activeIndex]);
169
+ }
170
+ break;
171
+ case 'Escape':
172
+ setOpen(false);
173
+ break;
174
+ }
175
+ }, [isOpen, setOpen, activeIndex, filteredOptions, handleSelect]);
176
+
177
+ // 滚动到激活项
178
+ useEffect(function () {
179
+ if (activeIndex >= 0 && dropdownRef.current) {
180
+ var activeItem = dropdownRef.current.querySelector('.kage-autocomplete-option-active');
181
+ activeItem === null || activeItem === void 0 || activeItem.scrollIntoView({
182
+ block: 'nearest'
183
+ });
184
+ }
185
+ }, [activeIndex]);
186
+
187
+ // 点击外部关闭
188
+ useEffect(function () {
189
+ var handleClickOutside = function handleClickOutside(e) {
190
+ if (containerRef.current && !containerRef.current.contains(e.target)) {
191
+ setOpen(false);
192
+ }
193
+ };
194
+ document.addEventListener('mousedown', handleClickOutside);
195
+ return function () {
196
+ return document.removeEventListener('mousedown', handleClickOutside);
197
+ };
198
+ }, [setOpen]);
199
+ var classNames = ['kage-autocomplete', "kage-autocomplete-".concat(size), disabled && 'kage-autocomplete-disabled', status && "kage-autocomplete-status-".concat(status), isOpen && 'kage-autocomplete-open', className].filter(Boolean).join(' ');
200
+ var dropdownStyle = {};
201
+ if (typeof popupMatchSelectWidth === 'number') {
202
+ dropdownStyle.width = popupMatchSelectWidth;
203
+ } else if (popupMatchSelectWidth === false) {
204
+ var _containerRef$current;
205
+ dropdownStyle.minWidth = (_containerRef$current = containerRef.current) === null || _containerRef$current === void 0 ? void 0 : _containerRef$current.offsetWidth;
206
+ }
207
+
208
+ // 渲染输入框
209
+ var renderInput = function renderInput() {
210
+ if (children) {
211
+ return /*#__PURE__*/React.cloneElement(children, {
212
+ ref: inputRef,
213
+ value: value,
214
+ disabled: disabled,
215
+ onChange: handleInputChange,
216
+ onFocus: handleFocus,
217
+ onBlur: handleBlur,
218
+ onKeyDown: handleKeyDown
219
+ });
220
+ }
221
+ return /*#__PURE__*/_jsx("input", {
222
+ ref: inputRef,
223
+ type: "text",
224
+ className: "kage-autocomplete-input",
225
+ value: value,
226
+ placeholder: placeholder,
227
+ disabled: disabled,
228
+ onChange: handleInputChange,
229
+ onFocus: handleFocus,
230
+ onBlur: handleBlur,
231
+ onKeyDown: handleKeyDown
232
+ });
233
+ };
234
+ return /*#__PURE__*/_jsxs("div", {
235
+ ref: containerRef,
236
+ className: classNames,
237
+ style: style,
238
+ children: [/*#__PURE__*/_jsxs("div", {
239
+ className: "kage-autocomplete-selector",
240
+ children: [renderInput(), allowClear && value && !disabled && /*#__PURE__*/_jsx("span", {
241
+ className: "kage-autocomplete-clear",
242
+ onClick: handleClear,
243
+ children: "\xD7"
244
+ })]
245
+ }), isOpen && /*#__PURE__*/_jsx("div", {
246
+ ref: dropdownRef,
247
+ className: "kage-autocomplete-dropdown",
248
+ style: dropdownStyle,
249
+ children: filteredOptions.length > 0 ? filteredOptions.map(function (option, index) {
250
+ var optionClassNames = ['kage-autocomplete-option', option.disabled && 'kage-autocomplete-option-disabled', index === activeIndex && 'kage-autocomplete-option-active', option.value === value && 'kage-autocomplete-option-selected'].filter(Boolean).join(' ');
251
+ return /*#__PURE__*/_jsx("div", {
252
+ className: optionClassNames,
253
+ onClick: function onClick() {
254
+ return handleSelect(option);
255
+ },
256
+ onMouseEnter: function onMouseEnter() {
257
+ return setActiveIndex(index);
258
+ },
259
+ children: option.label || option.value
260
+ }, option.value);
261
+ }) : /*#__PURE__*/_jsx("div", {
262
+ className: "kage-autocomplete-empty",
263
+ children: notFoundContent
264
+ })
265
+ })]
266
+ });
267
+ };
268
+ export default AutoComplete;