@neatui/css 3.16.1 → 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 CHANGED
@@ -1,10 +1,10 @@
1
1
  # NeatUI 完整使用手册
2
2
 
3
- > **版本**: @neatui/css v3.15.0
3
+ > **版本**: @neatui/css v4.0.0
4
4
  >
5
- > **更新日期**: 2025-11-29
5
+ > **更新日期**: 2026-07-28
6
6
  >
7
- > **定位**: 这不是一个 CSS 工具库,而是一套完整的设计系统 + 原子化实现
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
- **原则**:永远不使用任意像素值,使用 S/M/L 相对尺寸体系。
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/nuxt
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
- ```ts
118
- // nuxt.config.ts
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 → 0.75em (小-小)
172
- sm → 1em (小-中)
173
- sl → 1.25em (小-大)
174
- ms → 1.5em (中-小)
175
- mm → 2em (中-中)
176
- ml → 2.5em (中-大)
177
- ls → 3em (大-小)
178
- lm → 4em (大-中)
179
- ll → 6em (大-大)
180
- xl → 8em (超大)
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
- ### 修饰符扩展(5 倍精度)
179
+ 各模块共享档位名称,但不共享同一组数值;上表只适用于 `w / min-w / max-w / h / min-h / max-h`。
180
+
181
+ ### 宽高分段扩展
184
182
 
185
183
  ```scss
186
- 基础值:
187
- w-ll // 6em
184
+ 基础段:
185
+ w-xs // 0.5em
186
+ w-xl // 5.5em
188
187
 
189
- 增量 (+):
190
- w-ll+ // 7em (基础 + 1)
188
+ 紧凑容器段:
189
+ w-xs*s // 6em
190
+ w-xl*s // 16em
191
191
 
192
- 倍数 (*):
193
- w-ll*s // 12em (基础 × 2)
194
- w-ll*m // 18em (基础 × 3)
195
- w-ll*l // 24em (基础 × 4)
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
- **覆盖范围**: 0-80em (0-1280px @ 16px),共 60+ 种精确尺寸
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` | 内边距 2em |
205
- | `m-` | margin | `m-ss` | 外边距 0.75em |
206
- | `w-` | width | `w-ll` | 宽度 6em |
207
- | `h-` | height | `h-sm` | 高度 1em |
208
- | `r-` | border-radius | `r-ms` | 圆角 1.5em |
209
- | `fs-` | font-size | `fs-lm` | 字号 4em |
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-round // border-radius: 50% (圆形)
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: 基础色 (8 个)
249
- ├─ main (主色)
250
- ├─ vice (辅助色)
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
- ├─ read, desc, note, line, weak (5 级文字)
260
- └─ 12 级透明度 + 混合色
296
+ 层级 2: 10 个自动角色
297
+ ├─ none, w, b
298
+ ├─ read, desc, note, case, line, weak
299
+ └─ deep
261
300
 
262
- 层级 3: 主题色 (自动切换)
263
- ├─ light (浅色主题)
264
- └─ dark (深色主题)
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
- 'light': (
273
- main: #00b277, // 品牌主色
274
- vice: #67ce82, // 品牌辅助色
275
- well: #4bbc73, // 成功 (绿色系)
276
- warn: #fb9a2a, // 警告 (橙色系)
277
- risk: #f95850, // 危险 (红色系)
278
- info: #3c49dd, // 信息 (蓝色系)
279
- text: #000000, // 主文本色
280
- fore: #ffffff, // 前景/卡片背景色
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
- 'dark': (
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: rgba(text, 0.85) // 主要阅读文字
293
- --co-desc: rgba(text, 0.55) // 描述性文字
294
- --co-note: rgba(text, 0.35) // 注释/提示文字
295
- --co-line: rgba(text, 0.10) // 分割线
296
- --co-weak: rgba(text, 0.035) // 弱化背景
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-case: rgba(fore, 0.85) // 反转主文字
300
- --co-link: rgba(fore, 0.55) // 反转描述
301
- --co-tips: rgba(fore, 0.35) // 反转提示
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
- | `bk-` | border-color | `bk-line` | 线条边框 |
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, bk-main // 主色
317
- co-vice, bg-vice, bk-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, bk-well // 成功 ✅
323
- co-warn, bg-warn, bk-warn // 警告 ⚠️
324
- co-risk, bg-risk, bk-risk // 危险 ❌
325
- co-info, bg-info, bk-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, bk-text // 文本色
331
- co-fore, bg-fore, bk-fore // 前景色
332
- co-back, bg-back, bk-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-case // 反转主文字
345
- co-link // 反转链接
346
- co-tips // 反转提示
425
+ co-case // 更弱一级的语义文字 (20%)
426
+ co-link // 主题配置的链接色
347
427
  ```
