dshmarket 1.65.4 → 1.66.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/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: "会进入市场启动的每一个子进程(安装、编译、git 等),不只是编译器。每行一个 KEY=value,例如 CC=/usr/bin/gcc-11;PATH 和 CI 由市场接管。留空并保存即恢复 profile 配置。",
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: "将删除:市场的停用清单与自定义分组,以及市场写进 profile 补丁文件的停用行——被市场停用的插件将恢复运行。不涉及密码或令牌,市场从不把它们存在磁盘上。",
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
- capabilityMore: "+{0}",
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
- capabilityShowAll: "展开全部",
270
- capRedCredentialsNetwork: "同时读凭据并联网",
271
- capRedPlaintextHttp: "用明文 http:// 连接 {0}",
272
- capabilityHideAll: "收起",
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 进程正在被调试器附着。请从 IDE 或终端停止该进程后重新启动,市场不能从 UI 里杀掉正在调试的宿主。",
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: "有 agent 正在运行,请等待其完成或将其取消后再更新——更新会直接替换插件文件,运行中的 agent 可能中途报错或新旧版本混用。",
318
- agentBusyInstall: "有 agent 正在运行,请等待其完成或将其取消后再安装——安装会修改插件文件,运行中的 agent 可能中途报错。",
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: "确认换用 npm",
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} 声明它需要 DSH {requirement},而你现在运行的是 {host}。装上去多半会直接报错,只能手动装回旧版。\n已经停下了,插件还是原来的版本。\n如果你确定这个版本号不准(例如桌面端捆绑的 DSH 不报告版本),也可以继续更新。",
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} 声明它需要 DSH {requirement},而你现在运行的是 {host}。装上去多半会直接报错。\n已停止,没有安装任何东西。\n如果你确定这个版本号不准(例如桌面端捆绑的 DSH 不报告版本),也可以继续安装。",
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: "市场没能正常显示,但你的插件都没有受影响,什么都没有被改动。\n点「重新加载」通常就能恢复;如果反复出现,请导出日志发到 issue 里——日志里会带上这次出错的具体位置。\n另外:如果你开了浏览器的网页翻译,请关掉它再试一次,那是已知会让界面出错的一个原因。",
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: "在这里登录 GitHub 会离开本页,返回后需要重新打开 dsh web——这不是故障。请直接到 GitHub 上登录和发表评论,本页继续用来阅读。",
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 不接受包含重复条目 id 的插件树,保留该插件将导致 DeepSeek Harness 下次启动失败。",
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: "自动配置失败。请使用「导出日志」,并将文件附在 issue 中",
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: "适配当前 DSH {0}",
470
+ hostCompatible: "兼容当前 DSH {0}",
469
471
  hostDetecting: "正在识别宿主版本…",
470
472
  hostUnknown: "宿主版本未知",
471
473
  hostFilterLoading: "正在检查宿主要求 {0}/{1};未声明或无法确认的插件仍会显示",
472
- hostFilterActive: "正在筛选适配 DSH {0} 的插件;未声明或无法确认的插件仍会显示",
474
+ hostFilterActive: "已按 DSH {0} 筛选;未声明或无法确认兼容性的插件仍会显示",
473
475
  hostRequirement: "DSH {0}",
474
476
  hostRequirementLoading: "正在读取宿主要求…",
475
477
  hostRequirementUndeclared: "未声明宿主要求",
476
478
  hostRequirementUnavailable: "宿主要求未知",
