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