dshmarket 1.66.5 → 1.66.7

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
@@ -67,6 +67,11 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
67
67
  "IconCodeOutlineRegular",
68
68
  "IconCodeOutline16"
69
69
  ],
70
+ [
71
+ "IconCopyOutline16",
72
+ "IconCopyOutlineRegular",
73
+ "IconCopyOutline16"
74
+ ],
70
75
  [
71
76
  "IconCordisPluginOutline14",
72
77
  "IconCordisPluginOutlineRegular",
@@ -176,7 +181,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
176
181
  const IconChevronLeftOutline14 = pickIcon("IconChevronLeftOutlineRegular", "IconChevronLeftOutline14");
177
182
  const IconChevronRightOutline14 = pickIcon("IconChevronRightOutlineRegular", "IconChevronRightOutline14");
178
183
  const IconChevronUpOutline14 = pickIcon("IconChevronUpOutlineRegular", "IconChevronUpOutline14");
179
- const IconCodeOutline16 = pickIcon("IconCodeOutlineRegular", "IconCodeOutline16");
184
+ pickIcon("IconCodeOutlineRegular", "IconCodeOutline16");
185
+ const IconCopyOutline16 = pickIcon("IconCopyOutlineRegular", "IconCopyOutline16");
180
186
  const IconCordisPluginOutline14 = pickIcon("IconCordisPluginOutlineRegular", "IconCordisPluginOutline14");
181
187
  const IconDownloadOutline16 = pickIcon("IconDownloadOutlineRegular", "IconDownloadOutline16");
182
188
  const IconFolderOpen16 = pickIcon("IconFolderOpenRegular", "IconFolderOpen16");
@@ -245,6 +251,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
245
251
  submitPlugin: "申请收录插件 ↗",
246
252
  descExpand: "展开",
247
253
  descCollapse: "收起",
254
+ descMore: "展开全部",
248
255
  searchPh: "搜索插件,例如:通知、终端、记忆…",
249
256
  searchFavoritesPh: "搜索收藏…",
250
257
  clearSearch: "清除搜索",
@@ -310,7 +317,12 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
310
317
  restartHintSupervised: "本进程是 {0} 服务的主进程,重启交给它负责——市场自己重启会连带杀掉 cgroup 里的接管进程,服务将起不来。请执行 systemctl restart <你的 unit>。确认你的配置能承受市场自行重启(如 KillMode=process),可在本插件配置里手动打开「允许重启」。",
311
318
  restartHintDebugged: "当前 dsh 进程正被调试器连接。请从 IDE 或终端停止该进程后重新启动,市场不能从界面里结束正在调试的 dsh。",
312
319
  confirmTitle: "安装",
313
- confirmWarn: "插件是社区第三方代码。安装即表示你信任该来源;构建脚本默认不会运行。",
320
+ confirmWarn: "社区第三方插件,构建脚本默认不运行。",
321
+ installCaution: "安装前请注意",
322
+ terminalCautionTitle: "可能不适用于网页版",
323
+ terminalCautionBody: "这是终端插件,网页版里可能用不了。",
324
+ terminalCautionStartup: "也可能让 DeepSeek Harness 起不来。",
325
+ terminalCautionLink: "先看使用说明 ↗",
314
326
  cancel: "取消",
315
327
  empty: "没有匹配的插件",
316
328
  installedEmpty: "尚未安装社区插件,可前往「发现」页浏览",
@@ -332,6 +344,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
332
344
  agentBusyUpdateQueued: "Agent 正忙,已排队,空闲后自动更新(可在右上角「任务」里取消)。",
333
345
  agentBusyUninstallQueued: "Agent 正忙,已排队,空闲后自动卸载(可在右上角「任务」里取消)。",
334
346
  queuedRunBlocked: "有 {0} 个会话正在运行,现在还不能执行:这类操作会直接替换插件文件,运行中的 Agent 可能中途报错。它们空闲后会自动开始(也可以先在「任务」里取消这一条)。",
347
+ queuedRunBusy: "另一个安装、更新或卸载还在进行,现在还不能开始:这一条留在队列里,等它完成后会自动开始,不需要再点一次。",
335
348
  queuedInstallGone: "这一条要装的插件在当前目录里找不到了(目录刷新过或换了页),已从队列移除。请在目录里重新找到它再装一次。",
336
349
  agentQueueStaleGone: "排队时它还在已安装列表里,现在已不在,因此跳过(没有卸载)。",
337
350
  agentQueueStaleNoUpdate: "排队时它有可用更新,现在没有了,已跳过。",
@@ -376,7 +389,6 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
376
389
  migrateWarning: "该 npm 包可能由其他人发布,并非同一插件;确认可信后再继续。",
377
390
  migrateContinue: "确认换用",
378
391
  migrateFail: "换用来源失败",
379
- restore: "恢复",
380
392
  restoreOnline: "换用线上版本",
381
393
  restoreHint: "将卸载本地版本并安装线上版本,之后照常检查更新。此操作无法撤销。",
382
394
  hostIncompatibleTitle: "这个新版本要求更新的 DSH",
@@ -421,7 +433,6 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
421
433
  commentsError: "评论加载失败。请检查网络连接后重试。",
422
434
  commentsRetry: "重试",
423
435
  commentsOnGitHub: "在 GitHub 登录并参与讨论",
424
- terminalWarn: "这看起来是终端/命令行插件:安装到网页版 profile 可能不会生效,甚至导致 DeepSeek Harness 无法启动。建议先阅读其使用说明,并按说明安装到对应的 profile。",
425
436
  conflictTitle: "无法安装:与已安装的插件冲突",
426
437
  conflictBody: "和已安装的插件冲突,只能留一个:",
427
438
  conflictReverted: "已自动撤销,未改动任何插件",
@@ -474,6 +485,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
474
485
  confirm: "确认",
475
486
  confirmInstall: "确认安装",
476
487
  cmdDetails: "安装命令",
488
+ cmdCopy: "复制安装命令",
489
+ cmdCopied: "已复制",
477
490
  catsMore: "更多分类",
478
491
  catsLess: "收起",
479
492
  filter: "筛选",
@@ -523,9 +536,20 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
523
536
  updateAll: "全部更新",
524
537
  heldReleaseNotice: "已安装,但不是最新版:这个 profile 的 minimumReleaseAge 挡住了 {0},安装的是 {1}。",
525
538
  heldReleaseAction: "仍安装 {0}",
526
- ignoreUpdateNotice: "本次不再提醒",
527
- ignoreAllUpdateNotices: "本次全部忽略",
528
- updateNoticeIgnored: "本次已忽略提醒",
539
+ ignoreUpdateNotice: "重启前不再提醒",
540
+ ignoreAllUpdateNotices: "重启前都不再提醒",
541
+ updateNoticeIgnored: "重启前不再提醒",
542
+ updateExemptAdd: "一直不提醒更新",
543
+ updateExemptRemove: "恢复更新提醒",
544
+ updateExemptMark: "提醒已关闭",
545
+ updateExemptRestore: "恢复提醒",
546
+ updateExemptHint: "新版本仍会列出,只是不再提醒。",
547
+ updateExemptOn: "更新提醒已关闭。新版本仍会列出。",
548
+ updateExemptOff: "已恢复更新提醒。",
549
+ updateExemptFailed: "无法保存,请重试。",
550
+ updateAvailableShort: "有新版本",
551
+ copyPath: "复制路径",
552
+ pathCopied: "已复制",
529
553
  tabThemes: "主题",
530
554
  tabBackup: "备份与恢复",
531
555
  backupLocal: "本地文件",
@@ -604,6 +628,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
604
628
  gotIt: "关闭",
605
629
  stateLive: "已生效",
606
630
  stateRestart: "已安装,重启后生效",
631
+ stateIncompatible: "已安装,与当前 dsh 不兼容",
607
632
  stateInert: "已安装,未生效",
608
633
  stateDependencyLibrary: "{0} 的依赖库",
609
634
  stateBroken: "已安装,校验未通过",
@@ -639,6 +664,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
639
664
  brokenPluginTitle: "{0} 更新失败后被移除了",
640
665
  brokenPluginBody: "DSH 正在运行时无法更新,而更新前的版本也已经损坏。为避免下次启动卡住,市场把它从 profile 里移除。插件目录还在原处,退出 DSH 后重新安装即可。",
641
666
  brokenPluginAction: "查找这个插件",
667
+ brokenPluginDismiss: "不再显示这条",
642
668
  viewReplacement: "查看替代品",
643
669
  installReplacement: "安装替代品",
644
670
  replacementHint: "目录建议改用",
@@ -909,6 +935,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
909
935
  submitPlugin: "Submit a plugin ↗",
910
936
  descExpand: "Show more",
911
937
  descCollapse: "Show less",
938
+ descMore: "Show all",
912
939
  searchPh: "Search plugins: notify, terminal, memory…",
913
940
  searchFavoritesPh: "Search favorites…",
914
941
  clearSearch: "Clear search",
@@ -973,7 +1000,12 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
973
1000
  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.",
974
1001
  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.",
975
1002
  confirmTitle: "Install",
976
- confirmWarn: "Plugins are third-party community code. Installing means you trust the source. Build scripts do not run by default.",
1003
+ confirmWarn: "Community third-party plugin. Build scripts do not run by default.",
1004
+ installCaution: "Before you install",
1005
+ terminalCautionTitle: "May not work in the web app",
1006
+ terminalCautionBody: "This is a terminal plugin. It may not work in the web version.",
1007
+ terminalCautionStartup: "It can stop DeepSeek Harness from starting.",
1008
+ terminalCautionLink: "Read its instructions first ↗",
977
1009
  cancel: "Cancel",
978
1010
  empty: "No plugins match",
979
1011
  installedEmpty: "No community plugins yet — browse the Discover tab",
@@ -995,6 +1027,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
995
1027
  agentBusyUpdateQueued: "Agent is busy — queued and will update automatically when idle (cancel it in Tasks, top right).",
996
1028
  agentBusyUninstallQueued: "Agent is busy — queued and will uninstall automatically when idle (cancel it in Tasks, top right).",
997
1029
  queuedRunBlocked: "{0} session(s) are running, so this cannot start yet: these operations replace plugin files in place, and a working agent can fail mid-turn. It will begin on its own once they go idle (or cancel this entry in Tasks).",
1030
+ queuedRunBusy: "Another install, update or uninstall is still running, so this cannot start yet: it stays queued and begins on its own when that one finishes — no need to press again.",
998
1031
  queuedInstallGone: "The plugin this entry was going to install is no longer in the catalog (it was refreshed or you changed pages), so the entry was removed. Find it in the catalog and install it again.",
999
1032
  agentQueueStaleGone: "It was installed when you queued this, and is not now — skipped, nothing was uninstalled.",
1000
1033
  agentQueueStaleNoUpdate: "It had an update available when you queued this, and does not now — skipped.",
@@ -1039,7 +1072,6 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
1039
1072
  migrateWarning: "The npm package may be published by someone else and not be the same plugin. Continue only if you trust it.",
1040
1073
  migrateContinue: "Confirm switch",
1041
1074
  migrateFail: "Source switch failed",
1042
- restore: "Restore",
1043
1075
  restoreOnline: "Use online version",
1044
1076
  restoreHint: "This uninstalls the local version and installs the online version. Update checks continue as usual. This cannot be undone.",
1045
1077
  hostIncompatibleTitle: "This release needs a newer DSH",
@@ -1084,7 +1116,6 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
1084
1116
  commentsError: "Comments could not be loaded. Check your connection and try again.",
1085
1117
  commentsRetry: "Try again",
1086
1118
  commentsOnGitHub: "Sign in and join on GitHub",
1087
- terminalWarn: "This looks like a terminal/CLI plugin: installing it into the web profile may do nothing, or even break DeepSeek Harness startup. Read its README and install it into the profile it targets.",
1088
1119
  conflictTitle: "Cannot install: conflicts with an installed plugin",
1089
1120
  conflictBody: "It conflicts with an installed plugin — only one can stay:",
1090
1121
  conflictReverted: "Reverted automatically; nothing was changed",
@@ -1137,6 +1168,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
1137
1168
  confirm: "Confirm",
1138
1169
  confirmInstall: "Confirm install",
1139
1170
  cmdDetails: "Install command",
1171
+ cmdCopy: "Copy install command",
1172
+ cmdCopied: "Copied",
1140
1173
  catsMore: "More categories",
1141
1174
  catsLess: "Fewer categories",
1142
1175
  filter: "Filter",
@@ -1186,9 +1219,20 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
1186
1219
  updateAll: "Update all",
1187
1220
  heldReleaseNotice: "Installed, but not the newest: this profile's minimumReleaseAge held {0} back, so {1} was installed.",
1188
1221
  heldReleaseAction: "Install {0} anyway",
1189
- ignoreUpdateNotice: "Ignore until restart",
1190
- ignoreAllUpdateNotices: "Ignore all until restart",
1191
- updateNoticeIgnored: "Reminder ignored for this boot",
1222
+ ignoreUpdateNotice: "Don't remind until restart",
1223
+ ignoreAllUpdateNotices: "Don't remind any until restart",
1224
+ updateNoticeIgnored: "No reminders until restart",
1225
+ updateExemptAdd: "Never remind about updates",
1226
+ updateExemptRemove: "Resume update reminders",
1227
+ updateExemptMark: "Reminders off",
1228
+ updateExemptRestore: "Remind again",
1229
+ updateExemptHint: "New versions stay listed. Only the reminder stops.",
1230
+ updateExemptOn: "Update reminders are off. New versions stay listed.",
1231
+ updateExemptOff: "Update reminders are back on.",
1232
+ updateExemptFailed: "Couldn't save that. Try again.",
1233
+ updateAvailableShort: "New version",
1234
+ copyPath: "Copy path",
1235
+ pathCopied: "Copied",
1192
1236
  tabThemes: "Themes",
1193
1237
  tabBackup: "Backup & Restore",
1194
1238
  backupLocal: "Local file",
@@ -1267,6 +1311,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
1267
1311
  gotIt: "Dismiss",
1268
1312
  stateLive: "Active",
1269
1313
  stateRestart: "Installed — restart to apply",
1314
+ stateIncompatible: "Installed — incompatible with this dsh",
1270
1315
  stateInert: "Installed, not active",
1271
1316
  stateDependencyLibrary: "Library for {0}",
1272
1317
  stateBroken: "Installed, verification failed",
@@ -1302,6 +1347,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
1302
1347
  brokenPluginTitle: "{0} was removed after a failed update",
1303
1348
  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.",
1304
1349
  brokenPluginAction: "Find this plugin",
1350
+ brokenPluginDismiss: "Stop showing this",
1305
1351
  viewReplacement: "View replacement",
1306
1352
  installReplacement: "Install replacement",
1307
1353
  replacementHint: "Catalog suggests",
@@ -2803,7 +2849,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
2803
2849
  const HostCheckbox = optionalComponent("Checkbox");
2804
2850
  //#endregion
2805
2851
  //#region \0dsh-css:src/client/Market.module.css.mjs
2806
- 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_cardMore{cursor:pointer;font:inherit;letter-spacing:1px;color:var(--dsw-alias-label-secondary,#9ca3af);background:0 0;border:0;padding:0 2px;font-size:14px;line-height:16px}.nUhMVa_cardMore:hover{color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_blockedTabHint{color:var(--dsw-alias-label-secondary,#9ca3af);margin:0 0 12px;font-size:12px;line-height:18px}.nUhMVa_blockedMissing{flex-direction:column;gap:4px;margin-top:8px;display:flex}.nUhMVa_blockedBarRow{justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}.nUhMVa_blockedBarName{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;line-height:20px;overflow:hidden}.nUhMVa_blockedBarUndo{cursor:pointer;font:inherit;color:var(--dsw-alias-brand-primary,#4f6ef7);background:0 0;border:0;padding:0;font-size:12px;line-height:18px}.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}";
2852
+ 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 64px;scroll-padding-bottom:64px;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_confirmBody{flex-direction:column;gap:12px;display:flex}.nUhMVa_confirmModal{width:min(560px,92vw);max-width:min(560px,92vw);max-height:100%}.nUhMVa_confirmContent{flex:auto;min-height:0;overflow:hidden}.nUhMVa_confirmContent>:first-child{flex-shrink:0}.nUhMVa_confirmContent>:last-child{overscroll-behavior:contain;flex:auto;min-height:0;margin-top:0;overflow-y:auto}.nUhMVa_confirmModal>:last-child{flex-shrink:0}.nUhMVa_confirmBody .nUhMVa_byline{flex-wrap:nowrap;margin-top:0}.nUhMVa_confirmBody .nUhMVa_owner{min-width:0}.nUhMVa_confirmBody .nUhMVa_shots{margin:0;padding:0}.nUhMVa_confirmBody .nUhMVa_modalNote{margin:0}.nUhMVa_confirmTags{flex-wrap:wrap;gap:6px;display:flex}.nUhMVa_confirmDesc{color:var(--dsw-alias-label-primary,#1f2328);white-space:pre-wrap;margin:0;font-size:13px;line-height:20px}.nUhMVa_confirmFold{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb);flex-direction:column;gap:8px;padding-top:12px;display:flex}.nUhMVa_confirmPanel{--fold-bg:#f7f8fa;--fold-border:#e7e8ea;--fold-ink:#1c1d1f;--fold-on-ink:#fff;background:var(--fold-bg);border:1px solid var(--fold-border);border-radius:8px}body[data-ds-dark-theme] .nUhMVa_confirmPanel{--fold-bg:var(--dsw-alias-bg-layer-3,#353638);--fold-border:var(--dsw-alias-border-l2,#ffffff1f);--fold-ink:var(--dsw-alias-label-primary,#f9fafb);--fold-on-ink:var(--dsw-alias-bg-layer-2,#2c2c2e)}.nUhMVa_confirmPanelRow{width:100%;min-height:40px;color:inherit;font:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:8px;align-items:center;gap:8px;padding:0 12px;display:flex}.nUhMVa_confirmPanelRow:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4176e6);outline-offset:-2px}.nUhMVa_confirmPanelIcon{color:var(--fold-ink);flex:none;display:inline-flex}.nUhMVa_confirmTerminalIcon{color:var(--fold-ink);flex:none;display:block}.nUhMVa_confirmTerminalPrompt{stroke:var(--fold-on-ink);fill:none}.nUhMVa_confirmTerminalDot{fill:var(--fold-on-ink)}.nUhMVa_confirmPanelTitle{min-width:0;color:var(--fold-ink);flex:1;font-size:13px;line-height:20px}.nUhMVa_confirmPanelChevron{color:var(--dsw-alias-label-tertiary,#8b93a1);flex:none}.nUhMVa_confirmPanelBody{padding:0 12px 10px 16px}.nUhMVa_confirmCmd{align-items:center;gap:8px;display:flex}.nUhMVa_confirmPanel .nUhMVa_cmd{background:0 0;border-radius:0;flex:1;min-width:0;margin:0;padding:0;line-height:24px}.nUhMVa_confirmCopied{color:var(--dsw-alias-state-success-primary,#22c55e);white-space:nowrap;flex:none;font-size:12px;line-height:24px}.nUhMVa_confirmCopy{width:24px;height:24px;color:var(--fold-ink,#1c1d1f);cursor:pointer;background:0 0;border:0;border-radius:6px;flex:none;justify-content:center;align-items:center;padding:0;display:inline-flex}.nUhMVa_confirmCopy:hover{background:color-mix(in srgb, var(--fold-ink,#1c1d1f) 8%, transparent)}.nUhMVa_confirmCopy:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4176e6);outline-offset:1px}.nUhMVa_confirmPanel .nUhMVa_caps{gap:6px;padding:0}.nUhMVa_confirmPanel .nUhMVa_caps .nUhMVa_capChip{background:var(--fold-on-ink,#fff);border:1px solid var(--fold-border,#e7e8ea);color:var(--fold-ink,#1c1d1f);border-radius:999px;padding:2px 8px;font-size:12px;line-height:18px}.nUhMVa_confirmPanel .nUhMVa_caps .nUhMVa_capMuted{border-color:var(--fold-border,#e7e8ea);color:var(--dsw-alias-label-secondary,#6b7280);padding:2px 8px;font-size:12px;line-height:18px}.nUhMVa_confirmPanel .nUhMVa_caps .nUhMVa_capFact{color:var(--fold-ink,#1c1d1f);flex-basis:100%;margin:2px 0 0;font-size:13px;line-height:20px}.nUhMVa_confirmPanel .nUhMVa_capCaveat{color:var(--dsw-alias-label-secondary,#6b7280);font-size:12px;line-height:18px}.nUhMVa_installCaution{background:color-mix(in srgb, var(--dsw-alias-state-warn-primary,#b45309) 12%, transparent);border-radius:8px;padding:12px 13px}.nUhMVa_installCautionLabel{color:var(--dsw-alias-label-secondary,#6b7280);margin:0 0 8px;font-size:12px;line-height:18px}.nUhMVa_installCautionHead{color:var(--dsw-alias-label-primary,#1f2328);align-items:center;gap:6px;margin:0;font-size:13px;font-weight:600;line-height:20px;display:flex}.nUhMVa_installCautionMark{flex:none;display:block}.nUhMVa_installCautionBody{color:var(--dsw-alias-label-primary,#1f2328);margin:6px 0 0;font-size:13px;line-height:20px}.nUhMVa_installCautionFoot{color:var(--dsw-alias-label-primary,#1f2328);align-items:baseline;gap:12px;margin:0;font-size:13px;line-height:20px;display:flex}.nUhMVa_installCautionLink{white-space:nowrap;color:var(--dsw-alias-link,#3b82f6);flex:none;margin-left:auto;font-size:13px;font-weight:600;line-height:20px;text-decoration:none}.nUhMVa_installCautionLink:hover{text-decoration:underline}.nUhMVa_confirmFineprint{color:var(--dsw-alias-label-secondary,#6b7280);margin:0;font-size:12px;line-height:18px}.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_descClamp3{-webkit-line-clamp:3;-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_noteEdit{flex-direction:column;gap:6px;min-width:0;margin-top:6px;display:flex}.nUhMVa_noteInput{box-sizing:border-box;width:100%;min-width:0;max-width:100%;display:flex}.nUhMVa_noteInput input{box-sizing:border-box;flex:auto;width:100%;min-width:0}.nUhMVa_noteEditBar{justify-content:flex-end;align-items:center;gap:6px;display:flex}.nUhMVa_noteCount{font-variant-numeric:tabular-nums;color:var(--dsw-alias-label-tertiary,#8b93a1);margin-right:auto;font-size:11px;line-height:16px}.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_irowHead{align-items:flex-start;gap:8px;min-width:0;display:flex}.nUhMVa_irowHead .nUhMVa_irowName{flex:1 1 0;min-width:0}.nUhMVa_irowMenu{flex-shrink:0;margin-top:-4px;margin-left:auto;margin-right:-6px}.nUhMVa_irowMeta{color:var(--dsw-alias-label-secondary,#6b7280);margin-top:2px;font-size:12px;line-height:18px}.nUhMVa_irowPath{align-items:center;gap:6px;min-width:0;margin-top:6px;display:flex}.nUhMVa_irowPath .nUhMVa_spec{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.nUhMVa_irowPathIcon,.nUhMVa_irowStatusIcon{color:var(--dsw-alias-label-tertiary,#8b93a1);flex-shrink:0;display:inline-flex}.nUhMVa_irowPathCopy{flex-shrink:0;align-items:center;gap:4px;margin-left:auto;display:inline-flex}.nUhMVa_irowPath .nUhMVa_confirmCopy{width:20px;height:20px;color:var(--dsw-alias-label-tertiary,#8b93a1)}.nUhMVa_irowPath .nUhMVa_confirmCopy:hover{color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_irowPath .nUhMVa_confirmCopied{color:var(--dsw-alias-label-secondary,#6b7280);order:1;font-size:11px}.nUhMVa_irowDesc{flex:100%;min-width:0}.nUhMVa_irowStatus{flex-wrap:wrap;align-items:center;gap:6px;min-width:0;margin-top:8px;font-size:12px;line-height:18px;display:flex}.nUhMVa_irowStatus+.nUhMVa_irowStatus{margin-top:4px}.nUhMVa_irowStatusPart{align-items:baseline;gap:6px;display:inline-flex}.nUhMVa_irowStatus .nUhMVa_notesLink{margin:0;display:inline}.nUhMVa_irowStatus .nUhMVa_metaInline{font-size:12px}.nUhMVa_irowStatusAction{margin-left:auto;display:inline-flex}.nUhMVa_irowStatusAction .nUhMVa_noteToggle{color:var(--dsw-alias-label-secondary,#6b7280);font-size:12px;line-height:18px}.nUhMVa_irowStatusAction .nUhMVa_noteToggle:hover{color:var(--dsw-alias-label-primary,#1f2328);text-decoration:none}.nUhMVa_descMore{cursor:pointer;font:inherit;color:var(--dsw-alias-label-secondary,#6b7280);background:0 0;border:none;align-items:center;gap:2px;margin-top:4px;padding:0;font-size:12px;line-height:18px;display:inline-flex}.nUhMVa_descMore:hover{color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_noteAdd{cursor:pointer;font:inherit;color:var(--dsw-alias-label-secondary,#6b7280);white-space:nowrap;background:0 0;border:none;align-items:center;gap:6px;margin-top:4px;padding:0;font-size:12px;line-height:18px;display:inline-flex}.nUhMVa_noteAdd:hover,.nUhMVa_irowStatusFact{color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_irowStatusSep{color:var(--dsw-alias-label-tertiary,#8b93a1)}.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_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);align-items:baseline;gap:12px;margin:6px 0 0;font-size:11px;line-height:16px;display:flex}.nUhMVa_capCaveatNote{min-width:0}.nUhMVa_capCaveatAt{white-space:nowrap;flex:none;margin-left:auto}.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_cardMore{cursor:pointer;font:inherit;letter-spacing:1px;color:var(--dsw-alias-label-secondary,#9ca3af);background:0 0;border:0;padding:0 2px;font-size:14px;line-height:16px}.nUhMVa_cardMore:hover{color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_blockedTabHint{color:var(--dsw-alias-label-secondary,#9ca3af);margin:0 0 12px;font-size:12px;line-height:18px}.nUhMVa_blockedMissing{flex-direction:column;gap:4px;margin-top:8px;display:flex}.nUhMVa_blockedBarRow{justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}.nUhMVa_blockedBarName{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;line-height:20px;overflow:hidden}.nUhMVa_blockedBarUndo{cursor:pointer;font:inherit;color:var(--dsw-alias-brand-primary,#4f6ef7);background:0 0;border:0;padding:0;font-size:12px;line-height:18px}.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}";
2807
2853
  const tagId = "dshmarket/Market.module.css";
2808
2854
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
2809
2855
  const tag = document.createElement("style");
@@ -2844,6 +2890,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
2844
2890
  "brokenPluginText": "nUhMVa_brokenPluginText",
2845
2891
  "byline": "nUhMVa_byline",
2846
2892
  "capCaveat": "nUhMVa_capCaveat",
2893
+ "capCaveatAt": "nUhMVa_capCaveatAt",
2894
+ "capCaveatNote": "nUhMVa_capCaveatNote",
2847
2895
  "capChip": "nUhMVa_capChip",
2848
2896
  "capFact": "nUhMVa_capFact",
2849
2897
  "capMuted": "nUhMVa_capMuted",
@@ -2883,7 +2931,26 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
2883
2931
  "commentsMount": "nUhMVa_commentsMount",
2884
2932
  "commentsNote": "nUhMVa_commentsNote",
2885
2933
  "commentsStatus": "nUhMVa_commentsStatus",
2934
+ "confirmBody": "nUhMVa_confirmBody",
2935
+ "confirmCmd": "nUhMVa_confirmCmd",
2936
+ "confirmContent": "nUhMVa_confirmContent",
2937
+ "confirmCopied": "nUhMVa_confirmCopied",
2938
+ "confirmCopy": "nUhMVa_confirmCopy",
2939
+ "confirmDesc": "nUhMVa_confirmDesc",
2940
+ "confirmFineprint": "nUhMVa_confirmFineprint",
2941
+ "confirmFold": "nUhMVa_confirmFold",
2942
+ "confirmModal": "nUhMVa_confirmModal",
2943
+ "confirmPanel": "nUhMVa_confirmPanel",
2944
+ "confirmPanelBody": "nUhMVa_confirmPanelBody",
2945
+ "confirmPanelChevron": "nUhMVa_confirmPanelChevron",
2946
+ "confirmPanelIcon": "nUhMVa_confirmPanelIcon",
2947
+ "confirmPanelRow": "nUhMVa_confirmPanelRow",
2948
+ "confirmPanelTitle": "nUhMVa_confirmPanelTitle",
2886
2949
  "confirmRow": "nUhMVa_confirmRow",
2950
+ "confirmTags": "nUhMVa_confirmTags",
2951
+ "confirmTerminalDot": "nUhMVa_confirmTerminalDot",
2952
+ "confirmTerminalIcon": "nUhMVa_confirmTerminalIcon",
2953
+ "confirmTerminalPrompt": "nUhMVa_confirmTerminalPrompt",
2887
2954
  "conflictBody": "nUhMVa_conflictBody",
2888
2955
  "conflictDetailsToggle": "nUhMVa_conflictDetailsToggle",
2889
2956
  "conflictHead": "nUhMVa_conflictHead",
@@ -2898,6 +2965,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
2898
2965
  "deprecate": "nUhMVa_deprecate",
2899
2966
  "desc": "nUhMVa_desc",
2900
2967
  "descClamp": "nUhMVa_descClamp",
2968
+ "descClamp3": "nUhMVa_descClamp3",
2969
+ "descMore": "nUhMVa_descMore",
2901
2970
  "descTight": "nUhMVa_descTight",
2902
2971
  "descToggle": "nUhMVa_descToggle",
2903
2972
  "diagAlert": "nUhMVa_diagAlert",
@@ -2973,13 +3042,31 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
2973
3042
  "hostRequirementBad": "nUhMVa_hostRequirementBad",
2974
3043
  "inlineInput": "nUhMVa_inlineInput",
2975
3044
  "installBtn": "nUhMVa_installBtn",
3045
+ "installCaution": "nUhMVa_installCaution",
3046
+ "installCautionBody": "nUhMVa_installCautionBody",
3047
+ "installCautionFoot": "nUhMVa_installCautionFoot",
3048
+ "installCautionHead": "nUhMVa_installCautionHead",
3049
+ "installCautionLabel": "nUhMVa_installCautionLabel",
3050
+ "installCautionLink": "nUhMVa_installCautionLink",
3051
+ "installCautionMark": "nUhMVa_installCautionMark",
2976
3052
  "irow": "nUhMVa_irow",
2977
3053
  "irowActions": "nUhMVa_irowActions",
2978
- "irowDevTag": "nUhMVa_irowDevTag",
3054
+ "irowDesc": "nUhMVa_irowDesc",
2979
3055
  "irowHead": "nUhMVa_irowHead",
3056
+ "irowMenu": "nUhMVa_irowMenu",
3057
+ "irowMeta": "nUhMVa_irowMeta",
2980
3058
  "irowMissing": "nUhMVa_irowMissing",
2981
3059
  "irowName": "nUhMVa_irowName",
2982
3060
  "irowNameText": "nUhMVa_irowNameText",
3061
+ "irowPath": "nUhMVa_irowPath",
3062
+ "irowPathCopy": "nUhMVa_irowPathCopy",
3063
+ "irowPathIcon": "nUhMVa_irowPathIcon",
3064
+ "irowStatus": "nUhMVa_irowStatus",
3065
+ "irowStatusAction": "nUhMVa_irowStatusAction",
3066
+ "irowStatusFact": "nUhMVa_irowStatusFact",
3067
+ "irowStatusIcon": "nUhMVa_irowStatusIcon",
3068
+ "irowStatusPart": "nUhMVa_irowStatusPart",
3069
+ "irowStatusSep": "nUhMVa_irowStatusSep",
2983
3070
  "irowTrailing": "nUhMVa_irowTrailing",
2984
3071
  "lightbox": "nUhMVa_lightbox",
2985
3072
  "lightboxClose": "nUhMVa_lightboxClose",
@@ -3000,7 +3087,6 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
3000
3087
  "meta": "nUhMVa_meta",
3001
3088
  "metaInline": "nUhMVa_metaInline",
3002
3089
  "metaTag": "nUhMVa_metaTag",
3003
- "metaTagAction": "nUhMVa_metaTagAction",
3004
3090
  "metaTagOk": "nUhMVa_metaTagOk",
3005
3091
  "migrationArrow": "nUhMVa_migrationArrow",
3006
3092
  "migrationLabel": "nUhMVa_migrationLabel",
@@ -3011,8 +3097,10 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
3011
3097
  "nameLink": "nUhMVa_nameLink",
3012
3098
  "nm": "nUhMVa_nm",
3013
3099
  "nmLink": "nUhMVa_nmLink",
3014
- "noteAction": "nUhMVa_noteAction",
3100
+ "noteAdd": "nUhMVa_noteAdd",
3101
+ "noteCount": "nUhMVa_noteCount",
3015
3102
  "noteEdit": "nUhMVa_noteEdit",
3103
+ "noteEditBar": "nUhMVa_noteEditBar",
3016
3104
  "noteInput": "nUhMVa_noteInput",
3017
3105
  "noteMine": "nUhMVa_noteMine",
3018
3106
  "noteRow": "nUhMVa_noteRow",
@@ -6204,6 +6292,10 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
6204
6292
  label: t("stateRestart"),
6205
6293
  dot: "warning"
6206
6294
  };
6295
+ if (state === "incompatible") return {
6296
+ label: t("stateIncompatible"),
6297
+ dot: "error"
6298
+ };
6207
6299
  if (state === "inert") return {
6208
6300
  label: t("stateInert"),
6209
6301
  dot: "warning"
@@ -6933,26 +7025,48 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
6933
7025
  * actually overflows the clamp: a two-line description has nothing to
6934
7026
  * "expand", so no button beats a button that does nothing.
6935
7027
  */
6936
- function CardDesc({ text, t }) {
7028
+ function CardDesc({ text, t, lines = 5, className, textClassName }) {
6937
7029
  const ref = (0, react.useRef)(null);
6938
7030
  const [expanded, setExpanded] = (0, react.useState)(false);
6939
7031
  const [canExpand, setCanExpand] = (0, react.useState)(false);
7032
+ const base = textClassName === void 0 ? Market_module_css_default.desc : `${Market_module_css_default.desc} ${textClassName}`;
7033
+ const clamp = lines === 3 ? Market_module_css_default.descClamp3 : Market_module_css_default.descClamp;
6940
7034
  (0, react.useLayoutEffect)(() => {
6941
7035
  const el = ref.current;
6942
7036
  if (el === null) return;
6943
- setCanExpand(el.scrollHeight > el.clientHeight + 1);
6944
- }, [text]);
6945
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6946
- ref,
6947
- className: expanded ? Market_module_css_default.desc : `${Market_module_css_default.desc} ${Market_module_css_default.descClamp}`,
6948
- children: text
6949
- }), canExpand && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6950
- type: "button",
6951
- className: Market_module_css_default.descToggle,
6952
- "aria-label": expanded ? t("descCollapse") : t("descExpand"),
6953
- onClick: () => setExpanded((e) => !e),
6954
- children: expanded ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronUpOutline14, { size: 14 }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronDownOutline14, { size: 14 })
6955
- })] });
7037
+ const measure = () => {
7038
+ if (!el.classList.contains(clamp)) return;
7039
+ setCanExpand(el.scrollHeight > el.clientHeight + 1);
7040
+ };
7041
+ measure();
7042
+ if (typeof ResizeObserver === "undefined") return;
7043
+ const observer = new ResizeObserver(measure);
7044
+ observer.observe(el);
7045
+ return () => observer.disconnect();
7046
+ }, [text, clamp]);
7047
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7048
+ className,
7049
+ children: [
7050
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7051
+ ref,
7052
+ className: expanded ? base : `${base} ${clamp}`,
7053
+ children: text
7054
+ }),
7055
+ canExpand && lines === 3 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
7056
+ type: "button",
7057
+ className: Market_module_css_default.descMore,
7058
+ onClick: () => setExpanded((e) => !e),
7059
+ children: [expanded ? t("descCollapse") : t("descMore"), expanded ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronUpOutline14, { size: 12 }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronRightOutline14, { size: 12 })]
7060
+ }),
7061
+ canExpand && lines === 5 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7062
+ type: "button",
7063
+ className: Market_module_css_default.descToggle,
7064
+ "aria-label": expanded ? t("descCollapse") : t("descExpand"),
7065
+ onClick: () => setExpanded((e) => !e),
7066
+ children: expanded ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronUpOutline14, { size: 14 }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronDownOutline14, { size: 14 })
7067
+ })
7068
+ ]
7069
+ });
6956
7070
  }
