dsh-config-manager 0.1.39 → 0.1.41
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/lib/client.d.ts +90 -8
- package/lib/client.js +1904 -1086
- package/lib/client.js.map +1 -1
- package/lib/core/cache-cleaner.d.ts +39 -0
- package/lib/core/cache-cleaner.js +164 -0
- package/lib/core/cache-cleaner.js.map +1 -0
- package/lib/index.js +172 -3
- package/lib/index.js.map +1 -1
- package/lib/market/github-repos.d.ts +19 -8
- package/lib/market/github-repos.js +62 -33
- package/lib/market/github-repos.js.map +1 -1
- package/lib/market/my-repo.d.ts +111 -3
- package/lib/market/my-repo.js +309 -26
- package/lib/market/my-repo.js.map +1 -1
- package/lib/market/prepare.js +3 -2
- package/lib/market/prepare.js.map +1 -1
- package/lib/market/types.d.ts +2 -0
- package/lib/security/secret-scanner.d.ts +18 -3
- package/lib/security/secret-scanner.js +144 -20
- package/lib/security/secret-scanner.js.map +1 -1
- package/package.json +1 -1
- package/src/client/common/ConfirmDialog.tsx +135 -0
- package/src/client/config-manager.module.css +101 -0
- package/src/client/market/MarketPanel.tsx +138 -45
- package/src/client/market/MyConfigsView.tsx +515 -132
- package/src/client/market/disclaimer.test.ts +57 -0
- package/src/client/market/disclaimer.ts +43 -0
- package/src/client/market/market-api.test.ts +3 -0
- package/src/client/market/market-locales.ts +37 -13
- package/src/client/market/my-configs-api.ts +20 -2
- package/src/client/market/my-configs-view.test.ts +137 -2
- package/src/client/market/my-configs-view.ts +174 -2
- package/src/client/run-store.test.ts +40 -2
- package/src/client/run-store.ts +70 -10
- package/src/client/sync/SyncConfirmView.tsx +28 -22
- package/src/client/sync/SyncSettingsView.tsx +175 -65
- package/src/client/sync/sync-api.ts +19 -0
- package/src/client/sync/sync-locales.ts +14 -2
- package/src/core/cache-cleaner.test.ts +333 -0
- package/src/core/cache-cleaner.ts +196 -0
- package/src/index.ts +165 -5
- package/src/market/github-repos.test.ts +99 -8
- package/src/market/github-repos.ts +67 -35
- package/src/market/my-repo.test.ts +218 -27
- package/src/market/my-repo.ts +403 -30
- package/src/market/prepare.test.ts +71 -1
- package/src/market/prepare.ts +3 -2
- package/src/market/types.ts +2 -0
- package/src/security/secret-scanner.ts +139 -22
- package/src/security/security.test.ts +111 -2
|
@@ -7,10 +7,19 @@
|
|
|
7
7
|
* 判定策略(两级,避免误伤/漏报):
|
|
8
8
|
* - 字段名:规范化(小写、去 `_-. ` 分隔符)后做「精确命中 / 敏感后缀 / 敏感前缀」三级匹配;
|
|
9
9
|
* 只剥离**字符串叶值**(对象/数组整体递归,不整块剥离——保证 `credentials: [...]` 状态数组存活)。
|
|
10
|
-
* - 引用豁免:`apiKeyEnv`
|
|
11
|
-
* (`isEnvVarName
|
|
10
|
+
* - 引用豁免:`apiKeyEnv` 等「只存引用名」字段、形如 `DEEPSEEK_API_KEY` 的全大写环境变量名
|
|
11
|
+
* (`isEnvVarName`)以及 `${VAR}` / `{{VAR}}` / `%VAR%` / `$VAR` 模板引用(`isTemplateReference`)
|
|
12
|
+
* 一律保留——值是名字不是秘密。
|
|
12
13
|
* - 值形状启发式(规范 §6「不能只根据固定字段判断」):字段名未命中但值长得像 secret
|
|
13
|
-
* (sk- / JWT / AKIA / GitHub PAT / PEM 私钥 / Bearer
|
|
14
|
+
* (sk- / JWT / AKIA / GitHub PAT / PEM 私钥 / Bearer)也剥离;**示例/占位形态**(含
|
|
15
|
+
* your/example/xxx/test/<...> 等占位词的 `sk-your-*`、`Bearer example-*`、JWT 教学串)放行。
|
|
16
|
+
* - 两种判定档位(2026-08-21 优化):
|
|
17
|
+
* * 保守档(默认,导出/同步脱敏用):字段名敏感**即**剥离(值形状优先、引用/env 名豁免);
|
|
18
|
+
* * 宽松档(`literalValueOnly`,市场发布扫描用):字段名敏感**且**值像真实字面量凭据
|
|
19
|
+
* (非占位符 / 非类型词 / 非代码表达式 / 非模板引用 / 非短标识符)才命中——消除
|
|
20
|
+
* `"token": "your-token"`、`"token": "${OPENAI_API_KEY}"`、`"Authorization": "Bearer <token>"`
|
|
21
|
+
* 等「值不是秘密」的误报。
|
|
22
|
+
* - 高熵 base64 默认关(误伤率高)。
|
|
14
23
|
*
|
|
15
24
|
* 实现不变量:返回 sanitized 为**全新对象**(不改原数据);迭代式显式栈(防爆栈)+ 深度上限;
|
|
16
25
|
* 命中记录只含路径与字段名,**值永不外泄**。
|
|
@@ -55,6 +64,39 @@ export const SECRET_VALUE_PATTERNS = [
|
|
|
55
64
|
{ name: 'pem-private-key', re: /-----BEGIN (?:RSA |EC |OPENSSH |DSA |ENCRYPTED )?PRIVATE KEY-----/ },
|
|
56
65
|
{ name: 'bearer-token', re: /Bearer [A-Za-z0-9._~+/=-]{8,}/ },
|
|
57
66
|
];
|
|
67
|
+
/**
|
|
68
|
+
* 值形状命中片段中的「示例/占位」词:匹配到的片段含其中任一 → 视为示例形态放行。
|
|
69
|
+
* 覆盖 `sk-your-*`、`sk-example-*`、`sk-test-*`、`Bearer example-*`、`AKIA...EXAMPLE`(AWS 官方示例)、
|
|
70
|
+
* JWT 教学串(第三段 signature)等;真实随机密钥串几乎不可能包含这些完整单词,安全不回退。
|
|
71
|
+
*/
|
|
72
|
+
const SECRET_SHAPE_PLACEHOLDER_WORDS = [
|
|
73
|
+
'your', 'their', 'example', 'sample', 'dummy', 'placeholder',
|
|
74
|
+
'test', 'demo', 'signature', 'secret', 'value', 'xxxx',
|
|
75
|
+
];
|
|
76
|
+
/** 值形状命中是否「示例/占位」形态(含占位词或尖括号包裹)→ 放行 */
|
|
77
|
+
function isExampleSecretShape(matched) {
|
|
78
|
+
if (/<[^>]+>/.test(matched))
|
|
79
|
+
return true;
|
|
80
|
+
const lower = matched.toLowerCase();
|
|
81
|
+
return SECRET_SHAPE_PLACEHOLDER_WORDS.some((w) => lower.includes(w));
|
|
82
|
+
}
|
|
83
|
+
function matchSecretValuePatternHit(value) {
|
|
84
|
+
for (const p of SECRET_VALUE_PATTERNS) {
|
|
85
|
+
const m = p.re.exec(value);
|
|
86
|
+
if (m !== null)
|
|
87
|
+
return { name: p.name, matched: m[0] };
|
|
88
|
+
}
|
|
89
|
+
return null;
|
|
90
|
+
}
|
|
91
|
+
/** 值是否命中强模式 secret 形状(示例/占位形态 → null;返回命中模式名;未命中返回 null) */
|
|
92
|
+
export function matchSecretValuePattern(value) {
|
|
93
|
+
const hit = matchSecretValuePatternHit(value);
|
|
94
|
+
if (hit === null)
|
|
95
|
+
return null;
|
|
96
|
+
if (isExampleSecretShape(hit.matched))
|
|
97
|
+
return null;
|
|
98
|
+
return hit.name;
|
|
99
|
+
}
|
|
58
100
|
/** 规范化字段名:小写 + 去 `_-. ` 分隔符(用于名单匹配) */
|
|
59
101
|
export function normalizeFieldName(name) {
|
|
60
102
|
return name.toLowerCase().replace(/[^a-z0-9]/g, '');
|
|
@@ -63,6 +105,29 @@ export function normalizeFieldName(name) {
|
|
|
63
105
|
export function isEnvVarName(value) {
|
|
64
106
|
return /^[A-Z][A-Z0-9_]{2,}$/.test(value);
|
|
65
107
|
}
|
|
108
|
+
/** 是否为模板/环境变量引用形态(${VAR} / {{VAR}} / %VAR% / $VAR)→ 值是名字不是秘密。
|
|
109
|
+
* 注意:文本扫描的 `field: value` 正则用 `[^\s,;}]` 取值,`${...}` / `{{...}}` 的右花括号
|
|
110
|
+
* 会被截断,因此除完整闭合形态外,也接受「以 ${ / {{ / % 开头、内容全为变量名字符」的截断形态。 */
|
|
111
|
+
export function isTemplateReference(value) {
|
|
112
|
+
const v = value.trim();
|
|
113
|
+
// 完整闭合形态
|
|
114
|
+
if (/^\$\{[A-Za-z0-9_.]+\}$/.test(v))
|
|
115
|
+
return true;
|
|
116
|
+
if (/^\{\{[A-Za-z0-9_.]+\}\}$/.test(v))
|
|
117
|
+
return true;
|
|
118
|
+
if (/^%[A-Za-z0-9_.]+%$/.test(v))
|
|
119
|
+
return true;
|
|
120
|
+
if (/^\$[A-Z][A-Z0-9_]{2,}$/.test(v))
|
|
121
|
+
return true;
|
|
122
|
+
// 截断形态(右花括号被取值正则排除):真实凭据不会以 ${ / {{ / % 开头,放行安全
|
|
123
|
+
if (/^\$\{[A-Za-z0-9_.]*$/.test(v))
|
|
124
|
+
return true;
|
|
125
|
+
if (/^\{\{[A-Za-z0-9_.]*$/.test(v))
|
|
126
|
+
return true;
|
|
127
|
+
if (/^%[A-Za-z0-9_.]*$/.test(v))
|
|
128
|
+
return true;
|
|
129
|
+
return false;
|
|
130
|
+
}
|
|
66
131
|
/** 字段名是否命中敏感名单(规范化后精确 / 敏感后缀 / 敏感前缀) */
|
|
67
132
|
export function isSensitiveFieldName(field, extra = []) {
|
|
68
133
|
const norm = normalizeFieldName(field);
|
|
@@ -79,14 +144,6 @@ export function isReferenceField(field, extra = []) {
|
|
|
79
144
|
const norm = normalizeFieldName(field);
|
|
80
145
|
return [...DEFAULT_REFERENCE_FIELDS, ...extra].includes(norm);
|
|
81
146
|
}
|
|
82
|
-
/** 值是否命中强模式 secret 形状(返回命中模式名;未命中返回 null) */
|
|
83
|
-
export function matchSecretValuePattern(value) {
|
|
84
|
-
for (const p of SECRET_VALUE_PATTERNS) {
|
|
85
|
-
if (p.re.test(value))
|
|
86
|
-
return p.name;
|
|
87
|
-
}
|
|
88
|
-
return null;
|
|
89
|
-
}
|
|
90
147
|
/** 高熵启发式:长 base64/hex 串且 Shannon 熵高(默认关) */
|
|
91
148
|
function isHighEntropySecret(value) {
|
|
92
149
|
if (!/^[A-Za-z0-9+/=_-]{32,}$/.test(value))
|
|
@@ -103,11 +160,77 @@ function isHighEntropySecret(value) {
|
|
|
103
160
|
}
|
|
104
161
|
return entropy > 4.2;
|
|
105
162
|
}
|
|
163
|
+
/* ---------------- 值形态判定(结构化扫描与文本扫描共用) ---------------- */
|
|
164
|
+
/** 占位符 / 示例形态:xxx、your-token、<...>、example、sample、dummy、placeholder、... */
|
|
165
|
+
const PLACEHOLDER_RE = /^(x{3,}|your[-_ ]?[\w]+|their[-_ ]?[\w]+|<[^>]+>|example|examples?|sample|dummy|placeholder|som[e]thing|^\u2026)/i;
|
|
166
|
+
/** 类型/关键字形态(代码声明,如 `authToken: string`、`token: null`) */
|
|
167
|
+
const TYPE_KEYWORD_RE = /^(string|number|boolean|object|array|any|unknown|null|undefined|void|true|false|required|optional)$/i;
|
|
168
|
+
/** 代码表达式/引用形态:值里出现调用/成员访问/引号/运算符/空白等 → 是代码而非字面量密钥 */
|
|
169
|
+
function isCodeExpressionValue(value) {
|
|
170
|
+
// 方法调用 / 成员访问:data.token、process.env.X、wx.getStorageSync(...)、a.b(...)
|
|
171
|
+
if (/[.([\]'"`]/.test(value))
|
|
172
|
+
return true;
|
|
173
|
+
// 赋值/比较/模板:a=b、a&&b 等
|
|
174
|
+
if (/[=+*/%<>!&|?]+/.test(value))
|
|
175
|
+
return true;
|
|
176
|
+
// 含空白 → 短语/语句而非单个字面量
|
|
177
|
+
if (/\s/.test(value))
|
|
178
|
+
return true;
|
|
179
|
+
return false;
|
|
180
|
+
}
|
|
181
|
+
/** 混合字符长串是否「疑似真实凭据」:含数字、或含字母数字连字符下划线以外的符号、或大小写混合
|
|
182
|
+
* (纯小写字母+连字符的示例值如 `abc-def-ghi-jkl` → 放行;`s3cretP@ssw0rd` / `abc123-def456` → 拦截) */
|
|
183
|
+
function looksLikeCredential(value) {
|
|
184
|
+
if (value.length < 8)
|
|
185
|
+
return false;
|
|
186
|
+
if (/[0-9]/.test(value))
|
|
187
|
+
return true;
|
|
188
|
+
if (/[^A-Za-z0-9_-]/.test(value))
|
|
189
|
+
return true;
|
|
190
|
+
if (/[a-z]/.test(value) && /[A-Z]/.test(value))
|
|
191
|
+
return true;
|
|
192
|
+
return false;
|
|
193
|
+
}
|
|
194
|
+
/** 值是否为「字面量密钥」:既不是代码表达式,也不是占位符/类型词/短标识符/环境引用。
|
|
195
|
+
* 只有字段名敏感 **且** 值像真实字面量凭据时才报告 —— 消除技能文档中
|
|
196
|
+
* `authToken: string`、`password: process.env.X`、`token: data.token` 等代码示例误报。 */
|
|
197
|
+
function isLiteralSecretValue(value) {
|
|
198
|
+
if (value === '')
|
|
199
|
+
return false;
|
|
200
|
+
// 值形状强信号(sk- / ghp_ / AKIA / JWT / PEM / Bearer,示例/占位形态已降噪)—— 任何字段都视为真凭据
|
|
201
|
+
if (matchSecretValuePattern(value) !== null)
|
|
202
|
+
return true;
|
|
203
|
+
if (PLACEHOLDER_RE.test(value))
|
|
204
|
+
return false;
|
|
205
|
+
if (TYPE_KEYWORD_RE.test(value))
|
|
206
|
+
return false;
|
|
207
|
+
if (isCodeExpressionValue(value))
|
|
208
|
+
return false;
|
|
209
|
+
if (isEnvVarName(value))
|
|
210
|
+
return false;
|
|
211
|
+
if (isTemplateReference(value))
|
|
212
|
+
return false;
|
|
213
|
+
// 纯字母数字短标识符(变量名/普通词,如 authToken、data、key)→ 非密钥
|
|
214
|
+
if (/^[A-Za-z0-9_]+$/.test(value) && value.length < 20)
|
|
215
|
+
return false;
|
|
216
|
+
// 其余:混合字符串,仅当像真实凭据(含数字/符号/大小写混合)才疑似
|
|
217
|
+
return looksLikeCredential(value);
|
|
218
|
+
}
|
|
106
219
|
/** 判定单个「字段名 + 字符串值」:strip | keep(含引用豁免与值形状)
|
|
107
|
-
* 顺序:值形状优先(AKIA 等全大写 secret 形状不能被 env 名豁免误放)→ 引用字段 → env 名 → 字段名。
|
|
220
|
+
* 顺序:值形状优先(AKIA 等全大写 secret 形状不能被 env 名豁免误放)→ 引用字段 → env 名 → 字段名。
|
|
221
|
+
* 宽松档(literalValueOnly,市场发布):字段名命中还要求值像真实字面量凭据(非占位/引用/代码)。 */
|
|
108
222
|
function judgeFieldValue(field, value, opts) {
|
|
109
223
|
if (value === '')
|
|
110
224
|
return false;
|
|
225
|
+
if (opts.literalValueOnly) {
|
|
226
|
+
// 宽松档(市场发布扫描):值形状强信号字段无关必拦;字段名敏感 + 值像真实字面量凭据才拦
|
|
227
|
+
if (opts.valuePatterns && matchSecretValuePattern(value) !== null)
|
|
228
|
+
return true;
|
|
229
|
+
if (isSensitiveFieldName(field, opts.extraFieldNames) && isLiteralSecretValue(value))
|
|
230
|
+
return true;
|
|
231
|
+
return false;
|
|
232
|
+
}
|
|
233
|
+
// 保守档(导出/同步脱敏):值形状优先 → 引用字段/env 名豁免 → 字段名敏感即剥
|
|
111
234
|
if (opts.valuePatterns && matchSecretValuePattern(value) !== null)
|
|
112
235
|
return true;
|
|
113
236
|
if (isReferenceField(field, opts.extraReferenceFields))
|
|
@@ -128,6 +251,7 @@ export function scanAndRedact(data, opts = {}) {
|
|
|
128
251
|
extraReferenceFields: opts.extraReferenceFields ?? [],
|
|
129
252
|
valuePatterns: opts.valuePatterns ?? true,
|
|
130
253
|
highEntropy: opts.highEntropy ?? false,
|
|
254
|
+
literalValueOnly: opts.literalValueOnly ?? false,
|
|
131
255
|
};
|
|
132
256
|
const hits = [];
|
|
133
257
|
if (data === null || typeof data !== 'object')
|
|
@@ -201,7 +325,11 @@ const FIELD_VALUE_RE = [
|
|
|
201
325
|
// field: value
|
|
202
326
|
{ re: /([A-Za-z0-9_.\-]+)\s*:\s*([^\s,;}]+)/g, json: false },
|
|
203
327
|
];
|
|
204
|
-
/** 文本级扫描:逐行找「敏感字段名
|
|
328
|
+
/** 文本级扫描:逐行找「敏感字段名 + 疑似真实字面量凭据」与「值形状」命中(只报告,不修改文本)。
|
|
329
|
+
* 2026-08-20 优化:字段名命中不再是充分条件 —— 值必须是「非代码引用 / 非占位符 / 非类型词 /
|
|
330
|
+
* 非短标识符」的字面量,消除技能/代码文档中 `token:`/`password:` 等示例命名的误报;
|
|
331
|
+
* 2026-08-21 优化:值形状(sk-/ghp_/AKIA/JWT/PEM/Bearer)对示例/占位形态(含 your/example/
|
|
332
|
+
* xxx/test/<...> 等占位词)放行;混合字符串需像真实凭据(含数字/符号/大小写混合)才报告。 */
|
|
205
333
|
export function scanText(text, opts = {}) {
|
|
206
334
|
const hits = [];
|
|
207
335
|
const extra = opts.extraFieldNames ?? [];
|
|
@@ -219,17 +347,13 @@ export function scanText(text, opts = {}) {
|
|
|
219
347
|
const value = m[2];
|
|
220
348
|
if (!isSensitiveFieldName(field, extra))
|
|
221
349
|
continue;
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
hits.push({ path: linePath, field });
|
|
350
|
+
// 值必须是「疑似字面量凭据」才报告(消除代码示例/占位符误报)
|
|
351
|
+
if (!isLiteralSecretValue(value))
|
|
225
352
|
continue;
|
|
226
|
-
}
|
|
227
|
-
if (isEnvVarName(value))
|
|
228
|
-
continue; // 引用名不报告
|
|
229
353
|
hits.push({ path: linePath, field });
|
|
230
354
|
}
|
|
231
355
|
}
|
|
232
|
-
//
|
|
356
|
+
// 值形状(字段名无关;整行 trim 后匹配 sk-/ghp_/JWT/PEM/Bearer 等强信号,示例形态已降噪)
|
|
233
357
|
if (valuePatterns) {
|
|
234
358
|
const trimmed = line.trim();
|
|
235
359
|
const name = matchSecretValuePattern(trimmed);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"secret-scanner.js","sourceRoot":"","sources":["../../src/security/secret-scanner.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"secret-scanner.js","sourceRoot":"","sources":["../../src/security/secret-scanner.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-config-manager",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.41",
|
|
4
4
|
"description": "DSH Config Manager — backup / export / import / migrate DSH configuration (dual-face Cordis plugin: host engine + web UI). Manifest shape mirrors @linxin666/dsh-ssh@0.1.12.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"dsh",
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ConfirmDialog —— 确认弹窗(危险/重要操作的二次确认,DESIGN.md §8.11 / §14)。
|
|
3
|
+
*
|
|
4
|
+
* 背景(2026-08-20):用户要求「删除按钮需要弹窗弹出二次确认」,替代原先的
|
|
5
|
+
* 「行内两步确认」(已从 DESIGN.md §14 移除,见 t8 设计)。本项目此前无任何
|
|
6
|
+
* modal / fixed / z-index 元素,本组件是首个浮动层 —— DESIGN.md §15 Anti-pattern #7
|
|
7
|
+
* 已登记豁免(z-index 100;浮动层必须先设计进 DESIGN.md 的流程满足)。
|
|
8
|
+
*
|
|
9
|
+
* 交互约定:
|
|
10
|
+
* - 受控组件:open=false 时不渲染;open=true 渲染遮罩 + 居中卡片;
|
|
11
|
+
* - 关闭三途径:遮罩点击(仅 e.target === currentTarget)、Esc 键、取消按钮;
|
|
12
|
+
* - busy=true(或 onConfirm 返回 Promise 的自管 busy)时禁用一切关闭途径与确认按钮,
|
|
13
|
+
* 防重复提交;
|
|
14
|
+
* - 初始焦点在取消按钮(危险确认不默认落破坏性按钮);关闭后还原焦点到触发按钮
|
|
15
|
+
* (open 前的 document.activeElement);
|
|
16
|
+
* - 不做完整 focus trap(两按钮场景风险可接受,DESIGN.md §8.11 已注明)。
|
|
17
|
+
*
|
|
18
|
+
* 安全:message 由调用方传入(渲染前已 redact 兜底,与全站一致);本组件不触碰任何凭据。
|
|
19
|
+
* 样式:全部走 --dsw-* token(遮罩 color-mix 半透明、卡片 bg-layer-2 + border-l1),
|
|
20
|
+
* 仅新增 dialogMask/dialogCard/dialogHeader/dialogBody 四个类(config-manager.module.css)。
|
|
21
|
+
*/
|
|
22
|
+
import { useEffect, useRef, useState } from 'react'
|
|
23
|
+
import type { ReactNode } from 'react'
|
|
24
|
+
import { Button } from './ui.tsx'
|
|
25
|
+
import css from '../config-manager.module.css'
|
|
26
|
+
|
|
27
|
+
export interface ConfirmDialogProps {
|
|
28
|
+
/** 是否打开(受控);false 时不渲染 */
|
|
29
|
+
open: boolean
|
|
30
|
+
/** 标题(如「删除条目」) */
|
|
31
|
+
title: string
|
|
32
|
+
/** 正文说明(可选;限高 240px 内滚,长文本安全) */
|
|
33
|
+
message?: string
|
|
34
|
+
/** 确认按钮文案(缺省「确认」由调用方传,不设默认避免硬编码) */
|
|
35
|
+
confirmLabel?: string
|
|
36
|
+
/** 取消按钮文案(缺省同 confirmLabel 场景由调用方传;不设默认) */
|
|
37
|
+
cancelLabel?: string
|
|
38
|
+
/** 危险语义:确认按钮用 danger 样式(删除等不可恢复操作);缺省 primary */
|
|
39
|
+
danger?: boolean
|
|
40
|
+
/** 外部控制 busy(进行中禁闭);onConfirm 返回 Promise 时组件自管 */
|
|
41
|
+
busy?: boolean
|
|
42
|
+
/** 确认回调(返回 Promise 时组件自管 busy 直到完成/失败) */
|
|
43
|
+
onConfirm: () => void | Promise<void>
|
|
44
|
+
/** 取消/关闭回调 */
|
|
45
|
+
onCancel: () => void
|
|
46
|
+
/** 额外内容(可选;渲染在 message 之后、按钮区之前) */
|
|
47
|
+
children?: ReactNode
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/**
|
|
51
|
+
* 确认弹窗:遮罩 + 居中卡片 + 标题/正文/按钮区。
|
|
52
|
+
* 自管 busy:onConfirm 返回 Promise 时置 busy 直到 resolve(reject 仍关闭 busy,错误由调用方处理)。
|
|
53
|
+
*/
|
|
54
|
+
export function ConfirmDialog({
|
|
55
|
+
open, title, message, confirmLabel, cancelLabel, danger, busy: busyProp, onConfirm, onCancel, children,
|
|
56
|
+
}: ConfirmDialogProps) {
|
|
57
|
+
const [selfBusy, setSelfBusy] = useState(false)
|
|
58
|
+
const busy = busyProp === true || selfBusy
|
|
59
|
+
/** open 前的活动元素(关闭后还原焦点) */
|
|
60
|
+
const prevFocus = useRef<Element | null>(null)
|
|
61
|
+
/** 取消按钮 ref(初始焦点) */
|
|
62
|
+
const cancelRef = useRef<HTMLButtonElement | null>(null)
|
|
63
|
+
|
|
64
|
+
// 打开时记录触发元素 + 焦点落到取消按钮;关闭时还原焦点
|
|
65
|
+
useEffect(() => {
|
|
66
|
+
if (open) {
|
|
67
|
+
prevFocus.current = document.activeElement
|
|
68
|
+
// 下一帧聚焦取消按钮(等渲染完成)
|
|
69
|
+
requestAnimationFrame(() => { cancelRef.current?.focus() })
|
|
70
|
+
return
|
|
71
|
+
}
|
|
72
|
+
if (prevFocus.current !== null && prevFocus.current instanceof HTMLElement) {
|
|
73
|
+
prevFocus.current.focus()
|
|
74
|
+
prevFocus.current = null
|
|
75
|
+
}
|
|
76
|
+
}, [open])
|
|
77
|
+
|
|
78
|
+
// Esc 关闭(busy 时禁用)
|
|
79
|
+
useEffect(() => {
|
|
80
|
+
if (!open || busy) return
|
|
81
|
+
const onKey = (e: KeyboardEvent): void => {
|
|
82
|
+
if (e.key === 'Escape') onCancel()
|
|
83
|
+
}
|
|
84
|
+
window.addEventListener('keydown', onKey)
|
|
85
|
+
return () => { window.removeEventListener('keydown', onKey) }
|
|
86
|
+
}, [open, busy, onCancel])
|
|
87
|
+
|
|
88
|
+
if (!open) return null
|
|
89
|
+
|
|
90
|
+
const handleConfirm = (): void => {
|
|
91
|
+
if (busy) return
|
|
92
|
+
const result = onConfirm()
|
|
93
|
+
if (result instanceof Promise) {
|
|
94
|
+
setSelfBusy(true)
|
|
95
|
+
void result.finally(() => { setSelfBusy(false) })
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return (
|
|
100
|
+
<div
|
|
101
|
+
className={css.dialogMask}
|
|
102
|
+
onMouseDown={(e) => {
|
|
103
|
+
// 仅遮罩自身点击关闭(目标 === 当前遮罩,卡片内的点击不冒泡关闭)
|
|
104
|
+
if (e.target === e.currentTarget && !busy) onCancel()
|
|
105
|
+
}}
|
|
106
|
+
>
|
|
107
|
+
<div className={css.dialogCard} role="dialog" aria-modal="true" aria-label={title}>
|
|
108
|
+
<div className={css.dialogHeader}>{title}</div>
|
|
109
|
+
<div className={css.dialogBody}>
|
|
110
|
+
{message !== undefined && message !== '' && <div>{message}</div>}
|
|
111
|
+
{children}
|
|
112
|
+
</div>
|
|
113
|
+
<div className={css.actionRow}>
|
|
114
|
+
<Button
|
|
115
|
+
variant={danger === true ? 'danger' : 'primary'}
|
|
116
|
+
disabled={busy}
|
|
117
|
+
onClick={() => { void handleConfirm() }}
|
|
118
|
+
>
|
|
119
|
+
{busy ? '…' : (confirmLabel ?? '')}
|
|
120
|
+
</Button>
|
|
121
|
+
{/* 取消按钮用原生 button + ghostButton 类(样式与 Button ghost 一致),以便 ref 聚焦 */}
|
|
122
|
+
<button
|
|
123
|
+
ref={cancelRef}
|
|
124
|
+
type="button"
|
|
125
|
+
className={css.ghostButton}
|
|
126
|
+
disabled={busy}
|
|
127
|
+
onClick={onCancel}
|
|
128
|
+
>
|
|
129
|
+
{cancelLabel ?? ''}
|
|
130
|
+
</button>
|
|
131
|
+
</div>
|
|
132
|
+
</div>
|
|
133
|
+
</div>
|
|
134
|
+
)
|
|
135
|
+
}
|
|
@@ -237,6 +237,16 @@
|
|
|
237
237
|
|
|
238
238
|
/* ---------------- 表单 ---------------- */
|
|
239
239
|
|
|
240
|
+
/* 向导卡片(一键上传 / 更新配置共用):元素密集,间距比普通卡片略宽
|
|
241
|
+
(卡片内 10→14px、字段内 5→8px;取值见 DESIGN.md §4.2 spacing scale) */
|
|
242
|
+
.wizardCard {
|
|
243
|
+
gap: 14px;
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
.wizardCard .field {
|
|
247
|
+
gap: 8px;
|
|
248
|
+
}
|
|
249
|
+
|
|
240
250
|
.field {
|
|
241
251
|
display: flex;
|
|
242
252
|
flex-direction: column;
|
|
@@ -998,3 +1008,94 @@
|
|
|
998
1008
|
.aboutAuthor:hover {
|
|
999
1009
|
background: var(--dsw-alias-interactive-bg-hover);
|
|
1000
1010
|
}
|
|
1011
|
+
|
|
1012
|
+
/* ---------------- 确认弹窗 ConfirmDialog(DESIGN.md §8.11;项目首个 fixed/z-index 浮动层,
|
|
1013
|
+
§15 Anti-pattern #7 已登记豁免,z-index 100) ---------------- */
|
|
1014
|
+
|
|
1015
|
+
/* 遮罩:全屏 fixed + 半透明背景(color-mix 调 token,禁硬编码 rgba);
|
|
1016
|
+
点击遮罩(非卡片)关闭由组件判断 e.target===currentTarget */
|
|
1017
|
+
.dialogMask {
|
|
1018
|
+
position: fixed;
|
|
1019
|
+
inset: 0;
|
|
1020
|
+
z-index: 100;
|
|
1021
|
+
display: flex;
|
|
1022
|
+
align-items: center;
|
|
1023
|
+
justify-content: center;
|
|
1024
|
+
background: color-mix(in srgb, var(--dsw-alias-bg-base) 55%, transparent);
|
|
1025
|
+
padding: 20px;
|
|
1026
|
+
}
|
|
1027
|
+
|
|
1028
|
+
/* 卡片:与 .card 同 token 体系(bg-layer-2 + border-l1 + radius10),限宽 420px */
|
|
1029
|
+
.dialogCard {
|
|
1030
|
+
display: flex;
|
|
1031
|
+
flex-direction: column;
|
|
1032
|
+
gap: 10px;
|
|
1033
|
+
width: min(420px, 100%);
|
|
1034
|
+
max-height: 80vh;
|
|
1035
|
+
padding: 14px;
|
|
1036
|
+
background: var(--dsw-alias-bg-layer-2);
|
|
1037
|
+
border: 1px solid var(--dsw-alias-border-l1);
|
|
1038
|
+
border-radius: 10px;
|
|
1039
|
+
box-shadow: 0 8px 24px color-mix(in srgb, var(--dsw-alias-bg-base) 40%, transparent);
|
|
1040
|
+
}
|
|
1041
|
+
|
|
1042
|
+
/* 标题:与 .groupLabel 同视觉层级 */
|
|
1043
|
+
.dialogHeader {
|
|
1044
|
+
font-size: 14px;
|
|
1045
|
+
font-weight: 600;
|
|
1046
|
+
color: var(--dsw-alias-label-primary);
|
|
1047
|
+
}
|
|
1048
|
+
|
|
1049
|
+
/* 正文:限高内滚(长 message 安全,仿 .confirmScroll 模式) */
|
|
1050
|
+
.dialogBody {
|
|
1051
|
+
max-height: 240px;
|
|
1052
|
+
overflow-y: auto;
|
|
1053
|
+
overscroll-behavior: contain;
|
|
1054
|
+
font-size: 13px;
|
|
1055
|
+
line-height: 1.6;
|
|
1056
|
+
color: var(--dsw-alias-label-primary);
|
|
1057
|
+
white-space: pre-wrap;
|
|
1058
|
+
}
|
|
1059
|
+
|
|
1060
|
+
/* ---------------- 操作弹窗(2026-08-21:上传/下载/装回本地搬进弹窗,DESIGN.md §8.12) ---------------- */
|
|
1061
|
+
|
|
1062
|
+
/* 宽版卡片:与 .dialogCard 同 token 体系,放宽到 560px(表单/详情内容更长) */
|
|
1063
|
+
.dialogWide {
|
|
1064
|
+
width: min(560px, 100%);
|
|
1065
|
+
}
|
|
1066
|
+
|
|
1067
|
+
/* 弹窗正文(操作弹窗用):70vh 限高内滚(详情/表单长内容安全,替代 240px 的短版) */
|
|
1068
|
+
.dialogBodyScroll {
|
|
1069
|
+
max-height: 70vh;
|
|
1070
|
+
overflow-y: auto;
|
|
1071
|
+
overscroll-behavior: contain;
|
|
1072
|
+
font-size: 13px;
|
|
1073
|
+
line-height: 1.6;
|
|
1074
|
+
color: var(--dsw-alias-label-primary);
|
|
1075
|
+
white-space: normal;
|
|
1076
|
+
}
|
|
1077
|
+
|
|
1078
|
+
/* 弹窗头部行:标题 + 关闭按钮(操作弹窗) */
|
|
1079
|
+
.dialogHeaderRow {
|
|
1080
|
+
display: flex;
|
|
1081
|
+
align-items: center;
|
|
1082
|
+
justify-content: space-between;
|
|
1083
|
+
gap: 10px;
|
|
1084
|
+
}
|
|
1085
|
+
|
|
1086
|
+
/* 弹窗关闭按钮(×):ghost 语义、紧凑 */
|
|
1087
|
+
.dialogClose {
|
|
1088
|
+
background: none;
|
|
1089
|
+
border: none;
|
|
1090
|
+
padding: 2px 8px;
|
|
1091
|
+
font-size: 16px;
|
|
1092
|
+
line-height: 1;
|
|
1093
|
+
color: var(--dsw-alias-label-secondary);
|
|
1094
|
+
cursor: pointer;
|
|
1095
|
+
border-radius: 6px;
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
.dialogClose:hover {
|
|
1099
|
+
color: var(--dsw-alias-label-primary);
|
|
1100
|
+
background: var(--dsw-alias-bg-hover);
|
|
1101
|
+
}
|