@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,69 @@
1
+ import React, {
2
+ forwardRef,
3
+ Ref,
4
+ useImperativeHandle,
5
+ useRef,
6
+ useContext,
7
+ ReactElement,
8
+ } from 'react';
9
+ import { cls } from '@arco-design/mobile-utils';
10
+ import { GlobalContext } from '../context-provider';
11
+ import { AvatarGroupContextParams, AvatarGroupProps, AvatarGroupRef } from './type';
12
+
13
+ export const AvatarGroupContext = React.createContext<AvatarGroupContextParams>({
14
+ isGroup: false,
15
+ shape: 'circle',
16
+ size: 'small',
17
+ });
18
+
19
+ /**
20
+ * 头像叠层
21
+ * @en Avatar group
22
+ */
23
+ export const Group = forwardRef((props: AvatarGroupProps, ref: Ref<AvatarGroupRef | null>) => {
24
+ const {
25
+ style = {},
26
+ className = '',
27
+ shape = 'circle',
28
+ size = 'medium',
29
+ zIndexOrder = 'desc',
30
+ children,
31
+ } = props;
32
+ const { prefixCls } = useContext(GlobalContext);
33
+ const childrenArr = React.Children.toArray(children);
34
+ const { length } = childrenArr;
35
+
36
+ const domRef = useRef<HTMLDivElement | null>(null);
37
+ useImperativeHandle(ref, () => ({
38
+ dom: domRef.current,
39
+ }));
40
+
41
+ return (
42
+ <div
43
+ ref={domRef}
44
+ style={style}
45
+ className={cls(
46
+ className,
47
+ `${prefixCls}-avatar-group`,
48
+ `${prefixCls}-avatar-group-size-${size}`,
49
+ `group-${size}`,
50
+ )}
51
+ >
52
+ <AvatarGroupContext.Provider value={{ isGroup: true, shape, size }}>
53
+ {childrenArr.map((child, i) => {
54
+ const childProps = ((child as ReactElement) || {}).props as any;
55
+ const avatarStyle = {
56
+ zIndex: zIndexOrder === 'asc' ? i + 1 : length - i,
57
+ ...childProps.style,
58
+ };
59
+ return React.cloneElement(child as ReactElement, {
60
+ ...childProps,
61
+ style: avatarStyle,
62
+ });
63
+ })}
64
+ </AvatarGroupContext.Provider>
65
+ </div>
66
+ );
67
+ });
68
+
69
+ export default Group;
@@ -0,0 +1,196 @@
1
+ import React, {
2
+ forwardRef,
3
+ Ref,
4
+ useImperativeHandle,
5
+ useRef,
6
+ useContext,
7
+ useState,
8
+ useEffect,
9
+ } from 'react';
10
+ import { cls, componentWrapper } from '@arco-design/mobile-utils';
11
+ import { BaseImage, ImageProps, ImageRef } from '../image';
12
+ import { AvatarProps, AvatarRef } from './type';
13
+ import IconUserFill from '../icon/IconUserFill';
14
+ import { GlobalContext } from '../context-provider';
15
+ import Group, { AvatarGroupContext } from './group';
16
+
17
+ export * from './type';
18
+
19
+ export function componentGenerator<
20
+ P extends ImageProps = ImageProps,
21
+ R extends ImageRef = ImageRef,
22
+ >(Comp: React.ForwardRefExoticComponent<P & React.RefAttributes<R>>) {
23
+ return forwardRef((props: AvatarProps<P>, ref: Ref<AvatarRef>) => {
24
+ const { prefixCls } = useContext(GlobalContext);
25
+ const { shape: groupShape, size: groupSize, isGroup } = useContext(AvatarGroupContext);
26
+ const {
27
+ shape = props.shape || (isGroup ? groupShape : 'circle'),
28
+ size = props.size || (isGroup ? groupSize : 'small'),
29
+ src,
30
+ decoration = null,
31
+ textAvatar = '',
32
+ avatarStyle = {},
33
+ avatarClass = '',
34
+ autoFixFontSize = true,
35
+ autoFixFontOffset = 2,
36
+ avatarName = '',
37
+ avatarDesc = '',
38
+ children = null,
39
+ renderInfo = null,
40
+ className = '',
41
+ style = {},
42
+ imageProps = {},
43
+ defaultOverLap,
44
+ onClickDecoration,
45
+ onClick,
46
+ } = props;
47
+ const domRef = useRef<HTMLDivElement | null>(null);
48
+ const avatarRef = useRef<HTMLDivElement | null>(null);
49
+ const avatarTextRef = useRef<HTMLDivElement | null>(null);
50
+ const [textScale, setTextScale] = useState<number>(1);
51
+
52
+ useImperativeHandle(ref, () => ({
53
+ dom: domRef.current,
54
+ }));
55
+ // 图片头像
56
+ // @en Picture avatar
57
+ const isImageAvatar = !children && src !== void 0;
58
+ // 文字头像
59
+ // @en Text avatar
60
+ const isTextAvatar = !children && !isImageAvatar && textAvatar;
61
+ // 使用默认头像
62
+ // @en Whether to use default avatar
63
+ const useDefaultAvatar = !children && !isImageAvatar && !isTextAvatar;
64
+
65
+ useEffect(() => {
66
+ getComputedTextScale();
67
+ }, [textAvatar]);
68
+
69
+ /**
70
+ * 根据字体元素宽度和头像大小动态调整缩放比例
71
+ * @en Dynamically adjust scaling based on font element width and avatar size
72
+ */
73
+ function getComputedTextScale() {
74
+ if (!isTextAvatar || !autoFixFontSize || !avatarRef || !avatarTextRef) return;
75
+ const { width: avatarWidth = 0 } = avatarRef.current?.getBoundingClientRect() || {};
76
+ const { width: textWidth = 0 } = avatarTextRef.current?.getBoundingClientRect() || {};
77
+ if (avatarWidth === 0 || textWidth === 0) return;
78
+ // 文本节点宽度大于头像元素时进行动态缩放
79
+ // @en Dynamic scaling when the width of the text node is larger than the avatar element
80
+ const maxWidth = avatarWidth - 2 * autoFixFontOffset;
81
+ if (textWidth > maxWidth) {
82
+ const scale = maxWidth / textWidth;
83
+ setTextScale(textScale * scale);
84
+ }
85
+ }
86
+
87
+ return (
88
+ <div
89
+ ref={domRef}
90
+ style={style}
91
+ className={cls(
92
+ `${prefixCls}-avatar-wrapper`,
93
+ className,
94
+ size,
95
+ shape,
96
+ `${prefixCls}-avatar-wrapper-shape-${shape}`,
97
+ {
98
+ [`${prefixCls}-avatar-wrapper-with-info ${prefixCls}-avatar-wrapper-with-info-size-${size} with-info`]:
99
+ Boolean(avatarName),
100
+ },
101
+ )}
102
+ onClick={onClick}
103
+ >
104
+ <div
105
+ className={cls(
106
+ `${prefixCls}-avatar`,
107
+ avatarClass,
108
+ `${prefixCls}-avatar-size-${size}`,
109
+ size,
110
+ `${prefixCls}-avatar-shape-${shape}`,
111
+ shape,
112
+ {
113
+ [`${prefixCls}-text-avatar ${prefixCls}-avatar-mode-text`]:
114
+ isTextAvatar,
115
+ [`${prefixCls}-image-avatar ${prefixCls}-avatar-mode-image`]:
116
+ isImageAvatar,
117
+ [`${prefixCls}-avatar-default-overlap default-overlap`]:
118
+ useDefaultAvatar,
119
+ },
120
+ )}
121
+ style={avatarStyle}
122
+ ref={avatarRef}
123
+ >
124
+ {children}
125
+ {useDefaultAvatar &&
126
+ (defaultOverLap === void 0 ? (
127
+ <IconUserFill
128
+ className={`${prefixCls}-avatar-default ${prefixCls}-avatar-default-icon-size-${size}`}
129
+ />
130
+ ) : (
131
+ defaultOverLap
132
+ ))}
133
+ {isImageAvatar && src && (
134
+ <Comp
135
+ {...({
136
+ className: `${prefixCls}-avatar-img`,
137
+ src,
138
+ } as P)}
139
+ {...imageProps}
140
+ />
141
+ )}
142
+ {isTextAvatar && (
143
+ <span
144
+ className={`${prefixCls}-avatar-text ${prefixCls}-avatar-text-size-${size}`}
145
+ ref={avatarTextRef}
146
+ style={{
147
+ transform: `scale(${textScale})`,
148
+ }}
149
+ >
150
+ {textAvatar}
151
+ </span>
152
+ )}
153
+ {decoration && (
154
+ <div
155
+ className={`${prefixCls}-avatar-decoration`}
156
+ onClick={onClickDecoration}
157
+ >
158
+ {decoration}
159
+ </div>
160
+ )}
161
+ </div>
162
+ {renderInfo}
163
+ {!renderInfo && avatarName && (
164
+ <div className={cls(`${prefixCls}-avatar-info`)}>
165
+ <div
166
+ className={`${prefixCls}-avatar-name ${prefixCls}-avatar-name-size-${size}`}
167
+ >
168
+ {avatarName}
169
+ </div>
170
+ {avatarDesc && (
171
+ <div
172
+ className={`${prefixCls}-avatar-desc ${prefixCls}-avatar-desc-size-${size}`}
173
+ >
174
+ {avatarDesc}
175
+ </div>
176
+ )}
177
+ </div>
178
+ )}
179
+ </div>
180
+ );
181
+ });
182
+ }
183
+
184
+ const Avatar = componentGenerator(BaseImage);
185
+
186
+ /**
187
+ * 头像展示组件,支持圆形和方形两种形状,支持图片文字头像,支持五种尺寸。
188
+ * @en Avatar component supports two shapes of circle and square, supports pictures or text avatars, with five sizes.
189
+ * @type 信息展示
190
+ * @type_en Data Display
191
+ * @name 头像
192
+ * @name_en Avatar
193
+ */
194
+ export default componentWrapper(Avatar, {
195
+ Group,
196
+ });
@@ -0,0 +1,28 @@
1
+ ### 信息展示
2
+
3
+ # 徽标 Badge
4
+
5
+ 在右上角展示徽标数字或小红点
6
+
7
+ ======
8
+
9
+ > 属性/Props
10
+
11
+ |参数|描述|类型|默认值|
12
+ |----------|-------------|------|------|
13
+ |className|自定义类名|string|-|
14
+ |style|自定义样式|CSSProperties|-|
15
+ |visible|是否展示徽标,visible切换时有动画过渡|boolean|true|
16
+ |text|徽标文案|ReactText|-|
17
+ |dot|显示为一个小红点|boolean|false|
18
+ |maxCount|最大完整展示数字,超出后将展示 \+|number|99|
19
+ |children|内容|ReactNode|-|
20
+ |absolute|是否置于右上角|boolean|false|
21
+ |bordered|是否有白色边框|boolean|false|
22
+ |timeout|动画持续时间(ms)|number \| \{ appear?: number; enter?: number; exit?: number; \}|300|
23
+
24
+ > 引用/Refs
25
+
26
+ |参数|描述|类型|
27
+ |----------|-------------|------|
28
+ |dom|最外层元素 DOM|HTMLDivElement|
@@ -0,0 +1,128 @@
1
+ import type { Ref, ReactNode } from 'react';
2
+ import React, { useRef, forwardRef, useImperativeHandle } from 'react';
3
+ import { cls } from '@arco-design/mobile-utils';
4
+ import Transition from '../transition';
5
+ import { ContextLayout } from '../context-provider';
6
+
7
+ export interface BadgeProps {
8
+ /**
9
+ * 自定义类名
10
+ * @en Custom classname
11
+ */
12
+ className?: string;
13
+ /**
14
+ * 自定义样式
15
+ * @en Custom stylesheet
16
+ */
17
+ style?: React.CSSProperties;
18
+ /**
19
+ * 是否展示徽标,visible切换时有动画过渡
20
+ * @en Whether to display the badge, there is an animation transition when the visible status switch
21
+ * @default true
22
+ */
23
+ visible?: boolean;
24
+ /**
25
+ * 徽标文案
26
+ * @en badge text
27
+ */
28
+ text?: string | number;
29
+ /**
30
+ * 显示为一个小红点
31
+ * @en show as a red dot
32
+ * @default false
33
+ */
34
+ dot?: boolean;
35
+ /**
36
+ * 最大完整展示数字,超出后将展示 +
37
+ * @en Maximum full impression number, it will be displayed "+" beyond the number
38
+ * @default 99
39
+ */
40
+ maxCount?: number;
41
+ /**
42
+ * 内容
43
+ * @en Badge content
44
+ */
45
+ children?: ReactNode;
46
+ /**
47
+ * 是否置于右上角
48
+ * @en Whether the badge is placed in the upper right corner
49
+ * @default false
50
+ */
51
+ absolute?: boolean;
52
+ /**
53
+ * 是否有白色边框
54
+ * @en Whether the badge has a white border
55
+ * @default false
56
+ */
57
+ bordered?: boolean;
58
+ /**
59
+ * 动画持续时间(ms)
60
+ * @en Animation duration(ms)
61
+ * @default 300
62
+ */
63
+ timeout?: number | { appear?: number; enter?: number; exit?: number };
64
+ }
65
+
66
+ export interface BadgeRef {
67
+ /**
68
+ * 最外层元素 DOM
69
+ * @en The outermost element DOM
70
+ */
71
+ dom: HTMLDivElement | null;
72
+ }
73
+
74
+ /**
75
+ * 在右上角展示徽标数字或小红点
76
+ * @en Display the badge number or small red dot in the upper right corner
77
+ * @type 信息展示
78
+ * @type_en Data Display
79
+ * @name 徽标
80
+ * @name_en Badge
81
+ */
82
+ const Badge = forwardRef((props: BadgeProps, ref: Ref<BadgeRef>) => {
83
+ const {
84
+ className = '',
85
+ style = {},
86
+ visible = true,
87
+ text,
88
+ dot = false,
89
+ maxCount = 99,
90
+ children = null,
91
+ absolute = false,
92
+ bordered = false,
93
+ timeout = 400,
94
+ } = props;
95
+ const domRef = useRef<HTMLDivElement | null>(null);
96
+
97
+ useImperativeHandle(ref, () => ({
98
+ dom: domRef.current,
99
+ }));
100
+ function renderInnerBadge(prefix: string) {
101
+ return dot ? null : (
102
+ <span className={`${prefix}-text badge-text`}>
103
+ {Number(text) && Number(text) > maxCount ? `${maxCount}+` : text}
104
+ </span>
105
+ );
106
+ }
107
+ return (
108
+ <ContextLayout>
109
+ {({ prefixCls }) => (
110
+ <Transition in={visible} timeout={timeout} type="scale" nodeRef={domRef}>
111
+ <div
112
+ className={cls(`${prefixCls}-badge`, className, {
113
+ [`${prefixCls}-badge-dot dot`]: dot,
114
+ [`${prefixCls}-badge-bordered bordered`]: bordered,
115
+ [`${prefixCls}-badge-absolute absolute`]: absolute,
116
+ })}
117
+ style={style}
118
+ ref={domRef}
119
+ >
120
+ {children || renderInnerBadge(`${prefixCls}-badge`)}
121
+ </div>
122
+ </Transition>
123
+ )}
124
+ </ContextLayout>
125
+ );
126
+ });
127
+
128
+ export default Badge;
@@ -0,0 +1,45 @@
1
+ ### 通用
2
+
3
+ # 按钮 Button
4
+
5
+ 按钮用于开始一个即时操作。
6
+
7
+ ======
8
+
9
+ > 属性/Props
10
+
11
+ |参数|描述|类型|默认值|
12
+ |----------|-------------|------|------|
13
+ |type|样式类型|"primary" \| "ghost" \| "default"|"primary"|
14
+ |size|尺寸|"mini" \| "small" \| "medium" \| "large" \| "huge"|"large"|
15
+ |inline|是否为内联样式|boolean|false|
16
+ |loading|是否处于加载中状态|boolean|false|
17
+ |disabled|是否禁用|boolean|false|
18
+ |halfBorder|border是否为0\.5px|boolean|false|
19
+ |icon|图标名,传入Icon组件|ReactNode|-|
20
+ |showTextWhenLoading|加载中是否展示文字|boolean|true|
21
+ |needActive|是否需要点击态|boolean|true|
22
+ |style|自定义样式|CSSProperties|-|
23
+ |shape|按钮形状|"round" \| "semi" \| "square"|"semi"|
24
+ |color|自定义字体颜色|ButtonColorStatus|-|
25
+ |bgColor|自定义背景颜色|ButtonColorStatus|-|
26
+ |borderColor|自定义边框颜色|ButtonColorStatus|-|
27
+ |className|自定义类名|string|-|
28
+ |loadingIcon|加载图标,传入Icon组件type属性或node|ReactNode|-|
29
+ |children|子元素|ReactNode|-|
30
+ |onClick|点击按钮的回调函数|(e: MouseEvent\<Element, MouseEvent\>) =\> void|-|
31
+ |onClickDisabled|禁用状态下点击按钮的回调函数|(e: MouseEvent\<Element, MouseEvent\>) =\> void|-|
32
+ |disableWhenLoading|加载中是否禁用按钮操作|boolean|true|
33
+ |coverIconWhenLoading|加载中是否覆盖Icon|boolean|true|
34
+
35
+ > 引用/Refs
36
+
37
+ |参数|描述|类型|
38
+ |----------|-------------|------|
39
+ |dom|最外层元素 DOM|HTMLButtonElement|
40
+
41
+ > ButtonColorStatus
42
+
43
+ ```
44
+ string | { normal: string; active: string; disabled: string; }
45
+ ```