@neatui/css 3.17.0 → 4.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.
- package/GUIDE.md +512 -242
- package/MIGRATION-4.0.md +144 -0
- package/README.md +32 -16
- package/components/load/load@h.scss +24 -9
- package/core/basic.scss +7 -16
- package/core/border.scss +3 -0
- package/core/flex.scss +1 -1
- package/core/media.scss +1 -1
- package/core/shadow.scss +0 -89
- package/core/size.scss +39 -41
- package/core/theme.scss +19 -16
- package/core/trim.scss +88 -98
- package/index.scss +1 -0
- package/package.json +1 -1
package/GUIDE.md
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
# NeatUI 完整使用手册
|
|
2
2
|
|
|
3
|
-
> **版本**: @neatui/css
|
|
3
|
+
> **版本**: @neatui/css v4.0.0
|
|
4
4
|
>
|
|
5
|
-
> **更新日期**:
|
|
5
|
+
> **更新日期**: 2026-07-28
|
|
6
6
|
>
|
|
7
|
-
> **定位**:
|
|
7
|
+
> **定位**: 这不是又一个 CSS 工具库,而是一套完整的设计系统 + 原子化实现
|
|
8
8
|
|
|
9
9
|
---
|
|
10
10
|
|
|
@@ -36,7 +36,7 @@ NeatUI 要求你摒弃传统的 CSS 思维,建立全新的思维模型:
|
|
|
36
36
|
✅ 正确: n-mm; w-lm;
|
|
37
37
|
```
|
|
38
38
|
|
|
39
|
-
|
|
39
|
+
**原则**:永远不轻易使用任意像素值,使用 S/M/L 相对尺寸体系。(特殊场景下使用自定义值应作为特批备注)
|
|
40
40
|
|
|
41
41
|
#### 2. 坐标思维 > 属性思维
|
|
42
42
|
```
|
|
@@ -94,8 +94,8 @@ npm install @neatui/css
|
|
|
94
94
|
# Yarn
|
|
95
95
|
yarn add @neatui/css
|
|
96
96
|
|
|
97
|
-
# Nuxt 项目
|
|
98
|
-
npm install @neatui/css @neatui/
|
|
97
|
+
# Vue / Nuxt 项目
|
|
98
|
+
npm install @neatui/css @neatui/vue
|
|
99
99
|
```
|
|
100
100
|
|
|
101
101
|
### 在项目中引入
|
|
@@ -113,15 +113,9 @@ npm install @neatui/css @neatui/nuxt
|
|
|
113
113
|
}
|
|
114
114
|
```
|
|
115
115
|
|
|
116
|
-
#### 方式 2: Nuxt
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
export default defineNuxtConfig({
|
|
120
|
-
modules: [
|
|
121
|
-
'@neatui/nuxt'
|
|
122
|
-
]
|
|
123
|
-
})
|
|
124
|
-
```
|
|
116
|
+
#### 方式 2: Nuxt 项目
|
|
117
|
+
|
|
118
|
+
在 Nuxt 应用样式中引入 `@neatui/css`,组件直接从 `@neatui/vue` 导入。
|
|
125
119
|
|
|
126
120
|
### 第一个示例
|
|
127
121
|
|
|
@@ -143,6 +137,8 @@ export default defineNuxtConfig({
|
|
|
143
137
|
|
|
144
138
|
## 尺寸系统
|
|
145
139
|
|
|
140
|
+
从3.x升级时,同名尺寸类不保证保持原值。请按 [4.0尺寸迁移指南](./MIGRATION-4.0.md) 的旧值表进行迁移。
|
|
141
|
+
|
|
146
142
|
### 核心概念:S/M/L 矩阵
|
|
147
143
|
|
|
148
144
|
NeatUI 采用 **分形尺寸体系**,而非线性数值:
|
|
@@ -163,50 +159,97 @@ NeatUI 采用 **分形尺寸体系**,而非线性数值:
|
|
|
163
159
|
第二个字母 = 微调
|
|
164
160
|
```
|
|
165
161
|
|
|
166
|
-
### 12
|
|
162
|
+
### 宽高基础段(含 no 共 12 档)
|
|
167
163
|
|
|
168
164
|
```
|
|
169
|
-
no → 0
|
|
170
|
-
xs → 0.5em
|
|
171
|
-
ss →
|
|
172
|
-
sm →
|
|
173
|
-
sl →
|
|
174
|
-
ms →
|
|
175
|
-
mm →
|
|
176
|
-
ml →
|
|
177
|
-
ls →
|
|
178
|
-
lm →
|
|
179
|
-
ll →
|
|
180
|
-
xl →
|
|
165
|
+
no → 0
|
|
166
|
+
xs → 0.5em
|
|
167
|
+
ss → 1em
|
|
168
|
+
sm → 1.5em
|
|
169
|
+
sl → 2em
|
|
170
|
+
ms → 2.5em
|
|
171
|
+
mm → 3em
|
|
172
|
+
ml → 3.5em
|
|
173
|
+
ls → 4em
|
|
174
|
+
lm → 4.5em
|
|
175
|
+
ll → 5em
|
|
176
|
+
xl → 5.5em
|
|
181
177
|
```
|
|
182
178
|
|
|
183
|
-
|
|
179
|
+
各模块共享档位名称,但不共享同一组数值;上表只适用于 `w / min-w / max-w / h / min-h / max-h`。
|
|
180
|
+
|
|
181
|
+
### 宽高分段扩展
|
|
184
182
|
|
|
185
183
|
```scss
|
|
186
|
-
|
|
187
|
-
w-
|
|
184
|
+
基础段:
|
|
185
|
+
w-xs // 0.5em
|
|
186
|
+
w-xl // 5.5em
|
|
188
187
|
|
|
189
|
-
|
|
190
|
-
w-
|
|
188
|
+
紧凑容器段:
|
|
189
|
+
w-xs*s // 6em
|
|
190
|
+
w-xl*s // 16em
|
|
191
191
|
|
|
192
|
-
|
|
193
|
-
w-
|
|
194
|
-
w-
|
|
195
|
-
|
|
192
|
+
中型容器段:
|
|
193
|
+
w-xs*m // 18em
|
|
194
|
+
w-xl*m // 38em
|
|
195
|
+
|
|
196
|
+
大型容器段:
|
|
197
|
+
w-xs*l // 42em
|
|
198
|
+
w-xl*l // 82em
|
|
196
199
|
```
|
|
197
200
|
|
|
198
|
-
|
|
201
|
+
`w/h` 的 `*s/*m/*l` 是分段档位,不是乘法。4.0 起不再生成 `w-sm+` 这类宽高增量类。
|
|
202
|
+
|
|
203
|
+
**覆盖范围**: 0-82em (0-1312px @ 16px),共 45 种宽高尺寸
|
|
199
204
|
|
|
200
205
|
### 应用于各属性
|
|
201
206
|
|
|
202
207
|
| 前缀 | 属性 | 示例 | 说明 |
|
|
203
208
|
|-----|------|------|------|
|
|
204
|
-
| `n-` | padding | `n-mm` | 内边距
|
|
205
|
-
| `m-` | margin | `m-ss` | 外边距 0.
|
|
206
|
-
| `w-` | width | `w-ll` | 宽度
|
|
207
|
-
| `h-` | height | `h-sm` | 高度
|
|
208
|
-
| `r-` | border-radius | `r-ms` | 圆角
|
|
209
|
-
| `fs-` | font-size | `fs-lm` |
|
|
209
|
+
| `n-` | padding | `n-mm` | 内边距 1.5em |
|
|
210
|
+
| `m-` | margin | `m-ss` | 外边距 0.25em |
|
|
211
|
+
| `w-` | width | `w-ll` | 宽度 5em |
|
|
212
|
+
| `h-` | height | `h-sm` | 高度 1.5em |
|
|
213
|
+
| `r-` | border-radius | `r-ms` | 圆角 0.5em |
|
|
214
|
+
| `fs-` | font-size | `fs-lm` | 基础字号 1.625rem |
|
|
215
|
+
|
|
216
|
+
### 字号分段扩展
|
|
217
|
+
|
|
218
|
+
```scss
|
|
219
|
+
基础字号:
|
|
220
|
+
fs-xs // 0.625rem
|
|
221
|
+
fs-xl // 1.875rem
|
|
222
|
+
|
|
223
|
+
展示字号:
|
|
224
|
+
fs-xs*s // 2rem
|
|
225
|
+
fs-xl*s // 4.5rem
|
|
226
|
+
|
|
227
|
+
视觉字号:
|
|
228
|
+
fs-xs*m // 5rem
|
|
229
|
+
fs-xl*m // 10rem
|
|
230
|
+
|
|
231
|
+
巨型字号:
|
|
232
|
+
fs-xs*l // 11rem
|
|
233
|
+
fs-xl*l // 21rem
|
|
234
|
+
```
|
|
235
|
+
|
|
236
|
+
字号使用 `rem`,跟随根字号缩放。4.0 起不再生成 `fs-sm+` 微调和旧 `fs-sm*` 翻倍语法,`*s/*m/*l` 是展示、视觉、巨型字号分段。
|
|
237
|
+
|
|
238
|
+
### 语义与上下文字号
|
|
239
|
+
|
|
240
|
+
```scss
|
|
241
|
+
fs-case // 0.625rem
|
|
242
|
+
fs-note // 0.75rem
|
|
243
|
+
fs-desc // 0.875rem
|
|
244
|
+
fs-body // 1rem
|
|
245
|
+
fs-lead // 1.125rem
|
|
246
|
+
|
|
247
|
+
fs-root // 1rem,重置到根字号
|
|
248
|
+
fs++ // 1.125em,相对当前上下文放大
|
|
249
|
+
fs-- // 0.875em,相对当前上下文缩小
|
|
250
|
+
```
|
|
251
|
+
|
|
252
|
+
`fs++ / fs--` 是4.0保留的上下文缩放语法,不属于已删除的 `fs-{size}+` 和 `fs-{size}*`。
|
|
210
253
|
|
|
211
254
|
### 方向修饰符
|
|
212
255
|
|
|
@@ -226,7 +269,7 @@ mx-sm // margin-left + margin-right
|
|
|
226
269
|
### 特殊值
|
|
227
270
|
|
|
228
271
|
```scss
|
|
229
|
-
r-
|
|
272
|
+
r-full // border-radius: 10000em (胶囊或圆形轮廓)
|
|
230
273
|
r-no // border-radius: 0 (无圆角)
|
|
231
274
|
|
|
232
275
|
w-full // width: 100%
|
|
@@ -242,96 +285,135 @@ h-auto // height: auto
|
|
|
242
285
|
|
|
243
286
|
### 核心概念:语义化色彩
|
|
244
287
|
|
|
245
|
-
NeatUI
|
|
288
|
+
NeatUI 的色彩系统分为三层,但只封闭「角色、算子、档位、通道和状态」;
|
|
289
|
+
主题名与项目扩展颜色名保持开放:
|
|
246
290
|
|
|
247
291
|
```
|
|
248
|
-
层级 1:
|
|
249
|
-
├─ main
|
|
250
|
-
|
|
251
|
-
├─ well (成功)
|
|
252
|
-
├─ warn (警告)
|
|
253
|
-
├─ risk (危险)
|
|
254
|
-
├─ info (信息)
|
|
255
|
-
├─ text (文本)
|
|
256
|
-
└─ fore (前景)
|
|
292
|
+
层级 1: 9 个必需种子
|
|
293
|
+
├─ main, text, fore, back
|
|
294
|
+
└─ link, code, well, warn, risk
|
|
257
295
|
|
|
258
|
-
层级 2:
|
|
259
|
-
├─
|
|
260
|
-
|
|
296
|
+
层级 2: 10 个自动角色
|
|
297
|
+
├─ none, w, b
|
|
298
|
+
├─ read, desc, note, case, line, weak
|
|
299
|
+
└─ deep
|
|
261
300
|
|
|
262
|
-
层级 3:
|
|
263
|
-
├─
|
|
264
|
-
|
|
301
|
+
层级 3: 13 档派生 + 3 通道 + 3 状态
|
|
302
|
+
├─ o / w / b × xxs…xxl
|
|
303
|
+
├─ co / bg / b
|
|
304
|
+
└─ base / hover / active
|
|
265
305
|
```
|
|
266
306
|
|
|
307
|
+
`info`、`vice`、`brand` 是扩展示例,但不是必需种子。
|
|
308
|
+
`light`、`dark` 也只是最常见的主题名;项目可以按产品需要定义春节、品牌、
|
|
309
|
+
高对比度等任意主题,也可以扩展自己的颜色名称。NeatUI 约束的是颜色如何派生和使用,
|
|
310
|
+
不是把主题限制成预设名单。
|
|
311
|
+
|
|
267
312
|
### 基础色配置
|
|
268
313
|
|
|
269
314
|
```scss
|
|
270
315
|
// 在项目中配置主题
|
|
316
|
+
@use '@neatui/css' as neatui;
|
|
317
|
+
|
|
271
318
|
$theme: (
|
|
272
|
-
|
|
273
|
-
main: #00b277,
|
|
274
|
-
vice: #67ce82,
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
319
|
+
light: (
|
|
320
|
+
main: #00b277, // 品牌主色
|
|
321
|
+
vice: #67ce82, // 品牌辅助色(可自定义名称)
|
|
322
|
+
text: #000000,
|
|
323
|
+
fore: #ffffff,
|
|
324
|
+
back: #f5f5f5,
|
|
325
|
+
link: #d07950,
|
|
326
|
+
code: #e23861,
|
|
327
|
+
well: #4bbc73,
|
|
328
|
+
warn: #fb9a2a,
|
|
329
|
+
risk: #f95850,
|
|
330
|
+
info: #3c49dd,
|
|
281
331
|
),
|
|
282
|
-
|
|
283
|
-
|
|
332
|
+
dark: (
|
|
333
|
+
main: #00b277,
|
|
334
|
+
vice: #67ce82,
|
|
335
|
+
text: #ffffff,
|
|
336
|
+
fore: #1f1f1f,
|
|
337
|
+
back: #191919,
|
|
338
|
+
link: #dd7f49,
|
|
339
|
+
code: #e23861,
|
|
340
|
+
well: #4bbc73,
|
|
341
|
+
warn: #fb9a2a,
|
|
342
|
+
risk: #f95850,
|
|
343
|
+
info: #3c49dd,
|
|
284
344
|
)
|
|
285
345
|
);
|
|
346
|
+
|
|
347
|
+
@include neatui.theme($theme);
|
|
286
348
|
```
|
|
287
349
|
|
|
288
350
|
### 自动推导的语义色
|
|
289
351
|
|
|
290
352
|
```scss
|
|
291
|
-
//
|
|
292
|
-
--co-read:
|
|
293
|
-
--co-desc:
|
|
294
|
-
--co-note:
|
|
295
|
-
--co-
|
|
296
|
-
--co-
|
|
353
|
+
// mix-int(from, toward, weight) 对 RGB 通道取整
|
|
354
|
+
--co-read: mix-int(text, fore, 85%)
|
|
355
|
+
--co-desc: mix-int(text, fore, 55%)
|
|
356
|
+
--co-note: mix-int(text, fore, 35%)
|
|
357
|
+
--co-case: mix-int(text, fore, 20%)
|
|
358
|
+
--co-line: mix-int(text, fore, 10%)
|
|
359
|
+
--co-weak: mix-int(text, fore, 3.5%)
|
|
297
360
|
|
|
298
|
-
|
|
299
|
-
--co-
|
|
300
|
-
--co-
|
|
301
|
-
--co-
|
|
361
|
+
--co-none: transparent
|
|
362
|
+
--co-w: #fff
|
|
363
|
+
--co-b: #000
|
|
364
|
+
--co-deep: dynamic-deepen(back, 8%, 16%)
|
|
302
365
|
```
|
|
303
366
|
|
|
367
|
+
项目如果显式提供与自动角色同名的颜色,就以项目配置为准;其他扩展色会直接追加进
|
|
368
|
+
主题色卡。所有主题中出现过的颜色名都会合并生成对应的 class,所以不同主题可以共享
|
|
369
|
+
同一套 `co-* / bg-* / b-*` 表达。
|
|
370
|
+
|
|
304
371
|
### 颜色属性前缀
|
|
305
372
|
|
|
306
373
|
| 前缀 | 属性 | 示例 | 输出 |
|
|
307
374
|
|-----|------|------|------|
|
|
308
375
|
| `co-` | color | `co-main` | 主色文字 |
|
|
309
376
|
| `bg-` | background | `bg-risk` | 危险背景 |
|
|
310
|
-
| `
|
|
377
|
+
| `b-` | border-color | `b-line` | 线条边框 |
|
|
378
|
+
|
|
379
|
+
4.0 不再使用旧的 `bk-*`。`b-` 同时是边框样式、宽度和颜色的统一前缀:
|
|
380
|
+
`b-solid` 表示样式,`b-xs` 表示宽度,`b-line` 表示颜色;具体语义由后缀词元决定。
|
|
311
381
|
|
|
312
|
-
###
|
|
382
|
+
### 基于上例生成的颜色类
|
|
313
383
|
|
|
314
384
|
#### 品牌色
|
|
315
385
|
```scss
|
|
316
|
-
co-main, bg-main,
|
|
317
|
-
co-vice, bg-vice,
|
|
386
|
+
co-main, bg-main, b-main // 主色
|
|
387
|
+
co-vice, bg-vice, b-vice // 辅助色
|
|
318
388
|
```
|
|
319
389
|
|
|
320
390
|
#### 功能色
|
|
321
391
|
```scss
|
|
322
|
-
co-well, bg-well,
|
|
323
|
-
co-warn, bg-warn,
|
|
324
|
-
co-risk, bg-risk,
|
|
325
|
-
co-info, bg-info,
|
|
392
|
+
co-well, bg-well, b-well // 成功 ✅
|
|
393
|
+
co-warn, bg-warn, b-warn // 警告 ⚠️
|
|
394
|
+
co-risk, bg-risk, b-risk // 危险 ❌
|
|
395
|
+
co-info, bg-info, b-info // 信息 ℹ️
|
|
326
396
|
```
|
|
327
397
|
|
|
328
398
|
#### 基础色
|
|
329
399
|
```scss
|
|
330
|
-
co-text, bg-text,
|
|
331
|
-
co-fore, bg-fore,
|
|
332
|
-
co-back, bg-back,
|
|
400
|
+
co-text, bg-text, b-text // 文本色
|
|
401
|
+
co-fore, bg-fore, b-fore // 前景色
|
|
402
|
+
co-back, bg-back, b-back // 背景色
|
|
333
403
|
```
|
|
334
404
|
|
|
405
|
+
#### 绝对色
|
|
406
|
+
```scss
|
|
407
|
+
co-w, bg-w, b-w // 固定 #fff,不随主题变化
|
|
408
|
+
co-b, bg-b, b-b // 固定 #000,不随主题变化
|
|
409
|
+
```
|
|
410
|
+
|
|
411
|
+
绝对色用于颜色关系本身已经确定的场景,例如品牌色、状态色或深色图片上的纯白内容,
|
|
412
|
+
以及确定的浅色彩底上的纯黑内容。它们不能与主题语义色混用:`co-fore` 表示当前主题
|
|
413
|
+
的前景面颜色,`co-read / co-text` 表示当前主题的正文颜色,都不保证为纯白或纯黑。
|
|
414
|
+
因此有色深背景上的白字应使用 `co-w`,不能用 `co-fore`、`co-read` 或 `co-text`
|
|
415
|
+
碰巧获得接近结果。
|
|
416
|
+
|
|
335
417
|
#### 语义色
|
|
336
418
|
```scss
|
|
337
419
|
co-read // 主要文字 (85%)
|
|
@@ -340,18 +422,24 @@ co-note // 注释文字 (35%)
|
|
|
340
422
|
co-line // 分割线 (10%)
|
|
341
423
|
co-weak // 弱化背景 (3.5%)
|
|
342
424
|
|
|
343
|
-
//
|
|
344
|
-
co-
|
|
345
|
-
co-link // 反转链接
|
|
346
|
-
co-tips // 反转提示
|
|
425
|
+
co-case // 更弱一级的语义文字 (20%)
|
|
426
|
+
co-link // 主题配置的链接色
|
|
347
427
|
```
|
|
348
428
|
|
|
349
|
-
###
|
|
429
|
+
### 派生系列(13 级)
|
|
350
430
|
|
|
351
|
-
|
|
431
|
+
13 档不是等差近似,而是与 4.x Sass 运行时精确一致:
|
|
432
|
+
|
|
433
|
+
| level | xxs | xs | ss | sm | sl | ms | mm | ml | ls | lm | ll | xl | xxl |
|
|
434
|
+
|---|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|---:|
|
|
435
|
+
| weight | .035 | .05 | .10 | .15 | .25 | .35 | .45 | .55 | .65 | .75 | .85 | .90 | .95 |
|
|
436
|
+
|
|
437
|
+
`o` 使用颜色本身与 alpha;`w` 按权重向 `fore` 混合;`b` 按权重向
|
|
438
|
+
`text` 混合。
|
|
352
439
|
|
|
353
440
|
```scss
|
|
354
|
-
co-main-o-
|
|
441
|
+
co-main-o-xxs
|
|
442
|
+
co-main-o-xs
|
|
355
443
|
co-main-o-ss
|
|
356
444
|
co-main-o-sm
|
|
357
445
|
co-main-o-sl
|
|
@@ -361,56 +449,61 @@ co-main-o-ml
|
|
|
361
449
|
co-main-o-ls
|
|
362
450
|
co-main-o-lm
|
|
363
451
|
co-main-o-ll
|
|
364
|
-
co-main-o-xl
|
|
452
|
+
co-main-o-xl
|
|
453
|
+
co-main-o-xxl
|
|
365
454
|
```
|
|
366
455
|
|
|
367
|
-
### 混合色系列
|
|
368
|
-
|
|
369
456
|
```scss
|
|
370
|
-
//
|
|
371
|
-
co-main-
|
|
372
|
-
co-main-w-mm // 主色 + 前景色 20%
|
|
373
|
-
co-main-w-ml // 主色 + 前景色 30%
|
|
374
|
-
|
|
375
|
-
// 与文本色混合 (变深)
|
|
376
|
-
co-main-b-sm // 主色 + 文本色 10%
|
|
377
|
-
co-main-b-mm // 主色 + 文本色 20%
|
|
378
|
-
co-main-b-ml // 主色 + 文本色 30%
|
|
457
|
+
co-main-w-sm // main 占 15%,其余趋向 fore
|
|
458
|
+
co-main-b-sm // main 占 15%,其余趋向 text
|
|
379
459
|
```
|
|
380
460
|
|
|
461
|
+
`w / b / fore / back / desc / note / case / deep / code / link` 不生成
|
|
462
|
+
`w`、`b` 派生族。4.x 还保留一个兼容特征:`none` 不生成 `o/w/b` 变量,
|
|
463
|
+
但对应 class 选择器仍会生成。迁移和工具实现必须尊重这一历史行为。
|
|
464
|
+
|
|
381
465
|
### 边框样式
|
|
382
466
|
|
|
383
467
|
```scss
|
|
384
468
|
// 边框宽度
|
|
385
|
-
bt-xs, br-xs, bb-xs, bl-xs //
|
|
386
|
-
bt-ss, br-ss, bb-ss, bl-ss //
|
|
387
|
-
bt-sm, br-sm, bb-sm, bl-sm //
|
|
469
|
+
bt-xs, br-xs, bb-xs, bl-xs // 1px
|
|
470
|
+
bt-ss, br-ss, bb-ss, bl-ss // 2px
|
|
471
|
+
bt-sm, br-sm, bb-sm, bl-sm // 3px
|
|
388
472
|
|
|
389
473
|
// 边框样式
|
|
390
474
|
b-solid // 实线
|
|
391
475
|
b-dashed // 虚线
|
|
476
|
+
b-double // 双线
|
|
392
477
|
b-dotted // 点线
|
|
393
|
-
b-
|
|
478
|
+
b-no // 四边宽度归零
|
|
394
479
|
```
|
|
395
480
|
|
|
396
481
|
### 主题切换
|
|
397
482
|
|
|
398
483
|
```html
|
|
399
|
-
<!--
|
|
400
|
-
<html
|
|
401
|
-
<html theme="dark"> <!-- 深色主题 -->
|
|
484
|
+
<!-- 配置数组中的第一个主题直接编译到 :root,无需 theme 属性 -->
|
|
485
|
+
<html>
|
|
402
486
|
|
|
403
|
-
<!--
|
|
487
|
+
<!-- 第二个及之后的主题使用 token selector,可继续自定义名称 -->
|
|
488
|
+
<html theme="midnight">
|
|
404
489
|
```
|
|
405
490
|
|
|
491
|
+
第一个主题不会额外生成 `[theme~="<first>"]` 选择器,因为它始终作为 `:root`
|
|
492
|
+
默认值存在;第二个及之后的主题通过 `theme` 属性覆盖它。切回默认主题时,移除或改掉
|
|
493
|
+
当前主题属性即可。因此主题顺序有运行时含义,不只是配置排版。
|
|
494
|
+
|
|
495
|
+
主题系统的边界是“结构有限、内容开放”:`co / bg / b`、派生档位和交互状态保持
|
|
496
|
+
统一,主题名和项目色卡由产品自己定义。这样既能保持组件表达稳定,也不会把
|
|
497
|
+
NeatUI 限制成 light/dark 或某一组固定品牌色。
|
|
498
|
+
|
|
406
499
|
### 颜色使用示例
|
|
407
500
|
|
|
408
501
|
```html
|
|
409
502
|
<!-- 主色按钮 -->
|
|
410
|
-
<button class="bg-main co-
|
|
503
|
+
<button class="bg-main co-w">主操作</button>
|
|
411
504
|
|
|
412
505
|
<!-- 危险操作 -->
|
|
413
|
-
<button class="bg-risk co-
|
|
506
|
+
<button class="bg-risk co-w">删除</button>
|
|
414
507
|
|
|
415
508
|
<!-- 卡片 -->
|
|
416
509
|
<div class="bg-fore co-text n-mm r-sm">
|
|
@@ -420,7 +513,7 @@ b-none // 无边框
|
|
|
420
513
|
</div>
|
|
421
514
|
|
|
422
515
|
<!-- 分割线 -->
|
|
423
|
-
<div class="bt-xs
|
|
516
|
+
<div class="bt-xs b-line"></div>
|
|
424
517
|
|
|
425
518
|
<!-- Hover 透明度 -->
|
|
426
519
|
<a class="co-main co-main-o-lm:hover">链接</a>
|
|
@@ -434,11 +527,11 @@ b-none // 无边框
|
|
|
434
527
|
|
|
435
528
|
#### 核心理念
|
|
436
529
|
|
|
437
|
-
|
|
530
|
+
`ui-flex` 用空间坐标 token 描述位置,再由兼容 CSS 编译为 flex 布局。
|
|
438
531
|
|
|
439
532
|
```
|
|
440
|
-
|
|
441
|
-
|
|
533
|
+
属性表达: display: flex + justify-content + align-items
|
|
534
|
+
坐标表达: ui-flex="横向 纵向"
|
|
442
535
|
```
|
|
443
536
|
|
|
444
537
|
#### 坐标系规则
|
|
@@ -508,17 +601,17 @@ y: 纵向对齐
|
|
|
508
601
|
</div>
|
|
509
602
|
```
|
|
510
603
|
|
|
511
|
-
####
|
|
604
|
+
#### 同一意图的两种表达
|
|
512
605
|
|
|
513
606
|
**场景 1: 导航栏**
|
|
514
607
|
```html
|
|
515
|
-
<!--
|
|
608
|
+
<!-- 属性导向的 utility 表达 -->
|
|
516
609
|
<nav class="flex justify-between items-center px-4 py-2">
|
|
517
610
|
<div>Logo</div>
|
|
518
611
|
<div>Menu</div>
|
|
519
612
|
</nav>
|
|
520
613
|
|
|
521
|
-
<!-- NeatUI
|
|
614
|
+
<!-- NeatUI 坐标 token -->
|
|
522
615
|
<nav ui-flex="row xm" class="nx-sm ny-sm">
|
|
523
616
|
<div>Logo</div>
|
|
524
617
|
<div>Menu</div>
|
|
@@ -527,7 +620,7 @@ y: 纵向对齐
|
|
|
527
620
|
|
|
528
621
|
**场景 2: 居中对话框**
|
|
529
622
|
```html
|
|
530
|
-
<!--
|
|
623
|
+
<!-- 属性导向的 utility 表达 -->
|
|
531
624
|
<div class="flex justify-center items-center min-h-screen">
|
|
532
625
|
<div class="bg-white p-6">内容</div>
|
|
533
626
|
</div>
|
|
@@ -540,7 +633,7 @@ y: 纵向对齐
|
|
|
540
633
|
|
|
541
634
|
**场景 3: 卡片布局**
|
|
542
635
|
```html
|
|
543
|
-
<!--
|
|
636
|
+
<!-- 属性导向的 utility 表达 -->
|
|
544
637
|
<div class="flex flex-col items-center p-4">
|
|
545
638
|
<img class="w-16 h-16 rounded-full" />
|
|
546
639
|
<h3 class="mt-2">标题</h3>
|
|
@@ -613,6 +706,49 @@ gap: 间距等级 (ss, sm, mm, ml, ll...)
|
|
|
613
706
|
|
|
614
707
|
---
|
|
615
708
|
|
|
709
|
+
## 媒体内容
|
|
710
|
+
|
|
711
|
+
### `ui-cover`:固定比例封面
|
|
712
|
+
|
|
713
|
+
`ui-cover` 把容器设为相对定位的比例盒,并让直接子元素绝对铺满。图片默认使用
|
|
714
|
+
`object-fit: cover`:
|
|
715
|
+
|
|
716
|
+
```html
|
|
717
|
+
<!-- 16:9 裁切填充 -->
|
|
718
|
+
<figure ui-cover="16:9">
|
|
719
|
+
<img src="/cover.jpg" alt="文章封面" />
|
|
720
|
+
</figure>
|
|
721
|
+
|
|
722
|
+
<!-- 3:2 比例,但完整显示图片 -->
|
|
723
|
+
<figure ui-cover="3:2 contain">
|
|
724
|
+
<img src="/product.png" alt="商品" />
|
|
725
|
+
</figure>
|
|
726
|
+
```
|
|
727
|
+
|
|
728
|
+
固定比例只能从以下 13 个值选择:
|
|
729
|
+
|
|
730
|
+
```text
|
|
731
|
+
1:1, 2:1, 1:2, 4:3, 3:4, 3:2, 2:3,
|
|
732
|
+
16:9, 9:16, 16:10, 10:16, 2.39:1, 1:2.39
|
|
733
|
+
```
|
|
734
|
+
|
|
735
|
+
也可以用 `+no..+xl` 或 `-no..-xl` 从默认的 `100%` 高度按 5% 递增或递减。
|
|
736
|
+
比例和偏移是同一个“高度模式”,一次只能选择一个;`cover / contain` 可以再与它
|
|
737
|
+
组合。该语法不接受任意比例、任意百分比或响应式前缀。
|
|
738
|
+
|
|
739
|
+
### `ui-omit`:1–9 行省略
|
|
740
|
+
|
|
741
|
+
```html
|
|
742
|
+
<p ui-omit="1">单行标题,超出后显示省略号</p>
|
|
743
|
+
<p ui-omit="3">最多显示三行的简介,超出后截断。</p>
|
|
744
|
+
```
|
|
745
|
+
|
|
746
|
+
`ui-omit` 一次只接受 `1..9` 中的一个值:`1` 使用单行 `nowrap`,`2..9`
|
|
747
|
+
使用 `-webkit-line-clamp`。不要只写裸 `ui-omit`,因为历史结构规则会进入多行模式,
|
|
748
|
+
但没有行数值可供 `--line` 使用。该语法同样没有响应式前缀。
|
|
749
|
+
|
|
750
|
+
---
|
|
751
|
+
|
|
616
752
|
## 响应式系统
|
|
617
753
|
|
|
618
754
|
### 9 档精细断点
|
|
@@ -636,57 +772,130 @@ dpc-m: 1440px // 中桌面 (主流显示器)
|
|
|
636
772
|
dpc-l: 1600px // 大桌面 (2K 显示器)
|
|
637
773
|
```
|
|
638
774
|
|
|
775
|
+
### 24 栅格:`ui-row` 与 `ui-col`
|
|
776
|
+
|
|
777
|
+
栅格只接受 `<breakpoint>-<span>`,其中 `span` 是 `0..24`。它有两种 selector
|
|
778
|
+
目标:
|
|
779
|
+
|
|
780
|
+
```html
|
|
781
|
+
<!-- row 宽度作用于每个直接子元素 -->
|
|
782
|
+
<div ui-row="space mob-24 pad-12 dpc-8">
|
|
783
|
+
<section>第一列</section>
|
|
784
|
+
<section>第二列</section>
|
|
785
|
+
</div>
|
|
786
|
+
|
|
787
|
+
<!-- col 宽度作用于 [ui-row] 内带 ui-col 的后代,可逐列不同 -->
|
|
788
|
+
<div ui-row="space">
|
|
789
|
+
<main ui-col="mob-24 pad-16 dpc-18">主体</main>
|
|
790
|
+
<aside ui-col="mob-24 pad-8 dpc-6">侧栏</aside>
|
|
791
|
+
</div>
|
|
792
|
+
```
|
|
793
|
+
|
|
794
|
+
公开 breakpoint 共十二个:
|
|
795
|
+
|
|
796
|
+
```text
|
|
797
|
+
mob, mob-s, mob-m, mob-l
|
|
798
|
+
pad, pad-s, pad-m, pad-l
|
|
799
|
+
dpc, dpc-s, dpc-m, dpc-l
|
|
800
|
+
```
|
|
801
|
+
|
|
802
|
+
栅格沿用当前 `cols.scss` 的实际 source order:`mob` 与 `mob-s` 都是基础层;
|
|
803
|
+
`mob-m / mob-l / pad(-s) / pad-m / pad-l / dpc(-s) / dpc-m / dpc-l`
|
|
804
|
+
依次从 480 / 640 / 800 / 960 / 1120 / 1280 / 1440 / 1600px 起覆盖。
|
|
805
|
+
这里的 `mob-s` 与上面的命名断点表不同,它在现有栅格 CSS 中没有 320px media
|
|
806
|
+
包裹。这是 4.x 当前输出的兼容行为,使用和迁移时不要把它误当成独立媒体区间。
|
|
807
|
+
|
|
808
|
+
百分比由 24 栏公式向下截断到 5 位小数:
|
|
809
|
+
|
|
810
|
+
| Span | 宽度 |
|
|
811
|
+
| ---: | ---: |
|
|
812
|
+
| `0` | `0` |
|
|
813
|
+
| `1` | `4.16666%` |
|
|
814
|
+
| `6` | `25%` |
|
|
815
|
+
| `12` | `50%` |
|
|
816
|
+
| `18` | `75%` |
|
|
817
|
+
| `24` | `100%` |
|
|
818
|
+
|
|
819
|
+
行行为也属于有限语法:
|
|
820
|
+
|
|
821
|
+
- `space`:行负 margin 与子元素 padding 成对出现,799px 以下从 1rem 缩为 .5rem;
|
|
822
|
+
- `:full`:设置 `> * > *` 的高度为 100%;
|
|
823
|
+
- `inline` / `reverse`:切换 inline-flex 或无条件 row-reverse;
|
|
824
|
+
- `mob-auto / pad-auto / dpc-auto`:三个历史名称都只属于 `ui-row`,实际均无媒体条件;
|
|
825
|
+
- `mob:reverse / pad:reverse / dpc:reverse`:分别只在
|
|
826
|
+
0–799 / 800–1279 / 1280px 以上生效。
|
|
827
|
+
|
|
828
|
+
表格兼容仍为 `tr[ui-row] { display: table-row }` 与
|
|
829
|
+
`td/th[ui-col] { display: table-cell }`。`mob-auto` 只属于 `ui-row`;栅格跨度使用
|
|
830
|
+
`0..24`,自定义像素布局不属于这套栅格语法。
|
|
831
|
+
|
|
639
832
|
### 三种操作符
|
|
640
833
|
|
|
641
|
-
|
|
834
|
+
`ui-hide` 的 `>`、`<`、`=` 比较的是命名档位或完整设备段,不接收任意像素值。
|
|
835
|
+
所有 selector 都使用 `[ui-hide~="<token>"]`,因此多个隐藏条件可以用空格组合。
|
|
836
|
+
|
|
837
|
+
#### 1. `>` 高于命名范围
|
|
642
838
|
|
|
643
839
|
```html
|
|
644
|
-
<!--
|
|
645
|
-
<div
|
|
840
|
+
<!-- 高于 pad 设备段后隐藏,即从 1280px 起隐藏 -->
|
|
841
|
+
<div ui-hide=">pad">仅手机和平板显示</div>
|
|
646
842
|
|
|
647
|
-
<!--
|
|
648
|
-
<div ui-hide=">dpc"
|
|
843
|
+
<!-- 高于 dpc-m 档后隐藏,即从 dpc-l 的 1600px 起隐藏 -->
|
|
844
|
+
<div ui-hide=">dpc-m">1600px 以下显示</div>
|
|
649
845
|
```
|
|
650
846
|
|
|
651
|
-
|
|
847
|
+
`>dpc-l` 是最高档之后的兼容空端点,当前不会产生隐藏效果。
|
|
848
|
+
|
|
849
|
+
#### 2. `<` 低于命名范围
|
|
652
850
|
|
|
653
851
|
```html
|
|
654
|
-
<!--
|
|
852
|
+
<!-- 低于 dpc 设备段隐藏,即到 1279px 为止隐藏 -->
|
|
655
853
|
<div ui-hide="<dpc">桌面专属</div>
|
|
656
854
|
|
|
657
|
-
<!--
|
|
658
|
-
<div
|
|
855
|
+
<!-- 低于 mob-m 档隐藏,即到 479px 为止隐藏 -->
|
|
856
|
+
<div ui-hide="<mob-m">480px 起显示</div>
|
|
659
857
|
```
|
|
660
858
|
|
|
661
|
-
|
|
859
|
+
`<mob-s` 是最低档之前的兼容空端点,当前不会产生隐藏效果。
|
|
860
|
+
|
|
861
|
+
#### 3. `=` 命名区间
|
|
662
862
|
|
|
663
863
|
```html
|
|
664
|
-
<!--
|
|
864
|
+
<!-- 仅在中平板区间隐藏(960px–1119px) -->
|
|
665
865
|
<div ui-hide="=pad-m">仅中平板隐藏</div>
|
|
866
|
+
|
|
867
|
+
<!-- 整个移动设备段隐藏(最大 799px) -->
|
|
868
|
+
<div ui-hide="=mob">平板和桌面内容</div>
|
|
666
869
|
```
|
|
667
870
|
|
|
668
|
-
###
|
|
871
|
+
### 内置 `ui-hide` 值
|
|
669
872
|
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
mob
|
|
673
|
-
|
|
674
|
-
dpc
|
|
873
|
+
| 关系 | 九档细分值 | 设备段别名 |
|
|
874
|
+
| --- | --- | --- |
|
|
875
|
+
| `>` | `>mob-s` … `>dpc-l` | `>mob`、`>pad` |
|
|
876
|
+
| `<` | `<mob-s` … `<dpc-l` | `<pad`、`<dpc` |
|
|
877
|
+
| `=` | `=mob-s` … `=dpc-l` | `=mob`、`=pad`、`=dpc` |
|
|
878
|
+
|
|
879
|
+
除两个兼容空端点外,命中的规则都使用 `display: none !important`。
|
|
675
880
|
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
881
|
+
### 响应式 class 前缀
|
|
882
|
+
|
|
883
|
+
组件级 class 使用 `base → pad → mob` 三层覆盖;`pad:` 在最大 1279px 生效,
|
|
884
|
+
`mob:` 在最大 799px 生效。这里没有通用 `dpc:` class 前缀:
|
|
885
|
+
|
|
886
|
+
```html
|
|
887
|
+
<h1 class="fs-xl pad:fs-ml mob:fs-mm">响应式标题</h1>
|
|
888
|
+
<div class="w-xl pad:w-mm mob:w-full">响应式容器</div>
|
|
680
889
|
```
|
|
681
890
|
|
|
682
891
|
### ui-hide:显示/隐藏控制
|
|
683
892
|
|
|
684
893
|
```html
|
|
685
894
|
<!-- 移动端隐藏 -->
|
|
686
|
-
<div ui-hide="mob">桌面内容</div>
|
|
895
|
+
<div ui-hide="=mob">桌面内容</div>
|
|
687
896
|
|
|
688
897
|
<!-- 桌面隐藏 -->
|
|
689
|
-
<div ui-hide="dpc"
|
|
898
|
+
<div ui-hide="=dpc">移动和平板内容</div>
|
|
690
899
|
|
|
691
900
|
<!-- 小于平板隐藏 -->
|
|
692
901
|
<div ui-hide="<pad">平板以上显示</div>
|
|
@@ -696,9 +905,16 @@ dpc:fs-lm // 桌面字号大
|
|
|
696
905
|
|
|
697
906
|
<!-- 精确区间隐藏 -->
|
|
698
907
|
<div ui-hide="=pad-m">仅在中平板隐藏</div>
|
|
908
|
+
|
|
909
|
+
<!-- 多个条件组成隐藏区间的并集 -->
|
|
910
|
+
<div ui-hide="=mob =dpc-l">仅平板和较小桌面显示</div>
|
|
699
911
|
```
|
|
700
912
|
|
|
701
|
-
|
|
913
|
+
`ui-hide` 只改变 CSS 可见性,不会卸载 Vue 组件,也不会停止请求、事件监听或定时器,
|
|
914
|
+
不会自动迁移焦点和业务状态。需要停止副作用或销毁子树时,应使用 Vue 条件渲染并显式
|
|
915
|
+
处理状态与焦点,而不是把 `ui-hide` 当作生命周期控制。
|
|
916
|
+
|
|
917
|
+
### 全局字号响应
|
|
702
918
|
|
|
703
919
|
```html
|
|
704
920
|
<!-- 在 <html> 标签设置全局字号 -->
|
|
@@ -707,8 +923,7 @@ dpc:fs-lm // 桌面字号大
|
|
|
707
923
|
<html size="l"> <!-- 大字号模式 -->
|
|
708
924
|
<html size="xl"> <!-- 超大字号模式 (老年模式) -->
|
|
709
925
|
|
|
710
|
-
<!--
|
|
711
|
-
<!-- 0 行 CSS,0 个媒体查询,全站响应! -->
|
|
926
|
+
<!-- 使用 em 且继承根字号的属性会随之缩放 -->
|
|
712
927
|
```
|
|
713
928
|
|
|
714
929
|
**实战用例:老年人模式**
|
|
@@ -727,7 +942,7 @@ function toggleElderlyMode() {
|
|
|
727
942
|
切换大字模式
|
|
728
943
|
</button>
|
|
729
944
|
|
|
730
|
-
<!--
|
|
945
|
+
<!-- 已采用相对字号的内容随根字号变化 -->
|
|
731
946
|
</html>
|
|
732
947
|
</template>
|
|
733
948
|
```
|
|
@@ -855,7 +1070,7 @@ ui-btn="[@{flag}] {color} {size} [:{modifier}]"
|
|
|
855
1070
|
|
|
856
1071
|
---
|
|
857
1072
|
|
|
858
|
-
##
|
|
1073
|
+
## 常用 API 参考
|
|
859
1074
|
|
|
860
1075
|
### 间距类 (Spacing)
|
|
861
1076
|
|
|
@@ -864,17 +1079,17 @@ ui-btn="[@{flag}] {color} {size} [:{modifier}]"
|
|
|
864
1079
|
| 类名 | 属性 | 值 |
|
|
865
1080
|
|-----|------|------|
|
|
866
1081
|
| `n-no` | padding | 0 |
|
|
867
|
-
| `n-xs` | padding |
|
|
868
|
-
| `n-ss` | padding | 0.
|
|
869
|
-
| `n-sm` | padding |
|
|
870
|
-
| `n-sl` | padding |
|
|
871
|
-
| `n-ms` | padding |
|
|
872
|
-
| `n-mm` | padding |
|
|
873
|
-
| `n-ml` | padding |
|
|
874
|
-
| `n-ls` | padding |
|
|
875
|
-
| `n-lm` | padding |
|
|
876
|
-
| `n-ll` | padding |
|
|
877
|
-
| `n-xl` | padding |
|
|
1082
|
+
| `n-xs` | padding | 1px |
|
|
1083
|
+
| `n-ss` | padding | 0.25em |
|
|
1084
|
+
| `n-sm` | padding | 0.5em |
|
|
1085
|
+
| `n-sl` | padding | 0.75em |
|
|
1086
|
+
| `n-ms` | padding | 1em |
|
|
1087
|
+
| `n-mm` | padding | 1.5em |
|
|
1088
|
+
| `n-ml` | padding | 2em |
|
|
1089
|
+
| `n-ls` | padding | 2.5em |
|
|
1090
|
+
| `n-lm` | padding | 3em |
|
|
1091
|
+
| `n-ll` | padding | 4em |
|
|
1092
|
+
| `n-xl` | padding | 5em |
|
|
878
1093
|
|
|
879
1094
|
#### 方向 Padding
|
|
880
1095
|
|
|
@@ -898,21 +1113,41 @@ mr-{size} // margin-right
|
|
|
898
1113
|
mb-{size} // margin-bottom
|
|
899
1114
|
ml-{size} // margin-left
|
|
900
1115
|
|
|
901
|
-
//
|
|
902
|
-
|
|
903
|
-
mx-
|
|
904
|
-
my-auto // margin-top/bottom: auto
|
|
1116
|
+
// 作用层级
|
|
1117
|
+
mx-{size}-sub // 为直系子元素设置左右 margin,并归零首/末项外边界
|
|
1118
|
+
mx-{size}-sun // 为孙级元素设置左右 margin,并归零每组首/末项外边界
|
|
905
1119
|
```
|
|
906
1120
|
|
|
907
1121
|
#### 负 Margin
|
|
908
1122
|
|
|
909
1123
|
```scss
|
|
910
|
-
mx-sm
|
|
911
|
-
my-sm
|
|
912
|
-
mt-sm
|
|
913
|
-
//
|
|
1124
|
+
-mx-sm // margin-left/right: -0.5em
|
|
1125
|
+
-my-sm // margin-top/bottom: -0.5em
|
|
1126
|
+
-mt-sm // margin-top: -0.5em
|
|
1127
|
+
// 负 margin 使用前导负号,不使用 -sub / -sun 后缀
|
|
914
1128
|
```
|
|
915
1129
|
|
|
1130
|
+
`n / m / -m` 共用
|
|
1131
|
+
`no / xs / ss / sm / sl / ms / mm / ml / ls / lm / ll / xl` 12 档;除负 margin
|
|
1132
|
+
外,`-sub` 作用于直系子元素、`-sun` 作用于孙级元素。所有基础 class 都支持
|
|
1133
|
+
`pad:`(最大 1279px)和 `mob:`(最大 799px),级联顺序为
|
|
1134
|
+
`base → pad → mob`。
|
|
1135
|
+
|
|
1136
|
+
Padding 的 `*-sub` 在 `[ui-row]` 容器上还会生成等量负 margin 补偿,让栅格子项的
|
|
1137
|
+
内边距不会扩大容器的外边界。
|
|
1138
|
+
|
|
1139
|
+
#### Grid gap
|
|
1140
|
+
|
|
1141
|
+
```html
|
|
1142
|
+
<div ui-grid="4 sm">...</div>
|
|
1143
|
+
<div ui-grid="2 mob:sm pad:6 pad:mm dpc:12">...</div>
|
|
1144
|
+
```
|
|
1145
|
+
|
|
1146
|
+
`ui-grid` 的 `no..xl` 设置 `--gap`,刻度为
|
|
1147
|
+
`0 / 1px / .25em / .5em / .75em / 1em / 1.5em / 2em / 2.5em / 3em / 4em / 5em`。
|
|
1148
|
+
同一属性还可以组合 `1..12` 列数和 `block`。4.x 的 `mob:` 是无媒体条件的历史别名;
|
|
1149
|
+
`pad:` 从 800px、`dpc:` 从 1280px 生效。
|
|
1150
|
+
|
|
916
1151
|
### 尺寸类 (Sizing)
|
|
917
1152
|
|
|
918
1153
|
#### Width
|
|
@@ -920,13 +1155,12 @@ mt-sm-sub // margin-top: -1em
|
|
|
920
1155
|
```scss
|
|
921
1156
|
w-no // 0
|
|
922
1157
|
w-xs // 0.5em
|
|
923
|
-
w-ss ~ w-xl //
|
|
1158
|
+
w-ss ~ w-xl // 1em ~ 5.5em
|
|
924
1159
|
|
|
925
|
-
//
|
|
926
|
-
w-ll
|
|
927
|
-
w-ll*
|
|
928
|
-
w-ll*
|
|
929
|
-
w-ll*l // 24em (4倍)
|
|
1160
|
+
// 分段扩展
|
|
1161
|
+
w-ll*s // 15em
|
|
1162
|
+
w-ll*m // 36em
|
|
1163
|
+
w-ll*l // 78em
|
|
930
1164
|
|
|
931
1165
|
// 特殊值
|
|
932
1166
|
w-full // 100%
|
|
@@ -947,24 +1181,32 @@ h-screen // 100vh
|
|
|
947
1181
|
|
|
948
1182
|
```scss
|
|
949
1183
|
r-no // border-radius: 0
|
|
950
|
-
r-xs // 0.
|
|
951
|
-
r-ss ~ r-xl // 0.
|
|
952
|
-
r-
|
|
1184
|
+
r-xs // 0.1em
|
|
1185
|
+
r-ss ~ r-xl // 0.2em ~ 1.2em
|
|
1186
|
+
r-full // 10000em(胶囊或圆形轮廓)
|
|
953
1187
|
|
|
954
1188
|
// 方向圆角
|
|
955
|
-
|
|
956
|
-
|
|
957
|
-
|
|
958
|
-
|
|
1189
|
+
r-t-{size} // 上方两角
|
|
1190
|
+
r-b-{size} // 下方两角
|
|
1191
|
+
r-lt-{size} // 左上
|
|
1192
|
+
r-rt-{size} // 右上
|
|
1193
|
+
r-lb-{size} // 左下
|
|
1194
|
+
r-rb-{size} // 右下
|
|
959
1195
|
```
|
|
960
1196
|
|
|
1197
|
+
`size` 为 `no / xs / ss / sm / sl / ms / mm / ml / ls / lm / ll / xl`,
|
|
1198
|
+
以上圆角类同时支持 `pad:` 与 `mob:` 响应式前缀。
|
|
1199
|
+
|
|
961
1200
|
### 字体类 (Typography)
|
|
962
1201
|
|
|
963
1202
|
```scss
|
|
964
1203
|
// 字号
|
|
965
1204
|
fs-no // 0
|
|
966
|
-
fs-xs // 0.
|
|
967
|
-
fs-ss ~ fs-xl // 0.
|
|
1205
|
+
fs-xs // 0.625rem
|
|
1206
|
+
fs-ss ~ fs-xl // 0.75rem ~ 1.875rem
|
|
1207
|
+
fs-xs*s ~ fs-xl*s // 2rem ~ 4.5rem
|
|
1208
|
+
fs-xs*m ~ fs-xl*m // 5rem ~ 10rem
|
|
1209
|
+
fs-xs*l ~ fs-xl*l // 11rem ~ 21rem
|
|
968
1210
|
|
|
969
1211
|
// 字重
|
|
970
1212
|
thin // font-weight: 100
|
|
@@ -990,19 +1232,20 @@ ls-xs ~ ls-xl // letter-spacing
|
|
|
990
1232
|
|
|
991
1233
|
```scss
|
|
992
1234
|
// 宽度
|
|
993
|
-
bt-xs, br-xs, bb-xs, bl-xs //
|
|
994
|
-
bt-ss, br-ss, bb-ss, bl-ss //
|
|
995
|
-
bt-sm, br-sm, bb-sm, bl-sm //
|
|
1235
|
+
bt-xs, br-xs, bb-xs, bl-xs // 1px
|
|
1236
|
+
bt-ss, br-ss, bb-ss, bl-ss // 2px
|
|
1237
|
+
bt-sm, br-sm, bb-sm, bl-sm // 3px
|
|
996
1238
|
|
|
997
1239
|
// 样式
|
|
998
1240
|
b-solid
|
|
999
1241
|
b-dashed
|
|
1242
|
+
b-double
|
|
1000
1243
|
b-dotted
|
|
1001
|
-
b-
|
|
1244
|
+
b-no
|
|
1002
1245
|
|
|
1003
1246
|
// 边框颜色
|
|
1004
|
-
|
|
1005
|
-
|
|
1247
|
+
b-main, b-vice, b-risk...
|
|
1248
|
+
b-line, b-weak
|
|
1006
1249
|
```
|
|
1007
1250
|
|
|
1008
1251
|
### 定位类 (Position)
|
|
@@ -1077,6 +1320,10 @@ overflow-x-hidden
|
|
|
1077
1320
|
overflow-y-hidden
|
|
1078
1321
|
```
|
|
1079
1322
|
|
|
1323
|
+
滚动系统同时保留 `.ui-scroll` 等 class 写法;`ui-scroll` attribute 提供
|
|
1324
|
+
`stable`、五档 scrollbar 尺寸以及 x/y auto、hidden、unset。800px 以上的尺寸覆盖
|
|
1325
|
+
只作用于 attribute 形式。
|
|
1326
|
+
|
|
1080
1327
|
### 光标类 (Cursor)
|
|
1081
1328
|
|
|
1082
1329
|
```scss
|
|
@@ -1089,13 +1336,27 @@ cursor-move
|
|
|
1089
1336
|
|
|
1090
1337
|
### 交互类 (Interaction)
|
|
1091
1338
|
|
|
1092
|
-
```
|
|
1093
|
-
|
|
1094
|
-
|
|
1095
|
-
|
|
1096
|
-
user-select-text
|
|
1339
|
+
```html
|
|
1340
|
+
<button class="ux-hover ux-scale">悬停反馈 + 按下缩放</button>
|
|
1341
|
+
<button class="ux-disable">视觉与指针禁用</button>
|
|
1342
|
+
<span ui-hover=":underline">下划线提示</span>
|
|
1097
1343
|
```
|
|
1098
1344
|
|
|
1345
|
+
常用交互 class 包括:
|
|
1346
|
+
|
|
1347
|
+
- `ux-none / ux-none-sub`:pointer 光标并禁止文本选择;
|
|
1348
|
+
- `ux-hover[-sub] / ux-shadow[-sub]`:自身或直接子元素的 hover 反馈;
|
|
1349
|
+
- `ux-click[-sub] / hover-underline / ui-hover=":underline"`:始终显示
|
|
1350
|
+
pointer 与下划线,不会绑定 click 或 hover 事件;
|
|
1351
|
+
- `ux-scale`:`:active` 时缩放到 `.95`;
|
|
1352
|
+
- `parent-hover:show / parent-hover:hide`:父级 hover 时只改变
|
|
1353
|
+
opacity 与 pointer-events,DOM 节点始终保留;
|
|
1354
|
+
- `ev-none|auto[-sub|-sun]`:以 `!important` 控制 self、直接子级或孙级的
|
|
1355
|
+
pointer-events。
|
|
1356
|
+
|
|
1357
|
+
`ux-disable` 会阻止指针事件并降低透明度,但不会自动写入原生 `disabled`;表单组件仍应
|
|
1358
|
+
通过自身 API 管理真实禁用状态。以上交互值不使用 `pad:` / `mob:` 响应式前缀。
|
|
1359
|
+
|
|
1099
1360
|
---
|
|
1100
1361
|
|
|
1101
1362
|
## 最佳实践
|
|
@@ -1107,7 +1368,7 @@ user-select-text
|
|
|
1107
1368
|
<div style="padding: 13px; width: 237px;">
|
|
1108
1369
|
|
|
1109
1370
|
<!-- ✅ 正确:使用规范尺寸 -->
|
|
1110
|
-
<div class="n-sm w-
|
|
1371
|
+
<div class="n-sm w-sm*m">
|
|
1111
1372
|
|
|
1112
1373
|
<!-- 如果确实需要特殊值,手写并注释 -->
|
|
1113
1374
|
<div class="third-party" style="width: 237px">
|
|
@@ -1122,7 +1383,7 @@ user-select-text
|
|
|
1122
1383
|
<button style="background: #00b277; color: white;">
|
|
1123
1384
|
|
|
1124
1385
|
<!-- ✅ 正确:使用语义色 -->
|
|
1125
|
-
<button class="bg-main co-
|
|
1386
|
+
<button class="bg-main co-w">
|
|
1126
1387
|
|
|
1127
1388
|
<!-- ❌ 错误:使用通用灰色 -->
|
|
1128
1389
|
<p class="text-gray-600">
|
|
@@ -1172,13 +1433,13 @@ user-select-text
|
|
|
1172
1433
|
</Card>
|
|
1173
1434
|
```
|
|
1174
1435
|
|
|
1175
|
-
### 6.
|
|
1436
|
+
### 6. 基于主题属性切换深色模式
|
|
1176
1437
|
|
|
1177
1438
|
```html
|
|
1178
|
-
<!--
|
|
1439
|
+
<!-- 切换已配置的 theme 属性 -->
|
|
1179
1440
|
<html :theme="isDark ? 'dark' : 'light'">
|
|
1180
1441
|
|
|
1181
|
-
<!--
|
|
1442
|
+
<!-- 使用语义色 token 的元素读取对应主题变量 -->
|
|
1182
1443
|
<div class="bg-fore co-text">
|
|
1183
1444
|
<h1 class="co-main">自动适配</h1>
|
|
1184
1445
|
</div>
|
|
@@ -1200,7 +1461,7 @@ user-select-text
|
|
|
1200
1461
|
<label class="co-desc fs-sm">邮箱</label>
|
|
1201
1462
|
<input
|
|
1202
1463
|
type="email"
|
|
1203
|
-
class="w-full n-sm r-sm bg-weak
|
|
1464
|
+
class="w-full n-sm r-sm bg-weak b-line bt-xs"
|
|
1204
1465
|
/>
|
|
1205
1466
|
</div>
|
|
1206
1467
|
|
|
@@ -1208,7 +1469,7 @@ user-select-text
|
|
|
1208
1469
|
<label class="co-desc fs-sm">密码</label>
|
|
1209
1470
|
<input
|
|
1210
1471
|
type="password"
|
|
1211
|
-
class="w-full n-sm r-sm bg-weak
|
|
1472
|
+
class="w-full n-sm r-sm bg-weak b-line bt-xs"
|
|
1212
1473
|
/>
|
|
1213
1474
|
</div>
|
|
1214
1475
|
|
|
@@ -1297,7 +1558,7 @@ user-select-text
|
|
|
1297
1558
|
>
|
|
1298
1559
|
<div class="w-ll*s bg-fore r-ml shadow-ll">
|
|
1299
1560
|
<!-- 头部 -->
|
|
1300
|
-
<div class="n-mm bb-xs
|
|
1561
|
+
<div class="n-mm bb-xs b-line" ui-flex="row xm">
|
|
1301
1562
|
<h3 class="fs-lm bold co-main">标题</h3>
|
|
1302
1563
|
<button ui-btn="none s" @click="closeDialog">
|
|
1303
1564
|
<i class="icon-close"></i>
|
|
@@ -1310,7 +1571,7 @@ user-select-text
|
|
|
1310
1571
|
</div>
|
|
1311
1572
|
|
|
1312
1573
|
<!-- 底部 -->
|
|
1313
|
-
<div class="n-mm bt-xs
|
|
1574
|
+
<div class="n-mm bt-xs b-line" ui-flex="row rm">
|
|
1314
1575
|
<button ui-btn="none :border" class="mr-sm" @click="closeDialog">
|
|
1315
1576
|
取消
|
|
1316
1577
|
</button>
|
|
@@ -1327,7 +1588,7 @@ user-select-text
|
|
|
1327
1588
|
```html
|
|
1328
1589
|
<div class="bg-fore r-sm shadow-sm">
|
|
1329
1590
|
<table class="w-full">
|
|
1330
|
-
<thead class="bb-xs
|
|
1591
|
+
<thead class="bb-xs b-line">
|
|
1331
1592
|
<tr>
|
|
1332
1593
|
<th class="n-mm text-left co-desc bold">姓名</th>
|
|
1333
1594
|
<th class="n-mm text-left co-desc bold">邮箱</th>
|
|
@@ -1339,7 +1600,7 @@ user-select-text
|
|
|
1339
1600
|
<tr
|
|
1340
1601
|
v-for="user in users"
|
|
1341
1602
|
:key="user.id"
|
|
1342
|
-
class="bb-xs
|
|
1603
|
+
class="bb-xs b-line"
|
|
1343
1604
|
>
|
|
1344
1605
|
<td class="n-mm co-text">{{ user.name }}</td>
|
|
1345
1606
|
<td class="n-mm co-desc">{{ user.email }}</td>
|
|
@@ -1366,15 +1627,24 @@ user-select-text
|
|
|
1366
1627
|
|
|
1367
1628
|
```scss
|
|
1368
1629
|
// 在 SCSS 中配置
|
|
1369
|
-
@use '@neatui/css'
|
|
1370
|
-
|
|
1371
|
-
|
|
1372
|
-
|
|
1373
|
-
|
|
1374
|
-
|
|
1375
|
-
|
|
1376
|
-
|
|
1630
|
+
@use '@neatui/css' as neatui;
|
|
1631
|
+
|
|
1632
|
+
$theme: (
|
|
1633
|
+
light: (
|
|
1634
|
+
main: #00b277,
|
|
1635
|
+
text: #000000,
|
|
1636
|
+
fore: #ffffff,
|
|
1637
|
+
back: #f5f5f5,
|
|
1638
|
+
link: #d07950,
|
|
1639
|
+
code: #e23861,
|
|
1640
|
+
well: #4bbc73,
|
|
1641
|
+
warn: #fb9a2a,
|
|
1642
|
+
risk: #f95850,
|
|
1643
|
+
brand: #673ab7, // 扩展色名称可以自定义
|
|
1644
|
+
),
|
|
1377
1645
|
);
|
|
1646
|
+
|
|
1647
|
+
@include neatui.theme($theme);
|
|
1378
1648
|
```
|
|
1379
1649
|
|
|
1380
1650
|
### 2. 使用 SCSS Mixin
|
|
@@ -1408,7 +1678,7 @@ user-select-text
|
|
|
1408
1678
|
<button class="bg-main bg-main-b-sm:active">按钮</button>
|
|
1409
1679
|
|
|
1410
1680
|
<!-- Focus -->
|
|
1411
|
-
<input class="
|
|
1681
|
+
<input class="b-line b-main:focus" />
|
|
1412
1682
|
|
|
1413
1683
|
<!-- Disabled -->
|
|
1414
1684
|
<button class="bg-weak:disabled" disabled>禁用</button>
|
|
@@ -1438,25 +1708,24 @@ const descClass = 'co-desc fs-sm my-ss'
|
|
|
1438
1708
|
|
|
1439
1709
|
### NeatUI 核心价值
|
|
1440
1710
|
|
|
1441
|
-
1.
|
|
1442
|
-
2.
|
|
1443
|
-
3.
|
|
1444
|
-
4.
|
|
1445
|
-
5.
|
|
1446
|
-
6.
|
|
1711
|
+
1. **意图压缩**:用较少、稳定的 token 表达尺寸、位置、颜色和交互意图
|
|
1712
|
+
2. **有限与开放并存**:布局、档位和派生规则有限,主题名与项目色卡保持开放
|
|
1713
|
+
3. **相对尺寸体系**:常规界面使用统一档位,随根字号和上下文自然缩放
|
|
1714
|
+
4. **主题派生**:从基础种子与项目扩展色生成语义变量和派生档位
|
|
1715
|
+
5. **坐标布局**:`ui-flex` 用空间坐标描述布局,再编译为兼容 CSS
|
|
1716
|
+
6. **可控响应式**:用命名范围和固定覆盖顺序保持多端行为一致
|
|
1447
1717
|
|
|
1448
1718
|
### 适用场景
|
|
1449
1719
|
|
|
1450
|
-
|
|
1451
|
-
-
|
|
1720
|
+
**更适合**:
|
|
1721
|
+
- 规则明确、需要长期维护的产品界面
|
|
1452
1722
|
- 设计系统严格的项目
|
|
1453
1723
|
- 小团队深度定制
|
|
1454
|
-
-
|
|
1724
|
+
- 多页面或多人协作、需要保持统一表达的项目
|
|
1455
1725
|
|
|
1456
|
-
|
|
1457
|
-
-
|
|
1458
|
-
-
|
|
1459
|
-
- 高度依赖 AI 编码
|
|
1726
|
+
**需要额外评估**:
|
|
1727
|
+
- 高度依赖第三方插件或既有社区类名约定的项目
|
|
1728
|
+
- 需要逐像素还原外部设计、且不接受项目级自定义样式的页面
|
|
1460
1729
|
|
|
1461
1730
|
### 快速回顾
|
|
1462
1731
|
|
|
@@ -1465,7 +1734,7 @@ const descClass = 'co-desc fs-sm my-ss'
|
|
|
1465
1734
|
n-mm m-ss w-ll h-full r-sm fs-lm
|
|
1466
1735
|
|
|
1467
1736
|
<!-- 颜色系统 -->
|
|
1468
|
-
co-main bg-fore
|
|
1737
|
+
co-main bg-fore b-line
|
|
1469
1738
|
co-desc co-risk bg-well
|
|
1470
1739
|
|
|
1471
1740
|
<!-- 布局系统 -->
|
|
@@ -1473,7 +1742,7 @@ ui-flex="row xm"
|
|
|
1473
1742
|
ui-grid="mob:1 pad:3 dpc:5 ml"
|
|
1474
1743
|
|
|
1475
1744
|
<!-- 响应式 -->
|
|
1476
|
-
|
|
1745
|
+
fs-lm pad:fs-mm mob:fs-sm
|
|
1477
1746
|
ui-hide="<pad"
|
|
1478
1747
|
|
|
1479
1748
|
<!-- 按钮系统 -->
|
|
@@ -1486,12 +1755,13 @@ ui-btn="@a main l :round"
|
|
|
1486
1755
|
|
|
1487
1756
|
- **官网**: http://neatui.fekit.cn
|
|
1488
1757
|
- **NPM**: https://www.npmjs.com/package/@neatui/css
|
|
1489
|
-
- **当前版本**:
|
|
1758
|
+
- **当前版本**: v4.0.0
|
|
1490
1759
|
- **作者**: xiaojunbo
|
|
1491
1760
|
- **许可**: MIT
|
|
1492
1761
|
|
|
1493
1762
|
---
|
|
1494
1763
|
|
|
1495
|
-
|
|
1764
|
+
*本文档是人工维护的使用说明;实际能力以 `@neatui/css` SCSS 源码和构建输出为准,
|
|
1765
|
+
大版本语义变化以 `MIGRATION-4.0.md` 为准。*
|
|
1496
1766
|
|
|
1497
|
-
*最后更新:
|
|
1767
|
+
*最后更新: 2026-07-28*
|