@gyyxds/zy-ui 0.0.1 → 0.0.3
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/CHANGELOG.md +34 -19
- package/CONTRIBUTING.md +109 -99
- package/LICENSE +21 -0
- package/README.md +397 -162
- package/dist/zy-ui/badge/ZyBadge.vue.d.ts +4 -4
- package/dist/zy-ui/badge/index.d.ts +6 -6
- package/dist/zy-ui/button/ZyButton.vue.d.ts +3 -3
- package/dist/zy-ui/button/index.d.ts +9 -9
- package/dist/zy-ui/card/ZyCard.vue.d.ts +1 -1
- package/dist/zy-ui/card/index.d.ts +3 -3
- package/dist/zy-ui/checkbox/ZyCheckboxGroup.vue.d.ts +1 -1
- package/dist/zy-ui/checkbox/index.d.ts +3 -3
- package/dist/zy-ui/code-input/ZyCodeInput.vue.d.ts +2 -2
- package/dist/zy-ui/code-input/index.d.ts +2 -2
- package/dist/zy-ui/divider/ZyDivider.vue.d.ts +1 -1
- package/dist/zy-ui/divider/index.d.ts +3 -3
- package/dist/zy-ui/icon/ZyIcon.vue.d.ts +1 -1
- package/dist/zy-ui/icon/index.d.ts +1 -1
- package/dist/zy-ui/index.d.ts +62 -46
- package/dist/zy-ui/input/ZyInput.vue.d.ts +3 -3
- package/dist/zy-ui/input/index.d.ts +3 -3
- package/dist/zy-ui/loading/ZyLoading.vue.d.ts +1 -1
- package/dist/zy-ui/loading/index.d.ts +1 -1
- package/dist/zy-ui/mega-menu/ZyMegaMenu.vue.d.ts +12 -4
- package/dist/zy-ui/mega-menu/index.d.ts +16 -0
- package/dist/zy-ui/progress/ZyProgress.vue.d.ts +1 -1
- package/dist/zy-ui/progress/index.d.ts +3 -3
- package/dist/zy-ui/radio/ZyRadioGroup.vue.d.ts +3 -3
- package/dist/zy-ui/select/ZySelect.vue.d.ts +1 -1
- package/dist/zy-ui/select/index.d.ts +3 -3
- package/dist/zy-ui/space/ZySpace.vue.d.ts +1 -1
- package/dist/zy-ui/space/index.d.ts +3 -3
- package/dist/zy-ui/table/ZyTable.vue.d.ts +3 -3
- package/dist/zy-ui/tag/ZyTag.vue.d.ts +2 -2
- package/dist/zy-ui/tag/index.d.ts +6 -6
- package/dist/zy-ui/themes/basic.css +837 -832
- package/dist/zy-ui/themes/material.css +41 -37
- package/dist/zy-ui/themes/solid.css +665 -664
- package/dist/zy-ui/tree/ZyTree.vue.d.ts +2 -2
- package/dist/zy-ui/zy-ui.css +1 -1
- package/dist/zy-ui/zy-ui.js +299 -247
- package/package.json +82 -82
package/README.md
CHANGED
|
@@ -1,162 +1,397 @@
|
|
|
1
|
-
#
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
| |
|
|
10
|
-
|
|
11
|
-
|
|
|
12
|
-
|
|
|
13
|
-
|
|
|
14
|
-
|
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
npm
|
|
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
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
`
|
|
93
|
-
`
|
|
94
|
-
`
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
|
133
|
-
|
|
|
134
|
-
|
|
|
135
|
-
|
|
|
136
|
-
|
|
|
137
|
-
|
|
|
138
|
-
|
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
1
|
+
# Zy UI 组件库 · 智云UI
|
|
2
|
+
|
|
3
|
+
基于 **Vue 3 + TypeScript + Vite** 的 Element Plus 二次封装组件库,配套一套**组件文档 + 设计规范站**(智云UI)。
|
|
4
|
+
|
|
5
|
+
组件带 props / 事件 / 插槽,随包发布;文档站与展示板不发布,它们是这套组件的用法说明与设计依据。
|
|
6
|
+
|
|
7
|
+
| 属性 | 说明 |
|
|
8
|
+
| --- | --- |
|
|
9
|
+
| 包名 | `@gyyxds/zy-ui` |
|
|
10
|
+
| 技术栈 | Vue 3、TypeScript、Element Plus |
|
|
11
|
+
| 构建工具 | Vite 8(库模式)+ vue-tsc |
|
|
12
|
+
| 模块格式 | 仅 ESM(`"type": "module"`),无 CJS 产物 |
|
|
13
|
+
| 组件数 | 28 |
|
|
14
|
+
| 设计主题 | 2 套材质(图纸 / 键帽)× 2 档光照(浅 / 深) |
|
|
15
|
+
|
|
16
|
+
## 仓库里有什么
|
|
17
|
+
|
|
18
|
+
| | 组件库(`src/zy/`) | 文档与设计站(`src/views/`、`docs/theme/`) |
|
|
19
|
+
| --- | --- | --- |
|
|
20
|
+
| 是什么 | 有 props / 事件 / 插槽的 Vue 组件 | 组件的用法文档 + 两套材质的设计方案 |
|
|
21
|
+
| 怎么用 | `npm i @gyyxds/zy-ui` 后 `import` | 浏览器打开站点;设计推导见 `docs/theme/` |
|
|
22
|
+
| 是否发布 | 进 lib 构建(`dist/zy-ui/`) | 不进包,只作为站点与设计资料 |
|
|
23
|
+
|
|
24
|
+
> 2026-10 站点瘦身:动效页(`/animations`)、收藏页(`/favorites`)与片段体系已下线,仓库回归「组件库 + 组件文档 + 设计规范」。
|
|
25
|
+
> 组件自带的 `effect` 微动效(按压缩放、色块扫入、实色键帽等)仍在组件库内,属于组件 API 的一部分。
|
|
26
|
+
|
|
27
|
+
站点产物与库产物分开放:
|
|
28
|
+
|
|
29
|
+
```
|
|
30
|
+
dist/site/ # 文档站(npm run build)
|
|
31
|
+
dist/zy-ui/ # 组件库(npm run build:lib,进包)
|
|
32
|
+
```
|
|
33
|
+
|
|
34
|
+
## 功能特性
|
|
35
|
+
|
|
36
|
+
- 28 个组件,全部是 Element Plus 的二次封装或同构重绘,`type` / `size` / `v-model` / 事件写法与 Element 保持一致
|
|
37
|
+
- 多个组件带一组 `effect` 微动效:按钮 `press` / `sweep` / `fill`,输入框 `underline` / `gradient` / `brutalist`,选择器 `underline` / `gradient` …
|
|
38
|
+
- 两套材质主题 × 深浅两档,四组配色互不回退:图纸(`basic`)与实色键帽(`solid`)
|
|
39
|
+
- 设计令牌随包发布(`--zy-*`),覆盖语义令牌即可换肤,无需改组件代码
|
|
40
|
+
- 首页是设计方案本身:两根正交的轴、四种组合、两套色板、原则与判据;点色卡即可切换整站主题
|
|
41
|
+
- TypeScript 类型声明随包发布;ESLint 0 警告门槛、Vitest 单测、消费方冒烟检查与视觉回归
|
|
42
|
+
|
|
43
|
+
## 组件列表(28 个)
|
|
44
|
+
|
|
45
|
+
分类与文档站一致(`src/mocks/element-components.ts`)。
|
|
46
|
+
|
|
47
|
+
### 基础(3)
|
|
48
|
+
|
|
49
|
+
| 组件 | 说明 |
|
|
50
|
+
| --- | --- |
|
|
51
|
+
| `ZyButton` | `type` / `plain` / `round` / `dashed` / `circle` 对齐 Element。`effect`:`press`(按压缩放,默认)/ `sweep`(左侧图标块 + 色块扫入)/ `fill`(实色键帽 + 悬停中心扩散,**仅键帽主题**,图纸主题下自动按 `press` 渲染) |
|
|
52
|
+
| `ZyIcon` | 内置 SVG 图标,`name` 取 `src/assets/icons/` 的文件名(如 `btn-search`);`size` / `label` / `spin` |
|
|
53
|
+
| `ZyLoading` | 纯 div + CSS,不基于 Element。`type`:`dots` 点环 / `line` 心电描线 / `text` 故障字 / `bar` 跳球柱形;`color` / `speed` / `width` / `height` / `label` |
|
|
54
|
+
|
|
55
|
+
### 表单(12)
|
|
56
|
+
|
|
57
|
+
| 组件 | 说明 |
|
|
58
|
+
| --- | --- |
|
|
59
|
+
| `ZyInput` | `effect`:`focus`(默认,描边转主色)/ `underline`(下划线扫过)/ `gradient`(渐变边)/ `brutalist`;另有 `label` 浮动标签、`raised` 键帽凸起形态 |
|
|
60
|
+
| `ZyCodeInput` | 验证码输入。`length` / `status`(idle / error / success)/ `size` / `mask` / `caret` / `disabled`;`v-model` + `complete` 事件 |
|
|
61
|
+
| `ZySelect` | `effect`:`focus` / `underline` / `gradient`;其余 API 照 Element |
|
|
62
|
+
| `ZyCheckbox` / `ZyCheckboxGroup` | `effect`:`''` / `checkmark` / `tick`;Group 用 `v-model` 收集选中值 |
|
|
63
|
+
| `ZySwitch` | 自研全息开关(不基于 Element):扫描线 / 粒子 / 三环自转;`v-model` + `activeText` / `inactiveText` / `label` / `disabled` |
|
|
64
|
+
| `ZyRadio` / `ZyRadioGroup` / `ZyRadioButton` | 选中态辉光圆点 + 过冲弹跳;`effect`:`''` / `underline` |
|
|
65
|
+
| `ZySlideVerify` | 滑块拼图验证(内置插画底图《缺口光谱》)。`gap` / `tolerance` / `image` / `darkImage` / `showRefresh` 与各档文案;事件:成功 / 失败 / 刷新 |
|
|
66
|
+
| `ZyDatePicker` / `ZyTimePicker` | 触发框与弹层形态重绘,API 照 Element |
|
|
67
|
+
|
|
68
|
+
### 数据(7)
|
|
69
|
+
|
|
70
|
+
| 组件 | 说明 |
|
|
71
|
+
| --- | --- |
|
|
72
|
+
| `ZyCard` | `shadow`(always / hover / never)、`hoverFill`(悬停铺色,可传颜色) |
|
|
73
|
+
| `ZyTag` | `effect`:`dark` / `light`(默认)/ `plain` / `fill`(实色键帽,**仅键帽主题**;图纸主题下自动退回浅底;`closable` 时关闭图标跟标签字色) |
|
|
74
|
+
| `ZyBadge` | 等宽数字不跳宽;`effect`:`''` / `ping`(扩散圈) |
|
|
75
|
+
| `ZyProgress` | 轨道 + 蓝→绿渐变填充 |
|
|
76
|
+
| `ZyTable` | 台账式表格,`lines`(all / row)控制网格线;数据与列走插槽 / Element 透传 |
|
|
77
|
+
| `ZyTree` | 引导线 + 折角接线 + 写实节点图标;`folderIcon` / `folderOpenIcon` / `fileIcon` |
|
|
78
|
+
| `ZyPagination` | 纸面按钮 / 中性键帽页码,跳页输入框 |
|
|
79
|
+
|
|
80
|
+
### 反馈(2)
|
|
81
|
+
|
|
82
|
+
| 组件 | 说明 |
|
|
83
|
+
| --- | --- |
|
|
84
|
+
| `ZyAlert` | 左侧 3px 语义强调条 / 语义键块,标题留语义色 |
|
|
85
|
+
| `ZyDialog` | `v-model` 开合;`title` / `width` / `icon` / `appendToBody` / `closeOnClickModal`(默认 false)/ `destroyOnClose` |
|
|
86
|
+
|
|
87
|
+
### 布局(4)
|
|
88
|
+
|
|
89
|
+
| 组件 | 说明 |
|
|
90
|
+
| --- | --- |
|
|
91
|
+
| `ZyDivider` | `contentPosition`:left / center / right |
|
|
92
|
+
| `ZySpace` | 纯布局件,`direction` 等间距控制 |
|
|
93
|
+
| `ZyPanel` | 通用容器:有 `title` 分标题栏 + 正文,无 `title` 通体白面 |
|
|
94
|
+
| `ZyMegaMenu` | 数据驱动导航:`items`(有 `panel` = 下拉,无 `panel` + `href` = 普通链接)、`brand`;受控开合 `v-model:open`;`#panel-<key>` 接管面板内容 |
|
|
95
|
+
|
|
96
|
+
## 设计系统:两套语言 × 两档光照
|
|
97
|
+
|
|
98
|
+
站点首页(`/`)展示的就是这套方案,数据源在 `src/mocks/theme-design.ts`;完整推导、逐组件增量与对比度体检在 [`docs/theme/README.md`](docs/theme/README.md)。
|
|
99
|
+
|
|
100
|
+
### 两根正交的轴
|
|
101
|
+
|
|
102
|
+
| 轴 | 根属性(设在 `<html>` 上) | 取值 | 默认 |
|
|
103
|
+
| --- | --- | --- | --- |
|
|
104
|
+
| 材质主题 | `data-zy-theme` | `basic`(图纸)/ `solid`(实色键帽) | `solid` |
|
|
105
|
+
| 光照 | `data-zy-color-scheme` + `html.dark` class | `light` / `dark` | `light` |
|
|
106
|
+
|
|
107
|
+
两轴自由组合:深浅色在**当前选中的材质**内切换,不会把 `solid` 折叠回 `basic`。
|
|
108
|
+
|
|
109
|
+
### 四种组合
|
|
110
|
+
|
|
111
|
+
| 组合 | 一句话 | 主要落点 |
|
|
112
|
+
| --- | --- | --- |
|
|
113
|
+
| A · 图纸 / 浅色 | 白纸 + 发丝线 + 6px 方角,一张纸压一张纸 | `src/zy/styles/themes/basic.css` |
|
|
114
|
+
| A · 图纸 / 深色 | 同一张纸,夜里开了一盏台灯:只换光,不加厚度 | `basic.css` §0.1 + `tokens/dark.css` |
|
|
115
|
+
| B · 键帽 / 浅色 | 白键摆在灰桌上:凸起靠底座,凹槽靠内阴影 | `src/zy/styles/themes/solid.css` |
|
|
116
|
+
| B · 键帽 / 深色 | 同一张桌关了顶灯:顶光收薄、落影加重,厚度一分不减 | `solid.css` §0.1 / §0.2 |
|
|
117
|
+
|
|
118
|
+
两套语言只换材质,不动寸法:同一组件在两套主题下的高度差为 0(键高走 `box-shadow`,不进盒模型)。
|
|
119
|
+
|
|
120
|
+
### 判据
|
|
121
|
+
|
|
122
|
+
1. 正文 ≥ 4.5:1、控件边界 ≥ 2.4:1、分层 ≥ 1.1:1。
|
|
123
|
+
2. 主题不得改变形状、尺寸、圆角与位移方向。
|
|
124
|
+
3. 深色只换光照:不给 A 加厚度,也不去掉 B 的白弧与底座。
|
|
125
|
+
4. 字色跟着面走:面亮配墨、面深配白;同一语义允许在两档里给不同答案。
|
|
126
|
+
|
|
127
|
+
`node docs/theme/tools/contrast.mjs` 会逐对验算这四张板的色板。
|
|
128
|
+
|
|
129
|
+
### 首页展示什么
|
|
130
|
+
|
|
131
|
+
| 区块 | 内容 |
|
|
132
|
+
| --- | --- |
|
|
133
|
+
| 抬头 | 两套语言的立场、两根轴、28 个组件 / 2 套材质 / 2 档光照 |
|
|
134
|
+
| 四种组合 | 2 × 2 卡片,点任意一格把整站切到那套材质与光照 |
|
|
135
|
+
| 两套色板 | A / B 各一段,浅色与深色并排印出令牌名、用途与实际值 |
|
|
136
|
+
| 设计原则 | 两条语言各自的层级、只换材质、两档光照、字色跟面走 |
|
|
137
|
+
| 判据 | 对比度与尺寸的硬门槛 |
|
|
138
|
+
| 落地 | 令牌、材质层、展示板与对比度工具的位置 |
|
|
139
|
+
|
|
140
|
+
## 安装使用
|
|
141
|
+
|
|
142
|
+
```bash
|
|
143
|
+
npm i @gyyxds/zy-ui element-plus
|
|
144
|
+
```
|
|
145
|
+
|
|
146
|
+
`vue` 与 `element-plus` 是 peerDependency,需由业务项目自己安装;组件内部直接使用 `El*`,**不需要**先全局注册 Element Plus。
|
|
147
|
+
|
|
148
|
+
```ts
|
|
149
|
+
// main.ts —— 顺序:Element 样式 → 本包组件样式 → 主题材质
|
|
150
|
+
import { createApp } from 'vue'
|
|
151
|
+
import ElementPlus from 'element-plus'
|
|
152
|
+
import 'element-plus/dist/index.css'
|
|
153
|
+
import '@gyyxds/zy-ui/style.css'
|
|
154
|
+
import '@gyyxds/zy-ui/theme/solid.css' // 浅色默认;要图纸语言改用 theme/basic.css
|
|
155
|
+
|
|
156
|
+
import App from './App.vue'
|
|
157
|
+
|
|
158
|
+
createApp(App).use(ElementPlus).mount('#app')
|
|
159
|
+
```
|
|
160
|
+
|
|
161
|
+
导出路径(对应 `package.json` 的 `exports`):
|
|
162
|
+
|
|
163
|
+
| 路径 | 内容 |
|
|
164
|
+
| --- | --- |
|
|
165
|
+
| `@gyyxds/zy-ui` | 组件库入口(全局 install + 全部具名导出) |
|
|
166
|
+
| `@gyyxds/zy-ui/style.css` | 组件样式 + 设计令牌(`dist/zy-ui/zy-ui.css`) |
|
|
167
|
+
| `@gyyxds/zy-ui/theme/basic.css` | 主题 A「基础用法 / 图纸」材质层 |
|
|
168
|
+
| `@gyyxds/zy-ui/theme/solid.css` | 主题 B「实色键帽」材质层 |
|
|
169
|
+
|
|
170
|
+
两个主题 CSS 可同时引入,由根元素属性决定谁生效。
|
|
171
|
+
|
|
172
|
+
### 三种引入方式
|
|
173
|
+
|
|
174
|
+
```ts
|
|
175
|
+
// ① 全局注册
|
|
176
|
+
import ZyUi from '@gyyxds/zy-ui'
|
|
177
|
+
app.use(ZyUi) // 之后模板里直接写 <ZyButton /> <ZyInput /> …
|
|
178
|
+
|
|
179
|
+
// ② 按需引入(推荐,tree-shaking 生效,只打进用到的组件)
|
|
180
|
+
import { ZyButton, ZyInput } from '@gyyxds/zy-ui'
|
|
181
|
+
|
|
182
|
+
// ③ 单组件注册(组件自带 install,对齐 Element 的做法)
|
|
183
|
+
import { ZyButton } from '@gyyxds/zy-ui'
|
|
184
|
+
app.use(ZyButton)
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
```vue
|
|
188
|
+
<script setup lang="ts">
|
|
189
|
+
import { ref } from 'vue'
|
|
190
|
+
import { ZyButton, ZyInput } from '@gyyxds/zy-ui'
|
|
191
|
+
|
|
192
|
+
const keyword = ref('')
|
|
193
|
+
</script>
|
|
194
|
+
|
|
195
|
+
<template>
|
|
196
|
+
<ZyInput v-model="keyword" placeholder="搜索组件…" clearable />
|
|
197
|
+
<ZyButton type="primary" effect="press">提交</ZyButton>
|
|
198
|
+
</template>
|
|
199
|
+
```
|
|
200
|
+
|
|
201
|
+
### 使用约定
|
|
202
|
+
|
|
203
|
+
- 未显式声明的 Element props / 事件按 Vue 的 attribute 透传,落到内部 `El*` 上。
|
|
204
|
+
- 具名插槽原样转发给内部 Element 组件(如 `<ZyButton><template #icon>…</template></ZyButton>`),默认插槽由各组件自己安排位置。
|
|
205
|
+
- 自定义组件(`ZySwitch` / `ZyCodeInput` / `ZyDialog` / `ZyCheckboxGroup` / `ZyRadioGroup`)用 `defineModel`,`v-model` 直接可用;`ZySlideVerify` 走事件。
|
|
206
|
+
- 图标属性传字符串时按本库内置图标名解析(`ZyIcon` / `ZyTree` 等);`ZyButton` 的 `icon` 目前只在 `sweep` 下解析字符串,`press` / `fill` 请按 Element 规则传组件或走 `#icon` 插槽。
|
|
207
|
+
- 不要依赖组件内部 `.el-*` 子结构与内部类名:只有 props / 事件 / 插槽 / `--zy-*` 令牌是稳定契约。
|
|
208
|
+
|
|
209
|
+
## 主题与令牌
|
|
210
|
+
|
|
211
|
+
```html
|
|
212
|
+
<html data-zy-theme="solid" data-zy-color-scheme="light"></html>
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
- 业务侧开深色:给 `<html>` 加 `dark` class 即可(`data-zy-color-scheme` 是语义标记)。
|
|
216
|
+
- 换肤覆盖语义令牌,不要动组件内部结构:
|
|
217
|
+
|
|
218
|
+
```css
|
|
219
|
+
/* 业务侧换肤:覆盖语义令牌 */
|
|
220
|
+
:root {
|
|
221
|
+
--zy-brand: #0066a9;
|
|
222
|
+
--zy-radius: 6px;
|
|
223
|
+
--zy-ease-out: cubic-bezier(0.23, 1, 0.32, 1);
|
|
224
|
+
}
|
|
225
|
+
/* 深色选择器要与 dark.css 同权重,并让业务 CSS 晚于主题 CSS 加载 */
|
|
226
|
+
html.dark[data-zy-theme] {
|
|
227
|
+
--zy-brand: #5aa6e4;
|
|
228
|
+
}
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
`html.dark` 的权重低于 `dark.css` 里的 `html.dark[data-zy-theme='basic' | 'solid']`,单独写会被盖住;`html.dark[data-zy-theme]` 与它同级,后加载即可覆盖。
|
|
232
|
+
|
|
233
|
+
深色实心件另消费 `--zy-brand-key`(键面),悬停 / 按下走 `--zy-brand-deep` / `--zy-brand-active`;换整套品牌色时一并覆盖,`/theme` 页有可复制片段。
|
|
234
|
+
|
|
235
|
+
令牌分层固定:`primitives.css`(原始值)→ `semantic.css`(语义值,业务应覆盖这一层)→ `element.css`(Element Plus 映射)→ `dark.css`(深色覆盖)。
|
|
236
|
+
|
|
237
|
+
常用语义令牌:`--zy-brand` / `--zy-green` / `--zy-danger` / `--zy-warning` / `--zy-info`、`--zy-ink` / `--zy-muted` / `--zy-inverse`、`--zy-paper` / `--zy-surface` / `--zy-hairline`、`--zy-radius`(6px)/ `--zy-radius-sm`(4px)/ `--zy-radius-pill`(999px)、`--zy-shadow-card` / `--zy-shadow-float` / `--zy-focus-ring`、`--zy-duration-fast` / `--zy-duration-press`、`--zy-ease-out` / `--zy-ease-soft` / `--zy-ease-overshoot`、`--zy-font-sans`。
|
|
238
|
+
|
|
239
|
+
键帽主题额外有 `--zy-desk` / `--zy-slot-*` / `--zy-key-*`,只在该主题下定义。组件级微调优先用组件暴露的局部变量,如按钮 sweep/fill 的 `--zy-btn-sweep-clr` / `--zy-btn-fill-clr` / `--zy-btn-fill-hover-clr`。
|
|
240
|
+
|
|
241
|
+
## 本地开发
|
|
242
|
+
|
|
243
|
+
### 1. 安装依赖
|
|
244
|
+
|
|
245
|
+
```bash
|
|
246
|
+
npm install
|
|
247
|
+
# 或 yarn install --ignore-engines(@changesets/cli 要求 yarn ≥ 4.5,本机 yarn 1.x 需跳过引擎检查)
|
|
248
|
+
```
|
|
249
|
+
|
|
250
|
+
Node.js 需 `^20.19` 或 `>= 22.12`(Vite 8 要求)。
|
|
251
|
+
|
|
252
|
+
### 2. 启动开发服务
|
|
253
|
+
|
|
254
|
+
```bash
|
|
255
|
+
npm run dev
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
该命令会先跑 `check:registry` 校验组件注册表,再启动 Vite(默认端口 **5173**,`host: true` 便于局域网访问)。
|
|
259
|
+
|
|
260
|
+
### 3. 访问文档站
|
|
261
|
+
|
|
262
|
+
浏览器打开 [http://localhost:5173](http://localhost:5173)。
|
|
263
|
+
|
|
264
|
+
| 路由 | 内容 |
|
|
265
|
+
| --- | --- |
|
|
266
|
+
| `/` | 首页:设计方案(两根轴、四种组合、两套色板、原则与判据) |
|
|
267
|
+
| `/components/:id` | 组件页:左树右文 + 舞台 + 可复制 SFC + API 属性表 |
|
|
268
|
+
| `/theme` | 主题实验室:材质 / 光照切换、真实组件验收、品牌色与圆角令牌覆盖 |
|
|
269
|
+
| `/about` | 关于:项目说明、使用授权、更新日志 |
|
|
270
|
+
|
|
271
|
+
首页背景是四张 `1920 × 1200` PNG:`basic` / `solid` 两套材质 × 浅色 / 深色两档,分别铺满视口;首页不再使用页面渐变。图片由 `scripts/gen_home_backgrounds.py` 生成,设计与构图说明见 `docs/theme/home-backgrounds.md`。
|
|
272
|
+
|
|
273
|
+
顶栏可切深浅;顶栏菜单是一枚直接浮在顶栏上的胶囊(不铺轨道),复用 `ZyRadioGroup` 分段按钮组的 400ms 回弹节奏,切栏目时胶囊从上一格滑过去,不再重建。材质与光照在首页的四种组合或 `/theme` 切换。`?theme=dark&zyTheme=basic` 之类的查询参数可固定主题,方便截图与分享。
|
|
274
|
+
|
|
275
|
+
旧地址 `/animations`、`/favorites` 与未知路由都会回到首页。
|
|
276
|
+
|
|
277
|
+
### 4. 常用命令
|
|
278
|
+
|
|
279
|
+
| 命令 | 作用 |
|
|
280
|
+
| --- | --- |
|
|
281
|
+
| `npm run dev` | 文档站(前置跑 registry 校验) |
|
|
282
|
+
| `npm run build` | 构建站点 → `dist/site/` |
|
|
283
|
+
| `npm run build:lib` | 构建可发布库 → `dist/zy-ui/`(只含 28 个组件) |
|
|
284
|
+
| `npm run lint` | ESLint 检查(0 警告门槛) |
|
|
285
|
+
| `npm run test` | Vitest 单元测试 |
|
|
286
|
+
| `npm run check:registry` | 组件注册表 ↔ 实现文件、站点组件数、令牌完整性 |
|
|
287
|
+
| `npm run check:package` | 校验包导出目标与 `npm pack` 文件清单 |
|
|
288
|
+
| `npm run check:consumer` | 用 `npm pack` 产物在空项目安装、类型检查并构建 |
|
|
289
|
+
| `npm run check:theme-runtime` | 主题运行时校验(需先启动站点) |
|
|
290
|
+
| `npm run check:visual` / `:update` | 视觉回归 / 审核通过后更新基线(需先启动站点) |
|
|
291
|
+
| `npm run check:release-env` | 发布前置体检:registry / 登录 / 版本 / 待发 changeset |
|
|
292
|
+
| `npm run changeset` | 记录一次待发布变更 |
|
|
293
|
+
| `npm run release` | 体检 → 构建 → `changeset publish` |
|
|
294
|
+
|
|
295
|
+
站点与库产物分开放(`dist/site` 与 `dist/zy-ui`),互不覆盖。
|
|
296
|
+
|
|
297
|
+
### 5. 业务项目直接引用本仓库(`file:` 依赖)
|
|
298
|
+
|
|
299
|
+
业务项目里写 `"@gyyxds/zy-ui": "file:../motion-vault-components"` 时,**不会**触发本仓库的构建(`prepublishOnly` 只在 `npm publish` 时跑),装的就是仓库里现成的 `dist/zy-ui`。所以改了组件后要手动重建一次:
|
|
300
|
+
|
|
301
|
+
```bash
|
|
302
|
+
# 本仓库:改了 src/zy 之后都要跑一遍(约 30 秒,跑完 lint / 测试再打更稳)
|
|
303
|
+
npm run build:lib
|
|
304
|
+
|
|
305
|
+
# 业务项目:file: 依赖是软链,重建后产物已经生效,下面这步一般不需要;
|
|
306
|
+
# 只有 package.json 的 exports / 版本号变了才重装
|
|
307
|
+
npm install
|
|
308
|
+
```
|
|
309
|
+
|
|
310
|
+
几条注意:
|
|
311
|
+
|
|
312
|
+
- `file:` 依赖是软链,`node_modules/@gyyxds/zy-ui` 指向本仓库根目录;本仓库删掉 `dist` 后业务项目会立刻报「找不到入口」,重建就好。
|
|
313
|
+
- 业务项目的 dev server 会缓存 `node_modules/.vite`:重建后没变化就删掉它、重启 dev。
|
|
314
|
+
- 单页调试用 `npm run dev`(文档站)最快;`file:` 链路是给「在自己的业务页面里验证」用的。
|
|
315
|
+
- 样式三件套别漏:Element 样式 → `@gyyxds/zy-ui/style.css` → 一份主题 CSS(`theme/basic.css` 或 `theme/solid.css`)。
|
|
316
|
+
|
|
317
|
+
### 6. 新增 / 更新内容
|
|
318
|
+
|
|
319
|
+
**新组件**
|
|
320
|
+
|
|
321
|
+
1. 实现放 `src/zy/<Name>/`(含 `index.ts`),并在 `src/zy/index.ts` 追加导出
|
|
322
|
+
2. 文档条目写进 `src/mocks/element-components.ts`(描述、完整 SFC、API 属性表;成族组件共用一页时给 `count`)
|
|
323
|
+
3. 同步 `src/mocks/components.ts` 的 `COMPONENT_TOTAL` 与 README / AGENTS 的组件数
|
|
324
|
+
4. `npm run check:registry` 会拦住「实现了没注册」「注册了不存在」与漏定义的 `--zy-*` 令牌
|
|
325
|
+
|
|
326
|
+
**改设计 / 主题**
|
|
327
|
+
|
|
328
|
+
1. 色板与文案改 `src/mocks/theme-design.ts`(首页与四张展示板共用这一份)
|
|
329
|
+
2. 令牌改 `src/zy/styles/tokens/`,材质改 `src/zy/styles/themes/`
|
|
330
|
+
3. 同步 `docs/theme/README.md` 的推导与数值,跑 `node docs/theme/tools/contrast.mjs`
|
|
331
|
+
4. 视觉有变化时先人工确认,再 `npm run check:visual:update`
|
|
332
|
+
|
|
333
|
+
## 发布到 npm
|
|
334
|
+
|
|
335
|
+
包名 `@gyyxds/zy-ui`,发布地址固定 `https://registry.npmjs.org/`(`publishConfig` 已配 `access: public` + `registry`)。发布账号 **gyy-xds**(@gyyxds 组织),已开启 2FA。
|
|
336
|
+
|
|
337
|
+
```bash
|
|
338
|
+
# 1. 打包(前置自动跑 registry 校验 → vue-tsc → vite lib 构建 → check:package)
|
|
339
|
+
npm run build:lib
|
|
340
|
+
|
|
341
|
+
# 2. 登录 npm(须为 gyy-xds 或 @gyyxds 组织成员;浏览器完成认证)
|
|
342
|
+
npm login --registry=https://registry.npmjs.org/
|
|
343
|
+
|
|
344
|
+
# 3. 确认当前登录账号
|
|
345
|
+
npm whoami --registry=https://registry.npmjs.org/
|
|
346
|
+
|
|
347
|
+
# 4. 发布(scoped 包须加 --access public;按提示完成 2FA 验证)
|
|
348
|
+
npm publish --access public --registry=https://registry.npmjs.org/
|
|
349
|
+
```
|
|
350
|
+
|
|
351
|
+
要点:
|
|
352
|
+
|
|
353
|
+
- `prepublishOnly` 会在 publish 前自动重跑一遍 `build:lib`;产物已确认最新时可用 `--ignore-scripts` 跳过重复构建。
|
|
354
|
+
- 账号开启 2FA 后,publish 会要求浏览器授权或验证器一次性验证码(EOTP)。
|
|
355
|
+
- 发布后用 `npm view @gyyxds/zy-ui version` 确认上架;新包首次发布后 registry 生效可能有短暂延迟,404 不代表失败。
|
|
356
|
+
- 正式变更走 Changesets:`npm run changeset` → `changeset version` → `npm run release`(`release` 会先跑 `check:release-env` 体检)。
|
|
357
|
+
- 要让业务项目验证发布产物,可先跑 `npm run check:consumer`(`npm pack` → 空项目安装 → 类型检查 → 构建)。
|
|
358
|
+
|
|
359
|
+
## 目录结构
|
|
360
|
+
|
|
361
|
+
```
|
|
362
|
+
src/zy/ # 组件库源码(只有这部分会进发布产物)
|
|
363
|
+
├── button/ # 每个组件一个目录:index.ts 导出 + Zy*.vue 实现
|
|
364
|
+
├── input/ select/ …
|
|
365
|
+
├── styles/
|
|
366
|
+
│ ├── tokens/ # primitives → semantic → element → dark 四层令牌
|
|
367
|
+
│ └── themes/ # basic.css(图纸)/ solid.css(键帽)/ material.css
|
|
368
|
+
└── index.ts # 库入口:导出 + install
|
|
369
|
+
|
|
370
|
+
src/views/ # 文档站页面:首页(设计方案)/ 组件页 / 主题页 / 关于
|
|
371
|
+
src/components/ # 站点自身组件(布局、舞台、代码面板、UI 小件)
|
|
372
|
+
src/mocks/ # 站点数据:组件元信息、设计方案、关于页内容
|
|
373
|
+
src/stores/ # Pinia:主题(材质 + 光照)
|
|
374
|
+
src/assets/styles/ # 站点外壳令牌与动效(不影响组件库)
|
|
375
|
+
scripts/ # 校验与构建脚本(registry / package / consumer / theme-runtime / visual)
|
|
376
|
+
tests/ # Vitest 单测 + 视觉回归基线
|
|
377
|
+
docs/theme/ # 设计规范:两套语言、两档光照、四张展示板、对比度工具
|
|
378
|
+
```
|
|
379
|
+
|
|
380
|
+
## 浏览器支持
|
|
381
|
+
|
|
382
|
+
现代浏览器。样式用到 `color-mix()`、`:has()`、嵌套与 CSS 自定义属性,旧 WebView / IE 需先评估降级方案,详见 [浏览器支持](docs/browser-support.md)。
|
|
383
|
+
|
|
384
|
+
## 许可
|
|
385
|
+
|
|
386
|
+
MIT © 2026 @gyyxds/zy-ui contributors。可自由用于个人与商业项目,保留版权与许可声明即可分发;完整文本见 [LICENSE](LICENSE)。
|
|
387
|
+
|
|
388
|
+
## 团队协作
|
|
389
|
+
|
|
390
|
+
- [贡献规范](CONTRIBUTING.md)
|
|
391
|
+
- [主题设计规范](docs/theme/README.md)
|
|
392
|
+
- [两档光照推导](docs/theme/dark-mode-design.md)
|
|
393
|
+
- [从 Element Plus 迁移](docs/migration-from-element.md)
|
|
394
|
+
- [改造规范与进度](docs/ui-library-refactor-spec.md)
|
|
395
|
+
- [发布检查清单](docs/release-checklist.md)
|
|
396
|
+
- [组件 Owner 约定](docs/component-ownership.md)
|
|
397
|
+
- [变更日志](CHANGELOG.md)
|
|
@@ -14,14 +14,14 @@ type __VLS_Props = {
|
|
|
14
14
|
/** 微动效:'' 基础(等宽数字,9 → 10 宽度不跳)/ ping 角标后补一圈同色扩散圈,放大淡出 */
|
|
15
15
|
effect?: '' | 'ping';
|
|
16
16
|
};
|
|
17
|
-
declare var
|
|
17
|
+
declare var __VLS_8: {};
|
|
18
18
|
type __VLS_Slots = {} & {
|
|
19
|
-
default?: (props: typeof
|
|
19
|
+
default?: (props: typeof __VLS_8) => any;
|
|
20
20
|
};
|
|
21
21
|
declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
22
|
-
type: "
|
|
22
|
+
type: "primary" | "success" | "warning" | "info" | "danger";
|
|
23
23
|
effect: "" | "ping";
|
|
24
|
-
value:
|
|
24
|
+
value: number | string;
|
|
25
25
|
max: number;
|
|
26
26
|
isDot: boolean;
|
|
27
27
|
hidden: boolean;
|
|
@@ -8,9 +8,9 @@ export declare const ZyBadge: import("../utils/withInstall").SFCWithInstall<{
|
|
|
8
8
|
showZero?: boolean;
|
|
9
9
|
effect?: "" | "ping";
|
|
10
10
|
}> & Readonly<{}>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, import("vue").PublicProps, {
|
|
11
|
-
type: "
|
|
11
|
+
type: "primary" | "success" | "warning" | "info" | "danger";
|
|
12
12
|
effect: "" | "ping";
|
|
13
|
-
value:
|
|
13
|
+
value: number | string;
|
|
14
14
|
max: number;
|
|
15
15
|
isDot: boolean;
|
|
16
16
|
hidden: boolean;
|
|
@@ -31,9 +31,9 @@ export declare const ZyBadge: import("../utils/withInstall").SFCWithInstall<{
|
|
|
31
31
|
showZero?: boolean;
|
|
32
32
|
effect?: "" | "ping";
|
|
33
33
|
}> & Readonly<{}>, {}, {}, {}, {}, {
|
|
34
|
-
type: "
|
|
34
|
+
type: "primary" | "success" | "warning" | "info" | "danger";
|
|
35
35
|
effect: "" | "ping";
|
|
36
|
-
value:
|
|
36
|
+
value: number | string;
|
|
37
37
|
max: number;
|
|
38
38
|
isDot: boolean;
|
|
39
39
|
hidden: boolean;
|
|
@@ -51,9 +51,9 @@ export declare const ZyBadge: import("../utils/withInstall").SFCWithInstall<{
|
|
|
51
51
|
showZero?: boolean;
|
|
52
52
|
effect?: "" | "ping";
|
|
53
53
|
}> & Readonly<{}>, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, {
|
|
54
|
-
type: "
|
|
54
|
+
type: "primary" | "success" | "warning" | "info" | "danger";
|
|
55
55
|
effect: "" | "ping";
|
|
56
|
-
value:
|
|
56
|
+
value: number | string;
|
|
57
57
|
max: number;
|
|
58
58
|
isDot: boolean;
|
|
59
59
|
hidden: boolean;
|
|
@@ -27,9 +27,9 @@ type __VLS_Slots = {} & {
|
|
|
27
27
|
default?: (props: typeof __VLS_29) => any;
|
|
28
28
|
};
|
|
29
29
|
declare const __VLS_base: import("vue").DefineComponent<__VLS_Props, {}, {}, {}, {}, import("vue").ComponentOptionsMixin, import("vue").ComponentOptionsMixin, {}, string, import("vue").PublicProps, Readonly<__VLS_Props> & Readonly<{}>, {
|
|
30
|
-
size: "
|
|
31
|
-
type: "" | "success" | "warning" | "
|
|
32
|
-
effect: "
|
|
30
|
+
size: "large" | "default" | "small";
|
|
31
|
+
type: "primary" | "success" | "warning" | "danger" | "info" | "";
|
|
32
|
+
effect: "press" | "sweep" | "fill";
|
|
33
33
|
icon: string | Component;
|
|
34
34
|
round: boolean;
|
|
35
35
|
disabled: boolean;
|