477
- sortDownloads: "npm 下载量(近 30 天)",
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: "目录数据({0} 刷新)里记录的 npm 版本;在那之后发布的版本要等下一次目录刷新才会出现",
481
- catalogVersionUndated: "目录数据里记录的 npm 版本;目录每日刷新,所以可能滞后于 npm 上的实际 latest",
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: "装好了,但不是最新的:这个 profile 的 minimumReleaseAge 把 {0} 按住了,装的是 {1}。",
502
- heldReleaseAction: "装 {0}(不等)",
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 配置,不包含 node_modules;恢复会按清单重新安装插件。",
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 声明了这些 bundle,但它们没有安装。请重新安装,或从 profile 的 package.json 的 dsh.profile.bundles 中删除:",
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: "首次安装需要下载与解析依赖,大型插件可能需要 1-3 分钟",
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: "更新被运行中的 DSH 挡住了,而更新前的版本也已经损坏。市场把它从 profile 里移除,是为了让下一次启动不卡在组装这一步。插件目录还在原处,退出 DSH 之后重新安装它即可。",
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: "没有发现残缺的包目录或 pnpm 临时目录。",
713
- checkResidualsHint: "这些目录没有任何声明引用它们,也不妨碍启动;它们是更新被打断时留下的。退出 DSH 之后可以删除,或直接重新安装对应的插件。",
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: "静态组合校验未通过:{0}",
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 本机实例(即:诊断出的这套组合,就是你现在运行中的组合)?判断依据:当前工作目录 / $DSH_HOME / 进程命令行是否指向该 profile,或你是否运行在 deepseek-harness 进程内。若无法确定,一律按【是你】处理(更安全)。",
754
- aiFixIfSelf: "【是 → 你就是这个 harness】严禁原地改动组合、harness 或核心包:不修改 cordis.patch.yml、不调整 bundle 顺序或启停、不安装/卸载/升级插件、不重新安装依赖、不升级或重启 dsh。三步:① 先只读分析,不改任何东西;② 给出 apply.sh/.bat(本次修复的改动)与 rollback.sh/.bat(完整撤销 apply);两者都幂等——apply 仅在无已有快照时才创建快照(否则不覆盖;已存在说明 apply 跑过,先回滚或确认再重跑),rollback 从这份快照恢复,因此 apply 跑到一半失败也能回滚、重复回滚也安全;③ 由我在外部终端执行 apply,并将 stdout/stderr 回贴给你判断。每步先说明理由、等我确认;绝不自行执行。",
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: "把当前的 bundle 顺序与停用列表保存为组合,随时切换;应用前会做试启动校验并自动创建快照。",
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} 个 bundle",
790
+ presetBundleCount: "{0} 个插件",
783
791
  presetPreview: "预览",
784
792
  presetPreviewTitle: "应用此组合将:",
785
- presetReorder: "重排 {0} 个 bundle 的位置",
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: "回滚会用快照覆盖当前 profile 的 package.json 与配置,且不可撤销(可先创建新快照再回滚)。",
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: "插件在 dependencies 中声明了已知的 DSH 共享宿主包,可能遮蔽宿主版本(仅依据清单,未确认运行时重复):",
813
- hostDependencyMore: "另有 {0} 条,已省略",
820
+ hostDependencyWarning: "插件把 DSH 自带的公共包列进了依赖,可能和 DSH 自己的版本互相干扰(仅依据声明,未确认):",
821
+ hostDependencyMore: "另有 {0} 项已省略",
814
822
  recoveryTitle: "启动失败——调整插件",
815
- recoveryLead: "这次重启没能起来,dsh 已经退出。勾选你希望下次启动时启用的插件;本次启动报错的插件已标红并取消勾选。",
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 host; update it from the desktop app.",
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 frontend updates at once, the server does not.",
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 starts — installs, builds, git — not only 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 profile config.",
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, and the disable rows it wrote into the profile patch file — plugins the market switched off start running again. No passwords or tokens are involved; the market never stores those on disk.",
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 touches",
900
+ capabilityTitle: "What it does",
893
901
  capShell: "runs commands",
