@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 +357 -288
- package/lib/host/host-info.d.ts +15 -2
- package/lib/host/host-info.js +44 -4
- package/lib/host/index.js +3 -2
- package/lib/host/installer.d.ts +3 -3
- package/lib/host/installer.js +57 -18
- package/lib/host/package-submit.js +52 -92
- package/package.json +7 -6
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
|
-
|
|
197
|
-
|
|
198
|
-
|
|
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
|
|
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
|
-
|
|
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
|
-
|
|
1376
|
-
|
|
1377
|
-
|
|
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)
|
|
1388
|
-
if (ver !== void 0)
|
|
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)
|
|
1378
|
+
if (summaryText !== void 0) setAutoFilled("summary", summaryText, setSummary);
|
|
1392
1379
|
const authorText = pkg?.author;
|
|
1393
|
-
if (authorText !== void 0)
|
|
1380
|
+
if (authorText !== void 0) setAutoFilled("author", authorText, setAuthor);
|
|
1381
|
+
if (readme !== void 0) setAutoFilled("description", readme, setDescription);
|
|
1394
1382
|
});
|
|
1395
1383
|
}
|
|
1396
|
-
|
|
1397
|
-
|
|
1398
|
-
|
|
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
|
-
|
|
1393
|
+
invalidatePendingScan();
|
|
1407
1394
|
setDirFiles([]);
|
|
1408
1395
|
setArtifactCandidates([]);
|
|
1409
|
-
setSourceCandidates([]);
|
|
1410
1396
|
setSelectedArtifact(null);
|
|
1411
|
-
setSelectedSource(null);
|
|
1412
1397
|
setScanned(false);
|
|
1413
|
-
setInspectError(
|
|
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
|
-
|
|
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
|
-
|
|
1444
|
-
|
|
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",
|
|
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\
|
|
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
|
|
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(
|
|
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
|
|
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: "\
|
|
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.
|
|
1591
|
-
|
|
1592
|
-
|
|
1593
|
-
|
|
1594
|
-
|
|
1595
|
-
|
|
1596
|
-
|
|
1597
|
-
|
|
1598
|
-
|
|
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
|
-
|
|
1640
|
-
|
|
1641
|
-
|
|
1642
|
-
|
|
1643
|
-
|
|
1644
|
-
|
|
1645
|
-
|
|
1646
|
-
|
|
1647
|
-
|
|
1648
|
-
|
|
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
|
-
|
|
1653
|
-
|
|
1654
|
-
|
|
1655
|
-
|
|
1656
|
-
|
|
1657
|
-
|
|
1658
|
-
|
|
1659
|
-
|
|
1660
|
-
|
|
1661
|
-
|
|
1662
|
-
|
|
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
|
-
|
|
1667
|
-
|
|
1668
|
-
|
|
1669
|
-
|
|
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 &&
|
|
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: "\
|
|
1683
|
-
/* @__PURE__ */ (0, import_jsx_runtime10.
|
|
1684
|
-
|
|
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\
|
|
1720
|
-
|
|
1721
|
-
|
|
1722
|
-
"
|
|
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
|
-
|
|
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.
|
|
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: "(\
|
|
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\
|
|
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
|
-
] })
|
|
1835
|
-
|
|
1836
|
-
|
|
1837
|
-
|
|
1838
|
-
|
|
1839
|
-
|
|
1840
|
-
|
|
1841
|
-
|
|
1842
|
-
|
|
1843
|
-
|
|
1844
|
-
|
|
1845
|
-
|
|
1846
|
-
|
|
1847
|
-
|
|
1848
|
-
|
|
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
|
-
|
|
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))
|
|
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 = /(\*\*[^*]
|
|
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(
|
|
3011
|
-
|
|
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() {
|