@fjyueke/arco-mcp 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +113 -1
- package/metaData/components/action-sheet/api.md +94 -0
- package/metaData/components/action-sheet/style.md +57 -0
- package/metaData/components/avatar/api.md +49 -0
- package/metaData/components/avatar/style.md +147 -0
- package/metaData/components/badge/api.md +20 -0
- package/metaData/components/badge/style.md +74 -0
- package/metaData/components/button/api.md +37 -0
- package/metaData/components/button/style.md +151 -0
- package/metaData/components/carousel/api.md +81 -0
- package/metaData/components/carousel/style.md +208 -0
- package/metaData/components/cell/api.md +60 -0
- package/metaData/components/cell/style.md +123 -0
- package/metaData/components/checkbox/api.md +83 -0
- package/metaData/components/checkbox/style.md +62 -0
- package/metaData/components/circle-progress/api.md +32 -0
- package/metaData/components/circle-progress/style.md +52 -0
- package/metaData/components/collapse/api.md +66 -0
- package/metaData/components/collapse/style.md +53 -0
- package/metaData/components/context-provider/api.md +36 -0
- package/metaData/components/context-provider/style.md +1 -0
- package/metaData/components/count-down/api.md +32 -0
- package/metaData/components/count-down/style.md +7 -0
- package/metaData/components/date-picker/api.md +94 -0
- package/metaData/components/date-picker/style.md +27 -0
- package/metaData/components/dialog/api.md +192 -0
- package/metaData/components/dialog/style.md +271 -0
- package/metaData/components/divider/api.md +17 -0
- package/metaData/components/divider/style.md +68 -0
- package/metaData/components/dropdown/api.md +72 -0
- package/metaData/components/dropdown/style.md +108 -0
- package/metaData/components/dropdown-menu/api.md +83 -0
- package/metaData/components/dropdown-menu/style.md +60 -0
- package/metaData/components/ellipsis/api.md +25 -0
- package/metaData/components/ellipsis/style.md +31 -0
- package/metaData/components/form/api.md +82 -0
- package/metaData/components/form/style.md +105 -0
- package/metaData/components/grid/api.md +31 -0
- package/metaData/components/grid/style.md +109 -0
- package/metaData/components/icon/api.md +7 -0
- package/metaData/components/image/api.md +54 -0
- package/metaData/components/image/style.md +144 -0
- package/metaData/components/image-picker/api.md +108 -0
- package/metaData/components/image-picker/style.md +116 -0
- package/metaData/components/image-preview/api.md +111 -0
- package/metaData/components/image-preview/style.md +103 -0
- package/metaData/components/index-bar/api.md +75 -0
- package/metaData/components/index-bar/style.md +122 -0
- package/metaData/components/input/api.md +52 -0
- package/metaData/components/input/style.md +108 -0
- package/metaData/components/keyboard/api.md +65 -0
- package/metaData/components/keyboard/style.md +80 -0
- package/metaData/components/load-more/api.md +40 -0
- package/metaData/components/load-more/style.md +7 -0
- package/metaData/components/loading/api.md +26 -0
- package/metaData/components/loading/style.md +102 -0
- package/metaData/components/masking/api.md +85 -0
- package/metaData/components/masking/style.md +30 -0
- package/metaData/components/nav-bar/api.md +32 -0
- package/metaData/components/nav-bar/style.md +112 -0
- package/metaData/components/notice-bar/api.md +26 -0
- package/metaData/components/notice-bar/style.md +124 -0
- package/metaData/components/notify/api.md +73 -0
- package/metaData/components/notify/style.md +40 -0
- package/metaData/components/pagination/api.md +33 -0
- package/metaData/components/pagination/style.md +105 -0
- package/metaData/components/picker/api.md +81 -0
- package/metaData/components/picker/style.md +46 -0
- package/metaData/components/picker-view/api.md +49 -0
- package/metaData/components/picker-view/style.md +75 -0
- package/metaData/components/popover/api.md +136 -0
- package/metaData/components/popover/style.md +226 -0
- package/metaData/components/popup/api.md +93 -0
- package/metaData/components/popup/style.md +115 -0
- package/metaData/components/popup-swiper/api.md +100 -0
- package/metaData/components/popup-swiper/style.md +10 -0
- package/metaData/components/portal/api.md +6 -0
- package/metaData/components/portal/style.md +1 -0
- package/metaData/components/progress/api.md +34 -0
- package/metaData/components/progress/style.md +114 -0
- package/metaData/components/pull-refresh/api.md +29 -0
- package/metaData/components/pull-refresh/style.md +86 -0
- package/metaData/components/radio/api.md +81 -0
- package/metaData/components/radio/style.md +57 -0
- package/metaData/components/rate/api.md +25 -0
- package/metaData/components/rate/style.md +63 -0
- package/metaData/components/search-bar/api.md +89 -0
- package/metaData/components/search-bar/style.md +115 -0
- package/metaData/components/show-monitor/api.md +26 -0
- package/metaData/components/show-monitor/style.md +1 -0
- package/metaData/components/skeleton/api.md +93 -0
- package/metaData/components/skeleton/style.md +147 -0
- package/metaData/components/slider/api.md +34 -0
- package/metaData/components/slider/style.md +292 -0
- package/metaData/components/stepper/api.md +38 -0
- package/metaData/components/stepper/style.md +85 -0
- package/metaData/components/steps/api.md +49 -0
- package/metaData/components/steps/style.md +304 -0
- package/metaData/components/sticky/api.md +37 -0
- package/metaData/components/sticky/style.md +5 -0
- package/metaData/components/swipe-action/api.md +36 -0
- package/metaData/components/swipe-action/style.md +89 -0
- package/metaData/components/swipe-load/api.md +35 -0
- package/metaData/components/swipe-load/style.md +29 -0
- package/metaData/components/switch/api.md +30 -0
- package/metaData/components/switch/style.md +158 -0
- package/metaData/components/tab-bar/api.md +49 -0
- package/metaData/components/tab-bar/style.md +57 -0
- package/metaData/components/tabs/api.md +179 -0
- package/metaData/components/tabs/style.md +436 -0
- package/metaData/components/tag/api.md +72 -0
- package/metaData/components/tag/style.md +133 -0
- package/metaData/components/textarea/api.md +59 -0
- package/metaData/components/textarea/style.md +37 -0
- package/metaData/components/toast/api.md +82 -0
- package/metaData/components/toast/style.md +93 -0
- package/metaData/components/transition/api.md +11 -0
- package/metaData/components/transition/style.md +28 -0
- package/metaData/components/uploader/api.md +74 -0
- package/metaData/components/uploader/style.md +86 -0
- package/metaData/tokens.json +2358 -0
- package/package.json +1 -1
package/dist/index.js
CHANGED
|
@@ -23,7 +23,8 @@ var config = {
|
|
|
23
23
|
componentsIndexPath: resolve(
|
|
24
24
|
__dirname,
|
|
25
25
|
"../metaData/components-index.json"
|
|
26
|
-
)
|
|
26
|
+
),
|
|
27
|
+
tokensPath: resolve(__dirname, "../metaData/tokens.json")
|
|
27
28
|
},
|
|
28
29
|
server: {
|
|
29
30
|
name: "arco-mcp",
|
|
@@ -156,6 +157,70 @@ ${content}
|
|
|
156
157
|
return `Failed to load examples for ${component.name}`;
|
|
157
158
|
}
|
|
158
159
|
};
|
|
160
|
+
var fetchComponentStyle = async (componentName) => {
|
|
161
|
+
const component = await locateComponentByName(componentName);
|
|
162
|
+
if (!component) {
|
|
163
|
+
return "Component not found";
|
|
164
|
+
}
|
|
165
|
+
const stylePath = join3(
|
|
166
|
+
config.paths.componentsDir,
|
|
167
|
+
component.dirName,
|
|
168
|
+
"style.md"
|
|
169
|
+
);
|
|
170
|
+
try {
|
|
171
|
+
if (existsSync(stylePath)) {
|
|
172
|
+
const content = await readFile(stylePath, "utf-8");
|
|
173
|
+
return `\`\`\`less
|
|
174
|
+
${content}
|
|
175
|
+
\`\`\``;
|
|
176
|
+
}
|
|
177
|
+
return `Style documentation for ${component.name} not found`;
|
|
178
|
+
} catch (error) {
|
|
179
|
+
await logService.error(`${component.name}: ${error.message}`);
|
|
180
|
+
return `Failed to load style for ${component.name}`;
|
|
181
|
+
}
|
|
182
|
+
};
|
|
183
|
+
var fetchCssTokens = async (category) => {
|
|
184
|
+
try {
|
|
185
|
+
const tokensData = await readFile(config.paths.tokensPath, "utf-8");
|
|
186
|
+
const tokens = JSON.parse(tokensData);
|
|
187
|
+
if (category) {
|
|
188
|
+
const categoryTokens = tokens[category];
|
|
189
|
+
if (categoryTokens) {
|
|
190
|
+
const result2 = categoryTokens.map(
|
|
191
|
+
(token) => `- **${token.name}**: ${token.value} - ${token.description}`
|
|
192
|
+
).join("\n");
|
|
193
|
+
return `## ${category}
|
|
194
|
+
|
|
195
|
+
${result2}`;
|
|
196
|
+
}
|
|
197
|
+
return `Category "${category}" not found`;
|
|
198
|
+
}
|
|
199
|
+
const categories = Object.keys(tokens);
|
|
200
|
+
const result = categories.map((cat) => {
|
|
201
|
+
const catTokens = tokens[cat].map(
|
|
202
|
+
(token) => ` - ${token.name}: ${token.value}`
|
|
203
|
+
).join("\n");
|
|
204
|
+
return `## ${cat}
|
|
205
|
+
|
|
206
|
+
${catTokens}`;
|
|
207
|
+
}).join("\n\n");
|
|
208
|
+
return result;
|
|
209
|
+
} catch (error) {
|
|
210
|
+
await logService.error(`Failed to load CSS tokens: ${error.message}`);
|
|
211
|
+
return "Failed to load CSS tokens";
|
|
212
|
+
}
|
|
213
|
+
};
|
|
214
|
+
var listTokenCategories = async () => {
|
|
215
|
+
try {
|
|
216
|
+
const tokensData = await readFile(config.paths.tokensPath, "utf-8");
|
|
217
|
+
const tokens = JSON.parse(tokensData);
|
|
218
|
+
return Object.keys(tokens).join(", ");
|
|
219
|
+
} catch (error) {
|
|
220
|
+
await logService.error(`Failed to load CSS tokens: ${error.message}`);
|
|
221
|
+
return "Failed to load CSS token categories";
|
|
222
|
+
}
|
|
223
|
+
};
|
|
159
224
|
|
|
160
225
|
// src/tools/components.ts
|
|
161
226
|
function registerArcoTools(server) {
|
|
@@ -224,6 +289,53 @@ function registerArcoTools(server) {
|
|
|
224
289
|
};
|
|
225
290
|
}
|
|
226
291
|
);
|
|
292
|
+
server.tool(
|
|
293
|
+
"get-component-style",
|
|
294
|
+
"Gets the style/less file content for a specific Arco Design Mobile component",
|
|
295
|
+
{ componentName: z.string() },
|
|
296
|
+
async (args) => {
|
|
297
|
+
const styleContent = await fetchComponentStyle(args.componentName);
|
|
298
|
+
return {
|
|
299
|
+
content: [
|
|
300
|
+
{
|
|
301
|
+
type: "text",
|
|
302
|
+
text: styleContent
|
|
303
|
+
}
|
|
304
|
+
]
|
|
305
|
+
};
|
|
306
|
+
}
|
|
307
|
+
);
|
|
308
|
+
server.tool(
|
|
309
|
+
"list-token-categories",
|
|
310
|
+
"Lists all CSS token categories available in Arco Design Mobile",
|
|
311
|
+
async () => {
|
|
312
|
+
const categories = await listTokenCategories();
|
|
313
|
+
return {
|
|
314
|
+
content: [
|
|
315
|
+
{
|
|
316
|
+
type: "text",
|
|
317
|
+
text: categories
|
|
318
|
+
}
|
|
319
|
+
]
|
|
320
|
+
};
|
|
321
|
+
}
|
|
322
|
+
);
|
|
323
|
+
server.tool(
|
|
324
|
+
"get-css-tokens",
|
|
325
|
+
"Gets CSS tokens for a specific category or all categories in Arco Design Mobile",
|
|
326
|
+
{ category: z.string().optional() },
|
|
327
|
+
async (args) => {
|
|
328
|
+
const tokens = await fetchCssTokens(args.category);
|
|
329
|
+
return {
|
|
330
|
+
content: [
|
|
331
|
+
{
|
|
332
|
+
type: "text",
|
|
333
|
+
text: tokens
|
|
334
|
+
}
|
|
335
|
+
]
|
|
336
|
+
};
|
|
337
|
+
}
|
|
338
|
+
);
|
|
227
339
|
}
|
|
228
340
|
|
|
229
341
|
// src/index.ts
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
> 属性/Props
|
|
2
|
+
|
|
3
|
+
|参数|描述|类型|默认值|
|
|
4
|
+
|----------|-------------|------|------|
|
|
5
|
+
|items|选项配置,详情见 ActionSheetItemOptions|ActionSheetItemOptions\[\]|必填|
|
|
6
|
+
|cancelText|取消按钮内容,传值则会展示,点击后关闭动作面板|ReactNode|-|
|
|
7
|
+
|title|面板标题内容|ReactNode|-|
|
|
8
|
+
|subTitle|面板副标题内容|ReactNode|-|
|
|
9
|
+
|needBottomOffset|从底部滑出的菜单内容是否适配ipx底部|boolean|true|
|
|
10
|
+
|unmountOnExit|是否在退出时卸载内容|boolean|true|
|
|
11
|
+
|getContainer|获取挂载容器|() =\> HTMLElement|-|
|
|
12
|
+
|onClose|关闭后回调(动画执行完毕)|(scene?: string) =\> void|-|
|
|
13
|
+
|visible|是否展示菜单(受控)|boolean|必填|
|
|
14
|
+
|close|关闭菜单方法|(e: MouseEvent\<HTMLElement, MouseEvent\>) =\> void|必填|
|
|
15
|
+
|translateZ|\[即将废弃\] 开启translateZ强制提升|boolean|false|
|
|
16
|
+
|maskTransitionTimeout|菜单蒙层动画时长|number \| \{ appear?: number; enter?: number; exit?: number; \}|{ enter: 450, exit: 240 }|
|
|
17
|
+
|contentTransitionTimeout|菜单内容动画时长|number \| \{ appear?: number; enter?: number; exit?: number; \}|{ enter: 450, exit: 240 }|
|
|
18
|
+
|contentTransitionType|内容过渡动画类名|string|\`slide-from-${props.direction}\`|
|
|
19
|
+
|className|自定义类名|string|-|
|
|
20
|
+
|maskClass|自定义蒙层类名|string|-|
|
|
21
|
+
|maskStyle|自定义蒙层样式|CSSProperties|-|
|
|
22
|
+
|contentClass|自定义内容类名|string|-|
|
|
23
|
+
|contentStyle|自定义内容样式|CSSProperties|-|
|
|
24
|
+
|maskTransitionType|蒙层过渡动画类名|string|"fade"|
|
|
25
|
+
|contentTransitionVarType|内容过渡动画类名变量标识|string|-|
|
|
26
|
+
|maskClosable|点击蒙层是否关闭菜单|boolean|true|
|
|
27
|
+
|animatingClosable|执行进场动画时点击蒙层是否可关闭菜单|boolean|false|
|
|
28
|
+
|mountOnEnter|是否在打开菜单时再加载内容|boolean|true|
|
|
29
|
+
|preventBodyScroll|弹窗打开时是否禁止body的滚动|boolean|true|
|
|
30
|
+
|initialBodyOverflow|页面初始 overflow 状态,即关闭弹窗时 overflow 应该还原的状态|string|第一个全屏组件(弹窗、toast等)打开时页面overflow值|
|
|
31
|
+
|gestureOutOfControl|是否禁用滚动容器手势判断,禁用后交给业务方自己判断|boolean|false|
|
|
32
|
+
|onOpen|打开后回调(动画执行完毕)|() =\> void|-|
|
|
33
|
+
|onMaskClick|点击蒙层回调,maskClosable=false时也会触发|() =\> void|-|
|
|
34
|
+
|onTouchMove|弹窗的touchmove回调|(e: TouchEvent, prevented: boolean, direction: "x" \| "y") =\> void|-|
|
|
35
|
+
|onPreventTouchMove|非滚动区域或滚动到顶部及底部时的触摸事件回调|(e: TouchEvent, direction: "x" \| "y") =\> void|-|
|
|
36
|
+
|
|
37
|
+
> 引用/Refs
|
|
38
|
+
|
|
39
|
+
|参数|描述|类型|
|
|
40
|
+
|----------|-------------|------|
|
|
41
|
+
|dom|最外层元素 DOM|HTMLDivElement|
|
|
42
|
+
|
|
43
|
+
> 方法/Methods
|
|
44
|
+
|
|
45
|
+
|方法名|描述|类型|
|
|
46
|
+
|----------|-------------|------|
|
|
47
|
+
|open|打开动作面板|(config: ActionSheetProps) =\> \{ close: () =\> void; update: (newConfig: ActionSheetProps) =\> void; \}|
|
|
48
|
+
|
|
49
|
+
> ActionSheetItemOptions
|
|
50
|
+
|
|
51
|
+
|参数|描述|类型|
|
|
52
|
+
|----------|-------------|------|
|
|
53
|
+
|content|选项文字内容|ReactNode|
|
|
54
|
+
|status|状态,disabled 状态下不可点,danger 状态字体飘红|"normal" \| "disabled" \| "danger"|
|
|
55
|
+
|className|选项文字自定义类名|string|
|
|
56
|
+
|style|选项文字自定义样式|CSSProperties|
|
|
57
|
+
|onClick|点击选项事件,返回值为 true 时可以阻止动作面板关闭|(e?: MouseEvent\<HTMLElement, MouseEvent\>) =\> boolean \| void \| Promise\<boolean \| void\>|
|
|
58
|
+
|
|
59
|
+
> GlobalContextParams
|
|
60
|
+
|
|
61
|
+
|参数|描述|类型|默认值|
|
|
62
|
+
|----------|-------------|------|------|
|
|
63
|
+
|prefixCls|组件类名前缀|string|"arco"|
|
|
64
|
+
|system|手动控制当前所在系统,传入后将直接使用传入的值,ssr场景需指定系统初始值时适用|"" \| "pc" \| "android" \| "ios"|""|
|
|
65
|
+
|useDarkMode|是否监听系统原生的暗黑模式变化(prefers\-color\-scheme: dark)以判断是否切为暗黑模式|boolean|false|
|
|
66
|
+
|isDarkMode|是否处于暗黑模式,指定后以指定的值为准|boolean|false|
|
|
67
|
+
|darkModeSelector|当处于暗黑模式时,body上挂载的类名,为空值时不挂载类名|string|"arco-theme-dark"|
|
|
68
|
+
|theme|主题变量,传入后将在线替换css变量,需设置less变量 @use\-css\-vars: 1|Record\<string, string\>|-|
|
|
69
|
+
|locale|国际化语言包配置|ILocale|-|
|
|
70
|
+
|useRtl|是否使用Rtl模式|boolean|false|
|
|
71
|
+
|onDarkModeChange|当系统原生暗黑模式发生变化时触发,useDarkMode=true 时有效|(isDark: boolean) =\> void|-|
|
|
72
|
+
|createRoot|React19 修改了 createRoot 的引入路径,导致组件内部无法直接引入(低react版本会找不到模块)。因此使用 react 19 的用户需从外部传入 createRoot 方法|CreateRootFnType|-|
|
|
73
|
+
|
|
74
|
+
> ILocale
|
|
75
|
+
|
|
76
|
+
|参数|描述|类型|
|
|
77
|
+
|----------|-------------|------|
|
|
78
|
+
|locale|语言类型|string|
|
|
79
|
+
|LoadMore|-|\{ loadMoreText: string; loadingText: string; noDataText: string; failLoadText: string; prepareScrollText: string; prepareClickText: string; \}|
|
|
80
|
+
|Picker|-|\{ okText: string; cancelText: string; \}|
|
|
81
|
+
|Tag|-|\{ addTag: string; \}|
|
|
82
|
+
|Dialog|-|\{ okText: string; cancelText: string; \}|
|
|
83
|
+
|SwipeLoad|-|\{ normalText: string; activeText: string; \}|
|
|
84
|
+
|PullRefresh|-|\{ loadingText: string; pullingText: string; finishText: string; loosingText: string; \}|
|
|
85
|
+
|DropdownMenu|-|\{ select: string; \}|
|
|
86
|
+
|Pagination|-|\{ previousPage: string; nextPage: string; \}|
|
|
87
|
+
|Image|-|\{ loadError: string; \}|
|
|
88
|
+
|ImagePicker|-|\{ loadError: string; \}|
|
|
89
|
+
|SearchBar|-|\{ placeholder: string; cancelBtn: string; \}|
|
|
90
|
+
|Stepper|-|\{ minusButtonName: string; addButtonName: string; \}|
|
|
91
|
+
|Keyboard|-|\{ confirm: string; \}|
|
|
92
|
+
|Form|-|\{ required: string; type: \{ email: string; url: string; string: string; number: string; array: string; object: string; boolean: string; \}; number: \{ min: string; max: string; equal: string; range: string; positive: string; negative: string; \}; \.\.\. 4 more \.\.\.; pickerDefaultHint: string; \}|
|
|
93
|
+
|NavBar|-|\{ backBtnAriaLabel: string; \}|
|
|
94
|
+
|Uploader|-|\{ uploadBtn: string; retryUpload: string; \}|
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
@import "../../../style/mixin.less";
|
|
2
|
+
|
|
3
|
+
.@{prefix}-action-sheet {
|
|
4
|
+
.use-var(color, font-color);
|
|
5
|
+
|
|
6
|
+
&-header {
|
|
7
|
+
.use-var(padding, action-sheet-header-padding);
|
|
8
|
+
text-align: center;
|
|
9
|
+
.onepx-border-var(bottom, line-color);
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
&-title {
|
|
13
|
+
.use-var(font-size, action-sheet-title-font-size);
|
|
14
|
+
.text-medium();
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
&-sub-title {
|
|
18
|
+
.use-var(color, sub-info-font-color);
|
|
19
|
+
.use-var(font-size, action-sheet-sub-title-font-size);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
&-title + &-sub-title {
|
|
23
|
+
.rem(margin-top, 4);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
&-content {
|
|
27
|
+
.use-var(border-top-left-radius, action-sheet-border-radius);
|
|
28
|
+
.use-var(border-top-right-radius, action-sheet-border-radius);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
&-item {
|
|
32
|
+
display: flex;
|
|
33
|
+
align-items: center;
|
|
34
|
+
justify-content: center;
|
|
35
|
+
.use-var(height, action-sheet-item-height);
|
|
36
|
+
.use-var(font-size, action-sheet-item-font-size);
|
|
37
|
+
.noselect();
|
|
38
|
+
|
|
39
|
+
&:not(:last-child) {
|
|
40
|
+
.onepx-border-var(bottom, line-color);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
&.disabled {
|
|
44
|
+
.use-var(color, disabled-color);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
&.danger {
|
|
48
|
+
.use-var(color, danger-color);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
&.cancel-item {
|
|
52
|
+
border-top-style: solid;
|
|
53
|
+
.use-var(border-top-color, action-sheet-cancel-border-color);
|
|
54
|
+
.use-var(border-top-width, action-sheet-cancel-border-width);
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
> 属性/Props
|
|
2
|
+
|
|
3
|
+
|参数|描述|类型|默认值|
|
|
4
|
+
|----------|-------------|------|------|
|
|
5
|
+
|shape|形状|"circle" \| "square"|"circle"|
|
|
6
|
+
|size|尺寸|"medium" \| "large" \| "small" \| "smaller" \| "ultra\-small"|"small"|
|
|
7
|
+
|src|图片头像的资源地址|string|-|
|
|
8
|
+
|imageProps|图片头像组件参数,透传给Image组件|Partial\<ImageProps & RefAttributes\<ImageRef\>\>|-|
|
|
9
|
+
|decoration|图片头像上的装饰|ReactNode|null|
|
|
10
|
+
|textAvatar|文字头像,中文建议取两个字,英文建议在三个字以下|string|""|
|
|
11
|
+
|avatarStyle|头像元素的自定义样式|CSSProperties|{}|
|
|
12
|
+
|avatarClass|头像元素的自定义类名|string|""|
|
|
13
|
+
|autoFixFontSize|是否自动根据头像尺寸调整字体大小|boolean|true|
|
|
14
|
+
|autoFixFontOffset|自动调整文字头像大小时,文字距离头像容器左右的安全距离|number|2|
|
|
15
|
+
|avatarName|头像旁的用户名信息|string|""|
|
|
16
|
+
|avatarDesc|头像旁的辅助信息,需要和用户名一起出现|string|""|
|
|
17
|
+
|renderInfo|自定义头像描述信息|ReactNode|null|
|
|
18
|
+
|defaultOverLap|头像组件为空时默认的状态|ReactNode|用户图标|
|
|
19
|
+
|onClick|点击头像的回调事件|(e: MouseEvent\<HTMLElement, MouseEvent\>) =\> void|() => {}|
|
|
20
|
+
|onClickDecoration|点击头像上的装饰|(e: MouseEvent\<HTMLElement, MouseEvent\>) =\> void|() => {}|
|
|
21
|
+
|children|自定义组件内容|ReactNode|null|
|
|
22
|
+
|className|自定义类名|string|""|
|
|
23
|
+
|style|自定义样式|CSSProperties|{}|
|
|
24
|
+
|
|
25
|
+
> 引用/Refs
|
|
26
|
+
|
|
27
|
+
|参数|描述|类型|
|
|
28
|
+
|----------|-------------|------|
|
|
29
|
+
|dom|组件外层dom元素|HTMLDivElement|
|
|
30
|
+
|
|
31
|
+
> Avatar.Group
|
|
32
|
+
|
|
33
|
+
头像叠层
|
|
34
|
+
|
|
35
|
+
|参数|描述|类型|默认值|
|
|
36
|
+
|----------|-------------|------|------|
|
|
37
|
+
|isGroup|是否为头像组|boolean|必填|
|
|
38
|
+
|shape|形状,优先级低于Avatar组件本身|"circle" \| "square"|"circle"|
|
|
39
|
+
|size|尺寸,优先级低于Avatar组件本身|"medium" \| "large" \| "small" \| "smaller" \| "ultra\-small"|"medium"|
|
|
40
|
+
|zIndexOrder|头像组叠层层级顺序,z\-index值大小,desc \- 降序,asc \- 升序|"desc" \| "asc"|"desc"|
|
|
41
|
+
|children|自定义组件内容|ReactNode|null|
|
|
42
|
+
|className|自定义类名|string|""|
|
|
43
|
+
|style|自定义样式|CSSProperties|{}|
|
|
44
|
+
|
|
45
|
+
> AvatarGroupRef
|
|
46
|
+
|
|
47
|
+
|参数|描述|类型|
|
|
48
|
+
|----------|-------------|------|
|
|
49
|
+
|dom|组件外层dom元素|HTMLDivElement|
|
|
@@ -0,0 +1,147 @@
|
|
|
1
|
+
@import "../../../style/mixin.less";
|
|
2
|
+
|
|
3
|
+
@size-map: @avatar-size-map;
|
|
4
|
+
|
|
5
|
+
.@{prefix}-avatar {
|
|
6
|
+
position: relative;
|
|
7
|
+
font-size: 0;
|
|
8
|
+
display: flex;
|
|
9
|
+
align-items: center;
|
|
10
|
+
justify-content: center;
|
|
11
|
+
.use-var(color, avatar-text-font-color);
|
|
12
|
+
.use-var(background-color, avatar-background);
|
|
13
|
+
|
|
14
|
+
&-mode-image {
|
|
15
|
+
background-color: transparent !important;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
&-default-overlap {
|
|
19
|
+
.use-var(background-color, avatar-default-overlap-background);
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
&-shape-circle {
|
|
23
|
+
.set-avatar-radius(50%);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
&-shape-square {
|
|
27
|
+
.set-avatar-radius(.08rem);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
.set-avatar-size(length(@size-map));
|
|
31
|
+
|
|
32
|
+
&-img {
|
|
33
|
+
width: 100%;
|
|
34
|
+
height: 100%;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
&-decoration {
|
|
38
|
+
position: absolute;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
&-text {
|
|
42
|
+
flex: 0 0 auto;
|
|
43
|
+
font-weight: bold;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
&-wrapper {
|
|
47
|
+
display: inline-block;
|
|
48
|
+
|
|
49
|
+
&-with-info {
|
|
50
|
+
display: flex;
|
|
51
|
+
align-items: center;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
&-info {
|
|
56
|
+
display: flex;
|
|
57
|
+
justify-content: center;
|
|
58
|
+
flex-direction: column;
|
|
59
|
+
.rem-with-rtl(margin-left, 16);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
&-name {
|
|
63
|
+
.use-var(color, avatar-name-color);
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
&-desc {
|
|
67
|
+
.use-var(color, avatar-desc-color);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
.@{prefix}-avatar-group {
|
|
72
|
+
.@{prefix}-avatar-wrapper-shape-circle {
|
|
73
|
+
position: relative; // 为了让z-index属性生效
|
|
74
|
+
|
|
75
|
+
&:first-child {
|
|
76
|
+
margin-left: 0;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
.@{prefix}-avatar {
|
|
81
|
+
border-style: solid;
|
|
82
|
+
.use-var(border-color, avatar-group-border-color);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
.set-avatar-group-size(length(@size-map));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
.set-avatar-radius(@radius) {
|
|
89
|
+
border-radius: @radius;
|
|
90
|
+
.@{prefix}-avatar-img .image-content {
|
|
91
|
+
border-radius: @radius;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
// 循环设置头像叠层的样式
|
|
96
|
+
.set-avatar-group-size(@index) when (@index > 0) {
|
|
97
|
+
|
|
98
|
+
@size: extract(@size-map, @index);
|
|
99
|
+
|
|
100
|
+
&-size-@{size} {
|
|
101
|
+
.@{prefix}-avatar-wrapper {
|
|
102
|
+
.use-var-with-rtl(margin-left, "avatar-group-@{size}-size-offset");
|
|
103
|
+
}
|
|
104
|
+
.@{prefix}-avatar {
|
|
105
|
+
.use-var(border-width, "avatar-group-@{size}-size-border");
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
.set-avatar-group-size(@index - 1);
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
// 循环设置头像的样式
|
|
113
|
+
.set-avatar-size(@index) when (@index > 0) {
|
|
114
|
+
|
|
115
|
+
@size: extract(@size-map, @index);
|
|
116
|
+
|
|
117
|
+
&-size-@{size} {
|
|
118
|
+
.use-var(width, "avatar-@{size}-size");
|
|
119
|
+
.use-var(height, "avatar-@{size}-size");
|
|
120
|
+
}
|
|
121
|
+
&-default-icon-size-@{size} {
|
|
122
|
+
.use-var(font-size, "avatar-default-overlap-@{size}-size");
|
|
123
|
+
}
|
|
124
|
+
&-text-size-@{size} {
|
|
125
|
+
.use-var(font-size, "avatar-@{size}-text-font-size");
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
// 有辅助信息的样式
|
|
129
|
+
&-wrapper-with-info-size-@{size} {
|
|
130
|
+
.use-var(height, "avatar-info-box-@{size}-size");
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// 用户名样式
|
|
134
|
+
&-name-size-@{size} {
|
|
135
|
+
.use-var(font-size, "avatar-name-@{size}-font-size");
|
|
136
|
+
.use-var(line-height, "avatar-name-@{size}-line-height");
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
// 用户描述样式
|
|
140
|
+
&-desc-size-@{size} {
|
|
141
|
+
.use-var(margin-top, "avatar-desc-@{size}-margin-top");
|
|
142
|
+
.use-var(font-size, "avatar-desc-@{size}-font-size");
|
|
143
|
+
.use-var(line-height, "avatar-desc-@{size}-line-height");
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
.set-avatar-size(@index - 1);
|
|
147
|
+
}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
> 属性/Props
|
|
2
|
+
|
|
3
|
+
|参数|描述|类型|默认值|
|
|
4
|
+
|----------|-------------|------|------|
|
|
5
|
+
|className|自定义类名|string|-|
|
|
6
|
+
|style|自定义样式|CSSProperties|-|
|
|
7
|
+
|visible|是否展示徽标,visible切换时有动画过渡|boolean|true|
|
|
8
|
+
|text|徽标文案|ReactText|-|
|
|
9
|
+
|dot|显示为一个小红点|boolean|false|
|
|
10
|
+
|maxCount|最大完整展示数字,超出后将展示 \+|number|99|
|
|
11
|
+
|children|内容|ReactNode|-|
|
|
12
|
+
|absolute|是否置于右上角|boolean|false|
|
|
13
|
+
|bordered|是否有白色边框|boolean|false|
|
|
14
|
+
|timeout|动画持续时间(ms)|number \| \{ appear?: number; enter?: number; exit?: number; \}|300|
|
|
15
|
+
|
|
16
|
+
> 引用/Refs
|
|
17
|
+
|
|
18
|
+
|参数|描述|类型|
|
|
19
|
+
|----------|-------------|------|
|
|
20
|
+
|dom|最外层元素 DOM|HTMLDivElement|
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
@import "../../../style/mixin.less";
|
|
2
|
+
|
|
3
|
+
@keyframes scale-on {
|
|
4
|
+
|
|
5
|
+
0% {
|
|
6
|
+
transform: scale(0);opacity: 0; }
|
|
7
|
+
|
|
8
|
+
100% {
|
|
9
|
+
transform: scale(1); opacity: 1; }
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
@keyframes scale-off {
|
|
13
|
+
|
|
14
|
+
0% {
|
|
15
|
+
transform: scale(1); opacity: 1; }
|
|
16
|
+
|
|
17
|
+
100% {
|
|
18
|
+
transform: scale(0); opacity: 0; }
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
.@{prefix}-scale-enter-active {
|
|
22
|
+
animation: scale-on cubic-bezier(.3, 1.3, .3, 1) forwards;
|
|
23
|
+
animation-duration: var(--builtin-transition-scale-enter-duration, .4s);
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
.@{prefix}-scale-exit-active {
|
|
27
|
+
animation: scale-off cubic-bezier(.3, 1.3, .3, 1) forwards;
|
|
28
|
+
animation-duration: var(--builtin-transition-scale-exit-duration, .4s);
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
.@{prefix}-badge {
|
|
32
|
+
cursor: pointer;
|
|
33
|
+
box-sizing: content-box;
|
|
34
|
+
display: inline-block;
|
|
35
|
+
z-index: 2;
|
|
36
|
+
.use-var(color, badge-text-color);
|
|
37
|
+
.use-var(background-color, badge-background-color);
|
|
38
|
+
white-space: nowrap;
|
|
39
|
+
.use-var(border-radius, badge-border-radius);
|
|
40
|
+
.use-var(height, badge-text-width);
|
|
41
|
+
.use-var(line-height, badge-text-width);
|
|
42
|
+
.set-content-box-width-var(min-width, badge-text-width, badge-text-padding, badge-text-padding);
|
|
43
|
+
.use-var(padding, badge-text-padding, 0);
|
|
44
|
+
|
|
45
|
+
&-text {
|
|
46
|
+
display: block;
|
|
47
|
+
font-weight: 500;
|
|
48
|
+
.set-font-size-var(badge-font-size);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
&-dot {
|
|
52
|
+
.use-var(width, badge-dot-width);
|
|
53
|
+
.use-var(height, badge-dot-width);
|
|
54
|
+
padding: 0;
|
|
55
|
+
min-width: auto;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
&-bordered {
|
|
59
|
+
.use-var(border, badge-border-color, 1PX solid);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
&-absolute {
|
|
63
|
+
position: absolute;
|
|
64
|
+
top: 0;
|
|
65
|
+
.set-prop-with-rtl(left, 100%);
|
|
66
|
+
.use-var-with-rtl(margin-left, badge-text-deviation);
|
|
67
|
+
.use-var(margin-top, badge-text-deviation);
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
&-absolute&-dot {
|
|
71
|
+
.use-var-with-rtl(margin-left, badge-dot-deviation);
|
|
72
|
+
.use-var(margin-top, badge-dot-deviation);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
> 属性/Props
|
|
2
|
+
|
|
3
|
+
|参数|描述|类型|默认值|
|
|
4
|
+
|----------|-------------|------|------|
|
|
5
|
+
|type|样式类型|"primary" \| "ghost" \| "default"|"primary"|
|
|
6
|
+
|size|尺寸|"mini" \| "small" \| "medium" \| "large" \| "huge"|"large"|
|
|
7
|
+
|inline|是否为内联样式|boolean|false|
|
|
8
|
+
|loading|是否处于加载中状态|boolean|false|
|
|
9
|
+
|disabled|是否禁用|boolean|false|
|
|
10
|
+
|halfBorder|border是否为0\.5px|boolean|false|
|
|
11
|
+
|icon|图标名,传入Icon组件|ReactNode|-|
|
|
12
|
+
|showTextWhenLoading|加载中是否展示文字|boolean|true|
|
|
13
|
+
|needActive|是否需要点击态|boolean|true|
|
|
14
|
+
|style|自定义样式|CSSProperties|-|
|
|
15
|
+
|shape|按钮形状|"round" \| "semi" \| "square"|"semi"|
|
|
16
|
+
|color|自定义字体颜色|ButtonColorStatus|-|
|
|
17
|
+
|bgColor|自定义背景颜色|ButtonColorStatus|-|
|
|
18
|
+
|borderColor|自定义边框颜色|ButtonColorStatus|-|
|
|
19
|
+
|className|自定义类名|string|-|
|
|
20
|
+
|loadingIcon|加载图标,传入Icon组件type属性或node|ReactNode|-|
|
|
21
|
+
|children|子元素|ReactNode|-|
|
|
22
|
+
|onClick|点击按钮的回调函数|(e: MouseEvent\<Element, MouseEvent\>) =\> void|-|
|
|
23
|
+
|onClickDisabled|禁用状态下点击按钮的回调函数|(e: MouseEvent\<Element, MouseEvent\>) =\> void|-|
|
|
24
|
+
|disableWhenLoading|加载中是否禁用按钮操作|boolean|true|
|
|
25
|
+
|coverIconWhenLoading|加载中是否覆盖Icon|boolean|true|
|
|
26
|
+
|
|
27
|
+
> 引用/Refs
|
|
28
|
+
|
|
29
|
+
|参数|描述|类型|
|
|
30
|
+
|----------|-------------|------|
|
|
31
|
+
|dom|最外层元素 DOM|HTMLButtonElement|
|
|
32
|
+
|
|
33
|
+
> ButtonColorStatus
|
|
34
|
+
|
|
35
|
+
```
|
|
36
|
+
string | { normal: string; active: string; disabled: string; }
|
|
37
|
+
```
|