348
428
 
349
- ### 透明度系列 (12 级)
429
+ ### 派生系列(13 级)
350
430
 
351
- 任何颜色 + `-o-{level}` = 透明度变体
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-xs // 主色 + 超低透明度
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-w-sm // 主色 + 前景色 10%
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 // 0.5px
386
- bt-ss, br-ss, bb-ss, bl-ss // 1px
387
- bt-sm, br-sm, bb-sm, bl-sm // 2px
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-none // 无边框
478
+ b-no // 四边宽度归零
394
479
  ```
395
480
 
396
481
  ### 主题切换
397
482
 
398
483
  ```html
399
- <!-- 切换全局主题 -->
400
- <html theme="light"> <!-- 浅色主题 -->
401
- <html theme="dark"> <!-- 深色主题 -->
484
+ <!-- 配置数组中的第一个主题直接编译到 :root,无需 theme 属性 -->
485
+ <html>
402
486
 
403
- <!-- 所有颜色自动切换,0 行额外代码! -->
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-case">主操作</button>
503
+ <button class="bg-main co-w">主操作</button>
411
504
 
412
505
  <!-- 危险操作 -->
413
- <button class="bg-risk co-case">删除</button>
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 bk-line"></div>
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
- **废除 flexbox 概念,用空间坐标直接描述位置!**
530
+ `ui-flex` 用空间坐标 token 描述位置,再由兼容 CSS 编译为 flex 布局。
438
531
 
439
532
  ```
440
- 传统思维: display: flex + justify-content + align-items
441
- NeatUI 思维: ui-flex="横向 纵向"
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
- <!-- Tailwind: 需要理解 flexbox -->
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
- <!-- Tailwind -->
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
- <!-- Tailwind -->
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
- #### 1. `>` 大于(min-width)
834
+ `ui-hide` 的 `>`、`<`、`=` 比较的是命名档位或完整设备段,不接收任意像素值。
835
+ 所有 selector 都使用 `[ui-hide~="<token>"]`,因此多个隐藏条件可以用空格组合。
836
+
837
+ #### 1. `>` 高于命名范围
642
838
 
643
839
  ```html
644
- <!-- 平板以上显示 -->
645
- <div class="pad:w-mm">内容</div>
840
+ <!-- 高于 pad 设备段后隐藏,即从 1280px 起隐藏 -->
841
+ <div ui-hide=">pad">仅手机和平板显示</div>
646
842
 
647
- <!-- 桌面以上隐藏 -->
648
- <div ui-hide=">dpc">移动端专属</div>
843
+ <!-- 高于 dpc-m 档后隐藏,即从 dpc-l 的 1600px 起隐藏 -->
844
+ <div ui-hide=">dpc-m">1600px 以下显示</div>
649
845
  ```
650
846
 
651
- #### 2. `<` 小于(max-width)
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
- <!-- 平板以下宽度 100% -->
658
- <div class="w-full <pad:w-mm">响应式容器</div>
855
+ <!-- 低于 mob-m 档隐藏,即到 479px 为止隐藏 -->
856
+ <div ui-hide="<mob-m">480px 起显示</div>
659
857
  ```
660
858
 
661
- #### 3. `=` 精确区间
859
+ `<mob-s` 是最低档之前的兼容空端点,当前不会产生隐藏效果。
860
+
861
+ #### 3. `=` 命名区间
662
862
 
