@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,101 @@
1
+ ### 信息展示
2
+
3
+ # 骨架屏 Skeleton
4
+
5
+ 在内容加载过程中展示一组占位图形。
6
+
7
+ ======
8
+
9
+ > 属性/Props
10
+
11
+ |参数|描述|类型|默认值|
12
+ |----------|-------------|------|------|
13
+ |title|是否显示标题占位图|boolean \| SkeletonTitleProps|true|
14
+ |paragraph|是否显示段落占位图|boolean \| SkeletonParagraphProps|true|
15
+ |avatar|是否显示头像占位图|boolean \| SkeletonAvatarProps|false|
16
+ |grid|是否显示金刚位占位图(如该参数非空时,默认展示四列金刚位,且不展示标题/段落/头像占位符)|boolean \| SkeletonGridProps|false|
17
+ |showAnimation|是否展示动画效果|boolean|true|
18
+ |animation|加载动画效果,可选“扫光”、“呼吸”两种效果|"gradient" \| "breath"|"gradient"|
19
+ |animationGradientColor|扫光动效高光颜色|string|"rgba(0, 0, 0, 0.04)"|
20
+ |backgroundColor|占位块背景色|string|"#F7F8FA"|
21
+ |children|子元素|ReactNode|null|
22
+ |className|自定义类名|string|""|
23
+ |style|自定义样式|CSSProperties|{}|
24
+
25
+ > 引用/Refs
26
+
27
+ |参数|描述|类型|
28
+ |----------|-------------|------|
29
+ |dom|最外层 DOM 元素|HTMLDivElement|
30
+
31
+ > Skeleton.Node
32
+
33
+ |参数|描述|类型|默认值|
34
+ |----------|-------------|------|------|
35
+ |children|自定义组件内容|ReactNode|null|
36
+ |className|自定义类名|string|""|
37
+ |style|自定义样式|CSSProperties|{}|
38
+
39
+ > Skeleton.Title
40
+
41
+ |参数|描述|类型|默认值|
42
+ |----------|-------------|------|------|
43
+ |width|标题占位图宽度|ReactText|"40%"|
44
+ |className|自定义类名|string|""|
45
+ |style|自定义样式|CSSProperties|{}|
46
+
47
+ > Skeleton.Paragraph
48
+
49
+ |参数|描述|类型|默认值|
50
+ |----------|-------------|------|------|
51
+ |rows|段落占位图的行数|number|3|
52
+ |width|段落占位图宽度,若为数组格式对应每行宽度,否则表示最后一行的宽度|string \| number \| ReactText\[\]|"60%"|
53
+ |className|自定义类名|string|""|
54
+ |style|自定义样式|CSSProperties|{}|
55
+
56
+ > Skeleton.Avatar
57
+
58
+ |参数|描述|类型|默认值|
59
+ |----------|-------------|------|------|
60
+ |className|自定义类名|string|""|
61
+ |style|自定义样式|CSSProperties|{}|
62
+
63
+ > Skeleton.Grid
64
+
65
+ |参数|描述|类型|默认值|
66
+ |----------|-------------|------|------|
67
+ |columns|金刚位列数|number|4|
68
+ |className|自定义类名|string|""|
69
+ |style|自定义样式|CSSProperties|{}|
70
+
71
+ > SkeletonTitleProps
72
+
73
+ |参数|描述|类型|默认值|
74
+ |----------|-------------|------|------|
75
+ |width|标题占位图宽度|ReactText|"40%"|
76
+ |className|自定义类名|string|""|
77
+ |style|自定义样式|CSSProperties|{}|
78
+
79
+ > SkeletonParagraphProps
80
+
81
+ |参数|描述|类型|默认值|
82
+ |----------|-------------|------|------|
83
+ |rows|段落占位图的行数|number|3|
84
+ |width|段落占位图宽度,若为数组格式对应每行宽度,否则表示最后一行的宽度|string \| number \| ReactText\[\]|"60%"|
85
+ |className|自定义类名|string|""|
86
+ |style|自定义样式|CSSProperties|{}|
87
+
88
+ > SkeletonAvatarProps
89
+
90
+ |参数|描述|类型|默认值|
91
+ |----------|-------------|------|------|
92
+ |className|自定义类名|string|""|
93
+ |style|自定义样式|CSSProperties|{}|
94
+
95
+ > SkeletonGridProps
96
+
97
+ |参数|描述|类型|默认值|
98
+ |----------|-------------|------|------|
99
+ |columns|金刚位列数|number|4|
100
+ |className|自定义类名|string|""|
101
+ |style|自定义样式|CSSProperties|{}|
@@ -0,0 +1,290 @@
1
+ import React, {
2
+ Ref,
3
+ forwardRef,
4
+ useContext,
5
+ useEffect,
6
+ useImperativeHandle,
7
+ useRef,
8
+ useState,
9
+ } from 'react';
10
+ import { cls, isArray, nextTick } from '@arco-design/mobile-utils';
11
+ import { useListenResize } from '../_helpers';
12
+ import { GlobalContext } from '../context-provider';
13
+ import {
14
+ SkeletonAvatarProps,
15
+ SkeletonGridProps,
16
+ SkeletonNodeProps,
17
+ SkeletonParagraphProps,
18
+ SkeletonRef,
19
+ SkeletonTitleProps,
20
+ } from './type';
21
+ import { SkeletonContext } from './skeleton-context';
22
+
23
+ const calcOffset = (dom?: HTMLElement | null, useRtl?: boolean) => {
24
+ if (!dom) {
25
+ return 0;
26
+ }
27
+ if (useRtl) {
28
+ return dom.offsetLeft - dom.offsetTop;
29
+ }
30
+ return dom.offsetLeft + dom.offsetTop;
31
+ };
32
+
33
+ function useOffset<T extends HTMLElement, K extends React.MutableRefObject<T | null> | T[]>(
34
+ dom?: K,
35
+ useRtl?: boolean,
36
+ ) {
37
+ const [offset, setOffset] = useState<number | number[]>();
38
+ const calcLayout = () => {
39
+ const isList = Array.isArray(dom);
40
+ if (
41
+ !(isList ? (dom as T[]).length > 0 : (dom as React.MutableRefObject<T | null>)?.current)
42
+ ) {
43
+ return;
44
+ }
45
+ setOffset(
46
+ isList
47
+ ? (dom as T[]).map(item => calcOffset(item, useRtl))
48
+ : calcOffset((dom as React.MutableRefObject<T | null>).current, useRtl),
49
+ );
50
+ };
51
+
52
+ useEffect(() => {
53
+ nextTick(() => {
54
+ calcLayout();
55
+ });
56
+ }, [dom, useRtl]);
57
+
58
+ useListenResize(calcLayout);
59
+ return offset as K extends T[] ? number[] : number;
60
+ }
61
+
62
+ export const SkeletonNode = forwardRef((props: SkeletonNodeProps, ref: Ref<SkeletonRef>) => {
63
+ const { className = '', style, children } = props;
64
+ const { useRtl, prefixCls } = useContext(GlobalContext);
65
+ const { backgroundColor, showAnimation, animation } = useContext(SkeletonContext);
66
+ const domRef = useRef<HTMLDivElement | null>(null);
67
+ const isGradientAnimation = showAnimation && animation === 'gradient';
68
+ const offset = useOffset(isGradientAnimation ? domRef : undefined, useRtl);
69
+
70
+ useImperativeHandle(ref, () => ({
71
+ dom: domRef.current,
72
+ }));
73
+
74
+ return (
75
+ <div
76
+ className={cls(
77
+ `${prefixCls}-skeleton-item`,
78
+ `${prefixCls}-skeleton-node`,
79
+ showAnimation && `${prefixCls}-skeleton-animation-${animation}`,
80
+ className,
81
+ )}
82
+ style={{ backgroundColor, ...style }}
83
+ ref={domRef}
84
+ >
85
+ {children}
86
+ {isGradientAnimation && offset !== undefined && (
87
+ <div
88
+ className={`${prefixCls}-skeleton-animation-item`}
89
+ style={{ left: 0 - offset }}
90
+ />
91
+ )}
92
+ </div>
93
+ );
94
+ });
95
+
96
+ export const SkeletonTitle = forwardRef((props: SkeletonTitleProps, ref: Ref<SkeletonRef>) => {
97
+ const { className = '', style, width = '40%' } = props;
98
+ const { useRtl, prefixCls } = useContext(GlobalContext);
99
+ const { backgroundColor, showAnimation, animation } = useContext(SkeletonContext);
100
+ const domRef = useRef<HTMLDivElement | null>(null);
101
+ const isGradientAnimation = showAnimation && animation === 'gradient';
102
+ const offset = useOffset(isGradientAnimation ? domRef : undefined, useRtl);
103
+
104
+ useImperativeHandle(ref, () => ({
105
+ dom: domRef.current,
106
+ }));
107
+
108
+ return (
109
+ <div
110
+ className={cls(
111
+ `${prefixCls}-skeleton-item`,
112
+ `${prefixCls}-skeleton-title`,
113
+ showAnimation && `${prefixCls}-skeleton-animation-${animation}`,
114
+ className,
115
+ )}
116
+ style={{ width, backgroundColor, ...style }}
117
+ ref={domRef}
118
+ >
119
+ {isGradientAnimation && offset !== undefined && (
120
+ <div
121
+ className={`${prefixCls}-skeleton-animation-item`}
122
+ style={{ left: 0 - offset }}
123
+ />
124
+ )}
125
+ </div>
126
+ );
127
+ });
128
+
129
+ export const SkeletonParagraph = forwardRef(
130
+ (props: SkeletonParagraphProps, ref: Ref<SkeletonRef>) => {
131
+ const { className = '', style, rows = 3, width = '60%' } = props;
132
+ const { useRtl, prefixCls } = useContext(GlobalContext);
133
+ const { backgroundColor, showAnimation, animation } = useContext(SkeletonContext);
134
+ const domRef = useRef<HTMLDivElement | null>(null);
135
+ const lineDomRefs = useRef<HTMLDivElement[]>([]);
136
+ const isGradientAnimation = showAnimation && animation === 'gradient';
137
+ const offsets = useOffset(isGradientAnimation ? lineDomRefs.current : undefined, useRtl);
138
+
139
+ useImperativeHandle(ref, () => ({
140
+ dom: domRef.current,
141
+ }));
142
+
143
+ const getWidth = (idx: number) => {
144
+ if (isArray(width)) {
145
+ return width[idx];
146
+ }
147
+ if (rows - 1 === idx) {
148
+ return width;
149
+ }
150
+ return undefined;
151
+ };
152
+
153
+ return (
154
+ <div
155
+ className={cls(`${prefixCls}-skeleton-paragraph`, className)}
156
+ style={style}
157
+ ref={domRef}
158
+ >
159
+ {Array.from(new Array(rows)).map((_, idx) => (
160
+ <div
161
+ key={idx}
162
+ className={cls(
163
+ `${prefixCls}-skeleton-item`,
164
+ `${prefixCls}-skeleton-paragraph-line`,
165
+ showAnimation && `${prefixCls}-skeleton-animation-${animation}`,
166
+ )}
167
+ style={{
168
+ width: getWidth(idx),
169
+ backgroundColor,
170
+ }}
171
+ ref={el => {
172
+ if (el) {
173
+ lineDomRefs.current[idx] = el;
174
+ }
175
+ }}
176
+ >
177
+ {isGradientAnimation && offsets !== undefined && (
178
+ <div
179
+ className={`${prefixCls}-skeleton-animation-item`}
180
+ style={{ left: 0 - (offsets[idx] || 0) }}
181
+ />
182
+ )}
183
+ </div>
184
+ ))}
185
+ </div>
186
+ );
187
+ },
188
+ );
189
+
190
+ export const SkeletonAvatar = forwardRef((props: SkeletonAvatarProps, ref: Ref<SkeletonRef>) => {
191
+ const { className = '', style } = props;
192
+ const { useRtl, prefixCls } = useContext(GlobalContext);
193
+ const { backgroundColor, showAnimation, animation } = useContext(SkeletonContext);
194
+ const domRef = useRef<HTMLDivElement | null>(null);
195
+ const isGradientAnimation = showAnimation && animation === 'gradient';
196
+ const offset = useOffset(isGradientAnimation ? domRef : undefined, useRtl);
197
+
198
+ useImperativeHandle(ref, () => ({
199
+ dom: domRef.current,
200
+ }));
201
+
202
+ return (
203
+ <div
204
+ className={cls(
205
+ `${prefixCls}-skeleton-item`,
206
+ `${prefixCls}-skeleton-avatar`,
207
+ showAnimation && `${prefixCls}-skeleton-animation-${animation}`,
208
+ className,
209
+ )}
210
+ style={{ backgroundColor, ...style }}
211
+ ref={domRef}
212
+ >
213
+ {isGradientAnimation && offset !== undefined && (
214
+ <div
215
+ className={`${prefixCls}-skeleton-animation-item`}
216
+ style={{ left: 0 - offset }}
217
+ />
218
+ )}
219
+ </div>
220
+ );
221
+ });
222
+
223
+ export const SkeletonGrid = forwardRef((props: SkeletonGridProps, ref: Ref<SkeletonRef>) => {
224
+ const { className = '', style, columns = 4 } = props;
225
+ const { useRtl, prefixCls } = useContext(GlobalContext);
226
+ const { backgroundColor, showAnimation, animation } = useContext(SkeletonContext);
227
+ const domRef = useRef<HTMLDivElement | null>(null);
228
+ const iconDomRefs = useRef<HTMLDivElement[]>([]);
229
+ const textDomRefs = useRef<HTMLDivElement[]>([]);
230
+ const isGradientAnimation = showAnimation && animation === 'gradient';
231
+ const iconOffsets = useOffset(isGradientAnimation ? iconDomRefs.current : undefined, useRtl);
232
+ const textOffsets = useOffset(isGradientAnimation ? textDomRefs.current : undefined, useRtl);
233
+
234
+ useImperativeHandle(ref, () => ({
235
+ dom: domRef.current,
236
+ }));
237
+
238
+ return (
239
+ <div className={cls(`${prefixCls}-skeleton-grid`, className)} style={style} ref={domRef}>
240
+ {Array.from(new Array(columns)).map((_, idx) => (
241
+ <div key={idx} className={cls(`${prefixCls}-skeleton-grid-item`)}>
242
+ <div
243
+ className={cls(
244
+ `${prefixCls}-skeleton-item`,
245
+ `${prefixCls}-skeleton-grid-icon`,
246
+ showAnimation && `${prefixCls}-skeleton-animation-${animation}`,
247
+ )}
248
+ style={{ backgroundColor }}
249
+ ref={el => {
250
+ if (el) {
251
+ iconDomRefs.current[idx] = el;
252
+ }
253
+ }}
254
+ >
255
+ {isGradientAnimation && iconOffsets !== undefined && (
256
+ <div
257
+ className={`${prefixCls}-skeleton-animation-item`}
258
+ style={{
259
+ left: 0 - (iconOffsets?.[idx] || 0),
260
+ }}
261
+ />
262
+ )}
263
+ </div>
264
+ <div
265
+ className={cls(
266
+ `${prefixCls}-skeleton-item`,
267
+ `${prefixCls}-skeleton-grid-text`,
268
+ showAnimation && `${prefixCls}-skeleton-animation-${animation}`,
269
+ )}
270
+ style={{ backgroundColor }}
271
+ ref={el => {
272
+ if (el) {
273
+ textDomRefs.current[idx] = el;
274
+ }
275
+ }}
276
+ >
277
+ {isGradientAnimation && textOffsets !== undefined && (
278
+ <div
279
+ className={`${prefixCls}-skeleton-animation-item`}
280
+ style={{
281
+ left: 0 - (textOffsets?.[idx] || 0),
282
+ }}
283
+ />
284
+ )}
285
+ </div>
286
+ </div>
287
+ ))}
288
+ </div>
289
+ );
290
+ });
@@ -0,0 +1,96 @@
1
+ import React, { useRef, forwardRef, Ref, useImperativeHandle, useContext } from 'react';
2
+ import { cls, componentWrapper } from '@arco-design/mobile-utils';
3
+ import { GlobalContext } from '../context-provider';
4
+ import { SkeletonProps, SkeletonRef } from './type';
5
+ import {
6
+ SkeletonAvatar as Avatar,
7
+ SkeletonGrid as Grid,
8
+ SkeletonNode as Node,
9
+ SkeletonParagraph as Paragraph,
10
+ SkeletonTitle as Title,
11
+ } from './elements';
12
+ import { SkeletonContext } from './skeleton-context';
13
+
14
+ export * from './type';
15
+
16
+ function getComponentProps<T>(prop?: T | boolean): T | {} {
17
+ if (prop && typeof prop === 'object') {
18
+ return prop;
19
+ }
20
+ return {};
21
+ }
22
+
23
+ const Skeleton = forwardRef((props: SkeletonProps, ref: Ref<SkeletonRef>) => {
24
+ const {
25
+ className = '',
26
+ style,
27
+ children,
28
+ title = true,
29
+ paragraph = true,
30
+ avatar = false,
31
+ grid,
32
+ showAnimation = true,
33
+ animation = 'gradient',
34
+ animationGradientColor,
35
+ backgroundColor,
36
+ } = props;
37
+ const domRef = useRef<HTMLDivElement | null>(null);
38
+ const { prefixCls } = useContext(GlobalContext);
39
+
40
+ useImperativeHandle(ref, () => ({
41
+ dom: domRef.current,
42
+ }));
43
+
44
+ const isGrid = !!grid;
45
+ const hasTitle = !!title;
46
+ const hasParagraph = !!paragraph;
47
+ const hasAvatar = !!avatar;
48
+ const content = isGrid ? (
49
+ <Grid {...getComponentProps(grid)} />
50
+ ) : (
51
+ <>
52
+ {hasAvatar && <Avatar {...getComponentProps(avatar)} />}
53
+ {(hasTitle || hasParagraph) && (
54
+ <div className={`${prefixCls}-skeleton-content`}>
55
+ {hasTitle && <Title {...getComponentProps(title)} />}
56
+ {hasParagraph && <Paragraph {...getComponentProps(paragraph)} />}
57
+ </div>
58
+ )}
59
+ </>
60
+ );
61
+
62
+ return (
63
+ <div
64
+ className={cls(
65
+ `${prefixCls}-skeleton`,
66
+ {
67
+ [`${prefixCls}-skeleton-with-avatar`]: hasAvatar,
68
+ },
69
+ className,
70
+ )}
71
+ style={{ color: animationGradientColor, ...style }}
72
+ ref={domRef}
73
+ >
74
+ <SkeletonContext.Provider value={{ showAnimation, animation, backgroundColor }}>
75
+ {content}
76
+ {children}
77
+ </SkeletonContext.Provider>
78
+ </div>
79
+ );
80
+ });
81
+
82
+ /**
83
+ * 在内容加载过程中展示一组占位图形。
84
+ * @en Display a set of placeholder graphics during content loading
85
+ * @type 信息展示
86
+ * @type_en Data Display
87
+ * @name 骨架屏
88
+ * @name_en Skeleton
89
+ */
90
+ export default componentWrapper(Skeleton, {
91
+ Node,
92
+ Title,
93
+ Paragraph,
94
+ Avatar,
95
+ Grid,
96
+ });
@@ -0,0 +1,7 @@
1
+ import React from 'react';
2
+ import { SkeletonContextParams, SkeletonProps } from './type';
3
+
4
+ export const SkeletonContext = React.createContext<SkeletonContextParams>({
5
+ showAnimation: true,
6
+ animation: 'gradient' as SkeletonProps['animation'],
7
+ });
@@ -0,0 +1,42 @@
1
+ ### 数据录入
2
+
3
+ # 滑动输入条 Slider
4
+
5
+ 滑动型输入器,展示当前值和可选范围。
6
+
7
+ ======
8
+
9
+ > 属性/Props
10
+
11
+ |参数|描述|类型|默认值|
12
+ |----------|-------------|------|------|
13
+ |className|自定义类名|string|""|
14
+ |style|自定义样式|CSSProperties|{}|
15
+ |disabled|是否禁用|boolean|false|
16
+ |useRange|使用范围选择|boolean|根据 传入初始参数判断,没有则为 false|
17
+ |useAnimation|非点击状态使用动画|boolean|true|
18
+ |min|最小值|number|0|
19
+ |max|最大值|number|100|
20
+ |defaultValue|默认初始值|number \| \[number, number\]|-|
21
+ |value|基础值,组件受控|number \| \[number, number\]|-|
22
+ |step|最小单位|number|1|
23
+ |type|组件方向|"horizontal" \| "vertical"|"horizontal"|
24
+ |showTooltip|是否展示气泡|"auto" \| "always" \| "never"|"auto"|
25
+ |marks|滑动条节点配置|number \| number\[\] \| Record\<string, ReactNode\>|-|
26
+ |showMarks|是否展示标签底部文案|boolean|false|
27
+ |useMarkOnly|是否只可用标志的值,覆盖 step|boolean|false|
28
+ |prefixLabel|前缀 icon 或者 文案|ReactNode \| ((value: number \| \[\.\.\.\]) =\> ReactNode)|-|
29
+ |suffixLabel|后缀 icon 或者 文案|ReactNode \| ((value: number \| \[\.\.\.\]) =\> ReactNode)|-|
30
+ |size|组件横条粗细,单位 px|ReactText|2|
31
+ |draggableTrackOnly|只允许拖动滑块 默认 false|boolean|false|
32
+ |formatTooltip|自定义气泡内容|(value: number) =\> ReactNode|-|
33
+ |onAfterChange|修改后事件,时机同 touchend|(value: number \| \[number, number\]) =\> void|-|
34
+ |onChange|实时修改事件|(value: number \| \[number, number\]) =\> void|-|
35
+ |renderThumb|自定义滑块|(value: number) =\> ReactNode|-|
36
+ |renderThumbPopover|自定义滑块的Popover,优先级高于formatTooltip。value表示当前滑动进度,visible表示气泡的可见性,index表示当前滑块索引,thumbEl表示当前滑块元素。|(config: \{ value: number; visible: boolean; index: number; thumbEl: ReactNode; \}) =\> ReactNode|-|
37
+
38
+ > 引用/Refs
39
+
40
+ |参数|描述|类型|
41
+ |----------|-------------|------|
42
+ |dom|最外层元素 DOM|HTMLDivElement|