6957
7071
  /**
6958
7072
  * Full-bleed image preview, opened from a card thumbnail or a dialog's
@@ -7169,6 +7283,227 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
7169
7283
  })
7170
7284
  });
7171
7285
  }
7286
+ /** Circle with a question mark, in the same dark badge and light glyph as the
7287
+ * terminal mark below it. */
7288
+ function ConfirmCapabilityIcon() {
7289
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
7290
+ className: Market_module_css_default.confirmTerminalIcon,
7291
+ viewBox: "0 0 16 16",
7292
+ width: 16,
7293
+ height: 16,
7294
+ "aria-hidden": "true",
7295
+ focusable: "false",
7296
+ children: [
7297
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
7298
+ cx: "8",
7299
+ cy: "8",
7300
+ r: "8",
7301
+ fill: "currentColor"
7302
+ }),
7303
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
7304
+ className: Market_module_css_default.confirmTerminalPrompt,
7305
+ d: "M6.2 6.25a1.8 1.8 0 1 1 2.7 1.55C8.35 8.1 8 8.5 8 9.05",
7306
+ fill: "none",
7307
+ strokeWidth: "1.4",
7308
+ strokeLinecap: "round"
7309
+ }),
7310
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
7311
+ className: Market_module_css_default.confirmTerminalDot,
7312
+ cx: "8",
7313
+ cy: "11.2",
7314
+ r: "0.75"
7315
+ })
7316
+ ]
7317
+ });
7318
+ }
7319
+ /** Design-spec terminal mark for the install-command fold: dark rounded
7320
+ * square with a light `>_` prompt. Host ui-primitives has no matching glyph. */
7321
+ function ConfirmTerminalIcon() {
7322
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
7323
+ className: Market_module_css_default.confirmTerminalIcon,
7324
+ viewBox: "0 0 16 16",
7325
+ width: 16,
7326
+ height: 16,
7327
+ "aria-hidden": "true",
7328
+ focusable: "false",
7329
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
7330
+ width: "16",
7331
+ height: "16",
7332
+ rx: "3.5",
7333
+ fill: "currentColor"
7334
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
7335
+ className: Market_module_css_default.confirmTerminalPrompt,
7336
+ d: "M4.25 5.25 L7.25 8 L4.25 10.75 M8.25 10.75 H12",
7337
+ fill: "none",
7338
+ strokeWidth: "1.4",
7339
+ strokeLinecap: "round",
7340
+ strokeLinejoin: "round"
7341
+ })]
7342
+ });
7343
+ }
7344
+ /** execCommand only succeeds inside the click. writeText rejects later, after
7345
+ * Chrome has already dropped the user activation, so the textarea copy has
7346
+ * to happen before that promise. The field stays inside the dialog; removing
7347
+ * a focused node outside it would drop the keyboard onto document.body. */
7348
+ function copyInstallCommandNow(text, anchor) {
7349
+ const area = document.createElement("textarea");
7350
+ area.value = text;
7351
+ area.setAttribute("readonly", "");
7352
+ area.setAttribute("aria-hidden", "true");
7353
+ area.tabIndex = -1;
7354
+ area.style.position = "fixed";
7355
+ area.style.top = "0";
7356
+ area.style.left = "-9999px";
7357
+ (anchor.parentElement ?? document.body).appendChild(area);
7358
+ area.select();
7359
+ let ok = false;
7360
+ try {
7361
+ ok = document.execCommand("copy");
7362
+ } catch {
7363
+ ok = false;
7364
+ }
7365
+ area.remove();
7366
+ anchor.focus();
7367
+ return ok;
7368
+ }
7369
+ function writeInstallCommand(text, anchor) {
7370
+ const copiedNow = copyInstallCommandNow(text, anchor);
7371
+ const write = navigator.clipboard?.writeText;
7372
+ if (typeof write !== "function") return copiedNow ? Promise.resolve() : Promise.reject(/* @__PURE__ */ new Error("copy failed"));
7373
+ return write.call(navigator.clipboard, text).then(() => void 0, () => {
7374
+ if (copiedNow) return;
7375
+ throw new Error("copy failed");
7376
+ });
7377
+ }
7378
+ /** Copy control for the install command. Success shows 「已复制」 beside the
7379
+ * icon; the command stays selectable if both copy paths fail. */
7380
+ function ConfirmCopyButton({ text, label, copiedLabel }) {
7381
+ const [copied, setCopied] = (0, react.useState)(false);
7382
+ const timer = (0, react.useRef)(null);
7383
+ (0, react.useEffect)(() => () => {
7384
+ if (timer.current !== null) clearTimeout(timer.current);
7385
+ }, []);
7386
+ const markCopied = () => {
7387
+ setCopied(true);
7388
+ if (timer.current !== null) clearTimeout(timer.current);
7389
+ timer.current = setTimeout(() => setCopied(false), 1500);
7390
+ };
7391
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [copied && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7392
+ className: Market_module_css_default.confirmCopied,
7393
+ role: "status",
7394
+ children: copiedLabel
7395
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7396
+ type: "button",
7397
+ className: Market_module_css_default.confirmCopy,
7398
+ "aria-label": copied ? copiedLabel : label,
7399
+ onClick: (event) => {
7400
+ writeInstallCommand(text, event.currentTarget).then(markCopied, () => {});
7401
+ },
7402
+ children: copied ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCheckOutline16, { size: 14 }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCopyOutline16, { size: 14 })
7403
+ })] });
7404
+ }
7405
+ /** Stroke glyphs the host primitives do not ship. They inherit the text colour. */
7406
+ function IconPlus({ size = 14 }) {
7407
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
7408
+ viewBox: "0 0 16 16",
7409
+ width: size,
7410
+ height: size,
7411
+ "aria-hidden": "true",
7412
+ focusable: "false",
7413
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
7414
+ d: "M8 3v10M3 8h10",
7415
+ fill: "none",
7416
+ stroke: "currentColor",
7417
+ strokeWidth: "1.3",
7418
+ strokeLinecap: "round"
7419
+ })
7420
+ });
7421
+ }
7422
+ /** Reminders off (Lucide `bell-off` geometry): the body breaks where the slash crosses it. */
7423
+ function IconBellOff({ size = 16 }) {
7424
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
7425
+ viewBox: "0 0 24 24",
7426
+ width: size,
7427
+ height: size,
7428
+ fill: "none",
7429
+ stroke: "currentColor",
7430
+ strokeWidth: "1.75",
7431
+ strokeLinecap: "round",
7432
+ strokeLinejoin: "round",
7433
+ "aria-hidden": "true",
7434
+ focusable: "false",
7435
+ children: [
7436
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M10.268 21a2 2 0 0 0 3.464 0" }),
7437
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M17 17H4a1 1 0 0 1-.74-1.673C4.59 13.956 6 12.499 6 8a6 6 0 0 1 .258-1.742" }),
7438
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M8.668 3.01A6 6 0 0 1 18 8c0 2.687.77 4.653 1.707 6.05" }),
7439
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "m2 2 20 20" })
7440
+ ]
7441
+ });
7442
+ }
7443
+ /** Design-spec warning mark: filled amber triangle, same visual size as the
7444
+ * terminal badge above it. Title stays body ink. */
7445
+ function ConfirmWarnIcon() {
7446
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
7447
+ className: Market_module_css_default.installCautionMark,
7448
+ viewBox: "0 0 16 16",
7449
+ width: 16,
7450
+ height: 16,
7451
+ "aria-hidden": "true",
7452
+ focusable: "false",
7453
+ children: [
7454
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
7455
+ fill: "#f8b428",
7456
+ d: "M8 1.15Q8.72 1.15 9.15 2.05L14.4 12.35Q15.15 13.85 13.75 14.55H2.25Q0.85 13.85 1.6 12.35L6.85 2.05Q7.28 1.15 8 1.15Z"
7457
+ }),
7458
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
7459
+ d: "M8 6.05v3.15",
7460
+ fill: "none",
7461
+ stroke: "#fff",
7462
+ strokeWidth: "1.25",
7463
+ strokeLinecap: "round"
7464
+ }),
7465
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
7466
+ cx: "8",
7467
+ cy: "11.15",
7468
+ r: "0.68",
7469
+ fill: "#fff"
7470
+ })
7471
+ ]
7472
+ });
7473
+ }
7474
+ /** Install-dialog fold (#739). A gray block, not an outlined frame: the icon
7475
+ * stays on the left and the chevron stays on the right, open or closed. */
7476
+ function ConfirmFold({ icon, title, open, onToggle, children }) {
7477
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7478
+ className: Market_module_css_default.confirmPanel,
7479
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
7480
+ type: "button",
7481
+ className: Market_module_css_default.confirmPanelRow,
7482
+ "aria-expanded": open,
7483
+ onClick: onToggle,
7484
+ children: [
7485
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7486
+ className: Market_module_css_default.confirmPanelIcon,
7487
+ children: icon
7488
+ }),
7489
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7490
+ className: Market_module_css_default.confirmPanelTitle,
7491
+ children: title
7492
+ }),
7493
+ open ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronUpOutline14, {
7494
+ size: 14,
7495
+ className: Market_module_css_default.confirmPanelChevron
7496
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronRightOutline14, {
7497
+ size: 14,
7498
+ className: Market_module_css_default.confirmPanelChevron
7499
+ })
7500
+ ]
7501
+ }), open && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7502
+ className: Market_module_css_default.confirmPanelBody,
7503
+ children
7504
+ })]
7505
+ });
7506
+ }
7172
7507
  /** Catalog npm latest, omitted for github-only and not-yet-backfilled rows. */
