Skip to content

Commit 54321ef

Browse files
committed
Merge branch 'feat_resize_optimize' into feat_resize_test
2 parents 4b8fbcb + adac537 commit 54321ef

7 files changed

Lines changed: 395 additions & 12 deletions

File tree

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
---
2+
name: nutui-build-local-verify
3+
description: NutUI 比例缩放本地验证——默认就地覆盖:每个组件 SCSS 写回 src/packages 下同一路径(如 actionsheet/actionsheet.scss→同文件);--mirror 才写到 scale-verify/ 对照。不写 build。
4+
disable-model-invocation: true
5+
---
6+
7+
# NutUI Build Local Verify
8+
9+
## 在做什么
10+
11+
**只做一步**:用 `scripts/px-to-scale-px-in-component-scss.cjs` 把组件 SCSS 里裸 `px` 转成 `scale-px` 等,并把结果写回磁盘。
12+
13+
- **默认(就地覆盖)**:对每个匹配的 `.scss`**读、写都是同一路径**——相对 `src/packages` 的路径不变。例如 `src/packages/actionsheet/actionsheet.scss` 转换后仍写回该文件,不会改到别的目录或改名。
14+
- **`--mirror`**:不写源码;结果写到 **`scale-verify/<与 src/packages 相同的相对路径>`**(例如 `scale-verify/actionsheet/actionsheet.scss`),便于 diff。
15+
16+
之后是否再跑 `pnpm run build`、是否用别的工具核对,由你自行决定;本 skill **不要求** build。
17+
18+
## 覆盖原 SCSS(推荐)
19+
20+
**nutui-react 仓库根目录** 执行。**务必先 commit / stash**,用完 `git restore src/packages``git checkout -- src/packages` 恢复。
21+
22+
```bash
23+
pnpm run verify-scale
24+
```
25+
26+
等价:
27+
28+
```bash
29+
node .cursor/skills/nutui-build-local-verify/scripts/verify-scale-generation.mjs
30+
```
31+
32+
`--in-place` / `-i` 与默认等价。)
33+
34+
## 报告
35+
36+
路径:**`scale-verify/report.json`**。覆盖模式下看 `overwriteSource === true``changedFileCount``changedFiles`
37+
38+
## 其它命令
39+
40+
```bash
41+
# 删除仓库根下 scale-verify/ 整目录(含 report;不还原已覆盖的 src/packages)
42+
node .cursor/skills/nutui-build-local-verify/scripts/verify-scale-generation.mjs --clean
43+
```
44+
45+
**可选**(只镜像、不覆盖源码):
46+
47+
```bash
48+
pnpm run verify-scale:mirror
49+
```
50+
51+
`--mirror``--in-place` 不能同时使用。
52+
53+
## 核对清单
54+
55+
- [ ] 覆盖前已 git 可回滚
56+
- [ ] `changedFiles` 抽样无 `scale-px(0px)`、无重复嵌套 `scale-px`
57+
- [ ] `font-size` / `font` 未被误改(转换器会跳过)
58+
59+
## 给用户的一句话结论
60+
61+
- 脚本跑完 + `changedFileCount` + 列 2~3 个 `changedFiles`
62+
- **覆盖的是真实源码**时,验证完用 **git 恢复**
Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,132 @@
1+
#!/usr/bin/env node
2+
/**
3+
* 默认:每个文件读自且写回 src/packages 下同一路径(如 …/actionsheet/actionsheet.scss)。
4+
* 不包含 build;自行 git diff / 恢复即可。
5+
*/
6+
import fs from 'node:fs/promises'
7+
import path from 'path'
8+
import { createRequire } from 'node:module'
9+
10+
const require = createRequire(import.meta.url)
11+
const transform = require(path.resolve(process.cwd(), 'scripts/px-to-scale-px-in-component-scss.cjs'))
12+
13+
const repoRoot = process.cwd()
14+
const packagesRoot = path.resolve(repoRoot, 'src/packages')
15+
const outRoot = path.resolve(repoRoot, 'scale-verify')
16+
const reportPath = path.resolve(outRoot, 'report.json')
17+
18+
const argv = new Set(process.argv.slice(2))
19+
const shouldClean = argv.has('--clean')
20+
const mirrorMode = argv.has('--mirror')
21+
/** 默认覆盖 src/packages 原 .scss;传 --mirror 则只写 scale-verify/ */
22+
const inPlace = !mirrorMode
23+
24+
if (mirrorMode && (argv.has('--in-place') || argv.has('-i'))) {
25+
console.error('[scale-verify] 不能同时使用 --mirror 与 --in-place / -i')
26+
process.exit(1)
27+
}
28+
29+
function isScssFile(name) {
30+
return name.endsWith('.scss')
31+
}
32+
33+
function shouldSkip(relPath) {
34+
const p = relPath.replaceAll('\\', '/')
35+
if (p.includes('/demos/')) return true
36+
if (p.includes('/__test__/')) return true
37+
if (p.includes('/__tests__/')) return true
38+
if (p.includes('/__snapshots__/')) return true
39+
if (p.startsWith('.scale-verify/')) return true
40+
return false
41+
}
42+
43+
async function walkScssFiles(dir, base = dir, list = []) {
44+
const entries = await fs.readdir(dir, { withFileTypes: true })
45+
for (const entry of entries) {
46+
const abs = path.resolve(dir, entry.name)
47+
const rel = path.relative(base, abs)
48+
if (entry.isDirectory()) {
49+
await walkScssFiles(abs, base, list)
50+
continue
51+
}
52+
if (!entry.isFile() || !isScssFile(entry.name)) continue
53+
if (shouldSkip(rel)) continue
54+
list.push(abs)
55+
}
56+
return list
57+
}
58+
59+
async function ensureReportDir() {
60+
await fs.mkdir(outRoot, { recursive: true })
61+
}
62+
63+
async function prepareOutputLayout() {
64+
if (shouldClean) {
65+
await fs.rm(outRoot, { recursive: true, force: true })
66+
console.log('[scale-verify] cleaned:', path.relative(repoRoot, outRoot))
67+
return
68+
}
69+
70+
await fs.rm(outRoot, { recursive: true, force: true })
71+
await fs.mkdir(outRoot, { recursive: true })
72+
}
73+
74+
async function main() {
75+
await prepareOutputLayout()
76+
if (shouldClean) {
77+
return
78+
}
79+
80+
const files = await walkScssFiles(packagesRoot)
81+
files.sort()
82+
83+
const changed = []
84+
for (const absFile of files) {
85+
const rel = path.relative(packagesRoot, absFile)
86+
const source = await fs.readFile(absFile, 'utf8')
87+
const transformed = transform(source)
88+
if (source === transformed) continue
89+
90+
const targetFile = inPlace ? absFile : path.resolve(outRoot, rel)
91+
if (!inPlace) {
92+
await fs.mkdir(path.dirname(targetFile), { recursive: true })
93+
}
94+
await fs.writeFile(targetFile, transformed, 'utf8')
95+
changed.push(rel.replaceAll('\\', '/'))
96+
}
97+
98+
await ensureReportDir()
99+
const scssWriteRoot = inPlace
100+
? path.relative(repoRoot, packagesRoot).replaceAll('\\', '/')
101+
: path.relative(repoRoot, outRoot).replaceAll('\\', '/')
102+
103+
const report = {
104+
generatedAt: new Date().toISOString(),
105+
mode: inPlace ? 'in-place' : 'mirror',
106+
overwriteSource: inPlace,
107+
/** 本次写入的 SCSS 根路径:原地为 src/packages,镜像为仓库根下 scale-verify */
108+
scssWriteRoot,
109+
/** 镜像模式下的实验目录;原地模式为 null */
110+
outDir: inPlace ? null : path.relative(repoRoot, outRoot).replaceAll('\\', '/'),
111+
reportPath: path.relative(repoRoot, reportPath).replaceAll('\\', '/'),
112+
totalScssFiles: files.length,
113+
changedFileCount: changed.length,
114+
changedFiles: changed,
115+
}
116+
await fs.writeFile(reportPath, `${JSON.stringify(report, null, 2)}\n`, 'utf8')
117+
118+
console.log('[scale-verify] mode:', report.mode)
119+
if (!inPlace) {
120+
console.log('[scale-verify] outDir:', report.outDir)
121+
} else {
122+
console.log('[scale-verify] wrote into:', path.relative(repoRoot, packagesRoot))
123+
}
124+
console.log('[scale-verify] totalScssFiles:', report.totalScssFiles)
125+
console.log('[scale-verify] changedFileCount:', report.changedFileCount)
126+
console.log('[scale-verify] report:', path.relative(repoRoot, reportPath))
127+
}
128+
129+
main().catch((err) => {
130+
console.error('[scale-verify] failed:', err)
131+
process.exitCode = 1
132+
})

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,9 @@
101101
"e2e:run:taro": "start-server-and-test dev:taro:h5 http://localhost:10086 cypress:run:taro",
102102
"e2e:open:taro": "start-server-and-test dev:taro:h5 http://localhost:10086 cypress:open:taro",
103103
"update:taro:entry": "node ./scripts/harmony/update-taro-entry",
104-
"upgradeTaro": "pnpm --dir ./packages/nutui-taro-demo upgradeTaro"
104+
"upgradeTaro": "pnpm --dir ./packages/nutui-taro-demo upgradeTaro",
105+
"verify-scale": "node .cursor/skills/nutui-build-local-verify/scripts/verify-scale-generation.mjs",
106+
"verify-scale:mirror": "node .cursor/skills/nutui-build-local-verify/scripts/verify-scale-generation.mjs --mirror"
105107
},
106108
"lint-staged": {
107109
"*.{scss,md}": "prettier --write",

src/packages/configprovider/types.ts

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,18 +54,34 @@ export type NutCSSVariables =
5454
| 'nutuiFontSizeXxs'
5555
| 'nutuiFontSizeXs'
5656
| 'nutuiFontSizeS'
57+
| 'nutuiFontSizeM'
5758
| 'nutuiFontSizeBase'
5859
| 'nutuiFontSizeL'
60+
| 'nutuiFontSizeMd'
5961
| 'nutuiFontSizeIcon'
6062
| 'nutuiFontSizeXl'
63+
| 'nutuiFontSize2Xl'
6164
| 'nutuiFontSizeXxl'
6265
| 'nutuiFontSize10'
6366
| 'nutuiFontSize11'
67+
| 'nutuiLineHeightXxxs'
68+
| 'nutuiLineHeightXxs'
69+
| 'nutuiLineHeightXs'
70+
| 'nutuiLineHeightS'
71+
| 'nutuiLineHeightM'
72+
| 'nutuiLineHeightBase'
73+
| 'nutuiLineHeightL'
74+
| 'nutuiLineHeightMd'
75+
| 'nutuiLineHeightIcon'
76+
| 'nutuiLineHeightXl'
77+
| 'nutuiLineHeight2Xl'
78+
| 'nutuiLineHeightXxl'
79+
| 'nutuiLineHeightXxxl'
80+
| 'nutuiLineHeightXxxxl'
6481
| 'nutuiFontWeightLight'
6582
| 'nutuiFontWeight'
6683
| 'nutuiFontWeightMedium'
6784
| 'nutuiFontWeightBold'
68-
| 'nutuiLineHeightBase'
6985
| 'nutuiSpacingXxxs'
7086
| 'nutuiSpacingXxs'
7187
| 'nutuiSpacingXs'
@@ -166,6 +182,15 @@ export type NutCSSVariables =
166182
| 'nutuiDividerSideWidth'
167183
| 'nutuiDividerVerticalHeight'
168184
| 'nutuiDividerVerticalMargin'
185+
| 'nutuiIconSize6'
186+
| 'nutuiIconSize8'
187+
| 'nutuiIconSize10'
188+
| 'nutuiIconSize11'
189+
| 'nutuiIconSize12'
190+
| 'nutuiIconSize16'
191+
| 'nutuiIconSize18'
192+
| 'nutuiIconSize20'
193+
| 'nutuiIconSize22'
169194
| 'nutuiIconHeight'
170195
| 'nutuiIconWidth'
171196
| 'nutuiIconLineHeight'
@@ -287,6 +312,12 @@ export type NutCSSVariables =
287312
| 'nutuiPriceSymbolSmallSize'
288313
| 'nutuiPriceIntegerSmallSize'
289314
| 'nutuiPriceDecimalSmallSize'
315+
| 'nutuiPriceRootLineHeight'
316+
| 'nutuiPriceMinorLineHeight'
317+
| 'nutuiPriceIntegerXlargeLineHeight'
318+
| 'nutuiPriceIntegerLargeLineHeight'
319+
| 'nutuiPriceIntegerNormalLineHeight'
320+
| 'nutuiPriceIntegerSmallLineHeight'
290321
| 'nutuiAvatarSquare'
291322
| 'nutuiAvatarLargeWidth'
292323
| 'nutuiAvatarLargeHeight'
@@ -378,6 +409,8 @@ export type NutCSSVariables =
378409
| 'nutuiRateIconSize'
379410
| 'nutuiRateFontColor'
380411
| 'nutuiRateFontSize'
412+
| 'nutuiRateFontSizeLarge'
413+
| 'nutuiRateFontSizeSmall'
381414
| 'nutuiTabbarHeight'
382415
| 'nutuiTabbarActiveColor'
383416
| 'nutuiTabbarInactiveColor'

src/styles/variables-daojia.scss

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -151,10 +151,13 @@ $font-size-xxxs: var(--nutui-font-size-xxxs, 9px) !default;
151151
$font-size-xxs: var(--nutui-font-size-xxs, 10px) !default;
152152
$font-size-xs: var(--nutui-font-size-xs, 11px) !default;
153153
$font-size-s: var(--nutui-font-size-s, 12px) !default;
154+
$font-size-m: var(--nutui-font-size-m, 13px) !default;
154155
$font-size-base: var(--nutui-font-size-base, 14px) !default;
155156
$font-size-l: var(--nutui-font-size-l, 15px) !default;
157+
$font-size-md: var(--nutui-font-size-md, 16px) !default;
156158
$font-size-icon: var(--nutui-font-size-icon, 16px) !default;
157159
$font-size-xl: var(--nutui-font-size-xl, 18px) !default;
160+
$font-size-2xl: var(--nutui-font-size-2xl, 20px) !default;
158161
$font-size-xxl: var(--nutui-font-size-xxl, 24px) !default;
159162
$font-size-xxxl: var(--nutui-font-size-10, 26px) !default;
160163
$font-size-xxxxl: var(--nutui-font-size-11, 28px) !default;
@@ -165,8 +168,21 @@ $font-weight: var(--nutui-font-weight, 400) !default;
165168
$font-weight-medium: var(--nutui-font-weight-medium, 500) !default;
166169
$font-weight-bold: var(--nutui-font-weight-bold, 600) !default;
167170

168-
// 行高
169-
$line-height-base: var(--nutui-line-height-base, 1.5) !default;
171+
// 行高(与同档字号等值;不经 scale)
172+
$line-height-xxxs: var(--nutui-line-height-xxxs, $font-size-xxxs) !default;
173+
$line-height-xxs: var(--nutui-line-height-xxs, $font-size-xxs) !default;
174+
$line-height-xs: var(--nutui-line-height-xs, $font-size-xs) !default;
175+
$line-height-s: var(--nutui-line-height-s, $font-size-s) !default;
176+
$line-height-m: var(--nutui-line-height-m, $font-size-m) !default;
177+
$line-height-base: var(--nutui-line-height-base, $font-size-base) !default;
178+
$line-height-l: var(--nutui-line-height-l, $font-size-l) !default;
179+
$line-height-md: var(--nutui-line-height-md, $font-size-md) !default;
180+
$line-height-icon: var(--nutui-line-height-icon, $font-size-icon) !default;
181+
$line-height-xl: var(--nutui-line-height-xl, $font-size-xl) !default;
182+
$line-height-2xl: var(--nutui-line-height-2xl, $font-size-2xl) !default;
183+
$line-height-xxl: var(--nutui-line-height-xxl, $font-size-xxl) !default;
184+
$line-height-xxxl: var(--nutui-line-height-xxxl, $font-size-xxxl) !default;
185+
$line-height-xxxxl: var(--nutui-line-height-xxxxl, $font-size-xxxxl) !default;
170186

171187
// 间距 space
172188
$spacing-xxxs: var(--nutui-spacing-xxxs, 2px) !default;

0 commit comments

Comments
 (0)