@fjyueke/arco-mcp 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (191) hide show
  1. package/README.md +85 -0
  2. package/dist/index.d.ts +1 -0
  3. package/dist/index.js +244 -0
  4. package/metaData/components/action-sheet/doc.md +102 -0
  5. package/metaData/components/action-sheet/example/index.tsx +199 -0
  6. package/metaData/components/action-sheet/example/methods.tsx +6 -0
  7. package/metaData/components/avatar/doc.md +57 -0
  8. package/metaData/components/avatar/example/group.tsx +69 -0
  9. package/metaData/components/avatar/example/index.tsx +196 -0
  10. package/metaData/components/badge/doc.md +28 -0
  11. package/metaData/components/badge/example/index.tsx +128 -0
  12. package/metaData/components/button/doc.md +45 -0
  13. package/metaData/components/button/example/index.tsx +264 -0
  14. package/metaData/components/carousel/doc.md +89 -0
  15. package/metaData/components/carousel/example/index.tsx +1481 -0
  16. package/metaData/components/cell/doc.md +68 -0
  17. package/metaData/components/cell/example/arrow.tsx +13 -0
  18. package/metaData/components/cell/example/cell.tsx +71 -0
  19. package/metaData/components/cell/example/group.tsx +63 -0
  20. package/metaData/components/cell/example/index.tsx +19 -0
  21. package/metaData/components/checkbox/doc.md +91 -0
  22. package/metaData/components/checkbox/example/checkbox.tsx +158 -0
  23. package/metaData/components/checkbox/example/group.tsx +103 -0
  24. package/metaData/components/checkbox/example/index.tsx +25 -0
  25. package/metaData/components/circle-progress/doc.md +40 -0
  26. package/metaData/components/circle-progress/example/index.tsx +323 -0
  27. package/metaData/components/collapse/doc.md +74 -0
  28. package/metaData/components/collapse/example/collapse.tsx +183 -0
  29. package/metaData/components/collapse/example/group.tsx +136 -0
  30. package/metaData/components/collapse/example/index.tsx +16 -0
  31. package/metaData/components/collapse/example/utils.tsx +20 -0
  32. package/metaData/components/context-provider/doc.md +44 -0
  33. package/metaData/components/context-provider/example/index.tsx +208 -0
  34. package/metaData/components/count-down/doc.md +40 -0
  35. package/metaData/components/count-down/example/hooks.tsx +118 -0
  36. package/metaData/components/count-down/example/index.tsx +63 -0
  37. package/metaData/components/date-picker/doc.md +102 -0
  38. package/metaData/components/date-picker/example/index.tsx +545 -0
  39. package/metaData/components/dialog/doc.md +200 -0
  40. package/metaData/components/dialog/example/index.tsx +328 -0
  41. package/metaData/components/dialog/example/methods.tsx +56 -0
  42. package/metaData/components/divider/doc.md +25 -0
  43. package/metaData/components/divider/example/index.tsx +87 -0
  44. package/metaData/components/dropdown/doc.md +80 -0
  45. package/metaData/components/dropdown/example/dropdown.tsx +308 -0
  46. package/metaData/components/dropdown/example/index.tsx +19 -0
  47. package/metaData/components/dropdown/example/options.tsx +103 -0
  48. package/metaData/components/dropdown-menu/doc.md +91 -0
  49. package/metaData/components/dropdown-menu/example/dropdown-menu.tsx +270 -0
  50. package/metaData/components/dropdown-menu/example/index.tsx +16 -0
  51. package/metaData/components/ellipsis/doc.md +33 -0
  52. package/metaData/components/ellipsis/example/index.tsx +93 -0
  53. package/metaData/components/ellipsis/example/js-ellipsis.tsx +229 -0
  54. package/metaData/components/ellipsis/example/native-ellipsis.tsx +48 -0
  55. package/metaData/components/form/doc.md +90 -0
  56. package/metaData/components/form/example/form-item-context.tsx +8 -0
  57. package/metaData/components/form/example/form-item.tsx +378 -0
  58. package/metaData/components/form/example/index.tsx +87 -0
  59. package/metaData/components/form/example/linked-container.tsx +66 -0
  60. package/metaData/components/grid/doc.md +39 -0
  61. package/metaData/components/grid/example/index.tsx +252 -0
  62. package/metaData/components/icon/doc.md +15 -0
  63. package/metaData/components/icon/example/index.tsx +32 -0
  64. package/metaData/components/image/doc.md +62 -0
  65. package/metaData/components/image/example/index.tsx +528 -0
  66. package/metaData/components/image-picker/doc.md +116 -0
  67. package/metaData/components/image-picker/example/add-icon.tsx +14 -0
  68. package/metaData/components/image-picker/example/index.tsx +175 -0
  69. package/metaData/components/image-preview/doc.md +119 -0
  70. package/metaData/components/image-preview/example/index.tsx +1290 -0
  71. package/metaData/components/image-preview/example/methods.tsx +72 -0
  72. package/metaData/components/index-bar/doc.md +83 -0
  73. package/metaData/components/index-bar/example/group.tsx +93 -0
  74. package/metaData/components/index-bar/example/index.tsx +271 -0
  75. package/metaData/components/index-bar/example/side-bar.tsx +82 -0
  76. package/metaData/components/input/doc.md +60 -0
  77. package/metaData/components/input/example/hooks.tsx +259 -0
  78. package/metaData/components/input/example/index.tsx +134 -0
  79. package/metaData/components/input/example/props.tsx +183 -0
  80. package/metaData/components/keyboard/doc.md +73 -0
  81. package/metaData/components/keyboard/example/index.tsx +238 -0
  82. package/metaData/components/load-more/doc.md +48 -0
  83. package/metaData/components/load-more/example/index.tsx +395 -0
  84. package/metaData/components/loading/doc.md +34 -0
  85. package/metaData/components/loading/example/index.tsx +312 -0
  86. package/metaData/components/masking/doc.md +93 -0
  87. package/metaData/components/masking/example/index.tsx +410 -0
  88. package/metaData/components/masking/example/methods.tsx +88 -0
  89. package/metaData/components/nav-bar/doc.md +40 -0
  90. package/metaData/components/nav-bar/example/back-icon.tsx +28 -0
  91. package/metaData/components/nav-bar/example/index.tsx +305 -0
  92. package/metaData/components/notice-bar/doc.md +34 -0
  93. package/metaData/components/notice-bar/example/index.tsx +294 -0
  94. package/metaData/components/notify/doc.md +81 -0
  95. package/metaData/components/notify/example/index.tsx +171 -0
  96. package/metaData/components/notify/example/methods.tsx +83 -0
  97. package/metaData/components/pagination/doc.md +41 -0
  98. package/metaData/components/pagination/example/arrow.tsx +14 -0
  99. package/metaData/components/pagination/example/index.tsx +292 -0
  100. package/metaData/components/picker/doc.md +89 -0
  101. package/metaData/components/picker/example/index.tsx +217 -0
  102. package/metaData/components/picker-view/doc.md +57 -0
  103. package/metaData/components/picker-view/example/cascader.tsx +141 -0
  104. package/metaData/components/picker-view/example/index.tsx +297 -0
  105. package/metaData/components/picker-view/example/multi-picker.tsx +66 -0
  106. package/metaData/components/picker-view/example/picker-cell.tsx +416 -0
  107. package/metaData/components/popover/doc.md +144 -0
  108. package/metaData/components/popover/example/index.tsx +23 -0
  109. package/metaData/components/popover/example/menu.tsx +145 -0
  110. package/metaData/components/popover/example/popover-inner.tsx +147 -0
  111. package/metaData/components/popover/example/popover.tsx +268 -0
  112. package/metaData/components/popup/doc.md +101 -0
  113. package/metaData/components/popup/example/index.tsx +125 -0
  114. package/metaData/components/popup/example/methods.tsx +6 -0
  115. package/metaData/components/popup-swiper/doc.md +108 -0
  116. package/metaData/components/popup-swiper/example/index.tsx +332 -0
  117. package/metaData/components/popup-swiper/example/methods.tsx +6 -0
  118. package/metaData/components/portal/doc.md +14 -0
  119. package/metaData/components/portal/example/index.tsx +35 -0
  120. package/metaData/components/progress/doc.md +42 -0
  121. package/metaData/components/progress/example/index.tsx +256 -0
  122. package/metaData/components/pull-refresh/doc.md +37 -0
  123. package/metaData/components/pull-refresh/example/android-pull-refresh.tsx +260 -0
  124. package/metaData/components/pull-refresh/example/index.tsx +44 -0
  125. package/metaData/components/pull-refresh/example/ios-pull-refresh.tsx +216 -0
  126. package/metaData/components/radio/doc.md +89 -0
  127. package/metaData/components/radio/example/group.tsx +92 -0
  128. package/metaData/components/radio/example/index.tsx +25 -0
  129. package/metaData/components/radio/example/radio.tsx +22 -0
  130. package/metaData/components/rate/doc.md +33 -0
  131. package/metaData/components/rate/example/index.tsx +281 -0
  132. package/metaData/components/search-bar/doc.md +97 -0
  133. package/metaData/components/search-bar/example/association.tsx +89 -0
  134. package/metaData/components/search-bar/example/cancel-button.tsx +34 -0
  135. package/metaData/components/search-bar/example/highlight.tsx +66 -0
  136. package/metaData/components/search-bar/example/index.tsx +251 -0
  137. package/metaData/components/show-monitor/doc.md +34 -0
  138. package/metaData/components/show-monitor/example/index.tsx +646 -0
  139. package/metaData/components/skeleton/doc.md +101 -0
  140. package/metaData/components/skeleton/example/elements.tsx +290 -0
  141. package/metaData/components/skeleton/example/index.tsx +96 -0
  142. package/metaData/components/skeleton/example/skeleton-context.tsx +7 -0
  143. package/metaData/components/slider/doc.md +42 -0
  144. package/metaData/components/slider/example/index.tsx +326 -0
  145. package/metaData/components/slider/example/marks.tsx +50 -0
  146. package/metaData/components/slider/example/popover.tsx +38 -0
  147. package/metaData/components/slider/example/thumb.tsx +48 -0
  148. package/metaData/components/slider/example/useSliderIcon.tsx +38 -0
  149. package/metaData/components/slider/example/useSliderInit.tsx +170 -0
  150. package/metaData/components/stepper/doc.md +46 -0
  151. package/metaData/components/stepper/example/index.tsx +166 -0
  152. package/metaData/components/stepper/example/useButtonClick.tsx +74 -0
  153. package/metaData/components/stepper/example/useInputEvent.tsx +65 -0
  154. package/metaData/components/stepper/example/useValue.tsx +43 -0
  155. package/metaData/components/steps/doc.md +57 -0
  156. package/metaData/components/steps/example/index.tsx +123 -0
  157. package/metaData/components/steps/example/step.tsx +126 -0
  158. package/metaData/components/sticky/doc.md +45 -0
  159. package/metaData/components/sticky/example/index.tsx +430 -0
  160. package/metaData/components/swipe-action/doc.md +44 -0
  161. package/metaData/components/swipe-action/example/index.tsx +338 -0
  162. package/metaData/components/swipe-action/example/item.tsx +40 -0
  163. package/metaData/components/swipe-load/doc.md +43 -0
  164. package/metaData/components/swipe-load/example/index.tsx +339 -0
  165. package/metaData/components/swipe-load/example/type.tsx +153 -0
  166. package/metaData/components/switch/doc.md +38 -0
  167. package/metaData/components/switch/example/index.tsx +237 -0
  168. package/metaData/components/tab-bar/doc.md +57 -0
  169. package/metaData/components/tab-bar/example/index.tsx +18 -0
  170. package/metaData/components/tab-bar/example/item.tsx +74 -0
  171. package/metaData/components/tab-bar/example/tab-bar.tsx +105 -0
  172. package/metaData/components/tabs/doc.md +187 -0
  173. package/metaData/components/tabs/example/index.tsx +514 -0
  174. package/metaData/components/tabs/example/tab-cell-underline.tsx +320 -0
  175. package/metaData/components/tabs/example/tab-cell.tsx +433 -0
  176. package/metaData/components/tabs/example/tab-pane.tsx +349 -0
  177. package/metaData/components/tag/doc.md +80 -0
  178. package/metaData/components/tag/example/index.tsx +23 -0
  179. package/metaData/components/tag/example/list.tsx +97 -0
  180. package/metaData/components/tag/example/tag.tsx +85 -0
  181. package/metaData/components/textarea/doc.md +67 -0
  182. package/metaData/components/textarea/example/index.tsx +258 -0
  183. package/metaData/components/toast/doc.md +90 -0
  184. package/metaData/components/toast/example/index.tsx +335 -0
  185. package/metaData/components/toast/example/methods.tsx +87 -0
  186. package/metaData/components/transition/doc.md +19 -0
  187. package/metaData/components/transition/example/index.tsx +113 -0
  188. package/metaData/components/uploader/doc.md +82 -0
  189. package/metaData/components/uploader/example/index.tsx +208 -0
  190. package/metaData/components-index.json +242 -0
  191. package/package.json +56 -0