7173
7508
  function CatalogVersionMark({ version, tip }) {
7174
7509
  if (typeof version !== "string" || version.length === 0) return null;
@@ -7257,6 +7592,36 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
7257
7592
  const names = Object.keys(left);
7258
7593
  return names.length === Object.keys(right).length && names.every((name) => left[name] === right[name]);
7259
7594
  }
7595
+ /** Same cap as `MAX_NOTE` in hot.ts; the server trims anything longer. */
7596
+ const NOTE_MAX = 200;
7597
+ /** `latest` is a semver for npm installs and a commit sha for github ones. */
7598
+ function displayLatest(latest) {
7599
+ if (/^\d/.test(latest)) return "v" + latest;
7600
+ if (/^[0-9a-f]{12,40}$/i.test(latest)) return latest.slice(0, 7);
7601
+ return latest;
7602
+ }
7603
+ /** The tail of a local checkout path; the full path stays in the title and the copy button. */
7604
+ function shortLocalPath(path) {
7605
+ const parts = path.replace(/[\\/]+$/, "").split(/[\\/]/).filter(Boolean);
7606
+ return parts.length <= 2 ? path : "…/" + parts.slice(-2).join("/");
7607
+ }
7608
+ /** A relative spec is resolved against the profile directory, so copying it elsewhere is meaningless. */
7609
+ function isAbsoluteLocalPath(path) {
7610
+ return /^(?:\/|~[\\/]|[A-Za-z]:[\\/]|\\\\)/.test(path);
7611
+ }
7612
+ /** `file:///abs` keeps one leading slash, like `file:/abs`. */
7613
+ function localPathOf(spec) {
7614
+ const match = /^(?:link|file):(?:\/\/(?=\/))?(.+)$/i.exec(spec);
7615
+ return match !== null ? match[1] : null;
7616
+ }
7617
+ /**
7618
+ * A development checkout or local package. A generation is the desktop host's
7619
+ * own install (#497) and is never one, even though its spec is a link:.
7620
+ */
7621
+ function isLocalDev(spec, status) {
7622
+ if (status?.kind === "generation" || isGenerationSpec(spec)) return false;
7623
+ return /^(?:link|file):/i.test(spec) || status?.kind === "linked";
7624
+ }
7260
7625
  /**
7261
7626
  * Whether one installed plugin has a pending update (either an ordinary
7262
7627
  * upgrade via npm/git/restore, or a host-managed generation release), and has
@@ -7583,6 +7948,9 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
7583
7948
  /** Ignores out-of-order /dsh-market/favorite responses after a newer toggle. */
