@xrxs-ai/dsh-xrxs-plugins-store 0.1.44 → 0.2.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/lib/client.js CHANGED
@@ -169,38 +169,19 @@ function metaPayload(meta) {
169
169
  }
170
170
  return payload;
171
171
  }
172
- function buildForm(meta, files) {
173
- const form = new FormData();
174
- form.append("data", JSON.stringify(metaPayload(meta)));
175
- form.append("file", files.artifact);
176
- form.append("sourceArchive", files.sourceArchive);
177
- return form;
178
- }
179
172
  function getMyPlugin(key) {
180
173
  return hostGet(pluginPath(key));
181
174
  }
182
- function submitPlugin(meta, files) {
183
- return hostForm(BASE, buildForm(meta, files));
184
- }
185
- function submitVersion(key, meta, files) {
186
- return hostForm(`${pluginPath(key)}/versions`, buildForm(meta, files));
187
- }
188
- function resubmitVersion(key, version, meta, files) {
189
- return hostForm(`${versionPath(key, version)}/resubmit`, buildForm(meta, files));
190
- }
191
175
  function submitPackage(target, meta, payload) {
192
176
  const form = new FormData();
193
177
  form.append("data", JSON.stringify(metaPayload(meta)));
194
178
  form.append("target", JSON.stringify(target));
195
179
  form.append("mode", payload.mode);
196
- if (payload.mode === "dir") {
197
- form.append("artifactName", payload.artifactName);
198
- for (const item of payload.files) {
199
- form.append("f", item.file, encodeURIComponent(item.path));
200
- }
201
- } else {
202
- form.append("archive", payload.archive);
180
+ form.append("artifactName", payload.artifactName);
181
+ for (const item of payload.files) {
182
+ form.append("f", item.file, encodeURIComponent(item.path));
203
183
  }
184
+ if (payload.artifact !== void 0) form.append("artifact", payload.artifact);
204
185
  return hostForm("/api/developer/submit-package", form);
205
186
  }
206
187
  function withdrawVersion(key, version) {
@@ -1074,7 +1055,36 @@ var MARKET_CSS = `
1074
1055
  .xps-md-h3 { font-size: 14px; line-height: 22px; font-weight: 500; margin: 14px 0 6px; }
1075
1056
  .xps-md-h4 { font-size: 13px; line-height: 20px; font-weight: 500; margin: 12px 0 6px; }
1076
1057
  .xps-md-p { margin: 8px 0; }
1077
- .xps-md-ul { margin: 8px 0; padding-left: 20px; }
1058
+ .xps-md-ul, .xps-md-ol { margin: 8px 0; padding-left: 20px; }
1059
+ .xps-md-ol { list-style: decimal; }
1060
+ .xps-md-ul li::marker, .xps-md-ol li::marker { color: var(--dsw-alias-text-tertiary, #6b6f76); }
1061
+ .xps-md-quote {
1062
+ margin: 8px 0; padding: 2px 12px;
1063
+ border-left: 3px solid var(--dsw-alias-border-l2, #dee0e3);
1064
+ color: var(--dsw-alias-label-secondary, #4e5460);
1065
+ }
1066
+ .xps-md-quote p { margin: 6px 0; }
1067
+ .xps-md-hr {
1068
+ border: 0; height: 0.5px; margin: 14px 0;
1069
+ background: var(--dsw-alias-border-l2, #dee0e3);
1070
+ }
1071
+ .xps-md-link {
1072
+ color: var(--dsw-alias-brand-primary, #3370ff);
1073
+ cursor: pointer; text-decoration: none;
1074
+ }
1075
+ .xps-md-link:hover { text-decoration: underline; }
1076
+ .xps-md-table-wrap { margin: 8px 0; overflow-x: auto; }
1077
+ .xps-md-table {
1078
+ border-collapse: collapse; width: 100%; font-size: 12px; line-height: 1.6;
1079
+ }
1080
+ .xps-md-table th, .xps-md-table td {
1081
+ border: 0.5px solid var(--dsw-alias-border-l2, #dee0e3);
1082
+ padding: 6px 10px; vertical-align: top;
1083
+ }
1084
+ .xps-md-table th {
1085
+ font-weight: 500;
1086
+ background: var(--dsw-alias-bg-layer-2, #f5f6f7);
1087
+ }
1078
1088
  .xps-md-pre {
1079
1089
  margin: 8px 0; padding: 10px 12px; border-radius: 8px; overflow: auto;
1080
1090
  background: var(--dsw-alias-bg-layer-2, #f5f6f7);
@@ -1116,9 +1126,13 @@ function ensureMarketStyles() {
1116
1126
  var import_react3 = require("react");
1117
1127
  var import_jsx_runtime10 = require("react/jsx-runtime");
1118
1128
  var MAX_ARTIFACT_BYTES = 50 * 1024 * 1024;
1119
- var MAX_SOURCE_BYTES = 100 * 1024 * 1024;
1120
- var SIZE_LIMIT_TEXT = "\u6587\u4EF6\u8D85\u51FA\u5927\u5C0F\u9650\u5236(\u4EA7\u7269 \u2264 50MB,\u6E90\u7801 \u2264 100MB)";
1121
1129
  var VERSION_PATTERN = /^\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?$/;
1130
+ var FLOW_STEPS = [
1131
+ { no: "1", title: "\u9009\u62E9\u4EE3\u7801\u76EE\u5F55", desc: "\u5305\u540D / \u7248\u672C / \u63CF\u8FF0 / \u4F5C\u8005\u4ECE package.json \u81EA\u52A8\u8BFB\u53D6\u586B\u5145" },
1132
+ { no: "2", title: "README \u81EA\u52A8\u5E26\u5165", desc: "\u76EE\u5F55\u6839\u7684 README.md \u4F5C\u4E3A\u5E02\u573A\u8BE6\u60C5\u9875,\u652F\u6301 markdown \u6E32\u67D3" },
1133
+ { no: "3", title: "\u786E\u8BA4\u4EA7\u7269\u5305", desc: "\u81EA\u52A8\u8BC6\u522B\u76EE\u5F55\u91CC\u7684 *.tgz;\u6CA1\u6709\u65F6\u70B9\u300C\u8865\u9009\u4EA7\u7269\u5305\u300D\u5355\u72EC\u9009\u62E9" },
1134
+ { no: "4", title: "\u586B\u5199\u4FE1\u606F,\u63D0\u4EA4\u5BA1\u6838", desc: "\u6E90\u7801\u5305\u7531\u76EE\u5F55\u81EA\u52A8\u6253\u5305;\u5BA1\u6838\u901A\u8FC7\u5373\u4E0A\u67B6\u5E02\u573A" }
1135
+ ];
1122
1136
  var secondaryText = {
1123
1137
  fontSize: 12,
1124
1138
  lineHeight: "18px",
@@ -1144,17 +1158,6 @@ function isTgz(name) {
1144
1158
  function isZipName(name) {
1145
1159
  return name.toLowerCase().endsWith(".zip");
1146
1160
  }
1147
- async function looksLikeZip(file) {
1148
- if (!isZipName(file.name)) return false;
1149
- try {
1150
- const head = new Uint8Array(await file.slice(0, 4).arrayBuffer());
1151
- if (head.length < 4) return false;
1152
- const third = head[2];
1153
- return head[0] === 80 && head[1] === 75 && (third === 3 || third === 5 || third === 7);
1154
- } catch {
1155
- return true;
1156
- }
1157
- }
1158
1161
  function parseArtifactName(fileName) {
1159
1162
  const base = fileName.replace(/\.tgz$/i, "");
1160
1163
  const match = /^(?<pkg>.+)-(?<ver>\d+\.\d+\.\d+(?:[-+][0-9A-Za-z.-]+)?)$/.exec(base);
@@ -1202,16 +1205,26 @@ async function readPackageJson(files) {
1202
1205
  return null;
1203
1206
  }
1204
1207
  }
1208
+ async function readReadme(files) {
1209
+ const root = sourceRootDirs(files.map((item) => item.path))[0];
1210
+ if (root === void 0) return void 0;
1211
+ const prefix = root === "" ? "" : `${root}/`;
1212
+ const entry = files.find(
1213
+ (item) => item.path.startsWith(prefix) && /^readme\.md$/i.test(item.path.slice(prefix.length))
1214
+ );
1215
+ if (entry === void 0) return void 0;
1216
+ try {
1217
+ const text = await entry.file.text();
1218
+ return text.trim() === "" ? void 0 : text;
1219
+ } catch {
1220
+ return void 0;
1221
+ }
1222
+ }
1205
1223
  function directoryWarning(paths) {
1206
1224
  if (paths.length === 0) return null;
1207
1225
  const root = sourceRootDirs(paths)[0];
1208
1226
  if (root === void 0) {
1209
- return "\u6240\u9009\u76EE\u5F55\u4E0B\u672A\u627E\u5230\u542B package.json \u7684\u76EE\u5F55;\u82E5\u6E90\u7801\u5F52\u6863\u7531\u300C\u624B\u52A8\u8865\u9009\u6E90\u7801\u5F52\u6863\u300D\u5355\u72EC\u9009\u62E9,\u53EF\u5FFD\u7565\u6B64\u63D0\u793A";
1210
- }
1211
- const scope = root === "" ? paths : paths.filter((path) => path.startsWith(`${root}/`));
1212
- if (scope.some((path) => /(^|\/)node_modules\//.test(path))) {
1213
- const where = root === "" ? "\u6240\u9009\u76EE\u5F55" : `\u6240\u9009\u76EE\u5F55\u7684 ${root}`;
1214
- return `\u26A0\uFE0F ${where} \u4E0B\u5305\u542B node_modules,\u6E90\u7801\u5F52\u6863(zip)\u5FC5\u987B\u5254\u9664,\u5426\u5219\u4F1A\u88AB\u670D\u52A1\u7AEF\u62D2\u6536`;
1227
+ return "\u6240\u9009\u76EE\u5F55\u4E0B\u672A\u627E\u5230\u542B package.json \u7684\u76EE\u5F55,\u8BF7\u786E\u8BA4\u9009\u7684\u662F\u63D2\u4EF6\u4EE3\u7801\u76EE\u5F55";
1215
1228
  }
1216
1229
  return null;
1217
1230
  }
@@ -1276,21 +1289,10 @@ function Labeled(props) {
1276
1289
  props.children
1277
1290
  ] });
1278
1291
  }
1279
- function sendSubmission(target, meta, files) {
1280
- switch (target.kind) {
1281
- case "new":
1282
- return submitPlugin(meta, files);
1283
- case "version":
1284
- return submitVersion(target.key, meta, files);
1285
- case "resubmit":
1286
- return resubmitVersion(target.key, target.version, meta, files);
1287
- }
1288
- }
1289
1292
  function UploadForm(props) {
1290
1293
  const { items, push, dismiss } = useToasts();
1291
1294
  const dirInputRef = (0, import_react3.useRef)(null);
1292
1295
  const artifactInputRef = (0, import_react3.useRef)(null);
1293
- const sourceInputRef = (0, import_react3.useRef)(null);
1294
1296
  const fileInputRef = (0, import_react3.useRef)(null);
1295
1297
  const prefill = props.prefill;
1296
1298
  const versionLocked = props.target.kind === "resubmit";
@@ -1300,13 +1302,9 @@ function UploadForm(props) {
1300
1302
  const [inspectError, setInspectError] = (0, import_react3.useState)(null);
1301
1303
  const [scanWarning, setScanWarning] = (0, import_react3.useState)(null);
1302
1304
  const [scanned, setScanned] = (0, import_react3.useState)(false);
1303
- const [scannedSourceNames, setScannedSourceNames] = (0, import_react3.useState)([]);
1304
1305
  const [artifactCandidates, setArtifactCandidates] = (0, import_react3.useState)([]);
1305
- const [sourceCandidates, setSourceCandidates] = (0, import_react3.useState)([]);
1306
1306
  const [selectedArtifact, setSelectedArtifact] = (0, import_react3.useState)(null);
1307
- const [selectedSource, setSelectedSource] = (0, import_react3.useState)(null);
1308
1307
  const [dirFiles, setDirFiles] = (0, import_react3.useState)([]);
1309
- const [outerZip, setOuterZip] = (0, import_react3.useState)(null);
1310
1308
  const [packageName, setPackageName] = (0, import_react3.useState)(prefill?.packageName ?? "");
1311
1309
  const [pluginKey, setPluginKey] = (0, import_react3.useState)(prefill?.pluginKey ?? "");
1312
1310
  const [displayName, setDisplayName] = (0, import_react3.useState)(prefill?.displayName ?? "");
@@ -1321,6 +1319,12 @@ function UploadForm(props) {
1321
1319
  const [categories, setCategories] = (0, import_react3.useState)([]);
1322
1320
  const [submitting, setSubmitting] = (0, import_react3.useState)(false);
1323
1321
  const [submitError, setSubmitError] = (0, import_react3.useState)(null);
1322
+ const autoFilledRef = (0, import_react3.useRef)({});
1323
+ const scanSeqRef = (0, import_react3.useRef)(0);
1324
+ const setAutoFilled = (key, next, apply2) => {
1325
+ apply2((prev) => prev === "" || prev === autoFilledRef.current[key] ? next : prev);
1326
+ autoFilledRef.current[key] = next;
1327
+ };
1324
1328
  (0, import_react3.useEffect)(() => {
1325
1329
  void getCategories().then((list) => {
1326
1330
  setCategories(list);
@@ -1347,80 +1351,58 @@ function UploadForm(props) {
1347
1351
  if (files.length === 0) return;
1348
1352
  setInspectError(null);
1349
1353
  setSubmitError(null);
1350
- if (files.length === 1) {
1351
- const only = files[0];
1352
- if (only !== void 0 && isZipName(only.file.name) && !isTgz(only.file.name)) {
1353
- setOuterZip(only.file);
1354
- setDirFiles([]);
1355
- setArtifactCandidates([]);
1356
- setSourceCandidates([]);
1357
- setSelectedArtifact(null);
1358
- setSelectedSource(null);
1359
- setScanned(false);
1360
- setScanWarning(null);
1361
- return;
1362
- }
1363
- }
1364
- setOuterZip(null);
1354
+ const scanId = ++scanSeqRef.current;
1365
1355
  setDirFiles(files);
1366
1356
  setScanWarning(directoryWarning(files.map((item) => item.path)));
1367
- const artifacts = files.filter((item) => isTgz(item.file.name));
1368
- const sources = files.filter((item) => isZipName(item.file.name));
1369
- setArtifactCandidates(artifacts);
1370
- setSourceCandidates(sources);
1371
- setScannedSourceNames(sources.map((item) => item.path));
1357
+ const artifacts = files.filter((item) => isTgz(item.file.name) && !JUNK_PATH.test(item.path));
1372
1358
  setScanned(true);
1373
1359
  const firstArtifact = artifacts[0];
1374
1360
  if (firstArtifact === void 0) {
1375
- setSelectedArtifact(null);
1376
- setInspectError(
1377
- "\u672A\u5728\u76EE\u5F55\u4E2D\u8BC6\u522B\u5230\u4EA7\u7269\u5305(*.tgz)\u3002\u53EF\u70B9\u51FB\u300C\u624B\u52A8\u8865\u9009\u4EA7\u7269\u5305\u300D\u5355\u72EC\u9009\u62E9\u6587\u4EF6\u3002"
1378
- );
1361
+ if (artifactCandidates.length === 0) {
1362
+ setInspectError("\u672A\u5728\u76EE\u5F55\u4E2D\u8BC6\u522B\u5230\u4EA7\u7269\u5305(*.tgz)\u3002\u53EF\u70B9\u51FB\u300C\u8865\u9009\u4EA7\u7269\u5305\u300D\u5355\u72EC\u9009\u62E9\u6587\u4EF6\u3002");
1363
+ }
1379
1364
  } else {
1365
+ setArtifactCandidates(artifacts);
1380
1366
  setSelectedArtifact(firstArtifact.path);
1381
- void readPackageJson(files).then((pkg) => {
1367
+ void readPackageJson(files).then(async (pkg) => ({ pkg, readme: await readReadme(files) })).then(({ pkg, readme }) => {
1368
+ if (scanId !== scanSeqRef.current) return;
1382
1369
  const name = pkg?.name;
1383
1370
  const ver = pkg?.version;
1384
1371
  if (name === void 0 && ver === void 0) {
1385
1372
  applyParsedName(firstArtifact.file.name);
1386
1373
  } else {
1387
- if (name !== void 0) setPackageName((prev) => prev === "" ? name : prev);
1388
- if (ver !== void 0) setVersion((prev) => prev === "" ? ver : prev);
1374
+ if (name !== void 0) setAutoFilled("packageName", name, setPackageName);
1375
+ if (ver !== void 0) setAutoFilled("version", ver, setVersion);
1389
1376
  }
1390
1377
  const summaryText = pkg?.description;
1391
- if (summaryText !== void 0) setSummary((prev) => prev === "" ? summaryText : prev);
1378
+ if (summaryText !== void 0) setAutoFilled("summary", summaryText, setSummary);
1392
1379
  const authorText = pkg?.author;
1393
- if (authorText !== void 0) setAuthor((prev) => prev === "" ? authorText : prev);
1380
+ if (authorText !== void 0) setAutoFilled("author", authorText, setAuthor);
1381
+ if (readme !== void 0) setAutoFilled("description", readme, setDescription);
1394
1382
  });
1395
1383
  }
1396
- const preferredSource = sources.find(
1397
- (item) => /src|source/i.test(item.file.name) && item.path !== firstArtifact?.path
1398
- ) ?? sources.find((item) => item.path !== firstArtifact?.path);
1399
- setSelectedSource(preferredSource?.path ?? null);
1384
+ };
1385
+ const invalidatePendingScan = () => {
1386
+ scanSeqRef.current += 1;
1400
1387
  };
1401
1388
  const handleFilesPicked = (files) => {
1402
1389
  if (files.length === 0) return;
1403
1390
  if (files.length === 1) {
1404
1391
  const only = files[0];
1405
1392
  if (only !== void 0 && isZipName(only.file.name)) {
1406
- setOuterZip(only.file);
1393
+ invalidatePendingScan();
1407
1394
  setDirFiles([]);
1408
1395
  setArtifactCandidates([]);
1409
- setSourceCandidates([]);
1410
1396
  setSelectedArtifact(null);
1411
- setSelectedSource(null);
1412
1397
  setScanned(false);
1413
- setInspectError(null);
1398
+ setInspectError("\u4E0D\u652F\u6301\u76F4\u63A5\u4E0A\u4F20 zip:\u8BF7\u9009\u62E9\u63D2\u4EF6\u4EE3\u7801\u76EE\u5F55(\u5185\u542B tgz \u4EA7\u7269\u5305),\u6216\u5148\u9009\u76EE\u5F55\u518D\u8865\u9009\u4EA7\u7269\u5305");
1414
1399
  setScanWarning(null);
1415
1400
  setSubmitError(null);
1416
1401
  return;
1417
1402
  }
1418
1403
  if (only !== void 0 && isTgz(only.file.name)) {
1419
- setOuterZip(null);
1404
+ invalidatePendingScan();
1420
1405
  setDirFiles([]);
1421
- setSourceCandidates([]);
1422
- setSelectedSource(null);
1423
- setScannedSourceNames([]);
1424
1406
  setArtifactCandidates([{ file: only.file, path: only.file.name }]);
1425
1407
  setSelectedArtifact(only.file.name);
1426
1408
  setScanned(true);
@@ -1431,6 +1413,19 @@ function UploadForm(props) {
1431
1413
  return;
1432
1414
  }
1433
1415
  }
1416
+ if (files.every((item) => isTgz(item.file.name))) {
1417
+ invalidatePendingScan();
1418
+ setDirFiles([]);
1419
+ setArtifactCandidates(files);
1420
+ setSelectedArtifact(files[0]?.path ?? null);
1421
+ setScanned(true);
1422
+ setInspectError(null);
1423
+ setScanWarning(null);
1424
+ setSubmitError(null);
1425
+ const first = files[0];
1426
+ if (first !== void 0) applyParsedName(first.file.name);
1427
+ return;
1428
+ }
1434
1429
  inspectFiles(files);
1435
1430
  };
1436
1431
  const handleFilePicked = (fileList) => {
@@ -1440,8 +1435,8 @@ function UploadForm(props) {
1440
1435
  const applyParsedName = (fileName) => {
1441
1436
  const parsed = parseArtifactName(fileName);
1442
1437
  if (parsed === null) return;
1443
- setPackageName((prev) => prev === "" ? parsed.name : prev);
1444
- setVersion((prev) => prev === "" ? parsed.version : prev);
1438
+ setAutoFilled("packageName", parsed.name, setPackageName);
1439
+ setAutoFilled("version", parsed.version, setVersion);
1445
1440
  };
1446
1441
  const handleDirPicked = (fileList) => {
1447
1442
  if (fileList === null || fileList.length === 0) return;
@@ -1457,6 +1452,15 @@ function UploadForm(props) {
1457
1452
  const handleArtifactPicked = (fileList) => {
1458
1453
  const file = fileList?.[0];
1459
1454
  if (file === void 0) return;
1455
+ if (!isTgz(file.name)) {
1456
+ push("error", "\u4EA7\u7269\u5305\u5FC5\u987B\u662F .tgz(npm pack \u4EA7\u51FA),\u8BF7\u91CD\u65B0\u9009\u62E9");
1457
+ return;
1458
+ }
1459
+ if (dirFiles.some((item) => isTgz(item.file.name) && !JUNK_PATH.test(item.path))) {
1460
+ push("error", "\u4EE3\u7801\u76EE\u5F55\u91CC\u5DF2\u7ECF\u6709 .tgz \u4EA7\u7269\u5305,\u63D0\u4EA4\u65F6\u4F1A\u4EE5\u76EE\u5F55\u5185\u7684\u4E3A\u51C6;\u5982\u9700\u66F4\u6362,\u8BF7\u91CD\u65B0\u9009\u62E9\u4E0D\u542B\u4EA7\u7269\u5305\u7684\u76EE\u5F55");
1461
+ return;
1462
+ }
1463
+ invalidatePendingScan();
1460
1464
  setArtifactCandidates(
1461
1465
  (prev) => prev.some((item) => item.path === file.name) ? prev : [...prev, { file, path: file.name }]
1462
1466
  );
@@ -1466,24 +1470,9 @@ function UploadForm(props) {
1466
1470
  setScanned(true);
1467
1471
  applyParsedName(file.name);
1468
1472
  };
1469
- const handleSourcePicked = (fileList) => {
1470
- const file = fileList?.[0];
1471
- if (file === void 0) return;
1472
- if (!isZipName(file.name)) {
1473
- push("error", "\u6E90\u7801\u5F52\u6863\u5FC5\u987B\u662F zip");
1474
- return;
1475
- }
1476
- setSourceCandidates(
1477
- (prev) => prev.some((item) => item.path === file.name) ? prev : [...prev, { file, path: file.name }]
1478
- );
1479
- setSelectedSource(file.name);
1480
- setSubmitError(null);
1481
- setScanned(true);
1482
- };
1483
1473
  const handleSubmit = async () => {
1484
1474
  if (submitting) return;
1485
1475
  const artifact = artifactCandidates.find((item) => item.path === selectedArtifact)?.file;
1486
- const sourceArchive = sourceCandidates.find((item) => item.path === selectedSource)?.file;
1487
1476
  if (packageName.trim() === "") {
1488
1477
  push("error", "\u8BF7\u586B\u5199\u5305\u540D(\u5982 @xrxs-ai/dsh-xrxs-xxx)");
1489
1478
  return;
@@ -1519,34 +1508,16 @@ function UploadForm(props) {
1519
1508
  compatRange: compatRange.trim(),
1520
1509
  changelog: changelog.trim()
1521
1510
  };
1522
- if (outerZip !== null) {
1523
- const detail2 = await submitPackage(props.target, meta, { mode: "zip", archive: outerZip });
1524
- props.onSubmitted(detail2);
1525
- return;
1526
- }
1527
1511
  if (artifact === void 0) {
1528
1512
  push("error", "\u5FC5\u987B\u4E0A\u4F20\u4EA7\u7269\u5305(.tgz)");
1529
1513
  return;
1530
1514
  }
1531
1515
  if (artifact.size > MAX_ARTIFACT_BYTES) {
1532
- push("error", SIZE_LIMIT_TEXT);
1533
- return;
1534
- }
1535
- if (sourceArchive !== void 0) {
1536
- if (sourceArchive.size > MAX_SOURCE_BYTES) {
1537
- push("error", SIZE_LIMIT_TEXT);
1538
- return;
1539
- }
1540
- if (!await looksLikeZip(sourceArchive)) {
1541
- push("error", "\u6E90\u7801\u5F52\u6863\u5FC5\u987B\u662F zip");
1542
- return;
1543
- }
1544
- const detail2 = await sendSubmission(props.target, meta, { artifact, sourceArchive });
1545
- props.onSubmitted(detail2);
1516
+ push("error", "\u4EA7\u7269\u5305\u8D85\u51FA\u5927\u5C0F\u9650\u5236(\u2264 50MB)");
1546
1517
  return;
1547
1518
  }
1548
1519
  if (dirFiles.length === 0) {
1549
- push("error", "\u8FD8\u7F3A\u6E90\u7801\u5F52\u6863:\u8BF7\u624B\u52A8\u8865\u9009 zip,\u6216\u6539\u9009\u5305\u542B tgz \u7684\u4EE3\u7801\u76EE\u5F55 / \u4EE3\u7801 zip \u5305");
1520
+ push("error", "\u8FD8\u7F3A\u4EE3\u7801\u76EE\u5F55:\u8BF7\u9009\u62E9\u63D2\u4EF6\u4EE3\u7801\u76EE\u5F55,\u6E90\u7801\u5305\u5C06\u7531\u8BE5\u76EE\u5F55\u81EA\u52A8\u6253\u5305");
1550
1521
  return;
1551
1522
  }
1552
1523
  const payloadFiles = dirFiles.filter((item) => !JUNK_PATH.test(item.path));
@@ -1558,15 +1529,22 @@ function UploadForm(props) {
1558
1529
  push("error", `\u76EE\u5F55\u6587\u4EF6\u6570\u8D85\u51FA\u4E0A\u9650(${String(MAX_UPLOAD_FILES)}),\u8BF7\u786E\u8BA4\u9009\u7684\u662F\u63D2\u4EF6\u4EE3\u7801\u76EE\u5F55\u800C\u975E workspace \u6839\u76EE\u5F55`);
1559
1530
  return;
1560
1531
  }
1561
- const totalBytes = payloadFiles.reduce((sum, item) => sum + item.file.size, 0);
1532
+ const artifactOutside = artifact !== void 0 && !dirFiles.some((item) => item.file === artifact) ? artifact.size : 0;
1533
+ const totalBytes = payloadFiles.reduce((sum, item) => sum + item.file.size, 0) + artifactOutside;
1562
1534
  if (totalBytes > MAX_UPLOAD_BYTES) {
1563
- push("error", `\u76EE\u5F55\u5185\u5BB9\u8D85\u51FA\u4E0A\u9650(${formatSize(MAX_UPLOAD_BYTES)}),\u8BF7\u5254\u9664\u5927\u6587\u4EF6\u540E\u91CD\u8BD5`);
1535
+ push(
1536
+ "error",
1537
+ `\u4E0A\u4F20\u5185\u5BB9\u8D85\u51FA\u4E0A\u9650(${formatSize(MAX_UPLOAD_BYTES)}):\u76EE\u5F55${artifactOutside > 0 ? " + \u4EA7\u7269\u5305" : ""}\u5171 ${formatSize(totalBytes)},\u8BF7\u5254\u9664\u5927\u6587\u4EF6\u540E\u91CD\u8BD5`
1538
+ );
1564
1539
  return;
1565
1540
  }
1566
1541
  const detail = await submitPackage(props.target, meta, {
1567
1542
  mode: "dir",
1568
1543
  files: payloadFiles.map((item) => ({ path: item.path, file: item.file })),
1569
- artifactName: selectedArtifact ?? ""
1544
+ artifactName: selectedArtifact ?? "",
1545
+ // 「补选产物包」选的 tgz 不在目录树里(dirFiles 是目录扫描结果),单独作为 artifact
1546
+ // 字段上送;host 在树内找不到 tgz 时落盘它兜底
1547
+ ...dirFiles.some((item) => item.file === artifact) ? {} : { artifact }
1570
1548
  });
1571
1549
  props.onSubmitted(detail);
1572
1550
  } catch (error) {
@@ -1575,115 +1553,86 @@ function UploadForm(props) {
1575
1553
  setSubmitting(false);
1576
1554
  }
1577
1555
  };
1578
- const sourceIsManualPick = selectedSource !== null && !scannedSourceNames.includes(selectedSource);
1579
- const sourceNotice = sourceIsManualPick && outerZip === null ? "\u5DF2\u9009\u538B\u7F29\u5305\u672A\u505A\u76EE\u5F55\u9884\u68C0,\u7ED3\u6784\u6027\u9519\u8BEF\u5C06\u7531\u670D\u52A1\u7AEF\u8FD4\u56DE" : outerZip !== null ? "\u5C06\u4E0A\u4F20\u6574\u4E2A\u538B\u7F29\u5305\u4F5C\u4E3A\u6E90\u7801\u5F52\u6863,\u5E76\u4ECE\u4E2D\u63D0\u53D6 *.tgz \u4F5C\u4E3A\u4EA7\u7269\u5305" : scanned && selectedSource === null ? dirFiles.length > 0 ? "\u76EE\u5F55\u91CC\u6CA1\u6709\u6E90\u7801\u5F52\u6863 zip:\u63D0\u4EA4\u65F6\u5C06\u81EA\u52A8\u628A\u6574\u4E2A\u76EE\u5F55\u6253\u5305\u4E3A\u6E90\u7801\u4E0A\u4F20(\u8BF7\u786E\u8BA4\u5DF2\u5254\u9664 node_modules)" : "\u4EA7\u7269\u5305\u5DF2\u9009;\u8FD8\u9700\u63D0\u4F9B\u6E90\u7801\u5F52\u6863 zip(\u624B\u52A8\u8865\u9009),\u6216\u6539\u9009\u5305\u542B tgz \u7684\u4EE3\u7801\u76EE\u5F55 / \u4EE3\u7801 zip \u5305" : scanWarning;
1556
+ const sourceNotice = dirFiles.length > 0 ? scanWarning : scanned ? "\u4EA7\u7269\u5305\u5DF2\u9009;\u8FD8\u9700\u9009\u62E9\u4EE3\u7801\u76EE\u5F55 \u2014\u2014 \u6E90\u7801\u5305\u5C06\u7531\u8BE5\u76EE\u5F55\u81EA\u52A8\u6253\u5305" : null;
1580
1557
  const heading = props.target.kind === "new" ? "\u4E0A\u4F20\u65B0\u63D2\u4EF6" : props.target.kind === "version" ? `\u63D0\u4EA4\u65B0\u7248\u672C${titleName === "" ? "" : ` \xB7 ${titleName}`}` : `\u91CD\u65B0\u63D0\u4EA4 \xB7 ${titleName} v${lockedVersion}`;
1581
1558
  const categoryOptions = category === "" || categories.some((item) => item.id === category) ? categories : [{ id: category, name: category }, ...categories];
1559
+ const dropHandlers = {
1560
+ onClick: () => dirInputRef.current?.click(),
1561
+ onDragOver: (event) => {
1562
+ event.preventDefault();
1563
+ setDragOver(true);
1564
+ },
1565
+ onDragLeave: () => setDragOver(false),
1566
+ onDrop: handleDrop
1567
+ };
1568
+ const dropInner = /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1569
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "xps-up-drop-icon", children: "\u{1F4E6}" }),
1570
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "xps-up-drop-title", children: "\u62D6\u5165\u63D2\u4EF6\u4EE3\u7801\u76EE\u5F55" }),
1571
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: secondaryText, children: "\u76EE\u5F55\u91CC\u5305\u542B tgz \u4EA7\u7269\u5305\u5373\u53EF;\u6CA1\u6709\u7684\u8BDD\u518D\u5355\u72EC\u8865\u9009;\u6E90\u7801\u5305\u7531\u6574\u4E2A\u76EE\u5F55\u81EA\u52A8\u6253\u5305(node_modules / .git \u81EA\u52A8\u5254\u9664)" }),
1572
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "xps-up-drop-actions", onClick: (event) => event.stopPropagation(), children: [
1573
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { size: "small", onClick: () => dirInputRef.current?.click(), children: "\u9009\u62E9\u76EE\u5F55" }),
1574
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { size: "small", variant: "ghost", onClick: () => fileInputRef.current?.click(), children: "\u4EC5\u9009 tgz \u4EA7\u7269\u5305" })
1575
+ ] })
1576
+ ] });
1582
1577
  return /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { children: [
1583
1578
  /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "xps-page-head", children: [
1584
1579
  /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { children: [
1585
1580
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("h1", { className: "xps-page-title", children: heading }),
1586
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "xps-page-intro", children: "\u652F\u6301\u62D6\u5165\u63D2\u4EF6\u4EE3\u7801\u76EE\u5F55(\u5185\u542B tgz)\u3001\u4EE3\u7801 zip \u5305\u6216\u5355\u4E2A tgz \u4EA7\u7269\u5305;\u5305\u540D / \u7248\u672C\u4F1A\u81EA\u52A8\u8BC6\u522B\u586B\u5145" })
1581
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("p", { className: "xps-page-intro", children: "\u9009\u62E9\u63D2\u4EF6\u4EE3\u7801\u76EE\u5F55(\u5185\u542B tgz \u4EA7\u7269\u5305),\u6E90\u7801\u5305\u81EA\u52A8\u6253\u5305;\u5305\u540D / \u7248\u672C\u4F1A\u81EA\u52A8\u8BC6\u522B\u586B\u5145" })
1587
1582
  ] }),
1588
1583
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "xps-page-actions", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { size: "small", onClick: props.onCancel, disabled: submitting, children: "\u8FD4\u56DE\u5217\u8868" }) })
1589
1584
  ] }),
1590
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "xps-up-layout", children: [
1591
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1592
- "div",
1593
- {
1594
- className: `xps-up-drop xps-up-side-drop${dragOver ? " xps-up-drop-over" : ""}`,
1595
- onClick: () => dirInputRef.current?.click(),
1596
- onDragOver: (event) => {
1597
- event.preventDefault();
1598
- setDragOver(true);
1599
- },
1600
- onDragLeave: () => setDragOver(false),
1601
- onDrop: handleDrop,
1602
- children: [
1603
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "xps-up-drop-icon", children: "\u{1F4E6}" }),
1604
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "xps-up-drop-title", children: "\u62D6\u5165\u63D2\u4EF6\u4EE3\u7801\u76EE\u5F55 / \u4EE3\u7801 zip \u5305 / tgz \u4EA7\u7269\u5305" }),
1605
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: secondaryText, children: "\u76EE\u5F55\u91CC\u6709 tgz \u5373\u53EF(zip \u6709\u5C31\u76F4\u4F20,\u6CA1\u6709\u5C06\u81EA\u52A8\u6253\u5305\u6574\u4E2A\u76EE\u5F55);\u4E5F\u53EF\u4EE5\u53EA\u9009\u6587\u4EF6" }),
1606
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "xps-up-drop-actions", onClick: (event) => event.stopPropagation(), children: [
1607
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { size: "small", variant: "ghost", onClick: () => dirInputRef.current?.click(), children: "\u9009\u62E9\u76EE\u5F55" }),
1608
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { size: "small", variant: "ghost", onClick: () => fileInputRef.current?.click(), children: "\u9009\u62E9 zip / tgz \u6587\u4EF6" })
1609
- ] })
1610
- ]
1611
- }
1612
- ),
1613
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1614
- "input",
1615
- {
1616
- ref: dirInputRef,
1617
- type: "file",
1618
- style: { display: "none" },
1619
- ...{ webkitdirectory: "" },
1620
- onChange: (event) => {
1621
- handleDirPicked(event.target.files);
1622
- event.target.value = "";
1623
- }
1624
- }
1625
- ),
1626
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1627
- "input",
1628
- {
1629
- ref: artifactInputRef,
1630
- type: "file",
1631
- accept: ".tgz",
1632
- style: { display: "none" },
1633
- onChange: (event) => {
1634
- handleArtifactPicked(event.target.files);
1635
- event.target.value = "";
1636
- }
1585
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1586
+ "input",
1587
+ {
1588
+ ref: dirInputRef,
1589
+ type: "file",
1590
+ style: { display: "none" },
1591
+ ...{ webkitdirectory: "" },
1592
+ onChange: (event) => {
1593
+ handleDirPicked(event.target.files);
1594
+ event.target.value = "";
1637
1595
  }
1638
- ),
1639
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1640
- "input",
1641
- {
1642
- ref: sourceInputRef,
1643
- type: "file",
1644
- accept: ".zip",
1645
- style: { display: "none" },
1646
- onChange: (event) => {
1647
- handleSourcePicked(event.target.files);
1648
- event.target.value = "";
1649
- }
1596
+ }
1597
+ ),
1598
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1599
+ "input",
1600
+ {
1601
+ ref: artifactInputRef,
1602
+ type: "file",
1603
+ accept: ".tgz",
1604
+ style: { display: "none" },
1605
+ onChange: (event) => {
1606
+ handleArtifactPicked(event.target.files);
1607
+ event.target.value = "";
1650
1608
  }
1651
- ),
1652
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1653
- "input",
1654
- {
1655
- ref: fileInputRef,
1656
- type: "file",
1657
- accept: ".zip,.tgz,application/zip,application/x-zip-compressed,application/gzip",
1658
- multiple: true,
1659
- style: { display: "none" },
1660
- onChange: (event) => {
1661
- handleFilePicked(event.target.files);
1662
- event.target.value = "";
1663
- }
1609
+ }
1610
+ ),
1611
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1612
+ "input",
1613
+ {
1614
+ ref: fileInputRef,
1615
+ type: "file",
1616
+ accept: ".tgz,application/gzip",
1617
+ multiple: true,
1618
+ style: { display: "none" },
1619
+ onChange: (event) => {
1620
+ handleFilePicked(event.target.files);
1621
+ event.target.value = "";
1664
1622
  }
1665
- ),
1666
- (outerZip !== null || sourceNotice !== null || inspectError !== null) && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "xps-up-side-notice", children: [
1667
- outerZip !== null && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: { display: "flex", alignItems: "center", gap: 8, marginBottom: 12 }, children: [
1668
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { style: secondaryText, children: [
1669
- "\u{1F5DC}\uFE0F ",
1670
- outerZip.name,
1671
- "(",
1672
- formatSize(outerZip.size),
1673
- ")"
1674
- ] }),
1675
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { size: "small", variant: "ghost", onClick: () => setOuterZip(null), disabled: submitting, children: "\u6E05\u9664" })
1676
- ] }),
1623
+ }
1624
+ ),
1625
+ scanned ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "xps-up-layout", children: [
1626
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: `xps-up-drop xps-up-side-drop${dragOver ? " xps-up-drop-over" : ""}`, ...dropHandlers, children: dropInner }),
1627
+ (sourceNotice !== null || inspectError !== null) && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "xps-up-side-notice", children: [
1677
1628
  sourceNotice !== null && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "xps-banner", children: sourceNotice }),
1678
1629
  inspectError !== null && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "xps-banner xps-banner-error", children: inspectError })
1679
1630
  ] }),
1680
- scanned && outerZip === null && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "xps-up-card xps-up-side-scan", children: [
1631
+ scanned && /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "xps-up-card xps-up-side-scan", children: [
1681
1632
  /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "xps-up-card-title", children: [
1682
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: "\u8BC6\u522B\u7ED3\u679C" }),
1683
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { className: "xps-up-card-actions", children: [
1684
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { size: "small", variant: "ghost", onClick: () => artifactInputRef.current?.click(), children: "\u8865\u9009\u4EA7\u7269\u5305" }),
1685
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { size: "small", variant: "ghost", onClick: () => sourceInputRef.current?.click(), children: "\u8865\u9009\u6E90\u7801\u5F52\u6863" })
1686
- ] })
1633
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "xps-up-step-chip", children: "\u7B2C 1 \u6B65" }),
1634
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: "\u786E\u8BA4\u53D1\u5E03\u5185\u5BB9" }),
1635
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "xps-up-card-actions", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { size: "small", variant: "ghost", onClick: () => artifactInputRef.current?.click(), children: artifactCandidates.length === 0 ? "\u8865\u9009\u4EA7\u7269\u5305" : "\u66F4\u6362\u4EA7\u7269\u5305" }) })
1687
1636
  ] }),
1688
1637
  /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { style: { marginBottom: 10 }, children: [
1689
1638
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: { ...labelStyle, marginBottom: 4 }, children: "\u{1F4E6} \u4EA7\u7269\u5305(\u5FC5\u586B)" }),
@@ -1716,39 +1665,19 @@ function UploadForm(props) {
1716
1665
  ))
1717
1666
  ] }),
1718
1667
  /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { children: [
1719
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: { ...labelStyle, marginBottom: 4 }, children: "\u{1F5DC}\uFE0F \u6E90\u7801\u5F52\u6863(\u6CA1\u6709\u53EF\u76F4\u4F20 zip \u65F6\u5C06\u81EA\u52A8\u6253\u5305\u6574\u4E2A\u76EE\u5F55)" }),
1720
- sourceCandidates.length === 0 && /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: secondaryText, children: dirFiles.length > 0 ? "\u672A\u8BC6\u522B\u5230\u6E90\u7801\u5F52\u6863 zip \u2014\u2014 \u65E0\u9700\u624B\u52A8\u8865\u9009,\u63D0\u4EA4\u65F6\u81EA\u52A8\u6253\u5305" : "\u672A\u8BC6\u522B\u5230\u6E90\u7801\u5F52\u6863 zip \u2014\u2014 \u8BF7\u624B\u52A8\u8865\u9009,\u6216\u6539\u9009\u4EE3\u7801\u76EE\u5F55" }),
1721
- sourceCandidates.map((item) => /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1722
- "label",
1723
- {
1724
- className: `xps-up-candidate${selectedSource === item.path ? " xps-up-candidate-active" : ""}`,
1725
- children: [
1726
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1727
- "input",
1728
- {
1729
- type: "radio",
1730
- name: "xps-source",
1731
- checked: selectedSource === item.path,
1732
- onChange: () => setSelectedSource(item.path)
1733
- }
1734
- ),
1735
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: "\u{1F5DC}\uFE0F" }),
1736
- /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { className: "xps-up-candidate-main", children: [
1737
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "xps-up-candidate-name", children: item.file.name }),
1738
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "xps-up-candidate-path", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("bdi", { children: [
1739
- formatSize(item.file.size),
1740
- item.path !== item.file.name ? ` \xB7 ${item.path}` : ""
1741
- ] }) })
1742
- ] })
1743
- ]
1744
- },
1745
- item.path
1746
- ))
1668
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: { ...labelStyle, marginBottom: 4 }, children: "\u{1F5DC}\uFE0F \u6E90\u7801\u5305(\u7531\u4EE3\u7801\u76EE\u5F55\u81EA\u52A8\u6253\u5305)" }),
1669
+ dirFiles.length > 0 ? /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: secondaryText, children: "\u63D0\u4EA4\u65F6\u5C06\u81EA\u52A8\u628A\u6240\u9009\u76EE\u5F55\u6253\u5305\u4E3A\u6E90\u7801\u4E0A\u4F20(node_modules / .git \u7B49\u4F1A\u81EA\u52A8\u5254\u9664)" }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "xps-up-source-missing", children: [
1670
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: "\u8FD8\u5DEE\u4EE3\u7801\u76EE\u5F55 \u2014\u2014 \u6E90\u7801\u5305\u5C06\u7531\u8BE5\u76EE\u5F55\u81EA\u52A8\u6253\u5305" }),
1671
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Button, { size: "small", onClick: () => dirInputRef.current?.click(), children: "\u9009\u62E9\u76EE\u5F55" })
1672
+ ] })
1747
1673
  ] })
1748
1674
  ] }),
1749
- outerZip !== null || scanned ? /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1675
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(import_jsx_runtime10.Fragment, { children: [
1750
1676
  /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "xps-up-card xps-up-main-form", children: [
1751
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "xps-up-card-title", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: "\u63D2\u4EF6\u4FE1\u606F" }) }),
1677
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "xps-up-card-title", children: [
1678
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "xps-up-step-chip", children: "\u7B2C 2 \u6B65" }),
1679
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { children: "\u586B\u5199\u63D2\u4EF6\u4FE1\u606F" })
1680
+ ] }),
1752
1681
  /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "xps-up-grid", children: [
1753
1682
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Labeled, { label: "\u5305\u540D", required: true, hint: "(\u4E0E\u4EA7\u7269\u5305\u5185 package.json \u7684 name \u4E00\u81F4)", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1754
1683
  Input,
@@ -1793,13 +1722,13 @@ function UploadForm(props) {
1793
1722
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Labeled, { label: "\u517C\u5BB9 dsh \u7248\u672C\u8303\u56F4", required: false, hint: "(\u53EF\u9009)", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Input, { value: compatRange, onChange: setCompatRange, placeholder: ">=0.2.0" }) })
1794
1723
  ] }),
1795
1724
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "xps-up-grid xps-up-grid-single", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Labeled, { label: "\u56FE\u6807 URL", required: false, hint: "(\u53EF\u9009,\u7559\u7A7A\u6309\u5305\u540D\u751F\u6210\u8272\u5757)", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Input, { value: iconUrl, onChange: setIconUrl, placeholder: "https://\u2026/icon.svg" }) }) }),
1796
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "xps-up-grid xps-up-grid-single", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Labeled, { label: "README", required: false, hint: "(\u53EF\u9009,markdown;\u4E0A\u67B6\u540E\u53EA\u80FD\u9760\u63D0\u4EA4\u65B0\u7248\u672C\u6539)", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1725
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "xps-up-grid xps-up-grid-single", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(Labeled, { label: "README", required: false, hint: "(markdown,\u5E02\u573A\u8BE6\u60C5\u9875\u5168\u6587;\u4E0A\u67B6\u540E\u53EA\u80FD\u9760\u63D0\u4EA4\u65B0\u7248\u672C\u6539)", children: /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(
1797
1726
  "textarea",
1798
1727
  {
1799
1728
  className: "xps-input",
1800
1729
  style: textAreaStyle,
1801
1730
  value: description,
1802
- placeholder: "# \u63D2\u4EF6\u540D\n\n\u4ECB\u7ECD\u3001\u529F\u80FD\u3001\u7528\u6CD5\u2026",
1731
+ placeholder: "# \u63D2\u4EF6\u540D\n\n\u4E00\u4E24\u53E5\u8BDD\u8BF4\u660E\u63D2\u4EF6\u89E3\u51B3\u4EC0\u4E48\u95EE\u9898\u2026\n\n## \u4F7F\u7528\u65B9\u6CD5\n\n## \u914D\u7F6E\u8BF4\u660E\n\n## \u5E38\u89C1\u95EE\u9898",
1803
1732
  onChange: (event) => setDescription(event.target.value)
1804
1733
  }
1805
1734
  ) }) }),
@@ -1831,24 +1760,51 @@ function UploadForm(props) {
1831
1760
  ),
1832
1761
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { style: { ...secondaryText, marginTop: 6, textAlign: "center" }, children: "\u4EA7\u7269 \u2264 50MB\u3001\u6E90\u7801 \u2264 100MB;\u540C\u4E00\u4E2A\u63D2\u4EF6 10 \u5206\u949F\u5185\u53EA\u80FD\u63D0\u4EA4\u4E00\u6B21" })
1833
1762
  ] })
1834
- ] }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)(
1835
- "div",
1836
- {
1837
- className: "xps-up-empty xps-up-main-form",
1838
- onClick: () => dirInputRef.current?.click(),
1839
- onDragOver: (event) => {
1840
- event.preventDefault();
1841
- setDragOver(true);
1842
- },
1843
- onDragLeave: () => setDragOver(false),
1844
- onDrop: handleDrop,
1845
- children: [
1846
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "xps-empty-icon", children: "\u{1F9FE}" }),
1847
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "xps-empty-title", children: "\u5148\u5728\u5DE6\u4FA7\u9009\u62E9\u8981\u53D1\u5E03\u7684\u5185\u5BB9" }),
1848
- /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "xps-text-caption", children: "\u5305\u540D / \u7248\u672C\u4F1A\u4ECE package.json \u81EA\u52A8\u8BC6\u522B\u586B\u5145,\u9009\u4E2D\u540E\u4ECD\u53EF\u624B\u52A8\u4FEE\u6539" })
1849
- ]
1850
- }
1851
- )
1763
+ ] })
1764
+ ] }) : /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "xps-up-empty-grid", children: [
1765
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: `xps-up-drop${dragOver ? " xps-up-drop-over" : ""}`, ...dropHandlers, children: dropInner }),
1766
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "xps-up-empty xps-up-empty-static", children: [
1767
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "xps-up-flow", children: [
1768
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "xps-up-flow-title", children: "\u53D1\u5E03\u6D41\u7A0B" }),
1769
+ FLOW_STEPS.map((step) => /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "xps-up-flow-item", children: [
1770
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "xps-up-flow-no", children: step.no }),
1771
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("span", { className: "xps-up-flow-main", children: [
1772
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "xps-up-flow-item-title", children: step.title }),
1773
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "xps-up-flow-item-desc", children: step.desc })
1774
+ ] })
1775
+ ] }, step.no))
1776
+ ] }),
1777
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("span", { className: "xps-text-caption", children: "\u5185\u5BB9\u81EA\u52A8\u8BC6\u522B,\u9009\u4E2D\u540E\u4ECD\u53EF\u624B\u52A8\u4FEE\u6539" })
1778
+ ] })
1779
+ ] }),
1780
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("div", { className: "xps-up-guide", children: [
1781
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("div", { className: "xps-up-guide-title", children: "\u53D1\u5E03\u8BF4\u660E" }),
1782
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("ol", { children: [
1783
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("li", { children: [
1784
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("b", { children: "\u81EA\u52A8\u8BC6\u522B\u586B\u5145:" }),
1785
+ "\u9009\u62E9\u4EE3\u7801\u76EE\u5F55\u540E,\u5305\u540D\u3001\u7248\u672C\u3001\u4E00\u53E5\u8BDD\u63CF\u8FF0\u3001\u4F5C\u8005\u4F1A\u4ECE\u76EE\u5F55\u91CC package.json \u81EA\u52A8\u8BFB\u53D6\u5E76\u586B\u5145,\u9009\u4E2D\u540E\u4ECD\u53EF\u624B\u52A8\u4FEE\u6539;\u76EE\u5F55\u6839\u7684 README.md \u4F1A\u81EA\u52A8\u586B\u5165\u4E0B\u65B9\u300CREADME\u300D\u6846\u3002"
1786
+ ] }),
1787
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("li", { children: [
1788
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("b", { children: "README \u8BF7\u5C3D\u91CF\u5199\u6E05\u695A:" }),
1789
+ "README \u662F\u5E02\u573A\u8BE6\u60C5\u9875\u7684\u5168\u90E8\u5C55\u793A\u5185\u5BB9,\u652F\u6301\u6807\u51C6 markdown(\u6807\u9898\u3001\u5217\u8868\u3001\u8868\u683C\u3001\u4EE3\u7801\u5757\u3001\u94FE\u63A5)\u3002\u5EFA\u8BAE\u5305\u542B:\u63D2\u4EF6\u89E3\u51B3\u4EC0\u4E48\u95EE\u9898\u3001\u5982\u4F55\u5B89\u88C5\u542F\u7528\u3001\u5404\u529F\u80FD\u600E\u4E48\u7528\u3001\u6709\u54EA\u4E9B\u914D\u7F6E\u9879\u4E0E\u6CE8\u610F\u4E8B\u9879 \u2014\u2014 \u8BF4\u660E\u8D8A\u5B8C\u6574,\u8D8A\u5BB9\u6613\u901A\u8FC7\u5BA1\u6838,\u4E5F\u8D8A\u5BB9\u6613\u88AB\u4F7F\u7528\u3002"
1790
+ ] }),
1791
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("li", { children: [
1792
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("b", { children: "\u4EA7\u7269\u5305(*.tgz):" }),
1793
+ "\u76EE\u5F55\u5185\u9700\u5305\u542B npm pack \u4EA7\u51FA\u7684\u4EA7\u7269\u5305,\u5305\u540D / \u7248\u672C\u5FC5\u987B\u4E0E package.json \u4E00\u81F4(\u5426\u5219\u670D\u52A1\u7AEF\u62D2\u6536);\u76EE\u5F55\u91CC\u6CA1\u6709\u65F6\u70B9\u300C\u8865\u9009\u4EA7\u7269\u5305\u300D\u5355\u72EC\u9009\u62E9\u3002"
1794
+ ] }),
1795
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("li", { children: [
1796
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("b", { children: "\u6E90\u7801\u5305\u81EA\u52A8\u6253\u5305:" }),
1797
+ "\u63D0\u4EA4\u65F6\u6574\u4E2A\u76EE\u5F55\u4F1A\u81EA\u52A8\u6253\u5305\u4E3A\u6E90\u7801,node_modules / .git / .DS_Store \u7B49\u4F1A\u81EA\u52A8\u5254\u9664;\u8BF7\u786E\u8BA4\u76EE\u5F55\u91CC\u4E0D\u542B\u5BC6\u94A5\u3001\u5185\u7F51\u5730\u5740\u7B49\u654F\u611F\u4FE1\u606F,\u4E14\u6587\u4EF6\u6570 \u2264 5000\u3001\u603B\u5927\u5C0F \u2264 190MB\u3002"
1798
+ ] }),
1799
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("li", { children: [
1800
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("b", { children: "\u7248\u672C\u53F7\u5FC5\u987B\u9012\u589E:" }),
1801
+ "\u518D\u6B21\u63D0\u4EA4\u540C\u4E00\u63D2\u4EF6\u65F6,\u7248\u672C\u53F7\u5FC5\u987B\u5927\u4E8E\u5DF2\u53D1\u5E03\u7684\u6700\u65B0\u7248\u672C;\u540C\u4E00\u63D2\u4EF6 10 \u5206\u949F\u5185\u53EA\u80FD\u63D0\u4EA4\u4E00\u6B21\u3002"
1802
+ ] }),
1803
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsxs)("li", { children: [
1804
+ /* @__PURE__ */ (0, import_jsx_runtime10.jsx)("b", { children: "\u5BA1\u6838\u4E0A\u67B6:" }),
1805
+ "\u63D0\u4EA4\u540E\u8FDB\u5165\u5BA1\u6838,\u5BA1\u6838\u901A\u8FC7\u5373\u4E0A\u67B6\u5E02\u573A;\u9A73\u56DE\u4F1A\u7ED9\u51FA\u7406\u7531,\u4FEE\u6539\u540E\u53EF\u91CD\u65B0\u63D0\u4EA4\u3002"
1806
+ ] })
1807
+ ] })
1852
1808
  ] }),
1853
1809
  /* @__PURE__ */ (0, import_jsx_runtime10.jsx)(ToastHost, { items, onDismiss: dismiss })
1854
1810
  ] });
@@ -2924,7 +2880,12 @@ function Markdown(props) {
2924
2880
  var CODE_FENCE = /^\s*```/;
2925
2881
  var HEADING = /^(#{1,4})\s+(.*)$/;
2926
2882
  var LIST_ITEM = /^\s*[-*]\s+/;
2927
- function renderBlocks(text) {
2883
+ var ORDERED_ITEM = /^\s*\d+[.)]\s+/;
2884
+ var QUOTE = /^\s*>\s?/;
2885
+ var HR = /^\s*(?:-{3,}|\*{3,}|_{3,})\s*$/;
2886
+ var TABLE_ROW = /^\s*\|.*\|\s*$/;
2887
+ var MAX_QUOTE_DEPTH = 16;
2888
+ function renderBlocks(text, depth = 0) {
2928
2889
  const lines = text.split(/\r?\n/);
2929
2890
  const blocks = [];
2930
2891
  let key = 0;
@@ -2970,6 +2931,12 @@ function renderBlocks(text) {
2970
2931
  i += 1;
2971
2932
  continue;
2972
2933
  }
2934
+ if (HR.test(line) && !LIST_ITEM.test(line) && !ORDERED_ITEM.test(line)) {
2935
+ blocks.push(/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("hr", { className: "xps-md-hr" }, key));
2936
+ key += 1;
2937
+ i += 1;
2938
+ continue;
2939
+ }
2973
2940
  if (LIST_ITEM.test(line)) {
2974
2941
  const items = [];
2975
2942
  while (i < lines.length && LIST_ITEM.test(lines[i] ?? "")) {
@@ -2983,10 +2950,56 @@ function renderBlocks(text) {
2983
2950
  key += 1;
2984
2951
  continue;
2985
2952
  }
2953
+ if (ORDERED_ITEM.test(line)) {
2954
+ const items = [];
2955
+ while (i < lines.length && ORDERED_ITEM.test(lines[i] ?? "")) {
2956
+ const itemText = (lines[i] ?? "").replace(ORDERED_ITEM, "");
2957
+ items.push(/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("li", { children: renderInline(itemText, `ol${key}-${items.length}`) }, items.length));
2958
+ i += 1;
2959
+ }
2960
+ blocks.push(
2961
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("ol", { className: "xps-md-ol", children: items }, key)
2962
+ );
2963
+ key += 1;
2964
+ continue;
2965
+ }
2966
+ if (QUOTE.test(line)) {
2967
+ const buf2 = [];
2968
+ while (i < lines.length && QUOTE.test(lines[i] ?? "")) {
2969
+ buf2.push((lines[i] ?? "").replace(QUOTE, ""));
2970
+ i += 1;
2971
+ }
2972
+ blocks.push(
2973
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("blockquote", { className: "xps-md-quote", children: depth >= MAX_QUOTE_DEPTH ? /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("p", { className: "xps-md-p", children: renderInline(buf2.join(" "), `qd${key}`) }) : renderBlocks(buf2.join("\n"), depth + 1) }, key)
2974
+ );
2975
+ key += 1;
2976
+ continue;
2977
+ }
2978
+ if (TABLE_ROW.test(line) && isSeparatorRow(lines[i + 1] ?? "")) {
2979
+ const header = splitRow(line);
2980
+ const aligns = splitRow(lines[i + 1] ?? "").map(cellAlign);
2981
+ i += 2;
2982
+ const rows = [];
2983
+ while (i < lines.length && TABLE_ROW.test(lines[i] ?? "")) {
2984
+ rows.push(splitRow(lines[i] ?? ""));
2985
+ i += 1;
2986
+ }
2987
+ const th = (text2, idx) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("th", { style: { textAlign: aligns[idx] }, children: renderInline(text2, `th${key}-${idx}`) }, idx);
2988
+ const td = (row) => header.map((_, idx) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("td", { style: { textAlign: aligns[idx] }, children: renderInline(row[idx] ?? "", `td${key}-${idx}`) }, idx));
2989
+ blocks.push(
2990
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("div", { className: "xps-md-table-wrap", children: /* @__PURE__ */ (0, import_jsx_runtime17.jsxs)("table", { className: "xps-md-table", children: [
2991
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("thead", { children: /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("tr", { children: header.map(th) }) }),
2992
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("tbody", { children: rows.map((row, rIdx) => /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("tr", { children: td(row) }, rIdx)) })
2993
+ ] }) }, key)
2994
+ );
2995
+ key += 1;
2996
+ continue;
2997
+ }
2986
2998
  const buf = [];
2987
2999
  while (i < lines.length) {
2988
3000
  const l = lines[i] ?? "";
2989
- if (l.trim() === "" || CODE_FENCE.test(l) || HEADING.test(l) || LIST_ITEM.test(l)) break;
3001
+ if (l.trim() === "" || CODE_FENCE.test(l) || HEADING.test(l) || LIST_ITEM.test(l) || ORDERED_ITEM.test(l) || QUOTE.test(l) || HR.test(l) || TABLE_ROW.test(l) && isSeparatorRow(lines[i + 1] ?? ""))
3002
+ break;
2990
3003
  buf.push(l);
2991
3004
  i += 1;
2992
3005
  }
@@ -2999,7 +3012,7 @@ function renderBlocks(text) {
2999
3012
  }
3000
3013
  function renderInline(text, keyPrefix) {
3001
3014
  const nodes = [];
3002
- const pattern = /(\*\*[^*]+\*\*|`[^`]+`)/g;
3015
+ const pattern = /(\*\*[^*]+\*\*|~~[^~]+~~|`[^`]+`|\[[^\]]*\]\([^)\s]*(?:\([^)\s]*\)[^)\s]*)?\))/g;
3003
3016
  let last = 0;
3004
3017
  let seq = 0;
3005
3018
  let m;
@@ -3007,11 +3020,50 @@ function renderInline(text, keyPrefix) {
3007
3020
  if (m.index > last) nodes.push(text.slice(last, m.index));
3008
3021
  const token = m[0];
3009
3022
  if (token.startsWith("**")) {
3010
- nodes.push(/* @__PURE__ */ (0, import_jsx_runtime17.jsx)("strong", { children: token.slice(2, -2) }, `${keyPrefix}-b${seq}`));
3011
- } else {
3023
+ nodes.push(
3024
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("strong", { children: renderInline(token.slice(2, -2), `${keyPrefix}-b${seq}`) }, `${keyPrefix}-b${seq}`)
3025
+ );
3026
+ } else if (token.startsWith("~~")) {
3027
+ nodes.push(
3028
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("del", { children: renderInline(token.slice(2, -2), `${keyPrefix}-d${seq}`) }, `${keyPrefix}-d${seq}`)
3029
+ );
3030
+ } else if (token.startsWith("`")) {
3012
3031
  nodes.push(
3013
3032
  /* @__PURE__ */ (0, import_jsx_runtime17.jsx)("code", { className: "xps-md-inline-code", children: token.slice(1, -1) }, `${keyPrefix}-c${seq}`)
3014
3033
  );
3034
+ } else {
3035
+ const link = /^\[([^\]]*)\]\((.+)\)$/.exec(token);
3036
+ if (link === null) {
3037
+ nodes.push(token);
3038
+ } else {
3039
+ const [, label = "", rawUrl = ""] = link;
3040
+ const isImage = label.startsWith("!");
3041
+ const text2 = isImage ? label.slice(1) : label;
3042
+ const url = rawUrl.trim();
3043
+ if (/^https?:\/\//.test(url)) {
3044
+ nodes.push(
3045
+ /* @__PURE__ */ (0, import_jsx_runtime17.jsx)(
3046
+ "span",
3047
+ {
3048
+ className: "xps-md-link",
3049
+ role: "link",
3050
+ tabIndex: 0,
3051
+ onClick: () => void window.open(url, "_blank", "noopener,noreferrer"),
3052
+ onKeyDown: (event) => {
3053
+ if (event.key === "Enter" || event.key === " ") {
3054
+ event.preventDefault();
3055
+ void window.open(url, "_blank", "noopener,noreferrer");
3056
+ }
3057
+ },
3058
+ children: text2 === "" ? url : text2
3059
+ },
3060
+ `${keyPrefix}-a${seq}`
3061
+ )
3062
+ );
3063
+ } else {
3064
+ nodes.push(isImage ? label : token);
3065
+ }
3066
+ }
3015
3067
  }
3016
3068
  last = m.index + token.length;
3017
3069
  seq += 1;
@@ -3019,6 +3071,23 @@ function renderInline(text, keyPrefix) {
3019
3071
  if (last < text.length) nodes.push(text.slice(last));
3020
3072
  return nodes;
3021
3073
  }
3074
+ function splitRow(line) {
3075
+ const guarded = line.trim().replace(/\\\|/g, "\0");
3076
+ const body = guarded.startsWith("|") ? guarded.slice(1) : guarded;
3077
+ const inner = body.endsWith("|") ? body.slice(0, -1) : body;
3078
+ return inner.split("|").map((cell) => cell.trim().replace(/\u0000/g, "|"));
3079
+ }
3080
+ function isSeparatorRow(line) {
3081
+ if (!TABLE_ROW.test(line)) return false;
3082
+ const cells = splitRow(line);
3083
+ return cells.length > 0 && cells.every((cell) => /^:?-+:?$/.test(cell));
3084
+ }
3085
+ function cellAlign(cell) {
3086
+ if (cell.startsWith(":") && cell.endsWith(":")) return "center";
3087
+ if (cell.endsWith(":")) return "right";
3088
+ if (cell.startsWith(":")) return "left";
3089
+ return void 0;
3090
+ }
3022
3091
 
3023
3092
  // src/client/pages/PluginDetailPage.tsx
3024
3093
  var import_jsx_runtime18 = require("react/jsx-runtime");
@@ -3193,7 +3262,7 @@ function PluginDetailPage(props) {
3193
3262
  }
3194
3263
 
3195
3264
  // src/client/theme.css
3196
- var theme_default = "/* \u85AA\u4EBA\u85AA\u4E8B\u5E02\u573A client \u4E3B\u9898:\u5BF9\u6807\u5BBF\u4E3B\u5B98\u65B9\u63D2\u4EF6\u7BA1\u7406\u5668(PluginManagerPage.module.css)\u89C6\u89C9\u8BED\u8A00,\n * \u5168\u90E8\u8D70\u5BBF\u4E3B --dsw-alias-* token(\u5E26\u515C\u5E95\u503C,token \u7F3A\u5931\u65F6\u53EF\u72EC\u7ACB\u9884\u89C8)\u3002 */\n\n/* ---------- \u9875\u9762\u9AA8\u67B6 ---------- */\n\n.xps-app {\n display: flex;\n width: 100%;\n height: 100%;\n background: var(--dsw-alias-bg-layer-1, #ffffff);\n color: var(--dsw-alias-label-primary, #1f2329);\n font-family: inherit;\n}\n\n/* \u5DE6\u4FA7\u4E8C\u7EA7\u5BFC\u822A(B \xB7 \u56FE\u6807\u5C45\u4E0A\u84DD\u8C03\u7EC6\u7EBF\u98CE:\u5706\u89D2\u5757 r10,\u9009\u4E2D\u6D45\u84DD\u5E95+\u54C1\u724C\u84DD\u5B57) */\n.xps-nav {\n flex: none;\n width: 92px;\n box-sizing: border-box;\n padding: 16px 10px;\n display: flex;\n flex-direction: column;\n gap: 3px;\n border-right: 0.5px solid var(--dsw-alias-border-l2, #dee0e3);\n}\n\n.xps-nav-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 3px;\n padding: 9px 0 7px;\n border: none;\n border-radius: 10px;\n background: transparent;\n cursor: pointer;\n color: var(--dsw-alias-label-secondary, #646a73);\n font-family: inherit;\n font-size: 12px;\n line-height: 18px;\n}\n\n.xps-nav-item:hover {\n background: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.04));\n}\n\n.xps-nav-item-active,\n.xps-nav-item-active:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 10%, var(--dsw-alias-bg-layer-1, #ffffff));\n color: var(--dsw-alias-brand-primary, #3370ff);\n font-weight: 600;\n}\n\n.xps-nav-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n line-height: 0;\n}\n\n.xps-nav-label {\n white-space: nowrap;\n}\n\n/* \u5185\u5BB9\u533A:\u5B98\u65B9\u9875\u540C\u6B3E\u5C45\u4E2D\u5217(28px \u9876 / clamp \u4FA7 / 48px \u5E95,960 \u4E0A\u9650) */\n.xps-content {\n flex: 1;\n min-width: 0;\n overflow: auto;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 28px clamp(24px, 4vw, 48px) 48px;\n}\n\n.xps-content > * {\n width: 100%;\n max-width: 960px;\n box-sizing: border-box;\n}\n\n/* \u9875\u5934:flex space-between,\u6807\u9898 20/28/500,\u526F\u9898 13/20 secondary */\n.xps-page-head {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n margin-bottom: 20px;\n}\n\n.xps-page-title {\n margin: 0;\n font-size: 20px;\n line-height: 28px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n/* \u6807\u9898\u884C\u5185\u6302\u5FBD\u6807(\u8BA1\u6570\u7B49\u72B6\u6001\u4FE1\u606F\u8DDF\u968F\u6807\u9898,\u4E0D\u6DF7\u8FDB\u53F3\u4E0A\u89D2\u64CD\u4F5C\u533A) */\n.xps-title-with-badges {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.xps-page-intro {\n margin: 4px 0 0;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-secondary, #646a73);\n}\n\n.xps-page-actions {\n flex: none;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* \u533A\u5757\u9898 14/22/500 */\n.xps-section-title {\n margin: 0;\n font-size: 14px;\n line-height: 22px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n/* ---------- \u6587\u5B57\u8272\u9636\u5DE5\u5177\u7C7B ---------- */\n\n.xps-text-secondary {\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-secondary, #646a73);\n}\n\n/* \u8BF4\u660E/\u8BA1\u6570:12/18 tertiary */\n.xps-text-caption {\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary, #8f959e);\n}\n\n/* \u5305\u540D/\u7248\u672C\u53F7\u7B49 mono */\n.xps-mono {\n font-family: var(--dsw-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);\n}\n\n/* ---------- \u6309\u94AE(\u80F6\u56CA) ---------- */\n\n.xps-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 32px;\n box-sizing: border-box;\n padding: 0 14px;\n border-radius: 16px;\n border: 0.5px solid var(--dsw-alias-border-l3, #d0d3d9);\n background: transparent;\n color: var(--dsw-alias-label-primary, #1f2329);\n font-family: inherit;\n font-size: 13px;\n line-height: 20px;\n cursor: pointer;\n white-space: nowrap;\n}\n\n.xps-btn:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover, rgba(31, 35, 41, 0.06));\n}\n\n.xps-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n/* \u4E3B\u6309\u94AE(B \u65B9\u5411\u8BC6\u522B\u8272):\u5B9E\u5FC3\u54C1\u724C\u84DD + \u767D\u5B57,hover \u52A0\u6DF1 */\n.xps-btn-primary {\n background: var(--dsw-alias-brand-primary, #3370ff);\n border-color: transparent;\n color: var(--dsw-alias-label-primary-foreground, #ffffff);\n}\n\n.xps-btn-primary:hover:not(:disabled) {\n background: var(--dsw-alias-button-primary-hover, color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 85%, #000000));\n}\n\n/* \u63CF\u8FB9\u4E3B\u6309\u94AE(\u5DF2\u5B89\u88C5/\u66F4\u65B0\u6001):\u54C1\u724C\u84DD\u63CF\u8FB9 + \u84DD\u5B57\u900F\u660E\u5E95 */\n.xps-btn-outline {\n border: 1px solid var(--dsw-alias-brand-primary, #3370ff);\n background: transparent;\n color: var(--dsw-alias-brand-primary, #3370ff);\n}\n\n.xps-btn-outline:hover:not(:disabled) {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 8%, transparent);\n}\n\n/* \u5371\u9669\u6309\u94AE:\u590D\u7528\u6B21\u6309\u94AE,\u7EA2\u5B57 + 30% \u7EA2\u6846,hover \u6362\u7EA2 wash */\n.xps-btn-danger {\n color: var(--dsw-alias-state-error-primary, #d83931);\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary, #d83931) 30%, transparent);\n}\n\n.xps-btn-danger:hover:not(:disabled) {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary, #d83931) 8%, transparent);\n}\n\n.xps-btn-ghost {\n border-color: transparent;\n background: transparent;\n color: var(--dsw-alias-label-secondary, #646a73);\n}\n\n.xps-btn-ghost:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n.xps-btn-sm {\n height: 26px;\n padding: 0 10px;\n font-size: 12px;\n line-height: 18px;\n border-radius: 13px;\n}\n\n/* \u56FE\u6807\u6309\u94AE:28\xD728 \u5168\u5706 */\n/* \u56FE\u6807\u6309\u94AE:\u4E0E .xps-btn \u540C\u9AD8(32px)\u3001\u540C 0.5px \u8FB9\u6846,\u73AF\u5F62\u5237\u65B0\u7B49\u56FE\u6807\u6309\u94AE\u4E0E\u6587\u5B57\u6309\u94AE\u5E76\u6392\u65F6\u6BD4\u4F8B\u4E00\u81F4 */\n.xps-icon-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n flex: none;\n padding: 0;\n border: 0.5px solid var(--dsw-alias-border-l3, #d0d3d9);\n border-radius: 999px;\n background: transparent;\n color: var(--dsw-alias-label-secondary, #646a73);\n cursor: pointer;\n font-family: inherit;\n font-size: 14px;\n transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease,\n opacity 0.15s ease;\n}\n\n.xps-icon-btn:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover, rgba(31, 35, 41, 0.06));\n border-color: var(--dsw-alias-border-l4, #a8abb2);\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n.xps-icon-btn:active:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-active, rgba(38, 49, 72, 0.1));\n transform: scale(0.96);\n}\n\n.xps-icon-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n/* ---------- \u8F93\u5165\u6846 ---------- */\n\n.xps-input {\n width: 100%;\n box-sizing: border-box;\n height: 32px;\n padding: 0 10px;\n border-radius: 8px;\n border: 0.5px solid var(--dsw-alias-border-l4, #c9cdd4);\n background: var(--dsw-alias-bg-layer-1, #ffffff);\n color: var(--dsw-alias-label-primary, #1f2329);\n font-family: inherit;\n font-size: 13px;\n line-height: 20px;\n outline: none;\n}\n\n.xps-input::placeholder {\n color: var(--dsw-alias-label-tertiary, #8f959e);\n}\n\n/* \u8F93\u5165\u6846 hover:\u8FB9\u6846\u8F7B\u62AC\u4E00\u6863,\u4E0E focus \u7684\u54C1\u724C\u84DD\u533A\u5206 */\n.xps-input:hover:not(:disabled):not(:focus) {\n border-color: var(--dsw-alias-border-l4, #a8abb2);\n}\n\n.xps-input:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.xps-input:focus {\n border-color: var(--dsw-alias-brand-primary, #3370ff);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-brand-primary, #3370ff);\n}\n\n/* ---------- \u5FBD\u6807(\u80F6\u56CA 11/17/500) ---------- */\n\n.xps-badge {\n display: inline-flex;\n align-items: center;\n padding: 1px 8px;\n border-radius: 999px;\n border: 0.5px solid var(--dsw-alias-border-l3, #dee0e3);\n font-size: 11px;\n line-height: 17px;\n font-weight: 500;\n white-space: nowrap;\n background: var(--dsw-alias-bg-layer-2, #f5f6f7);\n color: var(--dsw-alias-label-secondary, #646a73);\n}\n\n.xps-badge-success {\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary, #1f9d55) 10%, var(--dsw-alias-bg-layer-1, #ffffff));\n border-color: color-mix(in srgb, var(--dsw-alias-state-success-primary, #1f9d55) 30%, transparent);\n color: var(--dsw-alias-state-success-primary, #1f9d55);\n}\n\n.xps-badge-warning {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary, #d98708) 10%, var(--dsw-alias-bg-layer-1, #ffffff));\n border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary, #d98708) 30%, transparent);\n color: var(--dsw-alias-state-warn-primary, #d98708);\n}\n\n.xps-badge-error {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary, #d83931) 10%, var(--dsw-alias-bg-layer-1, #ffffff));\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary, #d83931) 30%, transparent);\n color: var(--dsw-alias-state-error-primary, #d83931);\n}\n\n.xps-badge-info {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 10%, var(--dsw-alias-bg-layer-1, #ffffff));\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 30%, transparent);\n color: var(--dsw-alias-brand-primary, #3370ff);\n}\n\n/* ---------- \u5217\u8868\u884C(\u53D1\u4E1D\u7EBF\u6E05\u5355\u5F0F:\u4E0E\u5E02\u573A\u884C .xps-mk-row\u3001\u5F00\u53D1\u8005\u884C .xps-dev-item \u540C\u8303\u5F0F) ---------- */\n\n.xps-row-list {\n display: flex;\n flex-direction: column;\n}\n\n.xps-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 8px;\n border-bottom: 0.5px solid var(--dsw-alias-border-l2, #dee0e3);\n border-radius: 0;\n background: transparent;\n cursor: pointer;\n min-width: 0;\n transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease,\n opacity 0.15s ease;\n}\n\n/* \u6E05\u5355\u672B\u884C\u53BB\u53D1\u4E1D\u7EBF(\u4E0E .xps-dev-item:last-child \u540C\u505A\u6CD5) */\n.xps-row-list > .xps-row:last-child {\n border-bottom: none;\n}\n\n/* \u884C hover:\u6574\u884C\u80CC\u666F\u8F7B\u62AC,\u4E0E\u5E02\u573A\u884C\u540C\u5C42\u7EA7 */\n.xps-row:hover {\n background: var(--dsw-alias-interactive-bg-hover, rgba(31, 35, 41, 0.06));\n}\n\n/* \u56FE\u6807\u6846 40\xD740\u30010.5px hairline\u3001r10 */\n.xps-row-icon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border: 0.5px solid var(--dsw-alias-border-l3, #d0d3d9);\n border-radius: 10px;\n color: var(--dsw-alias-label-secondary, #646a73);\n font-size: 18px;\n line-height: 1;\n}\n\n.xps-row-main {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.xps-row-title {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n/* \u884C\u9898 14/20/500(\u5B98\u65B9\u884C\u6807\u9898\u89C4\u683C)\u3002\u5C55\u793A\u540D\u4E0E\u300C\u56DE\u9000\u7684\u5305\u540D\u300D\u90FD\u7528\u666E\u901A\u5B57\u4F53:\n * \u6807\u8BC6\u7B26\u53EA\u5728\u540E\u9762\u7684 .xps-row-pkg \u91CC\u8D70\u7B49\u5BBD,\u4E0E\u5E02\u573A/\u5F00\u53D1\u8005\u9875\u540C\u4E00\u89C4\u5219\u3002 */\n.xps-row-name {\n font-size: 14px;\n line-height: 20px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1f2329);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* \u5C55\u793A\u540D\u4E4B\u540E\u7684\u5305\u540D(\u6807\u8BC6\u7B26,\u7B49\u5BBD\u5C0F\u5B57 11px;\u4E0E .xps-mk-row-pkg / .xps-dev-pkg \u540C\u89C4\u683C) */\n.xps-row-pkg {\n flex: none;\n font-size: 11px;\n line-height: 17px;\n color: var(--dsw-alias-label-tertiary, #8f959e);\n}\n\n/* \u884C\u63CF\u8FF0 13/18 tertiary + \u5355\u884C\u622A\u65AD */\n.xps-row-desc {\n font-size: 13px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary, #8f959e);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.xps-row-end {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n/* ---------- \u6A2A\u5E45/\u63D0\u793A\u6761 ---------- */\n\n.xps-banner {\n margin: 0 0 12px;\n padding: 8px 12px;\n border-radius: 10px;\n font-size: 12px;\n line-height: 18px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary, #d98708) 12%, var(--dsw-alias-bg-layer-1, #ffffff));\n border: 0.5px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary, #d98708) 30%, transparent);\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n.xps-banner-error {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary, #d83931) 10%, var(--dsw-alias-bg-layer-1, #ffffff));\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary, #d83931) 30%, transparent);\n color: var(--dsw-alias-state-error-primary, #d83931);\n}\n\n/* ---------- \u7A7A\u6001(dashed 0.5px l2 + r8 + pad 18 \u5C45\u4E2D 13 tertiary) ---------- */\n\n.xps-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n /* \u56FE\u6807 / \u6807\u9898 / \u63CF\u8FF0\u7EDF\u4E00 8px \u8282\u594F */\n gap: 8px;\n padding: 18px;\n border: 0.5px dashed var(--dsw-alias-border-l2, #dee0e3);\n border-radius: 8px;\n color: var(--dsw-alias-label-tertiary, #8f959e);\n font-size: 13px;\n line-height: 20px;\n text-align: center;\n}\n\n.xps-empty-icon {\n font-size: 24px;\n line-height: 1;\n}\n\n.xps-empty-title {\n font-size: 13px;\n line-height: 20px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n/* \u6309\u94AE\u4E0E\u4E0A\u65B9\u6587\u6848\u5408\u8BA1 12px(\u7236\u7EA7 gap 8 + \u8FD9\u91CC 4) */\n.xps-empty-action {\n margin-top: 4px;\n}\n\n/* \u300C\u6211\u7684\u300D\u9875\u672A\u767B\u5F55\u5F15\u5BFC\u5361:\u6D41\u7A0B\u8BF4\u660E + \u524D\u5F80\u5F00\u53D1\u8005\u5E73\u53F0(\u65E0\u4EE4\u724C\u8F93\u5165\u5165\u53E3,\u767B\u5F55\u53EA\u5728\u8BBE\u7F6E\u91CC) */\n.xps-guide {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 20px 24px;\n border: 0.5px dashed var(--dsw-alias-border-l2, #dee0e3);\n border-radius: 8px;\n}\n\n.xps-guide-title {\n font-size: 14px;\n line-height: 20px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n.xps-guide-desc {\n margin: 0;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-secondary, #646a73);\n}\n\n.xps-guide-steps {\n margin: 0;\n padding-left: 20px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-secondary, #646a73);\n}\n\n.xps-guide-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 4px;\n}\n\n.xps-guide-url {\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary, #8f959e);\n word-break: break-all;\n}\n\n/* ---------- \u4E0A\u4F20\u8868\u5355(\u6253\u5305\u63D0\u4EA4) ---------- */\n\n/* \u62D6\u5165 / \u9009\u62E9\u533A:dashed \u5927\u9776\u533A;\u62D6\u60AC\u65F6\u6574\u533A\u54C1\u724C\u84DD\u63CF\u8FB9 + \u6D45\u84DD wash(.xps-up-drop-over) */\n.xps-up-drop {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n padding: 28px 16px;\n margin-bottom: 12px;\n text-align: center;\n border: 0.5px dashed var(--dsw-alias-border-l4, #c9cdd4);\n border-radius: 12px;\n cursor: pointer;\n transition: background-color 0.15s ease, border-color 0.15s ease;\n}\n\n.xps-up-drop:hover {\n background: var(--dsw-alias-interactive-bg-hover, rgba(31, 35, 41, 0.04));\n}\n\n.xps-up-drop-over,\n.xps-up-drop-over:hover {\n border-color: var(--dsw-alias-brand-primary, #3370ff);\n background: color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 8%, transparent);\n}\n\n.xps-up-drop-icon {\n font-size: 28px;\n line-height: 1;\n}\n\n.xps-up-drop-title {\n font-size: 14px;\n line-height: 22px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n.xps-up-drop-actions {\n display: flex;\n gap: 8px;\n margin-top: 8px;\n}\n\n/* \u5206\u7EC4\u5361\u7247:\u8BC6\u522B\u7ED3\u679C / \u63D2\u4EF6\u4FE1\u606F\u5404\u4E00\u5F20,\u66FF\u4EE3\u6563\u843D\u7684\u884C\u5185\u8FB9\u8DDD */\n.xps-up-card {\n padding: 14px 16px;\n margin-bottom: 12px;\n border: 0.5px solid var(--dsw-alias-border-l2, #dee0e3);\n border-radius: 10px;\n}\n\n.xps-up-card-actions {\n margin-left: auto;\n display: flex;\n gap: 4px;\n}\n\n/* \u4E0A\u4F20\u9875\u53CC\u680F:\u5DE6\u300C\u9009\u62E9\u5185\u5BB9 + \u8BC6\u522B\u7ED3\u679C\u300D\u53F3\u300C\u63D2\u4EF6\u4FE1\u606F + \u63D0\u4EA4\u300D,\u4E0E\u5176\u4ED6\u9875\u5171\u7528\u6807\u51C6 960 \u5217\u3002\n * \u5B50\u5143\u7D20\u76F4\u63A5\u505A grid item \u5E76\u663E\u5F0F\u5B9A\u4F4D:\u5DE6\u680F 1 \u5217\u4E09\u4E2A\u5757,\u53F3\u680F 2 \u5217\u4E24\u4E2A\u5757(r2-5 \u62C9\u4F38),\n * \u4E24\u680F\u5E95\u8FB9\u5929\u7136\u5BF9\u9F50;\u7A84\u5C4F(<880px)\u9000\u5316\u4E3A\u5355\u5217\u3001\u6309 DOM \u987A\u5E8F\u5806\u53E0 */\n.xps-up-layout {\n display: grid;\n grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);\n gap: 16px 16px;\n align-items: stretch;\n}\n\n/* \u76F4\u63A5\u5B50\u5143\u7D20\u5373\u7F51\u683C\u9879:\u5757\u81EA\u8EAB\u7684\u5916\u8FB9\u8DDD\u5F52\u96F6,\u95F4\u8DDD\u7EDF\u4E00\u4EA4\u7ED9 grid gap */\n.xps-up-side-drop,\n.xps-up-side-notice,\n.xps-up-side-scan,\n.xps-up-main-form {\n margin-bottom: 0;\n}\n\n.xps-up-layout > * {\n min-width: 0;\n min-height: 0;\n}\n\n.xps-up-side-drop { grid-column: 1; grid-row: 1; }\n.xps-up-side-notice { grid-column: 1; grid-row: 2; }\n.xps-up-side-scan { grid-column: 1; grid-row: 3 / 6; }\n.xps-up-main-form { grid-column: 2; grid-row: 1 / 6; }\n.xps-up-main-submit { grid-column: 2; grid-row: 6; }\n\n/* \u7A84\u5C4F:\u53CC\u680F\u5148\u4E8E\u8868\u5355\u6805\u683C\u584C\u6210\u5355\u5217,\u907F\u514D\u5B57\u6BB5\u88AB\u538B\u5230\u6362\u884C\u96BE\u8BFB */\n@media (max-width: 1120px) {\n .xps-up-grid {\n grid-template-columns: 1fr;\n }\n}\n\n@media (max-width: 1024px) {\n .xps-up-layout {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .xps-up-layout > [class^='xps-up-'],\n .xps-up-layout > [class*=' xps-up-'] {\n grid-column: auto;\n grid-row: auto;\n }\n}\n\n/* \u53F3\u680F\u7A7A\u6001:\u4E0E\u5DE6\u4FA7\u62D6\u5165\u533A\u540C\u6B3E\u865A\u7EBF\u5361\u7247,\u7B49\u9AD8\u5C45\u4E2D;\u70B9\u51FB\u7B49\u540C\u300C\u9009\u62E9\u76EE\u5F55\u300D\u3002\n * \u62C9\u4F38\u7531 grid item \u81EA\u8EAB\u5B8C\u6210(display: flex \u6491\u6EE1\u5206\u914D\u5230\u7684\u884C),\u4E0D\u4F9D\u8D56\u767E\u5206\u6BD4\u9AD8\u5EA6 */\n.xps-up-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n box-sizing: border-box;\n align-self: stretch;\n height: 100%;\n min-height: 200px;\n padding: 28px 16px;\n text-align: center;\n border: 0.5px dashed var(--dsw-alias-border-l2, #dee0e3);\n border-radius: 12px;\n cursor: pointer;\n transition: background-color 0.15s ease, border-color 0.15s ease;\n}\n\n.xps-up-empty:hover {\n background: var(--dsw-alias-interactive-bg-hover, rgba(31, 35, 41, 0.04));\n}\n\n/* \u8BC6\u522B\u7ED3\u679C\u5361\u6807\u9898:\u957F\u6587\u6848\u5141\u8BB8\u6362\u884C,\u8865\u9009\u6309\u94AE\u56FA\u5B9A\u53F3\u4FA7\u4E0D\u53C2\u4E0E\u6362\u884C\u6324\u538B */\n.xps-up-card-title {\n display: flex;\n align-items: baseline;\n gap: 8px;\n margin-bottom: 10px;\n font-size: 13px;\n line-height: 20px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n/* \u8865\u9009\u6309\u94AE\u56FA\u5B9A\u53F3\u4FA7;\u6807\u9898\u8BCD\u4E0D\u6362\u884C(\u53EA\u6709\u6807\u9898\u5355\u9879\u65F6\u4E0D\u53D7 margin-left:auto \u8BEF\u4F24) */\n.xps-up-card-title > .xps-up-card-actions {\n flex: none;\n margin-left: auto;\n}\n\n.xps-up-card-title > span:first-child {\n flex: none;\n}\n\n/* \u8868\u5355\u6805\u683C:\u4E24\u5217\u4E00\u884C(\u5355\u9879\u7528 .xps-up-grid-single \u6536\u6210\u6574\u884C)\u3002\n * align-items: end:\u5DE6\u53F3\u5B57\u6BB5\u6807\u7B7E\u884C\u6570\u4E0D\u540C\u65F6\u8F93\u5165\u6846\u5E95\u8FB9\u5BF9\u9F50,\u6807\u7B7E\u5404\u81EA\u5411\u4E0A\u751F\u957F */\n.xps-up-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px 12px;\n margin-bottom: 10px;\n align-items: end;\n}\n\n.xps-up-grid-single {\n grid-template-columns: 1fr;\n}\n\n/* \u4EA7\u7269 / \u6E90\u7801\u5019\u9009\u884C:radio + \u56FE\u6807 + \u540D\u79F0(\u4E00\u884C) + \u76F8\u5BF9\u8DEF\u5F84(\u5C0F\u5B57\u4E00\u884C,\u8D85\u957F\u622A\u65AD);\n * \u9009\u4E2D\u6001\u54C1\u724C\u84DD\u63CF\u8FB9 */\n.xps-up-candidate {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n margin-bottom: 4px;\n border: 0.5px solid var(--dsw-alias-border-l2, #dee0e3);\n border-radius: 8px;\n font-size: 13px;\n line-height: 20px;\n cursor: pointer;\n min-width: 0;\n transition: background-color 0.15s ease, border-color 0.15s ease;\n}\n\n.xps-up-candidate:hover {\n background: var(--dsw-alias-interactive-bg-hover, rgba(31, 35, 41, 0.06));\n}\n\n.xps-up-candidate-active,\n.xps-up-candidate-active:hover {\n border-color: var(--dsw-alias-brand-primary, #3370ff);\n background: color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 6%, transparent);\n}\n\n/* radio / \u56FE\u6807\u4E0D\u53C2\u4E0E\u6536\u7F29 */\n.xps-up-candidate > input,\n.xps-up-candidate > span:first-of-type {\n flex: none;\n}\n\n/* \u540D\u79F0 + \u8DEF\u5F84\u4E24\u884C\u5757:\u5360\u6EE1\u5269\u4F59\u5BBD\u5EA6,\u5185\u90E8\u5404\u81EA\u622A\u65AD */\n.xps-up-candidate-main {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 1px;\n}\n\n.xps-up-candidate-name {\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1f2329);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.xps-up-candidate-path {\n font-size: 12px;\n line-height: 17px;\n color: var(--dsw-alias-label-tertiary, #8f959e);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n direction: rtl;\n text-align: left;\n}\n\n.xps-up-candidate-path > bdi {\n direction: ltr;\n unicode-bidi: isolate;\n}\n\n/* ---------- \u9AA8\u67B6\u5C4F ---------- */\n\n.xps-skeleton-group {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.xps-skeleton {\n height: 56px;\n border-radius: 12px;\n background: linear-gradient(\n 90deg,\n var(--dsw-alias-interactive-bg-hover, rgba(31, 35, 41, 0.05)) 25%,\n var(--dsw-alias-border-l2, rgba(31, 35, 41, 0.1)) 37%,\n var(--dsw-alias-interactive-bg-hover, rgba(31, 35, 41, 0.05)) 63%\n );\n background-size: 400% 100%;\n animation: xps-skeleton-loading 1.4s ease infinite;\n}\n\n@keyframes xps-skeleton-loading {\n 0% {\n background-position: 100% 50%;\n }\n 100% {\n background-position: 0 50%;\n }\n}\n\n/* ---------- Toast ---------- */\n\n.xps-toast-host {\n position: fixed;\n top: 16px;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n flex-direction: column;\n gap: 8px;\n z-index: 9999;\n}\n\n.xps-toast {\n padding: 8px 14px;\n border-radius: 10px;\n font-size: 13px;\n line-height: 20px;\n /* \u591A\u884C\u63D0\u793A\u4E0D\u88AB\u6298\u53E0\u6210\u4E00\u6BB5(\u957F\u6587\u6848\u6539\u8D70 .xps-dialog-pre,\u8FD9\u91CC\u515C\u4F4F\u77ED\u7684\u591A\u884C\u63D0\u793A) */\n white-space: pre-wrap;\n background: var(--dsw-alias-bg-layer-3, #f0f1f2);\n color: var(--dsw-alias-label-primary, #1f2329);\n border: 0.5px solid var(--dsw-alias-border-l2, #dee0e3);\n box-shadow: 0 4px 16px var(--dsw-alias-bg-mask-1, rgba(0, 0, 0, 0.12));\n cursor: pointer;\n /* \u5165\u573A:\u6DE1\u5165 + \u8F7B\u5FAE\u4E0A\u79FB(\u79BB\u573A\u7531 useToasts \u76F4\u63A5\u4ECE\u5217\u8868\u79FB\u9664,\u4E0D\u505A\u5EF6\u8FDF\u5378\u8F7D) */\n animation: xps-fade-slide-in 0.15s ease-out;\n}\n\n@keyframes xps-fade-slide-in {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.xps-toast-success {\n border-color: color-mix(in srgb, var(--dsw-alias-state-success-primary, #1f9d55) 30%, transparent);\n}\n\n.xps-toast-error {\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary, #d83931) 30%, transparent);\n}\n\n/* ---------- \u5BF9\u8BDD\u6846 ---------- */\n\n.xps-overlay {\n position: fixed;\n inset: 0;\n z-index: 9998;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--dsw-alias-bg-mask-2, rgba(0, 0, 0, 0.45));\n animation: xps-fade-in 0.15s ease-out;\n}\n\n@keyframes xps-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.xps-dialog {\n width: 360px;\n padding: 16px 20px;\n border-radius: 12px;\n border: 0.5px solid var(--dsw-alias-border-l2, #dee0e3);\n background: var(--dsw-alias-bg-layer-3, #ffffff);\n box-shadow: 0 8px 32px var(--dsw-alias-bg-mask-1, rgba(0, 0, 0, 0.18));\n /* \u5165\u573A:\u6DE1\u5165 + 0.98 \u2192 1 \u8F7B\u5FAE\u653E\u5927 */\n animation: xps-dialog-in 0.15s ease-out;\n}\n\n@keyframes xps-dialog-in {\n from { opacity: 0; transform: scale(0.98); }\n to { opacity: 1; transform: scale(1); }\n}\n\n.xps-dialog-title {\n font-size: 14px;\n line-height: 22px;\n font-weight: 500;\n margin-bottom: 8px;\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n.xps-dialog-body {\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-secondary, #646a73);\n margin-bottom: 16px;\n}\n\n.xps-dialog-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n}\n\n/* \u957F\u6587\u672C\u5BF9\u8BDD\u6846(\u5B89\u88C5\u5931\u8D25\u7684\u591A\u884C\u65E5\u5FD7\u3001\u5F85\u624B\u52A8\u6267\u884C\u7684\u547D\u4EE4):\u6BD4\u901A\u7528\u5BF9\u8BDD\u6846\u5BBD,\u7A84\u5C4F\u81EA\u52A8\u6536\u7A84 */\n.xps-dialog.xps-dialog-wide {\n width: 520px;\n max-width: calc(100vw - 32px);\n box-sizing: border-box;\n}\n\n/* \u6B63\u6587\u539F\u6587\u5757:\u4FDD\u7559\u6362\u884C\u4E0E\u7F29\u8FDB,\u8FC7\u957F\u65F6\u5185\u90E8\u6EDA\u52A8,\u4E0D\u628A\u7A97\u53E3\u6491\u7206;\u53EF\u624B\u52A8\u9009\u4E2D\u590D\u5236 */\n.xps-dialog-pre {\n white-space: pre-wrap;\n max-height: 320px;\n overflow: auto;\n padding: 10px 12px;\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-2, #f5f6f7);\n border: 0.5px solid var(--dsw-alias-border-l2, #dee0e3);\n font-family: var(--dsw-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary, #1f2329);\n text-align: left;\n word-break: break-word;\n user-select: text;\n}\n\n/* ---------- \u9875\u9762\u5360\u4F4D(\u9AA8\u67B6\u671F) ---------- */\n\n.xps-page-placeholder {\n padding: 18px;\n border: 0.5px dashed var(--dsw-alias-border-l2, #dee0e3);\n border-radius: 8px;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-tertiary, #8f959e);\n}\n\n/* ---------- \u4EA4\u4E92\u72B6\u6001(\u5168\u7AD9\u7EDF\u4E00:\u8FC7\u6E21 / \u6309\u538B / \u7126\u70B9\u73AF) ----------\n * \u53EA\u8FC7\u6E21\u989C\u8272\u4E0E\u900F\u660E\u5EA6,\u4E0D\u505A\u4F4D\u79FB\u7F29\u653E\u52A8\u753B;\u6309\u538B\u7528\u4E00\u6863\u66F4\u6DF1\u7684 active \u5E95\u8272 + \u6781\u8F7B\u5FAE\u4E0B\u538B\u3002\n * \u9875\u9762\u79C1\u6709\u6837\u5F0F(market / admin)\u5728\u672C\u6587\u4EF6\u4E4B\u540E\u6CE8\u5165,\u5404\u81EA\u7684\u8FC7\u6E21\u4E0E\u6309\u538B\u6001\u5199\u5728\u5404\u81EA\u6A21\u5757\u91CC\u3002\n */\n\n/* .xps-row \u7684\u8FC7\u6E21\u5199\u5728\u81EA\u5DF1\u7684\u57FA\u7840\u89C4\u5219\u91CC(\u89C1\u4E0A),\u6B64\u5904\u4E0D\u518D\u91CD\u590D\u58F0\u660E */\n.xps-btn,\n.xps-icon-btn,\n.xps-nav-item,\n.xps-input {\n transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease,\n opacity 0.15s ease;\n}\n\n/* \u6309\u538B:\u80CC\u666F\u518D\u6DF1\u4E00\u6863(interactive-bg-active);\u4E3B/\u63CF\u8FB9/\u5371\u9669\u6309\u94AE\u6309\u5404\u81EA\u8272\u7CFB\u52A0\u6DF1 */\n.xps-btn:active:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-active, rgba(38, 49, 72, 0.1));\n transform: scale(0.98);\n}\n\n.xps-btn-primary:active:not(:disabled) {\n /* \u4E3B\u6309\u94AE\u6CA1\u6709 -active token(\u53EA\u6709 -fill / -hover),\u6309\u538B\u76F4\u63A5\u6309\u54C1\u724C\u8272\u52A0\u6DF1 */\n background: color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 78%, #000000);\n}\n\n.xps-btn-outline:active:not(:disabled) {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 16%, transparent);\n}\n\n.xps-btn-danger:active:not(:disabled) {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary, #d83931) 16%, transparent);\n}\n\n.xps-btn-ghost:active:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-active, rgba(38, 49, 72, 0.1));\n}\n\n.xps-icon-btn:active:not(:disabled),\n.xps-nav-item:active {\n background: var(--dsw-alias-interactive-bg-active, rgba(38, 49, 72, 0.1));\n}\n\n.xps-row:active {\n background: var(--dsw-alias-interactive-bg-active, rgba(38, 49, 72, 0.1));\n}\n\n/* \u7126\u70B9\u73AF:\u53EA\u5728\u952E\u76D8\u5BFC\u822A\u65F6\u51FA\u73B0(:focus-visible),\u9F20\u6807\u70B9\u51FB\u4E0D\u753B\u73AF */\n.xps-btn:focus-visible,\n.xps-icon-btn:focus-visible,\n.xps-nav-item:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #3370ff);\n outline-offset: 2px;\n}\n\n/* \u6574\u884C\u5361\u7247\u7528\u5185\u63CF\u8FB9,\u907F\u514D\u8D34\u5230\u5185\u5BB9\u533A\u8FB9\u7F18\u88AB\u88C1\u6389 */\n.xps-row:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #3370ff);\n outline-offset: -2px;\n}\n\n/* \u7981\u7528\u6001:\u9664\u5404\u7EC4\u4EF6\u81EA\u5DF1\u7684 opacity \u5916,\u6E38\u6807\u7EDF\u4E00\u515C\u5E95 */\n.xps-app :disabled {\n cursor: not-allowed;\n}\n\n/* \u52A8\u6548\u504F\u597D:reduce \u65F6\u5173\u6389\u8FC7\u6E21\u4E0E\u5165\u573A\u52A8\u753B(\u6309\u538B\u7684\u7F29\u653E\u4E5F\u4E00\u5E76\u53D6\u6D88) */\n@media (prefers-reduced-motion: reduce) {\n .xps-btn,\n .xps-icon-btn,\n .xps-nav-item,\n .xps-input,\n .xps-row,\n .xps-toast,\n .xps-overlay,\n .xps-dialog {\n transition: none;\n animation: none;\n }\n\n .xps-btn:active:not(:disabled) {\n transform: none;\n }\n}\n";
3265
+ var theme_default = "/* \u85AA\u4EBA\u85AA\u4E8B\u5E02\u573A client \u4E3B\u9898:\u5BF9\u6807\u5BBF\u4E3B\u5B98\u65B9\u63D2\u4EF6\u7BA1\u7406\u5668(PluginManagerPage.module.css)\u89C6\u89C9\u8BED\u8A00,\n * \u5168\u90E8\u8D70\u5BBF\u4E3B --dsw-alias-* token(\u5E26\u515C\u5E95\u503C,token \u7F3A\u5931\u65F6\u53EF\u72EC\u7ACB\u9884\u89C8)\u3002 */\n\n/* ---------- \u9875\u9762\u9AA8\u67B6 ---------- */\n\n.xps-app {\n display: flex;\n width: 100%;\n height: 100%;\n background: var(--dsw-alias-bg-layer-1, #ffffff);\n color: var(--dsw-alias-label-primary, #1f2329);\n font-family: inherit;\n}\n\n/* \u5DE6\u4FA7\u4E8C\u7EA7\u5BFC\u822A(B \xB7 \u56FE\u6807\u5C45\u4E0A\u84DD\u8C03\u7EC6\u7EBF\u98CE:\u5706\u89D2\u5757 r10,\u9009\u4E2D\u6D45\u84DD\u5E95+\u54C1\u724C\u84DD\u5B57) */\n.xps-nav {\n flex: none;\n width: 92px;\n box-sizing: border-box;\n padding: 16px 10px;\n display: flex;\n flex-direction: column;\n gap: 3px;\n border-right: 0.5px solid var(--dsw-alias-border-l2, #dee0e3);\n}\n\n.xps-nav-item {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 3px;\n padding: 9px 0 7px;\n border: none;\n border-radius: 10px;\n background: transparent;\n cursor: pointer;\n color: var(--dsw-alias-label-secondary, #646a73);\n font-family: inherit;\n font-size: 12px;\n line-height: 18px;\n}\n\n.xps-nav-item:hover {\n background: var(--dsw-alias-interactive-bg-hover, rgba(0, 0, 0, 0.04));\n}\n\n.xps-nav-item-active,\n.xps-nav-item-active:hover {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 10%, var(--dsw-alias-bg-layer-1, #ffffff));\n color: var(--dsw-alias-brand-primary, #3370ff);\n font-weight: 600;\n}\n\n.xps-nav-icon {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n line-height: 0;\n}\n\n.xps-nav-label {\n white-space: nowrap;\n}\n\n/* \u5185\u5BB9\u533A:\u5B98\u65B9\u9875\u540C\u6B3E\u5C45\u4E2D\u5217(28px \u9876 / clamp \u4FA7 / 48px \u5E95,960 \u4E0A\u9650) */\n.xps-content {\n flex: 1;\n min-width: 0;\n overflow: auto;\n box-sizing: border-box;\n display: flex;\n flex-direction: column;\n align-items: center;\n padding: 28px clamp(24px, 4vw, 48px) 48px;\n}\n\n.xps-content > * {\n width: 100%;\n max-width: 960px;\n box-sizing: border-box;\n}\n\n/* \u9875\u5934:flex space-between,\u6807\u9898 20/28/500,\u526F\u9898 13/20 secondary */\n.xps-page-head {\n display: flex;\n align-items: flex-start;\n justify-content: space-between;\n gap: 16px;\n margin-bottom: 20px;\n}\n\n.xps-page-title {\n margin: 0;\n font-size: 20px;\n line-height: 28px;\n font-weight: 600;\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n/* \u6807\u9898\u884C\u5185\u6302\u5FBD\u6807(\u8BA1\u6570\u7B49\u72B6\u6001\u4FE1\u606F\u8DDF\u968F\u6807\u9898,\u4E0D\u6DF7\u8FDB\u53F3\u4E0A\u89D2\u64CD\u4F5C\u533A) */\n.xps-title-with-badges {\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n.xps-page-intro {\n margin: 4px 0 0;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-secondary, #646a73);\n}\n\n.xps-page-actions {\n flex: none;\n display: flex;\n align-items: center;\n gap: 8px;\n}\n\n/* \u533A\u5757\u9898 14/22/500 */\n.xps-section-title {\n margin: 0;\n font-size: 14px;\n line-height: 22px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n/* ---------- \u6587\u5B57\u8272\u9636\u5DE5\u5177\u7C7B ---------- */\n\n.xps-text-secondary {\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-secondary, #646a73);\n}\n\n/* \u8BF4\u660E/\u8BA1\u6570:12/18 tertiary */\n.xps-text-caption {\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary, #8f959e);\n}\n\n/* \u5305\u540D/\u7248\u672C\u53F7\u7B49 mono */\n.xps-mono {\n font-family: var(--dsw-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);\n}\n\n/* ---------- \u6309\u94AE(\u80F6\u56CA) ---------- */\n\n.xps-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n gap: 6px;\n height: 32px;\n box-sizing: border-box;\n padding: 0 14px;\n border-radius: 16px;\n border: 0.5px solid var(--dsw-alias-border-l3, #d0d3d9);\n background: transparent;\n color: var(--dsw-alias-label-primary, #1f2329);\n font-family: inherit;\n font-size: 13px;\n line-height: 20px;\n cursor: pointer;\n white-space: nowrap;\n}\n\n.xps-btn:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover, rgba(31, 35, 41, 0.06));\n}\n\n.xps-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n/* \u4E3B\u6309\u94AE(B \u65B9\u5411\u8BC6\u522B\u8272):\u5B9E\u5FC3\u54C1\u724C\u84DD + \u767D\u5B57,hover \u52A0\u6DF1 */\n.xps-btn-primary {\n background: var(--dsw-alias-brand-primary, #3370ff);\n border-color: transparent;\n color: var(--dsw-alias-label-primary-foreground, #ffffff);\n}\n\n.xps-btn-primary:hover:not(:disabled) {\n background: var(--dsw-alias-button-primary-hover, color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 85%, #000000));\n}\n\n/* \u63CF\u8FB9\u4E3B\u6309\u94AE(\u5DF2\u5B89\u88C5/\u66F4\u65B0\u6001):\u54C1\u724C\u84DD\u63CF\u8FB9 + \u84DD\u5B57\u900F\u660E\u5E95 */\n.xps-btn-outline {\n border: 1px solid var(--dsw-alias-brand-primary, #3370ff);\n background: transparent;\n color: var(--dsw-alias-brand-primary, #3370ff);\n}\n\n.xps-btn-outline:hover:not(:disabled) {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 8%, transparent);\n}\n\n/* \u5371\u9669\u6309\u94AE:\u590D\u7528\u6B21\u6309\u94AE,\u7EA2\u5B57 + 30% \u7EA2\u6846,hover \u6362\u7EA2 wash */\n.xps-btn-danger {\n color: var(--dsw-alias-state-error-primary, #d83931);\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary, #d83931) 30%, transparent);\n}\n\n.xps-btn-danger:hover:not(:disabled) {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary, #d83931) 8%, transparent);\n}\n\n.xps-btn-ghost {\n border-color: transparent;\n background: transparent;\n color: var(--dsw-alias-label-secondary, #646a73);\n}\n\n.xps-btn-ghost:hover:not(:disabled) {\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n.xps-btn-sm {\n height: 26px;\n padding: 0 10px;\n font-size: 12px;\n line-height: 18px;\n border-radius: 13px;\n}\n\n/* \u56FE\u6807\u6309\u94AE:28\xD728 \u5168\u5706 */\n/* \u56FE\u6807\u6309\u94AE:\u4E0E .xps-btn \u540C\u9AD8(32px)\u3001\u540C 0.5px \u8FB9\u6846,\u73AF\u5F62\u5237\u65B0\u7B49\u56FE\u6807\u6309\u94AE\u4E0E\u6587\u5B57\u6309\u94AE\u5E76\u6392\u65F6\u6BD4\u4F8B\u4E00\u81F4 */\n.xps-icon-btn {\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 32px;\n height: 32px;\n flex: none;\n padding: 0;\n border: 0.5px solid var(--dsw-alias-border-l3, #d0d3d9);\n border-radius: 999px;\n background: transparent;\n color: var(--dsw-alias-label-secondary, #646a73);\n cursor: pointer;\n font-family: inherit;\n font-size: 14px;\n transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease,\n opacity 0.15s ease;\n}\n\n.xps-icon-btn:hover:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-hover, rgba(31, 35, 41, 0.06));\n border-color: var(--dsw-alias-border-l4, #a8abb2);\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n.xps-icon-btn:active:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-active, rgba(38, 49, 72, 0.1));\n transform: scale(0.96);\n}\n\n.xps-icon-btn:disabled {\n opacity: 0.4;\n cursor: not-allowed;\n}\n\n/* ---------- \u8F93\u5165\u6846 ---------- */\n\n.xps-input {\n width: 100%;\n box-sizing: border-box;\n height: 32px;\n padding: 0 10px;\n border-radius: 8px;\n border: 0.5px solid var(--dsw-alias-border-l4, #c9cdd4);\n background: var(--dsw-alias-bg-layer-1, #ffffff);\n color: var(--dsw-alias-label-primary, #1f2329);\n font-family: inherit;\n font-size: 13px;\n line-height: 20px;\n outline: none;\n}\n\n.xps-input::placeholder {\n color: var(--dsw-alias-label-tertiary, #8f959e);\n}\n\n/* \u8F93\u5165\u6846 hover:\u8FB9\u6846\u8F7B\u62AC\u4E00\u6863,\u4E0E focus \u7684\u54C1\u724C\u84DD\u533A\u5206 */\n.xps-input:hover:not(:disabled):not(:focus) {\n border-color: var(--dsw-alias-border-l4, #a8abb2);\n}\n\n.xps-input:disabled {\n opacity: 0.6;\n cursor: not-allowed;\n}\n\n.xps-input:focus {\n border-color: var(--dsw-alias-brand-primary, #3370ff);\n box-shadow: inset 0 0 0 0.5px var(--dsw-alias-brand-primary, #3370ff);\n}\n\n/* ---------- \u5FBD\u6807(\u80F6\u56CA 11/17/500) ---------- */\n\n.xps-badge {\n display: inline-flex;\n align-items: center;\n padding: 1px 8px;\n border-radius: 999px;\n border: 0.5px solid var(--dsw-alias-border-l3, #dee0e3);\n font-size: 11px;\n line-height: 17px;\n font-weight: 500;\n white-space: nowrap;\n background: var(--dsw-alias-bg-layer-2, #f5f6f7);\n color: var(--dsw-alias-label-secondary, #646a73);\n}\n\n.xps-badge-success {\n background: color-mix(in srgb, var(--dsw-alias-state-success-primary, #1f9d55) 10%, var(--dsw-alias-bg-layer-1, #ffffff));\n border-color: color-mix(in srgb, var(--dsw-alias-state-success-primary, #1f9d55) 30%, transparent);\n color: var(--dsw-alias-state-success-primary, #1f9d55);\n}\n\n.xps-badge-warning {\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary, #d98708) 10%, var(--dsw-alias-bg-layer-1, #ffffff));\n border-color: color-mix(in srgb, var(--dsw-alias-state-warn-primary, #d98708) 30%, transparent);\n color: var(--dsw-alias-state-warn-primary, #d98708);\n}\n\n.xps-badge-error {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary, #d83931) 10%, var(--dsw-alias-bg-layer-1, #ffffff));\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary, #d83931) 30%, transparent);\n color: var(--dsw-alias-state-error-primary, #d83931);\n}\n\n.xps-badge-info {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 10%, var(--dsw-alias-bg-layer-1, #ffffff));\n border-color: color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 30%, transparent);\n color: var(--dsw-alias-brand-primary, #3370ff);\n}\n\n/* ---------- \u5217\u8868\u884C(\u53D1\u4E1D\u7EBF\u6E05\u5355\u5F0F:\u4E0E\u5E02\u573A\u884C .xps-mk-row\u3001\u5F00\u53D1\u8005\u884C .xps-dev-item \u540C\u8303\u5F0F) ---------- */\n\n.xps-row-list {\n display: flex;\n flex-direction: column;\n}\n\n.xps-row {\n display: flex;\n align-items: center;\n gap: 12px;\n padding: 10px 8px;\n border-bottom: 0.5px solid var(--dsw-alias-border-l2, #dee0e3);\n border-radius: 0;\n background: transparent;\n cursor: pointer;\n min-width: 0;\n transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease,\n opacity 0.15s ease;\n}\n\n/* \u6E05\u5355\u672B\u884C\u53BB\u53D1\u4E1D\u7EBF(\u4E0E .xps-dev-item:last-child \u540C\u505A\u6CD5) */\n.xps-row-list > .xps-row:last-child {\n border-bottom: none;\n}\n\n/* \u884C hover:\u6574\u884C\u80CC\u666F\u8F7B\u62AC,\u4E0E\u5E02\u573A\u884C\u540C\u5C42\u7EA7 */\n.xps-row:hover {\n background: var(--dsw-alias-interactive-bg-hover, rgba(31, 35, 41, 0.06));\n}\n\n/* \u56FE\u6807\u6846 40\xD740\u30010.5px hairline\u3001r10 */\n.xps-row-icon {\n flex: none;\n display: inline-flex;\n align-items: center;\n justify-content: center;\n width: 40px;\n height: 40px;\n border: 0.5px solid var(--dsw-alias-border-l3, #d0d3d9);\n border-radius: 10px;\n color: var(--dsw-alias-label-secondary, #646a73);\n font-size: 18px;\n line-height: 1;\n}\n\n.xps-row-main {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 2px;\n}\n\n.xps-row-title {\n display: flex;\n align-items: center;\n gap: 8px;\n min-width: 0;\n}\n\n/* \u884C\u9898 14/20/500(\u5B98\u65B9\u884C\u6807\u9898\u89C4\u683C)\u3002\u5C55\u793A\u540D\u4E0E\u300C\u56DE\u9000\u7684\u5305\u540D\u300D\u90FD\u7528\u666E\u901A\u5B57\u4F53:\n * \u6807\u8BC6\u7B26\u53EA\u5728\u540E\u9762\u7684 .xps-row-pkg \u91CC\u8D70\u7B49\u5BBD,\u4E0E\u5E02\u573A/\u5F00\u53D1\u8005\u9875\u540C\u4E00\u89C4\u5219\u3002 */\n.xps-row-name {\n font-size: 14px;\n line-height: 20px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1f2329);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n/* \u5C55\u793A\u540D\u4E4B\u540E\u7684\u5305\u540D(\u6807\u8BC6\u7B26,\u7B49\u5BBD\u5C0F\u5B57 11px;\u4E0E .xps-mk-row-pkg / .xps-dev-pkg \u540C\u89C4\u683C) */\n.xps-row-pkg {\n flex: none;\n font-size: 11px;\n line-height: 17px;\n color: var(--dsw-alias-label-tertiary, #8f959e);\n}\n\n/* \u884C\u63CF\u8FF0 13/18 tertiary + \u5355\u884C\u622A\u65AD */\n.xps-row-desc {\n font-size: 13px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary, #8f959e);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.xps-row-end {\n flex: none;\n display: inline-flex;\n align-items: center;\n gap: 8px;\n}\n\n/* ---------- \u6A2A\u5E45/\u63D0\u793A\u6761 ---------- */\n\n.xps-banner {\n margin: 0 0 12px;\n padding: 8px 12px;\n border-radius: 10px;\n font-size: 12px;\n line-height: 18px;\n background: color-mix(in srgb, var(--dsw-alias-state-warn-primary, #d98708) 12%, var(--dsw-alias-bg-layer-1, #ffffff));\n border: 0.5px solid color-mix(in srgb, var(--dsw-alias-state-warn-primary, #d98708) 30%, transparent);\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n.xps-banner-error {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary, #d83931) 10%, var(--dsw-alias-bg-layer-1, #ffffff));\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary, #d83931) 30%, transparent);\n color: var(--dsw-alias-state-error-primary, #d83931);\n}\n\n/* ---------- \u7A7A\u6001(dashed 0.5px l2 + r8 + pad 18 \u5C45\u4E2D 13 tertiary) ---------- */\n\n.xps-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n /* \u56FE\u6807 / \u6807\u9898 / \u63CF\u8FF0\u7EDF\u4E00 8px \u8282\u594F */\n gap: 8px;\n padding: 18px;\n border: 0.5px dashed var(--dsw-alias-border-l2, #dee0e3);\n border-radius: 8px;\n color: var(--dsw-alias-label-tertiary, #8f959e);\n font-size: 13px;\n line-height: 20px;\n text-align: center;\n}\n\n.xps-empty-icon {\n font-size: 24px;\n line-height: 1;\n}\n\n.xps-empty-title {\n font-size: 13px;\n line-height: 20px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n/* \u6309\u94AE\u4E0E\u4E0A\u65B9\u6587\u6848\u5408\u8BA1 12px(\u7236\u7EA7 gap 8 + \u8FD9\u91CC 4) */\n.xps-empty-action {\n margin-top: 4px;\n}\n\n/* \u300C\u6211\u7684\u300D\u9875\u672A\u767B\u5F55\u5F15\u5BFC\u5361:\u6D41\u7A0B\u8BF4\u660E + \u524D\u5F80\u5F00\u53D1\u8005\u5E73\u53F0(\u65E0\u4EE4\u724C\u8F93\u5165\u5165\u53E3,\u767B\u5F55\u53EA\u5728\u8BBE\u7F6E\u91CC) */\n.xps-guide {\n display: flex;\n flex-direction: column;\n gap: 12px;\n padding: 20px 24px;\n border: 0.5px dashed var(--dsw-alias-border-l2, #dee0e3);\n border-radius: 8px;\n}\n\n.xps-guide-title {\n font-size: 14px;\n line-height: 20px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n.xps-guide-desc {\n margin: 0;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-secondary, #646a73);\n}\n\n.xps-guide-steps {\n margin: 0;\n padding-left: 20px;\n display: flex;\n flex-direction: column;\n gap: 6px;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-secondary, #646a73);\n}\n\n.xps-guide-actions {\n display: flex;\n align-items: center;\n gap: 8px;\n margin-top: 4px;\n}\n\n.xps-guide-url {\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary, #8f959e);\n word-break: break-all;\n}\n\n/* ---------- \u4E0A\u4F20\u8868\u5355(\u6253\u5305\u63D0\u4EA4) ---------- */\n\n/* \u62D6\u5165 / \u9009\u62E9\u533A:dashed \u5927\u9776\u533A;\u62D6\u60AC\u65F6\u6574\u533A\u54C1\u724C\u84DD\u63CF\u8FB9 + \u6D45\u84DD wash(.xps-up-drop-over) */\n.xps-up-drop {\n display: flex;\n flex-direction: column;\n align-items: center;\n gap: 4px;\n padding: 28px 16px;\n margin-bottom: 12px;\n text-align: center;\n border: 0.5px dashed var(--dsw-alias-border-l4, #c9cdd4);\n border-radius: 12px;\n cursor: pointer;\n transition: background-color 0.15s ease, border-color 0.15s ease;\n}\n\n.xps-up-drop:hover {\n background: var(--dsw-alias-interactive-bg-hover, rgba(31, 35, 41, 0.04));\n}\n\n.xps-up-drop-over,\n.xps-up-drop-over:hover {\n border-color: var(--dsw-alias-brand-primary, #3370ff);\n background: color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 8%, transparent);\n}\n\n.xps-up-drop-icon {\n font-size: 28px;\n line-height: 1;\n}\n\n.xps-up-drop-title {\n font-size: 14px;\n line-height: 22px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n.xps-up-drop-actions {\n display: flex;\n gap: 8px;\n margin-top: 8px;\n}\n\n/* \u5206\u7EC4\u5361\u7247:\u8BC6\u522B\u7ED3\u679C / \u63D2\u4EF6\u4FE1\u606F\u5404\u4E00\u5F20,\u66FF\u4EE3\u6563\u843D\u7684\u884C\u5185\u8FB9\u8DDD */\n.xps-up-card {\n padding: 14px 16px;\n margin-bottom: 12px;\n border: 0.5px solid var(--dsw-alias-border-l2, #dee0e3);\n border-radius: 10px;\n}\n\n.xps-up-card-actions {\n margin-left: auto;\n display: flex;\n gap: 4px;\n}\n\n/* \u4E0A\u4F20\u9875\u53CC\u680F:\u5DE6\u300C\u9009\u62E9\u5185\u5BB9 + \u8BC6\u522B\u7ED3\u679C\u300D\u53F3\u300C\u63D2\u4EF6\u4FE1\u606F + \u63D0\u4EA4\u300D,\u4E0E\u5176\u4ED6\u9875\u5171\u7528\u6807\u51C6 960 \u5217\u3002\n * \u5B50\u5143\u7D20\u76F4\u63A5\u505A grid item \u5E76\u663E\u5F0F\u5B9A\u4F4D:\u5DE6\u680F 1 \u5217\u4E09\u4E2A\u5757,\u53F3\u680F 2 \u5217\u4E24\u4E2A\u5757(r2-5 \u62C9\u4F38),\n * \u4E24\u680F\u5E95\u8FB9\u5929\u7136\u5BF9\u9F50;\u7A84\u5C4F(<880px)\u9000\u5316\u4E3A\u5355\u5217\u3001\u6309 DOM \u987A\u5E8F\u5806\u53E0 */\n.xps-up-layout {\n display: grid;\n grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);\n gap: 16px 16px;\n align-items: stretch;\n}\n\n/* \u76F4\u63A5\u5B50\u5143\u7D20\u5373\u7F51\u683C\u9879:\u5757\u81EA\u8EAB\u7684\u5916\u8FB9\u8DDD\u5F52\u96F6,\u95F4\u8DDD\u7EDF\u4E00\u4EA4\u7ED9 grid gap */\n.xps-up-side-drop,\n.xps-up-side-notice,\n.xps-up-side-scan,\n.xps-up-main-form {\n margin-bottom: 0;\n}\n\n.xps-up-layout > * {\n min-width: 0;\n min-height: 0;\n}\n\n.xps-up-side-drop { grid-column: 1; grid-row: 1; }\n.xps-up-side-notice { grid-column: 1; grid-row: 2; }\n.xps-up-side-scan { grid-column: 1; grid-row: 3 / 6; }\n.xps-up-main-form { grid-column: 2; grid-row: 1 / 6; }\n.xps-up-main-submit { grid-column: 2; grid-row: 6; }\n\n/* \u7A84\u5C4F:\u53CC\u680F\u5148\u4E8E\u8868\u5355\u6805\u683C\u584C\u6210\u5355\u5217,\u907F\u514D\u5B57\u6BB5\u88AB\u538B\u5230\u6362\u884C\u96BE\u8BFB */\n@media (max-width: 1120px) {\n .xps-up-grid {\n grid-template-columns: 1fr;\n }\n}\n\n@media (max-width: 1024px) {\n .xps-up-layout {\n grid-template-columns: minmax(0, 1fr);\n }\n\n .xps-up-layout > [class^='xps-up-'],\n .xps-up-layout > [class*=' xps-up-'] {\n grid-column: auto;\n grid-row: auto;\n }\n}\n\n/* \u53F3\u680F\u7A7A\u6001:\u4E0E\u5DE6\u4FA7\u62D6\u5165\u533A\u540C\u6B3E\u865A\u7EBF\u5361\u7247,\u7B49\u9AD8\u5C45\u4E2D;\u70B9\u51FB\u7B49\u540C\u300C\u9009\u62E9\u76EE\u5F55\u300D\u3002\n * \u62C9\u4F38\u7531 grid item \u81EA\u8EAB\u5B8C\u6210(display: flex \u6491\u6EE1\u5206\u914D\u5230\u7684\u884C),\u4E0D\u4F9D\u8D56\u767E\u5206\u6BD4\u9AD8\u5EA6 */\n.xps-up-empty {\n display: flex;\n flex-direction: column;\n align-items: center;\n justify-content: center;\n gap: 8px;\n box-sizing: border-box;\n align-self: stretch;\n height: 100%;\n min-height: 200px;\n padding: 28px 16px;\n text-align: center;\n border: 0.5px dashed var(--dsw-alias-border-l2, #dee0e3);\n border-radius: 12px;\n cursor: pointer;\n transition: background-color 0.15s ease, border-color 0.15s ease;\n}\n\n.xps-up-empty:hover {\n background: var(--dsw-alias-interactive-bg-hover, rgba(31, 35, 41, 0.04));\n}\n\n/* \u7A7A\u6001\u53CC\u5361:\u5DE6\u62D6\u5165\u533A + \u53F3\u6D41\u7A0B\u8BF4\u660E,\u5355\u884C\u7F51\u683C\u5929\u7136\u7B49\u9AD8(\u5404\u81EA stretch) */\n.xps-up-empty-grid {\n display: grid;\n grid-template-columns: minmax(0, 2fr) minmax(0, 3fr);\n gap: 16px;\n align-items: stretch;\n}\n\n.xps-up-empty-grid .xps-up-drop {\n justify-content: center;\n margin-bottom: 0;\n}\n\n/* \u6D41\u7A0B\u8BF4\u660E\u5361\u53EA\u505A\u5C55\u793A:\u53BB\u6389\u624B\u578B\u4E0E\u60AC\u505C\u53CD\u9988 */\n.xps-up-empty-static,\n.xps-up-empty-static:hover {\n justify-content: center;\n cursor: default;\n background: transparent;\n}\n\n@media (max-width: 1024px) {\n .xps-up-empty-grid {\n grid-template-columns: minmax(0, 1fr);\n }\n}\n\n/* \u7B2C 1 \u6B65\u5361\u91CC\u300C\u8FD8\u5DEE\u4EE3\u7801\u76EE\u5F55\u300D\u7684\u5C31\u5730\u63D0\u793A\u6761 */\n.xps-up-source-missing {\n display: flex;\n align-items: center;\n justify-content: space-between;\n gap: 10px;\n padding: 8px 10px;\n border-radius: 8px;\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-state-warning-primary, #b25e09);\n background: color-mix(in srgb, var(--dsw-alias-state-warning-primary, #dc6803) 8%, transparent);\n}\n\n/* \u7A7A\u6001\u53F3\u680F\u7684\u53D1\u5E03\u6D41\u7A0B:\u586B\u5145\u539F\u672C\u7684\u6B7B\u7A7A\u95F4,\u517C\u505A\u5F15\u5BFC(\u5DE6\u5BF9\u9F50\u6E05\u5355,\u5C45\u4E2D\u653E\u7F6E) */\n.xps-up-flow {\n display: flex;\n flex-direction: column;\n gap: 12px;\n width: 100%;\n max-width: 380px;\n padding: 8px 4px;\n}\n\n.xps-up-flow-title {\n font-size: 13px;\n line-height: 20px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n.xps-up-flow-item {\n display: flex;\n gap: 10px;\n text-align: left;\n}\n\n.xps-up-flow-no {\n flex: none;\n display: flex;\n align-items: center;\n justify-content: center;\n width: 18px;\n height: 18px;\n margin-top: 1px;\n border-radius: 50%;\n font-size: 11px;\n font-weight: 500;\n color: var(--dsw-alias-brand-primary, #3370ff);\n background: color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 10%, transparent);\n}\n\n.xps-up-flow-main {\n display: flex;\n flex-direction: column;\n gap: 2px;\n min-width: 0;\n}\n\n.xps-up-flow-item-title {\n font-size: 13px;\n line-height: 20px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n.xps-up-flow-item-desc {\n font-size: 12px;\n line-height: 18px;\n color: var(--dsw-alias-label-tertiary, #8f959e);\n}\n\n/* \u5361\u7247\u6807\u9898\u4E0A\u7684\u6B65\u9AA4\u5FBD\u6807(\u7B2C 1 \u6B65 / \u7B2C 2 \u6B65),\u5EFA\u7ACB\u300C\u9009\u5185\u5BB9 \u2192 \u586B\u4FE1\u606F\u300D\u7684\u6D41\u7A0B\u611F */\n.xps-up-step-chip {\n flex: none;\n padding: 1px 8px;\n border-radius: 999px;\n font-size: 11px;\n line-height: 18px;\n font-weight: 500;\n color: var(--dsw-alias-brand-primary, #3370ff);\n background: color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 10%, transparent);\n}\n\n/* \u9875\u811A\u300C\u53D1\u5E03\u8BF4\u660E\u300D:\u5E38\u9A7B\u5168\u6587\u8BF4\u660E\u5361 */\n.xps-up-guide {\n margin-top: 20px;\n padding: 16px 20px;\n border: 0.5px solid var(--dsw-alias-border-l2, #dee0e3);\n border-radius: 10px;\n}\n\n.xps-up-guide-title {\n margin-bottom: 10px;\n font-size: 13px;\n line-height: 20px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n.xps-up-guide ol {\n margin: 0;\n padding-left: 20px;\n display: grid;\n gap: 8px;\n}\n\n.xps-up-guide li {\n font-size: 12px;\n line-height: 20px;\n color: var(--dsw-alias-label-secondary, #4e5460);\n}\n\n.xps-up-guide li::marker {\n color: var(--dsw-alias-label-tertiary, #8f959e);\n}\n\n.xps-up-guide b {\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n/* \u8BC6\u522B\u7ED3\u679C\u5361\u6807\u9898:\u957F\u6587\u6848\u5141\u8BB8\u6362\u884C,\u8865\u9009\u6309\u94AE\u56FA\u5B9A\u53F3\u4FA7\u4E0D\u53C2\u4E0E\u6362\u884C\u6324\u538B */\n.xps-up-card-title {\n display: flex;\n align-items: baseline;\n gap: 8px;\n margin-bottom: 10px;\n font-size: 13px;\n line-height: 20px;\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n/* \u8865\u9009\u6309\u94AE\u56FA\u5B9A\u53F3\u4FA7;\u6807\u9898\u8BCD\u4E0D\u6362\u884C(\u53EA\u6709\u6807\u9898\u5355\u9879\u65F6\u4E0D\u53D7 margin-left:auto \u8BEF\u4F24) */\n.xps-up-card-title > .xps-up-card-actions {\n flex: none;\n margin-left: auto;\n}\n\n.xps-up-card-title > span:first-child {\n flex: none;\n}\n\n/* \u8868\u5355\u6805\u683C:\u4E24\u5217\u4E00\u884C(\u5355\u9879\u7528 .xps-up-grid-single \u6536\u6210\u6574\u884C)\u3002\n * align-items: end:\u5DE6\u53F3\u5B57\u6BB5\u6807\u7B7E\u884C\u6570\u4E0D\u540C\u65F6\u8F93\u5165\u6846\u5E95\u8FB9\u5BF9\u9F50,\u6807\u7B7E\u5404\u81EA\u5411\u4E0A\u751F\u957F */\n.xps-up-grid {\n display: grid;\n grid-template-columns: 1fr 1fr;\n gap: 10px 12px;\n margin-bottom: 10px;\n align-items: end;\n}\n\n.xps-up-grid-single {\n grid-template-columns: 1fr;\n}\n\n/* \u4EA7\u7269 / \u6E90\u7801\u5019\u9009\u884C:radio + \u56FE\u6807 + \u540D\u79F0(\u4E00\u884C) + \u76F8\u5BF9\u8DEF\u5F84(\u5C0F\u5B57\u4E00\u884C,\u8D85\u957F\u622A\u65AD);\n * \u9009\u4E2D\u6001\u54C1\u724C\u84DD\u63CF\u8FB9 */\n.xps-up-candidate {\n display: flex;\n align-items: center;\n gap: 8px;\n padding: 8px 10px;\n margin-bottom: 4px;\n border: 0.5px solid var(--dsw-alias-border-l2, #dee0e3);\n border-radius: 8px;\n font-size: 13px;\n line-height: 20px;\n cursor: pointer;\n min-width: 0;\n transition: background-color 0.15s ease, border-color 0.15s ease;\n}\n\n.xps-up-candidate:hover {\n background: var(--dsw-alias-interactive-bg-hover, rgba(31, 35, 41, 0.06));\n}\n\n.xps-up-candidate-active,\n.xps-up-candidate-active:hover {\n border-color: var(--dsw-alias-brand-primary, #3370ff);\n background: color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 6%, transparent);\n}\n\n/* radio / \u56FE\u6807\u4E0D\u53C2\u4E0E\u6536\u7F29 */\n.xps-up-candidate > input,\n.xps-up-candidate > span:first-of-type {\n flex: none;\n}\n\n/* \u540D\u79F0 + \u8DEF\u5F84\u4E24\u884C\u5757:\u5360\u6EE1\u5269\u4F59\u5BBD\u5EA6,\u5185\u90E8\u5404\u81EA\u622A\u65AD */\n.xps-up-candidate-main {\n flex: 1;\n min-width: 0;\n display: flex;\n flex-direction: column;\n gap: 1px;\n}\n\n.xps-up-candidate-name {\n font-weight: 500;\n color: var(--dsw-alias-label-primary, #1f2329);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n}\n\n.xps-up-candidate-path {\n font-size: 12px;\n line-height: 17px;\n color: var(--dsw-alias-label-tertiary, #8f959e);\n overflow: hidden;\n text-overflow: ellipsis;\n white-space: nowrap;\n direction: rtl;\n text-align: left;\n}\n\n.xps-up-candidate-path > bdi {\n direction: ltr;\n unicode-bidi: isolate;\n}\n\n/* ---------- \u9AA8\u67B6\u5C4F ---------- */\n\n.xps-skeleton-group {\n display: flex;\n flex-direction: column;\n gap: 12px;\n}\n\n.xps-skeleton {\n height: 56px;\n border-radius: 12px;\n background: linear-gradient(\n 90deg,\n var(--dsw-alias-interactive-bg-hover, rgba(31, 35, 41, 0.05)) 25%,\n var(--dsw-alias-border-l2, rgba(31, 35, 41, 0.1)) 37%,\n var(--dsw-alias-interactive-bg-hover, rgba(31, 35, 41, 0.05)) 63%\n );\n background-size: 400% 100%;\n animation: xps-skeleton-loading 1.4s ease infinite;\n}\n\n@keyframes xps-skeleton-loading {\n 0% {\n background-position: 100% 50%;\n }\n 100% {\n background-position: 0 50%;\n }\n}\n\n/* ---------- Toast ---------- */\n\n.xps-toast-host {\n position: fixed;\n top: 16px;\n left: 50%;\n transform: translateX(-50%);\n display: flex;\n flex-direction: column;\n gap: 8px;\n z-index: 9999;\n}\n\n.xps-toast {\n padding: 8px 14px;\n border-radius: 10px;\n font-size: 13px;\n line-height: 20px;\n /* \u591A\u884C\u63D0\u793A\u4E0D\u88AB\u6298\u53E0\u6210\u4E00\u6BB5(\u957F\u6587\u6848\u6539\u8D70 .xps-dialog-pre,\u8FD9\u91CC\u515C\u4F4F\u77ED\u7684\u591A\u884C\u63D0\u793A) */\n white-space: pre-wrap;\n background: var(--dsw-alias-bg-layer-3, #f0f1f2);\n color: var(--dsw-alias-label-primary, #1f2329);\n border: 0.5px solid var(--dsw-alias-border-l2, #dee0e3);\n box-shadow: 0 4px 16px var(--dsw-alias-bg-mask-1, rgba(0, 0, 0, 0.12));\n cursor: pointer;\n /* \u5165\u573A:\u6DE1\u5165 + \u8F7B\u5FAE\u4E0A\u79FB(\u79BB\u573A\u7531 useToasts \u76F4\u63A5\u4ECE\u5217\u8868\u79FB\u9664,\u4E0D\u505A\u5EF6\u8FDF\u5378\u8F7D) */\n animation: xps-fade-slide-in 0.15s ease-out;\n}\n\n@keyframes xps-fade-slide-in {\n from { opacity: 0; transform: translateY(-4px); }\n to { opacity: 1; transform: translateY(0); }\n}\n\n.xps-toast-success {\n border-color: color-mix(in srgb, var(--dsw-alias-state-success-primary, #1f9d55) 30%, transparent);\n}\n\n.xps-toast-error {\n border-color: color-mix(in srgb, var(--dsw-alias-state-error-primary, #d83931) 30%, transparent);\n}\n\n/* ---------- \u5BF9\u8BDD\u6846 ---------- */\n\n.xps-overlay {\n position: fixed;\n inset: 0;\n z-index: 9998;\n display: flex;\n align-items: center;\n justify-content: center;\n background: var(--dsw-alias-bg-mask-2, rgba(0, 0, 0, 0.45));\n animation: xps-fade-in 0.15s ease-out;\n}\n\n@keyframes xps-fade-in {\n from { opacity: 0; }\n to { opacity: 1; }\n}\n\n.xps-dialog {\n width: 360px;\n padding: 16px 20px;\n border-radius: 12px;\n border: 0.5px solid var(--dsw-alias-border-l2, #dee0e3);\n background: var(--dsw-alias-bg-layer-3, #ffffff);\n box-shadow: 0 8px 32px var(--dsw-alias-bg-mask-1, rgba(0, 0, 0, 0.18));\n /* \u5165\u573A:\u6DE1\u5165 + 0.98 \u2192 1 \u8F7B\u5FAE\u653E\u5927 */\n animation: xps-dialog-in 0.15s ease-out;\n}\n\n@keyframes xps-dialog-in {\n from { opacity: 0; transform: scale(0.98); }\n to { opacity: 1; transform: scale(1); }\n}\n\n.xps-dialog-title {\n font-size: 14px;\n line-height: 22px;\n font-weight: 500;\n margin-bottom: 8px;\n color: var(--dsw-alias-label-primary, #1f2329);\n}\n\n.xps-dialog-body {\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-secondary, #646a73);\n margin-bottom: 16px;\n}\n\n.xps-dialog-actions {\n display: flex;\n justify-content: flex-end;\n gap: 8px;\n}\n\n/* \u957F\u6587\u672C\u5BF9\u8BDD\u6846(\u5B89\u88C5\u5931\u8D25\u7684\u591A\u884C\u65E5\u5FD7\u3001\u5F85\u624B\u52A8\u6267\u884C\u7684\u547D\u4EE4):\u6BD4\u901A\u7528\u5BF9\u8BDD\u6846\u5BBD,\u7A84\u5C4F\u81EA\u52A8\u6536\u7A84 */\n.xps-dialog.xps-dialog-wide {\n width: 520px;\n max-width: calc(100vw - 32px);\n box-sizing: border-box;\n}\n\n/* \u6B63\u6587\u539F\u6587\u5757:\u4FDD\u7559\u6362\u884C\u4E0E\u7F29\u8FDB,\u8FC7\u957F\u65F6\u5185\u90E8\u6EDA\u52A8,\u4E0D\u628A\u7A97\u53E3\u6491\u7206;\u53EF\u624B\u52A8\u9009\u4E2D\u590D\u5236 */\n.xps-dialog-pre {\n white-space: pre-wrap;\n max-height: 320px;\n overflow: auto;\n padding: 10px 12px;\n border-radius: 8px;\n background: var(--dsw-alias-bg-layer-2, #f5f6f7);\n border: 0.5px solid var(--dsw-alias-border-l2, #dee0e3);\n font-family: var(--dsw-font-mono, ui-monospace, SFMono-Regular, Menlo, monospace);\n font-size: 12px;\n line-height: 1.6;\n color: var(--dsw-alias-label-primary, #1f2329);\n text-align: left;\n word-break: break-word;\n user-select: text;\n}\n\n/* ---------- \u9875\u9762\u5360\u4F4D(\u9AA8\u67B6\u671F) ---------- */\n\n.xps-page-placeholder {\n padding: 18px;\n border: 0.5px dashed var(--dsw-alias-border-l2, #dee0e3);\n border-radius: 8px;\n font-size: 13px;\n line-height: 20px;\n color: var(--dsw-alias-label-tertiary, #8f959e);\n}\n\n/* ---------- \u4EA4\u4E92\u72B6\u6001(\u5168\u7AD9\u7EDF\u4E00:\u8FC7\u6E21 / \u6309\u538B / \u7126\u70B9\u73AF) ----------\n * \u53EA\u8FC7\u6E21\u989C\u8272\u4E0E\u900F\u660E\u5EA6,\u4E0D\u505A\u4F4D\u79FB\u7F29\u653E\u52A8\u753B;\u6309\u538B\u7528\u4E00\u6863\u66F4\u6DF1\u7684 active \u5E95\u8272 + \u6781\u8F7B\u5FAE\u4E0B\u538B\u3002\n * \u9875\u9762\u79C1\u6709\u6837\u5F0F(market / admin)\u5728\u672C\u6587\u4EF6\u4E4B\u540E\u6CE8\u5165,\u5404\u81EA\u7684\u8FC7\u6E21\u4E0E\u6309\u538B\u6001\u5199\u5728\u5404\u81EA\u6A21\u5757\u91CC\u3002\n */\n\n/* .xps-row \u7684\u8FC7\u6E21\u5199\u5728\u81EA\u5DF1\u7684\u57FA\u7840\u89C4\u5219\u91CC(\u89C1\u4E0A),\u6B64\u5904\u4E0D\u518D\u91CD\u590D\u58F0\u660E */\n.xps-btn,\n.xps-icon-btn,\n.xps-nav-item,\n.xps-input {\n transition: background-color 0.15s ease, border-color 0.15s ease, box-shadow 0.15s ease,\n opacity 0.15s ease;\n}\n\n/* \u6309\u538B:\u80CC\u666F\u518D\u6DF1\u4E00\u6863(interactive-bg-active);\u4E3B/\u63CF\u8FB9/\u5371\u9669\u6309\u94AE\u6309\u5404\u81EA\u8272\u7CFB\u52A0\u6DF1 */\n.xps-btn:active:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-active, rgba(38, 49, 72, 0.1));\n transform: scale(0.98);\n}\n\n.xps-btn-primary:active:not(:disabled) {\n /* \u4E3B\u6309\u94AE\u6CA1\u6709 -active token(\u53EA\u6709 -fill / -hover),\u6309\u538B\u76F4\u63A5\u6309\u54C1\u724C\u8272\u52A0\u6DF1 */\n background: color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 78%, #000000);\n}\n\n.xps-btn-outline:active:not(:disabled) {\n background: color-mix(in srgb, var(--dsw-alias-brand-primary, #3370ff) 16%, transparent);\n}\n\n.xps-btn-danger:active:not(:disabled) {\n background: color-mix(in srgb, var(--dsw-alias-state-error-primary, #d83931) 16%, transparent);\n}\n\n.xps-btn-ghost:active:not(:disabled) {\n background: var(--dsw-alias-interactive-bg-active, rgba(38, 49, 72, 0.1));\n}\n\n.xps-icon-btn:active:not(:disabled),\n.xps-nav-item:active {\n background: var(--dsw-alias-interactive-bg-active, rgba(38, 49, 72, 0.1));\n}\n\n.xps-row:active {\n background: var(--dsw-alias-interactive-bg-active, rgba(38, 49, 72, 0.1));\n}\n\n/* \u7126\u70B9\u73AF:\u53EA\u5728\u952E\u76D8\u5BFC\u822A\u65F6\u51FA\u73B0(:focus-visible),\u9F20\u6807\u70B9\u51FB\u4E0D\u753B\u73AF */\n.xps-btn:focus-visible,\n.xps-icon-btn:focus-visible,\n.xps-nav-item:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #3370ff);\n outline-offset: 2px;\n}\n\n/* \u6574\u884C\u5361\u7247\u7528\u5185\u63CF\u8FB9,\u907F\u514D\u8D34\u5230\u5185\u5BB9\u533A\u8FB9\u7F18\u88AB\u88C1\u6389 */\n.xps-row:focus-visible {\n outline: 2px solid var(--dsw-alias-brand-primary, #3370ff);\n outline-offset: -2px;\n}\n\n/* \u7981\u7528\u6001:\u9664\u5404\u7EC4\u4EF6\u81EA\u5DF1\u7684 opacity \u5916,\u6E38\u6807\u7EDF\u4E00\u515C\u5E95 */\n.xps-app :disabled {\n cursor: not-allowed;\n}\n\n/* \u52A8\u6548\u504F\u597D:reduce \u65F6\u5173\u6389\u8FC7\u6E21\u4E0E\u5165\u573A\u52A8\u753B(\u6309\u538B\u7684\u7F29\u653E\u4E5F\u4E00\u5E76\u53D6\u6D88) */\n@media (prefers-reduced-motion: reduce) {\n .xps-btn,\n .xps-icon-btn,\n .xps-nav-item,\n .xps-input,\n .xps-row,\n .xps-toast,\n .xps-overlay,\n .xps-dialog {\n transition: none;\n animation: none;\n }\n\n .xps-btn:active:not(:disabled) {\n transform: none;\n }\n}\n";
3197
3266
 
3198
3267
  // src/client/theme-inject.ts
3199
3268
  function ensureThemeStyles() {