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 CHANGED
@@ -1,78 +1,59 @@
1
- # vdesign-ui
2
1
 
3
- ## 项目说明
4
-
5
- ### 项目运行
6
-
7
- ```
8
- cd hs-ui
9
- yarn install
10
- yarn run serve
11
- ```
12
-
13
- ### 目录结构
14
-
15
- #### packages
16
- >
17
- > 主要包含 token2css 后的产物,及组件
18
-
19
- - index.js 为入口文件
20
- - token:token2css 转换后的 css 文件
21
- - components:基于 token 变量的 vue 组件
22
-
23
- #### sites
24
- >
25
- > 主要包含该组件库的站点,用于文档描述
26
-
27
- - docs:md 文档集合
28
- - router/nav.config.json:菜单配置文件
29
-
30
- #### Git 提交规范
31
-
32
- - feat: 增加订单详情 closes xxxx (closes非必需)
33
- - fix: 修复xx情况下xx问题 closes xxxx (closes非必需)
34
- - docs: 修改md文件
35
- - style: 修改订单列表样式
36
- - refactor: 重构utils.js下部分方法
37
- - chore: 增加xxx插件/xxxxloader
38
- - revert: 回退当前版本667ec到 sssee2
39
- - perf: 优化了xxx,提高了渲染速度
40
- - test:增加测试
41
- - improvement: 改进
42
- - build: 打包
43
- - ci: 持续集成w
44
-
45
- #### 修改 Git Commit
46
-
47
- ##### 1. 修改最后一次提交
48
-
49
- git commit --amend
50
-
51
- 该命令会创建一个提交并覆盖上次提交,如果是因为写错或者不满意上次的提交信息,使用该命令就非常适合。
52
-
53
- ##### 2. 合并多条提交
54
-
55
- git reset --soft [commitID]
56
-
57
- 如果你想合并最近几条提交信息的话,那么就需要使用上面的命令来操作,指定要撤销的ccommitId,该命令会保留当前改动并撤销指定提交后的所有commit记录,如果不指定ID的话可以使用HEAD~{num} 来选择最近{num}条提交
58
-
59
- git reset --soft HEAD~2 #合并最近两条提交
60
- git commit -m 'feat: add new feat'
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
- display: flex;
149
- flex-direction: column;
150
- gap: var(--spacing-check_radio-group-margin_x);
148
+ // display: flex;
149
+ // flex-direction: column;
150
+ // gap: var(--spacing-check_radio-group-margin_x);
151
151
 
152
- &-card{
153
- display: flex;
154
- flex-wrap: wrap;
155
- flex-direction: row;
156
- gap: 12px;
157
-
158
- .vd-radio-button-cell{
159
- flex: 1;
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-tabs__nav" :class="[barType, scrollspyClasses]" ref="nav">
5
- <div
6
- v-for="(tab, index) in tabs"
7
- :key="tab.name !== undefined ? tab.name : index"
8
- :class="[tabClasses(tab, index), lineClasses]"
9
- @click="onClick(tab, index)"
10
- ref="tabItems"
11
- >
12
- <span class="vd-tab__text" :class="ellipsisClasses" ref="title"
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
- {{ tab.title }}
15
- <!-- <vd-icon
16
- class="vd-tab__arrow"
17
- v-if="tab.arrow"
18
- name="icon_btn_moredown"
19
- ></vd-icon> -->
20
- </span>
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
- </div>
23
- <div class="vd-tabs__menu--right" v-if="menu">
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
- &::before {
317
- content: '';
318
- position: absolute;
319
- z-index: 1;
320
- top: 0;
321
- left: 0;
322
- width: 20px;
323
- height: 48px;
324
- background-color: var(--bg-color-1);
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
- &::after {
327
- content: '';
328
- box-shadow: 4px 0 6px rgba(0, 0, 0, 0.05);
329
- position: absolute;
330
- top: 50%;
331
- transform: translateY(-50%);
332
- left: 0;
333
- width: 20px;
334
- height: 30px;
335
- background-color: transparent;
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
- content: '';
354
- position: absolute;
355
- margin-inline-start: -16px;
356
- width: 16px;
357
- height: 100%;
358
- background-image: linear-gradient(to left, var(--bg-color-1) 0%, rgba(255, 255, 255, 0) 100%);
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
- &::before {
431
- right: 0;
432
- left: auto;
433
- }
434
- &::after {
435
- right: 0;
436
- left: auto;
437
- box-shadow: -4px 0 6px rgba(0, 0, 0, 0.05);
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
- &::after {
456
- box-shadow: -4px 0 6px rgba(0, 0, 0, 0.35);
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
  }