7584
7949
  const favoriteOpGen = (0, react.useRef)(0);
7585
7950
  const [blockError, setBlockError] = (0, react.useState)(null);
7951
+ const [updateExemptError, setUpdateExemptError] = (0, react.useState)(null);
7952
+ const [updateExemptNotice, setUpdateExemptNotice] = (0, react.useState)(null);
7953
+ const updateExemptOpGen = (0, react.useRef)(0);
7586
7954
  /** Shown once a hide sticks, so the card vanishing has a place to look. */
7587
7955
  const [blockNotice, setBlockNotice] = (0, react.useState)(null);
7588
7956
  /** Ignores out-of-order /dsh-market/block responses after a newer toggle. */
@@ -7611,6 +7979,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
7611
7979
  const favoriteErrorDone = (0, react.useCallback)(() => setFavoriteError(null), []);
7612
7980
  const blockErrorDone = (0, react.useCallback)(() => setBlockError(null), []);
7613
7981
  const blockNoticeDone = (0, react.useCallback)(() => setBlockNotice(null), []);
7982
+ const updateExemptErrorDone = (0, react.useCallback)(() => setUpdateExemptError(null), []);
7983
+ const updateExemptNoticeDone = (0, react.useCallback)(() => setUpdateExemptNotice(null), []);
7614
7984
  const [updates, setUpdates] = (0, react.useState)({});
7615
7985
  /** Update reminders dismissed for this host boot. The Installed tab still
7616
7986
  * shows these plugins and their update actions; only proactive prompts use
@@ -7689,6 +8059,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
7689
8059
  const [favoriteUrls, setFavoriteUrls] = (0, react.useState)([]);
7690
8060
  /** Package names the user hid from Discover (#657). */
7691
8061
  const [blockedNames, setBlockedNames] = (0, react.useState)([]);
8062
+ const [updateExemptNames, setUpdateExemptNames] = (0, react.useState)([]);
7692
8063
  /** Rows the user asked to show the AUTHOR's description on, despite a note. */
7693
8064
  const [showTheirs, setShowTheirs] = (0, react.useState)([]);
7694
8065
  /** The row whose note is being edited, and the text in the box. */
@@ -7779,6 +8150,26 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
7779
8150
  */
7780
8151
  const [brokenPlugins, setBrokenPlugins] = (0, react.useState)({});
7781
8152
  const brokenPluginNames = (0, react.useMemo)(() => Object.keys(brokenPlugins), [brokenPlugins]);
8153
+ const [dismissBrokenError, setDismissBrokenError] = (0, react.useState)(null);
8154
+ /**
8155
+ * Per plugin, not one counter for the panel (#763 review).
8156
+ *
8157
+ * A shared generation made a second plugin's success swallow the first one's
8158
+ * FAILURE, so a notice the server still had stayed hidden on screen with no
8159
+ * error — the panel claimed a state the server did not have. Each name
8160
+ * carries its own counter, so only a LATER click on the SAME plugin can
8161
+ * supersede this one, and a different plugin's reply never can.
8162
+ */
8163
+ const dismissBrokenGen = (0, react.useRef)(/* @__PURE__ */ new Map());
8164
+ /**
8165
+ * Bumped by every authoritative `/installed` read. A dismiss whose reply
8166
+ * arrives after one was overtaken by that read: the panel is already showing
8167
+ * the server's truth, and rolling this failure back would put back a record
8168
+ * the read has since settled.
8169
+ */
8170
+ const installedReadGen = (0, react.useRef)(0);
8171
+ /** Rows with a dismiss in flight, so one row cannot queue two. */
8172
+ const [dismissingBroken, setDismissingBroken] = (0, react.useState)(() => /* @__PURE__ */ new Set());
7782
8173
  const [envFixing, setEnvFixing] = (0, react.useState)(false);
7783
8174
  const [envFailed, setEnvFailed] = (0, react.useState)(false);
