Skip to content

Commit 8d8aa9a

Browse files
committed
chore: 增加等比适配skill
1 parent 45c91f2 commit 8d8aa9a

2 files changed

Lines changed: 103 additions & 0 deletions

File tree

  • .cursor/skills/nutui-proportional-scaling
  • packages/nutui-taro-demo/src
Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
---
2+
name: nutui-proportional-scaling
3+
description: >-
4+
NutUI React proportional scaling on branch feat_resize: runtime --nut-scale-f /
5+
--nut-scale-font / --nut-scale-icon from scale-f.ts (H5) and scale-f.taro.ts
6+
(Taro), Sass helpers scale-px / scale-font-px / scale-icon-px and theme font
7+
tokens in variables.scss & theme-*.scss; profiles standard / large / elderly;
8+
commit-backed rules e.g. never scale 0px. Use when implementing 多尺寸适配,
9+
等比适配, 大字版, 老年版, scale-px, viewport or native bridge scaling, or
10+
editing component SCSS for resize.
11+
---
12+
13+
# NutUI React 等比适配
14+
15+
## 1. 运行时:谁在写 CSS 变量
16+
17+
- **H5**`src/utils/scale-f.ts`
18+
- `initScaleF(profile?)`:首次计算缩放、`resize``refreshScaleF`
19+
- `getScaleF`:优先 `jmfe.callNative('DongScreenAdapterPlugin','getScale')`,失败用视口规则。
20+
- 视口回退要点:`innerWidth >= 600` 视作 pad,基准乘 `1.2``375–600` 间按 `375` 比例,**上限 1.17**(与源码常量一致)。
21+
- **Taro 侧复用同一套契约**`src/utils/scale-f.taro.ts`,并从 `src/utils/index.taro.ts` 导出。
22+
- 写入 `:root` 的变量(与 `variables.scss` 一致):
23+
- `--nut-scale-f`:布局/通用 `scale-px`
24+
- `--nut-scale-font``scale-font-px`、主题 `--nutui-font-size-*`
25+
- `--nut-scale-icon``scale-icon-px`、图标相关
26+
27+
**档位 `ScaleProfile`**`standard` | `large` | `elderly`(仅后两者生效额外倍率)。
28+
**场景倍率**(与 `getSceneRatio` 一致):老年对 `font` / `icon` / `lego` × `1.3`;大字仅对 `font` × `1.15`
29+
30+
**JS 里算像素**`calcByProfile(baseValue, { scene, profile?, scale?, device? })` — 用于组件内联样式、画布尺寸等,与 Sass 的 `calc(...* var(--nut-scale-*))` 同一套语义。
31+
32+
---
33+
34+
## 2. 样式层:`variables.scss` 中的函数
35+
36+
```scss
37+
// 根上默认值见 variables.scss :root
38+
@function scale-px($size) {
39+
@return calc(#{$size} * var(--nut-scale-f, 1));
40+
}
41+
@function scale-font-px($size) {
42+
@return calc(#{$size} * var(--nut-scale-font, var(--nut-scale-f, 1)));
43+
}
44+
@function scale-icon-px($size) {
45+
@return calc(#{$size} * var(--nut-scale-icon, var(--nut-scale-f, 1)));
46+
}
47+
```
48+
49+
**主题字号档**`theme-default.scss` / `theme-dark.scss`):`--nutui-font-size-*` 使用 `calc(Npx * var(--nut-scale-font, var(--nut-scale-f, 1)))`,与 **大字/老年** 档位对齐。
50+
51+
---
52+
53+
## 3. 提交里固化的规范(务必遵守)
54+
55+
### 3.1 「0px 不转换」(`1a35d9b8`
56+
57+
凡应为 **数值 0** 的尺寸,**不要**`scale-px(0px)`,一律 **`0`****`0px`**(如 padding 某一维、`box-shadow` 偏移、border 为 0、`margin: 0`)。
58+
否则会得到 `calc(0px * var(--nut-scale-f))`,在部分浏览器或亚像素场景下与纯 `0` 表现不一致。
59+
60+
### 3.2 `line-height`
61+
62+
- **比例行高**(如 `line-height: 1`):不随系数变,用于挤压行盒、图标对齐等 — 与「等比 px」不同维度。
63+
- **与设计稿 px 绑定的行高**:用与字号一致的档位,通常为 **`scale-font-px`**,或与同一变量体系。
64+
- 参考历史修复:弹层标题等曾去掉不恰当的固定 `line-height` 以免与大字模式冲突 — 新增时不要给标题随意写死 `line-height: 20px` 类样式,除非走缩放函数或主题变量。
65+
66+
### 3.3 组件 SCSS 迁移模式(`dc4f1e28` / 后续 style 提交)
67+
68+
- 间距、圆角、`border` 粗细、固定宽高(非纯文字):优先 **`scale-px`**
69+
- 纯字体大小:`scale-font-px` 或主题已有 `--nutui-font-size-*`
70+
- 图标占位:**`scale-icon-px`** 或已有 `--nut-icon-*`
71+
- 保持与 **无障碍/大屏** 相关提交协同:同一文件改尺度时,勿回退 `dialog` 等对大字兼容的改动。
72+
73+
---
74+
75+
## 4. 业务接入清单
76+
77+
1. **入口调用**:在应用入口(仅浏览器环境)调用 `initScaleF(可选档位)`;档位可随业务切换并依赖内部 `setScaleProfile` 刷新变量。
78+
2. **Taro**:使用 `scale-f.taro` 导出,保证 H5 与小程序 WebView 行为一致(仍以仓库实现为准)。
79+
3. **覆写主题**:通过 `--nutui-*``--nut-scale-*` 覆盖时,保持 `calc` 与变量回退链完整。
80+
4. **验收**:切换标准/大字/老年、收窄与放宽视口、(如有)站内容器走原生 `getScale`,检查布局与字号是否同比变化且无「0px 被 scale」问题。
81+
82+
---
83+
84+
## 5. Agent 自检(改完缩放权相关代码时)
85+
86+
- [ ] 新增 **0** 尺寸未误用 `scale-px(0px)`
87+
- [ ] 字体/图标是否应走 **`scale-font-px` / `scale-icon-px`** 而非误用 `scale-px`
88+
- [ ] TS 侧改 `scale-f*` 已同步考虑 **Taro** 文件。
89+
- [ ] 修改 `formatScaleValue` / 断点时,已通读 **视口与平板常量** 是否仍与文档、设计一致。
90+
91+
若与上游分支分歧,以**当前分支 `feat_resize` 最新提交**`src/utils/scale-f*.ts``src/styles/variables.scss` 为准。

packages/nutui-taro-demo/src/app.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import { Component } from 'react'
2+
import { initScaleF } from '@/utils/scale-f.taro'
23
import('@/sites/assets/styles/reset.scss')
34
import('@/packages/nutui.react.scss.taro')
45
import('@nutui/touch-emulator')
@@ -7,6 +8,17 @@ import './app.scss'
78

89
// console.log(NutUI)
910
class App extends Component {
11+
private disposeScale?: () => void
12+
13+
componentDidMount() {
14+
// 写入 :root 的 --nut-scale-f / --nut-scale-font / --nut-scale-icon,与组件内 scale-* 一致
15+
this.disposeScale = initScaleF()
16+
}
17+
18+
componentWillUnmount() {
19+
this.disposeScale?.()
20+
}
21+
1022
render() {
1123
return this.props.children
1224
}

0 commit comments

Comments
 (0)