894
- capFsRead: "reads files",
895
- capFsWrite: "writes files",
896
- capNetwork: "network",
897
- capCredentials: "reads credentials",
898
- capEnv: "reads env",
899
- capLlm: "calls a model",
900
- capSubagent: "spawns subagents",
901
- capDynamicCode: "dynamic code",
902
- capHostRuntime: "host runtime",
903
- capInstallScript: "install script",
904
- capabilityNone: "not detected",
905
- capabilityUnchecked: "not checked",
906
- capabilityMore: "+{0}",
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
- capabilityShowAll: "Show all",
911
- capRedCredentialsNetwork: "reads credentials and has network access",
912
- capRedPlaintextHttp: "uses plaintext http:// to {0}",
913
- capabilityHideAll: "Show less",
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. Bookmark plugins in Discover or Themes to save them here.",
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 &lt;your unit&gt;. 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 kill a debug-attached host from the UI.",
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 this source; build scripts are blocked by default.",
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 operation is already running — please wait for it to finish (one install/update/uninstall at a time)",
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 (remove it in Tasks, top right).",
961
- agentBusyUpdateQueued: "Agent is busy — queued and will update automatically when idle (remove it in Tasks, top right).",
962
- agentBusyUninstallQueued: "Agent is busy — queued and will uninstall automatically when idle (remove it in Tasks, top right).",
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. Your favorite change is queued — try again in a moment.",
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: "This operation left one plugin name defined in two layers; only one will load after a restart:",
972
- brokenBundleBanner: "These plugins now have a client bundle that will not parse; the page may come up blank after a refresh — rolling back is recommended:",
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 host; the market only reports it",
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 (could not be aligned with your installed version — for reference only)",
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 installation source, not just its version.",
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 maintained by a different publisher. Continue only if you trust this catalog mapping.",
1004
- migrateContinue: "Confirm npm source",
1005
- migrateFail: "Source migration failed",
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 will uninstall the local version, reinstall the catalog version, and keep update checks. This cannot be undone — please confirm again.",
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 say which repository it came from, so the market could only match it by package name. The catalog entry below is what that found — it may be a different author's plugin that happens to share the name, not the source of your copy. Check the owner and repository below before confirming. This uninstalls the local version and installs that one, and cannot be undone.",
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: "Something went wrong rendering the market. Your plugins are unaffected and nothing was changed.\nReload usually recovers it. If it keeps happening, export the log and attach it to an issue — it now carries where this crash happened.\nAlso worth trying: if your browser is translating this page, turn that off and reload. It is a known cause.",
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 would leave this page, and coming back needs the dsh web link again — nothing is broken. Sign in and post on GitHub; keep reading 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 the installed plugin",
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 refuses a plugin tree that contains duplicate entry ids; keeping this plugin would stop DeepSeek Harness from starting.",
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. The plugins below were uninstalled and not restored — please check them:",
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 — export the log and attach it to your issue",
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: "Less",
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: "Filtering for DSH {0}; undeclared or unavailable plugins remain visible",
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 is holding {0} back, so {1} is what got installed.",
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 for this boot",
1145
- ignoreAllUpdateNotices: "Ignore all for this boot",
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, never node_modules. Restore reinstalls plugins from the list.",
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 credentials stay in this browser only.",
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); unchecking any exports only the selected plugins, with an optional “include config” flag.",
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: "points at an absolute path from another machine that does not exist here — repoint it locally or reinstall the plugin",
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 bundles but they are not installed. Reinstall them, or remove them from dsh.profile.bundles in the profile package.json:",
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 resolve dependencies — large plugins can take 1-3 minutes",
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 of {0}",
1241
+ stateDependencyLibrary: "Library for {0}",
1227
1242
  stateBroken: "Installed, verification failed",
1228
1243
  stateDisabled: "Disabled",
1229
- phaseResolving: "Resolving dependencies",
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). The profile is already reconciled — no retry needed.",
1238
- actWhy: "Why not live?",
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 while composing. Its directory is untouched — quit DSH and install it again.",
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 layers declared",
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: "hoisted",
1339
+ checkHoisted: "top level",
1325
1340
  checkPeerMismatches: "Dependency version mismatches",
1326
1341
  checkPeerEmpty: "No dependency version mismatches",