7784
8175
  const [bootId, setBootId] = (0, react.useState)(null);
@@ -7857,6 +8248,10 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
7857
8248
  /** Install-command disclosure inside the confirm dialog. */
7858
8249
  const [cmdOpen, setCmdOpen] = (0, react.useState)(false);
7859
8250
  const [capsOpen, setCapsOpen] = (0, react.useState)(false);
8251
+ (0, react.useEffect)(() => {
8252
+ setCapsOpen(false);
8253
+ setCmdOpen(false);
8254
+ }, [confirming]);
7860
8255
  /** Per-row "why is it not live" disclosure (installed tab). */
7861
8256
  const [whyOpen, setWhyOpen] = (0, react.useState)(null);
7862
8257
  /** Restore-confirm dialog (replaces window.confirm). */
@@ -7908,10 +8303,12 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
7908
8303
  if (Array.isArray(body.groupOrder)) setGroupOrder(body.groupOrder);
7909
8304
  if (Array.isArray(body.favorites)) setFavoriteUrls(body.favorites.filter((url) => typeof url === "string"));
7910
8305
  if (Array.isArray(body.blocked)) setBlockedNames(body.blocked.filter((name) => typeof name === "string"));
8306
+ if (Array.isArray(body.updateExempt)) setUpdateExemptNames(body.updateExempt.filter((name) => typeof name === "string"));
7911
8307
  setInstalledBundles(Array.isArray(body.bundles) ? body.bundles.filter((name) => typeof name === "string") : []);
7912
8308
  if (body.activation && typeof body.activation === "object") setActivations(body.activation);
7913
8309
  const findings = body.diagnostics?.schema === "dsh-market/diagnostics/v1" && Array.isArray(body.diagnostics.findings) ? body.diagnostics.findings.filter(isHostDependencyFinding) : [];
7914
8310
  setBrokenPlugins(isRecordOfRecords(body.brokenPlugins) ? body.brokenPlugins : {});
8311
+ installedReadGen.current += 1;
7915
8312
  setHostDependencyFindings(findings);
7916
8313
  }).catch(() => {});
7917
8314
  fetch(api("/dsh-market/updates") + (force === true ? "?force=1" : ""), { cache: "no-store" }).then((res) => res.json()).then((body) => setUpdates(body.updates || {})).catch(() => {});
@@ -7921,6 +8318,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
7921
8318
  (0, react.useMemo)(() => new Set(disabledNames), [disabledNames]);
7922
8319
  const favoriteUrlSet = (0, react.useMemo)(() => new Set(favoriteUrls), [favoriteUrls]);
7923
8320
  const blockedNameSet = (0, react.useMemo)(() => new Set(blockedNames), [blockedNames]);
8321
+ const updateExemptSet = (0, react.useMemo)(() => new Set(updateExemptNames), [updateExemptNames]);
7924
8322
  /** Effective switch state: market disable list ∪ user-patch-layer disables. */
7925
8323
  const effectiveDisabledSet = (0, react.useMemo)(() => /* @__PURE__ */ new Set([
7926
8324
  ...disabledNames,
@@ -8522,7 +8920,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
8522
8920
  setDoneUrls((urls) => urls.filter((url) => url !== plugin.url));
8523
8921
  setHotUrls((urls) => urls.includes(plugin.url) ? urls : urls.concat(plugin.url));
8524
8922
  setHotNames((names) => names.includes(plugin.name) ? names : names.concat(plugin.name));
8525
- } else setDoneUrls((urls) => urls.includes(plugin.url) ? urls : urls.concat(plugin.url));
8923
+ } else if (body.activation?.[plugin.name]?.state !== "incompatible") setDoneUrls((urls) => urls.includes(plugin.url) ? urls : urls.concat(plugin.url));
8526
8924
  if (body.compatibility?.code === "soft-incompatible") setCompatibilityNotice(body.compatibility);
8527
8925
  setRecords((list) => patch(list, recordId, body.heldRelease !== void 0 ? {
8528
8926
  state: "warned",
@@ -8547,10 +8945,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
8547
8945
  setOperationsOpen(true);
8548
8946
  return;
8549
8947
  }
8550
- setRecords((list) => patch(list, recordId, {
8551
- state: "failed",
8552
- reason: t("busyWait")
8553
- }));
8948
+ setRecords((list) => patch(list, recordId, { state: "queued" }));
8554
8949
  setOperationsOpen(true);
8555
8950
  return;
8556
8951
  }
@@ -8878,11 +9273,9 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
8878
9273
  setOperationsOpen(true);
8879
9274
  return;
8880
9275
  }
8881
- setRecords((list) => patch(list, updateRecordId, {
8882
- state: "failed",
8883
- reason: t("busyWait")
8884
- }));
8885
- setInstallError(t("busyWait"));
9276
+ setRecords((list) => patch(list, updateRecordId, { state: "queued" }));
9277
+ setInstallError(t("queuedRunBusy"));
9278
+ setOperationsOpen(true);
8886
9279
  return;
8887
9280
  }
8888
9281
  if (body.hostIncompatible && typeof body.hostIncompatible === "object") {
@@ -9186,6 +9579,135 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9186
9579
  blockedNames,
9187
9580
  t
9188
9581
  ]);
9582
+ const toggleUpdateExempt = (0, react.useCallback)((name) => {
9583
+ const gen = ++updateExemptOpGen.current;
9584
+ const nextExempt = !updateExemptSet.has(name);
9585
+ const previous = updateExemptNames;
9586
+ setUpdateExemptError(null);
9587
+ setUpdateExemptNames((list) => {
9588
+ if (nextExempt) return list.includes(name) ? list : [...list, name];
9589
+ return list.filter((entry) => entry !== name);
9590
+ });
9591
+ fetch(api("/dsh-market/update-exempt"), {
9592
+ method: "POST",
9593
+ headers: { "content-type": "application/json" },
9594
+ body: JSON.stringify({
9595
+ name,
9596
+ exempt: nextExempt
9597
+ })
9598
+ }).then(async (res) => {
9599
+ const text = await res.text();
9600
+ let body = null;
9601
+ if (text !== "") try {
9602
+ body = JSON.parse(text);
9603
+ } catch {}
9604
+ return {
9605
+ status: res.status,
9606
+ body
9607
+ };
9608
+ }).then(({ status, body }) => {
9609
+ if (gen !== updateExemptOpGen.current) return;
9610
+ if (status === 200 && body?.ok === true && Array.isArray(body.updateExempt)) {
9611
+ setUpdateExemptNames(body.updateExempt.filter((entry) => typeof entry === "string"));
9612
+ setUpdateExemptNotice(t(nextExempt ? "updateExemptOn" : "updateExemptOff"));
9613
+ return;
9614
+ }
9615
+ setUpdateExemptNames(previous);
9616
+ setUpdateExemptError(typeof body?.error === "string" ? body.error : t("updateExemptFailed"));
9617
+ }).catch((error) => {
9618
+ if (gen !== updateExemptOpGen.current) return;
9619
+ setUpdateExemptNames(previous);
9620
+ setUpdateExemptError(String(error));
9621
+ });
9622
+ }, [
9623
+ updateExemptSet,
9624
+ updateExemptNames,
9625
+ t
9626
+ ]);
9627
+ /**
9628
+ * Stop showing one removed-declaration notice (#763).
9629
+ *
9630
+ * The notice is durable on purpose — it is the only thing left that says why
9631
+ * a plugin vanished — but the reporter's plugin was no longer in the catalog,
9632
+ * so the search it offered found nothing and the banner outlived every other
9633
+ * action. Hiding it says nothing about the plugin: the declaration stays
9634
+ * dropped and the directory stays where it is.
9635
+ *
9636
+ * Every step touches THIS name and nothing else, in both directions:
9637
+ *
9638
+ * - success removes this key and ignores the reply's map. That map is a
9639
+ * snapshot from when the request ran, so adopting it wholesale would
9640
+ * resurrect a notice another click had already dismissed, and would drop a
9641
+ * record an `/installed` read reported while this was in flight — including
9642
+ * one written by a failed update (#663), which is the one thing the notice
9643
+ * exists for.
9644
+ * - failure puts THIS key back, and only if no `/installed` read has landed
9645
+ * since: that read is the server's current truth and outranks a rollback
9646
+ * built from what the panel happened to be showing.
9647
+ *
9648
+ * A dismiss that silently did nothing is worse than having no button: the
9649
+ * user would go on believing they had been told the truth about their profile.
9650
+ */
9651
+ const dismissBrokenPlugin = (0, react.useCallback)((name) => {
9652
+ const record = brokenPlugins[name];
9653
+ if (record === void 0) return;
9654
+ const gens = dismissBrokenGen.current;
9655
+ const gen = (gens.get(name) ?? 0) + 1;
9656
+ gens.set(name, gen);
9657
+ const readAtRequest = installedReadGen.current;
9658
+ setDismissBrokenError(null);
9659
+ setDismissingBroken((current) => new Set(current).add(name));
9660
+ setBrokenPlugins((current) => {
9661
+ if (current[name] === void 0) return current;
9662
+ const next = { ...current };
9663
+ delete next[name];
9664
+ return next;
9665
+ });
9666
+ /** This request's own failure, applied to this one name only. */
9667
+ const restore = (reason) => {
9668
+ if (dismissBrokenGen.current.get(name) !== gen) return;
9669
+ if (installedReadGen.current === readAtRequest) setBrokenPlugins((current) => current[name] === void 0 ? {
9670
+ ...current,
9671
+ [name]: record
9672
+ } : current);
9673
+ setDismissBrokenError(reason);
9674
+ };
9675
+ fetch(api("/dsh-market/dismiss-broken"), {
9676
+ method: "POST",
9677
+ headers: { "content-type": "application/json" },
9678
+ body: JSON.stringify({ name })
9679
+ }).then(async (res) => {
9680
+ const text = await res.text();
9681
+ let body = null;
9682
+ if (text !== "") try {
9683
+ body = JSON.parse(text);
9684
+ } catch {}
9685
+ return {
9686
+ status: res.status,
9687
+ body
9688
+ };
9689
+ }).then(({ status, body }) => {
9690
+ if (status === 200 && body?.ok === true) {
9691
+ if (dismissBrokenGen.current.get(name) !== gen) return;
9692
+ setBrokenPlugins((current) => {
9693
+ if (current[name] === void 0) return current;
9694
+ const next = { ...current };
9695
+ delete next[name];
9696
+ return next;
9697
+ });
9698
+ return;
9699
+ }
9700
+ restore(typeof body?.error === "string" ? body.error : t("toggleFail"));
9701
+ }).catch((error) => {
9702
+ restore(String(error));
9703
+ }).finally(() => {
9704
+ setDismissingBroken((current) => {
9705
+ const next = new Set(current);
9706
+ next.delete(name);
9707
+ return next;
9708
+ });
9709
+ });
9710
+ }, [brokenPlugins, t]);
9189
9711
  const clearStaleFavorites = (0, react.useCallback)(() => {
9190
9712
  if (favoriteStale.length === 0) return;
9191
9713
  const gen = ++favoriteOpGen.current;
@@ -9306,6 +9828,20 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9306
9828
  updatingNameRef.current = updatingName;
9307
9829
  const removingNameRef = (0, react.useRef)(null);
9308
9830
  removingNameRef.current = removingName;
9831
+ /**
9832
+ * The records as of the last commit, for the drain's tick.
9833
+ *
9834
+ * The tick must not read the list out of its own `setRecords` updater.
9835
+ * React only runs that updater synchronously when the fiber has no pending
9836
+ * work (its eager-state optimization, react-dom dispatchSetState); an
9837
+ * interval tick regularly races the status poll's state writes, and when
9838
+ * the updater is deferred the read returns null BEFORE it runs — while the
9839
+ * updater still removes the row it finds when render finally calls it. The
9840
+ * drain then deleted a queued operation instead of starting it, and the
9841
+ * persistence effect rewrote the durable queue without it.
9842
+ */
9843
+ const recordsRef = (0, react.useRef)(records);
9844
+ recordsRef.current = records;
9309
9845
  const dataRef = (0, react.useRef)(null);
9310
9846
  dataRef.current = data;
9311
9847
  const doInstallRef = (0, react.useRef)(null);
@@ -9315,6 +9851,24 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9315
9851
  const doUninstallRef = (0, react.useRef)(null);
9316
9852
  doUninstallRef.current = doUninstall;
9317
9853
  /**
9854
+ * Whether a plugin operation started from THIS page is still in flight.
9855
+ *
9856
+ * The host runs one mutation at a time and answers a second one with 409
9857
+ * (routes.ts withMutationLock) rather than queueing it, so every start path
9858
+ * has to look before it fires. The catalog and installed cards do it by
9859
+ * disabling their button on `busyUrl`/`updatingName`/`removingName`; the
9860
+ * drain does it on these refs. The Tasks panel's "run now" asked only about
9861
+ * the agent guard, so a batch of clicks sent one request that ran and N-1
9862
+ * the host refused — and a refusal used to be recorded as a failure, which
9863
+ * is not part of the durable queue.
9864
+ *
9865
+ * Refs, not `statusRef.current.busy`: that sample is up to a whole poll
9866
+ * interval old, and the batch lands inside exactly that window. Asking the
9867
+ * host "are you busy" cannot answer a question about a request this page
9868
+ * has just sent.
9869
+ */
9870
+ const operationInFlight = (0, react.useCallback)(() => busyUrlRef.current !== null || updatingNameRef.current !== null || removingNameRef.current !== null, []);
9871
+ /**
9318
9872
  * The install queue drain: agents-busy 409s no longer ask the user to come
9319
9873
  * back later — the queued record runs itself once agents go idle and the
9320
9874
  * operation lock is free. Self-sufficient by design: when every operation
@@ -9327,7 +9881,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9327
9881
  let disposed = false;
9328
9882
  const timer = setInterval(() => {
9329
9883
  if (drainingRef.current) return;
9330
- if (busyUrlRef.current !== null || updatingNameRef.current !== null || removingNameRef.current !== null) return;
9884
+ if (operationInFlight()) return;
9331
9885
  fetch(api("/dsh-market/status"), { cache: "no-store" }).then((res) => res.json()).then((status) => {
9332
9886
  if (disposed) return;
9333
9887
  const runningAgents = Array.isArray(status.runningAgents) ? status.runningAgents.map(String) : [];
@@ -9337,17 +9891,10 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9337
9891
  runningAgents
9338
9892
  };
9339
9893
  if (busy || runningAgents.length > 0) return;
9340
- if (busyUrlRef.current !== null || updatingNameRef.current !== null || removingNameRef.current !== null) return;
9341
- let next = null;
9342
- let hasRunning = false;
9343
- setRecords((prev) => {
9344
- hasRunning = prev.some((record) => record.state === "running");
9345
- const found = prev.find((record) => record.state === "queued");
9346
- next = found ?? null;
9347
- return found === void 0 ? prev : prev.filter((record) => record.id !== found.id);
9348
- });
9349
- if (next === null || hasRunning) return;
9350
- const task = next;
9894
+ if (operationInFlight()) return;
9895
+ const task = recordsRef.current.find((record) => record.state === "queued");
9896
+ if (task === void 0 || recordsRef.current.some((record) => record.state === "running")) return;
9897
+ setRecords((list) => list.filter((record) => record.id !== task.id));
9351
9898
  drainingRef.current = true;
9352
9899
  try {
9353
9900
  if (task.kind === "install") {
@@ -9373,6 +9920,11 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9373
9920
  setOperationsOpen(true);
9374
9921
  return;
9375
9922
  }
9923
+ if (operationInFlight() || statusRef.current.busy) {
9924
+ setInstallError(t("queuedRunBusy"));
9925
+ setOperationsOpen(true);
9926
+ return;
9927
+ }
9376
9928
  if (record.kind === "install") {
9377
9929
  const plugin = data?.plugins.find((candidate) => candidate.url === record.url);
9378
9930
  if (plugin === void 0) {
@@ -9395,6 +9947,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9395
9947
  doInstall,
9396
9948
  doUpdate,
9397
9949
  doUninstall,
9950
+ operationInFlight,
9398
9951
  t
9399
9952
  ]);
9400
9953
  /** Live enable/disable of one installed plugin (#60). `reload` opts the
@@ -9607,9 +10160,10 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9607
10160
  const updatableNames = Object.keys(installed).filter((name) => name !== selfName && !effectiveDisabledSet.has(name) && isPluginUpdatable(name, String(installed[name]), updates[name], updatedNames));
9608
10161
  const batchUpdatableNames = updatableNames.filter((name) => updates[name]?.restoreRequired !== true);
9609
10162
  const ignoredUpdateSet = (0, react.useMemo)(() => new Set(ignoredUpdateNames), [ignoredUpdateNames]);
9610
- const reminderUpdatableNames = updatableNames.filter((name) => !ignoredUpdateSet.has(name) && !installedBlocked(name));
9611
- const reminderBatchUpdatableNames = batchUpdatableNames.filter((name) => !ignoredUpdateSet.has(name) && !installedBlocked(name));
9612
- const reminderUpdateNames = [...updates[selfName]?.updateAvailable === true && !updatedNames.includes(selfName) ? [selfName] : [], ...updatableNames].filter((name) => !ignoredUpdateSet.has(name) && !installedBlocked(name));
10163
+ const quietUpdateSet = (0, react.useMemo)(() => /* @__PURE__ */ new Set([...ignoredUpdateNames, ...updateExemptNames]), [ignoredUpdateNames, updateExemptNames]);
10164
+ const reminderUpdatableNames = updatableNames.filter((name) => !quietUpdateSet.has(name) && !installedBlocked(name));
10165
+ const reminderBatchUpdatableNames = batchUpdatableNames.filter((name) => !quietUpdateSet.has(name) && !installedBlocked(name));
10166
+ const reminderUpdateNames = [...updates[selfName]?.updateAvailable === true && !updatedNames.includes(selfName) ? [selfName] : [], ...updatableNames].filter((name) => !quietUpdateSet.has(name) && !installedBlocked(name));
9613
10167
  const installedOtherCount = Object.keys(installed).filter((name) => name !== selfName).length;
9614
10168
  const ignoreUpdateNotices = (0, react.useCallback)((names) => {
9615
10169
  if (bootId === null || names.length === 0) return;
@@ -9624,6 +10178,19 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9624
10178
  return next;
9625
10179
  });
9626
10180
  }, [bootId]);
