dshmarket 1.65.4 → 1.66.1
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/client/client.js +385 -288
- package/lib/install.js +63 -13
- package/lib/official-desktop.js +14 -1
- package/lib/profile.js +113 -0
- package/lib/recovery.js +51 -0
- package/lib/restart.js +16 -2
- package/lib/routes.js +78 -8
- package/lib/types/dsh-cli.d.ts +13 -0
- package/lib/types/install.d.ts +7 -0
- package/lib/types/profile.d.ts +26 -0
- package/lib/types/recovery.d.ts +1 -0
- package/lib/types/registry.d.ts +5 -0
- package/lib/updates.js +12 -0
- package/package.json +2 -2
- package/src/client/Market.module.css +26 -8
- package/src/client/MarketSection.tsx +109 -52
- package/src/client/download-stats.ts +30 -0
- package/src/client/index.ts +35 -0
- package/src/client/locales.ts +226 -211
- package/src/client/market-data.ts +4 -0
- package/src/dsh-cli.ts +13 -0
- package/src/install.ts +58 -13
- package/src/official-desktop.ts +14 -1
- package/src/profile.ts +107 -0
- package/src/recovery.ts +51 -1
- package/src/registry.ts +5 -0
- package/src/restart.ts +16 -2
- package/src/routes.ts +78 -8
- package/src/updates.ts +11 -0
package/client/client.js
CHANGED
|
@@ -198,9 +198,9 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
198
198
|
setSelfUpdateReady: "有新版本",
|
|
199
199
|
setSelfUpdateHint: "更新会下载新版本,重启后生效。",
|
|
200
200
|
setSelfUpToDateHint: "",
|
|
201
|
-
setSelfHostManagedHint: "
|
|
201
|
+
setSelfHostManagedHint: "这份市场由桌面端安装,新版本请在桌面端更新。",
|
|
202
202
|
setSelfUpdate: "更新",
|
|
203
|
-
setSelfUpdatedHint: "已下载完成。重启 DeepSeek Harness
|
|
203
|
+
setSelfUpdatedHint: "已下载完成。重启 DeepSeek Harness 后新版本才会生效——页面会先显示新版本号。",
|
|
204
204
|
setRegion: "下载区域",
|
|
205
205
|
setRegionGlobal: "全球",
|
|
206
206
|
setRegionChina: "中国大陆",
|
|
@@ -216,8 +216,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
216
216
|
setGithubProxyAuto: "恢复自动",
|
|
217
217
|
setGithubProxyInput: "HTTPS 加速前缀",
|
|
218
218
|
setGithubProxySave: "保存",
|
|
219
|
-
setBuildEnv: "
|
|
220
|
-
setBuildEnvHint: "
|
|
219
|
+
setBuildEnv: "构建环境变量",
|
|
220
|
+
setBuildEnvHint: "作用于市场启动的每个进程(安装、编译、git 等),不只是编译器。每行一个 KEY=value,例如 CC=/usr/bin/gcc-11;PATH 和 CI 由市场管理。留空保存即恢复原有配置。",
|
|
221
221
|
setBuildEnvSave: "保存环境变量",
|
|
222
222
|
setChannel: "更新通道",
|
|
223
223
|
setChannelStable: "稳定版",
|
|
@@ -232,7 +232,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
232
232
|
setSelfRemoveHint: "从这个 profile 卸载市场。已装的其它插件不受影响。",
|
|
233
233
|
setSelfConfirm: "确定要卸载插件市场吗?卸载后需使用命令行重新安装。",
|
|
234
234
|
setSelfPurge: "同时清除市场自己的数据",
|
|
235
|
-
setSelfPurgeOn: "
|
|
235
|
+
setSelfPurgeOn: "将删除:市场的停用清单与自定义分组,以及它写进配置文件的停用记录——被停用的插件将恢复运行。不涉及密码或密钥,市场从不把它们存在磁盘上。",
|
|
236
236
|
setSelfPurgeOff: "保留市场数据。注意:被市场停用的插件会保持停用,且移除后将没有界面可将其重新启用。",
|
|
237
237
|
setSelfRemoveConfirm: "确认卸载",
|
|
238
238
|
setSelfCancel: "取消",
|
|
@@ -248,31 +248,33 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
248
248
|
searchPh: "搜索插件,例如:通知、终端、记忆…",
|
|
249
249
|
searchFavoritesPh: "搜索收藏…",
|
|
250
250
|
clearSearch: "清除搜索",
|
|
251
|
-
capabilityTitle: "
|
|
252
|
-
capShell: "
|
|
253
|
-
capFsRead: "
|
|
254
|
-
capFsWrite: "
|
|
255
|
-
capNetwork: "
|
|
256
|
-
capCredentials: "
|
|
257
|
-
capEnv: "
|
|
258
|
-
capLlm: "
|
|
259
|
-
capSubagent: "
|
|
260
|
-
capDynamicCode: "
|
|
261
|
-
capHostRuntime: "
|
|
262
|
-
capInstallScript: "
|
|
263
|
-
capabilityNone: "
|
|
264
|
-
capabilityUnchecked: "
|
|
265
|
-
|
|
266
|
-
capabilityRedLine: "值得看一眼:{0}",
|
|
267
|
-
capabilityNote: "静态扫描「安装时会下载的那个包」得出的结果,只证有不证无:跳过 node_modules,运行时拼接的地址、动态 import、混淆代码都扫不到。「未检出」不等于安全,也不是我们的评价,请自行判断。",
|
|
251
|
+
capabilityTitle: "它会做什么",
|
|
252
|
+
capShell: "能运行命令",
|
|
253
|
+
capFsRead: "会读你项目里的文件",
|
|
254
|
+
capFsWrite: "会改你项目里的文件",
|
|
255
|
+
capNetwork: "会联网",
|
|
256
|
+
capCredentials: "会用你的密钥",
|
|
257
|
+
capEnv: "会读你的环境变量",
|
|
258
|
+
capLlm: "会调用 AI 模型",
|
|
259
|
+
capSubagent: "会自己开任务干活",
|
|
260
|
+
capDynamicCode: "会临时下载代码来跑",
|
|
261
|
+
capHostRuntime: "会改动 DSH 本体",
|
|
262
|
+
capInstallScript: "安装时就会运行代码",
|
|
263
|
+
capabilityNone: "没有扫描到。这不等于安全。",
|
|
264
|
+
capabilityUnchecked: "还没有扫描结果",
|
|
265
|
+
capabilityNote: "静态扫描只能证明「有」,不能证明「没有」。这不代表它安全。",
|
|
268
266
|
capabilityScannedAt: "扫描于 {0}",
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
267
|
+
capRedCredentialsNetwork: "会联网,并用到你的密钥",
|
|
268
|
+
capRedPlaintextHttp: "有连接没有加密({0})",
|
|
269
|
+
/** The families the scanner can emit (#401): one translation per rule. */
|
|
270
|
+
capRedLiteralIp: "会直接连接固定 IP 地址({0})",
|
|
271
|
+
capRedInstallScript: "安装时会立刻运行它自带的脚本,不需要你打开插件",
|
|
272
|
+
capRedInstallScriptScripts: "安装时会立刻运行 {0},不需要你打开插件",
|
|
273
|
+
capRedCoreTamper: "会改动 DSH 自带的组件",
|
|
274
|
+
capRedCoreTamperDetail: "会改动 DSH 自带的组件({0})",
|
|
273
275
|
favoriteAdd: "加入收藏",
|
|
274
276
|
favoriteRemove: "取消收藏",
|
|
275
|
-
favoritesEmpty: "
|
|
277
|
+
favoritesEmpty: "还没有收藏。在「发现」或「主题」里点书签图标即可收藏。",
|
|
276
278
|
favoritesResultCount: "共 {0} 个收藏",
|
|
277
279
|
favoritesPluginsSection: "插件({0})",
|
|
278
280
|
favoritesThemesSection: "主题({0})",
|
|
@@ -296,9 +298,9 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
296
298
|
uninstallConfirmDesc: "将从当前 profile 中移除该插件。",
|
|
297
299
|
restartHint: "重启方式:关闭当前 dsh 进程后重新运行(例如 dsh web)",
|
|
298
300
|
restartHintSupervised: "本进程是 {0} 服务的主进程,重启交给它负责——市场自己重启会连带杀掉 cgroup 里的接管进程,服务将起不来。请执行 systemctl restart <你的 unit>。确认你的配置能承受市场自行重启(如 KillMode=process),可在本插件配置里手动打开「允许重启」。",
|
|
299
|
-
restartHintDebugged: "当前 dsh
|
|
301
|
+
restartHintDebugged: "当前 dsh 进程正被调试器连接。请从 IDE 或终端停止该进程后重新启动,市场不能从界面里结束正在调试的 dsh。",
|
|
300
302
|
confirmTitle: "安装",
|
|
301
|
-
confirmWarn: "
|
|
303
|
+
confirmWarn: "插件是社区第三方代码。安装即表示你信任该来源;构建脚本默认不会运行。",
|
|
302
304
|
cancel: "取消",
|
|
303
305
|
empty: "没有匹配的插件",
|
|
304
306
|
installedEmpty: "尚未安装社区插件,可前往「发现」页浏览",
|
|
@@ -306,34 +308,34 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
306
308
|
loadRetry: "重试",
|
|
307
309
|
installFail: "安装失败",
|
|
308
310
|
viewSource: "源码",
|
|
309
|
-
refreshBanner: "
|
|
311
|
+
refreshBanner: "项变更,刷新后生效",
|
|
310
312
|
refresh: "刷新页面",
|
|
311
313
|
update: "更新",
|
|
312
314
|
updating: "更新中…",
|
|
313
315
|
updated: "✓ 已更新,重启后生效",
|
|
314
316
|
cancelOp: "取消",
|
|
315
317
|
cancelled: "已取消",
|
|
316
|
-
busyWait: "
|
|
317
|
-
agentBusyUpdate: "有
|
|
318
|
-
agentBusyInstall: "有
|
|
319
|
-
agentBusyQueued: "Agent
|
|
320
|
-
agentBusyUpdateQueued: "Agent
|
|
321
|
-
agentBusyUninstallQueued: "Agent
|
|
322
|
-
agentQueueStaleGone: "
|
|
318
|
+
busyWait: "另一个安装、更新或卸载还在进行,请等它完成后再试",
|
|
319
|
+
agentBusyUpdate: "有 Agent 正在运行,请等它完成或先取消,再更新——更新会直接替换插件文件,运行中的 Agent 可能中途报错或新旧版本混用。",
|
|
320
|
+
agentBusyInstall: "有 Agent 正在运行,请等它完成或先取消,再安装——安装会改动插件文件,运行中的 Agent 可能中途报错。",
|
|
321
|
+
agentBusyQueued: "Agent 正忙,已排队,空闲后自动安装(可在右上角「任务」里取消)。",
|
|
322
|
+
agentBusyUpdateQueued: "Agent 正忙,已排队,空闲后自动更新(可在右上角「任务」里取消)。",
|
|
323
|
+
agentBusyUninstallQueued: "Agent 正忙,已排队,空闲后自动卸载(可在右上角「任务」里取消)。",
|
|
324
|
+
agentQueueStaleGone: "排队时它还在已安装列表里,现在已不在,因此跳过(没有卸载)。",
|
|
323
325
|
agentQueueStaleNoUpdate: "排队时它有可用更新,现在没有了,已跳过。",
|
|
324
326
|
queuedBadge: "排队中",
|
|
325
327
|
favoriteFailed: "收藏失败,请稍后重试",
|
|
326
328
|
favoriteUnavailable: "收藏功能暂不可用。请刷新页面或重启 dsh web。",
|
|
327
|
-
favoriteBusy: "
|
|
328
|
-
compatRiskBanner: "
|
|
329
|
+
favoriteBusy: "插件操作未结束,收藏未保存,请稍后重试",
|
|
330
|
+
compatRiskBanner: "检测到兼容性风险,建议重启前到诊断页处理,或回滚本次操作。",
|
|
329
331
|
compatRiskBannerNoRollback: "检测到兼容性风险,建议重启前到诊断页处理。",
|
|
330
|
-
shadowNameBanner: "
|
|
331
|
-
brokenBundleBanner: "
|
|
332
|
-
goDiagnose: "
|
|
333
|
-
rollbackNow: "
|
|
332
|
+
shadowNameBanner: "此操作后,同一个插件名出现在两处,重启后只有一个会生效:",
|
|
333
|
+
brokenBundleBanner: "下列插件的界面文件已损坏,刷新后页面可能空白,建议回滚:",
|
|
334
|
+
goDiagnose: "查看诊断",
|
|
335
|
+
rollbackNow: "回滚",
|
|
334
336
|
rollingBack: "回滚中…",
|
|
335
337
|
rollbackUnavailable: "无法确认更新前的准确来源,自动回滚不可用。",
|
|
336
|
-
approveBuilds: "
|
|
338
|
+
approveBuilds: "允许构建脚本并重试",
|
|
337
339
|
buildsSkipped: "该插件需要运行构建脚本才能工作,出于安全考虑已默认阻止。确认来源可信后,可放行并重新安装:",
|
|
338
340
|
restartNow: "立即重启",
|
|
339
341
|
dismiss: "关闭提示",
|
|
@@ -346,11 +348,11 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
346
348
|
upToDate: "已是最新",
|
|
347
349
|
linkedDev: "本地开发",
|
|
348
350
|
hostUpdateReady: "有新版本 {0}",
|
|
349
|
-
hostUpdateHint: "
|
|
351
|
+
hostUpdateHint: "本市场由桌面端安装和更新,新版本请在桌面端更新",
|
|
350
352
|
notesLink: "更新内容",
|
|
351
353
|
notesRelease: "版本说明",
|
|
352
354
|
notesCommits: "提交记录",
|
|
353
|
-
notesCommitsRecent: "
|
|
355
|
+
notesCommitsRecent: "最近提交(无法对应你当前安装的版本,仅供参考)",
|
|
354
356
|
notesNpm: "版本发布时间",
|
|
355
357
|
notesNone: "该插件未提供更新说明。",
|
|
356
358
|
notesLoadFail: "暂时读不到更新说明,稍后再试。",
|
|
@@ -359,14 +361,14 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
359
361
|
migrateDescription: "这会更改插件的安装来源,而不是普通版本更新。",
|
|
360
362
|
migrateCurrentSource: "当前来源",
|
|
361
363
|
migrateTargetSource: "新的 npm 来源",
|
|
362
|
-
migrateWarning: "npm
|
|
363
|
-
migrateContinue: "确认换用
|
|
364
|
-
migrateFail: "
|
|
364
|
+
migrateWarning: "该 npm 包可能由其他人发布,并非同一插件;确认可信后再继续。",
|
|
365
|
+
migrateContinue: "确认换用",
|
|
366
|
+
migrateFail: "换用来源失败",
|
|
365
367
|
restore: "恢复",
|
|
366
368
|
restoreOnline: "换用线上版本",
|
|
367
|
-
restoreHint: "
|
|
369
|
+
restoreHint: "将卸载本地版本并安装线上版本,之后照常检查更新。此操作无法撤销。",
|
|
368
370
|
hostIncompatibleTitle: "这个新版本要求更新的 DSH",
|
|
369
|
-
hostIncompatibleBody: "{plugin}
|
|
371
|
+
hostIncompatibleBody: "{plugin} 声明需要 DSH {requirement},而你现在运行的是 {host}。装上去很可能用不了,只能手动装回旧版。\n已停止,插件仍是原来的版本。\n如果你确定这个版本号不准(例如桌面端自带的 DSH 不报告版本),仍可继续更新。",
|
|
370
372
|
hostIncompatibleUnknown: "未知版本",
|
|
371
373
|
hostIncompatibleSearching: "正在查找还兼容当前 DSH 的版本…",
|
|
372
374
|
hostIncompatibleFoundInstall: "可以装 {version}:它声明兼容当前 DSH。",
|
|
@@ -378,12 +380,12 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
378
380
|
hostIncompatibleRetry: "重试",
|
|
379
381
|
hostIncompatibleKeep: "保持现在的版本",
|
|
380
382
|
hostIncompatibleAnyway: "仍然更新",
|
|
381
|
-
hostStatusCompatible: "
|
|
383
|
+
hostStatusCompatible: "符合宿主要求(依据声明)",
|
|
382
384
|
hostStatusIncompatible: "确证与当前 DSH 不兼容",
|
|
383
|
-
hostIncompatibleBodyInstall: "{plugin}
|
|
385
|
+
hostIncompatibleBodyInstall: "{plugin} 声明需要 DSH {requirement},而你现在运行的是 {host}。装上去很可能用不了。\n已停止,没有安装任何东西。\n如果你确定这个版本号不准(例如桌面端自带的 DSH 不报告版本),仍可继续安装。",
|
|
384
386
|
hostIncompatibleCancel: "取消安装",
|
|
385
387
|
hostIncompatibleInstallAnyway: "仍然安装",
|
|
386
|
-
restoreNameOnlyHint: "
|
|
388
|
+
restoreNameOnlyHint: "本地副本未注明来源仓库,市场只能按包名在精选目录中匹配。下方插件可能是其他作者的同名插件,并非你本地副本的来源。确认前请核对作者和仓库地址。此操作会卸载本地版本并安装该插件,无法撤销。",
|
|
387
389
|
restoreContinue: "继续更新",
|
|
388
390
|
restoreProceed: "确认恢复",
|
|
389
391
|
restoreNoCatalogTitle: "无法恢复",
|
|
@@ -391,8 +393,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
391
393
|
restoreNoMatch: "精选目录里有同名插件,但与你本地仓库不一致,无法安全恢复。可以卸载本地版,或继续用本地开发。",
|
|
392
394
|
restoreFail: "恢复失败",
|
|
393
395
|
exportLog: "导出日志",
|
|
394
|
-
crashTitle: "
|
|
395
|
-
crashHint: "
|
|
396
|
+
crashTitle: "插件市场无法显示",
|
|
397
|
+
crashHint: "市场界面未能正常显示,你的插件不受影响,也没有任何改动。\n点击「重新加载」通常即可恢复。如反复出现,请导出日志并提交 issue,日志会记录出错位置。\n如果开启了浏览器网页翻译,请关闭后重试,这是已知原因之一。",
|
|
396
398
|
crashReload: "重新加载",
|
|
397
399
|
crashDetails: "错误详情",
|
|
398
400
|
exportingLog: "导出中…",
|
|
@@ -402,7 +404,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
402
404
|
comments: "评论",
|
|
403
405
|
commentsTitle: "评论",
|
|
404
406
|
commentsNote: "评论来自 GitHub Discussions。打开后会连接 giscus.app 与 GitHub;发表评论需要 GitHub 账号。",
|
|
405
|
-
commentsLoginHint: "
|
|
407
|
+
commentsLoginHint: "在这里登录会离开本页,返回时需重新打开 dsh web——这不是故障。发表评论请到 GitHub,本页只用于阅读。",
|
|
406
408
|
commentsLoading: "正在加载评论…",
|
|
407
409
|
commentsError: "评论加载失败。请检查网络连接后重试。",
|
|
408
410
|
commentsRetry: "重试",
|
|
@@ -411,7 +413,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
411
413
|
conflictTitle: "无法安装:与已安装的插件冲突",
|
|
412
414
|
conflictBody: "和已安装的插件冲突,只能留一个:",
|
|
413
415
|
conflictReverted: "已自动撤销,未改动任何插件",
|
|
414
|
-
conflictKeep: "
|
|
416
|
+
conflictKeep: "保留现有插件",
|
|
415
417
|
conflictKeepNote: "",
|
|
416
418
|
conflictSwap: "改为安装这个",
|
|
417
419
|
conflictSwapNote: "被卸载的插件配置会保留,可以再装回来",
|
|
@@ -420,7 +422,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
420
422
|
conflictOutcomeSkip: "不安装",
|
|
421
423
|
conflictOutcomeKeep: "保留",
|
|
422
424
|
conflictOutcomeRemove: "卸载",
|
|
423
|
-
conflictWhy: "cordis
|
|
425
|
+
conflictWhy: "cordis 不接受重复的条目 id,保留它会让 DeepSeek Harness 下次启动失败。",
|
|
424
426
|
opTitle: "任务",
|
|
425
427
|
opInstalling: "正在安装",
|
|
426
428
|
opNeedsYou: "项需处理",
|
|
@@ -444,14 +446,14 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
444
446
|
opBlockedCard: "无法安装 · 查看详情",
|
|
445
447
|
conflictDeclined: "已选择保留现有插件,未安装",
|
|
446
448
|
conflictReplacing: "正在替换…",
|
|
447
|
-
conflictReplaceFailed: "
|
|
449
|
+
conflictReplaceFailed: "替换未完成。下列插件已卸载且未恢复,请重新安装:",
|
|
448
450
|
lightboxClose: "关闭预览",
|
|
449
451
|
lightboxPrev: "上一张",
|
|
450
452
|
lightboxNext: "下一张",
|
|
451
453
|
envMissing: "安装插件前需要先配置 pnpm 环境",
|
|
452
454
|
envFix: "自动配置",
|
|
453
455
|
envFixing: "正在配置…",
|
|
454
|
-
envFixFail: "
|
|
456
|
+
envFixFail: "自动配置失败。请导出日志并附在 issue 中。",
|
|
455
457
|
loading: "正在加载插件目录…",
|
|
456
458
|
backTop: "回到顶部",
|
|
457
459
|
confirm: "确认",
|
|
@@ -465,20 +467,26 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
465
467
|
filterTime: "发布时间范围",
|
|
466
468
|
filterHost: "宿主版本",
|
|
467
469
|
hostAll: "显示全部",
|
|
468
|
-
hostCompatible: "
|
|
470
|
+
hostCompatible: "兼容当前 DSH {0}",
|
|
469
471
|
hostDetecting: "正在识别宿主版本…",
|
|
470
472
|
hostUnknown: "宿主版本未知",
|
|
471
473
|
hostFilterLoading: "正在检查宿主要求 {0}/{1};未声明或无法确认的插件仍会显示",
|
|
472
|
-
hostFilterActive: "
|
|
474
|
+
hostFilterActive: "已按 DSH {0} 筛选;未声明或无法确认兼容性的插件仍会显示",
|
|
473
475
|
hostRequirement: "DSH {0}",
|
|
474
476
|
hostRequirementLoading: "正在读取宿主要求…",
|
|
475
477
|
hostRequirementUndeclared: "未声明宿主要求",
|
|
476
478
|
hostRequirementUnavailable: "宿主要求未知",
|
|
477
|
-
sortDownloads: "npm
|
|
479
|
+
sortDownloads: "npm 下载量(近 30 天)",
|
|
480
|
+
downloadsPeriod: "近30天",
|
|
481
|
+
downloadsMeaning: "npm 近30天滚动下载量:{0}。这不是累计下载量,也不代表独立用户数。统计可能延迟,来源核验时间不保证数据完整。",
|
|
482
|
+
downloadsWindow: "统计区间:{0} 至 {1}。",
|
|
483
|
+
downloadsWindowUnknown: "统计区间:未提供。",
|
|
484
|
+
downloadsChecked: "来源核验时间:{0}。",
|
|
485
|
+
downloadsCheckedUnknown: "来源核验时间:未提供。",
|
|
478
486
|
/** Discover/theme card byline tooltip for catalog `version`. */
|
|
479
487
|
catalogNpmLatest: "npm 当前 latest",
|
|
480
|
-
catalogVersionDated: "
|
|
481
|
-
catalogVersionUndated: "
|
|
488
|
+
catalogVersionDated: "目录({0} 刷新)记录的 npm 版本;之后发布的版本要等下次刷新才会出现",
|
|
489
|
+
catalogVersionUndated: "目录记录的 npm 版本;目录每日刷新,可能滞后于 npm 上的实际 latest",
|
|
482
490
|
sortStars: "Star 数",
|
|
483
491
|
sortAdded: "发布时间",
|
|
484
492
|
sortDesc: "降序",
|
|
@@ -498,8 +506,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
498
506
|
perPage: "每页",
|
|
499
507
|
marketUpdate: "更新插件市场",
|
|
500
508
|
updateAll: "全部更新",
|
|
501
|
-
heldReleaseNotice: "
|
|
502
|
-
heldReleaseAction: "
|
|
509
|
+
heldReleaseNotice: "已安装,但不是最新版:这个 profile 的 minimumReleaseAge 挡住了 {0},安装的是 {1}。",
|
|
510
|
+
heldReleaseAction: "仍安装 {0}",
|
|
503
511
|
ignoreUpdateNotice: "本次不再提醒",
|
|
504
512
|
ignoreAllUpdateNotices: "本次全部忽略",
|
|
505
513
|
updateNoticeIgnored: "本次已忽略提醒",
|
|
@@ -508,7 +516,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
508
516
|
backupLocal: "本地文件",
|
|
509
517
|
backupDownload: "导出备份",
|
|
510
518
|
backupImport: "导入并预览",
|
|
511
|
-
backupHint: "仅包含插件清单和 profile
|
|
519
|
+
backupHint: "仅包含插件清单和 profile 配置,不含插件文件;恢复时按清单重新安装。",
|
|
512
520
|
webdav: "WebDAV",
|
|
513
521
|
webdavPreset: "服务商预设",
|
|
514
522
|
webdavUrl: "备份文件 URL",
|
|
@@ -518,7 +526,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
518
526
|
webdavRestore: "从 WebDAV 恢复",
|
|
519
527
|
autoBackup: "每天自动备份(打开市场时)",
|
|
520
528
|
webdavNote: "WebDAV 地址与用户名仅保存在当前浏览器;密码只存于服务端,每次会话需重新输入。",
|
|
521
|
-
localOnly: "WebDAV
|
|
529
|
+
localOnly: "WebDAV 地址和用户名只保存在此浏览器。",
|
|
522
530
|
credsWarning: "请注意:备份包含 profile 配置,以及可能含密钥的文件(config.toml、.env 等)。本地导出的文件会原样包含这些内容,上传 WebDAV 前请确认目标可信。",
|
|
523
531
|
gist: "GitHub Gist",
|
|
524
532
|
gistToken: "GitHub token(仅本次会话内存,刷新后需重新输入;留空则使用服务端 DSH_GITHUB_TOKEN 或已登录的 gh CLI)",
|
|
@@ -532,10 +540,10 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
532
540
|
gistSrcEnv: "环境变量 DSH_GITHUB_TOKEN",
|
|
533
541
|
gistSrcGh: "gh CLI",
|
|
534
542
|
gistExportSelect: "选择要导出的插件",
|
|
535
|
-
gistExportHint: "
|
|
543
|
+
gistExportHint: "全选 = 完整备份(含配置文件);否则只导出勾选的插件,可另勾「包含配置文件」。",
|
|
536
544
|
gistSelectAll: "全选",
|
|
537
545
|
gistSelectNone: "全不选",
|
|
538
|
-
gistIncludeConfig: "
|
|
546
|
+
gistIncludeConfig: "包含配置文件(可能含密钥)",
|
|
539
547
|
gistNoPlugins: "当前 profile 没有可导出的插件",
|
|
540
548
|
gistSpecLocal: "本地",
|
|
541
549
|
gistExportGo: "导出",
|
|
@@ -554,9 +562,9 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
554
562
|
backupDone: "备份已上传",
|
|
555
563
|
restoreDone: "恢复完成,请重启 DeepSeek Harness",
|
|
556
564
|
restorePartial: "恢复已完成,但下列插件安装失败:",
|
|
557
|
-
restoreUnportable: "
|
|
565
|
+
restoreUnportable: "安装来源是另一台电脑上的本地路径,本机找不到。请重新安装该插件,或改为本机路径",
|
|
558
566
|
restoreBootError: "恢复后仍无法启动:",
|
|
559
|
-
orphanBundle: "⚠️ 下次启动会失败:profile
|
|
567
|
+
orphanBundle: "⚠️ 下次启动会失败:profile 声明了这些插件,但它们没有安装。请重新安装,或从 profile 的 package.json 的 dsh.profile.bundles 中删除:",
|
|
560
568
|
restoreConfirm: "恢复将覆盖当前 profile 配置并重新安装插件,确定继续吗?",
|
|
561
569
|
restorePreviewDone: "备份已导入,请在「已安装」中确认后开始恢复",
|
|
562
570
|
restoreMissing: "备份中有 {0} 个插件尚未安装",
|
|
@@ -573,11 +581,11 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
573
581
|
themeResultCount: "{0} 款主题",
|
|
574
582
|
themeFullscreen: "全屏浏览",
|
|
575
583
|
themeExitFullscreen: "退出全屏",
|
|
576
|
-
progressHint: "
|
|
584
|
+
progressHint: "首次安装需下载插件的依赖包,大型插件可能需 1-3 分钟",
|
|
577
585
|
toastReady: "已安装并已生效",
|
|
578
|
-
toastTheme: "
|
|
586
|
+
toastTheme: "已启用。可在「设置 → 插件市场 → 主题」中随时切换",
|
|
579
587
|
toastToggledOn: "已启用",
|
|
580
|
-
toastToggledOff: "
|
|
588
|
+
toastToggledOff: "已停用,功能立即失效",
|
|
581
589
|
gotIt: "关闭",
|
|
582
590
|
stateLive: "已生效",
|
|
583
591
|
stateRestart: "已安装,重启后生效",
|
|
@@ -585,14 +593,14 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
585
593
|
stateDependencyLibrary: "{0} 的依赖库",
|
|
586
594
|
stateBroken: "已安装,校验未通过",
|
|
587
595
|
stateDisabled: "已停用",
|
|
588
|
-
phaseResolving: "
|
|
596
|
+
phaseResolving: "准备依赖",
|
|
589
597
|
phaseDownloading: "下载中",
|
|
590
598
|
phaseLinking: "链接依赖",
|
|
591
599
|
phaseBuilding: "运行构建脚本",
|
|
592
600
|
cancelling: "正在取消…",
|
|
593
601
|
packagesDone: "已处理 {0} 个包",
|
|
594
602
|
updatedLive: "✓ 已更新,已生效",
|
|
595
|
-
partialNote: "
|
|
603
|
+
partialNote: "已取消,部分更改已应用",
|
|
596
604
|
reconciledNote: "已卸载,但 pnpm 在收尾阶段报错(通常是文件被占用);配置已同步,无需重试",
|
|
597
605
|
actWhy: "为什么未生效?",
|
|
598
606
|
tabList: "列表",
|
|
@@ -605,7 +613,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
605
613
|
noteMine: "我的备注",
|
|
606
614
|
noteSave: "保存",
|
|
607
615
|
notePlaceholder: "用你自己的话描述这个插件,将代替作者简介显示",
|
|
608
|
-
noteSeeTheirs: "
|
|
616
|
+
noteSeeTheirs: "查看作者简介",
|
|
609
617
|
noteSeeMine: "返回我的备注",
|
|
610
618
|
switchOnLabel: "启用中",
|
|
611
619
|
enable: "启用",
|
|
@@ -614,8 +622,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
614
622
|
deprecatedBadge: "已废弃",
|
|
615
623
|
deprecatedWarn: "该插件已被目录标记为废弃,不建议新用户安装。",
|
|
616
624
|
brokenPluginTitle: "{0} 更新失败后被移除了",
|
|
617
|
-
brokenPluginBody: "
|
|
618
|
-
brokenPluginAction: "
|
|
625
|
+
brokenPluginBody: "DSH 正在运行时无法更新,而更新前的版本也已经损坏。为避免下次启动卡住,市场把它从 profile 里移除。插件目录还在原处,退出 DSH 后重新安装即可。",
|
|
626
|
+
brokenPluginAction: "查找这个插件",
|
|
619
627
|
viewReplacement: "查看替代品",
|
|
620
628
|
installReplacement: "安装替代品",
|
|
621
629
|
replacementHint: "目录建议改用",
|
|
@@ -623,7 +631,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
623
631
|
groupNamePh: "分组名称",
|
|
624
632
|
groupRename: "重命名",
|
|
625
633
|
groupDelete: "删除分组",
|
|
626
|
-
groupConfirmDelete: "
|
|
634
|
+
groupConfirmDelete: "删除分组?",
|
|
627
635
|
groupExpand: "展开 {0}",
|
|
628
636
|
groupFold: "收起 {0}",
|
|
629
637
|
groupThemeTaken: "已有主题",
|
|
@@ -671,7 +679,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
671
679
|
checkErrorsEmpty: "没有错误",
|
|
672
680
|
checkWarningsEmpty: "没有警告",
|
|
673
681
|
checkBundles: "插件加载顺序(bundle)",
|
|
674
|
-
checkBundlesEmpty: "
|
|
682
|
+
checkBundlesEmpty: "未配置任何插件包",
|
|
675
683
|
checkOfficial: "官方",
|
|
676
684
|
checkCommunity: "社区",
|
|
677
685
|
checkSource: "来源",
|
|
@@ -683,34 +691,34 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
683
691
|
checkHoisted: "顶层",
|
|
684
692
|
checkPeerMismatches: "依赖版本不匹配",
|
|
685
693
|
checkPeerEmpty: "没有依赖版本不匹配",
|
|
686
|
-
checkPeerInfo: "另有 {0}
|
|
694
|
+
checkPeerInfo: "另有 {0} 条待确认信息",
|
|
687
695
|
checkPeerOverview: "{0} 不匹配 · {1} 条信息",
|
|
688
|
-
checkRange: "
|
|
696
|
+
checkRange: "要求版本",
|
|
689
697
|
checkResolved: "实际版本",
|
|
690
698
|
checkSatisfied: "满足",
|
|
691
699
|
checkUnsatisfied: "不满足",
|
|
692
700
|
checkUnknown: "未知",
|
|
693
701
|
checkPeerRisk: "依赖风险",
|
|
694
|
-
checkPeerRiskEmpty: "
|
|
702
|
+
checkPeerRiskEmpty: "没有依赖风险",
|
|
695
703
|
checkPeerWarning: "依赖警告",
|
|
696
|
-
checkPeerWarningEmpty: "
|
|
704
|
+
checkPeerWarningEmpty: "没有依赖警告",
|
|
697
705
|
checkPeerInfoTier: "依赖信息",
|
|
698
|
-
checkPeerInfoTierEmpty: "
|
|
706
|
+
checkPeerInfoTierEmpty: "没有依赖信息",
|
|
699
707
|
checkPeerSatisfied: "已满足的依赖",
|
|
700
708
|
checkPeerSatisfiedEmpty: "没有已满足的依赖条目",
|
|
701
|
-
peerRiskBelowMin: "
|
|
702
|
-
peerRiskAboveMax: "
|
|
709
|
+
peerRiskBelowMin: "低于声明下限",
|
|
710
|
+
peerRiskAboveMax: "高于显式上限",
|
|
703
711
|
peerWarnOptional: "可选依赖",
|
|
704
|
-
peerWarnAboveMax: "
|
|
705
|
-
peerInfoUnverified: "
|
|
712
|
+
peerWarnAboveMax: "超出声明上限",
|
|
713
|
+
peerInfoUnverified: "未确认",
|
|
706
714
|
checkMultiVersion: "核心包多版本",
|
|
707
715
|
checkMultiEmpty: "没有多版本核心包",
|
|
708
716
|
checkOverrides: "覆盖关系",
|
|
709
717
|
checkOverridesEmpty: "没有覆盖关系",
|
|
710
718
|
checkOverridden: "覆盖了",
|
|
711
719
|
checkResiduals: "残留目录",
|
|
712
|
-
checkResidualsEmpty: "
|
|
713
|
-
checkResidualsHint: "
|
|
720
|
+
checkResidualsEmpty: "没有发现残留目录。",
|
|
721
|
+
checkResidualsHint: "这些目录不被任何插件使用,也不影响启动,是更新中断后留下的。退出 DSH 后可以删除,或重新安装对应的插件。",
|
|
714
722
|
checkResidualTmp: "pnpm 临时目录",
|
|
715
723
|
checkResidualIncomplete: "残缺的包目录(缺少 package.json)",
|
|
716
724
|
checkOrphans: "无效的配置条目",
|
|
@@ -723,7 +731,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
723
731
|
orphanNameMismatch: "名称不匹配",
|
|
724
732
|
orphanReasonOther: "其他",
|
|
725
733
|
diagExplain: "术语说明",
|
|
726
|
-
diagExplainText: "
|
|
734
|
+
diagExplainText: "本页检查插件冲突、依赖版本不匹配与加载顺序问题。常用术语:",
|
|
727
735
|
diagTermBundle: "bundle = 一个插件包,会按顺序叠加加载",
|
|
728
736
|
diagTermEntry: "加载条目 = 插件在运行组合里注册的每一项",
|
|
729
737
|
diagTermPeer: "对等依赖 = 插件要求宿主环境提供的另一个包",
|
|
@@ -742,19 +750,19 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
742
750
|
orderSuggestHint: "建议顺序(按 before/after 规则自动排序):",
|
|
743
751
|
orderAutoSort: "自动排序",
|
|
744
752
|
orderAlreadyOptimal: "当前顺序已满足全部规则与插件依赖,无需调整",
|
|
745
|
-
orderTrialFail: "
|
|
753
|
+
orderTrialFail: "顺序检查未通过:{0}",
|
|
746
754
|
orderDiffHint: "该顺序会改变组合:{0} 处覆盖、{1} 个无效条目、{2} 个重复条目",
|
|
747
|
-
duplicateNames: "
|
|
755
|
+
duplicateNames: "同名插件(仅供参考,不算冲突)",
|
|
748
756
|
orderReset: "重置草稿",
|
|
749
757
|
checkRefresh: "重新检查",
|
|
750
758
|
aiFix: "AI 修复",
|
|
751
759
|
aiFixHint: "将诊断问题交由新对话中的 Agent 修复(内容已复制到剪贴板,由你决定是否发送)",
|
|
752
760
|
aiFixIntro: "请帮我修复 DeepSeek Harness 的插件问题(profile:{0})。诊断发现如下:",
|
|
753
|
-
aiFixDetect: "【第一步·先判断身份】开始前先判断:当前 Agent 所运行的进程,是否就是这个 profile 对应的 DeepSeek Harness
|
|
754
|
-
aiFixIfSelf: "【是 → 你就是这个 harness】严禁原地改动组合、harness 或核心包:不修改 cordis.patch.yml、不调整 bundle 顺序或启停、不安装/卸载/升级插件、不重新安装依赖、不升级或重启 dsh。三步:① 先只读分析,不改任何东西;② 给出 apply.sh/.bat(本次修复的改动)与 rollback.sh/.bat(完整撤销 apply
|
|
761
|
+
aiFixDetect: "【第一步·先判断身份】开始前先判断:当前 Agent 所运行的进程,是否就是这个 profile 对应的 DeepSeek Harness 本机进程(即:诊断出的这套组合,就是你现在运行中的组合)?判断依据:当前工作目录 / $DSH_HOME / 进程命令行是否指向该 profile,或你是否运行在 deepseek-harness 进程内。若无法确定,一律按【是你】处理(更安全)。",
|
|
762
|
+
aiFixIfSelf: "【是 → 你就是这个 harness】严禁原地改动组合、harness 或核心包:不修改 cordis.patch.yml、不调整 bundle 顺序或启停、不安装/卸载/升级插件、不重新安装依赖、不升级或重启 dsh。三步:① 先只读分析,不改任何东西;② 给出 apply.sh/.bat(本次修复的改动)与 rollback.sh/.bat(完整撤销 apply);两者都可重复执行——apply 只在没有快照时创建快照(不覆盖;已有快照说明 apply 跑过,先回滚或确认再重跑),rollback 从快照恢复,因此 apply 跑到一半失败也能回滚、重复回滚也安全;③ 由我在外部终端执行 apply,并将 stdout/stderr 回贴给你判断。每步先说明理由、等我确认;绝不自行执行。",
|
|
755
763
|
aiFixScope: "【否 → 保守执行】你要是判定自己并非运行在目标 harness 内(独立进程),才可考虑:修改 dsh.profile.bundles 顺序、停用/启用插件、调整 cordis.patch.yml。注意:官方 bundle 不可移动;动手前先说明计划。",
|
|
756
764
|
aiFixConservative: "请保持保守:只修复上面列出的明确错误(启动失败/重复条目/风险级依赖不匹配)。警告和信息级问题(如可选依赖、未确认的依赖范围)仅在它们与明确错误相关时处理。不要做不必要的升级或重新排序;每项改动前说明理由并等待确认。",
|
|
757
|
-
aiFixCopied: "
|
|
765
|
+
aiFixCopied: "已复制修复说明,请粘贴到新对话中发送",
|
|
758
766
|
aiFixFail: "无法访问剪贴板,请手动复制下面的诊断内容",
|
|
759
767
|
catConflict: "冲突",
|
|
760
768
|
catDeps: "依赖",
|
|
@@ -766,7 +774,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
766
774
|
checkOrderTip: "社区 bundle 加载顺序与插件声明的 before/after 规则冲突",
|
|
767
775
|
diagOkAll: "未发现冲突、依赖或加载顺序问题",
|
|
768
776
|
presetSection: "插件组合",
|
|
769
|
-
presetHint: "
|
|
777
|
+
presetHint: "把当前的插件顺序和已停用的插件保存为组合,随时切换;应用前会先试启动一次并自动创建快照。",
|
|
770
778
|
presetName: "组合名称",
|
|
771
779
|
presetSave: "保存当前状态",
|
|
772
780
|
presetSaving: "保存中…",
|
|
@@ -779,16 +787,16 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
779
787
|
presetNameEmpty: "请输入组合名称",
|
|
780
788
|
presetFail: "组合操作失败:",
|
|
781
789
|
presetListFail: "组合列表加载失败:",
|
|
782
|
-
presetBundleCount: "{0}
|
|
790
|
+
presetBundleCount: "{0} 个插件",
|
|
783
791
|
presetPreview: "预览",
|
|
784
792
|
presetPreviewTitle: "应用此组合将:",
|
|
785
|
-
presetReorder: "重排 {0}
|
|
793
|
+
presetReorder: "重排 {0} 个插件的位置",
|
|
786
794
|
presetEnable: "启用 {0} 个插件",
|
|
787
795
|
presetDisable: "停用 {0} 个插件",
|
|
788
796
|
presetNoop: "无变更",
|
|
789
797
|
presetPreviewFail: "预览失败:",
|
|
790
798
|
snapSection: "快照与回滚",
|
|
791
|
-
snapHint: "
|
|
799
|
+
snapHint: "应用变更前会自动创建快照;也可手动创建,随时回滚到任意状态。",
|
|
792
800
|
snapCreate: "创建快照",
|
|
793
801
|
snapCreating: "创建中…",
|
|
794
802
|
snapCreated: "快照已创建",
|
|
@@ -800,7 +808,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
800
808
|
snapRestored: "已回滚,重启后生效",
|
|
801
809
|
snapRestoreFail: "回滚失败:",
|
|
802
810
|
snapRestoreConfirm: "确认回滚",
|
|
803
|
-
snapRestoreConfirmText: "
|
|
811
|
+
snapRestoreConfirmText: "回滚会用快照覆盖当前的插件与配置,且不可撤销(可先创建新快照再回滚)。",
|
|
804
812
|
snapFiles: "包含文件",
|
|
805
813
|
snapDelete: "删除",
|
|
806
814
|
snapDeleting: "删除中…",
|
|
@@ -809,28 +817,28 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
809
817
|
snapDeleteConfirm: "确认删除",
|
|
810
818
|
snapDeleteConfirmText: "删除后该快照将无法恢复。",
|
|
811
819
|
marketNoToggle: "市场自身不能停用",
|
|
812
|
-
hostDependencyWarning: "
|
|
813
|
-
hostDependencyMore: "另有 {0}
|
|
820
|
+
hostDependencyWarning: "插件把 DSH 自带的公共包列进了依赖,可能和 DSH 自己的版本互相干扰(仅依据声明,未确认):",
|
|
821
|
+
hostDependencyMore: "另有 {0} 项已省略",
|
|
814
822
|
recoveryTitle: "启动失败——调整插件",
|
|
815
|
-
recoveryLead: "
|
|
823
|
+
recoveryLead: "本次重启没有成功,dsh 已经退出。勾选你希望下次启动时启用的插件;本次启动报错的插件已标红并取消勾选。",
|
|
816
824
|
recoveryOption: "调整插件",
|
|
817
825
|
recoveryBanner: "启动失败:",
|
|
818
826
|
recoveryOpening: "正在读取失败详情…",
|
|
819
|
-
recoveryNoSummary: "
|
|
827
|
+
recoveryNoSummary: "日志里没有说明具体原因",
|
|
820
828
|
recoveryRawLog: "dsh 的原始输出(结尾部分)",
|
|
821
|
-
recoveryBlamedHint: "
|
|
822
|
-
recoveryNoBlameHint: "
|
|
823
|
-
recoveryCarrier: "
|
|
829
|
+
recoveryBlamedHint: "下面标红的插件在本次启动时报了错,取消勾选后下次启动不再启用它们。",
|
|
830
|
+
recoveryNoBlameHint: "日志没有指出具体插件,下面按启用状态列出可调整的插件。",
|
|
831
|
+
recoveryCarrier: "停用其他",
|
|
824
832
|
recoveryNotToggleable: "本页无法开关",
|
|
825
|
-
recoveryUnmatched: "DSH
|
|
833
|
+
recoveryUnmatched: "DSH 指出但本页无法开关的插件:",
|
|
826
834
|
recoveryLogPath: "完整日志:",
|
|
827
835
|
recoveryApply: "保存并重启",
|
|
828
|
-
recoveryApplying: "
|
|
836
|
+
recoveryApplying: "正在保存并重启…",
|
|
829
837
|
recoveryStandalone: "打开独立恢复页",
|
|
830
|
-
recoveryRestarting: "正在重启:dsh
|
|
831
|
-
recoveryApplyFailed: "
|
|
832
|
-
recoveryWriteFailed: "
|
|
833
|
-
recoveryTimeout: "等待 DeepSeek Harness
|
|
838
|
+
recoveryRestarting: "正在重启:dsh 启动后本页会刷新;若又失败,会带着新的报错回到这里。",
|
|
839
|
+
recoveryApplyFailed: "保存失败:",
|
|
840
|
+
recoveryWriteFailed: "上次的选择没有全部保存,因此没有重启:",
|
|
841
|
+
recoveryTimeout: "等待 DeepSeek Harness 启动超时。可点「调整插件」,检查是否某个插件导致无法启动。"
|
|
834
842
|
};
|
|
835
843
|
const en = {
|
|
836
844
|
nav: "Plugin Market",
|
|
@@ -839,9 +847,9 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
839
847
|
setSelfUpdateReady: "New version available:",
|
|
840
848
|
setSelfUpdateHint: "Updating downloads the new version; it takes effect after a restart.",
|
|
841
849
|
setSelfUpToDateHint: "",
|
|
842
|
-
setSelfHostManagedHint: "This copy was installed by the desktop
|
|
850
|
+
setSelfHostManagedHint: "This copy was installed by the desktop app; update it from there.",
|
|
843
851
|
setSelfUpdate: "Update",
|
|
844
|
-
setSelfUpdatedHint: "Downloaded. Restart DeepSeek Harness for it to take effect — the
|
|
852
|
+
setSelfUpdatedHint: "Downloaded. Restart DeepSeek Harness for it to take effect — the page will already show the new version.",
|
|
845
853
|
setRegion: "Download region",
|
|
846
854
|
setRegionGlobal: "Global",
|
|
847
855
|
setRegionChina: "China mainland",
|
|
@@ -858,7 +866,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
858
866
|
setGithubProxyInput: "HTTPS acceleration prefix",
|
|
859
867
|
setGithubProxySave: "Save",
|
|
860
868
|
setBuildEnv: "Build environment",
|
|
861
|
-
setBuildEnvHint: "Reaches every process the market
|
|
869
|
+
setBuildEnvHint: "Reaches every process the market runs — installs, builds, git — not just the compiler. One KEY=value per line, e.g. CC=/usr/bin/gcc-11. PATH and CI are managed by the market. Saving an empty list restores the original config.",
|
|
862
870
|
setBuildEnvSave: "Save variables",
|
|
863
871
|
setChannel: "Update channel",
|
|
864
872
|
setChannelStable: "Stable",
|
|
@@ -873,7 +881,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
873
881
|
setSelfRemoveHint: "Uninstall the market from this profile. Your other plugins are untouched.",
|
|
874
882
|
setSelfConfirm: "Uninstall the plugin market? Reinstalling it requires the command line.",
|
|
875
883
|
setSelfPurge: "Also clear the market's own data",
|
|
876
|
-
setSelfPurgeOn: "Will delete: the market's disable list and custom groups,
|
|
884
|
+
setSelfPurgeOn: "Will delete: the market's disable list and custom groups, plus the disable entries it wrote into your config file — plugins it switched off will run again. No passwords or tokens are involved; the market never stores those on disk.",
|
|
877
885
|
setSelfPurgeOff: "Keeps the market's data. Note: plugins the market switched off stay off, and once it is removed there is no UI left to switch them back on.",
|
|
878
886
|
setSelfRemoveConfirm: "Uninstall",
|
|
879
887
|
setSelfCancel: "Cancel",
|
|
@@ -889,31 +897,32 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
889
897
|
searchPh: "Search plugins: notify, terminal, memory…",
|
|
890
898
|
searchFavoritesPh: "Search favorites…",
|
|
891
899
|
clearSearch: "Clear search",
|
|
892
|
-
capabilityTitle: "What it
|
|
900
|
+
capabilityTitle: "What it does",
|
|
893
901
|
capShell: "runs commands",
|
|
894
|
-
capFsRead: "reads files",
|
|
895
|
-
capFsWrite: "writes files",
|
|
896
|
-
capNetwork: "
|
|
897
|
-
capCredentials: "
|
|
898
|
-
capEnv: "reads
|
|
899
|
-
capLlm: "calls
|
|
900
|
-
capSubagent: "
|
|
901
|
-
capDynamicCode: "
|
|
902
|
-
capHostRuntime: "
|
|
903
|
-
capInstallScript: "install
|
|
904
|
-
capabilityNone: "not
|
|
905
|
-
capabilityUnchecked: "
|
|
906
|
-
|
|
907
|
-
capabilityRedLine: "Worth a look: {0}",
|
|
908
|
-
capabilityNote: "A static scan of the package this install would download. It reports only what it found: node_modules is skipped, and runtime-assembled URLs, dynamic imports and obfuscated code are invisible to it. “Nothing detected” is not “safe” — it is not a judgement, and the call is yours.",
|
|
902
|
+
capFsRead: "reads files in your project",
|
|
903
|
+
capFsWrite: "writes files in your project",
|
|
904
|
+
capNetwork: "connects to servers",
|
|
905
|
+
capCredentials: "uses your API keys",
|
|
906
|
+
capEnv: "reads your environment variables",
|
|
907
|
+
capLlm: "calls an AI model",
|
|
908
|
+
capSubagent: "runs its own subagents",
|
|
909
|
+
capDynamicCode: "downloads and runs code",
|
|
910
|
+
capHostRuntime: "changes how DSH itself runs",
|
|
911
|
+
capInstallScript: "runs code when you install",
|
|
912
|
+
capabilityNone: "Nothing found — which is not the same as safe.",
|
|
913
|
+
capabilityUnchecked: "Not scanned yet",
|
|
914
|
+
capabilityNote: "A static scan only shows what it found. “Nothing found” is not “safe”.",
|
|
909
915
|
capabilityScannedAt: "Scanned {0}",
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
916
|
+
capRedCredentialsNetwork: "connects to servers and uses your API keys",
|
|
917
|
+
capRedPlaintextHttp: "makes an unencrypted connection to {0}",
|
|
918
|
+
capRedLiteralIp: "connects to the fixed IP address {0}",
|
|
919
|
+
capRedInstallScript: "runs its own script the moment you install — you do not have to open the plugin",
|
|
920
|
+
capRedInstallScriptScripts: "runs {0} the moment you install — you do not have to open the plugin",
|
|
921
|
+
capRedCoreTamper: "replaces parts of DSH itself",
|
|
922
|
+
capRedCoreTamperDetail: "replaces parts of DSH itself ({0})",
|
|
914
923
|
favoriteAdd: "Add to favorites",
|
|
915
924
|
favoriteRemove: "Remove from favorites",
|
|
916
|
-
favoritesEmpty: "No favorites yet.
|
|
925
|
+
favoritesEmpty: "No favorites yet. Click the bookmark icon in Discover or Themes to add one.",
|
|
917
926
|
favoritesResultCount: "{0} favorites",
|
|
918
927
|
favoritesPluginsSection: "Plugins ({0})",
|
|
919
928
|
favoritesThemesSection: "Themes ({0})",
|
|
@@ -937,9 +946,9 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
937
946
|
uninstallConfirmDesc: "This removes the plugin from the current profile.",
|
|
938
947
|
restartHint: "To restart: stop the current dsh process and run it again (e.g. dsh web)",
|
|
939
948
|
restartHintSupervised: "This process is {0}'s own service process, so restarts belong to it — restarting from here would kill the takeover process along with the cgroup and the service would not come back. Use systemctl restart <your unit>. If your unit can survive a self-restart (KillMode=process), turn Allow restart on in this plugin's configuration.",
|
|
940
|
-
restartHintDebugged: "This dsh process is under a debugger. Stop it from your IDE or terminal and start it again — the market cannot
|
|
949
|
+
restartHintDebugged: "This dsh process is under a debugger. Stop it from your IDE or terminal and start it again — the market cannot stop the debugged process from the UI.",
|
|
941
950
|
confirmTitle: "Install",
|
|
942
|
-
confirmWarn: "Plugins are third-party community code. Installing means you trust
|
|
951
|
+
confirmWarn: "Plugins are third-party community code. Installing means you trust the source. Build scripts do not run by default.",
|
|
943
952
|
cancel: "Cancel",
|
|
944
953
|
empty: "No plugins match",
|
|
945
954
|
installedEmpty: "No community plugins yet — browse the Discover tab",
|
|
@@ -954,22 +963,22 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
954
963
|
updated: "✓ Updated — restart to apply",
|
|
955
964
|
cancelOp: "Cancel",
|
|
956
965
|
cancelled: "Cancelled",
|
|
957
|
-
busyWait: "Another
|
|
966
|
+
busyWait: "Another install, update or uninstall is still running — wait for it to finish, then try again.",
|
|
958
967
|
agentBusyUpdate: "An agent is currently working — wait for it to finish (or cancel it) before updating. Updates replace plugin files in place, so a working agent can fail or mix versions mid-turn.",
|
|
959
968
|
agentBusyInstall: "An agent is currently working — wait for it to finish (or cancel it) before installing. Installing changes plugin files, so a working agent can fail mid-turn.",
|
|
960
|
-
agentBusyQueued: "Agent is busy — queued and will install automatically when idle (
|
|
961
|
-
agentBusyUpdateQueued: "Agent is busy — queued and will update automatically when idle (
|
|
962
|
-
agentBusyUninstallQueued: "Agent is busy — queued and will uninstall automatically when idle (
|
|
969
|
+
agentBusyQueued: "Agent is busy — queued and will install automatically when idle (cancel it in Tasks, top right).",
|
|
970
|
+
agentBusyUpdateQueued: "Agent is busy — queued and will update automatically when idle (cancel it in Tasks, top right).",
|
|
971
|
+
agentBusyUninstallQueued: "Agent is busy — queued and will uninstall automatically when idle (cancel it in Tasks, top right).",
|
|
963
972
|
agentQueueStaleGone: "It was installed when you queued this, and is not now — skipped, nothing was uninstalled.",
|
|
964
973
|
agentQueueStaleNoUpdate: "It had an update available when you queued this, and does not now — skipped.",
|
|
965
974
|
queuedBadge: "Queued",
|
|
966
975
|
favoriteFailed: "Could not update favorites. Try again.",
|
|
967
976
|
favoriteUnavailable: "Favorites are unavailable. Refresh the page or restart dsh web.",
|
|
968
|
-
favoriteBusy: "A plugin operation is running.
|
|
977
|
+
favoriteBusy: "A plugin operation is still running. Favorites were not saved — try again shortly.",
|
|
969
978
|
compatRiskBanner: "Compatibility risk detected — open Diagnostics before restarting, or roll this operation back.",
|
|
970
979
|
compatRiskBannerNoRollback: "Compatibility risk detected — open Diagnostics before restarting.",
|
|
971
|
-
shadowNameBanner: "
|
|
972
|
-
brokenBundleBanner: "These plugins
|
|
980
|
+
shadowNameBanner: "One plugin name is now defined in two places; only one will load after a restart:",
|
|
981
|
+
brokenBundleBanner: "These plugins have damaged UI files. The page may be blank after a refresh; rolling back is recommended:",
|
|
973
982
|
goDiagnose: "Open Diagnostics",
|
|
974
983
|
rollbackNow: "Roll back",
|
|
975
984
|
rollingBack: "Rolling back…",
|
|
@@ -987,25 +996,25 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
987
996
|
upToDate: "Up to date",
|
|
988
997
|
linkedDev: "local",
|
|
989
998
|
hostUpdateReady: "New version {0}",
|
|
990
|
-
hostUpdateHint: "Installed and updated by the desktop
|
|
999
|
+
hostUpdateHint: "Installed and updated by the desktop app; update it there.",
|
|
991
1000
|
notesLink: "What changed",
|
|
992
1001
|
notesRelease: "Release notes",
|
|
993
1002
|
notesCommits: "Commits",
|
|
994
|
-
notesCommitsRecent: "Recent commits (
|
|
1003
|
+
notesCommitsRecent: "Recent commits (do not match your installed version — for reference only)",
|
|
995
1004
|
notesNpm: "Version publish times",
|
|
996
1005
|
notesNone: "This plugin does not publish update notes.",
|
|
997
1006
|
notesLoadFail: "Update notes are unavailable right now — try again later.",
|
|
998
1007
|
migrateNpm: "Use npm version",
|
|
999
1008
|
migrateTitle: "Use npm version?",
|
|
1000
|
-
migrateDescription: "This changes the plugin
|
|
1009
|
+
migrateDescription: "This changes the plugin's install source rather than its version.",
|
|
1001
1010
|
migrateCurrentSource: "Current source",
|
|
1002
1011
|
migrateTargetSource: "New npm source",
|
|
1003
|
-
migrateWarning: "The npm package may be
|
|
1004
|
-
migrateContinue: "Confirm
|
|
1005
|
-
migrateFail: "Source
|
|
1012
|
+
migrateWarning: "The npm package may be published by someone else and not be the same plugin. Continue only if you trust it.",
|
|
1013
|
+
migrateContinue: "Confirm switch",
|
|
1014
|
+
migrateFail: "Source switch failed",
|
|
1006
1015
|
restore: "Restore",
|
|
1007
1016
|
restoreOnline: "Use online version",
|
|
1008
|
-
restoreHint: "This
|
|
1017
|
+
restoreHint: "This uninstalls the local version and installs the online version. Update checks continue as usual. This cannot be undone.",
|
|
1009
1018
|
hostIncompatibleTitle: "This release needs a newer DSH",
|
|
1010
1019
|
hostIncompatibleBody: "{plugin} declares that it needs DSH {requirement}, and you are running {host}. Installing it would most likely break the plugin, leaving a manual downgrade as the only way back.\nNothing was changed — the plugin is still on its current version.\nIf you know the version number is wrong (a bundled DSH that does not report one, for example), you can update anyway.",
|
|
1011
1020
|
hostIncompatibleUnknown: "an unknown version",
|
|
@@ -1024,7 +1033,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1024
1033
|
hostIncompatibleBodyInstall: "{plugin} declares that it needs DSH {requirement}, and you are running {host}. Installing it would most likely break the plugin.\nNothing was installed.\nIf you know the version number is wrong (a bundled DSH that does not report one, for example), you can install anyway.",
|
|
1025
1034
|
hostIncompatibleCancel: "Cancel install",
|
|
1026
1035
|
hostIncompatibleInstallAnyway: "Install anyway",
|
|
1027
|
-
restoreNameOnlyHint: "Your local copy does not
|
|
1036
|
+
restoreNameOnlyHint: "Your local copy does not name its source repository, so the market could only match it by package name. The plugin below may be another author's plugin with the same name, not the source of your copy. Check the owner and repository before confirming. This uninstalls the local version, installs that plugin, and cannot be undone.",
|
|
1028
1037
|
restoreContinue: "Continue update",
|
|
1029
1038
|
restoreProceed: "Confirm restore",
|
|
1030
1039
|
restoreNoCatalogTitle: "Cannot restore",
|
|
@@ -1033,7 +1042,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1033
1042
|
restoreFail: "Restore failed",
|
|
1034
1043
|
exportLog: "Export log",
|
|
1035
1044
|
crashTitle: "The plugin market could not be displayed",
|
|
1036
|
-
crashHint: "
|
|
1045
|
+
crashHint: "'The market could not be displayed. Your plugins are unaffected and nothing was changed.\nReload usually fixes this. If it keeps happening, export the log and attach it to an issue — the log records where the error occurred.\nIf your browser is translating this page, turn translation off and reload. This is a known cause.'",
|
|
1037
1046
|
crashReload: "Reload",
|
|
1038
1047
|
crashDetails: "Error details",
|
|
1039
1048
|
exportingLog: "Exporting…",
|
|
@@ -1043,7 +1052,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1043
1052
|
comments: "Comments",
|
|
1044
1053
|
commentsTitle: "Comments",
|
|
1045
1054
|
commentsNote: "Comments come from GitHub Discussions. Opening this connects to giscus.app and GitHub; posting needs a GitHub account.",
|
|
1046
|
-
commentsLoginHint: "Signing in here
|
|
1055
|
+
commentsLoginHint: "Signing in here leaves this page; you will need to reopen dsh web — nothing is broken. Post on GitHub; this page is for reading only.",
|
|
1047
1056
|
commentsLoading: "Loading comments…",
|
|
1048
1057
|
commentsError: "Comments could not be loaded. Check your connection and try again.",
|
|
1049
1058
|
commentsRetry: "Try again",
|
|
@@ -1052,7 +1061,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1052
1061
|
conflictTitle: "Cannot install: conflicts with an installed plugin",
|
|
1053
1062
|
conflictBody: "It conflicts with an installed plugin — only one can stay:",
|
|
1054
1063
|
conflictReverted: "Reverted automatically; nothing was changed",
|
|
1055
|
-
conflictKeep: "Keep
|
|
1064
|
+
conflictKeep: "Keep existing plugins",
|
|
1056
1065
|
conflictKeepNote: "",
|
|
1057
1066
|
conflictSwap: "Switch to this one",
|
|
1058
1067
|
conflictSwapNote: "Settings of the uninstalled plugins are kept, so you can reinstall later",
|
|
@@ -1061,7 +1070,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1061
1070
|
conflictOutcomeSkip: "skip",
|
|
1062
1071
|
conflictOutcomeKeep: "keep",
|
|
1063
1072
|
conflictOutcomeRemove: "uninstall",
|
|
1064
|
-
conflictWhy: "cordis
|
|
1073
|
+
conflictWhy: "cordis rejects duplicate entry ids; keeping this plugin would stop DeepSeek Harness from starting.",
|
|
1065
1074
|
opTitle: "Tasks",
|
|
1066
1075
|
opInstalling: "Installing",
|
|
1067
1076
|
opNeedsYou: "need attention",
|
|
@@ -1085,21 +1094,21 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1085
1094
|
opBlockedCard: "Cannot install · details",
|
|
1086
1095
|
conflictDeclined: "You kept the installed plugins; this one was not installed",
|
|
1087
1096
|
conflictReplacing: "Replacing…",
|
|
1088
|
-
conflictReplaceFailed: "Replace did not finish.
|
|
1097
|
+
conflictReplaceFailed: "Replace did not finish. These plugins were uninstalled and not restored — reinstall them:",
|
|
1089
1098
|
lightboxClose: "Close preview",
|
|
1090
1099
|
lightboxPrev: "Previous",
|
|
1091
1100
|
lightboxNext: "Next",
|
|
1092
1101
|
envMissing: "pnpm needs to be set up before installing plugins",
|
|
1093
1102
|
envFix: "Set up automatically",
|
|
1094
1103
|
envFixing: "Setting up…",
|
|
1095
|
-
envFixFail: "Automatic setup failed
|
|
1104
|
+
envFixFail: "Automatic setup failed. Export the log and attach it to your issue.",
|
|
1096
1105
|
loading: "Loading the catalog…",
|
|
1097
1106
|
backTop: "Back to top",
|
|
1098
1107
|
confirm: "Confirm",
|
|
1099
1108
|
confirmInstall: "Confirm install",
|
|
1100
1109
|
cmdDetails: "Install command",
|
|
1101
|
-
catsMore: "More",
|
|
1102
|
-
catsLess: "
|
|
1110
|
+
catsMore: "More categories",
|
|
1111
|
+
catsLess: "Fewer categories",
|
|
1103
1112
|
filter: "Filter",
|
|
1104
1113
|
filterSort: "Sort field",
|
|
1105
1114
|
filterDir: "Order",
|
|
@@ -1110,12 +1119,18 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1110
1119
|
hostDetecting: "Detecting host version…",
|
|
1111
1120
|
hostUnknown: "Host version unknown",
|
|
1112
1121
|
hostFilterLoading: "Checking host requirements {0}/{1}; undeclared or unavailable plugins remain visible",
|
|
1113
|
-
hostFilterActive: "
|
|
1122
|
+
hostFilterActive: "Filtered for DSH {0}; undeclared or unconfirmed plugins remain visible",
|
|
1114
1123
|
hostRequirement: "DSH {0}",
|
|
1115
1124
|
hostRequirementLoading: "Reading host requirement…",
|
|
1116
1125
|
hostRequirementUndeclared: "Host requirement undeclared",
|
|
1117
1126
|
hostRequirementUnavailable: "Host requirement unknown",
|
|
1118
1127
|
sortDownloads: "npm downloads (30d)",
|
|
1128
|
+
downloadsPeriod: "30d",
|
|
1129
|
+
downloadsMeaning: "npm rolling 30-day downloads: {0}. Not lifetime downloads or unique users. Statistics may be delayed; the source check time does not guarantee completeness.",
|
|
1130
|
+
downloadsWindow: "Period: {0} to {1}.",
|
|
1131
|
+
downloadsWindowUnknown: "Period: not provided.",
|
|
1132
|
+
downloadsChecked: "Source checked at: {0}.",
|
|
1133
|
+
downloadsCheckedUnknown: "Source checked at: not provided.",
|
|
1119
1134
|
/** Discover/theme card byline tooltip for catalog `version`. */
|
|
1120
1135
|
catalogNpmLatest: "npm latest",
|
|
1121
1136
|
catalogVersionDated: "the npm version as of the catalog's last refresh ({0}); a release published since then appears after the next refresh",
|
|
@@ -1139,17 +1154,17 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1139
1154
|
perPage: "Per page",
|
|
1140
1155
|
marketUpdate: "Update the plugin market",
|
|
1141
1156
|
updateAll: "Update all",
|
|
1142
|
-
heldReleaseNotice: "Installed, but not the newest: this profile's minimumReleaseAge
|
|
1157
|
+
heldReleaseNotice: "Installed, but not the newest: this profile's minimumReleaseAge held {0} back, so {1} was installed.",
|
|
1143
1158
|
heldReleaseAction: "Install {0} anyway",
|
|
1144
|
-
ignoreUpdateNotice: "Ignore
|
|
1145
|
-
ignoreAllUpdateNotices: "Ignore all
|
|
1159
|
+
ignoreUpdateNotice: "Ignore until restart",
|
|
1160
|
+
ignoreAllUpdateNotices: "Ignore all until restart",
|
|
1146
1161
|
updateNoticeIgnored: "Reminder ignored for this boot",
|
|
1147
1162
|
tabThemes: "Themes",
|
|
1148
1163
|
tabBackup: "Backup & Restore",
|
|
1149
1164
|
backupLocal: "Local file",
|
|
1150
1165
|
backupDownload: "Export backup",
|
|
1151
1166
|
backupImport: "Import and preview",
|
|
1152
|
-
backupHint: "Includes the plugin list and profile configuration,
|
|
1167
|
+
backupHint: "Includes the plugin list and profile configuration, not the plugin files. Restore reinstalls them from the list.",
|
|
1153
1168
|
webdav: "WebDAV",
|
|
1154
1169
|
webdavPreset: "Provider preset",
|
|
1155
1170
|
webdavUrl: "Backup file URL",
|
|
@@ -1159,7 +1174,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1159
1174
|
webdavRestore: "Restore from WebDAV",
|
|
1160
1175
|
autoBackup: "Back up daily (when the market opens)",
|
|
1161
1176
|
webdavNote: "The WebDAV URL and username stay in this browser only; the password is kept server-side and must be re-entered each session.",
|
|
1162
|
-
localOnly: "The WebDAV URL and
|
|
1177
|
+
localOnly: "The WebDAV URL and username stay in this browser only.",
|
|
1163
1178
|
credsWarning: "Note: backups include profile configuration and files that may hold secrets (config.toml, .env, …). Local exports are unmodified, so upload only to a WebDAV target you trust.",
|
|
1164
1179
|
gist: "GitHub Gist",
|
|
1165
1180
|
gistToken: "GitHub token (session memory only — re-enter after refresh; leave empty to use server-side DSH_GITHUB_TOKEN or a logged-in gh CLI)",
|
|
@@ -1173,7 +1188,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1173
1188
|
gistSrcEnv: "DSH_GITHUB_TOKEN env var",
|
|
1174
1189
|
gistSrcGh: "gh CLI",
|
|
1175
1190
|
gistExportSelect: "Select plugins to export",
|
|
1176
|
-
gistExportHint: "All checked = full backup (config included);
|
|
1191
|
+
gistExportHint: "All checked = full backup (config included); otherwise only the checked plugins are exported, plus “include config” if ticked.",
|
|
1177
1192
|
gistSelectAll: "Select all",
|
|
1178
1193
|
gistSelectNone: "Select none",
|
|
1179
1194
|
gistIncludeConfig: "Include config files (may contain secrets)",
|
|
@@ -1195,9 +1210,9 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1195
1210
|
backupDone: "Backup uploaded",
|
|
1196
1211
|
restoreDone: "Restore complete — restart DeepSeek Harness",
|
|
1197
1212
|
restorePartial: "Restore completed, but these plugins failed to install:",
|
|
1198
|
-
restoreUnportable: "
|
|
1213
|
+
restoreUnportable: "installs from a path on another computer that does not exist here — reinstall or point it to a local path",
|
|
1199
1214
|
restoreBootError: "Still cannot boot after the restore:",
|
|
1200
|
-
orphanBundle: "⚠️ The next start will fail: the profile declares these
|
|
1215
|
+
orphanBundle: "⚠️ The next start will fail: the profile declares these plugins but they are not installed. Reinstall them, or remove them from dsh.profile.bundles in the profile package.json:",
|
|
1201
1216
|
restoreConfirm: "Restore will overwrite this profile configuration and reinstall plugins. Continue?",
|
|
1202
1217
|
restorePreviewDone: "Backup imported. Review Installed, then start restore.",
|
|
1203
1218
|
restoreMissing: "{0} plugins from this backup are not installed",
|
|
@@ -1214,7 +1229,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1214
1229
|
themeResultCount: "{0} themes",
|
|
1215
1230
|
themeFullscreen: "Browse full screen",
|
|
1216
1231
|
themeExitFullscreen: "Exit full screen",
|
|
1217
|
-
progressHint: "First installs download and
|
|
1232
|
+
progressHint: "First installs download the plugin and its dependencies — large plugins can take 1-3 minutes",
|
|
1218
1233
|
toastReady: "installed and live",
|
|
1219
1234
|
toastTheme: "is now active. Switch any time in Settings → Plugin Market → Themes",
|
|
1220
1235
|
toastToggledOn: "is now on",
|
|
@@ -1223,10 +1238,10 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1223
1238
|
stateLive: "Active",
|
|
1224
1239
|
stateRestart: "Installed — restart to apply",
|
|
1225
1240
|
stateInert: "Installed, not active",
|
|
1226
|
-
stateDependencyLibrary: "Library
|
|
1241
|
+
stateDependencyLibrary: "Library for {0}",
|
|
1227
1242
|
stateBroken: "Installed, verification failed",
|
|
1228
1243
|
stateDisabled: "Disabled",
|
|
1229
|
-
phaseResolving: "
|
|
1244
|
+
phaseResolving: "Preparing dependencies",
|
|
1230
1245
|
phaseDownloading: "Downloading",
|
|
1231
1246
|
phaseLinking: "Linking",
|
|
1232
1247
|
phaseBuilding: "Running build scripts",
|
|
@@ -1234,8 +1249,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1234
1249
|
packagesDone: "{0} packages processed",
|
|
1235
1250
|
updatedLive: "✓ Updated — live",
|
|
1236
1251
|
partialNote: "Cancelled — some changes were applied",
|
|
1237
|
-
reconciledNote: "Removed, but pnpm reported an error while finishing up (usually a locked file).
|
|
1238
|
-
actWhy: "Why not
|
|
1252
|
+
reconciledNote: "Removed, but pnpm reported an error while finishing up (usually a locked file). Your settings are already in sync — no retry needed.",
|
|
1253
|
+
actWhy: "Why is it not active?",
|
|
1239
1254
|
tabList: "List",
|
|
1240
1255
|
tabGroups: "Groups",
|
|
1241
1256
|
repoLink: "View the repository on GitHub",
|
|
@@ -1255,7 +1270,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1255
1270
|
deprecatedBadge: "Deprecated",
|
|
1256
1271
|
deprecatedWarn: "This plugin is marked as deprecated by the catalog; new users are advised against installing it.",
|
|
1257
1272
|
brokenPluginTitle: "{0} was removed after a failed update",
|
|
1258
|
-
brokenPluginBody: "The running DSH blocked the update, and the version it was replacing was already damaged. The market removed it from the profile so the next start does not fail
|
|
1273
|
+
brokenPluginBody: "The running DSH blocked the update, and the version it was replacing was already damaged. The market removed it from the profile so the next start does not fail. Its directory is untouched — quit DSH and install it again.",
|
|
1259
1274
|
brokenPluginAction: "Find this plugin",
|
|
1260
1275
|
viewReplacement: "View replacement",
|
|
1261
1276
|
installReplacement: "Install replacement",
|
|
@@ -1312,7 +1327,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1312
1327
|
checkErrorsEmpty: "No errors",
|
|
1313
1328
|
checkWarningsEmpty: "No warnings",
|
|
1314
1329
|
checkBundles: "Plugin load order (bundles)",
|
|
1315
|
-
checkBundlesEmpty: "No plugin
|
|
1330
|
+
checkBundlesEmpty: "No plugin packages configured",
|
|
1316
1331
|
checkOfficial: "official",
|
|
1317
1332
|
checkCommunity: "community",
|
|
1318
1333
|
checkSource: "source",
|
|
@@ -1321,22 +1336,22 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1321
1336
|
checkDir: "directory",
|
|
1322
1337
|
checkDuplicates: "Duplicate plugin entries",
|
|
1323
1338
|
checkDuplicatesEmpty: "No duplicate plugin entries",
|
|
1324
|
-
checkHoisted: "
|
|
1339
|
+
checkHoisted: "top level",
|
|
1325
1340
|
checkPeerMismatches: "Dependency version mismatches",
|
|
1326
1341
|
checkPeerEmpty: "No dependency version mismatches",
|
|
1327
|
-
checkPeerInfo: "{0}
|
|
1342
|
+
checkPeerInfo: "{0} more unconfirmed entries",
|
|
1328
1343
|
checkPeerOverview: "{0} mismatch(es) · {1} informational",
|
|
1329
|
-
checkRange: "
|
|
1344
|
+
checkRange: "required version",
|
|
1330
1345
|
checkResolved: "resolved version",
|
|
1331
1346
|
checkSatisfied: "satisfied",
|
|
1332
1347
|
checkUnsatisfied: "not satisfied",
|
|
1333
1348
|
checkUnknown: "unknown",
|
|
1334
1349
|
checkPeerRisk: "Dependency risks",
|
|
1335
|
-
checkPeerRiskEmpty: "No
|
|
1350
|
+
checkPeerRiskEmpty: "No dependency risks",
|
|
1336
1351
|
checkPeerWarning: "Dependency warnings",
|
|
1337
|
-
checkPeerWarningEmpty: "No
|
|
1352
|
+
checkPeerWarningEmpty: "No dependency warnings",
|
|
1338
1353
|
checkPeerInfoTier: "Dependency info",
|
|
1339
|
-
checkPeerInfoTierEmpty: "No
|
|
1354
|
+
checkPeerInfoTierEmpty: "No dependency info",
|
|
1340
1355
|
checkPeerSatisfied: "Satisfied dependencies",
|
|
1341
1356
|
checkPeerSatisfiedEmpty: "No satisfied dependency entries",
|
|
1342
1357
|
peerRiskBelowMin: "below declared minimum",
|
|
@@ -1350,8 +1365,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1350
1365
|
checkOverridesEmpty: "No overrides",
|
|
1351
1366
|
checkOverridden: "overrides",
|
|
1352
1367
|
checkResiduals: "Leftover directories",
|
|
1353
|
-
checkResidualsEmpty: "No
|
|
1354
|
-
checkResidualsHint: "
|
|
1368
|
+
checkResidualsEmpty: "No leftover directories.",
|
|
1369
|
+
checkResidualsHint: "No plugin uses these directories and they do not stop DSH from starting: an interrupted update left them behind. Quit DSH, then delete them or reinstall the affected plugin.",
|
|
1355
1370
|
checkResidualTmp: "pnpm temp directory",
|
|
1356
1371
|
checkResidualIncomplete: "incomplete package (no package.json)",
|
|
1357
1372
|
checkOrphans: "Invalid config entries",
|
|
@@ -1363,8 +1378,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1363
1378
|
orphanPatchTargetMissing: "target not found",
|
|
1364
1379
|
orphanNameMismatch: "name mismatch",
|
|
1365
1380
|
orphanReasonOther: "other",
|
|
1366
|
-
diagExplain: "
|
|
1367
|
-
diagExplainText: "This page checks for
|
|
1381
|
+
diagExplain: "Glossary",
|
|
1382
|
+
diagExplainText: "This page checks for plugin conflicts, mismatched dependencies and wrong load order. Terms used:",
|
|
1368
1383
|
diagTermBundle: "bundle = one plugin package, applied in order",
|
|
1369
1384
|
diagTermEntry: "entry = one item a plugin registers in the running composition",
|
|
1370
1385
|
diagTermPeer: "peer dependency = another package a plugin requires from the host",
|
|
@@ -1383,7 +1398,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1383
1398
|
orderSuggestHint: "Suggested order (auto-sorted by before/after rules):",
|
|
1384
1399
|
orderAutoSort: "Auto-sort",
|
|
1385
1400
|
orderAlreadyOptimal: "Current order already satisfies every rule and plugin dependency — nothing to reorder",
|
|
1386
|
-
orderTrialFail: "
|
|
1401
|
+
orderTrialFail: "Order check failed: {0}",
|
|
1387
1402
|
orderDiffHint: "This order would change the composition: {0} override(s), {1} orphan(s), {2} duplicate(s)",
|
|
1388
1403
|
duplicateNames: "Same-name plugins (informational only, not a conflict)",
|
|
1389
1404
|
orderReset: "Reset draft",
|
|
@@ -1391,8 +1406,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1391
1406
|
aiFix: "AI fix",
|
|
1392
1407
|
aiFixHint: "Hand the diagnostics to a new Agent session (copied to the clipboard; you decide whether to send)",
|
|
1393
1408
|
aiFixIntro: "Please help me fix the plugin issues of DeepSeek Harness (profile: {0}). Diagnostics found:",
|
|
1394
|
-
aiFixDetect: "Step 1 — identify yourself first. Before touching anything, determine whether the process you are running in IS the DeepSeek Harness
|
|
1395
|
-
aiFixIfSelf: "If YES — you are this harness: never change the live composition, the harness or core packages in place (don't edit cordis.patch.yml, don't reorder/enable/disable bundles, don't install/remove/upgrade a plugin, don't reinstall deps, don't upgrade/restart dsh). Three steps: 1) read-only analysis only, change nothing; 2) produce apply.sh/.bat (this fix's changes) and rollback.sh/.bat (fully reverts it); both are
|
|
1409
|
+
aiFixDetect: "Step 1 — identify yourself first. Before touching anything, determine whether the process you are running in IS the DeepSeek Harness process this profile belongs to (i.e. this diagnosed composition is the one you are running in right now). Check whether the cwd / $DSH_HOME / command line points at this profile, or whether you are running inside a deepseek-harness process. If you cannot tell, assume the answer is \"yes\" (the safe choice).",
|
|
1410
|
+
aiFixIfSelf: "If YES — you are this harness: never change the live composition, the harness or core packages in place (don't edit cordis.patch.yml, don't reorder/enable/disable bundles, don't install/remove/upgrade a plugin, don't reinstall deps, don't upgrade/restart dsh). Three steps: 1) read-only analysis only, change nothing; 2) produce apply.sh/.bat (this fix's changes) and rollback.sh/.bat (fully reverts it); both are safe to re-run — apply snapshots only when none exists yet and never overwrites an existing snapshot (an existing one means apply already ran, so roll back or confirm before re-running), while rollback restores from that snapshot, so a half-run apply can still be rolled back and repeated rollback is safe; 3) have me run apply in an external terminal and paste the output back to you. State the reason and wait for my confirmation at each step — never run these yourself.",
|
|
1396
1411
|
aiFixScope: "If NO — you are a process outside the target harness: you may then consider reordering dsh.profile.bundles, disabling / enabling plugins, or adjusting cordis.patch.yml. Note: official bundles are fixed; state your plan before changing anything.",
|
|
1397
1412
|
aiFixConservative: "Be conservative: only fix the clear errors listed above (boot failures / duplicate entries / risk-level dependency mismatches). Treat warnings and informational entries (e.g. optional or unconfirmed peer ranges) only when they relate to a clear error. Do not perform unnecessary upgrades or reordering; explain each change and wait for confirmation.",
|
|
1398
1413
|
aiFixCopied: "Fix prompt copied — paste it into a new conversation and send when ready",
|
|
@@ -1407,23 +1422,23 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1407
1422
|
checkOrderTip: "community bundle load order conflicts with declared before/after rules",
|
|
1408
1423
|
diagOkAll: "No conflict, dependency or ordering issues found",
|
|
1409
1424
|
presetSection: "Plugin presets",
|
|
1410
|
-
presetHint: "Save the current
|
|
1425
|
+
presetHint: "Save the current plugin order and disabled plugins as a preset and switch anytime; applying runs a trial start and creates a snapshot first.",
|
|
1411
1426
|
presetName: "Preset name",
|
|
1412
1427
|
presetSave: "Save current state",
|
|
1413
1428
|
presetSaving: "Saving…",
|
|
1414
1429
|
presetSaved: "Preset saved",
|
|
1415
1430
|
presetApply: "Apply",
|
|
1416
|
-
presetApplied: "Applied — restart to
|
|
1431
|
+
presetApplied: "Applied — restart to take effect",
|
|
1417
1432
|
presetDelete: "Delete",
|
|
1418
1433
|
presetDeleted: "Preset deleted",
|
|
1419
1434
|
presetEmpty: "No presets saved yet",
|
|
1420
1435
|
presetNameEmpty: "Enter a preset name",
|
|
1421
1436
|
presetFail: "Preset operation failed: ",
|
|
1422
1437
|
presetListFail: "Failed to load presets: ",
|
|
1423
|
-
presetBundleCount: "{0}
|
|
1438
|
+
presetBundleCount: "{0} plugins",
|
|
1424
1439
|
presetPreview: "Preview",
|
|
1425
1440
|
presetPreviewTitle: "Applying this preset will:",
|
|
1426
|
-
presetReorder: "reorder {0}
|
|
1441
|
+
presetReorder: "reorder {0} plugins",
|
|
1427
1442
|
presetEnable: "enable {0} plugins",
|
|
1428
1443
|
presetDisable: "disable {0} plugins",
|
|
1429
1444
|
presetNoop: "no changes",
|
|
@@ -1441,7 +1456,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1441
1456
|
snapRestored: "Restored — restart to apply",
|
|
1442
1457
|
snapRestoreFail: "Failed to restore: ",
|
|
1443
1458
|
snapRestoreConfirm: "Confirm restore",
|
|
1444
|
-
snapRestoreConfirmText: "Restoring overwrites the current
|
|
1459
|
+
snapRestoreConfirmText: "Restoring overwrites the current plugins and configuration from the snapshot; this cannot be undone (create a new snapshot first if unsure).",
|
|
1445
1460
|
snapFiles: "files",
|
|
1446
1461
|
snapDelete: "Delete",
|
|
1447
1462
|
snapDeleting: "Deleting…",
|
|
@@ -1450,27 +1465,27 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1450
1465
|
snapDeleteConfirm: "Confirm delete",
|
|
1451
1466
|
snapDeleteConfirmText: "This snapshot cannot be recovered after deletion.",
|
|
1452
1467
|
marketNoToggle: "The market itself cannot be disabled",
|
|
1453
|
-
hostDependencyWarning: "A plugin lists
|
|
1454
|
-
hostDependencyMore: "{0} more
|
|
1468
|
+
hostDependencyWarning: "A plugin lists packages that DSH already provides, so two copies may clash (declaration only — not confirmed):",
|
|
1469
|
+
hostDependencyMore: "{0} more omitted",
|
|
1455
1470
|
recoveryTitle: "Boot failed — adjust plugins",
|
|
1456
1471
|
recoveryLead: "This restart never came up, and dsh has exited. Tick the plugins to enable at the next start; the ones this boot blamed are marked in red and left unticked.",
|
|
1457
1472
|
recoveryOption: "Adjust plugins",
|
|
1458
1473
|
recoveryBanner: "Boot failed: ",
|
|
1459
1474
|
recoveryOpening: "Reading the failure details…",
|
|
1460
|
-
recoveryNoSummary: "The log
|
|
1475
|
+
recoveryNoSummary: "The log does not say why",
|
|
1461
1476
|
recoveryRawLog: "The raw dsh output (tail)",
|
|
1462
|
-
recoveryBlamedHint: "The plugins marked in red
|
|
1477
|
+
recoveryBlamedHint: "The plugins marked in red failed during this boot; unticking them disables them on the next start.",
|
|
1463
1478
|
recoveryNoBlameHint: "The log named no plugin in particular; below is what can be adjusted, as it stands now.",
|
|
1464
|
-
recoveryCarrier: "
|
|
1479
|
+
recoveryCarrier: "disables others",
|
|
1465
1480
|
recoveryNotToggleable: "cannot be switched here",
|
|
1466
1481
|
recoveryUnmatched: "Named by DSH but not switchable here: ",
|
|
1467
1482
|
recoveryLogPath: "Full log: ",
|
|
1468
1483
|
recoveryApply: "Save and restart",
|
|
1469
|
-
recoveryApplying: "
|
|
1484
|
+
recoveryApplying: "Saving and restarting…",
|
|
1470
1485
|
recoveryStandalone: "Open the standalone recovery page",
|
|
1471
1486
|
recoveryRestarting: "Restarting: this page reloads once dsh is up; if it fails again you come back here with the new error.",
|
|
1472
|
-
recoveryApplyFailed: "
|
|
1473
|
-
recoveryWriteFailed: "The last choice
|
|
1487
|
+
recoveryApplyFailed: "Could not save: ",
|
|
1488
|
+
recoveryWriteFailed: "The last choice was not saved in full, so nothing was restarted: ",
|
|
1474
1489
|
recoveryTimeout: "Timed out waiting for DeepSeek Harness to start. \"Adjust plugins\" can tell you whether one of them is what stops it."
|
|
1475
1490
|
};
|
|
1476
1491
|
//#endregion
|
|
@@ -2736,7 +2751,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
2736
2751
|
const HostCheckbox = optionalComponent("Checkbox");
|
|
2737
2752
|
//#endregion
|
|
2738
2753
|
//#region \0dsh-css:src/client/Market.module.css.mjs
|
|
2739
|
-
const css = ".nUhMVa_root{min-width:0;height:100%;color:var(--dsw-alias-label-primary,#1f2328);flex-direction:column;display:flex;position:relative;container-type:inline-size}.nUhMVa_head{flex-direction:column;gap:12px;padding:4px 4px 6px;display:flex}.nUhMVa_title{margin:0;font-size:16px;font-weight:500;line-height:24px}.nUhMVa_sub{color:var(--dsw-alias-label-tertiary,#8b93a1);align-items:center;gap:8px;margin:0;font-size:12px;line-height:18px;display:flex}.nUhMVa_submitLink{color:var(--dsw-alias-label-tertiary,#8b93a1);white-space:nowrap;font-size:11px;line-height:18px;text-decoration:none}.nUhMVa_submitLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:underline}.nUhMVa_tabs{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);align-items:flex-end;gap:2px;display:flex}.nUhMVa_tab{font:inherit;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-bottom:2px solid #0000;padding:7px 12px;font-size:13px}.nUhMVa_tab.nUhMVa_on{color:var(--dsw-alias-brand-primary,#4f6ef7);border-bottom-color:var(--dsw-alias-brand-primary,#4f6ef7);font-weight:600}.nUhMVa_subTabs{align-items:flex-end;gap:2px;margin:-4px 0 4px;display:flex}.nUhMVa_banner{background:var(--dsw-alias-bg-layer-2,#fdf3e3);border:1px solid var(--dsw-alias-border-l2,#f3e3c3);border-radius:8px;align-items:center;gap:8px;margin:0;padding:8px 12px;font-size:12px;display:flex}.nUhMVa_bannerIcon{color:var(--dsw-alias-label-secondary,#6b7280);flex-shrink:0}.nUhMVa_bannerHint{color:var(--dsw-alias-label-tertiary,#8b93a1);cursor:help;display:inline-flex}.nUhMVa_body{overflow-anchor:none;flex:1;padding:12px 4px 24px;overflow-x:hidden;overflow-y:auto}.nUhMVa_stickyHead{z-index:5;background:var(--dsw-alias-bg-layer-2,#f7f8fa);position:sticky;top:-1px}.nUhMVa_stickyHead:before{content:\"\";background:inherit;pointer-events:none;height:14px;position:absolute;bottom:100%;left:0;right:0}.nUhMVa_cats{margin:0 -4px 2px;padding:12px 4px 4px}.nUhMVa_catsRow{align-items:flex-start;gap:8px;display:flex;position:relative}.nUhMVa_star{color:var(--dsw-alias-label-secondary,#9ca3af);white-space:nowrap;flex:none;font-size:11px}.nUhMVa_top{z-index:20;background:var(--dsw-alias-bg-layer-1,#fff);box-shadow:var(--dsw-shadow-lv1,0 4px 12px #1f232814);border-radius:99px;display:inline-flex;position:absolute;bottom:18px;right:18px}.nUhMVa_topBtn{border-radius:99px;width:38px;height:38px;padding:0}.nUhMVa_tag{border:1px solid var(--dsw-alias-border-l3,#d9dde3);color:var(--dsw-alias-label-secondary,#6b7280);border-radius:4px;flex-shrink:0;padding:1px 6px;font-size:11px;line-height:16px}.nUhMVa_hostRequirement{border:1px solid var(--dsw-alias-border-l3,#d9dde3);color:var(--dsw-alias-label-secondary,#6b7280);text-overflow:ellipsis;white-space:nowrap;border-radius:4px;min-width:0;max-width:100%;padding:1px 6px;font-size:11px;line-height:16px;overflow:hidden}.nUhMVa_hostRequirementBad{border-color:var(--dsw-alias-state-error-primary,#dc2626);color:var(--dsw-alias-state-error-primary,#dc2626);background:#dc262614}.nUhMVa_hostFilterNote{color:var(--dsw-alias-label-tertiary,#8b93a1);margin-top:6px;font-size:11px;line-height:16px}.nUhMVa_okState{color:var(--dsw-alias-state-success-primary,#16a34a);white-space:nowrap;font-size:12px;font-weight:600}.nUhMVa_catsWrap{flex-wrap:wrap;flex:1;align-items:center;gap:6px;min-width:0;display:flex}.nUhMVa_catsCollapsed{max-height:62px;overflow:hidden}.nUhMVa_catsToggle.nUhMVa_catsToggle{height:26px;min-height:26px;color:var(--dsw-alias-label-secondary,#6b7280);padding:0 6px}.nUhMVa_shots{-webkit-overflow-scrolling:touch;scrollbar-width:thin;gap:8px;margin:6px 0 8px;padding:2px 0 6px;display:flex;overflow-x:auto}.nUhMVa_shot{object-fit:cover;border:1px solid var(--dsw-alias-border-default,#e5e7eb);background:var(--dsw-alias-bg-layer-2,#f3f4f6);cursor:pointer;border-radius:8px;flex:none;width:220px;height:150px}.nUhMVa_cardShots{-webkit-overflow-scrolling:touch;scrollbar-width:thin;gap:6px;margin:0 0 6px;padding:0 0 2px;display:flex;overflow-x:auto}.nUhMVa_cardShot{object-fit:contain;border:1px solid var(--dsw-alias-border-default,#e5e7eb);background:var(--dsw-alias-bg-layer-2,#f3f4f6);cursor:pointer;border-radius:8px;flex:none;width:132px;height:88px;display:block}.nUhMVa_lightbox{z-index:10000;cursor:zoom-out;background:#000000d9;justify-content:center;align-items:center;display:flex;position:fixed;top:0;bottom:0;left:0;right:0}.nUhMVa_lightboxImg{object-fit:contain;cursor:default;border-radius:4px;max-width:90vw;max-height:85vh}.nUhMVa_lightboxClose{color:#fff;cursor:pointer;background:#ffffff1f;border:none;border-radius:99px;place-items:center;width:36px;height:36px;font-size:22px;line-height:1;display:grid;position:absolute;top:16px;right:16px}.nUhMVa_lightboxClose:hover{background:#ffffff38}.nUhMVa_lightboxNav{color:#fff;cursor:pointer;background:#ffffff1f;border:none;border-radius:99px;place-items:center;width:44px;height:44px;display:grid;position:absolute;top:50%;transform:translateY(-50%)}.nUhMVa_lightboxNav:hover{background:#ffffff38}.nUhMVa_lightboxPrev{left:16px}.nUhMVa_lightboxNext{right:16px}.nUhMVa_lightboxDots{gap:8px;display:flex;position:absolute;bottom:20px;left:50%;transform:translate(-50%)}.nUhMVa_lightboxDot{cursor:pointer;background:#fff6;border-radius:99px;width:7px;height:7px}.nUhMVa_lightboxDotOn{background:#fff}.nUhMVa_cmd{background:var(--dsw-alias-bg-layer-2,#f3f4f6);word-break:break-all;border-radius:6px;margin:8px 0 0;padding:8px 10px;font-family:ui-monospace,Menlo,monospace;font-size:11px;line-height:18px}.nUhMVa_warnLine{color:var(--dsw-alias-state-warn-primary,#b45309);flex-wrap:wrap;align-items:center;gap:4px;margin:0;font-size:12px;font-weight:600;line-height:18px;display:flex}.nUhMVa_modalNote{color:var(--dsw-alias-label-tertiary,#8b93a1);align-items:center;gap:4px;margin:12px 0 0;font-size:12px;line-height:18px;display:flex}.nUhMVa_grid{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start;gap:10px;display:grid}.nUhMVa_masonry{align-items:flex-start;gap:10px;display:flex}.nUhMVa_masonryCol{flex-direction:column;flex:1;gap:10px;min-width:0;display:flex}.nUhMVa_masonry>.nUhMVa_masonryCol>*{align-self:stretch;min-width:0}@media (max-width:680px){.nUhMVa_masonry{flex-direction:column}.nUhMVa_masonryCol{width:100%}.nUhMVa_grid{grid-template-columns:minmax(0,1fr)}}.nUhMVa_swatches{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;gap:0;height:34px;display:flex;overflow:hidden}.nUhMVa_themesGrid{margin-bottom:12px}.nUhMVa_swatches i{flex:1}.nUhMVa_themeToolbar{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;padding:0 4px 12px;display:grid}.nUhMVa_themeSearch{box-sizing:border-box;width:100%;min-width:0}.nUhMVa_themeToolbarActions{justify-content:flex-end;align-items:center;gap:8px;display:flex}.nUhMVa_themeFullscreenBtn.nUhMVa_themeFullscreenBtn{width:28px;min-width:28px;padding:0}.nUhMVa_themeResultBar{min-height:24px;color:var(--dsw-alias-label-tertiary,#8b93a1);align-items:center;padding:0 4px 8px;font-size:12px;line-height:18px;display:flex}.nUhMVa_favoritesSectionHead{color:var(--dsw-alias-label-primary,#1f2328);margin:16px 0 8px;padding:0 4px;font-size:13px;font-weight:600;line-height:20px}.nUhMVa_favoritesSectionHead:first-of-type{margin-top:0}.nUhMVa_brokenPluginNotice{flex-direction:column;gap:8px;margin:0 0 8px;display:flex}.nUhMVa_brokenPluginItem{border:1px solid var(--dsw-alias-state-warn-tertiary,#b4530933);background:var(--dsw-alias-state-warn-tertiary,#b453090f);color:var(--dsw-alias-state-warn-primary,#b45309);border-radius:8px;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:10px;padding:8px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_brokenPluginText{flex-direction:column;gap:2px;min-width:0;display:flex}.nUhMVa_favoritesStaleBar{border:1px solid var(--dsw-alias-state-warn-tertiary,#b4530933);background:var(--dsw-alias-state-warn-tertiary,#b453090f);color:var(--dsw-alias-state-warn-primary,#b45309);border-radius:8px;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin:0 0 8px;padding:8px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_favoritesStaleOnly{flex-direction:column;align-items:flex-start;gap:10px;display:flex}.nUhMVa_themeGallery{grid-template-columns:repeat(4,minmax(0,1fr));align-items:stretch;gap:10px;display:grid}.nUhMVa_themeCard{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#fff);border-radius:8px;flex-direction:column;min-width:0;transition:border-color .16s cubic-bezier(.16,1,.3,1),box-shadow .16s cubic-bezier(.16,1,.3,1),transform .16s cubic-bezier(.16,1,.3,1);display:flex;overflow:hidden}.nUhMVa_themeCard:hover{border-color:var(--dsw-alias-border-l3,#d9dde3);box-shadow:var(--dsw-shadow-lv1,0 4px 12px #1f232814);transform:translateY(-1px)}.nUhMVa_themeCover{aspect-ratio:16/10;border:0;border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-2,#f3f4f6);width:100%;color:var(--dsw-alias-label-secondary,#6b7280);cursor:zoom-in;border-radius:0;padding:0;display:block;position:relative;overflow:hidden}.nUhMVa_themeCover img{object-fit:contain;background:var(--dsw-alias-bg-layer-2,#f3f4f6);width:100%;height:100%;transition:transform .18s cubic-bezier(.16,1,.3,1);display:block}.nUhMVa_themeCover:hover img{transform:scale(1.012)}.nUhMVa_themeCover:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4f6ef7);outline-offset:-3px}.nUhMVa_themeCoverEmpty{cursor:default;color:var(--dsw-alias-label-tertiary,#8b93a1);flex-direction:column;justify-content:center;align-items:center;gap:8px;font-size:12px;line-height:18px;display:flex}.nUhMVa_themePreviewAction,.nUhMVa_themePreviewCount{color:#fff;-webkit-backdrop-filter:blur(8px);background:#14181fc7;border:1px solid #ffffff57;border-radius:4px;align-items:center;height:24px;padding:0 8px;font-size:11px;line-height:16px;display:inline-flex;position:absolute;bottom:8px}.nUhMVa_themePreviewAction{gap:4px;right:8px}.nUhMVa_themePreviewCount{left:8px}.nUhMVa_themeCardBody{flex-direction:column;flex:1;gap:8px;padding:12px;display:flex}.nUhMVa_themeCardHead{align-items:flex-start;gap:8px;min-width:0;display:flex}.nUhMVa_themeIdentity{flex:1;min-width:0}.nUhMVa_themeStatus,.nUhMVa_themeStatusMuted{white-space:nowrap;border-radius:4px;flex:none;align-items:center;min-height:22px;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_themeStatus{background:var(--dsw-alias-state-success-tertiary,#16a34a1a);color:var(--dsw-alias-state-success-primary,#15803d)}.nUhMVa_themeStatusMuted{background:var(--dsw-alias-bg-layer-2,#f3f4f6);color:var(--dsw-alias-label-secondary,#6b7280)}.nUhMVa_themeDescription{min-height:36px;color:var(--dsw-alias-label-tertiary,#8b93a1);-webkit-line-clamp:3;-webkit-box-orient:vertical;margin:0;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.nUhMVa_themeCardFooter{justify-content:space-between;align-items:center;gap:8px;margin-top:auto;padding-top:4px;display:flex}.nUhMVa_themeLifecycle{min-width:0;color:var(--dsw-alias-label-tertiary,#8b93a1);text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:18px;overflow:hidden}.nUhMVa_themeActions{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:8px;margin-left:auto;display:flex}@container (width<=900px){.nUhMVa_themeGallery{grid-template-columns:repeat(3,minmax(0,1fr))}}@container (width<=680px){.nUhMVa_themeGallery{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (width<=460px){.nUhMVa_themeGallery{grid-template-columns:minmax(0,1fr)}}@container (width<=420px){.nUhMVa_sub{grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:2px 8px;display:grid}.nUhMVa_sub>span:first-child{grid-area:1/1}.nUhMVa_sub>.nUhMVa_grow{display:none}.nUhMVa_submitLink{grid-area:2/1}.nUhMVa_exportLogBtn{flex-shrink:0;grid-area:1/2/span 2}.nUhMVa_themeToolbar{grid-template-columns:minmax(0,1fr)}.nUhMVa_themeCardHead{flex-wrap:wrap}.nUhMVa_themeStatus,.nUhMVa_themeStatusMuted{order:3}}@container (width<=280px){.nUhMVa_themeCardFooter{flex-direction:column;align-items:flex-start}.nUhMVa_themeActions{justify-content:flex-start;width:100%;margin-left:0}}@media (max-width:560px){[role=dialog]:has([data-dsh-market-root])>nav{display:none}[role=dialog]:has([data-dsh-market-root])>div{flex:100%;width:100%;min-width:0}}[role=dialog]:has([data-dsh-market-fullscreen=true]){border-radius:0;width:100vw;max-width:none;height:100vh;max-height:none;position:fixed;top:0;bottom:0;left:0;right:0}@media (prefers-reduced-motion:reduce){.nUhMVa_themeCard,.nUhMVa_themeCover img{transition:none}.nUhMVa_themeCard:hover{transform:none}}.nUhMVa_card{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;flex-direction:column;align-self:start;gap:12px;padding:12px 14px;display:flex}.nUhMVa_row1{align-items:flex-start;gap:10px;min-width:0;display:flex}.nUhMVa_cardAction{flex-shrink:0;align-items:center;display:inline-flex}.nUhMVa_installBtn.nUhMVa_installBtn{min-width:64px}.nUhMVa_av{color:#fff;object-fit:cover;background:var(--dsw-alias-bg-layer-2,#f3f4f6);border-radius:50%;flex-shrink:0;place-items:center;width:16px;height:16px;font-size:9px;font-weight:700;display:grid}.nUhMVa_nm{text-overflow:ellipsis;white-space:nowrap;font-size:15px;font-weight:600;line-height:22px;overflow:hidden}.nUhMVa_nmLink{color:inherit;text-decoration:none;display:block}.nUhMVa_nmLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:underline}.nUhMVa_repoMark{color:var(--dsw-alias-label-secondary,#6b7280);vertical-align:-1px;flex-shrink:0;margin-left:5px;display:inline-block}.nUhMVa_nmLink:hover .nUhMVa_repoMark{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_byline{flex-wrap:wrap;align-items:center;gap:6px;min-width:0;margin-top:2px;display:flex}.nUhMVa_meta{color:var(--dsw-alias-label-secondary,#9ca3af);margin-top:2px;font-size:11px}.nUhMVa_metaInline{color:var(--dsw-alias-label-secondary,#9ca3af);font-size:11px}.nUhMVa_owner{color:var(--dsw-alias-label-secondary,#9ca3af);text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:44px;font-size:11px;overflow:hidden}.nUhMVa_desc{color:var(--dsw-alias-label-tertiary,#8b93a1);margin:0;font-size:12px;line-height:18px}.nUhMVa_descClamp{-webkit-line-clamp:5;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.nUhMVa_descToggle{width:20px;height:16px;color:var(--dsw-alias-label-tertiary,#8b93a1);cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;margin-top:2px;padding:0;display:flex}.nUhMVa_descToggle:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_foot{flex-wrap:nowrap;align-items:flex-end;gap:8px;display:flex}.nUhMVa_foot .nUhMVa_metaInline,.nUhMVa_foot .nUhMVa_src{white-space:nowrap}.nUhMVa_footTags{flex-wrap:wrap;flex:1 1 0;align-items:center;gap:8px;min-width:0;display:flex}.nUhMVa_grow{flex:1}.nUhMVa_titleRow{align-items:center;gap:10px;display:flex}.nUhMVa_version{color:var(--dsw-alias-label-tertiary,#8b93a1);font-variant-numeric:tabular-nums;flex-shrink:0;font-size:12px;line-height:20px}.nUhMVa_repoLink{color:var(--dsw-alias-label-tertiary,#8b93a1);flex-shrink:0;font-size:12px;line-height:20px;text-decoration:none}.nUhMVa_repoLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_noteRow{flex-wrap:wrap;align-items:baseline;gap:6px;min-width:0;display:flex}.nUhMVa_desc.nUhMVa_noteRow,.nUhMVa_desc.nUhMVa_noteRow+.nUhMVa_noteRow,.nUhMVa_noteEdit+.nUhMVa_noteRow{margin-top:6px}.nUhMVa_noteMine{color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_noteToggle{font:inherit;color:var(--dsw-alias-label-tertiary,#8b93a1);cursor:pointer;white-space:nowrap;background:0 0;border:none;flex-shrink:0;padding:0;font-size:11px;line-height:16px}.nUhMVa_noteToggle:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:underline}.nUhMVa_noteAction{color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-bg-layer-2,#f3f4f6);border:1px solid var(--dsw-alias-border-l3,#d9dde3);border-radius:4px;align-items:center;padding:0 5px;font-weight:600;text-decoration:none;display:inline-flex}.nUhMVa_noteAction:hover{color:var(--dsw-alias-label-primary,#1f2328);border-color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:none}.nUhMVa_noteEdit{flex-wrap:wrap;align-items:center;gap:6px;min-width:0;margin-top:6px;display:flex}.nUhMVa_noteInput{flex:1;min-width:160px}.nUhMVa_descTight{min-height:0}.nUhMVa_src{color:var(--dsw-alias-label-secondary,#9ca3af);font-size:11px;text-decoration:none}.nUhMVa_src:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_dot{vertical-align:2px;margin-left:5px}.nUhMVa_act{flex-wrap:wrap;align-items:center;gap:6px;margin-top:6px;font-size:11px;display:flex}.nUhMVa_actLive{color:var(--dsw-alias-state-success-primary,#16a34a);align-items:center;gap:4px;font-weight:600;display:inline-flex}.nUhMVa_actWarn{color:var(--dsw-alias-state-warn-primary,#b45309);align-items:center;gap:4px;font-weight:600;display:inline-flex}.nUhMVa_actBroken{color:var(--dsw-alias-state-error-primary,#dc2626);align-items:center;gap:4px;font-weight:600;display:inline-flex}.nUhMVa_actWhy{color:var(--dsw-alias-label-secondary,#6b7280);margin-top:2px}.nUhMVa_loading{color:var(--dsw-alias-label-secondary,#9ca3af);flex-direction:column;align-items:center;gap:12px;padding:48px;font-size:13px;display:flex}.nUhMVa_spin{color:var(--dsw-alias-brand-primary,#4f6ef7);flex-shrink:0;animation:.8s linear infinite nUhMVa_sp;display:inline-flex}.nUhMVa_logoMark{color:var(--dsw-alias-brand-primary,#4f6ef7);flex-shrink:0;display:inline-flex}.nUhMVa_logoPlug{transform-box:fill-box;transform-origin:50%;animation:1.5s cubic-bezier(.4,0,.2,1) infinite nUhMVa_dshmPlug}@keyframes nUhMVa_dshmPlug{0%,12%{transform:rotate(9deg)}45%,62%{transform:translate(-1.28px,1.27px)rotate(0)}95%,to{transform:rotate(9deg)}}@media (prefers-reduced-motion:reduce){.nUhMVa_logoPlug,.nUhMVa_spin{animation:1.5s ease-in-out infinite nUhMVa_dshmPlugFade}}@keyframes nUhMVa_dshmPlugFade{0%,to{opacity:1}50%{opacity:.35}}@keyframes nUhMVa_sp{to{transform:rotate(360deg)}}.nUhMVa_progress{background:var(--dsw-alias-bg-layer-2,#f3f4f6);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);color:var(--dsw-alias-label-secondary,#6b7280);border-radius:8px;flex-wrap:wrap;align-items:center;gap:9px;margin:0;padding:8px 12px;font-size:12px;display:flex}.nUhMVa_bar{background:var(--dsw-alias-border-l1,#e5e7eb);border-radius:99px;width:100%;height:4px;overflow:hidden}.nUhMVa_barFill{background:var(--dsw-alias-brand-primary,#4f6ef7);border-radius:99px;height:100%;transition:width .6s}.nUhMVa_barWave{width:30%;animation:1.2s ease-in-out infinite nUhMVa_dshmSlide}@keyframes nUhMVa_dshmSlide{0%{margin-left:-30%}to{margin-left:100%}}.nUhMVa_irow .nUhMVa_progress{margin-top:8px}.nUhMVa_progress code{text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,Menlo,monospace;font-size:11px;overflow:hidden}.nUhMVa_empty{color:var(--dsw-alias-label-secondary,#9ca3af);text-align:center;padding:32px;font-size:13px}.nUhMVa_err{color:var(--dsw-alias-state-error-primary,#dc2626);white-space:pre-wrap;word-break:break-all;margin:8px 0;font-size:12px}.nUhMVa_cardBlocked{border-color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_conflictHead{align-items:flex-start;gap:8px;display:flex}.nUhMVa_conflictIcon{color:var(--dsw-alias-state-error-primary,#dc2626);flex-shrink:0;margin-top:1px}.nUhMVa_conflictTitle{color:var(--dsw-alias-state-error-primary,#dc2626);font-size:13px;font-weight:600;line-height:18px}.nUhMVa_conflictBody{margin:0;font-size:12px;line-height:19px}.nUhMVa_roster{background:var(--dsw-alias-border-l2,#e5e7eb);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;flex-direction:column;gap:1px;display:flex;overflow:hidden}.nUhMVa_rosterRow{background:var(--dsw-alias-bg-layer-1,#fff);align-items:center;gap:8px;padding:7px 10px;display:flex}.nUhMVa_rosterMain{flex-direction:column;min-width:0;display:flex}.nUhMVa_rosterName{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:12px;font-weight:600;overflow:hidden}.nUhMVa_rosterAuthor{color:var(--dsw-alias-label-secondary,#9ca3af);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;overflow:hidden}.nUhMVa_rosterTag{border-radius:4px;flex-shrink:0;margin-left:auto;padding:1px 6px;font-size:10.5px;font-weight:600}.nUhMVa_rosterTagKeep{color:var(--dsw-alias-state-success-primary,#16a34a);background:#16a34a1f}.nUhMVa_rosterTagDrop{color:var(--dsw-alias-state-error-primary,#dc2626);background:#dc26261f}.nUhMVa_rosterRowOut .nUhMVa_rosterName{text-decoration:line-through}.nUhMVa_rosterRowOut{opacity:.62}.nUhMVa_rosterSplit{background:var(--dsw-alias-border-l2,#e5e7eb);height:1px}.nUhMVa_reassure{color:var(--dsw-alias-label-secondary,#6b7280);align-items:center;gap:5px;margin:0;font-size:11.5px;line-height:17px;display:flex}.nUhMVa_reassureOk{color:var(--dsw-alias-state-success-primary,#16a34a);flex-shrink:0}.nUhMVa_conflictWhy{color:var(--dsw-alias-label-tertiary,#8b93a1);overflow-wrap:anywhere;margin-top:2px;font-family:ui-monospace,Menlo,monospace;font-size:11px;line-height:17px}.nUhMVa_conflictWhyText{margin-top:5px;font-family:-apple-system,BlinkMacSystemFont,PingFang SC,sans-serif}.nUhMVa_choices{flex-direction:column;gap:7px;display:flex}.nUhMVa_choice{text-align:left;font:inherit;cursor:pointer;background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l3,#d9dde3);border-radius:9px;align-items:flex-start;gap:9px;padding:9px 11px;display:flex}.nUhMVa_choice:has(input:disabled){cursor:default;opacity:.6}.nUhMVa_choiceOn{border-color:var(--dsw-alias-brand-primary,#4f6ef7);background:var(--dsw-alias-bg-layer-2,#f5f7ff)}.nUhMVa_choiceRadio{width:13px;height:13px;accent-color:var(--dsw-alias-brand-primary,#4f6ef7);flex-shrink:0;margin:2px 0 0}.nUhMVa_choiceMain{flex-direction:column;gap:3px;min-width:0;display:flex}.nUhMVa_choiceTitle{font-size:12px;font-weight:600;line-height:17px}.nUhMVa_choiceNote{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:11px;line-height:16px}.nUhMVa_choiceSafe{color:var(--dsw-alias-state-success-primary,#16a34a)}.nUhMVa_stateTag{white-space:nowrap;background:var(--dsw-alias-bg-layer-2,#f3f4f6);min-height:20px;color:var(--dsw-alias-label-secondary,#6b7280);border-radius:5px;flex-shrink:0;align-items:center;gap:5px;padding:1px 7px;font-size:11px;line-height:16px;display:inline-flex}.nUhMVa_stateTag[data-on=true]{color:var(--dsw-alias-state-success-primary,#16a34a);background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#16a34a) 10%, transparent)}.nUhMVa_stateDot{background:var(--dsw-alias-label-tertiary,#8b93a1);border-radius:999px;flex:none;width:6px;height:6px}.nUhMVa_stateDot[data-on=true]{background:var(--dsw-alias-state-success-primary,#16a34a)}.nUhMVa_metaTag{text-overflow:ellipsis;white-space:nowrap;background:var(--dsw-alias-bg-layer-2,#f3f4f6);min-width:0;max-width:100%;min-height:20px;color:var(--dsw-alias-label-tertiary,#8b93a1);border-radius:5px;flex-shrink:1;padding:1px 7px;font-size:11px;line-height:18px;display:inline-block;overflow:hidden}.nUhMVa_metaTagOk{color:var(--dsw-alias-state-success-primary,#16a34a);background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#16a34a) 10%, transparent)}.nUhMVa_metaTagAction{font-family:inherit;font-size:11px;line-height:18px;font-weight:inherit;cursor:pointer;background:var(--dsw-alias-bg-layer-2,#f3f4f6);color:var(--dsw-alias-label-secondary,#6b7280);border:none;border-radius:5px;flex-shrink:0;padding:1px 7px}.nUhMVa_metaTagAction:hover:not(:disabled){color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_metaTagAction:disabled{opacity:.5;cursor:default}.nUhMVa_irowHead{align-items:flex-start;gap:8px;min-width:0;display:flex}.nUhMVa_irowHead .nUhMVa_irowName{flex:1 1 0;min-width:0}.nUhMVa_irowDevTag{letter-spacing:.02em;white-space:nowrap;cursor:default;-webkit-user-select:none;user-select:none;color:var(--dsw-alias-label-tertiary,#8b93a1);background:color-mix(in srgb, var(--dsw-alias-brand-primary,#4f6ef7) 9%, var(--dsw-alias-bg-layer-2,#f3f4f6));border-radius:99px;flex-shrink:0;padding:2px 8px;font-size:10px;font-weight:600;line-height:14px}.nUhMVa_nameLink{color:inherit;text-decoration:none}.nUhMVa_irowName{text-overflow:clip;flex-wrap:wrap;align-items:baseline;gap:6px;min-width:0;display:flex;overflow:visible}.nUhMVa_irowNameText{overflow-wrap:anywhere;white-space:normal;min-width:0}.nUhMVa_irowName>.nUhMVa_owner{flex:none}.nUhMVa_nameLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:underline}.nUhMVa_opWrap{flex-shrink:0;margin-bottom:6px;display:inline-flex;position:relative}.nUhMVa_opEntry{font:inherit;cursor:pointer;white-space:nowrap;color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l3,#d9dde3);border-radius:7px;align-items:center;gap:6px;padding:4px 10px;font-size:12px;display:inline-flex;position:relative}.nUhMVa_opEntryQuiet{color:var(--dsw-alias-label-secondary,#6b7280);background:0 0;border-color:#0000}.nUhMVa_opEntryAlert{border-color:var(--dsw-alias-state-error-primary,#dc2626);color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_opDot{background:var(--dsw-alias-state-error-primary,#dc2626);border-radius:99px;width:8px;height:8px;position:absolute;top:-3px;right:-3px}.nUhMVa_opPanel{z-index:40;background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l3,#d9dde3);border-radius:12px;width:460px;max-width:86vw;max-height:70vh;position:absolute;top:calc(100% + 6px);right:0;overflow-y:auto;box-shadow:0 20px 52px #00000047}.nUhMVa_opHead{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);align-items:center;gap:8px;padding:9px 14px;display:flex}.nUhMVa_opPanelTitle{font-size:12.5px;font-weight:600}.nUhMVa_opCloseBtn.nUhMVa_opCloseBtn{min-width:0;color:var(--dsw-alias-label-secondary,#6b7280);padding:0 6px}.nUhMVa_opAggregate{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-2,#f7f8fa);padding:9px 14px}.nUhMVa_opAggregateTop{font-variant-numeric:tabular-nums;font-size:12px;font-weight:600}.nUhMVa_opAggregateHint{color:var(--dsw-alias-label-tertiary,#8b93a1);margin-top:4px;font-size:10.5px}.nUhMVa_opRow{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);align-items:flex-start;gap:9px;padding:9px 14px;display:flex}.nUhMVa_opRow:last-child{border-bottom:none}.nUhMVa_opRowAlert{background:#dc26260f}.nUhMVa_opIcon{flex-shrink:0;place-items:center;width:14px;margin-top:1px;display:grid}.nUhMVa_opQueuedIcon{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:12px}.nUhMVa_opMain{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.nUhMVa_opTop{align-items:baseline;gap:6px;min-width:0;display:flex}.nUhMVa_opVerb{color:var(--dsw-alias-label-secondary,#6b7280);flex-shrink:0;font-size:12px}.nUhMVa_opName{text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:600;overflow:hidden}.nUhMVa_opStatus{color:var(--dsw-alias-label-tertiary,#8b93a1);overflow-wrap:anywhere;font-size:10.5px;line-height:16px}.nUhMVa_opStatusBad{color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_opActions{flex-shrink:0;align-items:center;gap:6px;margin-top:1px;display:flex}.nUhMVa_opDecision{border-top:1px dashed var(--dsw-alias-border-l2,#e5e7eb);flex-direction:column;gap:8px;margin-top:8px;padding-top:8px;display:flex}.nUhMVa_opDecisionFoot{align-items:center;gap:8px;display:flex}.nUhMVa_conflictDetailsToggle{font:inherit;cursor:pointer;color:var(--dsw-alias-label-tertiary,#8b93a1);background:0 0;border:none;align-items:center;gap:4px;padding:2px 0;font-size:11px;display:inline-flex}.nUhMVa_conflictDetailsToggle:hover{color:var(--dsw-alias-label-secondary,#6b7280)}.nUhMVa_opEmpty{text-align:center;color:var(--dsw-alias-label-secondary,#6b7280);padding:30px 14px;font-size:12px}.nUhMVa_opEmptyHint{color:var(--dsw-alias-label-tertiary,#8b93a1);margin-top:4px;font-size:11px}.nUhMVa_cardBlockedMark{font:inherit;cursor:pointer;color:var(--dsw-alias-state-error-primary,#dc2626);border:1px solid var(--dsw-alias-state-error-primary,#dc2626);background:#dc262614;border-radius:7px;align-items:center;gap:5px;padding:4px 9px;font-size:11px;display:inline-flex}.nUhMVa_dangerBtn.nUhMVa_dangerBtn{color:var(--dsw-alias-state-error-primary,#dc2626);border-color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_dangerBtn.nUhMVa_dangerBtn:hover:not(:disabled){background:var(--dsw-alias-state-error-primary,#dc2626);color:#fff}.nUhMVa_dangerArmed.nUhMVa_dangerArmed{background:var(--dsw-alias-state-error-primary,#dc2626);border-color:var(--dsw-alias-state-error-primary,#dc2626);color:#fff}.nUhMVa_retryBtn{margin-top:4px}.nUhMVa_irow{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:10px;flex-direction:column;gap:10px;min-width:0;padding:12px 14px;display:flex}.nUhMVa_irowActions{flex-wrap:wrap;justify-content:flex-start;align-items:center;gap:8px;min-width:0;display:flex}.nUhMVa_irowTrailing{flex-wrap:nowrap;flex-shrink:0;align-items:center;gap:8px;min-width:0;display:inline-flex}.nUhMVa_irowTrailing .nUhMVa_metaTag{flex-shrink:1;min-width:0}.nUhMVa_irowTrailing .nUhMVa_metaTagAction{flex-shrink:0}.nUhMVa_irowMissing{filter:grayscale();opacity:.5}.nUhMVa_irow>.nUhMVa_src,.nUhMVa_irow>.nUhMVa_owner,.nUhMVa_irow button{white-space:nowrap;flex-shrink:0}.nUhMVa_tabSearchRow{align-items:center;gap:8px;padding:0 4px 12px;display:flex}.nUhMVa_tabSearch{flex:1;min-width:0}.nUhMVa_caps{flex-wrap:wrap;align-items:center;gap:4px;min-width:0;padding:0 2px 6px;font-size:11px;line-height:1.5;display:flex}.nUhMVa_capsTitle{color:var(--dsw-alias-label-secondary,#8b949e);cursor:help}.nUhMVa_capChip{border:1px solid var(--dsw-alias-border-l2,#30363d);color:var(--dsw-alias-label-primary,#c9d1d9);white-space:nowrap;border-radius:999px;padding:0 6px}.nUhMVa_capMuted{border:1px dashed var(--dsw-alias-border-l2,#30363d);color:var(--dsw-alias-label-secondary,#8b949e);white-space:nowrap;border-radius:999px;padding:0 6px}.nUhMVa_capRed{color:var(--dsw-alias-state-warn-primary,#d29922);white-space:normal;overflow-wrap:anywhere}.nUhMVa_searchField{box-sizing:border-box;min-width:0;position:relative}.nUhMVa_searchInput.nUhMVa_searchInput{box-sizing:border-box;width:100%;min-width:0;padding-right:34px}.nUhMVa_searchClear{width:24px;height:24px;color:var(--dsw-alias-label-secondary,#59636e);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;justify-content:center;align-items:center;padding:0;font-size:20px;line-height:1;display:flex;position:absolute;top:50%;right:5px;transform:translateY(-50%)}.nUhMVa_searchClear:hover{background:var(--dsw-alias-bg-layer-2,#f3f4f6);color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_searchClear:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4f6ef7);outline-offset:1px}.nUhMVa_spec{color:var(--dsw-alias-label-secondary,#9ca3af);overflow-wrap:anywhere;min-width:0;font-family:ui-monospace,Menlo,monospace;font-size:11px}.nUhMVa_specTag{white-space:nowrap;border-radius:4px;flex-shrink:0;align-items:center;height:16px;padding:0 5px;font-size:10px;font-weight:600;display:inline-flex}.nUhMVa_specTagGit{color:var(--dsw-alias-state-business-primary,#0b7285);background:#12a3c41f}.nUhMVa_specTagFile{color:var(--dsw-alias-state-warn-primary,#b07d1b);background:#f0b42924}.nUhMVa_backupCheckList .nUhMVa_grow{white-space:nowrap;text-overflow:ellipsis;flex:70%;min-width:0;overflow:hidden}.nUhMVa_backupCheckList .nUhMVa_spec{text-align:right;white-space:nowrap;text-overflow:ellipsis;flex:0 30%;max-width:30%;overflow:hidden}.nUhMVa_staleAction{word-break:normal;flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}.nUhMVa_pct{color:var(--dsw-alias-label-secondary,#6b7280);flex-shrink:0;font-size:11px;font-weight:600}.nUhMVa_pager{flex-wrap:nowrap;justify-content:space-between;align-items:center;gap:8px;margin:16px 0 4px;display:flex}.nUhMVa_pagerPages{flex-wrap:nowrap;flex:1;justify-content:center;align-items:center;gap:4px;min-width:0;display:flex}.nUhMVa_pagerMeta{flex-wrap:nowrap;flex-shrink:0;align-items:center;gap:6px;display:flex}.nUhMVa_pagerPages button,.nUhMVa_pagerMeta button{min-width:0;padding:0 8px}.nUhMVa_pageEllipsis{color:var(--dsw-alias-label-secondary,#9ca3af);padding:0 1px;font-size:12px}.nUhMVa_pageInfo{color:var(--dsw-alias-label-secondary,#6b7280);white-space:nowrap;font-size:12px}@container (width<=544px){.nUhMVa_pager{flex-wrap:wrap;justify-content:center;gap:8px}.nUhMVa_pagerPages{flex-basis:100%}}.nUhMVa_depBadge{border:1px solid var(--dsw-alias-state-warn-primary,#b45309);color:var(--dsw-alias-state-warn-primary,#b45309);white-space:nowrap;border-radius:4px;flex-shrink:0;margin-left:6px;padding:1px 6px;font-size:11px;font-weight:600;line-height:16px}.nUhMVa_deprecate{color:var(--dsw-alias-state-warn-primary,#b45309);background:var(--dsw-alias-bg-layer-2,#fdf3e3);border:1px solid var(--dsw-alias-border-l2,#f3e3c3);border-radius:8px;margin:0;padding:8px 10px;font-size:12px;line-height:18px}.nUhMVa_deprecate a{color:var(--dsw-alias-state-warn-primary,#b45309);text-decoration:underline}.nUhMVa_deprecate .nUhMVa_src{margin-left:8px}.nUhMVa_depLine{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.nUhMVa_switch{border:1px solid var(--dsw-alias-border-l2,#d9dde3);background:var(--dsw-alias-bg-layer-2,#e5e7eb);cursor:pointer;border-radius:99px;flex-shrink:0;width:38px;height:22px;padding:0;transition:background .15s,border-color .15s;position:relative}.nUhMVa_switchOn{background:var(--dsw-alias-state-success-primary,#16a34a);border-color:var(--dsw-alias-state-success-primary,#16a34a)}.nUhMVa_switchMixed{background:var(--dsw-alias-state-warn-primary,#b45309);border-color:var(--dsw-alias-state-warn-primary,#b45309)}.nUhMVa_switchKnob{background:#fff;border-radius:99px;width:16px;height:16px;transition:left .15s;position:absolute;top:2px;left:2px;box-shadow:0 1px 2px #00000040}.nUhMVa_switchOn .nUhMVa_switchKnob,.nUhMVa_switchMixed .nUhMVa_switchKnob{left:18px}.nUhMVa_switch:disabled{opacity:.5;cursor:default}.nUhMVa_viewBar{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;align-items:center;gap:2px;width:fit-content;margin-bottom:12px;padding:2px;display:flex}.nUhMVa_viewBtn{font:inherit;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:6px;padding:4px 10px;font-size:12px;line-height:18px}.nUhMVa_viewBtn:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_viewOn{background:var(--dsw-alias-bg-layer-2,#eef0f4);color:var(--dsw-alias-label-primary,#1f2328);font-weight:600}.nUhMVa_groupRow{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;margin-bottom:10px;padding:12px 14px}.nUhMVa_groupHead{flex-wrap:wrap;align-items:center;gap:10px;min-width:0;display:flex}.nUhMVa_groupCollapse{width:22px;height:22px;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;background:0 0;border:none;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.nUhMVa_groupCollapse:hover{background:var(--dsw-alias-bg-layer-2,#eef0f4);color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_groupTitle{flex-direction:column;flex:auto;gap:1px;min-width:0;display:flex}.nUhMVa_groupTitle .nUhMVa_groupHint{margin-top:0}.nUhMVa_groupName{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:600;line-height:20px;overflow:hidden}.nUhMVa_groupMeta{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:11px;line-height:16px}.nUhMVa_groupActions{flex-wrap:wrap;flex-shrink:0;align-items:center;gap:6px;margin-left:auto;display:flex}.nUhMVa_groupMembers{flex-direction:column;gap:6px;margin-top:10px;display:flex}.nUhMVa_groupMember{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;align-items:center;gap:8px;min-width:0;padding:6px 8px;font-size:12px;line-height:18px;display:flex}.nUhMVa_groupMember .nUhMVa_nm{flex:1;min-width:0;font-size:12px}.nUhMVa_memberName{flex:auto;align-items:center;gap:6px;min-width:0;display:flex}.nUhMVa_memberName .nUhMVa_nm{flex:0 auto;min-width:0}.nUhMVa_memberKind{color:var(--dsw-alias-label-tertiary,#8b93a1);white-space:nowrap;flex:none;font-size:11px;line-height:16px}.nUhMVa_themeSlot{box-shadow:inset 0 -1px 0 var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px 8px 0 0;margin-bottom:4px}.nUhMVa_groupMember>.nUhMVa_switch,.nUhMVa_groupMember>button{flex-shrink:0}.nUhMVa_groupMemberAction{flex:none;margin-left:auto}.nUhMVa_groupMemberAction button{white-space:nowrap}.nUhMVa_groupAddPanel{border-top:1px dashed var(--dsw-alias-border-l2,#e5e7eb);flex-direction:column;gap:6px;margin-top:10px;padding-top:10px;display:flex}.nUhMVa_groupAddModalBody{flex-direction:column;gap:10px;min-width:0;display:flex}.nUhMVa_groupAddFilters{flex-wrap:wrap;gap:6px;display:flex}.nUhMVa_groupAddModalList{flex-direction:column;gap:6px;max-height:min(50vh,360px);padding-right:2px;display:flex;overflow-y:auto}.nUhMVa_groupAddModalHint{color:var(--dsw-alias-label-secondary,#6b7280);margin:0;font-size:12px;line-height:18px}.nUhMVa_groupAddPick{background:var(--dsw-alias-bg-layer-2,#f7f8fa);cursor:pointer;border-radius:8px;align-items:center;gap:8px;min-width:0;padding:8px 10px;display:flex}.nUhMVa_groupAddPick:hover{background:var(--dsw-alias-bg-layer-2,#eef0f4)}.nUhMVa_groupAddPick input{flex-shrink:0;margin:0}.nUhMVa_groupAddPick .nUhMVa_nm{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:12px;overflow:hidden}.nUhMVa_groupAddFooterMeta{color:var(--dsw-alias-label-secondary,#6b7280);align-self:center;margin-right:auto;font-size:12px;line-height:18px}.nUhMVa_groupOrgHint{color:var(--dsw-alias-label-tertiary,#8b93a1);margin:4px 0 0;font-size:11px;line-height:16px}.nUhMVa_groupRenameField{flex-direction:column;gap:6px;min-width:min(100%,320px);display:flex}.nUhMVa_groupRenameField label{color:var(--dsw-alias-label-secondary,#6b7280);font-size:12px;line-height:18px}.nUhMVa_groupRenameField .nUhMVa_inlineInput{width:100%}.nUhMVa_groupCreate{align-items:center;gap:8px;margin-bottom:10px;display:flex}.nUhMVa_groupCreateInline{flex-shrink:0;align-items:center;gap:8px;display:flex}.nUhMVa_groupCreateInline .nUhMVa_inlineInput{flex:none;width:160px}.nUhMVa_inlineInput{flex:1;min-width:120px}.nUhMVa_ungroupedRow{flex-wrap:nowrap}.nUhMVa_ungroupedRow>.nUhMVa_nm{flex:0 auto;max-width:42%;font-size:12px;line-height:18px}.nUhMVa_ungroupedState{flex:0 auto;align-items:center;min-width:0;max-width:46%;margin:0;display:inline-flex}.nUhMVa_ungroupedState>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.nUhMVa_ungroupedDesc{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-tertiary,#8b93a1);flex:1 1 0;font-size:12px;line-height:18px;overflow:hidden}.nUhMVa_ungroupedDesc.nUhMVa_noteMine{color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_groupHint{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:11px}.nUhMVa_sect{color:var(--dsw-alias-label-secondary,#6b7280);margin:14px 2px 8px;font-size:12px;font-weight:600}.nUhMVa_sectAction{color:var(--dsw-alias-label-secondary,#6b7280);align-items:center;gap:8px;margin:14px 2px 8px;font-size:12px;font-weight:600;display:flex}.nUhMVa_backupGrid{grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px;display:grid}.nUhMVa_backupCard{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;flex-direction:column;gap:10px;padding:16px;display:flex}.nUhMVa_backupCard h3{margin:0;font-size:14px}.nUhMVa_backupCard p{color:var(--dsw-alias-label-secondary,#6b7280);margin:0;font-size:12px;line-height:18px}.nUhMVa_backupActions{flex-wrap:wrap;gap:8px;display:flex;position:relative}.nUhMVa_hiddenFile{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.nUhMVa_backupInput{box-sizing:border-box;width:100%}.nUhMVa_backupCheck{cursor:pointer;align-items:center;gap:6px;font-size:12px;display:flex}.nUhMVa_backupWarn{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-state-warn-primary,#b45309)!important}.nUhMVa_backupMessage{color:var(--dsw-alias-label-secondary,#6b7280);grid-column:1/-1;font-size:12px}.nUhMVa_backupCheckList{flex-direction:column;gap:6px;max-height:260px;margin:10px 0 4px;padding-right:4px;display:flex;overflow-y:auto}.nUhMVa_backupCheckList .nUhMVa_backupCheck{justify-content:space-between;gap:8px}.nUhMVa_diagPage{flex-direction:column;gap:12px;height:100%;min-height:0;display:flex;overflow-y:auto}.nUhMVa_diagSummary{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;flex-wrap:wrap;align-items:center;gap:12px;padding:10px 14px;font-size:12px;display:flex}.nUhMVa_diagSummaryItem{color:var(--dsw-alias-label-secondary,#6b7280);white-space:nowrap;align-items:center;gap:6px;display:inline-flex}.nUhMVa_diagSummaryMeta{color:var(--dsw-alias-label-tertiary,#9ca3af);text-overflow:ellipsis;white-space:nowrap;max-width:320px;font-family:ui-monospace,Menlo,monospace;font-size:11px;overflow:hidden}.nUhMVa_diagSection{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;flex-direction:column;gap:8px;padding:12px 14px;display:flex}.nUhMVa_diagSection h3{color:var(--dsw-alias-label-primary,#1f2328);margin:0;font-size:13px;font-weight:600}.nUhMVa_diagCount{color:var(--dsw-alias-label-tertiary,#9ca3af);font-size:11px;font-weight:400}.nUhMVa_diagEmpty{color:var(--dsw-alias-label-secondary,#9ca3af);padding:8px 0;font-size:12px}.nUhMVa_diagBundle{border-top:1px solid var(--dsw-alias-border-l2,#f0f1f3);flex-direction:column;gap:6px;padding-top:8px;display:flex}.nUhMVa_diagBundle:first-of-type{border-top:none;padding-top:0}.nUhMVa_diagRow{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;font-size:12px;line-height:18px;display:flex}.nUhMVa_diagMeta{align-items:baseline;gap:8px;min-width:0;font-size:12px;display:flex}.nUhMVa_diagKey{color:var(--dsw-alias-label-tertiary,#9ca3af);flex-shrink:0;min-width:64px;font-size:11px}.nUhMVa_diagVal{color:var(--dsw-alias-label-primary,#1f2328);overflow-wrap:anywhere;min-width:0;font-family:ui-monospace,Menlo,monospace;font-size:12px;font-weight:500}.nUhMVa_diagIndex{background:var(--dsw-alias-bg-layer-2,#f3f4f6);min-width:18px;height:18px;color:var(--dsw-alias-label-secondary,#6b7280);border-radius:9px;flex-shrink:0;justify-content:center;align-items:center;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_diagArrow{color:var(--dsw-alias-label-tertiary,#9ca3af);flex-shrink:0;font-size:12px}.nUhMVa_diagBadgeOfficial{background:var(--dsw-alias-brand-primary,#4f6ef7);color:#fff;border-radius:9px;flex-shrink:0;align-items:center;height:18px;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_diagBadgeCommunity{background:var(--dsw-alias-bg-layer-2,#f3f4f6);height:18px;color:var(--dsw-alias-label-secondary,#6b7280);border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;display:inline-flex}.nUhMVa_diagBadgeShadow{background:var(--dsw-alias-state-error-primary,#dc2626);color:#fff;border-radius:9px;flex-shrink:0;align-items:center;height:18px;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_diagBadgeWarn{background:var(--dsw-alias-state-warn-primary,#b45309);color:#fff;white-space:nowrap;border-radius:9px;flex-shrink:0;align-items:center;height:18px;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_diagBadgeInfo{background:var(--dsw-alias-bg-layer-2,#f3f4f6);height:18px;color:var(--dsw-alias-label-secondary,#6b7280);white-space:nowrap;border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;display:inline-flex}.nUhMVa_diagList{flex-direction:column;gap:6px;display:flex}.nUhMVa_sectionOverview{color:var(--dsw-alias-label-tertiary,#8b93a1);text-overflow:ellipsis;white-space:nowrap;max-width:100%;padding:2px 0 6px;font-size:12px;line-height:18px;overflow:hidden}.nUhMVa_diagAlert{color:var(--dsw-alias-state-warn-primary,#b45309)}.nUhMVa_ovRow{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;flex-wrap:wrap;align-items:center;gap:8px;min-width:0;padding:6px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_ovArrow{color:var(--dsw-alias-label-tertiary,#9ca3af);flex-shrink:0;font-size:12px}.nUhMVa_ovByTag{background:var(--dsw-alias-brand-primary,#4f6ef7);color:#fff;text-overflow:ellipsis;white-space:nowrap;border-radius:9px;flex-shrink:0;align-items:center;max-width:260px;height:18px;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex;overflow:hidden}.nUhMVa_ovFrom{color:var(--dsw-alias-label-secondary,#6b7280);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:12px;overflow:hidden}.nUhMVa_orphRow{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;flex-wrap:wrap;align-items:center;gap:8px;min-width:0;padding:6px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_orphBadge{background:var(--dsw-alias-state-warn-primary,#b45309);color:#fff;white-space:nowrap;border-radius:9px;flex-shrink:0;align-items:center;height:18px;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_dragHandle{width:20px;height:20px;color:var(--dsw-alias-label-tertiary,#9ca3af);cursor:grab;-webkit-user-select:none;user-select:none;flex-shrink:0;justify-content:center;align-items:center;font-size:12px;line-height:20px;display:inline-flex}.nUhMVa_dragOver{outline:2px dashed var(--dsw-alias-brand-primary,#4f6ef7);outline-offset:2px;background:var(--dsw-alias-bg-layer-2,#f0f2f8);border-radius:8px}.nUhMVa_dragging{opacity:.45;background:var(--dsw-alias-bg-layer-2,#f3f4f6)}.nUhMVa_collapseHead{font:inherit;color:var(--dsw-alias-label-primary,#1f2328);cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:8px;width:100%;padding:0;font-size:13px;font-weight:600;display:flex}.nUhMVa_collapseIcon{color:var(--dsw-alias-label-secondary,#6b7280);flex-shrink:0;display:inline-flex}.nUhMVa_collapseTitle{flex:1;min-width:0}.nUhMVa_collapseBody{border-top:1px solid var(--dsw-alias-border-l2,#f0f1f3);overflow-wrap:anywhere;flex-direction:column;gap:10px;min-width:0;margin-top:8px;padding-top:10px;display:flex}.nUhMVa_orderPanel{flex-direction:column;gap:10px;min-width:0;display:flex}.nUhMVa_panelNote{color:var(--dsw-alias-label-secondary,#6b7280);margin:0;font-size:12px;line-height:18px}.nUhMVa_panelActions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.nUhMVa_presetList{flex-direction:column;gap:6px;min-width:0;display:flex}.nUhMVa_presetRow{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;flex-direction:column;align-items:stretch;gap:6px;min-width:0;max-width:100%;padding:8px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_presetName{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;font-weight:600;overflow:hidden}.nUhMVa_snapList{flex-direction:column;gap:6px;min-width:0;display:flex}.nUhMVa_snapRow{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;flex-direction:column;align-items:stretch;gap:8px;padding:10px 12px;font-size:12px;line-height:18px;display:flex}.nUhMVa_snapMeta{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.nUhMVa_snapConfirmText{color:var(--dsw-alias-state-warn-primary,#b45309);margin:0;font-size:12px;line-height:18px}.nUhMVa_confirmRow{flex-wrap:wrap;align-items:center;gap:6px;display:inline-flex}.nUhMVa_fixFallback{flex-direction:column;gap:6px;margin:8px 0;display:flex}.nUhMVa_fixFallbackText,.nUhMVa_envEditor{box-sizing:border-box;width:100%;color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-bg-layer-2,#f3f4f6);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);resize:vertical;white-space:pre-wrap;word-break:break-all;border-radius:6px;padding:8px 10px;font-family:ui-monospace,Menlo,monospace;font-size:11px;line-height:16px}.nUhMVa_setCard{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-3,#fff);border-radius:12px;list-style:none;transition:border-color .16s,background .16s}.nUhMVa_setCard:hover{border-color:var(--dsw-alias-label-dimmed,#c8ccd4)}.nUhMVa_setCardOpen{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-color:var(--dsw-alias-label-dimmed,#c8ccd4)}.nUhMVa_setHeader{-webkit-appearance:none;appearance:none;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:12px;align-items:center;gap:12px;padding:14px 16px;display:flex}.nUhMVa_setHeader:focus-visible{outline:2px solid var(--dsw-alias-brand-primary,#4f6ef7);outline-offset:-2px}.nUhMVa_setHeadText{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.nUhMVa_setName{color:var(--dsw-alias-label-primary,#1f2328);font-size:15px;font-weight:600;line-height:1.4}.nUhMVa_setDesc{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:13px;line-height:1.5}.nUhMVa_setChevron{color:var(--dsw-alias-label-tertiary,#8b93a1);flex:none;transition:transform .16s;display:inline-flex}.nUhMVa_setChevronOpen{transform:rotate(180deg)}.nUhMVa_setBody{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb);margin:0 16px;padding-bottom:8px}.nUhMVa_setRow{align-items:center;gap:12px;padding:12px 0;display:flex}.nUhMVa_setRow+.nUhMVa_setRow{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb)}.nUhMVa_setLabelBox{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.nUhMVa_setLabel{font-size:13px;line-height:20px}.nUhMVa_setHint{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:12px;line-height:18px}.nUhMVa_setConfirm{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb);flex-direction:column;gap:8px;padding:12px 0 4px;display:flex}.nUhMVa_setCheck{cursor:pointer;align-items:center;gap:8px;font-size:12px;line-height:18px;display:flex}.nUhMVa_setActions{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb);justify-content:flex-end;align-items:center;gap:8px;padding:12px 0 4px;display:flex}.nUhMVa_setInlineActions{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:6px;display:flex}.nUhMVa_setProxyEditor{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb);flex-wrap:wrap;align-items:flex-end;gap:10px;padding:12px 0;display:flex}.nUhMVa_setProxyLabel{min-width:180px;color:var(--dsw-alias-label-secondary,#6b7280);flex-direction:column;flex:1;gap:5px;font-size:12px;line-height:18px;display:flex}.nUhMVa_setProxyInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,#d1d5db);background:var(--dsw-alias-bg-layer-3,#fff);width:100%;min-width:0;color:var(--dsw-alias-label-primary,#1f2328);font:inherit;border-radius:7px;padding:6px 8px;font-size:12px;line-height:18px}.nUhMVa_setProxyInput:focus{border-color:var(--dsw-alias-brand-primary,#4f6ef7);outline:2px solid color-mix(in srgb,var(--dsw-alias-brand-primary,#4f6ef7) 18%,transparent)}.nUhMVa_setDanger{color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_setSeg{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;flex-shrink:0;gap:2px;padding:2px;display:inline-flex}.nUhMVa_setSegBtn{font:inherit;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:3px 10px;font-size:12px;line-height:18px}.nUhMVa_setSegBtn:disabled{cursor:default;opacity:.5}.nUhMVa_setSegOn{background:var(--dsw-alias-bg-layer-2,#eef0f4);color:var(--dsw-alias-label-primary,#1f2328);font-weight:600}.nUhMVa_setBetaTag{background:var(--dsw-alias-bg-module-platform,#eef0f4);color:var(--dsw-alias-label-secondary,#6b7280);border-radius:9px;margin-left:6px;padding:0 6px;font-size:11px;font-weight:600;line-height:17px}.nUhMVa_commentsLink{cursor:pointer;white-space:nowrap;color:var(--dsw-alias-label-secondary,#9ca3af);background:0 0;border:0;padding:0;font-size:11px;line-height:16px}.nUhMVa_commentsLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_footActions{flex-shrink:0;align-items:center;gap:8px;display:inline-flex}.nUhMVa_favoriteBtn{cursor:pointer;color:var(--dsw-alias-label-secondary,#9ca3af);background:0 0;border:0;align-items:center;padding:0;display:inline-flex}.nUhMVa_favoriteBtn:hover,.nUhMVa_favoriteOn{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_commentsNote{color:var(--dsw-alias-label-secondary,#9ca3af);margin:0 0 8px;font-size:11px;line-height:16px}.nUhMVa_commentsGithubPrompt{border:1px solid color-mix(in srgb,var(--dsw-alias-brand-primary,#4f6ef7) 24%,transparent);background:color-mix(in srgb,var(--dsw-alias-brand-primary,#4f6ef7) 6%,transparent);border-radius:8px;margin:0 0 10px;padding:10px}.nUhMVa_commentsGithubHint{color:var(--dsw-alias-label-primary,#1f2328);margin:0 0 8px;font-size:12px;line-height:17px}.nUhMVa_commentsGithubAction{box-sizing:border-box;border:1px solid var(--dsw-alias-brand-primary,#4f6ef7);min-height:28px;color:var(--dsw-alias-brand-primary,#4f6ef7);border-radius:6px;justify-content:center;align-items:center;padding:5px 10px;font-size:12px;font-weight:600;line-height:16px;text-decoration:none;display:inline-flex}.nUhMVa_commentsGithubAction:hover{background:color-mix(in srgb,var(--dsw-alias-brand-primary,#4f6ef7) 9%,transparent)}.nUhMVa_commentsStatus{color:var(--dsw-alias-label-secondary,#9ca3af);margin:0;font-size:12px}.nUhMVa_commentsStatus:empty{display:none}.nUhMVa_commentsError{color:var(--dsw-alias-label-primary,#1f2328);margin:0 0 8px;font-size:12px}.nUhMVa_commentsFail{flex-direction:column;align-items:flex-start;gap:8px;padding:12px 0;display:flex}.nUhMVa_commentsMount{width:100%;min-height:240px;max-height:56vh;overflow:auto}.nUhMVa_commentsMount iframe{width:100%}.nUhMVa_notesLink{font:inherit;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;text-align:left;background:0 0;border:none;margin:2px 0 0;padding:0;font-size:12px;line-height:18px;display:block}.nUhMVa_notesLink:hover{color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_notesModalWide{width:min(640px,92vw);max-width:min(640px,92vw)}.nUhMVa_notesBody{overscroll-behavior:contain;flex-direction:column;flex:0 auto;gap:10px;min-width:0;max-height:min(60vh,520px);padding:0 2px 8px 0;display:flex;overflow-y:auto}.nUhMVa_notesRange{align-items:center;gap:8px;margin-bottom:4px;font-size:12px;line-height:18px;display:flex}.nUhMVa_notesArrow{color:var(--dsw-alias-label-tertiary,#8b93a1)}.nUhMVa_notesMeta{letter-spacing:.02em;text-transform:uppercase;color:var(--dsw-alias-label-secondary,#6b7280);flex-wrap:wrap;align-items:baseline;gap:6px;margin-top:4px;font-size:12px;line-height:18px;display:flex}.nUhMVa_notesBody>.nUhMVa_notesMeta:first-child{margin-top:0}.nUhMVa_notesPre{white-space:pre-wrap;word-break:break-word;background:var(--dsw-alias-bg-layer-2,#eef0f4);border-radius:8px;max-height:40vh;margin:0;padding:10px 12px;font-size:13px;line-height:20px;overflow:auto}.nUhMVa_notesRendered{flex-direction:column;gap:8px;min-width:0;display:flex}.nUhMVa_notesImg{border-radius:6px;max-width:100%;height:auto;margin:4px 0;display:block}.nUhMVa_notesH{margin-top:4px;font-size:13px;font-weight:650;line-height:20px}.nUhMVa_notesP{font-size:13px;line-height:20px}.nUhMVa_notesQuote{border-left:3px solid var(--dsw-alias-border-l3,#d9dde3);background:var(--dsw-alias-bg-layer-2,#f7f8fa);color:var(--dsw-alias-label-primary,#1f2328);border-radius:0 6px 6px 0;margin:0;padding:8px 10px;font-size:13px;line-height:20px}.nUhMVa_notesFence{background:var(--dsw-alias-bg-layer-2,#eef0f4);font-family:var(--dsw-alias-font-mono,ui-monospace,Menlo,monospace);white-space:pre;border-radius:8px;margin:0;padding:10px 12px;font-size:12px;line-height:18px;overflow-x:auto}.nUhMVa_notesFence code{font:inherit;background:0 0;padding:0}.nUhMVa_notesBullets{flex-direction:column;gap:4px;margin:0;padding-left:18px;font-size:13px;line-height:20px;display:flex}.nUhMVa_notesA{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:none}.nUhMVa_notesA:hover{text-decoration:underline}.nUhMVa_notesCode{font-family:var(--dsw-alias-font-mono,ui-monospace,monospace);background:var(--dsw-alias-bg-layer-2,#eef0f4);border-radius:5px;padding:1px 5px;font-size:12px}.nUhMVa_notesList{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.nUhMVa_notesRow{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);align-items:baseline;gap:12px;padding:6px 0;display:flex}.nUhMVa_notesRow:last-child{border-bottom:none}.nUhMVa_notesDate{color:var(--dsw-alias-label-tertiary,#8b93a1);font-variant-numeric:tabular-nums;flex-shrink:0;font-size:12px}.nUhMVa_notesMsg{word-break:break-word;word-break:break-word;-webkit-line-clamp:3;-webkit-box-orient:vertical;min-width:0;font-size:13px;line-height:20px;display:-webkit-box;overflow:hidden}.nUhMVa_notesSha{color:var(--dsw-alias-label-secondary,#6b7280);font-variant-numeric:tabular-nums;flex-shrink:0;margin-left:auto;font-size:12px;text-decoration:none}.nUhMVa_recoverySummary{color:var(--dsw-alias-state-error-primary,#dc2626);word-break:break-word;align-items:flex-start;gap:8px;margin-bottom:8px;font-size:12px;display:flex}.nUhMVa_recoveryHint{color:var(--dsw-alias-label-secondary,#6b7280);margin:8px 0;font-size:12px}.nUhMVa_recoveryList{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;flex-direction:column;max-height:320px;display:flex;overflow-x:hidden;overflow-y:auto}.nUhMVa_recoveryRow{border-top:1px solid var(--dsw-alias-border-l2,#eef0f4);align-items:flex-start;gap:8px;padding:6px 10px;font-size:12px;display:flex}.nUhMVa_recoveryRow:first-child{border-top:none}.nUhMVa_recoveryBlamed{box-shadow:inset 3px 0 0 var(--dsw-alias-state-error-primary,#dc2626);background:#dc262612}.nUhMVa_recoveryMuted{opacity:.6}.nUhMVa_recoveryName{word-break:break-word;flex-direction:column;gap:2px;min-width:0;display:flex}.nUhMVa_recoveryReason{color:var(--dsw-alias-state-error-primary,#dc2626);word-break:break-word;font-size:11px}.nUhMVa_recoveryNote{color:var(--dsw-alias-label-tertiary,#8b93a1);word-break:break-word;margin-top:8px;font-size:11px}.nUhMVa_recoveryBadge{background:var(--dsw-alias-bg-layer-2,#eef0f4);color:var(--dsw-alias-label-secondary,#6b7280);border-radius:5px;margin-left:6px;padding:0 5px;font-size:10px}.nUhMVa_recoveryLog{color:var(--dsw-alias-label-secondary,#6b7280);margin:4px 0 8px;font-size:11px}.nUhMVa_recoveryLog pre{white-space:pre-wrap;word-break:break-word;max-height:180px;margin:6px 0 0;overflow:auto}.nUhMVa_notesSha:hover{color:var(--dsw-alias-label-primary,#1f2328);text-decoration:underline}.nUhMVa_notesVer{color:inherit;font-weight:600;text-decoration:none}.nUhMVa_notesVer:hover{text-decoration:underline}.nUhMVa_migrationSources{flex-direction:column;gap:8px;margin-top:4px;display:flex}.nUhMVa_migrationSource{border:1px solid var(--dsw-alias-border-default,#e5e7eb);border-radius:8px;flex-direction:column;gap:4px;padding:10px 12px;display:flex}.nUhMVa_migrationSource code{overflow-wrap:anywhere;font-family:ui-monospace,Menlo,monospace;font-size:12px}.nUhMVa_migrationLabel{color:var(--dsw-alias-label-secondary,#9ca3af);font-size:11px}.nUhMVa_migrationArrow{text-align:center;color:var(--dsw-alias-label-secondary,#9ca3af)}.nUhMVa_migrationWarning{color:var(--dsw-alias-state-warn-primary,#b45309);align-items:flex-start;gap:6px;margin:12px 0 0;font-size:12px;line-height:18px;display:flex}";
|
|
2754
|
+
const css = ".nUhMVa_root{min-width:0;height:100%;color:var(--dsw-alias-label-primary,#1f2328);flex-direction:column;display:flex;position:relative;container-type:inline-size}.nUhMVa_head{flex-direction:column;gap:12px;padding:4px 4px 6px;display:flex}.nUhMVa_title{margin:0;font-size:16px;font-weight:500;line-height:24px}.nUhMVa_sub{color:var(--dsw-alias-label-tertiary,#8b93a1);align-items:center;gap:8px;margin:0;font-size:12px;line-height:18px;display:flex}.nUhMVa_submitLink{color:var(--dsw-alias-label-tertiary,#8b93a1);white-space:nowrap;font-size:11px;line-height:18px;text-decoration:none}.nUhMVa_submitLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:underline}.nUhMVa_tabs{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);align-items:flex-end;gap:2px;display:flex}.nUhMVa_tab{font:inherit;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-bottom:2px solid #0000;padding:7px 12px;font-size:13px}.nUhMVa_tab.nUhMVa_on{color:var(--dsw-alias-brand-primary,#4f6ef7);border-bottom-color:var(--dsw-alias-brand-primary,#4f6ef7);font-weight:600}.nUhMVa_subTabs{align-items:flex-end;gap:2px;margin:-4px 0 4px;display:flex}.nUhMVa_banner{background:var(--dsw-alias-bg-layer-2,#fdf3e3);border:1px solid var(--dsw-alias-border-l2,#f3e3c3);border-radius:8px;align-items:center;gap:8px;margin:0;padding:8px 12px;font-size:12px;display:flex}.nUhMVa_bannerIcon{color:var(--dsw-alias-label-secondary,#6b7280);flex-shrink:0}.nUhMVa_bannerHint{color:var(--dsw-alias-label-tertiary,#8b93a1);cursor:help;display:inline-flex}.nUhMVa_body{overflow-anchor:none;flex:1;padding:12px 4px 24px;overflow-x:hidden;overflow-y:auto}.nUhMVa_stickyHead{z-index:5;background:var(--dsw-alias-bg-layer-2,#f7f8fa);position:sticky;top:-1px}.nUhMVa_stickyHead:before{content:\"\";background:inherit;pointer-events:none;height:14px;position:absolute;bottom:100%;left:0;right:0}.nUhMVa_cats{margin:0 -4px 2px;padding:12px 4px 4px}.nUhMVa_catsRow{align-items:flex-start;gap:8px;display:flex;position:relative}.nUhMVa_star{color:var(--dsw-alias-label-secondary,#9ca3af);white-space:nowrap;flex:none;font-size:11px}.nUhMVa_top{z-index:20;background:var(--dsw-alias-bg-layer-1,#fff);box-shadow:var(--dsw-shadow-lv1,0 4px 12px #1f232814);border-radius:99px;display:inline-flex;position:absolute;bottom:18px;right:18px}.nUhMVa_topBtn{border-radius:99px;width:38px;height:38px;padding:0}.nUhMVa_tag{border:1px solid var(--dsw-alias-border-l3,#d9dde3);color:var(--dsw-alias-label-secondary,#6b7280);border-radius:4px;flex-shrink:0;padding:1px 6px;font-size:11px;line-height:16px}.nUhMVa_hostRequirement{border:1px solid var(--dsw-alias-border-l3,#d9dde3);color:var(--dsw-alias-label-secondary,#6b7280);text-overflow:ellipsis;white-space:nowrap;border-radius:4px;min-width:0;max-width:100%;padding:1px 6px;font-size:11px;line-height:16px;overflow:hidden}.nUhMVa_hostRequirementBad{border-color:var(--dsw-alias-state-error-primary,#dc2626);color:var(--dsw-alias-state-error-primary,#dc2626);background:#dc262614}.nUhMVa_hostFilterNote{color:var(--dsw-alias-label-tertiary,#8b93a1);margin-top:6px;font-size:11px;line-height:16px}.nUhMVa_okState{color:var(--dsw-alias-state-success-primary,#16a34a);white-space:nowrap;font-size:12px;font-weight:600}.nUhMVa_catsWrap{flex-wrap:wrap;flex:1;align-items:center;gap:6px;min-width:0;display:flex}.nUhMVa_catsCollapsed{max-height:62px;overflow:hidden}.nUhMVa_catsToggle.nUhMVa_catsToggle{height:26px;min-height:26px;color:var(--dsw-alias-label-secondary,#6b7280);padding:0 6px}.nUhMVa_shots{-webkit-overflow-scrolling:touch;scrollbar-width:thin;gap:8px;margin:6px 0 8px;padding:2px 0 6px;display:flex;overflow-x:auto}.nUhMVa_shot{object-fit:cover;border:1px solid var(--dsw-alias-border-default,#e5e7eb);background:var(--dsw-alias-bg-layer-2,#f3f4f6);cursor:pointer;border-radius:8px;flex:none;width:220px;height:150px}.nUhMVa_cardShots{-webkit-overflow-scrolling:touch;scrollbar-width:thin;gap:6px;margin:0 0 6px;padding:0 0 2px;display:flex;overflow-x:auto}.nUhMVa_cardShot{object-fit:contain;border:1px solid var(--dsw-alias-border-default,#e5e7eb);background:var(--dsw-alias-bg-layer-2,#f3f4f6);cursor:pointer;border-radius:8px;flex:none;width:132px;height:88px;display:block}.nUhMVa_lightbox{z-index:10000;cursor:zoom-out;background:#000000d9;justify-content:center;align-items:center;display:flex;position:fixed;top:0;bottom:0;left:0;right:0}.nUhMVa_lightboxImg{object-fit:contain;cursor:default;border-radius:4px;max-width:90vw;max-height:85vh}.nUhMVa_lightboxClose{color:#fff;cursor:pointer;background:#ffffff1f;border:none;border-radius:99px;place-items:center;width:36px;height:36px;font-size:22px;line-height:1;display:grid;position:absolute;top:16px;right:16px}.nUhMVa_lightboxClose:hover{background:#ffffff38}.nUhMVa_lightboxNav{color:#fff;cursor:pointer;background:#ffffff1f;border:none;border-radius:99px;place-items:center;width:44px;height:44px;display:grid;position:absolute;top:50%;transform:translateY(-50%)}.nUhMVa_lightboxNav:hover{background:#ffffff38}.nUhMVa_lightboxPrev{left:16px}.nUhMVa_lightboxNext{right:16px}.nUhMVa_lightboxDots{gap:8px;display:flex;position:absolute;bottom:20px;left:50%;transform:translate(-50%)}.nUhMVa_lightboxDot{cursor:pointer;background:#fff6;border-radius:99px;width:7px;height:7px}.nUhMVa_lightboxDotOn{background:#fff}.nUhMVa_cmd{background:var(--dsw-alias-bg-layer-2,#f3f4f6);word-break:break-all;border-radius:6px;margin:8px 0 0;padding:8px 10px;font-family:ui-monospace,Menlo,monospace;font-size:11px;line-height:18px}.nUhMVa_warnLine{color:var(--dsw-alias-state-warn-primary,#b45309);flex-wrap:wrap;align-items:center;gap:4px;margin:0;font-size:12px;font-weight:600;line-height:18px;display:flex}.nUhMVa_modalNote{color:var(--dsw-alias-label-tertiary,#8b93a1);align-items:center;gap:4px;margin:12px 0 0;font-size:12px;line-height:18px;display:flex}.nUhMVa_grid{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start;gap:10px;display:grid}.nUhMVa_masonry{align-items:flex-start;gap:10px;display:flex}.nUhMVa_masonryCol{flex-direction:column;flex:1;gap:10px;min-width:0;display:flex}.nUhMVa_masonry>.nUhMVa_masonryCol>*{align-self:stretch;min-width:0}@media (max-width:680px){.nUhMVa_masonry{flex-direction:column}.nUhMVa_masonryCol{width:100%}.nUhMVa_grid{grid-template-columns:minmax(0,1fr)}}.nUhMVa_swatches{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;gap:0;height:34px;display:flex;overflow:hidden}.nUhMVa_themesGrid{margin-bottom:12px}.nUhMVa_swatches i{flex:1}.nUhMVa_themeToolbar{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;padding:0 4px 12px;display:grid}.nUhMVa_themeSearch{box-sizing:border-box;width:100%;min-width:0}.nUhMVa_themeToolbarActions{justify-content:flex-end;align-items:center;gap:8px;display:flex}.nUhMVa_themeFullscreenBtn.nUhMVa_themeFullscreenBtn{width:28px;min-width:28px;padding:0}.nUhMVa_themeResultBar{min-height:24px;color:var(--dsw-alias-label-tertiary,#8b93a1);align-items:center;padding:0 4px 8px;font-size:12px;line-height:18px;display:flex}.nUhMVa_favoritesSectionHead{color:var(--dsw-alias-label-primary,#1f2328);margin:16px 0 8px;padding:0 4px;font-size:13px;font-weight:600;line-height:20px}.nUhMVa_favoritesSectionHead:first-of-type{margin-top:0}.nUhMVa_brokenPluginNotice{flex-direction:column;gap:8px;margin:0 0 8px;display:flex}.nUhMVa_brokenPluginItem{border:1px solid var(--dsw-alias-state-warn-tertiary,#b4530933);background:var(--dsw-alias-state-warn-tertiary,#b453090f);color:var(--dsw-alias-state-warn-primary,#b45309);border-radius:8px;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:10px;padding:8px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_brokenPluginText{flex-direction:column;gap:2px;min-width:0;display:flex}.nUhMVa_favoritesStaleBar{border:1px solid var(--dsw-alias-state-warn-tertiary,#b4530933);background:var(--dsw-alias-state-warn-tertiary,#b453090f);color:var(--dsw-alias-state-warn-primary,#b45309);border-radius:8px;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin:0 0 8px;padding:8px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_favoritesStaleOnly{flex-direction:column;align-items:flex-start;gap:10px;display:flex}.nUhMVa_themeGallery{grid-template-columns:repeat(4,minmax(0,1fr));align-items:stretch;gap:10px;display:grid}.nUhMVa_themeCard{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#fff);border-radius:8px;flex-direction:column;min-width:0;transition:border-color .16s cubic-bezier(.16,1,.3,1),box-shadow .16s cubic-bezier(.16,1,.3,1),transform .16s cubic-bezier(.16,1,.3,1);display:flex;overflow:hidden}.nUhMVa_themeCard:hover{border-color:var(--dsw-alias-border-l3,#d9dde3);box-shadow:var(--dsw-shadow-lv1,0 4px 12px #1f232814);transform:translateY(-1px)}.nUhMVa_themeCover{aspect-ratio:16/10;border:0;border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-2,#f3f4f6);width:100%;color:var(--dsw-alias-label-secondary,#6b7280);cursor:zoom-in;border-radius:0;padding:0;display:block;position:relative;overflow:hidden}.nUhMVa_themeCover img{object-fit:contain;background:var(--dsw-alias-bg-layer-2,#f3f4f6);width:100%;height:100%;transition:transform .18s cubic-bezier(.16,1,.3,1);display:block}.nUhMVa_themeCover:hover img{transform:scale(1.012)}.nUhMVa_themeCover:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4f6ef7);outline-offset:-3px}.nUhMVa_themeCoverEmpty{cursor:default;color:var(--dsw-alias-label-tertiary,#8b93a1);flex-direction:column;justify-content:center;align-items:center;gap:8px;font-size:12px;line-height:18px;display:flex}.nUhMVa_themePreviewAction,.nUhMVa_themePreviewCount{color:#fff;-webkit-backdrop-filter:blur(8px);background:#14181fc7;border:1px solid #ffffff57;border-radius:4px;align-items:center;height:24px;padding:0 8px;font-size:11px;line-height:16px;display:inline-flex;position:absolute;bottom:8px}.nUhMVa_themePreviewAction{gap:4px;right:8px}.nUhMVa_themePreviewCount{left:8px}.nUhMVa_themeCardBody{flex-direction:column;flex:1;gap:8px;padding:12px;display:flex}.nUhMVa_themeCardHead{align-items:flex-start;gap:8px;min-width:0;display:flex}.nUhMVa_themeIdentity{flex:1;min-width:0}.nUhMVa_themeStatus,.nUhMVa_themeStatusMuted{white-space:nowrap;border-radius:4px;flex:none;align-items:center;min-height:22px;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_themeStatus{background:var(--dsw-alias-state-success-tertiary,#16a34a1a);color:var(--dsw-alias-state-success-primary,#15803d)}.nUhMVa_themeStatusMuted{background:var(--dsw-alias-bg-layer-2,#f3f4f6);color:var(--dsw-alias-label-secondary,#6b7280)}.nUhMVa_themeDescription{min-height:36px;color:var(--dsw-alias-label-tertiary,#8b93a1);-webkit-line-clamp:3;-webkit-box-orient:vertical;margin:0;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.nUhMVa_themeCardFooter{justify-content:space-between;align-items:center;gap:8px;margin-top:auto;padding-top:4px;display:flex}.nUhMVa_themeLifecycle{min-width:0;color:var(--dsw-alias-label-tertiary,#8b93a1);text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:18px;overflow:hidden}.nUhMVa_themeActions{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:8px;margin-left:auto;display:flex}@container (width<=900px){.nUhMVa_themeGallery{grid-template-columns:repeat(3,minmax(0,1fr))}}@container (width<=680px){.nUhMVa_themeGallery{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (width<=460px){.nUhMVa_themeGallery{grid-template-columns:minmax(0,1fr)}}@container (width<=420px){.nUhMVa_sub{grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:2px 8px;display:grid}.nUhMVa_sub>span:first-child{grid-area:1/1}.nUhMVa_sub>.nUhMVa_grow{display:none}.nUhMVa_submitLink{grid-area:2/1}.nUhMVa_exportLogBtn{flex-shrink:0;grid-area:1/2/span 2}.nUhMVa_themeToolbar{grid-template-columns:minmax(0,1fr)}.nUhMVa_themeCardHead{flex-wrap:wrap}.nUhMVa_themeStatus,.nUhMVa_themeStatusMuted{order:3}}@container (width<=280px){.nUhMVa_themeCardFooter{flex-direction:column;align-items:flex-start}.nUhMVa_themeActions{justify-content:flex-start;width:100%;margin-left:0}}@media (max-width:560px){[role=dialog]:has([data-dsh-market-root])>nav{display:none}[role=dialog]:has([data-dsh-market-root])>div{flex:100%;width:100%;min-width:0}}[role=dialog]:has([data-dsh-market-fullscreen=true]){border-radius:0;width:100vw;max-width:none;height:100vh;max-height:none;position:fixed;top:0;bottom:0;left:0;right:0}@media (prefers-reduced-motion:reduce){.nUhMVa_themeCard,.nUhMVa_themeCover img{transition:none}.nUhMVa_themeCard:hover{transform:none}}.nUhMVa_card{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;flex-direction:column;align-self:start;gap:12px;padding:12px 14px;display:flex}.nUhMVa_row1{align-items:flex-start;gap:10px;min-width:0;display:flex}.nUhMVa_cardAction{flex-shrink:0;align-items:center;display:inline-flex}.nUhMVa_installBtn.nUhMVa_installBtn{min-width:64px}.nUhMVa_av{width:16px;height:16px;color:var(--dsw-alias-label-primary,#1f2328);object-fit:cover;background:var(--dsw-alias-bg-layer-2,#f3f4f6);border-radius:50%;flex-shrink:0;place-items:center;font-size:9px;font-weight:700;display:grid}.nUhMVa_nm{text-overflow:ellipsis;white-space:nowrap;font-size:15px;font-weight:600;line-height:22px;overflow:hidden}.nUhMVa_nmLink{color:inherit;text-decoration:none;display:block}.nUhMVa_nmLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:underline}.nUhMVa_repoMark{color:var(--dsw-alias-label-secondary,#6b7280);vertical-align:-1px;flex-shrink:0;margin-left:5px;display:inline-block}.nUhMVa_nmLink:hover .nUhMVa_repoMark{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_byline{flex-wrap:wrap;align-items:center;gap:6px;min-width:0;margin-top:2px;display:flex}.nUhMVa_meta{color:var(--dsw-alias-label-secondary,#9ca3af);margin-top:2px;font-size:11px}.nUhMVa_metaInline{color:var(--dsw-alias-label-secondary,#9ca3af);font-size:11px}.nUhMVa_owner{color:var(--dsw-alias-label-secondary,#9ca3af);text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:44px;font-size:11px;overflow:hidden}.nUhMVa_desc{color:var(--dsw-alias-label-tertiary,#8b93a1);margin:0;font-size:12px;line-height:18px}.nUhMVa_descClamp{-webkit-line-clamp:5;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.nUhMVa_descToggle{width:20px;height:16px;color:var(--dsw-alias-label-tertiary,#8b93a1);cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;margin-top:2px;padding:0;display:flex}.nUhMVa_descToggle:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_foot{flex-wrap:nowrap;align-items:flex-end;gap:8px;display:flex}.nUhMVa_foot .nUhMVa_metaInline,.nUhMVa_foot .nUhMVa_src{white-space:nowrap}.nUhMVa_footTags{flex-wrap:wrap;flex:1 1 0;align-items:center;gap:8px;min-width:0;display:flex}.nUhMVa_grow{flex:1}.nUhMVa_titleRow{align-items:center;gap:10px;display:flex}.nUhMVa_version{color:var(--dsw-alias-label-tertiary,#8b93a1);font-variant-numeric:tabular-nums;flex-shrink:0;font-size:12px;line-height:20px}.nUhMVa_repoLink{color:var(--dsw-alias-label-tertiary,#8b93a1);flex-shrink:0;font-size:12px;line-height:20px;text-decoration:none}.nUhMVa_repoLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_noteRow{flex-wrap:wrap;align-items:baseline;gap:6px;min-width:0;display:flex}.nUhMVa_desc.nUhMVa_noteRow,.nUhMVa_desc.nUhMVa_noteRow+.nUhMVa_noteRow,.nUhMVa_noteEdit+.nUhMVa_noteRow{margin-top:6px}.nUhMVa_noteMine{color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_noteToggle{font:inherit;color:var(--dsw-alias-label-tertiary,#8b93a1);cursor:pointer;white-space:nowrap;background:0 0;border:none;flex-shrink:0;padding:0;font-size:11px;line-height:16px}.nUhMVa_noteToggle:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:underline}.nUhMVa_noteAction{color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-bg-layer-2,#f3f4f6);border:1px solid var(--dsw-alias-border-l3,#d9dde3);border-radius:4px;align-items:center;padding:0 5px;font-weight:600;text-decoration:none;display:inline-flex}.nUhMVa_noteAction:hover{color:var(--dsw-alias-label-primary,#1f2328);border-color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:none}.nUhMVa_noteEdit{flex-wrap:wrap;align-items:center;gap:6px;min-width:0;margin-top:6px;display:flex}.nUhMVa_noteInput{flex:1;min-width:160px}.nUhMVa_descTight{min-height:0}.nUhMVa_src{color:var(--dsw-alias-label-secondary,#9ca3af);font-size:11px;text-decoration:none}.nUhMVa_src:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_dot{vertical-align:2px;margin-left:5px}.nUhMVa_act{flex-wrap:wrap;align-items:center;gap:6px;margin-top:6px;font-size:11px;display:flex}.nUhMVa_actLive{color:var(--dsw-alias-state-success-primary,#16a34a);align-items:center;gap:4px;font-weight:600;display:inline-flex}.nUhMVa_actWarn{color:var(--dsw-alias-state-warn-primary,#b45309);align-items:center;gap:4px;font-weight:600;display:inline-flex}.nUhMVa_actBroken{color:var(--dsw-alias-state-error-primary,#dc2626);align-items:center;gap:4px;font-weight:600;display:inline-flex}.nUhMVa_actWhy{color:var(--dsw-alias-label-secondary,#6b7280);margin-top:2px}.nUhMVa_loading{color:var(--dsw-alias-label-secondary,#9ca3af);flex-direction:column;align-items:center;gap:12px;padding:48px;font-size:13px;display:flex}.nUhMVa_spin{color:var(--dsw-alias-brand-primary,#4f6ef7);flex-shrink:0;animation:.8s linear infinite nUhMVa_sp;display:inline-flex}.nUhMVa_logoMark{color:var(--dsw-alias-brand-primary,#4f6ef7);flex-shrink:0;display:inline-flex}.nUhMVa_logoPlug{transform-box:fill-box;transform-origin:50%;animation:1.5s cubic-bezier(.4,0,.2,1) infinite nUhMVa_dshmPlug}@keyframes nUhMVa_dshmPlug{0%,12%{transform:rotate(9deg)}45%,62%{transform:translate(-1.28px,1.27px)rotate(0)}95%,to{transform:rotate(9deg)}}@media (prefers-reduced-motion:reduce){.nUhMVa_logoPlug,.nUhMVa_spin{animation:1.5s ease-in-out infinite nUhMVa_dshmPlugFade}}@keyframes nUhMVa_dshmPlugFade{0%,to{opacity:1}50%{opacity:.35}}@keyframes nUhMVa_sp{to{transform:rotate(360deg)}}.nUhMVa_progress{background:var(--dsw-alias-bg-layer-2,#f3f4f6);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);color:var(--dsw-alias-label-secondary,#6b7280);border-radius:8px;flex-wrap:wrap;align-items:center;gap:9px;margin:0;padding:8px 12px;font-size:12px;display:flex}.nUhMVa_bar{background:var(--dsw-alias-border-l1,#e5e7eb);border-radius:99px;width:100%;height:4px;overflow:hidden}.nUhMVa_barFill{background:var(--dsw-alias-brand-primary,#4f6ef7);border-radius:99px;height:100%;transition:width .6s}.nUhMVa_barWave{width:30%;animation:1.2s ease-in-out infinite nUhMVa_dshmSlide}@keyframes nUhMVa_dshmSlide{0%{margin-left:-30%}to{margin-left:100%}}.nUhMVa_irow .nUhMVa_progress{margin-top:8px}.nUhMVa_progress code{text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,Menlo,monospace;font-size:11px;overflow:hidden}.nUhMVa_empty{color:var(--dsw-alias-label-secondary,#9ca3af);text-align:center;padding:32px;font-size:13px}.nUhMVa_err{color:var(--dsw-alias-state-error-primary,#dc2626);white-space:pre-wrap;word-break:break-all;margin:8px 0;font-size:12px}.nUhMVa_cardBlocked{border-color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_conflictHead{align-items:flex-start;gap:8px;display:flex}.nUhMVa_conflictIcon{color:var(--dsw-alias-state-error-primary,#dc2626);flex-shrink:0;margin-top:1px}.nUhMVa_conflictTitle{color:var(--dsw-alias-state-error-primary,#dc2626);font-size:13px;font-weight:600;line-height:18px}.nUhMVa_conflictBody{margin:0;font-size:12px;line-height:19px}.nUhMVa_roster{background:var(--dsw-alias-border-l2,#e5e7eb);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;flex-direction:column;gap:1px;display:flex;overflow:hidden}.nUhMVa_rosterRow{background:var(--dsw-alias-bg-layer-1,#fff);align-items:center;gap:8px;padding:7px 10px;display:flex}.nUhMVa_rosterMain{flex-direction:column;min-width:0;display:flex}.nUhMVa_rosterName{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:12px;font-weight:600;overflow:hidden}.nUhMVa_rosterAuthor{color:var(--dsw-alias-label-secondary,#9ca3af);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;overflow:hidden}.nUhMVa_rosterTag{border-radius:4px;flex-shrink:0;margin-left:auto;padding:1px 6px;font-size:10.5px;font-weight:600}.nUhMVa_rosterTagKeep{color:var(--dsw-alias-state-success-primary,#16a34a);background:#16a34a1f}.nUhMVa_rosterTagDrop{color:var(--dsw-alias-state-error-primary,#dc2626);background:#dc26261f}.nUhMVa_rosterRowOut .nUhMVa_rosterName{text-decoration:line-through}.nUhMVa_rosterRowOut{opacity:.62}.nUhMVa_rosterSplit{background:var(--dsw-alias-border-l2,#e5e7eb);height:1px}.nUhMVa_reassure{color:var(--dsw-alias-label-secondary,#6b7280);align-items:center;gap:5px;margin:0;font-size:11.5px;line-height:17px;display:flex}.nUhMVa_reassureOk{color:var(--dsw-alias-state-success-primary,#16a34a);flex-shrink:0}.nUhMVa_conflictWhy{color:var(--dsw-alias-label-tertiary,#8b93a1);overflow-wrap:anywhere;margin-top:2px;font-family:ui-monospace,Menlo,monospace;font-size:11px;line-height:17px}.nUhMVa_conflictWhyText{margin-top:5px;font-family:-apple-system,BlinkMacSystemFont,PingFang SC,sans-serif}.nUhMVa_choices{flex-direction:column;gap:7px;display:flex}.nUhMVa_choice{text-align:left;font:inherit;cursor:pointer;background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l3,#d9dde3);border-radius:9px;align-items:flex-start;gap:9px;padding:9px 11px;display:flex}.nUhMVa_choice:has(input:disabled){cursor:default;opacity:.6}.nUhMVa_choiceOn{border-color:var(--dsw-alias-brand-primary,#4f6ef7);background:var(--dsw-alias-bg-layer-2,#f5f7ff)}.nUhMVa_choiceRadio{width:13px;height:13px;accent-color:var(--dsw-alias-brand-primary,#4f6ef7);flex-shrink:0;margin:2px 0 0}.nUhMVa_choiceMain{flex-direction:column;gap:3px;min-width:0;display:flex}.nUhMVa_choiceTitle{font-size:12px;font-weight:600;line-height:17px}.nUhMVa_choiceNote{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:11px;line-height:16px}.nUhMVa_choiceSafe{color:var(--dsw-alias-state-success-primary,#16a34a)}.nUhMVa_stateTag{white-space:nowrap;background:var(--dsw-alias-bg-layer-2,#f3f4f6);min-height:20px;color:var(--dsw-alias-label-secondary,#6b7280);border-radius:5px;flex-shrink:0;align-items:center;gap:5px;padding:1px 7px;font-size:11px;line-height:16px;display:inline-flex}.nUhMVa_stateTag[data-on=true]{color:var(--dsw-alias-state-success-primary,#16a34a);background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#16a34a) 10%, transparent)}.nUhMVa_stateDot{background:var(--dsw-alias-label-tertiary,#8b93a1);border-radius:999px;flex:none;width:6px;height:6px}.nUhMVa_stateDot[data-on=true]{background:var(--dsw-alias-state-success-primary,#16a34a)}.nUhMVa_metaTag{text-overflow:ellipsis;white-space:nowrap;background:var(--dsw-alias-bg-layer-2,#f3f4f6);min-width:0;max-width:100%;min-height:20px;color:var(--dsw-alias-label-tertiary,#8b93a1);border-radius:5px;flex-shrink:1;padding:1px 7px;font-size:11px;line-height:18px;display:inline-block;overflow:hidden}.nUhMVa_metaTagOk{color:var(--dsw-alias-state-success-primary,#16a34a);background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#16a34a) 10%, transparent)}.nUhMVa_metaTagAction{font-family:inherit;font-size:11px;line-height:18px;font-weight:inherit;cursor:pointer;background:var(--dsw-alias-bg-layer-2,#f3f4f6);color:var(--dsw-alias-label-secondary,#6b7280);border:none;border-radius:5px;flex-shrink:0;padding:1px 7px}.nUhMVa_metaTagAction:hover:not(:disabled){color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_metaTagAction:disabled{opacity:.5;cursor:default}.nUhMVa_irowHead{align-items:flex-start;gap:8px;min-width:0;display:flex}.nUhMVa_irowHead .nUhMVa_irowName{flex:1 1 0;min-width:0}.nUhMVa_irowDevTag{letter-spacing:.02em;white-space:nowrap;cursor:default;-webkit-user-select:none;user-select:none;color:var(--dsw-alias-label-tertiary,#8b93a1);background:color-mix(in srgb, var(--dsw-alias-brand-primary,#4f6ef7) 9%, var(--dsw-alias-bg-layer-2,#f3f4f6));border-radius:99px;flex-shrink:0;padding:2px 8px;font-size:10px;font-weight:600;line-height:14px}.nUhMVa_nameLink{color:inherit;text-decoration:none}.nUhMVa_irowName{text-overflow:clip;flex-wrap:wrap;align-items:baseline;gap:6px;min-width:0;display:flex;overflow:visible}.nUhMVa_irowNameText{overflow-wrap:anywhere;white-space:normal;min-width:0}.nUhMVa_irowName>.nUhMVa_owner{flex:none}.nUhMVa_nameLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:underline}.nUhMVa_opWrap{flex-shrink:0;margin-bottom:6px;display:inline-flex;position:relative}.nUhMVa_opEntry{font:inherit;cursor:pointer;white-space:nowrap;color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l3,#d9dde3);border-radius:7px;align-items:center;gap:6px;padding:4px 10px;font-size:12px;display:inline-flex;position:relative}.nUhMVa_opEntryQuiet{color:var(--dsw-alias-label-secondary,#6b7280);background:0 0;border-color:#0000}.nUhMVa_opEntryAlert{border-color:var(--dsw-alias-state-error-primary,#dc2626);color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_opDot{background:var(--dsw-alias-state-error-primary,#dc2626);border-radius:99px;width:8px;height:8px;position:absolute;top:-3px;right:-3px}.nUhMVa_opPanel{z-index:40;background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l3,#d9dde3);border-radius:12px;width:460px;max-width:86vw;max-height:70vh;position:absolute;top:calc(100% + 6px);right:0;overflow-y:auto;box-shadow:0 20px 52px #00000047}.nUhMVa_opHead{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);align-items:center;gap:8px;padding:9px 14px;display:flex}.nUhMVa_opPanelTitle{font-size:12.5px;font-weight:600}.nUhMVa_opCloseBtn.nUhMVa_opCloseBtn{min-width:0;color:var(--dsw-alias-label-secondary,#6b7280);padding:0 6px}.nUhMVa_opAggregate{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-2,#f7f8fa);padding:9px 14px}.nUhMVa_opAggregateTop{font-variant-numeric:tabular-nums;font-size:12px;font-weight:600}.nUhMVa_opAggregateHint{color:var(--dsw-alias-label-tertiary,#8b93a1);margin-top:4px;font-size:10.5px}.nUhMVa_opRow{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);align-items:flex-start;gap:9px;padding:9px 14px;display:flex}.nUhMVa_opRow:last-child{border-bottom:none}.nUhMVa_opRowAlert{background:#dc26260f}.nUhMVa_opIcon{flex-shrink:0;place-items:center;width:14px;margin-top:1px;display:grid}.nUhMVa_opQueuedIcon{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:12px}.nUhMVa_opMain{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.nUhMVa_opTop{align-items:baseline;gap:6px;min-width:0;display:flex}.nUhMVa_opVerb{color:var(--dsw-alias-label-secondary,#6b7280);flex-shrink:0;font-size:12px}.nUhMVa_opName{text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:600;overflow:hidden}.nUhMVa_opStatus{color:var(--dsw-alias-label-tertiary,#8b93a1);overflow-wrap:anywhere;font-size:10.5px;line-height:16px}.nUhMVa_opStatusBad{color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_opActions{flex-shrink:0;align-items:center;gap:6px;margin-top:1px;display:flex}.nUhMVa_opDecision{border-top:1px dashed var(--dsw-alias-border-l2,#e5e7eb);flex-direction:column;gap:8px;margin-top:8px;padding-top:8px;display:flex}.nUhMVa_opDecisionFoot{align-items:center;gap:8px;display:flex}.nUhMVa_conflictDetailsToggle{font:inherit;cursor:pointer;color:var(--dsw-alias-label-tertiary,#8b93a1);background:0 0;border:none;align-items:center;gap:4px;padding:2px 0;font-size:11px;display:inline-flex}.nUhMVa_conflictDetailsToggle:hover{color:var(--dsw-alias-label-secondary,#6b7280)}.nUhMVa_opEmpty{text-align:center;color:var(--dsw-alias-label-secondary,#6b7280);padding:30px 14px;font-size:12px}.nUhMVa_opEmptyHint{color:var(--dsw-alias-label-tertiary,#8b93a1);margin-top:4px;font-size:11px}.nUhMVa_cardBlockedMark{font:inherit;cursor:pointer;color:var(--dsw-alias-state-error-primary,#dc2626);border:1px solid var(--dsw-alias-state-error-primary,#dc2626);background:#dc262614;border-radius:7px;align-items:center;gap:5px;padding:4px 9px;font-size:11px;display:inline-flex}.nUhMVa_dangerBtn.nUhMVa_dangerBtn{color:var(--dsw-alias-state-error-primary,#dc2626);border-color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_dangerBtn.nUhMVa_dangerBtn:hover:not(:disabled){background:var(--dsw-alias-state-error-primary,#dc2626);color:#fff}.nUhMVa_dangerArmed.nUhMVa_dangerArmed{background:var(--dsw-alias-state-error-primary,#dc2626);border-color:var(--dsw-alias-state-error-primary,#dc2626);color:var(--dsw-alias-label-primary-foreground,#fff)}.nUhMVa_retryBtn{margin-top:4px}.nUhMVa_irow{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:10px;flex-direction:column;gap:10px;min-width:0;padding:12px 14px;display:flex}.nUhMVa_irowActions{flex-wrap:wrap;justify-content:flex-start;align-items:center;gap:8px;min-width:0;display:flex}.nUhMVa_irowTrailing{flex-wrap:nowrap;flex-shrink:0;align-items:center;gap:8px;min-width:0;display:inline-flex}.nUhMVa_irowTrailing .nUhMVa_metaTag{flex-shrink:1;min-width:0}.nUhMVa_irowTrailing .nUhMVa_metaTagAction{flex-shrink:0}.nUhMVa_irowMissing{filter:grayscale();opacity:.5}.nUhMVa_irow>.nUhMVa_src,.nUhMVa_irow>.nUhMVa_owner,.nUhMVa_irow button{white-space:nowrap;flex-shrink:0}.nUhMVa_tabSearchRow{align-items:center;gap:8px;padding:0 4px 12px;display:flex}.nUhMVa_tabSearch{flex:1;min-width:0}.nUhMVa_caps{flex-wrap:wrap;align-items:center;gap:4px;min-width:0;padding:0 2px 6px;font-size:11px;line-height:1.5;display:flex}.nUhMVa_capsTitle{color:var(--dsw-alias-label-secondary,#8b949e);cursor:help}.nUhMVa_capChip{border:1px solid var(--dsw-alias-border-l2,#30363d);color:var(--dsw-alias-label-primary,#c9d1d9);white-space:nowrap;border-radius:999px;padding:0 6px}.nUhMVa_capMuted{border:1px dashed var(--dsw-alias-border-l2,#30363d);color:var(--dsw-alias-label-secondary,#8b949e);white-space:nowrap;border-radius:999px;padding:0 6px}.nUhMVa_capFact{color:var(--dsw-alias-label-secondary,#8b949e)}.nUhMVa_capCaveat{color:var(--dsw-alias-label-tertiary,#8b93a1);margin:6px 0 0;font-size:11px;line-height:16px}.nUhMVa_searchField{box-sizing:border-box;min-width:0;position:relative}.nUhMVa_searchInput.nUhMVa_searchInput{box-sizing:border-box;width:100%;min-width:0;padding-right:34px}.nUhMVa_searchClear{width:24px;height:24px;color:var(--dsw-alias-label-secondary,#59636e);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;justify-content:center;align-items:center;padding:0;font-size:20px;line-height:1;display:flex;position:absolute;top:50%;right:5px;transform:translateY(-50%)}.nUhMVa_searchClear:hover{background:var(--dsw-alias-bg-layer-2,#f3f4f6);color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_searchClear:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4f6ef7);outline-offset:1px}.nUhMVa_spec{color:var(--dsw-alias-label-secondary,#9ca3af);overflow-wrap:anywhere;min-width:0;font-family:ui-monospace,Menlo,monospace;font-size:11px}.nUhMVa_specTag{white-space:nowrap;border-radius:4px;flex-shrink:0;align-items:center;height:16px;padding:0 5px;font-size:10px;font-weight:600;display:inline-flex}.nUhMVa_specTagGit{color:var(--dsw-alias-state-business-primary,#0b7285);background:#12a3c41f}.nUhMVa_specTagFile{color:var(--dsw-alias-state-warn-primary,#b07d1b);background:#f0b42924}.nUhMVa_backupCheckList .nUhMVa_grow{white-space:nowrap;text-overflow:ellipsis;flex:70%;min-width:0;overflow:hidden}.nUhMVa_backupCheckList .nUhMVa_spec{text-align:right;white-space:nowrap;text-overflow:ellipsis;flex:0 30%;max-width:30%;overflow:hidden}.nUhMVa_staleAction{word-break:normal;flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}.nUhMVa_pct{color:var(--dsw-alias-label-secondary,#6b7280);flex-shrink:0;font-size:11px;font-weight:600}.nUhMVa_pager{flex-wrap:nowrap;justify-content:space-between;align-items:center;gap:8px;margin:16px 0 4px;display:flex}.nUhMVa_pagerPages{flex-wrap:nowrap;flex:1;justify-content:center;align-items:center;gap:4px;min-width:0;display:flex}.nUhMVa_pagerMeta{flex-wrap:nowrap;flex-shrink:0;align-items:center;gap:6px;display:flex}.nUhMVa_pagerPages button,.nUhMVa_pagerMeta button{min-width:0;padding:0 8px}.nUhMVa_pageEllipsis{color:var(--dsw-alias-label-secondary,#9ca3af);padding:0 1px;font-size:12px}.nUhMVa_pageInfo{color:var(--dsw-alias-label-secondary,#6b7280);white-space:nowrap;font-size:12px}@container (width<=544px){.nUhMVa_pager{flex-wrap:wrap;justify-content:center;gap:8px}.nUhMVa_pagerPages{flex-basis:100%}}.nUhMVa_depBadge{border:1px solid var(--dsw-alias-state-warn-primary,#b45309);color:var(--dsw-alias-state-warn-primary,#b45309);white-space:nowrap;border-radius:4px;flex-shrink:0;margin-left:6px;padding:1px 6px;font-size:11px;font-weight:600;line-height:16px}.nUhMVa_deprecate{color:var(--dsw-alias-state-warn-primary,#b45309);background:var(--dsw-alias-bg-layer-2,#fdf3e3);border:1px solid var(--dsw-alias-border-l2,#f3e3c3);border-radius:8px;margin:0;padding:8px 10px;font-size:12px;line-height:18px}.nUhMVa_deprecate a{color:var(--dsw-alias-state-warn-primary,#b45309);text-decoration:underline}.nUhMVa_deprecate .nUhMVa_src{margin-left:8px}.nUhMVa_depLine{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.nUhMVa_switch{border:1px solid var(--dsw-alias-border-l2,#d9dde3);background:var(--dsw-alias-bg-layer-2,#e5e7eb);cursor:pointer;border-radius:99px;flex-shrink:0;width:38px;height:22px;padding:0;transition:background .15s,border-color .15s;position:relative}.nUhMVa_switchOn{background:var(--dsw-alias-state-success-primary,#16a34a);border-color:var(--dsw-alias-state-success-primary,#16a34a)}.nUhMVa_switchMixed{background:var(--dsw-alias-state-warn-primary,#b45309);border-color:var(--dsw-alias-state-warn-primary,#b45309)}.nUhMVa_switchKnob{background:#fff;border-radius:99px;width:16px;height:16px;transition:left .15s;position:absolute;top:2px;left:2px;box-shadow:0 1px 2px #00000040}.nUhMVa_switchOn .nUhMVa_switchKnob,.nUhMVa_switchMixed .nUhMVa_switchKnob{left:18px}.nUhMVa_switch:disabled{opacity:.5;cursor:default}.nUhMVa_viewBar{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;align-items:center;gap:2px;width:fit-content;margin-bottom:12px;padding:2px;display:flex}.nUhMVa_viewBtn{font:inherit;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:6px;padding:4px 10px;font-size:12px;line-height:18px}.nUhMVa_viewBtn:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_viewOn{background:var(--dsw-alias-bg-layer-2,#eef0f4);color:var(--dsw-alias-label-primary,#1f2328);font-weight:600}.nUhMVa_groupRow{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;margin-bottom:10px;padding:12px 14px}.nUhMVa_groupHead{flex-wrap:wrap;align-items:center;gap:10px;min-width:0;display:flex}.nUhMVa_groupCollapse{width:22px;height:22px;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;background:0 0;border:none;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.nUhMVa_groupCollapse:hover{background:var(--dsw-alias-bg-layer-2,#eef0f4);color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_groupTitle{flex-direction:column;flex:auto;gap:1px;min-width:0;display:flex}.nUhMVa_groupTitle .nUhMVa_groupHint{margin-top:0}.nUhMVa_groupName{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:600;line-height:20px;overflow:hidden}.nUhMVa_groupMeta{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:11px;line-height:16px}.nUhMVa_groupActions{flex-wrap:wrap;flex-shrink:0;align-items:center;gap:6px;margin-left:auto;display:flex}.nUhMVa_groupMembers{flex-direction:column;gap:6px;margin-top:10px;display:flex}.nUhMVa_groupMember{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;align-items:center;gap:8px;min-width:0;padding:6px 8px;font-size:12px;line-height:18px;display:flex}.nUhMVa_groupMember .nUhMVa_nm{flex:1;min-width:0;font-size:12px}.nUhMVa_memberName{flex:auto;align-items:center;gap:6px;min-width:0;display:flex}.nUhMVa_memberName .nUhMVa_nm{flex:0 auto;min-width:0}.nUhMVa_memberKind{color:var(--dsw-alias-label-tertiary,#8b93a1);white-space:nowrap;flex:none;font-size:11px;line-height:16px}.nUhMVa_themeSlot{box-shadow:inset 0 -1px 0 var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px 8px 0 0;margin-bottom:4px}.nUhMVa_groupMember>.nUhMVa_switch,.nUhMVa_groupMember>button{flex-shrink:0}.nUhMVa_groupMemberAction{flex:none;margin-left:auto}.nUhMVa_groupMemberAction button{white-space:nowrap}.nUhMVa_groupAddPanel{border-top:1px dashed var(--dsw-alias-border-l2,#e5e7eb);flex-direction:column;gap:6px;margin-top:10px;padding-top:10px;display:flex}.nUhMVa_groupAddModalBody{flex-direction:column;gap:10px;min-width:0;display:flex}.nUhMVa_groupAddFilters{flex-wrap:wrap;gap:6px;display:flex}.nUhMVa_groupAddModalList{flex-direction:column;gap:6px;max-height:min(50vh,360px);padding-right:2px;display:flex;overflow-y:auto}.nUhMVa_groupAddModalHint{color:var(--dsw-alias-label-secondary,#6b7280);margin:0;font-size:12px;line-height:18px}.nUhMVa_groupAddPick{background:var(--dsw-alias-bg-layer-2,#f7f8fa);cursor:pointer;border-radius:8px;align-items:center;gap:8px;min-width:0;padding:8px 10px;display:flex}.nUhMVa_groupAddPick:hover{background:var(--dsw-alias-bg-layer-2,#eef0f4)}.nUhMVa_groupAddPick input{flex-shrink:0;margin:0}.nUhMVa_groupAddPick .nUhMVa_nm{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:12px;overflow:hidden}.nUhMVa_groupAddFooterMeta{color:var(--dsw-alias-label-secondary,#6b7280);align-self:center;margin-right:auto;font-size:12px;line-height:18px}.nUhMVa_groupOrgHint{color:var(--dsw-alias-label-tertiary,#8b93a1);margin:4px 0 0;font-size:11px;line-height:16px}.nUhMVa_groupRenameField{flex-direction:column;gap:6px;min-width:min(100%,320px);display:flex}.nUhMVa_groupRenameField label{color:var(--dsw-alias-label-secondary,#6b7280);font-size:12px;line-height:18px}.nUhMVa_groupRenameField .nUhMVa_inlineInput{width:100%}.nUhMVa_groupCreate{align-items:center;gap:8px;margin-bottom:10px;display:flex}.nUhMVa_groupCreateInline{flex-shrink:0;align-items:center;gap:8px;display:flex}.nUhMVa_groupCreateInline .nUhMVa_inlineInput{flex:none;width:160px}.nUhMVa_inlineInput{flex:1;min-width:120px}.nUhMVa_ungroupedRow{flex-wrap:nowrap}.nUhMVa_ungroupedRow>.nUhMVa_nm{flex:0 auto;max-width:42%;font-size:12px;line-height:18px}.nUhMVa_ungroupedState{flex:0 auto;align-items:center;min-width:0;max-width:46%;margin:0;display:inline-flex}.nUhMVa_ungroupedState>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.nUhMVa_ungroupedDesc{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-tertiary,#8b93a1);flex:1 1 0;font-size:12px;line-height:18px;overflow:hidden}.nUhMVa_ungroupedDesc.nUhMVa_noteMine{color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_groupHint{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:11px}.nUhMVa_sect{color:var(--dsw-alias-label-secondary,#6b7280);margin:14px 2px 8px;font-size:12px;font-weight:600}.nUhMVa_sectAction{color:var(--dsw-alias-label-secondary,#6b7280);align-items:center;gap:8px;margin:14px 2px 8px;font-size:12px;font-weight:600;display:flex}.nUhMVa_backupGrid{grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px;display:grid}.nUhMVa_backupCard{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;flex-direction:column;gap:10px;padding:16px;display:flex}.nUhMVa_backupCard h3{margin:0;font-size:14px}.nUhMVa_backupCard p{color:var(--dsw-alias-label-secondary,#6b7280);margin:0;font-size:12px;line-height:18px}.nUhMVa_backupActions{flex-wrap:wrap;gap:8px;display:flex;position:relative}.nUhMVa_hiddenFile{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.nUhMVa_backupInput{box-sizing:border-box;width:100%}.nUhMVa_backupCheck{cursor:pointer;align-items:center;gap:6px;font-size:12px;display:flex}.nUhMVa_backupWarn{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-state-warn-primary,#b45309)!important}.nUhMVa_backupMessage{color:var(--dsw-alias-label-secondary,#6b7280);grid-column:1/-1;font-size:12px}.nUhMVa_backupCheckList{flex-direction:column;gap:6px;max-height:260px;margin:10px 0 4px;padding-right:4px;display:flex;overflow-y:auto}.nUhMVa_backupCheckList .nUhMVa_backupCheck{justify-content:space-between;gap:8px}.nUhMVa_diagPage{flex-direction:column;gap:12px;height:100%;min-height:0;display:flex;overflow-y:auto}.nUhMVa_diagSummary{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;flex-wrap:wrap;align-items:center;gap:12px;padding:10px 14px;font-size:12px;display:flex}.nUhMVa_diagSummaryItem{color:var(--dsw-alias-label-secondary,#6b7280);white-space:nowrap;align-items:center;gap:6px;display:inline-flex}.nUhMVa_diagSummaryMeta{color:var(--dsw-alias-label-tertiary,#9ca3af);text-overflow:ellipsis;white-space:nowrap;max-width:320px;font-family:ui-monospace,Menlo,monospace;font-size:11px;overflow:hidden}.nUhMVa_diagSection{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;flex-direction:column;gap:8px;padding:12px 14px;display:flex}.nUhMVa_diagSection h3{color:var(--dsw-alias-label-primary,#1f2328);margin:0;font-size:13px;font-weight:600}.nUhMVa_diagCount{color:var(--dsw-alias-label-tertiary,#9ca3af);font-size:11px;font-weight:400}.nUhMVa_diagEmpty{color:var(--dsw-alias-label-secondary,#9ca3af);padding:8px 0;font-size:12px}.nUhMVa_diagBundle{border-top:1px solid var(--dsw-alias-border-l2,#f0f1f3);flex-direction:column;gap:6px;padding-top:8px;display:flex}.nUhMVa_diagBundle:first-of-type{border-top:none;padding-top:0}.nUhMVa_diagRow{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;font-size:12px;line-height:18px;display:flex}.nUhMVa_diagMeta{align-items:baseline;gap:8px;min-width:0;font-size:12px;display:flex}.nUhMVa_diagKey{color:var(--dsw-alias-label-tertiary,#9ca3af);flex-shrink:0;min-width:64px;font-size:11px}.nUhMVa_diagVal{color:var(--dsw-alias-label-primary,#1f2328);overflow-wrap:anywhere;min-width:0;font-family:ui-monospace,Menlo,monospace;font-size:12px;font-weight:500}.nUhMVa_diagIndex{background:var(--dsw-alias-bg-layer-2,#f3f4f6);min-width:18px;height:18px;color:var(--dsw-alias-label-secondary,#6b7280);border-radius:9px;flex-shrink:0;justify-content:center;align-items:center;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_diagArrow{color:var(--dsw-alias-label-tertiary,#9ca3af);flex-shrink:0;font-size:12px}.nUhMVa_diagBadgeOfficial{background:var(--dsw-alias-button-primary-fill,var(--dsw-alias-brand-primary,#4f6ef7));height:18px;color:var(--dsw-alias-label-primary-foreground,#fff);border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_diagBadgeCommunity{background:var(--dsw-alias-bg-layer-2,#f3f4f6);height:18px;color:var(--dsw-alias-label-secondary,#6b7280);border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;display:inline-flex}.nUhMVa_diagBadgeShadow{background:var(--dsw-alias-state-error-primary,#dc2626);height:18px;color:var(--dsw-alias-label-primary-foreground,#fff);border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_diagBadgeWarn{background:var(--dsw-alias-state-warn-primary,#b45309);height:18px;color:var(--dsw-alias-label-primary-foreground,#fff);white-space:nowrap;border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_diagBadgeInfo{background:var(--dsw-alias-bg-layer-2,#f3f4f6);height:18px;color:var(--dsw-alias-label-secondary,#6b7280);white-space:nowrap;border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;display:inline-flex}.nUhMVa_diagList{flex-direction:column;gap:6px;display:flex}.nUhMVa_sectionOverview{color:var(--dsw-alias-label-tertiary,#8b93a1);text-overflow:ellipsis;white-space:nowrap;max-width:100%;padding:2px 0 6px;font-size:12px;line-height:18px;overflow:hidden}.nUhMVa_diagAlert{color:var(--dsw-alias-state-warn-primary,#b45309)}.nUhMVa_ovRow{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;flex-wrap:wrap;align-items:center;gap:8px;min-width:0;padding:6px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_ovArrow{color:var(--dsw-alias-label-tertiary,#9ca3af);flex-shrink:0;font-size:12px}.nUhMVa_ovByTag{background:var(--dsw-alias-button-primary-fill,var(--dsw-alias-brand-primary,#4f6ef7));height:18px;color:var(--dsw-alias-label-primary-foreground,#fff);text-overflow:ellipsis;white-space:nowrap;border-radius:9px;flex-shrink:0;align-items:center;max-width:260px;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex;overflow:hidden}.nUhMVa_ovFrom{color:var(--dsw-alias-label-secondary,#6b7280);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:12px;overflow:hidden}.nUhMVa_orphRow{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;flex-wrap:wrap;align-items:center;gap:8px;min-width:0;padding:6px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_orphBadge{background:var(--dsw-alias-state-warn-primary,#b45309);height:18px;color:var(--dsw-alias-label-primary-foreground,#fff);white-space:nowrap;border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_dragHandle{width:20px;height:20px;color:var(--dsw-alias-label-tertiary,#9ca3af);cursor:grab;-webkit-user-select:none;user-select:none;flex-shrink:0;justify-content:center;align-items:center;font-size:12px;line-height:20px;display:inline-flex}.nUhMVa_dragOver{outline:2px dashed var(--dsw-alias-brand-primary,#4f6ef7);outline-offset:2px;background:var(--dsw-alias-bg-layer-2,#f0f2f8);border-radius:8px}.nUhMVa_dragging{opacity:.45;background:var(--dsw-alias-bg-layer-2,#f3f4f6)}.nUhMVa_collapseHead{font:inherit;color:var(--dsw-alias-label-primary,#1f2328);cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:8px;width:100%;padding:0;font-size:13px;font-weight:600;display:flex}.nUhMVa_collapseIcon{color:var(--dsw-alias-label-secondary,#6b7280);flex-shrink:0;display:inline-flex}.nUhMVa_collapseTitle{flex:1;min-width:0}.nUhMVa_collapseBody{border-top:1px solid var(--dsw-alias-border-l2,#f0f1f3);overflow-wrap:anywhere;flex-direction:column;gap:10px;min-width:0;margin-top:8px;padding-top:10px;display:flex}.nUhMVa_orderPanel{flex-direction:column;gap:10px;min-width:0;display:flex}.nUhMVa_panelNote{color:var(--dsw-alias-label-secondary,#6b7280);margin:0;font-size:12px;line-height:18px}.nUhMVa_panelActions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.nUhMVa_presetList{flex-direction:column;gap:6px;min-width:0;display:flex}.nUhMVa_presetRow{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;flex-direction:column;align-items:stretch;gap:6px;min-width:0;max-width:100%;padding:8px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_presetName{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;font-weight:600;overflow:hidden}.nUhMVa_snapList{flex-direction:column;gap:6px;min-width:0;display:flex}.nUhMVa_snapRow{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;flex-direction:column;align-items:stretch;gap:8px;padding:10px 12px;font-size:12px;line-height:18px;display:flex}.nUhMVa_snapMeta{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.nUhMVa_snapConfirmText{color:var(--dsw-alias-state-warn-primary,#b45309);margin:0;font-size:12px;line-height:18px}.nUhMVa_confirmRow{flex-wrap:wrap;align-items:center;gap:6px;display:inline-flex}.nUhMVa_fixFallback{flex-direction:column;gap:6px;margin:8px 0;display:flex}.nUhMVa_fixFallbackText,.nUhMVa_envEditor{box-sizing:border-box;width:100%;color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-bg-layer-2,#f3f4f6);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);resize:vertical;white-space:pre-wrap;word-break:break-all;border-radius:6px;padding:8px 10px;font-family:ui-monospace,Menlo,monospace;font-size:11px;line-height:16px}.nUhMVa_setCard{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-3,#fff);border-radius:12px;list-style:none;transition:border-color .16s,background .16s}.nUhMVa_setCard:hover{border-color:var(--dsw-alias-label-dimmed,#c8ccd4)}.nUhMVa_setCardOpen{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-color:var(--dsw-alias-label-dimmed,#c8ccd4)}.nUhMVa_setHeader{-webkit-appearance:none;appearance:none;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:12px;align-items:center;gap:12px;padding:14px 16px;display:flex}.nUhMVa_setHeader:focus-visible{outline:2px solid var(--dsw-alias-brand-primary,#4f6ef7);outline-offset:-2px}.nUhMVa_setHeadText{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.nUhMVa_setName{color:var(--dsw-alias-label-primary,#1f2328);font-size:15px;font-weight:600;line-height:1.4}.nUhMVa_setDesc{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:13px;line-height:1.5}.nUhMVa_setChevron{color:var(--dsw-alias-label-tertiary,#8b93a1);flex:none;transition:transform .16s;display:inline-flex}.nUhMVa_setChevronOpen{transform:rotate(180deg)}.nUhMVa_setBody{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb);margin:0 16px;padding-bottom:8px}.nUhMVa_setRow{align-items:center;gap:12px;padding:12px 0;display:flex}.nUhMVa_setRow+.nUhMVa_setRow{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb)}.nUhMVa_setLabelBox{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.nUhMVa_setLabel{font-size:13px;line-height:20px}.nUhMVa_setHint{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:12px;line-height:18px}.nUhMVa_setConfirm{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb);flex-direction:column;gap:8px;padding:12px 0 4px;display:flex}.nUhMVa_setCheck{cursor:pointer;align-items:center;gap:8px;font-size:12px;line-height:18px;display:flex}.nUhMVa_setActions{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb);justify-content:flex-end;align-items:center;gap:8px;padding:12px 0 4px;display:flex}.nUhMVa_setInlineActions{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:6px;display:flex}.nUhMVa_setProxyEditor{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb);flex-wrap:wrap;align-items:flex-end;gap:10px;padding:12px 0;display:flex}.nUhMVa_setProxyLabel{min-width:180px;color:var(--dsw-alias-label-secondary,#6b7280);flex-direction:column;flex:1;gap:5px;font-size:12px;line-height:18px;display:flex}.nUhMVa_setProxyInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,#d1d5db);background:var(--dsw-alias-bg-layer-3,#fff);width:100%;min-width:0;color:var(--dsw-alias-label-primary,#1f2328);font:inherit;border-radius:7px;padding:6px 8px;font-size:12px;line-height:18px}.nUhMVa_setProxyInput:focus{border-color:var(--dsw-alias-brand-primary,#4f6ef7);outline:2px solid color-mix(in srgb,var(--dsw-alias-brand-primary,#4f6ef7) 18%,transparent)}.nUhMVa_setDanger{color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_setSeg{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;flex-shrink:0;gap:2px;padding:2px;display:inline-flex}.nUhMVa_setSegBtn{font:inherit;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:3px 10px;font-size:12px;line-height:18px}.nUhMVa_setSegBtn:disabled{cursor:default;opacity:.5}.nUhMVa_setSegOn{background:var(--dsw-alias-bg-layer-2,#eef0f4);color:var(--dsw-alias-label-primary,#1f2328);font-weight:600}.nUhMVa_setBetaTag{background:var(--dsw-alias-bg-module-platform,#eef0f4);color:var(--dsw-alias-label-secondary,#6b7280);border-radius:9px;margin-left:6px;padding:0 6px;font-size:11px;font-weight:600;line-height:17px}.nUhMVa_commentsLink{cursor:pointer;white-space:nowrap;color:var(--dsw-alias-label-secondary,#9ca3af);background:0 0;border:0;padding:0;font-size:11px;line-height:16px}.nUhMVa_commentsLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_footActions{flex-shrink:0;align-items:center;gap:8px;display:inline-flex}.nUhMVa_favoriteBtn{cursor:pointer;color:var(--dsw-alias-label-secondary,#9ca3af);background:0 0;border:0;align-items:center;padding:0;display:inline-flex}.nUhMVa_favoriteBtn:hover,.nUhMVa_favoriteOn{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_commentsNote{color:var(--dsw-alias-label-secondary,#9ca3af);margin:0 0 8px;font-size:11px;line-height:16px}.nUhMVa_commentsGithubPrompt{border:1px solid color-mix(in srgb,var(--dsw-alias-brand-primary,#4f6ef7) 24%,transparent);background:color-mix(in srgb,var(--dsw-alias-brand-primary,#4f6ef7) 6%,transparent);border-radius:8px;margin:0 0 10px;padding:10px}.nUhMVa_commentsGithubHint{color:var(--dsw-alias-label-primary,#1f2328);margin:0 0 8px;font-size:12px;line-height:17px}.nUhMVa_commentsGithubAction{box-sizing:border-box;border:1px solid var(--dsw-alias-brand-primary,#4f6ef7);min-height:28px;color:var(--dsw-alias-brand-primary,#4f6ef7);border-radius:6px;justify-content:center;align-items:center;padding:5px 10px;font-size:12px;font-weight:600;line-height:16px;text-decoration:none;display:inline-flex}.nUhMVa_commentsGithubAction:hover{background:color-mix(in srgb,var(--dsw-alias-brand-primary,#4f6ef7) 9%,transparent)}.nUhMVa_commentsStatus{color:var(--dsw-alias-label-secondary,#9ca3af);margin:0;font-size:12px}.nUhMVa_commentsStatus:empty{display:none}.nUhMVa_commentsError{color:var(--dsw-alias-label-primary,#1f2328);margin:0 0 8px;font-size:12px}.nUhMVa_commentsFail{flex-direction:column;align-items:flex-start;gap:8px;padding:12px 0;display:flex}.nUhMVa_commentsMount{width:100%;min-height:240px;max-height:56vh;overflow:auto}.nUhMVa_commentsMount iframe{width:100%}.nUhMVa_notesLink{font:inherit;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;text-align:left;background:0 0;border:none;margin:2px 0 0;padding:0;font-size:12px;line-height:18px;display:block}.nUhMVa_notesLink:hover{color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_notesModalWide{width:min(640px,92vw);max-width:min(640px,92vw)}.nUhMVa_notesBody{overscroll-behavior:contain;flex-direction:column;flex:0 auto;gap:10px;min-width:0;max-height:min(60vh,520px);padding:0 2px 8px 0;display:flex;overflow-y:auto}.nUhMVa_notesRange{align-items:center;gap:8px;margin-bottom:4px;font-size:12px;line-height:18px;display:flex}.nUhMVa_notesArrow{color:var(--dsw-alias-label-tertiary,#8b93a1)}.nUhMVa_notesMeta{letter-spacing:.02em;text-transform:uppercase;color:var(--dsw-alias-label-secondary,#6b7280);flex-wrap:wrap;align-items:baseline;gap:6px;margin-top:4px;font-size:12px;line-height:18px;display:flex}.nUhMVa_notesBody>.nUhMVa_notesMeta:first-child{margin-top:0}.nUhMVa_notesPre{white-space:pre-wrap;word-break:break-word;background:var(--dsw-alias-bg-layer-2,#eef0f4);border-radius:8px;max-height:40vh;margin:0;padding:10px 12px;font-size:13px;line-height:20px;overflow:auto}.nUhMVa_notesRendered{flex-direction:column;gap:8px;min-width:0;display:flex}.nUhMVa_notesImg{border-radius:6px;max-width:100%;height:auto;margin:4px 0;display:block}.nUhMVa_notesH{margin-top:4px;font-size:13px;font-weight:650;line-height:20px}.nUhMVa_notesP{font-size:13px;line-height:20px}.nUhMVa_notesQuote{border-left:3px solid var(--dsw-alias-border-l3,#d9dde3);background:var(--dsw-alias-bg-layer-2,#f7f8fa);color:var(--dsw-alias-label-primary,#1f2328);border-radius:0 6px 6px 0;margin:0;padding:8px 10px;font-size:13px;line-height:20px}.nUhMVa_notesFence{background:var(--dsw-alias-bg-layer-2,#eef0f4);font-family:var(--dsw-alias-font-mono,ui-monospace,Menlo,monospace);white-space:pre;border-radius:8px;margin:0;padding:10px 12px;font-size:12px;line-height:18px;overflow-x:auto}.nUhMVa_notesFence code{font:inherit;background:0 0;padding:0}.nUhMVa_notesBullets{flex-direction:column;gap:4px;margin:0;padding-left:18px;font-size:13px;line-height:20px;display:flex}.nUhMVa_notesA{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:none}.nUhMVa_notesA:hover{text-decoration:underline}.nUhMVa_notesCode{font-family:var(--dsw-alias-font-mono,ui-monospace,monospace);background:var(--dsw-alias-bg-layer-2,#eef0f4);border-radius:5px;padding:1px 5px;font-size:12px}.nUhMVa_notesList{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.nUhMVa_notesRow{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);align-items:baseline;gap:12px;padding:6px 0;display:flex}.nUhMVa_notesRow:last-child{border-bottom:none}.nUhMVa_notesDate{color:var(--dsw-alias-label-tertiary,#8b93a1);font-variant-numeric:tabular-nums;flex-shrink:0;font-size:12px}.nUhMVa_notesMsg{word-break:break-word;word-break:break-word;-webkit-line-clamp:3;-webkit-box-orient:vertical;min-width:0;font-size:13px;line-height:20px;display:-webkit-box;overflow:hidden}.nUhMVa_notesSha{color:var(--dsw-alias-label-secondary,#6b7280);font-variant-numeric:tabular-nums;flex-shrink:0;margin-left:auto;font-size:12px;text-decoration:none}.nUhMVa_recoverySummary{color:var(--dsw-alias-state-error-primary,#dc2626);word-break:break-word;align-items:flex-start;gap:8px;margin-bottom:8px;font-size:12px;display:flex}.nUhMVa_recoveryHint{color:var(--dsw-alias-label-secondary,#6b7280);margin:8px 0;font-size:12px}.nUhMVa_recoveryList{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;flex-direction:column;max-height:320px;display:flex;overflow-x:hidden;overflow-y:auto}.nUhMVa_recoveryRow{border-top:1px solid var(--dsw-alias-border-l2,#eef0f4);align-items:flex-start;gap:8px;padding:6px 10px;font-size:12px;display:flex}.nUhMVa_recoveryRow:first-child{border-top:none}.nUhMVa_recoveryBlamed{box-shadow:inset 3px 0 0 var(--dsw-alias-state-error-primary,#dc2626);background:#dc262612}.nUhMVa_recoveryMuted{opacity:.6}.nUhMVa_recoveryName{word-break:break-word;flex-direction:column;gap:2px;min-width:0;display:flex}.nUhMVa_recoveryReason{color:var(--dsw-alias-state-error-primary,#dc2626);word-break:break-word;font-size:11px}.nUhMVa_recoveryNote{color:var(--dsw-alias-label-tertiary,#8b93a1);word-break:break-word;margin-top:8px;font-size:11px}.nUhMVa_recoveryBadge{background:var(--dsw-alias-bg-layer-2,#eef0f4);color:var(--dsw-alias-label-secondary,#6b7280);border-radius:5px;margin-left:6px;padding:0 5px;font-size:10px}.nUhMVa_recoveryLog{color:var(--dsw-alias-label-secondary,#6b7280);margin:4px 0 8px;font-size:11px}.nUhMVa_recoveryLog pre{white-space:pre-wrap;word-break:break-word;max-height:180px;margin:6px 0 0;overflow:auto}.nUhMVa_notesSha:hover{color:var(--dsw-alias-label-primary,#1f2328);text-decoration:underline}.nUhMVa_notesVer{color:inherit;font-weight:600;text-decoration:none}.nUhMVa_notesVer:hover{text-decoration:underline}.nUhMVa_migrationSources{flex-direction:column;gap:8px;margin-top:4px;display:flex}.nUhMVa_migrationSource{border:1px solid var(--dsw-alias-border-default,#e5e7eb);border-radius:8px;flex-direction:column;gap:4px;padding:10px 12px;display:flex}.nUhMVa_migrationSource code{overflow-wrap:anywhere;font-family:ui-monospace,Menlo,monospace;font-size:12px}.nUhMVa_migrationLabel{color:var(--dsw-alias-label-secondary,#9ca3af);font-size:11px}.nUhMVa_migrationArrow{text-align:center;color:var(--dsw-alias-label-secondary,#9ca3af)}.nUhMVa_migrationWarning{color:var(--dsw-alias-state-warn-primary,#b45309);align-items:flex-start;gap:6px;margin:12px 0 0;font-size:12px;line-height:18px;display:flex}";
|
|
2740
2755
|
const tagId = "dshmarket/Market.module.css";
|
|
2741
2756
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
2742
2757
|
const tag = document.createElement("style");
|
|
@@ -2771,9 +2786,10 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
2771
2786
|
"brokenPluginNotice": "nUhMVa_brokenPluginNotice",
|
|
2772
2787
|
"brokenPluginText": "nUhMVa_brokenPluginText",
|
|
2773
2788
|
"byline": "nUhMVa_byline",
|
|
2789
|
+
"capCaveat": "nUhMVa_capCaveat",
|
|
2774
2790
|
"capChip": "nUhMVa_capChip",
|
|
2791
|
+
"capFact": "nUhMVa_capFact",
|
|
2775
2792
|
"capMuted": "nUhMVa_capMuted",
|
|
2776
|
-
"capRed": "nUhMVa_capRed",
|
|
2777
2793
|
"caps": "nUhMVa_caps",
|
|
2778
2794
|
"capsTitle": "nUhMVa_capsTitle",
|
|
2779
2795
|
"card": "nUhMVa_card",
|
|
@@ -3484,6 +3500,31 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
3484
3500
|
});
|
|
3485
3501
|
}
|
|
3486
3502
|
//#endregion
|
|
3503
|
+
//#region src/client/download-stats.ts
|
|
3504
|
+
/** Date-only values stay date-only; never derive a window from today's date. */
|
|
3505
|
+
function dateOnly(value) {
|
|
3506
|
+
if (typeof value !== "string" || !/^\d{4}-\d{2}-\d{2}$/.test(value)) return false;
|
|
3507
|
+
const parsed = new Date(value);
|
|
3508
|
+
return Number.isFinite(parsed.getTime()) && parsed.toISOString().slice(0, 10) === value;
|
|
3509
|
+
}
|
|
3510
|
+
function checkedAt(value) {
|
|
3511
|
+
if (dateOnly(value)) return true;
|
|
3512
|
+
if (typeof value !== "string" || !/^\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}(?:\.\d{1,3})?Z$/.test(value)) return false;
|
|
3513
|
+
return dateOnly(value.slice(0, 10)) && Number.isFinite(Date.parse(value));
|
|
3514
|
+
}
|
|
3515
|
+
/** All text comes from this entry's source metadata, not registry.updated. */
|
|
3516
|
+
function downloadStatsText(plugin, t) {
|
|
3517
|
+
const count = plugin.downloads;
|
|
3518
|
+
if (typeof count !== "number" || !Number.isSafeInteger(count) || count < 0) return null;
|
|
3519
|
+
const window = dateOnly(plugin.downloadsStart) && dateOnly(plugin.downloadsEnd) && plugin.downloadsStart <= plugin.downloadsEnd ? t("downloadsWindow").replace("{0}", plugin.downloadsStart).replace("{1}", plugin.downloadsEnd) : t("downloadsWindowUnknown");
|
|
3520
|
+
const checked = checkedAt(plugin.downloadsCheckedAt) ? t("downloadsChecked").replace("{0}", plugin.downloadsCheckedAt) : t("downloadsCheckedUnknown");
|
|
3521
|
+
return [
|
|
3522
|
+
t("downloadsMeaning").replace("{0}", String(count)),
|
|
3523
|
+
window,
|
|
3524
|
+
checked
|
|
3525
|
+
].join(" ");
|
|
3526
|
+
}
|
|
3527
|
+
//#endregion
|
|
3487
3528
|
//#region src/client/operations.ts
|
|
3488
3529
|
const BUCKETS = {
|
|
3489
3530
|
queued: "busy",
|
|
@@ -7051,10 +7092,22 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
7051
7092
|
})
|
|
7052
7093
|
});
|
|
7053
7094
|
}
|
|
7054
|
-
/**
|
|
7055
|
-
|
|
7056
|
-
|
|
7057
|
-
|
|
7095
|
+
/** A compact rolling-period label, with source metadata on hover or focus. */
|
|
7096
|
+
function DownloadCount({ plugin, t }) {
|
|
7097
|
+
const tip = downloadStatsText(plugin, t);
|
|
7098
|
+
if (tip === null) return null;
|
|
7099
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
|
|
7100
|
+
label: tip,
|
|
7101
|
+
side: "top",
|
|
7102
|
+
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
7103
|
+
className: Market_module_css_default.star,
|
|
7104
|
+
tabIndex: 0,
|
|
7105
|
+
"aria-label": tip,
|
|
7106
|
+
children: "· ↓ " + formatCount(plugin.downloads) + " / " + t("downloadsPeriod")
|
|
7107
|
+
})
|
|
7108
|
+
});
|
|
7109
|
+
}
|
|
7110
|
+
/** Catalog npm latest, omitted for github-only and not-yet-backfilled rows. */
|
|
7058
7111
|
function CatalogVersionMark({ version, tip }) {
|
|
7059
7112
|
if (typeof version !== "string" || version.length === 0) return null;
|
|
7060
7113
|
const label = /^v/i.test(version) ? version : `v${version}`;
|
|
@@ -7715,6 +7768,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
7715
7768
|
const [presetOpen, setPresetOpen] = (0, react.useState)(false);
|
|
7716
7769
|
/** Install-command disclosure inside the confirm dialog. */
|
|
7717
7770
|
const [cmdOpen, setCmdOpen] = (0, react.useState)(false);
|
|
7771
|
+
const [capsOpen, setCapsOpen] = (0, react.useState)(false);
|
|
7718
7772
|
/** Per-row "why is it not live" disclosure (installed tab). */
|
|
7719
7773
|
const [whyOpen, setWhyOpen] = (0, react.useState)(null);
|
|
7720
7774
|
/** Restore-confirm dialog (replaces window.confirm). */
|
|
@@ -9692,65 +9746,103 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
9692
9746
|
return label === key ? name : label;
|
|
9693
9747
|
};
|
|
9694
9748
|
/**
|
|
9695
|
-
* The scanner's red-line sentences,
|
|
9749
|
+
* The scanner's red-line sentences, in the reader's language.
|
|
9696
9750
|
*
|
|
9697
|
-
*
|
|
9698
|
-
*
|
|
9699
|
-
*
|
|
9751
|
+
* The scanner emits a fixed set of shapes — one per rule family — and every
|
|
9752
|
+
* one of them is translated here. A sentence from a family this build does
|
|
9753
|
+
* not know stays in the scanner's own words on purpose: a mistranslation of
|
|
9754
|
+
* a security fact is worse than a foreign word, and this is the one line on
|
|
9755
|
+
* the card a reader must not misread. The shapes are matched by their stable
|
|
9756
|
+
* prefix rather than in full, so the parenthesised detail the scanner
|
|
9757
|
+
* attaches can change without falling back to English.
|
|
9700
9758
|
*/
|
|
9701
9759
|
const redLineLabel = (line) => {
|
|
9702
9760
|
if (line === "reads credentials/secrets AND has network access") return t("capRedCredentialsNetwork");
|
|
9703
9761
|
const plaintext = /^uses plaintext http:\/\/ to (.+)$/.exec(line);
|
|
9704
9762
|
if (plaintext !== null) return t("capRedPlaintextHttp").replace("{0}", plaintext[1]);
|
|
9763
|
+
const literalIp = /^uses literal IP (.+) for network access$/.exec(line);
|
|
9764
|
+
if (literalIp !== null) return t("capRedLiteralIp").replace("{0}", literalIp[1]);
|
|
9765
|
+
const installScript = /^runs code at install time(?: \((.+)\))?$/.exec(line);
|
|
9766
|
+
if (installScript !== null) return installScript[1] === void 0 ? t("capRedInstallScript") : t("capRedInstallScriptScripts").replace("{0}", installScript[1]);
|
|
9767
|
+
const coreTamper = /^tampers with a core bundle(?: \((.+)\))?$/.exec(line);
|
|
9768
|
+
if (coreTamper !== null) return coreTamper[1] === void 0 ? t("capRedCoreTamper") : t("capRedCoreTamperDetail").replace("{0}", coreTamper[1]);
|
|
9705
9769
|
return line;
|
|
9706
9770
|
};
|
|
9707
9771
|
/**
|
|
9708
|
-
*
|
|
9709
|
-
*
|
|
9710
|
-
*
|
|
9711
|
-
*
|
|
9772
|
+
* Whether a red line is one a reader has to weigh BEFORE installing, rather
|
|
9773
|
+
* than a fact about what the plugin does once it runs.
|
|
9774
|
+
*
|
|
9775
|
+
* Two families qualify, for one reason: they happen at install time. There is
|
|
9776
|
+
* no "afterwards" to inspect, so this is the last moment the decision can be
|
|
9777
|
+
* made. The other families — credentials+network above all, 73% of every red
|
|
9778
|
+
* line the catalog holds — describe what plugins normally do, and calling
|
|
9779
|
+
* that urgent is how a warning gets trained away.
|
|
9712
9780
|
*/
|
|
9713
|
-
const
|
|
9714
|
-
|
|
9715
|
-
|
|
9716
|
-
|
|
9717
|
-
|
|
9718
|
-
|
|
9719
|
-
|
|
9720
|
-
|
|
9721
|
-
|
|
9781
|
+
const redLineIsUrgent = (line) => line.startsWith("runs code at install time") || line.startsWith("tampers with a core bundle");
|
|
9782
|
+
/**
|
|
9783
|
+
* What the static scan found (#401), in the detail dialog and nowhere else.
|
|
9784
|
+
*
|
|
9785
|
+
* It used to sit on both cards. It does not any more, for three reasons that
|
|
9786
|
+
* all pointed the same way: a capability list does not help anyone choose a
|
|
9787
|
+
* plugin, most of it cannot be acted on, and — the one that decided it — a
|
|
9788
|
+
* line every card carries is a line nobody reads, including the install-time
|
|
9789
|
+
* script that IS worth stopping for. So the card says nothing about this, the
|
|
9790
|
+
* dialog leads with the one thing that needs a decision before you press
|
|
9791
|
+
* install, and the rest of the facts are one click away.
|
|
9792
|
+
*
|
|
9793
|
+
* Which lines count as that one thing is `redLineIsUrgent`, not a guess made
|
|
9794
|
+
* here: a rare rule that fires at install time, never a description of what
|
|
9795
|
+
* plugins normally do.
|
|
9796
|
+
*/
|
|
9797
|
+
const capabilityDetail = (p) => {
|
|
9798
|
+
const redLines = p.capabilityRedLines ?? [];
|
|
9799
|
+
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [redLines.filter(redLineIsUrgent).map((line) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
|
|
9800
|
+
className: Market_module_css_default.warnLine,
|
|
9801
|
+
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconWarningOutline16, {
|
|
9802
|
+
size: 14,
|
|
9803
|
+
className: Market_module_css_default.bannerIcon
|
|
9804
|
+
}), " " + redLineLabel(line)]
|
|
9805
|
+
}, line)), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
|
|
9806
|
+
icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconQuestionOutline14, { size: 16 }),
|
|
9807
|
+
title: t("capabilityTitle"),
|
|
9808
|
+
open: capsOpen,
|
|
9809
|
+
expandable: true,
|
|
9810
|
+
expandOnRowClick: true,
|
|
9811
|
+
onToggle: () => setCapsOpen((o) => !o),
|
|
9812
|
+
children: [
|
|
9813
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
9814
|
+
className: Market_module_css_default.caps,
|
|
9815
|
+
children: [p.capabilities === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
9816
|
+
className: Market_module_css_default.capMuted,
|
|
9817
|
+
"data-state": "unchecked",
|
|
9818
|
+
children: t("capabilityUnchecked")
|
|
9819
|
+
}) : p.capabilities.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
9820
|
+
className: Market_module_css_default.capMuted,
|
|
9821
|
+
"data-state": "none",
|
|
9822
|
+
children: t("capabilityNone")
|
|
9823
|
+
}) : p.capabilities.map((name) => HostTag !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(HostTag, {
|
|
9824
|
+
tone: "outline",
|
|
9825
|
+
className: Market_module_css_default.capChip,
|
|
9826
|
+
children: capabilityLabel(name)
|
|
9827
|
+
}, name) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
9828
|
+
className: Market_module_css_default.capChip,
|
|
9829
|
+
children: capabilityLabel(name)
|
|
9830
|
+
}, name)), redLines.filter((line) => !redLineIsUrgent(line)).map((line) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
9831
|
+
className: Market_module_css_default.capFact,
|
|
9832
|
+
children: redLineLabel(line)
|
|
9833
|
+
}, line))]
|
|
9834
|
+
}),
|
|
9835
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
9836
|
+
className: Market_module_css_default.capCaveat,
|
|
9837
|
+
children: t("capabilityNote")
|
|
9838
|
+
}),
|
|
9839
|
+
typeof p.capabilityCheckedAt === "string" && p.capabilityCheckedAt.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
|
|
9840
|
+
className: Market_module_css_default.capCaveat,
|
|
9841
|
+
children: t("capabilityScannedAt").replace("{0}", p.capabilityCheckedAt.slice(0, 10))
|
|
9722
9842
|
})
|
|
9723
|
-
|
|
9724
|
-
|
|
9725
|
-
|
|
9726
|
-
children: t("capabilityRedLine").replace("{0}", redLineLabel(line))
|
|
9727
|
-
}, line)),
|
|
9728
|
-
p.capabilities === void 0 ? HostTag !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(HostTag, {
|
|
9729
|
-
tone: "quiet",
|
|
9730
|
-
"data-state": "unchecked",
|
|
9731
|
-
children: t("capabilityUnchecked")
|
|
9732
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
9733
|
-
className: Market_module_css_default.capMuted,
|
|
9734
|
-
"data-state": "unchecked",
|
|
9735
|
-
children: t("capabilityUnchecked")
|
|
9736
|
-
}) : p.capabilities.length === 0 ? HostTag !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(HostTag, {
|
|
9737
|
-
tone: "quiet",
|
|
9738
|
-
"data-state": "none",
|
|
9739
|
-
children: t("capabilityNone")
|
|
9740
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
9741
|
-
className: Market_module_css_default.capMuted,
|
|
9742
|
-
"data-state": "none",
|
|
9743
|
-
children: t("capabilityNone")
|
|
9744
|
-
}) : p.capabilities.map((name) => HostTag !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(HostTag, {
|
|
9745
|
-
tone: "outline",
|
|
9746
|
-
className: Market_module_css_default.capChip,
|
|
9747
|
-
children: capabilityLabel(name)
|
|
9748
|
-
}, name) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
9749
|
-
className: Market_module_css_default.capChip,
|
|
9750
|
-
children: capabilityLabel(name)
|
|
9751
|
-
}, name))
|
|
9752
|
-
]
|
|
9753
|
-
});
|
|
9843
|
+
]
|
|
9844
|
+
})] });
|
|
9845
|
+
};
|
|
9754
9846
|
/**
|
|
9755
9847
|
* The enable/disable control, wherever it appears — the installed row, a
|
|
9756
9848
|
* group member row, the plugin detail view. One helper because they were
|
|
@@ -9845,13 +9937,9 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
9845
9937
|
version: p.version,
|
|
9846
9938
|
tip: catalogVersionTip
|
|
9847
9939
|
}),
|
|
9848
|
-
|
|
9849
|
-
|
|
9850
|
-
|
|
9851
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
9852
|
-
className: Market_module_css_default.star,
|
|
9853
|
-
children: "· ↓ " + formatCount(p.downloads)
|
|
9854
|
-
})
|
|
9940
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(DownloadCount, {
|
|
9941
|
+
plugin: p,
|
|
9942
|
+
t
|
|
9855
9943
|
}),
|
|
9856
9944
|
typeof p.stars === "number" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
|
|
9857
9945
|
label: String(p.stars),
|
|
@@ -9921,7 +10009,6 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
9921
10009
|
})]
|
|
9922
10010
|
})
|
|
9923
10011
|
}),
|
|
9924
|
-
capabilityRow(p),
|
|
9925
10012
|
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
9926
10013
|
className: Market_module_css_default.foot,
|
|
9927
10014
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
@@ -10029,13 +10116,9 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
10029
10116
|
version: p.version,
|
|
10030
10117
|
tip: catalogVersionTip
|
|
10031
10118
|
}),
|
|
10032
|
-
|
|
10033
|
-
|
|
10034
|
-
|
|
10035
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
10036
|
-
className: Market_module_css_default.star,
|
|
10037
|
-
children: "· ↓ " + formatCount(p.downloads)
|
|
10038
|
-
})
|
|
10119
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(DownloadCount, {
|
|
10120
|
+
plugin: p,
|
|
10121
|
+
t
|
|
10039
10122
|
}),
|
|
10040
10123
|
typeof p.stars === "number" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
|
|
10041
10124
|
label: String(p.stars),
|
|
@@ -10067,7 +10150,6 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
10067
10150
|
title: desc,
|
|
10068
10151
|
children: desc
|
|
10069
10152
|
}),
|
|
10070
|
-
capabilityRow(p),
|
|
10071
10153
|
p.deprecated === true && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
10072
10154
|
className: Market_module_css_default.deprecate,
|
|
10073
10155
|
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
@@ -12205,13 +12287,9 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
12205
12287
|
version: confirming.version,
|
|
12206
12288
|
tip: catalogVersionTip
|
|
12207
12289
|
}),
|
|
12208
|
-
|
|
12209
|
-
|
|
12210
|
-
|
|
12211
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
12212
|
-
className: Market_module_css_default.star,
|
|
12213
|
-
children: "· ↓ " + formatCount(confirming.downloads)
|
|
12214
|
-
})
|
|
12290
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(DownloadCount, {
|
|
12291
|
+
plugin: confirming,
|
|
12292
|
+
t
|
|
12215
12293
|
}),
|
|
12216
12294
|
typeof confirming.stars === "number" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
|
|
12217
12295
|
label: String(confirming.stars),
|
|
@@ -12232,6 +12310,10 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
12232
12310
|
className: Market_module_css_default.metaInline,
|
|
12233
12311
|
children: t("published") + " " + confirming.added
|
|
12234
12312
|
}),
|
|
12313
|
+
downloadStatsText(confirming, t) !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
12314
|
+
className: Market_module_css_default.metaInline,
|
|
12315
|
+
children: downloadStatsText(confirming, t)
|
|
12316
|
+
}),
|
|
12235
12317
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(CardDesc, {
|
|
12236
12318
|
text: confirming.description && (confirming.description[lang] || confirming.description.en) || "",
|
|
12237
12319
|
t
|
|
@@ -12240,6 +12322,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
12240
12322
|
plugin: confirming,
|
|
12241
12323
|
onOpen: openLightbox
|
|
12242
12324
|
}),
|
|
12325
|
+
capabilityDetail(confirming),
|
|
12243
12326
|
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
|
|
12244
12327
|
icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCodeOutline16, { size: 16 }),
|
|
12245
12328
|
title: t("cmdDetails"),
|
|
@@ -13564,6 +13647,20 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
13564
13647
|
sectionGate.retire();
|
|
13565
13648
|
}
|
|
13566
13649
|
})));
|
|
13650
|
+
const pluginsTabCtx = ctx;
|
|
13651
|
+
pluginsTabCtx.slots.inject("settings.plugins.tab", () => pluginsTabCtx.slots.register({
|
|
13652
|
+
name: "settings.plugins.tab",
|
|
13653
|
+
id: NS,
|
|
13654
|
+
order: 60,
|
|
13655
|
+
label: () => t("nav"),
|
|
13656
|
+
locale: NS,
|
|
13657
|
+
inject: () => ({ t })
|
|
13658
|
+
}, () => (0, react.createElement)(SettingsCard, {
|
|
13659
|
+
t,
|
|
13660
|
+
onRemoved: () => {
|
|
13661
|
+
sectionGate.retire();
|
|
13662
|
+
}
|
|
13663
|
+
})));
|
|
13567
13664
|
const Toast = () => (0, react.createElement)(InstallToast, { t });
|
|
13568
13665
|
ctx.slots.inject("shell.overlay", () => ctx.slots.register({
|
|
13569
13666
|
name: "shell.overlay",
|