663
863
  ```html
664
- <!-- 仅在中平板显示 (960px-1119px) -->
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
- ```scss
671
- // 格式: {breakpoint}:{class-name}
672
- mob:fs-sm // 移动端字号小
673
- pad:fs-mm // 平板字号中
674
- dpc:fs-lm // 桌面字号大
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
- <h1 class="fs-sm mob:fs-mm pad:fs-ml dpc:fs-xl">
678
- 响应式标题
679
- </h1>
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">移动内容</div>
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
- <!-- 所有使用 em 单位的元素自动缩放! -->
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
- ## 完整 API 参考
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 | 0.5em |
868
- | `n-ss` | padding | 0.75em |
869
- | `n-sm` | padding | 1em |
870
- | `n-sl` | padding | 1.25em |
871
- | `n-ms` | padding | 1.5em |
872
- | `n-mm` | padding | 2em |
873
- | `n-ml` | padding | 2.5em |
874
- | `n-ls` | padding | 3em |
875
- | `n-lm` | padding | 4em |
876
- | `n-ll` | padding | 6em |
877
- | `n-xl` | padding | 8em |
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
- m-auto // margin: auto
903
- mx-auto // margin-left/right: auto (水平居中)
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-sub // margin-left/right: -1em
911
- my-sm-sub // margin-top/bottom: -1em
912
- mt-sm-sub // margin-top: -1em
913
- // 所有尺寸都支持 -sub 后缀
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 // 0.75em ~ 8em
1158
+ w-ss ~ w-xl // 1em ~ 5.5em
924
1159
 
925
- // 修饰符
926
- w-ll+ // 7em (增量)
927
- w-ll*s // 12em (2倍)
928
- w-ll*m // 18em (3倍)
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.5em
951
- r-ss ~ r-xl // 0.75em ~ 8em
952
- r-round // 50% (圆形)
1184
+ r-xs // 0.1em
1185
+ r-ss ~ r-xl // 0.2em ~ 1.2em
1186
+ r-full // 10000em(胶囊或圆形轮廓)
953
1187
 
954
1188
  // 方向圆角
955
- rt-{size} // 左上
956
- rr-{size} // 右上
957
- rb-{size} // 右下
958
- rl-{size} // 左下
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.5em
967
- fs-ss ~ fs-xl // 0.75em ~ 8em
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 // 0.5px
994
- bt-ss, br-ss, bb-ss, bl-ss // 1px
995
- bt-sm, br-sm, bb-sm, bl-sm // 2px
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-none
1244
+ b-no
1002
1245
 
1003
1246
  // 边框颜色
1004
- bk-main, bk-vice, bk-risk...
1005
- bk-line, bk-weak
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
- ```scss
1093
- pointer-events-none
1094
- pointer-events-auto
1095
- user-select-none
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-ll+">
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-case">
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
- <!-- 只需切换 theme 属性 -->
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 bk-line bt-xs"
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 bk-line bt-xs"
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 bk-line" ui-flex="row xm">
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 bk-line" ui-flex="row rm">
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 bk-line">
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 bk-line"
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' with (
1370
- $theme: (
1371
- 'light': (
1372
- main: #00b277, // 自定义主色
1373
- vice: #67ce82,
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="bk-line bk-main:focus" />
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. **极低学习成本**:3 个规则,20 分钟精通
1443
- 3. **强制一致性**:技术约束 > 人工自律
1444
- 4. **深色模式零成本**:自动推导 100+ 语义色
1445
- 5. **空间直觉布局**:废除 flexbox 概念
1446
- 6. **9 档精细响应**:3×3 分形断点系统
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 bk-line
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
- mob:fs-sm pad:fs-mm dpc:fs-lm
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
- - **当前版本**: v3.15.0
1758
+ - **当前版本**: v4.0.0
1490
1759
  - **作者**: xiaojunbo
1491
1760
  - **许可**: MIT
1492
1761
 
1493
1762
  ---
1494
1763
 
1495
- *本文档基于项目实战整理,覆盖 NeatUI 100% 的 API 和用法*
1764
+ *本文档是人工维护的使用说明;实际能力以 `@neatui/css` SCSS 源码和构建输出为准,
1765
+ 大版本语义变化以 `MIGRATION-4.0.md` 为准。*
1496
1766
 
1497
- *最后更新: 2025-11-29*
1767
+ *最后更新: 2026-07-28*