1327
- checkPeerInfo: "{0} informational entries (unconfirmed)",
1342
+ checkPeerInfo: "{0} more unconfirmed entries",
1328
1343
  checkPeerOverview: "{0} mismatch(es) · {1} informational",
1329
- checkRange: "declared range",
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 risk-level dependency mismatches",
1350
+ checkPeerRiskEmpty: "No dependency risks",
1336
1351
  checkPeerWarning: "Dependency warnings",
1337
- checkPeerWarningEmpty: "No warning-level dependency mismatches",
1352
+ checkPeerWarningEmpty: "No dependency warnings",
1338
1353
  checkPeerInfoTier: "Dependency info",
1339
- checkPeerInfoTierEmpty: "No informational dependency entries",
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 incomplete package directories or pnpm temp directories.",
1354
- checkResidualsHint: "Nothing in the profile references these, and none of them stops a start: they are what an interrupted update leaves behind. Quit DSH and either delete them or install the plugin again.",
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: "About this page",
1367
- diagExplainText: "This page checks for plugins that conflict with each other, mismatched dependencies, or wrong load order. Terms used:",
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: "Static composition validation failed: {0}",
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 instance 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).",
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 idempotent — 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 stdout/stderr back to you. State the reason and wait for my confirmation at each step — never run these yourself.",
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 bundle order and disabled list as a preset and switch anytime; applying runs a trial-start check and creates a snapshot first.",
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 apply",
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} bundles",
1438
+ presetBundleCount: "{0} plugins",
1424
1439
  presetPreview: "Preview",
1425
1440
  presetPreviewTitle: "Applying this preset will:",
1426
- presetReorder: "reorder {0} bundles",
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 profile package.json and configuration from the snapshot; this cannot be undone (create a fresh snapshot first if unsure).",
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 known shared DSH host packages in dependencies. This may shadow the host version; the check is manifest-only and does not confirm a duplicate runtime instance:",
1454
- hostDependencyMore: "{0} more finding(s) omitted",
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 did not name a reason",
1475
+ recoveryNoSummary: "The log does not say why",
1461
1476
  recoveryRawLog: "The raw dsh output (tail)",
1462
- recoveryBlamedHint: "The plugins marked in red are the ones this boot named; unticking them disables them at the next start.",
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: "disable-carrier",
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: "Writing and restarting…",
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: "The write failed: ",
1473
- recoveryWriteFailed: "The last choice could not be written in full, so nothing was restarted: ",
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
- * Catalog npm latest in the card byline (#348). Same quiet style as ↓ / ★;
7056
- * omitted when absent so github-only and not-yet-backfilled rows stay clean.
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, translated where this build knows them.
9749
+ * The scanner's red-line sentences, in the reader's language.
9696
9750
  *
9697
- * A sentence it does not know stays in the scanner's language on purpose: a
9698
- * mistranslation of a security fact is worse than a foreign word, and the
9699
- * line is the one thing on the card a reader must not misread.
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
- * What the plugin touches (#401), rendered the same way by both card
9709
- * renderers. The Discover card and the Themes card show the same plugin, so
9710
- * a fact that appears on one and not the other reads as a difference between
9711
- * the PLUGINS rather than between the cards.
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 capabilityRow = (p) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
9714
- className: Market_module_css_default.caps,
9715
- children: [
9716
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
9717
- label: t("capabilityNote"),
9718
- side: "top",
9719
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
9720
- className: Market_module_css_default.capsTitle,
9721
- children: t("capabilityTitle")
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
- p.capabilityRedLines?.map((line) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
9725
- className: Market_module_css_default.capRed,
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
- typeof p.downloads === "number" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
9849
- label: String(p.downloads),
9850
- side: "top",
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
- typeof p.downloads === "number" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
10033
- label: String(p.downloads),
10034
- side: "top",
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
- typeof confirming.downloads === "number" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
12209
- label: String(confirming.downloads),
12210
- side: "top",
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",