10181
+ const unignoreUpdateNotice = (0, react.useCallback)((name) => {
10182
+ if (bootId === null) return;
10183
+ setIgnoredUpdateNames((current) => {
10184
+ const next = current.filter((n) => n !== name);
10185
+ try {
10186
+ sessionStorage.setItem(IGNORED_UPDATES_SESSION_KEY, JSON.stringify({
10187
+ boot: bootId,
10188
+ names: next
10189
+ }));
10190
+ } catch {}
10191
+ return next;
10192
+ });
10193
+ }, [bootId]);
9627
10194
  const doUpdateAll = (0, react.useCallback)(() => {
9628
10195
  const names = reminderBatchUpdatableNames.slice();
9629
10196
  setUpdatingAll(true);
@@ -9896,8 +10463,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9896
10463
  const aOn = effectiveDisabledSet.has(nameA) ? 0 : 1;
9897
10464
  const bOn = effectiveDisabledSet.has(nameB) ? 0 : 1;
9898
10465
  if (aOn !== bOn) return bOn - aOn;
9899
- const aUp = isPluginUpdatable(nameA, String(specA), updates[nameA], updatedNames, ignoredUpdateSet) ? 1 : 0;
9900
- return (isPluginUpdatable(nameB, String(specB), updates[nameB], updatedNames, ignoredUpdateSet) ? 1 : 0) - aUp;
10466
+ const aUp = isPluginUpdatable(nameA, String(specA), updates[nameA], updatedNames, quietUpdateSet) ? 1 : 0;
10467
+ return (isPluginUpdatable(nameB, String(specB), updates[nameB], updatedNames, quietUpdateSet) ? 1 : 0) - aUp;
9901
10468
  });
9902
10469
  }, [
9903
10470
  isInstalledListActive,
@@ -9965,12 +10532,23 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9965
10532
  const hidden = aliases.some((alias) => blockedNameSet.has(alias));
9966
10533
  const removing = removingName === name;
9967
10534
  const uninstallBusy = removingName !== null || busyUrl !== null || updatingName !== null;
10535
+ const spec = String(installed[name] ?? "");
10536
+ const status = updates[name];
10537
+ const localDev = isLocalDev(spec, status);
10538
+ const exempt = updateExemptSet.has(name);
10539
+ const updatable = isPluginUpdatable(name, spec, status, updatedNames);
10540
+ const showExempt = !localDev || exempt || updatable;
10541
+ const showBootIgnore = bootId !== null && !exempt && !ignoredUpdateSet.has(name) && updatable;
10542
+ const showRestore = localDev && !(status?.updateAvailable === true && status.restoreRequired === true);
9968
10543
  return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
9969
10544
  open: installedMenuName === name,
9970
10545
  onClose: () => setInstalledMenuName(null),
9971
10546
  onSelect: (id) => {
9972
10547
  setInstalledMenuName(null);
10548
+ if (id === "restore-online" && data !== null && !uninstallBusy) askRestore(name);
9973
10549
  if (id === "block") toggleBlock(blockToggleName(aliases));
10550
+ if (id === "update-exempt") toggleUpdateExempt(name);
10551
+ if (id === "ignore-boot") ignoreUpdateNotices([name]);
9974
10552
  if (id === "uninstall" && !uninstallBusy) setRemoveConfirm(name);
9975
10553
  },
9976
10554
  align: "end",
@@ -9983,10 +10561,23 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9983
10561
  children: "···"
9984
10562
  }),
9985
10563
  items: [
10564
+ ...showRestore ? [{
10565
+ id: "restore-online",
10566
+ label: t("restoreOnline"),
10567
+ disabled: data === null || uninstallBusy
10568
+ }] : [],
9986
10569
  {
9987
10570
  id: "block",
9988
10571
  label: hidden ? t("blockRemove") : t("blockAdd")
9989
10572
  },
10573
+ ...showBootIgnore ? [{
10574
+ id: "ignore-boot",
10575
+ label: t("ignoreUpdateNotice")
10576
+ }] : [],
10577
+ ...showExempt ? [{
10578
+ id: "update-exempt",
10579
+ label: exempt ? t("updateExemptRemove") : t("updateExemptAdd")
10580
+ }] : [],
9990
10581
  {
9991
10582
  type: "separator",
9992
10583
  id: "uninstall-sep"
@@ -10075,45 +10666,42 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
10075
10666
  size: 14,
10076
10667
  className: Market_module_css_default.bannerIcon
10077
10668
  }), " " + redLineLabel(line)]
10078
- }, line)), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
10079
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconQuestionOutline14, { size: 16 }),
10669
+ }, line)), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(ConfirmFold, {
10670
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConfirmCapabilityIcon, {}),
10080
10671
  title: t("capabilityTitle"),
10081
10672
  open: capsOpen,
10082
- expandable: true,
10083
- expandOnRowClick: true,
10084
10673
  onToggle: () => setCapsOpen((o) => !o),
10085
- children: [
10086
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10087
- className: Market_module_css_default.caps,
10088
- children: [p.capabilities === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10089
- className: Market_module_css_default.capMuted,
10090
- "data-state": "unchecked",
10091
- children: t("capabilityUnchecked")
10092
- }) : p.capabilities.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10093
- className: Market_module_css_default.capMuted,
10094
- "data-state": "none",
10095
- children: t("capabilityNone")
10096
- }) : p.capabilities.map((name) => HostTag !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(HostTag, {
10097
- tone: "outline",
10098
- className: Market_module_css_default.capChip,
10099
- children: capabilityLabel(name)
10100
- }, name) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10101
- className: Market_module_css_default.capChip,
10102
- children: capabilityLabel(name)
10103
- }, name)), redLines.filter((line) => !redLineIsUrgent(line)).map((line) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10104
- className: Market_module_css_default.capFact,
10105
- children: redLineLabel(line)
10106
- }, line))]
10107
- }),
10108
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
10109
- className: Market_module_css_default.capCaveat,
10674
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10675
+ className: Market_module_css_default.caps,
10676
+ children: [p.capabilities === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10677
+ className: Market_module_css_default.capMuted,
10678
+ "data-state": "unchecked",
10679
+ children: t("capabilityUnchecked")
10680
+ }) : p.capabilities.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10681
+ className: Market_module_css_default.capMuted,
10682
+ "data-state": "none",
10683
+ children: t("capabilityNone")
10684
+ }) : p.capabilities.map((name) => HostTag !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(HostTag, {
10685
+ tone: "outline",
10686
+ className: Market_module_css_default.capChip,
10687
+ children: capabilityLabel(name)
10688
+ }, name) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10689
+ className: Market_module_css_default.capChip,
10690
+ children: capabilityLabel(name)
10691
+ }, name)), redLines.filter((line) => !redLineIsUrgent(line)).map((line) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10692
+ className: Market_module_css_default.capFact,
10693
+ children: redLineLabel(line)
10694
+ }, line))]
10695
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
10696
+ className: Market_module_css_default.capCaveat,
10697
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10698
+ className: Market_module_css_default.capCaveatNote,
10110
10699
  children: t("capabilityNote")
10111
- }),
10112
- typeof p.capabilityCheckedAt === "string" && p.capabilityCheckedAt.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
10113
- className: Market_module_css_default.capCaveat,
10700
+ }), typeof p.capabilityCheckedAt === "string" && p.capabilityCheckedAt.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10701
+ className: Market_module_css_default.capCaveatAt,
10114
10702
  children: t("capabilityScannedAt").replace("{0}", p.capabilityCheckedAt.slice(0, 10))
10115
- })
10116
- ]
10703
+ })]
10704
+ })]
10117
10705
  })] });
10118
10706
  };