@@ -0,0 +1,259 @@
1
+ import React, { useState, ReactNode, useEffect, useRef } from 'react';
2
+ import { cls, nextTick } from '@arco-design/mobile-utils';
3
+ import { BasicInputProps } from './props';
4
+ import IconClear from '../icon/IconClear';
5
+ import { useSystem } from '../_helpers';
6
+
7
+ export type InputEleType = HTMLInputElement | HTMLTextAreaElement;
8
+
9
+ export function useInputLogic(
10
+ props: BasicInputProps<InputEleType>,
11
+ inputRef: React.MutableRefObject<InputEleType | null>,
12
+ ) {
13
+ const {
14
+ value,
15
+ defaultValue,
16
+ validator,
17
+ onChange,
18
+ onInput,
19
+ className,
20
+ style,
21
+ label,
22
+ required,
23
+ prepend,
24
+ append,
25
+ blurBeforeFocus,
26
+ onKeyDown,
27
+ onPressEnter,
28
+ onFocus,
29
+ onBlur,
30
+ onClick,
31
+ disabled,
32
+ border = 'half',
33
+ prefix,
34
+ suffix,
35
+ clearable,
36
+ clearShowType = 'focus',
37
+ clearIcon = <IconClear />,
38
+ preventEventWhenClearing = true,
39
+ onClear,
40
+ autoFocus,
41
+ blockChangeWhenCompositing,
42
+ } = props;
43
+ const [inputValue, setInputValue] = useState(value || defaultValue || '');
44
+ const [showClear, toggleClear] = useState(
45
+ () =>
46
+ clearShowType === 'always' ||
47
+ (clearShowType === 'value' && Boolean(value || defaultValue)),
48
+ );
49
+ const compositingRef = useRef(false);
50
+ const [isFocusing, setIsFocusing] = useState(false);
51
+ const shouldPreventEvent = useRef(false);
52
+ const actualInputValue = value !== void 0 ? value : inputValue;
53
+ const system = useSystem();
54
+ const wrapRef = useRef<HTMLDivElement | null>(null);
55
+ const needComposition = system === 'ios' && blockChangeWhenCompositing;
56
+ useEffect(() => {
57
+ if (autoFocus) {
58
+ setTimeout(() => {
59
+ inputRef.current && inputRef.current.click();
60
+ }, 100);
61
+ }
62
+ }, []);
63
+
64
+ useEffect(() => {
65
+ const handleCompositionStart = () => {
66
+ compositingRef.current = true;
67
+ };
68
+ const handleCompositionEnd = e => {
69
+ compositingRef.current = false;
70
+ handleChange(e);
71
+ };
72
+ if (inputRef.current && needComposition) {
73
+ inputRef.current.addEventListener('compositionstart', handleCompositionStart);
74
+ inputRef.current.addEventListener('compositionend', handleCompositionEnd);
75
+ }
76
+ return () => {
77
+ if (inputRef.current && needComposition) {
78
+ inputRef.current.removeEventListener('compositionstart', handleCompositionStart);
79
+ inputRef.current.removeEventListener('compositionend', handleCompositionEnd);
80
+ }
81
+ };
82
+ }, [needComposition]);
83
+
84
+ useEffect(() => {
85
+ // 处理受控模式下的showClear
86
+ // @en Handling showClear in controlled mode
87
+ if (clearShowType === 'value' && value !== void 0) {
88
+ toggleClear(Boolean(value));
89
+ }
90
+ }, [value]);
91
+
92
+ function changeValue(nowValue: string, callback = () => {}) {
93
+ if (nowValue && validator) {
94
+ if (typeof validator === 'function') {
95
+ if (!validator(nowValue)) {
96
+ return;
97
+ }
98
+ } else if (!validator.test(nowValue)) {
99
+ return;
100
+ }
101
+ }
102
+ // 处理非受控模式下的showClear
103
+ // @en Handling showClear in uncontrolled mode
104
+ if (clearShowType === 'value' && value === void 0) {
105
+ toggleClear(Boolean(nowValue));
106
+ }
107
+ setInputValue(nowValue);
108
+ callback();
109
+ }
110
+
111
+ function handleChange(e: React.ChangeEvent<InputEleType>) {
112
+ if (needComposition && compositingRef.current) {
113
+ return;
114
+ }
115
+ const newValue = e.target.value;
116
+ changeValue(newValue, () => {
117
+ onChange && onChange(e, newValue);
118
+ });
119
+ }
120
+
121
+ function handleInput(e: any) {
122
+ const newValue = e.target.value;
123
+ changeValue(newValue, () => {
124
+ onInput && onInput(e, newValue);
125
+ });
126
+ }
127
+
128
+ function handleKeyDown(e: React.KeyboardEvent<InputEleType>) {
129
+ if (e.keyCode === 13) {
130
+ onPressEnter && onPressEnter(e);
131
+ }
132
+ onKeyDown && onKeyDown(e);
133
+ }
134
+
135
+ function handleFocus(e: React.FocusEvent<InputEleType>) {
136
+ if (preventEventWhenClearing && shouldPreventEvent.current) {
137
+ shouldPreventEvent.current = false;
138
+ return;
139
+ }
140
+ setIsFocusing(true);
141
+ clearShowType === 'focus' && toggleClear(true);
142
+ onFocus && onFocus(e);
143
+ }
144
+
145
+ function handleBlur(e: React.FocusEvent<InputEleType>) {
146
+ if (preventEventWhenClearing && shouldPreventEvent.current) {
147
+ return;
148
+ }
149
+ setIsFocusing(false);
150
+ clearShowType === 'focus' && toggleClear(false);
151
+ onBlur && onBlur(e);
152
+ }
153
+
154
+ function handleClick(e: React.MouseEvent<InputEleType>) {
155
+ // 安卓才会有键盘切换不过来的问题,ios不开启此项,因为blur之后不能再自动focus
156
+ // @en Android will have the problem that the keyboard cannot be switched. iOS does not enable this, because it can no longer automatically focus after blur.
157
+ if (blurBeforeFocus && system === 'android' && !isFocusing) {
158
+ inputRef.current && inputRef.current.blur();
159
+ nextTick(() => {
160
+ inputRef.current && inputRef.current.focus();
161
+ });
162
+ } else {
163
+ inputRef.current && inputRef.current.focus();
164
+ }
165
+ onClick && onClick(e);
166
+ }
167
+
168
+ function handleClear(e: React.TouchEvent<HTMLElement>) {
169
+ // 不展示清除按钮时不触发事件
170
+ // @en No event fired when clear button is not displayed
171
+ if (!clearable || !showClear) {
172
+ return;
173
+ }
174
+ changeValue('', () => {
175
+ onClear && onClear(e);
176
+ // 当点击clear前是focus时强制执行focus
177
+ // @en Enforce focus when focus is before clicking clear
178
+ if (isFocusing) {
179
+ if (preventEventWhenClearing) {
180
+ shouldPreventEvent.current = true;
181
+ // 一段时间未执行blur或focus则重置,避免对下次事件循环造成影响
182
+ // @en If blur or focus is not executed for a period of time, it will be reset to avoid affecting the next event loop
183
+ setTimeout(() => {
184
+ shouldPreventEvent.current = false;
185
+ }, 200);
186
+ }
187
+ nextTick(() => {
188
+ inputRef.current && inputRef.current.focus();
189
+ });
190
+ }
191
+ });
192
+ }
193
+
194
+ function renderPendNode(
195
+ pend?: ReactNode | ((focusing: boolean, keyword: string) => ReactNode),
196
+ ) {
197
+ return typeof pend === 'function' ? pend(isFocusing, actualInputValue) : pend;
198
+ }
199
+
200
+ function renderWrapper(prefixCls: string, type: string, children: ReactNode) {
201
+ // handleClear必须早于handleBlur执行,pc端仅mousedown事件触发早于blur,移动端touch相关事件均早于blur
202
+ // @en handleClear must be executed earlier than handleBlur
203
+ // @en only the mousedown event on the PC side is triggered earlier than blur, and the touch-related events on the mobile side are all earlier than blur
204
+ const clearEvent = { [system === 'pc' ? 'onMouseDown' : 'onTouchEnd']: handleClear };
205
+ return (
206
+ <div
207
+ role="search"
208
+ className={`${prefixCls}-container all-border-box ${className || ''}`}
209
+ style={style}
210
+ ref={wrapRef}
211
+ >
212
+ {renderPendNode(prepend)}
213
+ <div
214
+ className={cls(
215
+ `${prefixCls}-wrap`,
216
+ type,
217
+ `border-${border}`,
218
+ system,
219
+ { disabled },
220
+ { prefix },
221
+ { suffix },
222
+ )}
223
+ >
224
+ {label || prefix ? (
225
+ <div className={`${prefixCls}-prefix`}>
226
+ {label ? (
227
+ <div className={cls(`${prefixCls}-label`, { required })}>
228
+ {label}
229
+ </div>
230
+ ) : (
231
+ prefix
232
+ )}
233
+ </div>
234
+ ) : null}
235
+ {children}
236
+ {clearable && showClear ? (
237
+ <div className={`${prefixCls}-clear`} {...clearEvent}>
238
+ {clearIcon}
239
+ </div>
240
+ ) : null}
241
+ {suffix ? <div className={`${prefixCls}-suffix`}>{suffix}</div> : null}
242
+ </div>
243
+ {renderPendNode(append)}
244
+ </div>
245
+ );
246
+ }
247
+
248
+ return {
249
+ inputValue: actualInputValue,
250
+ handleChange,
251
+ handleInput,
252
+ handleKeyDown,
253
+ handleFocus,
254
+ handleBlur,
255
+ handleClick,
256
+ renderWrapper,
257
+ wrapRef,
258
+ };
259
+ }
@@ -0,0 +1,134 @@
1
+ import React, { forwardRef, Ref, useImperativeHandle, useRef } from 'react';
2
+ import { cls, componentWrapper } from '@arco-design/mobile-utils';
3
+ import { ContextLayout } from '../context-provider';
4
+ import { BasicInputProps } from './props';
5
+ import { useInputLogic } from './hooks';
6
+
7
+ export interface InputProps extends BasicInputProps {
8
+ /**
9
+ * 输入框类型
10
+ * @en Input box type
11
+ * @default "text"
12
+ */
13
+ type?: string;
14
+ /**
15
+ * 检查控件值的正则表达式
16
+ * @en Regular expression to check the value of input box
17
+ */
18
+ pattern?: string;
19
+ /**
20
+ * 输入框dom自定义类名
21
+ * @en Custom classname for input DOM
22
+ */
23
+ inputClass?: string;
24
+ /**
25
+ * 输入框dom自定义样式
26
+ * @en Custom style for input DOM
27
+ */
28
+ inputStyle?: React.CSSProperties;
29
+ /**
30
+ * 其他未列出的原生属性,优先级低于已列出的组件属性
31
+ * @en Other unlisted native properties have lower priority than listed component properties
32
+ */
33
+ nativeProps?: React.InputHTMLAttributes<HTMLInputElement>;
34
+ /**
35
+ * 无障碍label
36
+ * @en accessible label
37
+ */
38
+ ariaLabel?: string;
39
+ }
40
+
41
+ export interface InputRef {
42
+ /**
43
+ * 最外层元素 DOM
44
+ * @en The outermost element DOM
45
+ */
46
+ dom: HTMLDivElement | null;
47
+ /**
48
+ * 原生输入框 DOM
49
+ * @en Native input DOM
50
+ */
51
+ input: HTMLInputElement | null;
52
+ }
53
+
54
+ const Input = forwardRef((props: InputProps, ref: Ref<InputRef>) => {
55
+ const {
56
+ id,
57
+ name,
58
+ maxLength,
59
+ placeholder,
60
+ readOnly,
61
+ onKeyUp,
62
+ onKeyPress,
63
+ type = 'text',
64
+ disabled,
65
+ pattern,
66
+ inputClass,
67
+ inputStyle,
68
+ nativeProps = {},
69
+ ariaLabel = '',
70
+ } = props;
71
+ const inputRef = useRef<HTMLInputElement | null>(null);
72
+ const {
73
+ inputValue,
74
+ handleChange,
75
+ handleInput,
76
+ handleKeyDown,
77
+ handleFocus,
78
+ handleBlur,
79
+ handleClick,
80
+ renderWrapper,
81
+ wrapRef,
82
+ } = useInputLogic(props, inputRef);
83
+
84
+ useImperativeHandle(ref, () => ({
85
+ dom: wrapRef.current,
86
+ input: inputRef.current,
87
+ }));
88
+
89
+ function renderInput({ prefixCls }) {
90
+ const prefix = `${prefixCls}-input`;
91
+ return renderWrapper(
92
+ prefix,
93
+ `${type} single-line`,
94
+ <input
95
+ {...nativeProps}
96
+ id={id}
97
+ name={name}
98
+ maxLength={maxLength}
99
+ placeholder={placeholder}
100
+ readOnly={readOnly}
101
+ onFocus={handleFocus}
102
+ onBlur={handleBlur}
103
+ onKeyUp={onKeyUp}
104
+ onKeyPress={onKeyPress}
105
+ ref={inputRef}
106
+ className={cls(prefix, inputClass)}
107
+ style={inputStyle}
108
+ value={inputValue}
109
+ type={type}
110
+ disabled={disabled}
111
+ pattern={pattern}
112
+ onChange={handleChange}
113
+ onInput={handleInput}
114
+ onKeyDown={handleKeyDown}
115
+ onClick={handleClick}
116
+ aria-disabled={disabled}
117
+ aria-label={ariaLabel}
118
+ />,
119
+ );
120
+ }
121
+
122
+ return <ContextLayout>{renderInput}</ContextLayout>;
123
+ });
124
+
125
+ /**
126
+ * 输入框组件,支持添加前后缀。
127
+ * @en The input box, supports adding prefixes and suffixes.
128
+ * @type 数据录入
129
+ * @type_en Data Entry
130
+ * @name 输入框
131
+ * @name_en Input
132
+ * @displayName Input
133
+ */
134
+ export default componentWrapper(Input, 'Input');
@@ -0,0 +1,183 @@
1
+ import React from 'react';
2
+
3
+ export interface BasicInputProps<T = HTMLInputElement> {
4
+ /**
5
+ * 输入框的id
6
+ * @en Input id
7
+ */
8
+ id?: string;
9
+ /**
10
+ * 输入框的name
11
+ * @en Input name
12
+ */
13
+ name?: string;
14
+ /**
15
+ * 自定义类名
16
+ * @en Custom classname
17
+ */
18
+ className?: string;
19
+ /**
20
+ * 自定义样式
21
+ * @en Custom stylesheet
22
+ */
23
+ style?: React.CSSProperties;
24
+ /**
25
+ * 绑定值,传入即受控
26
+ * @en Binding value, if input, the component is controlled
27
+ */
28
+ value?: string;
29
+ /**
30
+ * 默认值
31
+ * @en Default value
32
+ */
33
+ defaultValue?: string;
34
+ /**
35
+ * 最大输入长度
36
+ * @en Maximum input length
37
+ */
38
+ maxLength?: number;
39
+ /**
40
+ * 边框展示类型
41
+ * @en Border display type
42
+ * @default "half"
43
+ */
44
+ border?: 'all' | 'half' | 'bottom' | 'none';
45
+ /**
46
+ * 占位文本
47
+ * @en Placeholder text
48
+ */
49
+ placeholder?: string;
50
+ /**
51
+ * 输入框是否禁用
52
+ * @en Whether the input box is disabled
53
+ */
54
+ disabled?: boolean;
55
+ /**
56
+ * 是否只读
57
+ * @en Read-only
58
+ */
59
+ readOnly?: boolean;
60
+ /**
61
+ * 是否自动获取焦点,开启后会触发一次onClick事件
62
+ * @en Whether to automatically get the focus, it will trigger an onClick event once after being enabled
63
+ */
64
+ autoFocus?: boolean;
65
+ /**
66
+ * 当 ios 输入中文时,输拼音的过程不触发onChange,仅确认选择后触发
67
+ * @en When inputting Chinese on ios, onChange is not triggered during pinyin input, but only after confirming the selection
68
+ * @default false
69
+ */
70
+ blockChangeWhenCompositing?: boolean;
71
+ /**
72
+ * 输入框左侧文本
73
+ * @en text to the left of the input box
74
+ */
75
+ label?: string | React.ReactNode;
76
+ /**
77
+ * 是否必填项
78
+ * @en Whether it is required
79
+ */
80
+ required?: boolean;
81
+ /**
82
+ * 正则验证,不符合验证的不允许输入
83
+ * @en Regular validation, input is not allowed if it does not meet the validation
84
+ */
85
+ validator?: RegExp | ((value: string) => boolean);
86
+ /**
87
+ * 输入框头部内容,在输入框外部
88
+ * @en The content of the header of the input box, outside the input box
89
+ */
90
+ prepend?: React.ReactNode | ((focusing: boolean, inputValue: string) => React.ReactNode);
91
+ /**
92
+ * 输入框尾部内容,在输入框外部
93
+ * @en The content at the end of the input box, outside the input box
94
+ */
95
+ append?: React.ReactNode | ((focusing: boolean, inputValue: string) => React.ReactNode);
96
+ /**
97
+ * 在聚焦之前blur掉,即切换不同input时会重新弹起键盘,常用于input type切换时重新加载键盘,安卓上有效
98
+ * @en Blur before focusing, that is, the keyboard will be re-bounced when switching between different inputs. It is often used to reload the keyboard when the input type is switched. It is valid on Android.
99
+ */
100
+ blurBeforeFocus?: boolean;
101
+ /**
102
+ * 是否有清除按钮
103
+ * @en whether there is a clear button
104
+ */
105
+ clearable?: boolean;
106
+ /**
107
+ * 清除按钮展示时机:focus - 聚焦时展示 value - 有值则展示 always - 始终展示
108
+ * @en Clear button display timing: focus - display when focused, value - display when there is value, always - always display
109
+ * @default "focus"
110
+ */
111
+ clearShowType?: 'focus' | 'value' | 'always';
112
+ /**
113
+ * 在聚焦模式下点击清除按钮时,是否要屏蔽对应产生的onBlur和onFocus事件
114
+ * @en Whether to block the onBlur and onFocus events generated when the clear button is clicked in focus mode
115
+ * @default true
116
+ */
117
+ preventEventWhenClearing?: boolean;
118
+ /**
119
+ * 清除按钮类型,也可自定义
120
+ * @en Clear button type, also customizable
121
+ * @default \<IconClear className="clear-icon" /\>
122
+ */
123
+ clearIcon?: React.ReactNode;
124
+ /**
125
+ * 按下清除按钮回调
126
+ * @en Callback when clear button is pressed
127
+ */
128
+ onClear?: (e: React.TouchEvent<HTMLElement>) => void;
129
+ /**
130
+ * 输入框前置内容,在输入框内部,也可自定义
131
+ * @en The prefix of the input box, inside the input box, can also be customized
132
+ */
133
+ prefix?: React.ReactNode;
134
+ /**
135
+ * 输入框后置内容,在输入框内部,也可自定义
136
+ * @en The suffix content of the input box, inside the input box, can also be customized
137
+ */
138
+ suffix?: React.ReactNode;
139
+ /**
140
+ * 数据改变时触发(失去焦点时)
141
+ * @en Fired when the data changes (when bluring the focus)
142
+ */
143
+ onChange?: (e: React.ChangeEvent<T>, value: string) => void;
144
+ /**
145
+ * 数据改变时触发
146
+ * @en Callback when data changes
147
+ */
148
+ onInput?: (e: React.ChangeEvent<T>, value: string) => void;
149
+ /**
150
+ * 输入框聚焦时触发
151
+ * @en Callback when the input box is focused
152
+ */
153
+ onFocus?: (e: React.FocusEvent<T>) => void;
154
+ /**
155
+ * 输入框失去焦点时触发
156
+ * @en Callback when the input box is blured
157
+ */
158
+ onBlur?: (e: React.FocusEvent<T>) => void;
159
+ /**
160
+ * 点击输入框事件
161
+ * @en Callback when clicking the input box
162
+ */
163
+ onClick?: (e: React.MouseEvent<T>) => void;
164
+ /**
165
+ * 原生的keyup事件
166
+ * @en Native keyup event
167
+ */
168
+ onKeyUp?: (e: React.KeyboardEvent<T>) => void;
169
+ /** 原生的keydown事件
170
+ * @en Native keydown event
171
+ */
172
+ onKeyDown?: (e: React.KeyboardEvent<T>) => void;
173
+ /**
174
+ * 原生的keypress事件
175
+ * @en Native keypress event
176
+ */
177
+ onKeyPress?: (e: React.KeyboardEvent<T>) => void;
178
+ /**
179
+ * 按下回车键时触发
180
+ * @en Callback when the enter key is pressed
181
+ */
182
+ onPressEnter?: (e: React.KeyboardEvent<T>) => void;
183
+ }
@@ -0,0 +1,73 @@
1
+ ### 数据录入
2
+
3
+ # 数字键盘 Keyboard
4
+
5
+ 数字键盘组件
6
+
7
+ ======
8
+
9
+ > 属性/Props
10
+
11
+ |参数|描述|类型|默认值|
12
+ |----------|-------------|------|------|
13
+ |normalKeyClass|常规键位自定义类名|string|-|
14
+ |normalKeyStyle|常规键位自定义样式|CSSProperties|-|
15
+ |className|自定义类名|string|-|
16
+ |style|自定义样式|CSSProperties|-|
17
+ |type|键盘展示类型,不同类型有不同布局。number \- 纯数字常规键盘,confirm \- 带确认按钮的键盘,tool \- 带运算符的键盘|"number" \| "confirm" \| "tool"|"number"|
18
+ |randomOrder|是否打乱键盘中的数字展示位置|boolean|必填|
19
+ |title|键盘顶部展示标题内容,样式纯自定义|ReactNode|-|
20
+ |rightColumns|自定义渲染数字右侧(第四列)的内容|ReactNode|-|
21
+ |confirmClosable|点击确认后是否自动关闭键盘|boolean|false|
22
+ |confirmButton|自定义渲染确认按钮内部内容|ReactNode|-|
23
+ |deleteButton|自定义渲染删除按钮内部内容|ReactNode|-|
24
+ |keyboardButton|自定义渲染收起键盘按钮内部内容|ReactNode|-|
25
+ |close|收起键盘回调|(e?: MouseEvent\<HTMLElement, MouseEvent\>) =\> \{\}|必填|
26
+ |onConfirm|点击确认按钮回调|() =\> \{\}|-|
27
+ |onDelete|点击删除按钮回调|() =\> \{\}|-|
28
+ |onChange|点击常规按钮回调|(data: ReactText) =\> \{\}|-|
29
+ |direction|菜单滑出方向|"left" \| "right" \| "top" \| "bottom"|"bottom"|
30
+ |needBottomOffset|从底部滑出的菜单内容是否适配ipx底部|boolean|false|
31
+ |translateZ|\[即将废弃\] 开启translateZ强制提升|boolean|false|
32
+ |maskTransitionTimeout|菜单蒙层动画时长|number \| \{ appear?: number; enter?: number; exit?: number; \}|{ enter: 450, exit: 240 }|
33
+ |contentTransitionTimeout|菜单内容动画时长|number \| \{ appear?: number; enter?: number; exit?: number; \}|{ enter: 450, exit: 240 }|
34
+ |contentTransitionType|内容过渡动画类名|string|\`slide-from-${props.direction}\`|
35
+ |maskClass|自定义蒙层类名|string|-|
36
+ |maskStyle|自定义蒙层样式|CSSProperties|-|
37
+ |contentClass|自定义内容类名|string|-|
38
+ |contentStyle|自定义内容样式|CSSProperties|-|
39
+ |visible|是否展示菜单(受控)|boolean|必填|
40
+ |maskTransitionType|蒙层过渡动画类名|string|"fade"|
41
+ |contentTransitionVarType|内容过渡动画类名变量标识|string|-|
42
+ |children|菜单内部内容|ReactNode|-|
43
+ |maskClosable|点击蒙层是否关闭菜单|boolean|true|
44
+ |animatingClosable|执行进场动画时点击蒙层是否可关闭菜单|boolean|false|
45
+ |mountOnEnter|是否在打开菜单时再加载内容|boolean|true|
46
+ |unmountOnExit|是否在退出时卸载内容|boolean|true|
47
+ |orientationDirection|transform方向,用于通过transform模拟横屏的情况|"left" \| "right" \| "top" \| "bottom"|"top"|
48
+ |preventBodyScroll|弹窗打开时是否禁止body的滚动|boolean|true|
49
+ |initialBodyOverflow|页面初始 overflow 状态,即关闭弹窗时 overflow 应该还原的状态|string|第一个全屏组件(弹窗、toast等)打开时页面overflow值|
50
+ |gestureOutOfControl|是否禁用滚动容器手势判断,禁用后交给业务方自己判断|boolean|false|
51
+ |onClose|关闭后回调(动画执行完毕)|(scene?: string) =\> void|-|
52
+ |onOpen|打开后回调(动画执行完毕)|() =\> void|-|
53
+ |onMaskClick|点击蒙层回调,maskClosable=false时也会触发|() =\> void|-|
54
+ |onTouchMove|弹窗的touchmove回调|(e: TouchEvent, prevented: boolean, direction: "x" \| "y") =\> void|-|
55
+ |onPreventTouchMove|非滚动区域或滚动到顶部及底部时的触摸事件回调|(e: TouchEvent, direction: "x" \| "y") =\> void|-|
56
+ |getContainer|获取挂载容器|() =\> HTMLElement|-|
57
+ |getScrollContainer|内容内部滚动区域容器,在该容器中未滚动到顶部或底部时会释放滚动|() =\> HTMLElement \| HTMLElement\[\]|-|
58
+
59
+ > 引用/Refs
60
+
61
+ |参数|描述|类型|
62
+ |----------|-------------|------|
63
+ |keyboard|最外层 DOM 元素|HTMLDivElement|
64
+ |dom|最外层元素 DOM|HTMLDivElement|
65
+ |mask|蒙层 DOM|HTMLDivElement|
66
+ |content|内容 DOM|HTMLDivElement|
67
+ |setCloseScene|在关闭弹窗前修改 onClose 的 scene 参数值|(scene: string) =\> void|
68
+
69
+ > DirectionType
70
+
71
+ ```
72
+ "left" | "right" | "top" | "bottom"
73
+ ```