vdesign-ui 0.2.17 → 0.2.19
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/README.md +58 -77
- package/dist/components/radio/style.less +26 -19
- package/dist/components/tabs/index.vue +27 -19
- package/dist/components/tabs/style.less +80 -45
- package/dist/token.css +1589 -104
- package/dist/vdesign-ui.common.js +58 -31
- package/dist/vdesign-ui.css +1 -1
- package/dist/vdesign-ui.umd.js +58 -31
- package/dist/vdesign-ui.umd.min.js +2 -2
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,78 +1,59 @@
|
|
|
1
|
-
# vdesign-ui
|
|
2
1
|
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
> 带 --soft 参数的区别在于把改动内容添加到暂存区 相当于执行了git add .
|
|
63
|
-
|
|
64
|
-
git rebase -i
|
|
65
|
-
git rebase的功能会更加强大,如果我想修改最近3条提交记录,执行
|
|
66
|
-
|
|
67
|
-
`git rebase -i HEAD~3`
|
|
68
|
-
|
|
69
|
-
下面是常用的命令说明:
|
|
70
|
-
|
|
71
|
-
```bash
|
|
72
|
-
p,pick = 使用提交
|
|
73
|
-
r,reword = 使用提交,但修改提交说明
|
|
74
|
-
e,edit = 使用提交,退出后使用git commit --amend 修改
|
|
75
|
-
s,squash = 使用提交,合并前一个提交
|
|
76
|
-
f,fixup = 和squash相同,但丢弃提交说明日志
|
|
77
|
-
d,drop = 删除提交,丢弃提交记录
|
|
78
|
-
```
|
|
2
|
+
# 📦 vdesign-ui 项目结构说明
|
|
3
|
+
|
|
4
|
+
本项目为 `vdesign-ui` 前端组件库,包含组件源码、构建脚本、设计 Tokens、多语言配置等。以下是项目目录结构与主要文件说明。
|
|
5
|
+
|
|
6
|
+
## 📁 目录结构
|
|
7
|
+
|
|
8
|
+
```text
|
|
9
|
+
vdesign-ui/
|
|
10
|
+
├── bin/ # 构建与工具脚本目录
|
|
11
|
+
│ ├── backup-token-css.js # 备份 token.css 文件(保存至 dist-token-history,文件名带时间戳)
|
|
12
|
+
│ ├── build-components.js # 构建 packages/components 下的组件并输出到 dist/components,按需加载,暂未用到
|
|
13
|
+
│ ├── concat-css.js # 合并 tokens 中多个 CSS 文件为 token.css
|
|
14
|
+
│ ├── copy-locales.js # 拷贝 packages/locale 的内容到 dist/locale
|
|
15
|
+
│ └── node.js # 输出官网导航目录
|
|
16
|
+
├── dist/ # 构建输出目录
|
|
17
|
+
│ ├── components/ # 拷贝组件
|
|
18
|
+
│ ├── locale/ # 拷贝语言资源
|
|
19
|
+
│ ├── demo.html # 构建预览页面(可能用于调试或预览组件)
|
|
20
|
+
│ ├── token.css # 当前 Design Token 输出样式
|
|
21
|
+
│ ├── vdesign-ui.common.js # CommonJS 格式构建文件
|
|
22
|
+
│ ├── vdesign-ui.css # 所有样式文件合并后的主 CSS
|
|
23
|
+
│ ├── vdesign-ui.umd.js # UMD 构建文件(未压缩)
|
|
24
|
+
│ ├── vdesign-ui.umd.min.js # UMD 构建文件(压缩版)
|
|
25
|
+
│ └── dist-token-history/ # 历史 Token 样式备份(时间戳命名)
|
|
26
|
+
│ ├── token_20250314_155751.css
|
|
27
|
+
│ ├── token_20250314_160005.css
|
|
28
|
+
│ ├── token_20250314_160803.css
|
|
29
|
+
│ ├── token_20250321_171830.css
|
|
30
|
+
│ ├── token_20250324_152753.css
|
|
31
|
+
│ ├── token_20250324_153128.css
|
|
32
|
+
│ ├── token_20250325_114906.css
|
|
33
|
+
│ └── token_20250326_170122.css
|
|
34
|
+
├── node_modules/ # 项目依赖模块
|
|
35
|
+
├── packages/ # 源码主目录
|
|
36
|
+
│ ├── components/ # Vue 组件源码(Button、Uploader 等)
|
|
37
|
+
│ ├── locale/ # 多语言支持
|
|
38
|
+
│ │ ├── lang/ # 多语言翻译文件(如 zh-CN.js / en-US.js)
|
|
39
|
+
│ │ └── i18nPlugin.js # 国际化插件封装(用于 Vue 插件注册)
|
|
40
|
+
│ └── tokens/ # Design Token 配置(设计样式原子值)
|
|
41
|
+
│ ├── css/ # 生成后的 CSS Token 文件
|
|
42
|
+
│ ├── fonts/ # 字体资源
|
|
43
|
+
│ ├── js/ # 获取以及生成Token数据
|
|
44
|
+
│ ├── index.css # 主样式文件
|
|
45
|
+
│ ├── reset.css # 样式重置文件
|
|
46
|
+
│ └── style.css # 组件通用样式
|
|
47
|
+
│ └──index.js # 项目主入口(可能用于组件库导出)
|
|
48
|
+
├── sites/ # 主要包含该组件库的站点,用于文档描述
|
|
49
|
+
│ ├── assets/ # 静态资源(如图片、图标)
|
|
50
|
+
│ ├── components/ # 站点使用的公共组件
|
|
51
|
+
│ ├── demos/ # 组件演示页面(提供交互效果展示)
|
|
52
|
+
│ ├── docs/ # 文档页面(介绍使用说明、API 参考等)
|
|
53
|
+
│ ├── i18n/ # 站点的国际化支持
|
|
54
|
+
│ ├── json/ # json格式的Token数据
|
|
55
|
+
│ ├── pages/ # 站点页面路由(测试页面)
|
|
56
|
+
│ ├── router/ # Vue 路由配置
|
|
57
|
+
│ ├── App.vue # 站点 Vue 入口文件
|
|
58
|
+
│ ├── insetTables.js # Token数据插入到demo页面
|
|
59
|
+
│ └── main.js # 站点主入口文件
|
|
@@ -143,23 +143,22 @@
|
|
|
143
143
|
}
|
|
144
144
|
}
|
|
145
145
|
|
|
146
|
-
.@{radio-prefix-cls}-group {
|
|
146
|
+
// .@{radio-prefix-cls}-group {
|
|
147
147
|
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
148
|
+
// display: flex;
|
|
149
|
+
// flex-direction: column;
|
|
150
|
+
// gap: var(--spacing-check_radio-group-margin_x);
|
|
151
151
|
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
}
|
|
152
|
+
// &-card{
|
|
153
|
+
// display: flex;
|
|
154
|
+
// flex-wrap: wrap;
|
|
155
|
+
// flex-direction: row;
|
|
156
|
+
// gap: 12px;
|
|
157
|
+
// .vd-radio-button-cell{
|
|
158
|
+
// flex: 1;
|
|
159
|
+
// }
|
|
160
|
+
// }
|
|
161
|
+
// }
|
|
163
162
|
|
|
164
163
|
|
|
165
164
|
|
|
@@ -278,14 +277,22 @@
|
|
|
278
277
|
.@{radio-prefix-cls}-group {
|
|
279
278
|
display: flex;
|
|
280
279
|
flex-direction: column;
|
|
281
|
-
gap: var(--spacing-check_radio-group-margin_x);
|
|
282
|
-
|
|
280
|
+
// gap: var(--spacing-check_radio-group-margin_x);
|
|
281
|
+
margin-bottom: calc(var(--spacing-check_radio-group-margin_x) * -1);
|
|
282
|
+
.@{radio-prefix-cls}{
|
|
283
|
+
margin-bottom: var(--spacing-check_radio-group-margin_x);
|
|
284
|
+
}
|
|
283
285
|
&__card{
|
|
284
286
|
display: flex;
|
|
285
287
|
flex-direction: row;
|
|
286
288
|
flex-wrap: wrap;
|
|
287
|
-
gap: 12px;
|
|
288
|
-
|
|
289
|
+
// gap: 12px;
|
|
290
|
+
margin-bottom: -12px;
|
|
291
|
+
margin-inline-end: -12px;
|
|
292
|
+
.@{radio-button-prefix-cls}{
|
|
293
|
+
margin-bottom: 12px;
|
|
294
|
+
margin-inline-end: 12px;
|
|
295
|
+
}
|
|
289
296
|
}
|
|
290
297
|
|
|
291
298
|
.@{radio-button-prefix-cls}{
|
|
@@ -1,26 +1,30 @@
|
|
|
1
1
|
<template>
|
|
2
2
|
<div class="vd-tabs" :class="stickyClasses">
|
|
3
3
|
<div class="vd-tabs__wrap" :class="menuClasses" ref="wrap">
|
|
4
|
-
<div class="vd-
|
|
5
|
-
<div
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
4
|
+
<div class="vd-tabs__scroll" ref="scroll">
|
|
5
|
+
<div class="vd-tabs__scroll--left" v-show="firstTabOut"></div>
|
|
6
|
+
<div class="vd-tabs__nav" :class="[barType, scrollspyClasses]" ref="nav">
|
|
7
|
+
<div
|
|
8
|
+
v-for="(tab, index) in tabs"
|
|
9
|
+
:key="tab.name !== undefined ? tab.name : index"
|
|
10
|
+
:class="[tabClasses(tab, index), lineClasses]"
|
|
11
|
+
@click="onClick(tab, index)"
|
|
12
|
+
ref="tabItems"
|
|
13
13
|
>
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
14
|
+
<span class="vd-tab__text" :class="ellipsisClasses" ref="title"
|
|
15
|
+
>
|
|
16
|
+
{{ tab.title }}
|
|
17
|
+
<!-- <vd-icon
|
|
18
|
+
class="vd-tab__arrow"
|
|
19
|
+
v-if="tab.arrow"
|
|
20
|
+
name="icon_btn_moredown"
|
|
21
|
+
></vd-icon> -->
|
|
22
|
+
</span>
|
|
23
|
+
</div>
|
|
21
24
|
</div>
|
|
22
|
-
|
|
23
|
-
|
|
25
|
+
<div class="vd-tabs__scroll--right" v-show="lastTabOut"></div>
|
|
26
|
+
</div>
|
|
27
|
+
<div class="vd-tabs__menu--right" :class="{'vd-tabs__menu--margin':lastTabOut}" v-if="menu">
|
|
24
28
|
<vd-icon
|
|
25
29
|
:name="menuIconComputed"
|
|
26
30
|
class="vd-tabs__menu--btn"
|
|
@@ -75,6 +79,7 @@ export default {
|
|
|
75
79
|
tabs: [],
|
|
76
80
|
currentName: this.value !== undefined ? this.value : 0, // 默认为 0
|
|
77
81
|
firstTabOut: false, // 第一个标签是否超出
|
|
82
|
+
lastTabOut: false
|
|
78
83
|
};
|
|
79
84
|
},
|
|
80
85
|
watch: {
|
|
@@ -130,7 +135,7 @@ export default {
|
|
|
130
135
|
[`${prefixCls}__menu`]: this.menu,
|
|
131
136
|
[`${prefixCls}__wrap--bg`]: this.backgroundColor,
|
|
132
137
|
"vd-hairline--bottom": this.divider,
|
|
133
|
-
"vd-tabs__scroll": this.firstTabOut, // 当第一个标签超出时,添加滚动类名
|
|
138
|
+
// "vd-tabs__scroll": this.firstTabOut, // 当第一个标签超出时,添加滚动类名
|
|
134
139
|
};
|
|
135
140
|
},
|
|
136
141
|
// 计算标签下方线条的类名
|
|
@@ -272,9 +277,11 @@ export default {
|
|
|
272
277
|
if (this.language === 'ar') {
|
|
273
278
|
// 在 RTL 模式下,scrollLeft 可能为负,判断是否滚出视口可以检测 scrollLeft 是否小于 0
|
|
274
279
|
this.firstTabOut = nav.scrollLeft < 0;
|
|
280
|
+
// this.lastTabOut = nav.scrollLeft < 0;
|
|
275
281
|
} else {
|
|
276
282
|
// LTR 模式下,滚出视口时 scrollLeft 大于 0
|
|
277
283
|
this.firstTabOut = nav.scrollLeft > 0;
|
|
284
|
+
this.lastTabOut = Math.ceil(nav.scrollLeft + nav.clientWidth) < nav.scrollWidth;
|
|
278
285
|
}
|
|
279
286
|
}
|
|
280
287
|
},
|
|
@@ -323,6 +330,7 @@ export default {
|
|
|
323
330
|
// 初始加载时,滚动到当前激活的标签
|
|
324
331
|
this.$nextTick(() => {
|
|
325
332
|
this.scrollToActiveTab();
|
|
333
|
+
this.checkFirstTabOverflow()
|
|
326
334
|
if (this.$refs.nav) {
|
|
327
335
|
this.$refs.nav.addEventListener('scroll', this.checkFirstTabOverflow);
|
|
328
336
|
}
|
|
@@ -313,27 +313,58 @@
|
|
|
313
313
|
}
|
|
314
314
|
|
|
315
315
|
&__scroll {
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
316
|
+
overflow-x: auto;
|
|
317
|
+
position: relative;
|
|
318
|
+
&--left{
|
|
319
|
+
&::before {
|
|
320
|
+
content: '';
|
|
321
|
+
position: absolute;
|
|
322
|
+
z-index: 1;
|
|
323
|
+
top: 50%;
|
|
324
|
+
transform: translateY(-50%);
|
|
325
|
+
left: 0;
|
|
326
|
+
width: 20px;
|
|
327
|
+
height: 48px;
|
|
328
|
+
background-color: var(--bg-color-1);
|
|
329
|
+
}
|
|
330
|
+
&::after {
|
|
331
|
+
content: '';
|
|
332
|
+
box-shadow: 4px 0 6px rgba(0, 0, 0, 0.05);
|
|
333
|
+
position: absolute;
|
|
334
|
+
top: 50%;
|
|
335
|
+
transform: translateY(-50%);
|
|
336
|
+
left: 0;
|
|
337
|
+
width: 20px;
|
|
338
|
+
height: 30px;
|
|
339
|
+
background-color: transparent;
|
|
340
|
+
}
|
|
325
341
|
}
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
342
|
+
&--right{
|
|
343
|
+
&::before {
|
|
344
|
+
content: '';
|
|
345
|
+
position: absolute;
|
|
346
|
+
z-index: 1;
|
|
347
|
+
top: 50%;
|
|
348
|
+
transform: translateY(-50%);
|
|
349
|
+
right: 0;
|
|
350
|
+
width: 20px;
|
|
351
|
+
height: 48px;
|
|
352
|
+
background-color: var(--bg-color-1);
|
|
353
|
+
}
|
|
354
|
+
&::after {
|
|
355
|
+
content: '';
|
|
356
|
+
box-shadow: -4px 0 6px rgba(0, 0, 0, 0.05);
|
|
357
|
+
position: absolute;
|
|
358
|
+
top: 50%;
|
|
359
|
+
transform: translateY(-50%);
|
|
360
|
+
right: 0;
|
|
361
|
+
width: 20px;
|
|
362
|
+
height: 30px;
|
|
363
|
+
background-color: transparent;
|
|
364
|
+
}
|
|
365
|
+
}
|
|
366
|
+
|
|
367
|
+
|
|
337
368
|
}
|
|
338
369
|
|
|
339
370
|
&__menu {
|
|
@@ -344,22 +375,26 @@
|
|
|
344
375
|
|
|
345
376
|
&--right {
|
|
346
377
|
position: relative;
|
|
378
|
+
z-index: 2;
|
|
379
|
+
// margin-inline-start: -12px;
|
|
347
380
|
display: flex;
|
|
348
381
|
height: var(--icon-large);
|
|
349
382
|
padding-inline-end: var(--spacing-tab-primary_icon-margin_right);
|
|
350
383
|
color: var(--text-color-h1);
|
|
351
384
|
|
|
352
|
-
&::before {
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
}
|
|
360
|
-
|
|
385
|
+
// &::before {
|
|
386
|
+
// content: '';
|
|
387
|
+
// position: absolute;
|
|
388
|
+
// margin-inline-start: -16px;
|
|
389
|
+
// width: 16px;
|
|
390
|
+
// height: 100%;
|
|
391
|
+
// background-image: linear-gradient(to left, var(--bg-color-1) 0%, rgba(255, 255, 255, 0) 100%);
|
|
392
|
+
// }
|
|
361
393
|
|
|
362
394
|
}
|
|
395
|
+
&--margin{
|
|
396
|
+
margin-inline-start: -12px;
|
|
397
|
+
}
|
|
363
398
|
&--btn {
|
|
364
399
|
cursor: pointer;
|
|
365
400
|
font-size: var(--icon-large)!important;
|
|
@@ -426,17 +461,17 @@
|
|
|
426
461
|
|
|
427
462
|
|
|
428
463
|
[lang='ar'] {
|
|
429
|
-
.@{tabs-prefix-cls}__scroll {
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
}
|
|
464
|
+
// .@{tabs-prefix-cls}__scroll {
|
|
465
|
+
// &::before {
|
|
466
|
+
// right: 0;
|
|
467
|
+
// left: auto;
|
|
468
|
+
// }
|
|
469
|
+
// &::after {
|
|
470
|
+
// right: 0;
|
|
471
|
+
// left: auto;
|
|
472
|
+
// box-shadow: -4px 0 6px rgba(0, 0, 0, 0.05);
|
|
473
|
+
// }
|
|
474
|
+
// }
|
|
440
475
|
.@{tabs-prefix-cls}__menu--right::before {
|
|
441
476
|
transform: scaleX(-1);
|
|
442
477
|
}
|
|
@@ -451,9 +486,9 @@
|
|
|
451
486
|
}
|
|
452
487
|
|
|
453
488
|
[theme='dark'][lang='ar']{
|
|
454
|
-
.@{tabs-prefix-cls}__scroll {
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
}
|
|
489
|
+
// .@{tabs-prefix-cls}__scroll {
|
|
490
|
+
// &::after {
|
|
491
|
+
// box-shadow: -4px 0 6px rgba(0, 0, 0, 0.35);
|
|
492
|
+
// }
|
|
493
|
+
// }
|
|
459
494
|
}
|