10119
10707
  /**
@@ -10744,7 +11332,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
10744
11332
  (() => {
10745
11333
  const self = installed["dshmarket"] !== void 0 ? "dshmarket" : "dsh-market";
10746
11334
  const status = updates[self];
10747
- return status && status.updateAvailable && !updatedNames.includes(self) && !ignoredUpdateSet.has(self) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
11335
+ return status && status.updateAvailable && !updatedNames.includes(self) && !quietUpdateSet.has(self) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
10748
11336
  variant: "primary",
10749
11337
  size: "sm",
10750
11338
  disabled: updatingName !== null || busyUrl !== null,
@@ -11044,24 +11632,41 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
11044
11632
  findings: hostDependencyFindings,
11045
11633
  t
11046
11634
  }),
11047
- tab === "installed" && brokenPluginNames.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
11635
+ tab === "installed" && brokenPluginNames.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11048
11636
  className: Market_module_css_default.brokenPluginNotice,
11049
- children: brokenPluginNames.map((name) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11637
+ children: [brokenPluginNames.map((name) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11050
11638
  className: Market_module_css_default.brokenPluginItem,
11051
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11639
+ children: [
11640
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11641
+ className: Market_module_css_default.brokenPluginText,
11642
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: t("brokenPluginTitle").replace("{0}", name) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("brokenPluginBody") })]
11643
+ }),
11644
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
11645
+ variant: "outline",
11646
+ size: "sm",
11647
+ onClick: () => {
11648
+ setCat("all");
11649
+ setQ(name);
11650
+ setTab("discover");
11651
+ },
11652
+ children: t("brokenPluginAction")
11653
+ }),
11654
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
11655
+ variant: "ghost",
11656
+ size: "sm",
11657
+ disabled: dismissingBroken.has(name),
11658
+ onClick: () => dismissBrokenPlugin(name),
11659
+ children: t("brokenPluginDismiss")
11660
+ })
11661
+ ]
11662
+ }, name)), dismissBrokenError !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
11663
+ className: Market_module_css_default.brokenPluginItem,
11664
+ role: "alert",
11665
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11052
11666
  className: Market_module_css_default.brokenPluginText,
11053
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: t("brokenPluginTitle").replace("{0}", name) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("brokenPluginBody") })]
11054
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
11055
- variant: "outline",
11056
- size: "sm",
11057
- onClick: () => {
11058
- setCat("all");
11059
- setQ(name);
11060
- setTab("discover");
11061
- },
11062
- children: t("brokenPluginAction")
11063
- })]
11064
- }, name))
11667
+ children: dismissBrokenError
11668
+ })
11669
+ })]
11065
11670
  })
11066
11671
  ]
11067
11672
  }),
@@ -11169,6 +11774,10 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
11169
11774
  onScroll: (e) => {
11170
11775
  const show = e.currentTarget.scrollTop > 400;
11171
11776
  setShowTop((prev) => prev === show ? prev : show);
11777
+ setPluginMenuUrl(null);
11778
+ setInstalledMenuName(null);
11779
+ setGroupMenuFor(null);
11780
+ setAssignFor(null);
11172
11781
  },
11173
11782
  children: tab === "backup" ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11174
11783
  className: Market_module_css_default.backupGrid,
@@ -12067,12 +12676,13 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
12067
12676
  const entry = data === null ? void 0 : catalogEntryForInstalled(data.plugins, name, String(spec), repoIdentities[name], repoHints[name]);
12068
12677
  const status = updates[name];
12069
12678
  const generation = status?.kind === "generation" || isGenerationSpec(String(spec));
12070
- const localDev = !generation && (/^(?:link|file):/i.test(String(spec)) || status?.kind === "linked");
12679
+ const localDev = isLocalDev(String(spec), status);
12071
12680
  const act = activations[name];
12072
12681
  const meta = act !== void 0 ? activationMeta(act.state, t, act.dependencyOf) : null;
12073
12682
  const version = status && status.version ? "v" + status.version : "";
12074
12683
  const specText = String(spec);
12075
12684
  const specRedundant = version !== "" && /^[\^~]?\d/.test(specText);
12685
+ const localPath = localPathOf(specText);
12076
12686
  const ghSpec = /^github:([A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+?)(?:#|$)/.exec(specText);
12077
12687
  const repoUrl = entry !== void 0 ? entry.url : ghSpec !== null ? "https://github.com/" + ghSpec[1] : null;
12078
12688
  const off = effectiveDisabledSet.has(name);
@@ -12086,74 +12696,103 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
12086
12696
  className: Market_module_css_default.irowHead,
12087
12697
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12088
12698
  className: `${Market_module_css_default.nm} ${Market_module_css_default.irowName}`,
12089
- children: [
12090
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12091
- className: Market_module_css_default.irowNameText,
12092
- children: repoUrl !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
12093
- className: Market_module_css_default.nameLink,
12094
- href: repoUrl + "#readme",
12095
- target: "_blank",
12096
- rel: "noreferrer",
12097
- title: name,
12098
- "aria-label": `${name} — ${t("readme")}`,
12099
- children: name
12100
- }) : name
12101
- }),
12102
- entry?.deprecated === true && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12103
- className: Market_module_css_default.depBadge,
12104
- children: t("deprecatedBadge")
12105
- }),
12106
- version && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12107
- className: Market_module_css_default.owner,
12108
- title: version,
12109
- children: version
12110
- })
12111
- ]
12112
- }), localDev && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12113
- className: Market_module_css_default.irowDevTag,
12114
- title: t("linkedDev"),
12115
- role: "status",
12116
- children: t("linkedDev")
12699
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12700
+ className: Market_module_css_default.irowNameText,
12701
+ children: repoUrl !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
12702
+ className: Market_module_css_default.nameLink,
12703
+ href: repoUrl + "#readme",
12704
+ target: "_blank",
12705
+ rel: "noreferrer",
12706
+ title: name,
12707
+ "aria-label": `${name} — ${t("readme")}`,
12708
+ children: name
12709
+ }) : name
12710
+ }), entry?.deprecated === true && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12711
+ className: Market_module_css_default.depBadge,
12712
+ children: t("deprecatedBadge")
12713
+ })]
12714
+ }), !missing && name !== "dsh-market" && name !== "dshmarket" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12715
+ className: Market_module_css_default.irowMenu,
12716
+ children: renderInstalledBlockMenu(name)
12117
12717
  })]
12118
12718
  }),
12119
- specRedundant ? null : repoUrl !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
12120
- className: `${Market_module_css_default.spec} ${Market_module_css_default.src}`,
12121
- href: repoUrl,
12122
- target: "_blank",
12123
- rel: "noreferrer",
12124
- children: specText
12125
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12126
- className: Market_module_css_default.spec,
12127
- children: specText
12719
+ (version !== "" || localDev) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12720
+ className: Market_module_css_default.irowMeta,
12721
+ children: [version, localDev ? t("linkedDev") : ""].filter(Boolean).join(" · ")
12128
12722
  }),
12129
- notingName === name ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12130
- className: Market_module_css_default.noteEdit,
12723
+ specRedundant ? null : localPath !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12724
+ className: Market_module_css_default.irowPath,
12131
12725
  children: [
12132
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Input, {
12133
- className: Market_module_css_default.noteInput,
12134
- value: noteDraft,
12135
- maxLength: 200,
12136
- autoFocus: true,
12137
- placeholder: t("notePlaceholder"),
12138
- onChange: (e) => setNoteDraft(e.target.value),
12139
- onKeyDown: (e) => {
12140
- if (e.key === "Enter") saveNote(name, noteDraft);
12141
- if (e.key === "Escape") setNotingName(null);
12142
- }
12726
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12727
+ className: Market_module_css_default.irowPathIcon,
12728
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconFolderOpen16, { size: 14 })
12143
12729
  }),
12144
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
12145
- variant: "outline",
12146
- size: "sm",
12147
- onClick: () => saveNote(name, noteDraft),
12148
- children: t("noteSave")
12730
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12731
+ className: Market_module_css_default.spec,
12732
+ title: localPath,
12733
+ children: shortLocalPath(localPath)
12149
12734
  }),
12150
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
12151
- variant: "ghost",
12152
- size: "sm",
12153
- onClick: () => setNotingName(null),
12154
- children: t("cancel")
12735
+ isAbsoluteLocalPath(localPath) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12736
+ className: Market_module_css_default.irowPathCopy,
12737
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConfirmCopyButton, {
12738
+ text: localPath,
12739
+ label: t("copyPath"),
12740
+ copiedLabel: t("pathCopied")
12741
+ })
12155
12742
  })
12156
12743
  ]
12744
+ }) : repoUrl !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12745
+ className: Market_module_css_default.irowPath,
12746
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12747
+ className: Market_module_css_default.irowPathIcon,
12748
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconLinkOutline14, { size: 14 })
12749
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
12750
+ className: `${Market_module_css_default.spec} ${Market_module_css_default.src}`,
12751
+ href: repoUrl,
12752
+ target: "_blank",
12753
+ rel: "noreferrer",
12754
+ children: specText
12755
+ })]
12756
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12757
+ className: Market_module_css_default.spec,
12758
+ children: specText
12759
+ }),
12760
+ notingName === name ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12761
+ className: Market_module_css_default.noteEdit,
12762
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Input, {
12763
+ className: Market_module_css_default.noteInput,
12764
+ value: noteDraft,
12765
+ maxLength: NOTE_MAX,
12766
+ autoFocus: true,
12767
+ placeholder: t("notePlaceholder"),
12768
+ onChange: (e) => setNoteDraft(e.target.value),
12769
+ onKeyDown: (e) => {
12770
+ if (e.nativeEvent.isComposing || e.keyCode === 229) return;
12771
+ if (e.key === "Enter") saveNote(name, noteDraft);
12772
+ if (e.key === "Escape") setNotingName(null);
12773
+ }
12774
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12775
+ className: Market_module_css_default.noteEditBar,
12776
+ children: [
12777
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12778
+ className: Market_module_css_default.noteCount,
12779
+ "aria-hidden": "true",
12780
+ children: `${noteDraft.length}/${NOTE_MAX}`
12781
+ }),
12782
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
12783
+ variant: "ghost",
12784
+ size: "sm",
12785
+ onClick: () => setNotingName(null),
12786
+ children: t("cancel")
12787
+ }),
12788
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
12789
+ variant: "primary",
12790
+ size: "sm",
12791
+ onClick: () => saveNote(name, noteDraft),
12792
+ children: t("noteSave")
12793
+ })
12794
+ ]
12795
+ })]
12157
12796
  }) : (() => {
12158
12797
  const note = notes[name];
12159
12798
  const authored = entry?.description && (entry.description[lang] || entry.description.en) || "";
@@ -12162,10 +12801,13 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
12162
12801
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12163
12802
  className: `${Market_module_css_default.desc} ${Market_module_css_default.descTight} ${Market_module_css_default.noteRow}`,
12164
12803
  children: [
12165
- shown !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12166
- className: note !== void 0 && !theirs ? Market_module_css_default.noteMine : void 0,
12167
- children: shown
12168
- }),
12804
+ shown !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CardDesc, {
12805
+ text: shown,
12806
+ t,
12807
+ lines: 3,
12808
+ className: Market_module_css_default.irowDesc,
12809
+ textClassName: note !== void 0 && !theirs ? Market_module_css_default.noteMine : void 0
12810
+ }, shown),
12169
12811
  note !== void 0 && authored !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12170
12812
  type: "button",
12171
12813
  className: Market_module_css_default.noteToggle,
@@ -12174,38 +12816,79 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
12174
12816
  onClick: () => setShowTheirs((list) => theirs ? list.filter((n) => n !== name) : list.concat(name)),
12175
12817
  children: theirs ? t("noteMine") : t("noteTheirs")
12176
12818
  }),
12177
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12819
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
12178
12820
  type: "button",
12179
- className: `${Market_module_css_default.noteToggle} ${Market_module_css_default.noteAction}`,
12180
- title: note === void 0 ? t("noteAdd") : t("noteEdit"),
12181
- "aria-label": note === void 0 ? t("noteAdd") : t("noteEdit"),
12821
+ className: Market_module_css_default.noteAdd,
12182
12822
  onClick: () => {
12183
12823
  setNoteDraft(note ?? "");
12184
12824
  setNotingName(name);
12185
12825
  },
12186
- children: note === void 0 ? t("noteAdd") : t("noteEdit")
12826
+ children: [note === void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconPlus, { size: 14 }), note === void 0 ? t("noteAdd") : t("noteEdit")]
12187
12827
  })
12188
12828
  ]
12189
12829
  });
12190
12830
  })(),
12191
- isPluginUpdatable(name, String(spec), status, []) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12192
- className: Market_module_css_default.noteRow,
12193
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12194
- type: "button",
12195
- className: Market_module_css_default.notesLink,
12196
- onClick: () => openNotes(name, status.current ?? null, status.latest ?? null, repoUrl),
12197
- children: `▸ ${t("notesLink")}`
12198
- }), bootId !== null && (ignoredUpdateSet.has(name) ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12199
- className: Market_module_css_default.metaInline,
12200
- children: t("updateNoticeIgnored")
12201
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12202
- type: "button",
12203
- className: Market_module_css_default.noteToggle,
12204
- "aria-label": `${t("ignoreUpdateNotice")} ${name}`,
12205
- onClick: () => ignoreUpdateNotices([name]),
12206
- children: t("ignoreUpdateNotice")
12207
- }))]
12208
- }),
12831
+ (() => {
12832
+ const updatable = isPluginUpdatable(name, String(spec), status, updatedNames);
12833
+ const exempt = updateExemptSet.has(name);
12834
+ if (!updatable && !exempt) return null;
12835
+ const ignored = !exempt && bootId !== null && ignoredUpdateSet.has(name);
12836
+ const sep = /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12837
+ className: Market_module_css_default.irowStatusSep,
12838
+ "aria-hidden": "true",
12839
+ children: "·"
12840
+ });
12841
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [updatable && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12842
+ className: Market_module_css_default.irowStatus,
12843
+ children: [!generation && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
12844
+ className: Market_module_css_default.irowStatusPart,
12845
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12846
+ className: Market_module_css_default.irowStatusFact,
12847
+ children: status?.latest != null ? t("hostUpdateReady").replace("{0}", displayLatest(status.latest)) : t("updateAvailableShort")
12848
+ }), sep]
12849
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12850
+ type: "button",
12851
+ className: Market_module_css_default.notesLink,
12852
+ onClick: () => openNotes(name, status?.current ?? null, status?.latest ?? null, repoUrl),
12853
+ children: `${t("notesLink")} ›`
12854
+ })]
12855
+ }), (exempt || ignored) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12856
+ className: Market_module_css_default.irowStatus,
12857
+ children: [
12858
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12859
+ className: Market_module_css_default.irowStatusIcon,
12860
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconBellOff, { size: 16 })
12861
+ }),
12862
+ exempt ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12863
+ className: Market_module_css_default.metaInline,
12864
+ title: t("updateExemptHint"),
12865
+ role: "status",
12866
+ children: t("updateExemptMark")
12867
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12868
+ className: Market_module_css_default.metaInline,
12869
+ role: "status",
12870
+ children: t("updateNoticeIgnored")
12871
+ }),
12872
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12873
+ className: Market_module_css_default.irowStatusAction,
12874
+ children: exempt ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12875
+ type: "button",
12876
+ className: Market_module_css_default.noteToggle,
12877
+ title: t("updateExemptHint"),
12878
+ "aria-label": `${t("updateExemptRestore")} ${name}`,
12879
+ onClick: () => toggleUpdateExempt(name),
12880
+ children: t("updateExemptRestore")
12881
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12882
+ type: "button",
12883
+ className: Market_module_css_default.noteToggle,
12884
+ "aria-label": `${t("updateExemptRestore")} ${name}`,
12885
+ onClick: () => unignoreUpdateNotice(name),
12886
+ children: t("updateExemptRestore")
12887
+ })
12888
+ })
12889
+ ]
12890
+ })] });
12891
+ })(),
12209
12892
  !off && act !== void 0 && meta !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12210
12893
  className: Market_module_css_default.act,
12211
12894
  children: [meta.dot !== "done" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
@@ -12344,15 +13027,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
12344
13027
  else doUpdate(name);
12345
13028
  },
12346
13029
  children: status.restoreRequired === true ? t("restoreOnline") : t("update")
12347
- }) : localDev ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12348
- type: "button",
12349
- className: Market_module_css_default.metaTagAction,
12350
- title: `${t("restore")} — ${t("restoreOnline")}`,
12351
- "aria-label": t("restore"),
12352
- disabled: data === null || removingName !== null || busyUrl !== null || updatingName !== null,
12353
- onClick: () => askRestore(name),
12354
- children: t("restore")
12355
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
13030
+ }) : localDev ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12356
13031
  className: Market_module_css_default.metaTag,
12357
13032
  title: t("upToDate"),
12358
13033
  children: t("upToDate")
@@ -12360,8 +13035,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
12360
13035
  removingName === name && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12361
13036
  className: Market_module_css_default.metaTag,
12362
13037
  children: t("uninstalling")
12363
- }),
12364
- !missing && name !== "dsh-market" && name !== "dshmarket" && renderInstalledBlockMenu(name)
13038
+ })
12365
13039
  ]
12366
13040
  })
12367
13041
  ]
@@ -12561,131 +13235,141 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
12561
13235
  })
12562
13236
  });
12563
13237
  })(),
12564
- confirming !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
13238
+ confirming !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
12565
13239
  open: true,
12566
- onClose: () => {
12567
- setConfirming(null);
12568
- setCmdOpen(false);
12569
- },
13240
+ className: Market_module_css_default.confirmModal,
13241
+ contentClassName: Market_module_css_default.confirmContent,
13242
+ onClose: () => setConfirming(null),
12570
13243
  title: t("confirmTitle") + " " + confirming.name + "?",
12571
13244
  footer: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
12572
13245
  variant: "ghost",
12573
- onClick: () => {
12574
- setConfirming(null);
12575
- setCmdOpen(false);
12576
- },
13246
+ onClick: () => setConfirming(null),
12577
13247
  children: t("cancel")
12578
13248
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
12579
13249
  variant: "primary",
12580
13250
  onClick: () => doInstall(confirming),
12581
13251
  children: t("confirmInstall")
12582
13252
  })] }),
12583
- children: [
12584
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12585
- className: Market_module_css_default.byline,
12586
- children: [
12587
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OwnerAvatar, {
12588
- name: confirming.name,
12589
- owner: confirming.owner || ""
12590
- }),
12591
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12592
- className: Market_module_css_default.owner,
12593
- title: confirming.owner,
12594
- children: confirming.owner
12595
- }),
12596
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CatalogVersionMark, {
12597
- version: confirming.version,
12598
- tip: catalogVersionTip
12599
- }),
12600
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DownloadCount, {
12601
- plugin: confirming,
12602
- t
12603
- }),
12604
- typeof confirming.stars === "number" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
12605
- label: String(confirming.stars),
12606
- side: "top",
12607
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
13253
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
13254
+ className: Market_module_css_default.confirmBody,
13255
+ children: [
13256
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
13257
+ className: Market_module_css_default.byline,
13258
+ children: [
13259
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OwnerAvatar, {
13260
+ name: confirming.name,
13261
+ owner: confirming.owner || ""
13262
+ }),
13263
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
13264
+ className: Market_module_css_default.owner,
13265
+ title: confirming.owner,
13266
+ children: confirming.owner
13267
+ }),
13268
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CatalogVersionMark, {
13269
+ version: confirming.version,
13270
+ tip: catalogVersionTip
13271
+ }),
13272
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DownloadCount, {
13273
+ plugin: confirming,
13274
+ t
13275
+ }),
13276
+ typeof confirming.stars === "number" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12608
13277
  className: Market_module_css_default.star,
12609
13278
  children: "· ★ " + formatCount(confirming.stars)
13279
+ }),
13280
+ confirming.added && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
13281
+ className: Market_module_css_default.star,
13282
+ title: t("published"),
13283
+ children: `· ${confirming.added}`
12610
13284
  })
12611
- }),
12612
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: Market_module_css_default.grow }),
12613
- pluginCategories(confirming).map((category) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
13285
+ ]
13286
+ }),
13287
+ pluginCategories(confirming).length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
13288
+ className: Market_module_css_default.confirmTags,
13289
+ children: pluginCategories(confirming).map((category) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12614
13290
  className: Market_module_css_default.tag,
12615
13291
  children: data.categories[category] && (data.categories[category][lang] || data.categories[category].en) || category
12616
13292
  }, category))
12617
- ]
12618
- }),
12619
- confirming.added && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12620
- className: Market_module_css_default.metaInline,
12621
- children: t("published") + " " + confirming.added
12622
- }),
12623
- downloadStatsText(confirming, t) !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12624
- className: Market_module_css_default.metaInline,
12625
- children: downloadStatsText(confirming, t)
12626
- }),
12627
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CardDesc, {
12628
- text: confirming.description && (confirming.description[lang] || confirming.description.en) || "",
12629
- t
12630
- }),
12631
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ScreenshotStrip, {
12632
- plugin: confirming,
12633
- onOpen: openLightbox
12634
- }),
12635
- capabilityDetail(confirming),
12636
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
12637
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCodeOutline16, { size: 16 }),
12638
- title: t("cmdDetails"),
12639
- open: cmdOpen,
12640
- expandable: true,
12641
- expandOnRowClick: true,
12642
- onToggle: () => setCmdOpen((o) => !o),
12643
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12644
- className: Market_module_css_default.cmd,
12645
- children: confirming.install
13293
+ }),
13294
+ (() => {
13295
+ const text = confirming.description && (confirming.description[lang] || confirming.description.en) || "";
13296
+ return text === "" ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
13297
+ className: Market_module_css_default.confirmDesc,
13298
+ children: text
13299
+ });
13300
+ })(),
13301
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ScreenshotStrip, {
13302
+ plugin: confirming,
13303
+ onOpen: openLightbox
13304
+ }),
13305
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
13306
+ className: Market_module_css_default.confirmFold,
13307
+ children: [capabilityDetail(confirming), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConfirmFold, {
13308
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConfirmTerminalIcon, {}),
13309
+ title: t("cmdDetails"),
13310
+ open: cmdOpen,
13311
+ onToggle: () => setCmdOpen((o) => !o),
13312
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
13313
+ className: Market_module_css_default.confirmCmd,
13314
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
13315
+ className: Market_module_css_default.cmd,
13316
+ children: confirming.install
13317
+ }), typeof confirming.install === "string" && confirming.install !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConfirmCopyButton, {
13318
+ text: confirming.install,
13319
+ label: t("cmdCopy"),
13320
+ copiedLabel: t("cmdCopied")
13321
+ })]
13322
+ })
13323
+ })]
13324
+ }),
13325
+ (looksTerminal(confirming, lang) || confirming.deprecated === true) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
13326
+ className: Market_module_css_default.installCaution,
13327
+ children: [
13328
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
13329
+ className: Market_module_css_default.installCautionLabel,
13330
+ children: t("installCaution")
13331
+ }),
13332
+ looksTerminal(confirming, lang) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
13333
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
13334
+ className: Market_module_css_default.installCautionHead,
13335
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConfirmWarnIcon, {}), t("terminalCautionTitle")]
13336
+ }),
13337
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
13338
+ className: Market_module_css_default.installCautionBody,
13339
+ children: t("terminalCautionBody")
13340
+ }),
13341
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
13342
+ className: Market_module_css_default.installCautionFoot,
13343
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("terminalCautionStartup") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
13344
+ className: Market_module_css_default.installCautionLink,
13345
+ href: confirming.url + "#readme",
13346
+ target: "_blank",
13347
+ rel: "noreferrer",
13348
+ children: t("terminalCautionLink")
13349
+ })]
13350
+ })
13351
+ ] }),
13352
+ confirming.deprecated === true && (() => {
13353
+ const replacement = replacementOf(confirming);
13354
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
13355
+ className: Market_module_css_default.installCautionBody,
13356
+ children: [t("deprecatedWarn"), replacement !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [" ", /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
13357
+ className: Market_module_css_default.src,
13358
+ href: replacement.url,
13359
+ target: "_blank",
13360
+ rel: "noreferrer",
13361
+ children: t("replacementHint") + " " + replacement.name
13362
+ })] })]
13363
+ });
13364
+ })()
13365
+ ]
13366
+ }),
13367
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
13368
+ className: Market_module_css_default.confirmFineprint,
13369
+ children: t("confirmWarn")
12646
13370
  })
12647
- }),
12648
- looksTerminal(confirming, lang) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
12649
- className: Market_module_css_default.warnLine,
12650
- children: [
12651
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconWarningOutline16, {
12652
- size: 14,
12653
- className: Market_module_css_default.bannerIcon
12654
- }),
12655
- " " + t("terminalWarn") + " ",
12656
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
12657
- className: Market_module_css_default.src,
12658
- href: confirming.url + "#readme",
12659
- target: "_blank",
12660
- rel: "noreferrer",
12661
- children: t("readme")
12662
- })
12663
- ]
12664
- }),
12665
- confirming.deprecated === true && (() => {
12666
- const replacement = replacementOf(confirming);
12667
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12668
- className: Market_module_css_default.deprecate,
12669
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12670
- className: Market_module_css_default.depLine,
12671
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: ["⚠️ ", t("deprecatedWarn")] }), replacement !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
12672
- className: Market_module_css_default.src,
12673
- href: replacement.url,
12674
- target: "_blank",
12675
- rel: "noreferrer",
12676
- children: t("replacementHint") + " " + replacement.name
12677
- })]
12678
- })
12679
- });
12680
- })(),
12681
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
12682
- className: Market_module_css_default.modalNote,
12683
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconWarningOutline16, {
12684
- size: 14,
12685
- className: Market_module_css_default.bannerIcon
12686
- }), " " + t("confirmWarn")]
12687
- })
12688
- ]
13371
+ ]
13372
+ })
12689
13373
  }),
12690
13374
  recovery !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RecoveryPanel, {
12691
13375
  open: recoveryOpen,
@@ -13086,6 +13770,15 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
13086
13770
  text: blockNotice,
13087
13771
  onDone: blockNoticeDone
13088
13772
  }),
13773
+ updateExemptError !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
13774
+ text: localizeBilingual(updateExemptError, lang),
13775
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconWarningOutline16, { size: 14 }),
13776
+ onDone: updateExemptErrorDone
13777
+ }),
13778
+ updateExemptNotice !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
13779
+ text: updateExemptNotice,
13780
+ onDone: updateExemptNoticeDone
13781
+ }),
13089
13782
  toggled !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
13090
13783
  text: toggled.name + " " + t(toggled.enabled ? "toastToggledOn" : "toastToggledOff"),
13091
13784
  icon: toggled.enabled ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCheckOutline16, { size: 14 }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconWarningOutline16, { size: 14 }),