dshmarket 1.66.4 → 1.66.6

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: "清除搜索",
@@ -284,9 +291,17 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
284
291
  favoritesStaleNote: "{0} 个收藏已不在目录中",
285
292
  favoritesClearStale: "清除失效收藏",
286
293
  favoritesClearingStale: "清除中…",
294
+ blockAdd: "屏蔽",
295
+ blockRemove: "取消屏蔽",
296
+ blockMoved: "已从发现页移出。在「已安装」后面的「已屏蔽」里可以取消。",
297
+ blockedTabHint: "这些插件不在发现页显示,全部更新也会跳过。",
298
+ blockedFilteredEmpty: "匹配的插件在「已屏蔽」标签里。",
299
+ blockedEmpty: "还没有屏蔽任何插件。",
300
+ blockFailed: "无法更新屏蔽列表,请重试。",
287
301
  tabDiscover: "发现",
288
302
  tabFavorites: "收藏",
289
303
  tabInstalled: "已安装",
304
+ tabBlocked: "已屏蔽",
290
305
  tabAdvanced: "高级",
291
306
  all: "全部",
292
307
  install: "安装",
@@ -302,7 +317,12 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
302
317
  restartHintSupervised: "本进程是 {0} 服务的主进程,重启交给它负责——市场自己重启会连带杀掉 cgroup 里的接管进程,服务将起不来。请执行 systemctl restart <你的 unit>。确认你的配置能承受市场自行重启(如 KillMode=process),可在本插件配置里手动打开「允许重启」。",
303
318
  restartHintDebugged: "当前 dsh 进程正被调试器连接。请从 IDE 或终端停止该进程后重新启动,市场不能从界面里结束正在调试的 dsh。",
304
319
  confirmTitle: "安装",
305
- confirmWarn: "插件是社区第三方代码。安装即表示你信任该来源;构建脚本默认不会运行。",
320
+ confirmWarn: "社区第三方插件,构建脚本默认不运行。",
321
+ installCaution: "安装前请注意",
322
+ terminalCautionTitle: "可能不适用于网页版",
323
+ terminalCautionBody: "这是终端插件,网页版里可能用不了。",
324
+ terminalCautionStartup: "也可能让 DeepSeek Harness 起不来。",
325
+ terminalCautionLink: "先看使用说明 ↗",
306
326
  cancel: "取消",
307
327
  empty: "没有匹配的插件",
308
328
  installedEmpty: "尚未安装社区插件,可前往「发现」页浏览",
@@ -323,6 +343,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
323
343
  agentBusyQueued: "Agent 正忙,已排队,空闲后自动安装(可在右上角「任务」里取消)。",
324
344
  agentBusyUpdateQueued: "Agent 正忙,已排队,空闲后自动更新(可在右上角「任务」里取消)。",
325
345
  agentBusyUninstallQueued: "Agent 正忙,已排队,空闲后自动卸载(可在右上角「任务」里取消)。",
346
+ queuedRunBlocked: "有 {0} 个会话正在运行,现在还不能执行:这类操作会直接替换插件文件,运行中的 Agent 可能中途报错。它们空闲后会自动开始(也可以先在「任务」里取消这一条)。",
347
+ queuedInstallGone: "这一条要装的插件在当前目录里找不到了(目录刷新过或换了页),已从队列移除。请在目录里重新找到它再装一次。",
326
348
  agentQueueStaleGone: "排队时它还在已安装列表里,现在已不在,因此跳过(没有卸载)。",
327
349
  agentQueueStaleNoUpdate: "排队时它有可用更新,现在没有了,已跳过。",
328
350
  queuedBadge: "排队中",
@@ -366,7 +388,6 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
366
388
  migrateWarning: "该 npm 包可能由其他人发布,并非同一插件;确认可信后再继续。",
367
389
  migrateContinue: "确认换用",
368
390
  migrateFail: "换用来源失败",
369
- restore: "恢复",
370
391
  restoreOnline: "换用线上版本",
371
392
  restoreHint: "将卸载本地版本并安装线上版本,之后照常检查更新。此操作无法撤销。",
372
393
  hostIncompatibleTitle: "这个新版本要求更新的 DSH",
@@ -411,7 +432,6 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
411
432
  commentsError: "评论加载失败。请检查网络连接后重试。",
412
433
  commentsRetry: "重试",
413
434
  commentsOnGitHub: "在 GitHub 登录并参与讨论",
414
- terminalWarn: "这看起来是终端/命令行插件:安装到网页版 profile 可能不会生效,甚至导致 DeepSeek Harness 无法启动。建议先阅读其使用说明,并按说明安装到对应的 profile。",
415
435
  conflictTitle: "无法安装:与已安装的插件冲突",
416
436
  conflictBody: "和已安装的插件冲突,只能留一个:",
417
437
  conflictReverted: "已自动撤销,未改动任何插件",
@@ -430,11 +450,14 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
430
450
  opNeedsYou: "项需处理",
431
451
  opQueued: "排队中",
432
452
  opQueuedAhead: "前面还有",
453
+ opQueuedWaitingAgents: "等待 {0} 个会话空闲",
454
+ opWaitingAgents: "{0} 个任务等待 agent 空闲",
433
455
  opRunning: "正在处理",
434
456
  opNeedsChoice: "无法安装 · 已自动撤销,未改动任何插件",
435
457
  opDone: "已完成",
436
458
  opDoneRefresh: "已安装 · 刷新页面后生效",
437
459
  opLeaveHint: "可离开本页面,完成后将通知你",
460
+ opLeaveHintAgents: "Agent 空闲后自动开始",
438
461
  opEmpty: "暂无进行中的操作",
439
462
  opEmptyHint: "安装、更新与卸载的进度将显示在这里",
440
463
  opClose: "收起",
@@ -461,6 +484,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
461
484
  confirm: "确认",
462
485
  confirmInstall: "确认安装",
463
486
  cmdDetails: "安装命令",
487
+ cmdCopy: "复制安装命令",
488
+ cmdCopied: "已复制",
464
489
  catsMore: "更多分类",
465
490
  catsLess: "收起",
466
491
  filter: "筛选",
@@ -510,9 +535,20 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
510
535
  updateAll: "全部更新",
511
536
  heldReleaseNotice: "已安装,但不是最新版:这个 profile 的 minimumReleaseAge 挡住了 {0},安装的是 {1}。",
512
537
  heldReleaseAction: "仍安装 {0}",
513
- ignoreUpdateNotice: "本次不再提醒",
514
- ignoreAllUpdateNotices: "本次全部忽略",
515
- updateNoticeIgnored: "本次已忽略提醒",
538
+ ignoreUpdateNotice: "重启前不再提醒",
539
+ ignoreAllUpdateNotices: "重启前都不再提醒",
540
+ updateNoticeIgnored: "重启前不再提醒",
541
+ updateExemptAdd: "一直不提醒更新",
542
+ updateExemptRemove: "恢复更新提醒",
543
+ updateExemptMark: "提醒已关闭",
544
+ updateExemptRestore: "恢复提醒",
545
+ updateExemptHint: "新版本仍会列出,只是不再提醒。",
546
+ updateExemptOn: "更新提醒已关闭。新版本仍会列出。",
547
+ updateExemptOff: "已恢复更新提醒。",
548
+ updateExemptFailed: "无法保存,请重试。",
549
+ updateAvailableShort: "有新版本",
550
+ copyPath: "复制路径",
551
+ pathCopied: "已复制",
516
552
  tabThemes: "主题",
517
553
  tabBackup: "备份与恢复",
518
554
  backupLocal: "本地文件",
@@ -626,6 +662,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
626
662
  brokenPluginTitle: "{0} 更新失败后被移除了",
627
663
  brokenPluginBody: "DSH 正在运行时无法更新,而更新前的版本也已经损坏。为避免下次启动卡住,市场把它从 profile 里移除。插件目录还在原处,退出 DSH 后重新安装即可。",
628
664
  brokenPluginAction: "查找这个插件",
665
+ brokenPluginDismiss: "不再显示这条",
629
666
  viewReplacement: "查看替代品",
630
667
  installReplacement: "安装替代品",
631
668
  replacementHint: "目录建议改用",
@@ -896,6 +933,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
896
933
  submitPlugin: "Submit a plugin ↗",
897
934
  descExpand: "Show more",
898
935
  descCollapse: "Show less",
936
+ descMore: "Show all",
899
937
  searchPh: "Search plugins: notify, terminal, memory…",
900
938
  searchFavoritesPh: "Search favorites…",
901
939
  clearSearch: "Clear search",
@@ -934,9 +972,17 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
934
972
  favoritesStaleNote: "{0} favorites are no longer in the catalog",
935
973
  favoritesClearStale: "Remove stale favorites",
936
974
  favoritesClearingStale: "Removing…",
975
+ blockAdd: "Hide",
976
+ blockRemove: "Show again",
977
+ blockMoved: "Removed from Discover. Undo it in Hidden, the tab after Installed.",
978
+ blockedTabHint: "These stay off Discover, and Update all skips them.",
979
+ blockedFilteredEmpty: "Matching plugins are on the Hidden tab.",
980
+ blockedEmpty: "No hidden plugins yet.",
981
+ blockFailed: "Could not update the hidden list. Try again.",
937
982
  tabDiscover: "Discover",
938
983
  tabFavorites: "Favorites",
939
984
  tabInstalled: "Installed",
985
+ tabBlocked: "Hidden",
940
986
  tabAdvanced: "Advanced",
941
987
  all: "All",
942
988
  install: "Install",
@@ -952,7 +998,12 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
952
998
  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.",
953
999
  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.",
954
1000
  confirmTitle: "Install",
955
- confirmWarn: "Plugins are third-party community code. Installing means you trust the source. Build scripts do not run by default.",
1001
+ confirmWarn: "Community third-party plugin. Build scripts do not run by default.",
1002
+ installCaution: "Before you install",
1003
+ terminalCautionTitle: "May not work in the web app",
1004
+ terminalCautionBody: "This is a terminal plugin. It may not work in the web version.",
1005
+ terminalCautionStartup: "It can stop DeepSeek Harness from starting.",
1006
+ terminalCautionLink: "Read its instructions first ↗",
956
1007
  cancel: "Cancel",
957
1008
  empty: "No plugins match",
958
1009
  installedEmpty: "No community plugins yet — browse the Discover tab",
@@ -973,6 +1024,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
973
1024
  agentBusyQueued: "Agent is busy — queued and will install automatically when idle (cancel it in Tasks, top right).",
974
1025
  agentBusyUpdateQueued: "Agent is busy — queued and will update automatically when idle (cancel it in Tasks, top right).",
975
1026
  agentBusyUninstallQueued: "Agent is busy — queued and will uninstall automatically when idle (cancel it in Tasks, top right).",
1027
+ 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).",
1028
+ 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.",
976
1029
  agentQueueStaleGone: "It was installed when you queued this, and is not now — skipped, nothing was uninstalled.",
977
1030
  agentQueueStaleNoUpdate: "It had an update available when you queued this, and does not now — skipped.",
978
1031
  queuedBadge: "Queued",
@@ -1016,7 +1069,6 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
1016
1069
  migrateWarning: "The npm package may be published by someone else and not be the same plugin. Continue only if you trust it.",
1017
1070
  migrateContinue: "Confirm switch",
1018
1071
  migrateFail: "Source switch failed",
1019
- restore: "Restore",
1020
1072
  restoreOnline: "Use online version",
1021
1073
  restoreHint: "This uninstalls the local version and installs the online version. Update checks continue as usual. This cannot be undone.",
1022
1074
  hostIncompatibleTitle: "This release needs a newer DSH",
@@ -1061,7 +1113,6 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
1061
1113
  commentsError: "Comments could not be loaded. Check your connection and try again.",
1062
1114
  commentsRetry: "Try again",
1063
1115
  commentsOnGitHub: "Sign in and join on GitHub",
1064
- 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.",
1065
1116
  conflictTitle: "Cannot install: conflicts with an installed plugin",
1066
1117
  conflictBody: "It conflicts with an installed plugin — only one can stay:",
1067
1118
  conflictReverted: "Reverted automatically; nothing was changed",
@@ -1080,11 +1131,14 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
1080
1131
  opNeedsYou: "need attention",
1081
1132
  opQueued: "Queued",
1082
1133
  opQueuedAhead: "ahead:",
1134
+ opQueuedWaitingAgents: "waiting for {0} running session(s)",
1135
+ opWaitingAgents: "{0} task(s) waiting for agents to go idle",
1083
1136
  opRunning: "In progress",
1084
1137
  opNeedsChoice: "Cannot install · reverted automatically, nothing changed",
1085
1138
  opDone: "Done",
1086
1139
  opDoneRefresh: "Installed · refresh the page to apply",
1087
1140
  opLeaveHint: "You can leave this page; you will be notified when it finishes",
1141
+ opLeaveHintAgents: "Starts on its own once the agents go idle",
1088
1142
  opEmpty: "No operations in progress",
1089
1143
  opEmptyHint: "Install, update and uninstall progress appears here",
1090
1144
  opClose: "Collapse",
@@ -1111,6 +1165,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
1111
1165
  confirm: "Confirm",
1112
1166
  confirmInstall: "Confirm install",
1113
1167
  cmdDetails: "Install command",
1168
+ cmdCopy: "Copy install command",
1169
+ cmdCopied: "Copied",
1114
1170
  catsMore: "More categories",
1115
1171
  catsLess: "Fewer categories",
1116
1172
  filter: "Filter",
@@ -1160,9 +1216,20 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
1160
1216
  updateAll: "Update all",
1161
1217
  heldReleaseNotice: "Installed, but not the newest: this profile's minimumReleaseAge held {0} back, so {1} was installed.",
1162
1218
  heldReleaseAction: "Install {0} anyway",
1163
- ignoreUpdateNotice: "Ignore until restart",
1164
- ignoreAllUpdateNotices: "Ignore all until restart",
1165
- updateNoticeIgnored: "Reminder ignored for this boot",
1219
+ ignoreUpdateNotice: "Don't remind until restart",
1220
+ ignoreAllUpdateNotices: "Don't remind any until restart",
1221
+ updateNoticeIgnored: "No reminders until restart",
1222
+ updateExemptAdd: "Never remind about updates",
1223
+ updateExemptRemove: "Resume update reminders",
1224
+ updateExemptMark: "Reminders off",
1225
+ updateExemptRestore: "Remind again",
1226
+ updateExemptHint: "New versions stay listed. Only the reminder stops.",
1227
+ updateExemptOn: "Update reminders are off. New versions stay listed.",
1228
+ updateExemptOff: "Update reminders are back on.",
1229
+ updateExemptFailed: "Couldn't save that. Try again.",
1230
+ updateAvailableShort: "New version",
1231
+ copyPath: "Copy path",
1232
+ pathCopied: "Copied",
1166
1233
  tabThemes: "Themes",
1167
1234
  tabBackup: "Backup & Restore",
1168
1235
  backupLocal: "Local file",
@@ -1276,6 +1343,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
1276
1343
  brokenPluginTitle: "{0} was removed after a failed update",
1277
1344
  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.",
1278
1345
  brokenPluginAction: "Find this plugin",
1346
+ brokenPluginDismiss: "Stop showing this",
1279
1347
  viewReplacement: "View replacement",
1280
1348
  installReplacement: "Install replacement",
1281
1349
  replacementHint: "Catalog suggests",
@@ -2575,6 +2643,28 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
2575
2643
  return leaf === "" ? name.slice(0, hash) : leaf;
2576
2644
  }
2577
2645
  /**
2646
+ * The catalog package name used for the local block list (#657).
2647
+ *
2648
+ * Prefer the npm package when the catalog carries one. Fall back to the
2649
+ * repository name for entries that have not published one yet.
2650
+ */
2651
+ function blockPackageName(plugin) {
2652
+ return typeof plugin.npm === "string" && plugin.npm !== "" ? plugin.npm : plugin.name;
2653
+ }
2654
+ /**
2655
+ * Names that count as one blocked plugin (#657).
2656
+ *
2657
+ * A linked checkout can be installed under a package name the catalog does
2658
+ * not use. The installed name comes first so a new block is stored as the
2659
+ * name Update all already filters on; the catalog name stays in the list so
2660
+ * a block made from either side still matches the other.
2661
+ */
2662
+ function blockAliases(plugin, installedName) {
2663
+ const catalogName = blockPackageName(plugin);
2664
+ if (typeof installedName === "string" && installedName !== "" && installedName !== catalogName) return [installedName, catalogName];
2665
+ return [catalogName];
2666
+ }
2667
+ /**
2578
2668
  * Compact display for a count that can run into the tens of thousands
2579
2669
  * (npm downloads, star counts): "11.9k" instead of "11862". Reported —
2580
2670
  * the raw number made the card byline visibly cramped once downloads was
@@ -2755,7 +2845,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
2755
2845
  const HostCheckbox = optionalComponent("Checkbox");
2756
2846
  //#endregion
2757
2847
  //#region \0dsh-css:src/client/Market.module.css.mjs
2758
- const css = ".nUhMVa_root{min-width:0;height:100%;color:var(--dsw-alias-label-primary,#1f2328);flex-direction:column;display:flex;position:relative;container-type:inline-size}.nUhMVa_head{flex-direction:column;gap:12px;padding:4px 4px 6px;display:flex}.nUhMVa_title{margin:0;font-size:16px;font-weight:500;line-height:24px}.nUhMVa_sub{color:var(--dsw-alias-label-tertiary,#8b93a1);align-items:center;gap:8px;margin:0;font-size:12px;line-height:18px;display:flex}.nUhMVa_submitLink{color:var(--dsw-alias-label-tertiary,#8b93a1);white-space:nowrap;font-size:11px;line-height:18px;text-decoration:none}.nUhMVa_submitLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:underline}.nUhMVa_tabs{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);align-items:flex-end;gap:2px;display:flex}.nUhMVa_tab{font:inherit;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-bottom:2px solid #0000;padding:7px 12px;font-size:13px}.nUhMVa_tab.nUhMVa_on{color:var(--dsw-alias-brand-primary,#4f6ef7);border-bottom-color:var(--dsw-alias-brand-primary,#4f6ef7);font-weight:600}.nUhMVa_subTabs{align-items:flex-end;gap:2px;margin:-4px 0 4px;display:flex}.nUhMVa_banner{background:var(--dsw-alias-bg-layer-2,#fdf3e3);border:1px solid var(--dsw-alias-border-l2,#f3e3c3);border-radius:8px;align-items:center;gap:8px;margin:0;padding:8px 12px;font-size:12px;display:flex}.nUhMVa_bannerIcon{color:var(--dsw-alias-label-secondary,#6b7280);flex-shrink:0}.nUhMVa_bannerHint{color:var(--dsw-alias-label-tertiary,#8b93a1);cursor:help;display:inline-flex}.nUhMVa_body{overflow-anchor:none;flex:1;padding:12px 4px 24px;overflow-x:hidden;overflow-y:auto}.nUhMVa_stickyHead{z-index:5;background:var(--dsw-alias-bg-layer-2,#f7f8fa);position:sticky;top:-1px}.nUhMVa_stickyHead:before{content:\"\";background:inherit;pointer-events:none;height:14px;position:absolute;bottom:100%;left:0;right:0}.nUhMVa_cats{margin:0 -4px 2px;padding:12px 4px 4px}.nUhMVa_catsRow{align-items:flex-start;gap:8px;display:flex;position:relative}.nUhMVa_star{color:var(--dsw-alias-label-secondary,#9ca3af);white-space:nowrap;flex:none;font-size:11px}.nUhMVa_top{z-index:20;background:var(--dsw-alias-bg-layer-1,#fff);box-shadow:var(--dsw-shadow-lv1,0 4px 12px #1f232814);border-radius:99px;display:inline-flex;position:absolute;bottom:18px;right:18px}.nUhMVa_topBtn{border-radius:99px;width:38px;height:38px;padding:0}.nUhMVa_tag{border:1px solid var(--dsw-alias-border-l3,#d9dde3);color:var(--dsw-alias-label-secondary,#6b7280);border-radius:4px;flex-shrink:0;padding:1px 6px;font-size:11px;line-height:16px}.nUhMVa_hostRequirement{border:1px solid var(--dsw-alias-border-l3,#d9dde3);color:var(--dsw-alias-label-secondary,#6b7280);text-overflow:ellipsis;white-space:nowrap;border-radius:4px;min-width:0;max-width:100%;padding:1px 6px;font-size:11px;line-height:16px;overflow:hidden}.nUhMVa_hostRequirementBad{border-color:var(--dsw-alias-state-error-primary,#dc2626);color:var(--dsw-alias-state-error-primary,#dc2626);background:#dc262614}.nUhMVa_hostFilterNote{color:var(--dsw-alias-label-tertiary,#8b93a1);margin-top:6px;font-size:11px;line-height:16px}.nUhMVa_okState{color:var(--dsw-alias-state-success-primary,#16a34a);white-space:nowrap;font-size:12px;font-weight:600}.nUhMVa_catsWrap{flex-wrap:wrap;flex:1;align-items:center;gap:6px;min-width:0;display:flex}.nUhMVa_catsCollapsed{max-height:62px;overflow:hidden}.nUhMVa_catsToggle.nUhMVa_catsToggle{height:26px;min-height:26px;color:var(--dsw-alias-label-secondary,#6b7280);padding:0 6px}.nUhMVa_shots{-webkit-overflow-scrolling:touch;scrollbar-width:thin;gap:8px;margin:6px 0 8px;padding:2px 0 6px;display:flex;overflow-x:auto}.nUhMVa_shot{object-fit:cover;border:1px solid var(--dsw-alias-border-default,#e5e7eb);background:var(--dsw-alias-bg-layer-2,#f3f4f6);cursor:pointer;border-radius:8px;flex:none;width:220px;height:150px}.nUhMVa_cardShots{-webkit-overflow-scrolling:touch;scrollbar-width:thin;gap:6px;margin:0 0 6px;padding:0 0 2px;display:flex;overflow-x:auto}.nUhMVa_cardShot{object-fit:contain;border:1px solid var(--dsw-alias-border-default,#e5e7eb);background:var(--dsw-alias-bg-layer-2,#f3f4f6);cursor:pointer;border-radius:8px;flex:none;width:132px;height:88px;display:block}.nUhMVa_lightbox{z-index:10000;cursor:zoom-out;background:#000000d9;justify-content:center;align-items:center;display:flex;position:fixed;top:0;bottom:0;left:0;right:0}.nUhMVa_lightboxImg{object-fit:contain;cursor:default;border-radius:4px;max-width:90vw;max-height:85vh}.nUhMVa_lightboxClose{color:#fff;cursor:pointer;background:#ffffff1f;border:none;border-radius:99px;place-items:center;width:36px;height:36px;font-size:22px;line-height:1;display:grid;position:absolute;top:16px;right:16px}.nUhMVa_lightboxClose:hover{background:#ffffff38}.nUhMVa_lightboxNav{color:#fff;cursor:pointer;background:#ffffff1f;border:none;border-radius:99px;place-items:center;width:44px;height:44px;display:grid;position:absolute;top:50%;transform:translateY(-50%)}.nUhMVa_lightboxNav:hover{background:#ffffff38}.nUhMVa_lightboxPrev{left:16px}.nUhMVa_lightboxNext{right:16px}.nUhMVa_lightboxDots{gap:8px;display:flex;position:absolute;bottom:20px;left:50%;transform:translate(-50%)}.nUhMVa_lightboxDot{cursor:pointer;background:#fff6;border-radius:99px;width:7px;height:7px}.nUhMVa_lightboxDotOn{background:#fff}.nUhMVa_cmd{background:var(--dsw-alias-bg-layer-2,#f3f4f6);word-break:break-all;border-radius:6px;margin:8px 0 0;padding:8px 10px;font-family:ui-monospace,Menlo,monospace;font-size:11px;line-height:18px}.nUhMVa_warnLine{color:var(--dsw-alias-state-warn-primary,#b45309);flex-wrap:wrap;align-items:center;gap:4px;margin:0;font-size:12px;font-weight:600;line-height:18px;display:flex}.nUhMVa_modalNote{color:var(--dsw-alias-label-tertiary,#8b93a1);align-items:center;gap:4px;margin:12px 0 0;font-size:12px;line-height:18px;display:flex}.nUhMVa_grid{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start;gap:10px;display:grid}.nUhMVa_masonry{align-items:flex-start;gap:10px;display:flex}.nUhMVa_masonryCol{flex-direction:column;flex:1;gap:10px;min-width:0;display:flex}.nUhMVa_masonry>.nUhMVa_masonryCol>*{align-self:stretch;min-width:0}@media (max-width:680px){.nUhMVa_masonry{flex-direction:column}.nUhMVa_masonryCol{width:100%}.nUhMVa_grid{grid-template-columns:minmax(0,1fr)}}.nUhMVa_swatches{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;gap:0;height:34px;display:flex;overflow:hidden}.nUhMVa_themesGrid{margin-bottom:12px}.nUhMVa_swatches i{flex:1}.nUhMVa_themeToolbar{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;padding:0 4px 12px;display:grid}.nUhMVa_themeSearch{box-sizing:border-box;width:100%;min-width:0}.nUhMVa_themeToolbarActions{justify-content:flex-end;align-items:center;gap:8px;display:flex}.nUhMVa_themeFullscreenBtn.nUhMVa_themeFullscreenBtn{width:28px;min-width:28px;padding:0}.nUhMVa_themeResultBar{min-height:24px;color:var(--dsw-alias-label-tertiary,#8b93a1);align-items:center;padding:0 4px 8px;font-size:12px;line-height:18px;display:flex}.nUhMVa_favoritesSectionHead{color:var(--dsw-alias-label-primary,#1f2328);margin:16px 0 8px;padding:0 4px;font-size:13px;font-weight:600;line-height:20px}.nUhMVa_favoritesSectionHead:first-of-type{margin-top:0}.nUhMVa_brokenPluginNotice{flex-direction:column;gap:8px;margin:0 0 8px;display:flex}.nUhMVa_brokenPluginItem{border:1px solid var(--dsw-alias-state-warn-tertiary,#b4530933);background:var(--dsw-alias-state-warn-tertiary,#b453090f);color:var(--dsw-alias-state-warn-primary,#b45309);border-radius:8px;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:10px;padding:8px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_brokenPluginText{flex-direction:column;gap:2px;min-width:0;display:flex}.nUhMVa_favoritesStaleBar{border:1px solid var(--dsw-alias-state-warn-tertiary,#b4530933);background:var(--dsw-alias-state-warn-tertiary,#b453090f);color:var(--dsw-alias-state-warn-primary,#b45309);border-radius:8px;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin:0 0 8px;padding:8px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_favoritesStaleOnly{flex-direction:column;align-items:flex-start;gap:10px;display:flex}.nUhMVa_themeGallery{grid-template-columns:repeat(4,minmax(0,1fr));align-items:stretch;gap:10px;display:grid}.nUhMVa_themeCard{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#fff);border-radius:8px;flex-direction:column;min-width:0;transition:border-color .16s cubic-bezier(.16,1,.3,1),box-shadow .16s cubic-bezier(.16,1,.3,1),transform .16s cubic-bezier(.16,1,.3,1);display:flex;overflow:hidden}.nUhMVa_themeCard:hover{border-color:var(--dsw-alias-border-l3,#d9dde3);box-shadow:var(--dsw-shadow-lv1,0 4px 12px #1f232814);transform:translateY(-1px)}.nUhMVa_themeCover{aspect-ratio:16/10;border:0;border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-2,#f3f4f6);width:100%;color:var(--dsw-alias-label-secondary,#6b7280);cursor:zoom-in;border-radius:0;padding:0;display:block;position:relative;overflow:hidden}.nUhMVa_themeCover img{object-fit:contain;background:var(--dsw-alias-bg-layer-2,#f3f4f6);width:100%;height:100%;transition:transform .18s cubic-bezier(.16,1,.3,1);display:block}.nUhMVa_themeCover:hover img{transform:scale(1.012)}.nUhMVa_themeCover:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4f6ef7);outline-offset:-3px}.nUhMVa_themeCoverEmpty{cursor:default;color:var(--dsw-alias-label-tertiary,#8b93a1);flex-direction:column;justify-content:center;align-items:center;gap:8px;font-size:12px;line-height:18px;display:flex}.nUhMVa_themePreviewAction,.nUhMVa_themePreviewCount{color:#fff;-webkit-backdrop-filter:blur(8px);background:#14181fc7;border:1px solid #ffffff57;border-radius:4px;align-items:center;height:24px;padding:0 8px;font-size:11px;line-height:16px;display:inline-flex;position:absolute;bottom:8px}.nUhMVa_themePreviewAction{gap:4px;right:8px}.nUhMVa_themePreviewCount{left:8px}.nUhMVa_themeCardBody{flex-direction:column;flex:1;gap:8px;padding:12px;display:flex}.nUhMVa_themeCardHead{align-items:flex-start;gap:8px;min-width:0;display:flex}.nUhMVa_themeIdentity{flex:1;min-width:0}.nUhMVa_themeStatus,.nUhMVa_themeStatusMuted{white-space:nowrap;border-radius:4px;flex:none;align-items:center;min-height:22px;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_themeStatus{background:var(--dsw-alias-state-success-tertiary,#16a34a1a);color:var(--dsw-alias-state-success-primary,#15803d)}.nUhMVa_themeStatusMuted{background:var(--dsw-alias-bg-layer-2,#f3f4f6);color:var(--dsw-alias-label-secondary,#6b7280)}.nUhMVa_themeDescription{min-height:36px;color:var(--dsw-alias-label-tertiary,#8b93a1);-webkit-line-clamp:3;-webkit-box-orient:vertical;margin:0;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.nUhMVa_themeCardFooter{justify-content:space-between;align-items:center;gap:8px;margin-top:auto;padding-top:4px;display:flex}.nUhMVa_themeLifecycle{min-width:0;color:var(--dsw-alias-label-tertiary,#8b93a1);text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:18px;overflow:hidden}.nUhMVa_themeActions{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:8px;margin-left:auto;display:flex}@container (width<=900px){.nUhMVa_themeGallery{grid-template-columns:repeat(3,minmax(0,1fr))}}@container (width<=680px){.nUhMVa_themeGallery{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (width<=460px){.nUhMVa_themeGallery{grid-template-columns:minmax(0,1fr)}}@container (width<=420px){.nUhMVa_sub{grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:2px 8px;display:grid}.nUhMVa_sub>span:first-child{grid-area:1/1}.nUhMVa_sub>.nUhMVa_grow{display:none}.nUhMVa_submitLink{grid-area:2/1}.nUhMVa_exportLogBtn{flex-shrink:0;grid-area:1/2/span 2}.nUhMVa_themeToolbar{grid-template-columns:minmax(0,1fr)}.nUhMVa_themeCardHead{flex-wrap:wrap}.nUhMVa_themeStatus,.nUhMVa_themeStatusMuted{order:3}}@container (width<=280px){.nUhMVa_themeCardFooter{flex-direction:column;align-items:flex-start}.nUhMVa_themeActions{justify-content:flex-start;width:100%;margin-left:0}}@media (max-width:560px){[role=dialog]:has([data-dsh-market-root])>nav{display:none}[role=dialog]:has([data-dsh-market-root])>div{flex:100%;width:100%;min-width:0}}[role=dialog]:has([data-dsh-market-fullscreen=true]){border-radius:0;width:100vw;max-width:none;height:100vh;max-height:none;position:fixed;top:0;bottom:0;left:0;right:0}@media (prefers-reduced-motion:reduce){.nUhMVa_themeCard,.nUhMVa_themeCover img{transition:none}.nUhMVa_themeCard:hover{transform:none}}.nUhMVa_card{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;flex-direction:column;align-self:start;gap:12px;padding:12px 14px;display:flex}.nUhMVa_row1{align-items:flex-start;gap:10px;min-width:0;display:flex}.nUhMVa_cardAction{flex-shrink:0;align-items:center;display:inline-flex}.nUhMVa_installBtn.nUhMVa_installBtn{min-width:64px}.nUhMVa_av{width:16px;height:16px;color:var(--dsw-alias-label-primary,#1f2328);object-fit:cover;background:var(--dsw-alias-bg-layer-2,#f3f4f6);border-radius:50%;flex-shrink:0;place-items:center;font-size:9px;font-weight:700;display:grid}.nUhMVa_nm{text-overflow:ellipsis;white-space:nowrap;font-size:15px;font-weight:600;line-height:22px;overflow:hidden}.nUhMVa_nmLink{color:inherit;text-decoration:none;display:block}.nUhMVa_nmLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:underline}.nUhMVa_repoMark{color:var(--dsw-alias-label-secondary,#6b7280);vertical-align:-1px;flex-shrink:0;margin-left:5px;display:inline-block}.nUhMVa_nmLink:hover .nUhMVa_repoMark{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_byline{flex-wrap:wrap;align-items:center;gap:6px;min-width:0;margin-top:2px;display:flex}.nUhMVa_meta{color:var(--dsw-alias-label-secondary,#9ca3af);margin-top:2px;font-size:11px}.nUhMVa_metaInline{color:var(--dsw-alias-label-secondary,#9ca3af);font-size:11px}.nUhMVa_owner{color:var(--dsw-alias-label-secondary,#9ca3af);text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:44px;font-size:11px;overflow:hidden}.nUhMVa_desc{color:var(--dsw-alias-label-tertiary,#8b93a1);margin:0;font-size:12px;line-height:18px}.nUhMVa_descClamp{-webkit-line-clamp:5;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.nUhMVa_descToggle{width:20px;height:16px;color:var(--dsw-alias-label-tertiary,#8b93a1);cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;margin-top:2px;padding:0;display:flex}.nUhMVa_descToggle:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_foot{flex-wrap:nowrap;align-items:flex-end;gap:8px;display:flex}.nUhMVa_foot .nUhMVa_metaInline,.nUhMVa_foot .nUhMVa_src{white-space:nowrap}.nUhMVa_footTags{flex-wrap:wrap;flex:1 1 0;align-items:center;gap:8px;min-width:0;display:flex}.nUhMVa_grow{flex:1}.nUhMVa_titleRow{align-items:center;gap:10px;display:flex}.nUhMVa_version{color:var(--dsw-alias-label-tertiary,#8b93a1);font-variant-numeric:tabular-nums;flex-shrink:0;font-size:12px;line-height:20px}.nUhMVa_repoLink{color:var(--dsw-alias-label-tertiary,#8b93a1);flex-shrink:0;font-size:12px;line-height:20px;text-decoration:none}.nUhMVa_repoLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_noteRow{flex-wrap:wrap;align-items:baseline;gap:6px;min-width:0;display:flex}.nUhMVa_desc.nUhMVa_noteRow,.nUhMVa_desc.nUhMVa_noteRow+.nUhMVa_noteRow,.nUhMVa_noteEdit+.nUhMVa_noteRow{margin-top:6px}.nUhMVa_noteMine{color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_noteToggle{font:inherit;color:var(--dsw-alias-label-tertiary,#8b93a1);cursor:pointer;white-space:nowrap;background:0 0;border:none;flex-shrink:0;padding:0;font-size:11px;line-height:16px}.nUhMVa_noteToggle:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:underline}.nUhMVa_noteAction{color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-bg-layer-2,#f3f4f6);border:1px solid var(--dsw-alias-border-l3,#d9dde3);border-radius:4px;align-items:center;padding:0 5px;font-weight:600;text-decoration:none;display:inline-flex}.nUhMVa_noteAction:hover{color:var(--dsw-alias-label-primary,#1f2328);border-color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:none}.nUhMVa_noteEdit{flex-wrap:wrap;align-items:center;gap:6px;min-width:0;margin-top:6px;display:flex}.nUhMVa_noteInput{flex:1;min-width:160px}.nUhMVa_descTight{min-height:0}.nUhMVa_src{color:var(--dsw-alias-label-secondary,#9ca3af);font-size:11px;text-decoration:none}.nUhMVa_src:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_dot{vertical-align:2px;margin-left:5px}.nUhMVa_act{flex-wrap:wrap;align-items:center;gap:6px;margin-top:6px;font-size:11px;display:flex}.nUhMVa_actLive{color:var(--dsw-alias-state-success-primary,#16a34a);align-items:center;gap:4px;font-weight:600;display:inline-flex}.nUhMVa_actWarn{color:var(--dsw-alias-state-warn-primary,#b45309);align-items:center;gap:4px;font-weight:600;display:inline-flex}.nUhMVa_actBroken{color:var(--dsw-alias-state-error-primary,#dc2626);align-items:center;gap:4px;font-weight:600;display:inline-flex}.nUhMVa_actWhy{color:var(--dsw-alias-label-secondary,#6b7280);margin-top:2px}.nUhMVa_loading{color:var(--dsw-alias-label-secondary,#9ca3af);flex-direction:column;align-items:center;gap:12px;padding:48px;font-size:13px;display:flex}.nUhMVa_spin{color:var(--dsw-alias-brand-primary,#4f6ef7);flex-shrink:0;animation:.8s linear infinite nUhMVa_sp;display:inline-flex}.nUhMVa_logoMark{color:var(--dsw-alias-brand-primary,#4f6ef7);flex-shrink:0;display:inline-flex}.nUhMVa_logoPlug{transform-box:fill-box;transform-origin:50%;animation:1.5s cubic-bezier(.4,0,.2,1) infinite nUhMVa_dshmPlug}@keyframes nUhMVa_dshmPlug{0%,12%{transform:rotate(9deg)}45%,62%{transform:translate(-1.28px,1.27px)rotate(0)}95%,to{transform:rotate(9deg)}}@media (prefers-reduced-motion:reduce){.nUhMVa_logoPlug,.nUhMVa_spin{animation:1.5s ease-in-out infinite nUhMVa_dshmPlugFade}}@keyframes nUhMVa_dshmPlugFade{0%,to{opacity:1}50%{opacity:.35}}@keyframes nUhMVa_sp{to{transform:rotate(360deg)}}.nUhMVa_progress{background:var(--dsw-alias-bg-layer-2,#f3f4f6);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);color:var(--dsw-alias-label-secondary,#6b7280);border-radius:8px;flex-wrap:wrap;align-items:center;gap:9px;margin:0;padding:8px 12px;font-size:12px;display:flex}.nUhMVa_bar{background:var(--dsw-alias-border-l1,#e5e7eb);border-radius:99px;width:100%;height:4px;overflow:hidden}.nUhMVa_barFill{background:var(--dsw-alias-brand-primary,#4f6ef7);border-radius:99px;height:100%;transition:width .6s}.nUhMVa_barWave{width:30%;animation:1.2s ease-in-out infinite nUhMVa_dshmSlide}@keyframes nUhMVa_dshmSlide{0%{margin-left:-30%}to{margin-left:100%}}.nUhMVa_irow .nUhMVa_progress{margin-top:8px}.nUhMVa_progress code{text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,Menlo,monospace;font-size:11px;overflow:hidden}.nUhMVa_empty{color:var(--dsw-alias-label-secondary,#9ca3af);text-align:center;padding:32px;font-size:13px}.nUhMVa_err{color:var(--dsw-alias-state-error-primary,#dc2626);white-space:pre-wrap;word-break:break-all;margin:8px 0;font-size:12px}.nUhMVa_cardBlocked{border-color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_conflictHead{align-items:flex-start;gap:8px;display:flex}.nUhMVa_conflictIcon{color:var(--dsw-alias-state-error-primary,#dc2626);flex-shrink:0;margin-top:1px}.nUhMVa_conflictTitle{color:var(--dsw-alias-state-error-primary,#dc2626);font-size:13px;font-weight:600;line-height:18px}.nUhMVa_conflictBody{margin:0;font-size:12px;line-height:19px}.nUhMVa_roster{background:var(--dsw-alias-border-l2,#e5e7eb);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;flex-direction:column;gap:1px;display:flex;overflow:hidden}.nUhMVa_rosterRow{background:var(--dsw-alias-bg-layer-1,#fff);align-items:center;gap:8px;padding:7px 10px;display:flex}.nUhMVa_rosterMain{flex-direction:column;min-width:0;display:flex}.nUhMVa_rosterName{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:12px;font-weight:600;overflow:hidden}.nUhMVa_rosterAuthor{color:var(--dsw-alias-label-secondary,#9ca3af);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;overflow:hidden}.nUhMVa_rosterTag{border-radius:4px;flex-shrink:0;margin-left:auto;padding:1px 6px;font-size:10.5px;font-weight:600}.nUhMVa_rosterTagKeep{color:var(--dsw-alias-state-success-primary,#16a34a);background:#16a34a1f}.nUhMVa_rosterTagDrop{color:var(--dsw-alias-state-error-primary,#dc2626);background:#dc26261f}.nUhMVa_rosterRowOut .nUhMVa_rosterName{text-decoration:line-through}.nUhMVa_rosterRowOut{opacity:.62}.nUhMVa_rosterSplit{background:var(--dsw-alias-border-l2,#e5e7eb);height:1px}.nUhMVa_reassure{color:var(--dsw-alias-label-secondary,#6b7280);align-items:center;gap:5px;margin:0;font-size:11.5px;line-height:17px;display:flex}.nUhMVa_reassureOk{color:var(--dsw-alias-state-success-primary,#16a34a);flex-shrink:0}.nUhMVa_conflictWhy{color:var(--dsw-alias-label-tertiary,#8b93a1);overflow-wrap:anywhere;margin-top:2px;font-family:ui-monospace,Menlo,monospace;font-size:11px;line-height:17px}.nUhMVa_conflictWhyText{margin-top:5px;font-family:-apple-system,BlinkMacSystemFont,PingFang SC,sans-serif}.nUhMVa_choices{flex-direction:column;gap:7px;display:flex}.nUhMVa_choice{text-align:left;font:inherit;cursor:pointer;background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l3,#d9dde3);border-radius:9px;align-items:flex-start;gap:9px;padding:9px 11px;display:flex}.nUhMVa_choice:has(input:disabled){cursor:default;opacity:.6}.nUhMVa_choiceOn{border-color:var(--dsw-alias-brand-primary,#4f6ef7);background:var(--dsw-alias-bg-layer-2,#f5f7ff)}.nUhMVa_choiceRadio{width:13px;height:13px;accent-color:var(--dsw-alias-brand-primary,#4f6ef7);flex-shrink:0;margin:2px 0 0}.nUhMVa_choiceMain{flex-direction:column;gap:3px;min-width:0;display:flex}.nUhMVa_choiceTitle{font-size:12px;font-weight:600;line-height:17px}.nUhMVa_choiceNote{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:11px;line-height:16px}.nUhMVa_choiceSafe{color:var(--dsw-alias-state-success-primary,#16a34a)}.nUhMVa_stateTag{white-space:nowrap;background:var(--dsw-alias-bg-layer-2,#f3f4f6);min-height:20px;color:var(--dsw-alias-label-secondary,#6b7280);border-radius:5px;flex-shrink:0;align-items:center;gap:5px;padding:1px 7px;font-size:11px;line-height:16px;display:inline-flex}.nUhMVa_stateTag[data-on=true]{color:var(--dsw-alias-state-success-primary,#16a34a);background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#16a34a) 10%, transparent)}.nUhMVa_stateDot{background:var(--dsw-alias-label-tertiary,#8b93a1);border-radius:999px;flex:none;width:6px;height:6px}.nUhMVa_stateDot[data-on=true]{background:var(--dsw-alias-state-success-primary,#16a34a)}.nUhMVa_metaTag{text-overflow:ellipsis;white-space:nowrap;background:var(--dsw-alias-bg-layer-2,#f3f4f6);min-width:0;max-width:100%;min-height:20px;color:var(--dsw-alias-label-tertiary,#8b93a1);border-radius:5px;flex-shrink:1;padding:1px 7px;font-size:11px;line-height:18px;display:inline-block;overflow:hidden}.nUhMVa_metaTagOk{color:var(--dsw-alias-state-success-primary,#16a34a);background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#16a34a) 10%, transparent)}.nUhMVa_metaTagAction{font-family:inherit;font-size:11px;line-height:18px;font-weight:inherit;cursor:pointer;background:var(--dsw-alias-bg-layer-2,#f3f4f6);color:var(--dsw-alias-label-secondary,#6b7280);border:none;border-radius:5px;flex-shrink:0;padding:1px 7px}.nUhMVa_metaTagAction:hover:not(:disabled){color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_metaTagAction:disabled{opacity:.5;cursor:default}.nUhMVa_irowHead{align-items:flex-start;gap:8px;min-width:0;display:flex}.nUhMVa_irowHead .nUhMVa_irowName{flex:1 1 0;min-width:0}.nUhMVa_irowDevTag{letter-spacing:.02em;white-space:nowrap;cursor:default;-webkit-user-select:none;user-select:none;color:var(--dsw-alias-label-tertiary,#8b93a1);background:color-mix(in srgb, var(--dsw-alias-brand-primary,#4f6ef7) 9%, var(--dsw-alias-bg-layer-2,#f3f4f6));border-radius:99px;flex-shrink:0;padding:2px 8px;font-size:10px;font-weight:600;line-height:14px}.nUhMVa_nameLink{color:inherit;text-decoration:none}.nUhMVa_irowName{text-overflow:clip;flex-wrap:wrap;align-items:baseline;gap:6px;min-width:0;display:flex;overflow:visible}.nUhMVa_irowNameText{overflow-wrap:anywhere;white-space:normal;min-width:0}.nUhMVa_irowName>.nUhMVa_owner{flex:none}.nUhMVa_nameLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:underline}.nUhMVa_opWrap{flex-shrink:0;margin-bottom:6px;display:inline-flex;position:relative}.nUhMVa_opEntry{font:inherit;cursor:pointer;white-space:nowrap;color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l3,#d9dde3);border-radius:7px;align-items:center;gap:6px;padding:4px 10px;font-size:12px;display:inline-flex;position:relative}.nUhMVa_opEntryQuiet{color:var(--dsw-alias-label-secondary,#6b7280);background:0 0;border-color:#0000}.nUhMVa_opEntryAlert{border-color:var(--dsw-alias-state-error-primary,#dc2626);color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_opDot{background:var(--dsw-alias-state-error-primary,#dc2626);border-radius:99px;width:8px;height:8px;position:absolute;top:-3px;right:-3px}.nUhMVa_opPanel{z-index:40;background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l3,#d9dde3);border-radius:12px;width:460px;max-width:86vw;max-height:70vh;position:absolute;top:calc(100% + 6px);right:0;overflow-y:auto;box-shadow:0 20px 52px #00000047}.nUhMVa_opHead{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);align-items:center;gap:8px;padding:9px 14px;display:flex}.nUhMVa_opPanelTitle{font-size:12.5px;font-weight:600}.nUhMVa_opCloseBtn.nUhMVa_opCloseBtn{min-width:0;color:var(--dsw-alias-label-secondary,#6b7280);padding:0 6px}.nUhMVa_opAggregate{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-2,#f7f8fa);padding:9px 14px}.nUhMVa_opAggregateTop{font-variant-numeric:tabular-nums;font-size:12px;font-weight:600}.nUhMVa_opAggregateHint{color:var(--dsw-alias-label-tertiary,#8b93a1);margin-top:4px;font-size:10.5px}.nUhMVa_opRow{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);align-items:flex-start;gap:9px;padding:9px 14px;display:flex}.nUhMVa_opRow:last-child{border-bottom:none}.nUhMVa_opRowAlert{background:#dc26260f}.nUhMVa_opIcon{flex-shrink:0;place-items:center;width:14px;margin-top:1px;display:grid}.nUhMVa_opQueuedIcon{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:12px}.nUhMVa_opMain{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.nUhMVa_opTop{align-items:baseline;gap:6px;min-width:0;display:flex}.nUhMVa_opVerb{color:var(--dsw-alias-label-secondary,#6b7280);flex-shrink:0;font-size:12px}.nUhMVa_opName{text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:600;overflow:hidden}.nUhMVa_opStatus{color:var(--dsw-alias-label-tertiary,#8b93a1);overflow-wrap:anywhere;font-size:10.5px;line-height:16px}.nUhMVa_opStatusBad{color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_opActions{flex-shrink:0;align-items:center;gap:6px;margin-top:1px;display:flex}.nUhMVa_opDecision{border-top:1px dashed var(--dsw-alias-border-l2,#e5e7eb);flex-direction:column;gap:8px;margin-top:8px;padding-top:8px;display:flex}.nUhMVa_opDecisionFoot{align-items:center;gap:8px;display:flex}.nUhMVa_conflictDetailsToggle{font:inherit;cursor:pointer;color:var(--dsw-alias-label-tertiary,#8b93a1);background:0 0;border:none;align-items:center;gap:4px;padding:2px 0;font-size:11px;display:inline-flex}.nUhMVa_conflictDetailsToggle:hover{color:var(--dsw-alias-label-secondary,#6b7280)}.nUhMVa_opEmpty{text-align:center;color:var(--dsw-alias-label-secondary,#6b7280);padding:30px 14px;font-size:12px}.nUhMVa_opEmptyHint{color:var(--dsw-alias-label-tertiary,#8b93a1);margin-top:4px;font-size:11px}.nUhMVa_cardBlockedMark{font:inherit;cursor:pointer;color:var(--dsw-alias-state-error-primary,#dc2626);border:1px solid var(--dsw-alias-state-error-primary,#dc2626);background:#dc262614;border-radius:7px;align-items:center;gap:5px;padding:4px 9px;font-size:11px;display:inline-flex}.nUhMVa_dangerBtn.nUhMVa_dangerBtn{color:var(--dsw-alias-state-error-primary,#dc2626);border-color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_dangerBtn.nUhMVa_dangerBtn:hover:not(:disabled){background:var(--dsw-alias-state-error-primary,#dc2626);color:#fff}.nUhMVa_dangerArmed.nUhMVa_dangerArmed{background:var(--dsw-alias-state-error-primary,#dc2626);border-color:var(--dsw-alias-state-error-primary,#dc2626);color:var(--dsw-alias-label-primary-foreground,#fff)}.nUhMVa_retryBtn{margin-top:4px}.nUhMVa_irow{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:10px;flex-direction:column;gap:10px;min-width:0;padding:12px 14px;display:flex}.nUhMVa_irowActions{flex-wrap:wrap;justify-content:flex-start;align-items:center;gap:8px;min-width:0;display:flex}.nUhMVa_irowTrailing{flex-wrap:nowrap;flex-shrink:0;align-items:center;gap:8px;min-width:0;display:inline-flex}.nUhMVa_irowTrailing .nUhMVa_metaTag{flex-shrink:1;min-width:0}.nUhMVa_irowTrailing .nUhMVa_metaTagAction{flex-shrink:0}.nUhMVa_irowMissing{filter:grayscale();opacity:.5}.nUhMVa_irow>.nUhMVa_src,.nUhMVa_irow>.nUhMVa_owner,.nUhMVa_irow button{white-space:nowrap;flex-shrink:0}.nUhMVa_tabSearchRow{align-items:center;gap:8px;padding:0 4px 12px;display:flex}.nUhMVa_tabSearch{flex:1;min-width:0}.nUhMVa_caps{flex-wrap:wrap;align-items:center;gap:4px;min-width:0;padding:0 2px 6px;font-size:11px;line-height:1.5;display:flex}.nUhMVa_capsTitle{color:var(--dsw-alias-label-secondary,#8b949e);cursor:help}.nUhMVa_capChip{border:1px solid var(--dsw-alias-border-l2,#30363d);color:var(--dsw-alias-label-primary,#c9d1d9);white-space:nowrap;border-radius:999px;padding:0 6px}.nUhMVa_capMuted{border:1px dashed var(--dsw-alias-border-l2,#30363d);color:var(--dsw-alias-label-secondary,#8b949e);white-space:nowrap;border-radius:999px;padding:0 6px}.nUhMVa_capFact{color:var(--dsw-alias-label-secondary,#8b949e)}.nUhMVa_capCaveat{color:var(--dsw-alias-label-tertiary,#8b93a1);margin:6px 0 0;font-size:11px;line-height:16px}.nUhMVa_searchField{box-sizing:border-box;min-width:0;position:relative}.nUhMVa_searchInput.nUhMVa_searchInput{box-sizing:border-box;width:100%;min-width:0;padding-right:34px}.nUhMVa_searchClear{width:24px;height:24px;color:var(--dsw-alias-label-secondary,#59636e);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;justify-content:center;align-items:center;padding:0;font-size:20px;line-height:1;display:flex;position:absolute;top:50%;right:5px;transform:translateY(-50%)}.nUhMVa_searchClear:hover{background:var(--dsw-alias-bg-layer-2,#f3f4f6);color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_searchClear:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4f6ef7);outline-offset:1px}.nUhMVa_spec{color:var(--dsw-alias-label-secondary,#9ca3af);overflow-wrap:anywhere;min-width:0;font-family:ui-monospace,Menlo,monospace;font-size:11px}.nUhMVa_specTag{white-space:nowrap;border-radius:4px;flex-shrink:0;align-items:center;height:16px;padding:0 5px;font-size:10px;font-weight:600;display:inline-flex}.nUhMVa_specTagGit{color:var(--dsw-alias-state-business-primary,#0b7285);background:#12a3c41f}.nUhMVa_specTagFile{color:var(--dsw-alias-state-warn-primary,#b07d1b);background:#f0b42924}.nUhMVa_backupCheckList .nUhMVa_grow{white-space:nowrap;text-overflow:ellipsis;flex:70%;min-width:0;overflow:hidden}.nUhMVa_backupCheckList .nUhMVa_spec{text-align:right;white-space:nowrap;text-overflow:ellipsis;flex:0 30%;max-width:30%;overflow:hidden}.nUhMVa_staleAction{word-break:normal;flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}.nUhMVa_pct{color:var(--dsw-alias-label-secondary,#6b7280);flex-shrink:0;font-size:11px;font-weight:600}.nUhMVa_pager{flex-wrap:nowrap;justify-content:space-between;align-items:center;gap:8px;margin:16px 0 4px;display:flex}.nUhMVa_pagerPages{flex-wrap:nowrap;flex:1;justify-content:center;align-items:center;gap:4px;min-width:0;display:flex}.nUhMVa_pagerMeta{flex-wrap:nowrap;flex-shrink:0;align-items:center;gap:6px;display:flex}.nUhMVa_pagerPages button,.nUhMVa_pagerMeta button{min-width:0;padding:0 8px}.nUhMVa_pageEllipsis{color:var(--dsw-alias-label-secondary,#9ca3af);padding:0 1px;font-size:12px}.nUhMVa_pageInfo{color:var(--dsw-alias-label-secondary,#6b7280);white-space:nowrap;font-size:12px}@container (width<=544px){.nUhMVa_pager{flex-wrap:wrap;justify-content:center;gap:8px}.nUhMVa_pagerPages{flex-basis:100%}}.nUhMVa_depBadge{border:1px solid var(--dsw-alias-state-warn-primary,#b45309);color:var(--dsw-alias-state-warn-primary,#b45309);white-space:nowrap;border-radius:4px;flex-shrink:0;margin-left:6px;padding:1px 6px;font-size:11px;font-weight:600;line-height:16px}.nUhMVa_deprecate{color:var(--dsw-alias-state-warn-primary,#b45309);background:var(--dsw-alias-bg-layer-2,#fdf3e3);border:1px solid var(--dsw-alias-border-l2,#f3e3c3);border-radius:8px;margin:0;padding:8px 10px;font-size:12px;line-height:18px}.nUhMVa_deprecate a{color:var(--dsw-alias-state-warn-primary,#b45309);text-decoration:underline}.nUhMVa_deprecate .nUhMVa_src{margin-left:8px}.nUhMVa_depLine{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.nUhMVa_switch{border:1px solid var(--dsw-alias-border-l2,#d9dde3);background:var(--dsw-alias-bg-layer-2,#e5e7eb);cursor:pointer;border-radius:99px;flex-shrink:0;width:38px;height:22px;padding:0;transition:background .15s,border-color .15s;position:relative}.nUhMVa_switchOn{background:var(--dsw-alias-state-success-primary,#16a34a);border-color:var(--dsw-alias-state-success-primary,#16a34a)}.nUhMVa_switchMixed{background:var(--dsw-alias-state-warn-primary,#b45309);border-color:var(--dsw-alias-state-warn-primary,#b45309)}.nUhMVa_switchKnob{background:#fff;border-radius:99px;width:16px;height:16px;transition:left .15s;position:absolute;top:2px;left:2px;box-shadow:0 1px 2px #00000040}.nUhMVa_switchOn .nUhMVa_switchKnob,.nUhMVa_switchMixed .nUhMVa_switchKnob{left:18px}.nUhMVa_switch:disabled{opacity:.5;cursor:default}.nUhMVa_viewBar{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;align-items:center;gap:2px;width:fit-content;margin-bottom:12px;padding:2px;display:flex}.nUhMVa_viewBtn{font:inherit;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:6px;padding:4px 10px;font-size:12px;line-height:18px}.nUhMVa_viewBtn:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_viewOn{background:var(--dsw-alias-bg-layer-2,#eef0f4);color:var(--dsw-alias-label-primary,#1f2328);font-weight:600}.nUhMVa_groupRow{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;margin-bottom:10px;padding:12px 14px}.nUhMVa_groupHead{flex-wrap:wrap;align-items:center;gap:10px;min-width:0;display:flex}.nUhMVa_groupCollapse{width:22px;height:22px;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;background:0 0;border:none;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.nUhMVa_groupCollapse:hover{background:var(--dsw-alias-bg-layer-2,#eef0f4);color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_groupTitle{flex-direction:column;flex:auto;gap:1px;min-width:0;display:flex}.nUhMVa_groupTitle .nUhMVa_groupHint{margin-top:0}.nUhMVa_groupName{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:600;line-height:20px;overflow:hidden}.nUhMVa_groupMeta{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:11px;line-height:16px}.nUhMVa_groupActions{flex-wrap:wrap;flex-shrink:0;align-items:center;gap:6px;margin-left:auto;display:flex}.nUhMVa_groupMembers{flex-direction:column;gap:6px;margin-top:10px;display:flex}.nUhMVa_groupMember{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;align-items:center;gap:8px;min-width:0;padding:6px 8px;font-size:12px;line-height:18px;display:flex}.nUhMVa_groupMember .nUhMVa_nm{flex:1;min-width:0;font-size:12px}.nUhMVa_memberName{flex:auto;align-items:center;gap:6px;min-width:0;display:flex}.nUhMVa_memberName .nUhMVa_nm{flex:0 auto;min-width:0}.nUhMVa_memberKind{color:var(--dsw-alias-label-tertiary,#8b93a1);white-space:nowrap;flex:none;font-size:11px;line-height:16px}.nUhMVa_themeSlot{box-shadow:inset 0 -1px 0 var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px 8px 0 0;margin-bottom:4px}.nUhMVa_groupMember>.nUhMVa_switch,.nUhMVa_groupMember>button{flex-shrink:0}.nUhMVa_groupMemberAction{flex:none;margin-left:auto}.nUhMVa_groupMemberAction button{white-space:nowrap}.nUhMVa_groupAddPanel{border-top:1px dashed var(--dsw-alias-border-l2,#e5e7eb);flex-direction:column;gap:6px;margin-top:10px;padding-top:10px;display:flex}.nUhMVa_groupAddModalBody{flex-direction:column;gap:10px;min-width:0;display:flex}.nUhMVa_groupAddFilters{flex-wrap:wrap;gap:6px;display:flex}.nUhMVa_groupAddModalList{flex-direction:column;gap:6px;max-height:min(50vh,360px);padding-right:2px;display:flex;overflow-y:auto}.nUhMVa_groupAddModalHint{color:var(--dsw-alias-label-secondary,#6b7280);margin:0;font-size:12px;line-height:18px}.nUhMVa_groupAddPick{background:var(--dsw-alias-bg-layer-2,#f7f8fa);cursor:pointer;border-radius:8px;align-items:center;gap:8px;min-width:0;padding:8px 10px;display:flex}.nUhMVa_groupAddPick:hover{background:var(--dsw-alias-bg-layer-2,#eef0f4)}.nUhMVa_groupAddPick input{flex-shrink:0;margin:0}.nUhMVa_groupAddPick .nUhMVa_nm{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:12px;overflow:hidden}.nUhMVa_groupAddFooterMeta{color:var(--dsw-alias-label-secondary,#6b7280);align-self:center;margin-right:auto;font-size:12px;line-height:18px}.nUhMVa_groupOrgHint{color:var(--dsw-alias-label-tertiary,#8b93a1);margin:4px 0 0;font-size:11px;line-height:16px}.nUhMVa_groupRenameField{flex-direction:column;gap:6px;min-width:min(100%,320px);display:flex}.nUhMVa_groupRenameField label{color:var(--dsw-alias-label-secondary,#6b7280);font-size:12px;line-height:18px}.nUhMVa_groupRenameField .nUhMVa_inlineInput{width:100%}.nUhMVa_groupCreate{align-items:center;gap:8px;margin-bottom:10px;display:flex}.nUhMVa_groupCreateInline{flex-shrink:0;align-items:center;gap:8px;display:flex}.nUhMVa_groupCreateInline .nUhMVa_inlineInput{flex:none;width:160px}.nUhMVa_inlineInput{flex:1;min-width:120px}.nUhMVa_ungroupedRow{flex-wrap:nowrap}.nUhMVa_ungroupedRow>.nUhMVa_nm{flex:0 auto;max-width:42%;font-size:12px;line-height:18px}.nUhMVa_ungroupedState{flex:0 auto;align-items:center;min-width:0;max-width:46%;margin:0;display:inline-flex}.nUhMVa_ungroupedState>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.nUhMVa_ungroupedDesc{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-tertiary,#8b93a1);flex:1 1 0;font-size:12px;line-height:18px;overflow:hidden}.nUhMVa_ungroupedDesc.nUhMVa_noteMine{color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_groupHint{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:11px}.nUhMVa_sect{color:var(--dsw-alias-label-secondary,#6b7280);margin:14px 2px 8px;font-size:12px;font-weight:600}.nUhMVa_sectAction{color:var(--dsw-alias-label-secondary,#6b7280);align-items:center;gap:8px;margin:14px 2px 8px;font-size:12px;font-weight:600;display:flex}.nUhMVa_backupGrid{grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px;display:grid}.nUhMVa_backupCard{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;flex-direction:column;gap:10px;padding:16px;display:flex}.nUhMVa_backupCard h3{margin:0;font-size:14px}.nUhMVa_backupCard p{color:var(--dsw-alias-label-secondary,#6b7280);margin:0;font-size:12px;line-height:18px}.nUhMVa_backupActions{flex-wrap:wrap;gap:8px;display:flex;position:relative}.nUhMVa_hiddenFile{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.nUhMVa_backupInput{box-sizing:border-box;width:100%}.nUhMVa_backupCheck{cursor:pointer;align-items:center;gap:6px;font-size:12px;display:flex}.nUhMVa_backupWarn{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-state-warn-primary,#b45309)!important}.nUhMVa_backupMessage{color:var(--dsw-alias-label-secondary,#6b7280);grid-column:1/-1;font-size:12px}.nUhMVa_backupCheckList{flex-direction:column;gap:6px;max-height:260px;margin:10px 0 4px;padding-right:4px;display:flex;overflow-y:auto}.nUhMVa_backupCheckList .nUhMVa_backupCheck{justify-content:space-between;gap:8px}.nUhMVa_diagPage{flex-direction:column;gap:12px;height:100%;min-height:0;display:flex;overflow-y:auto}.nUhMVa_diagSummary{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;flex-wrap:wrap;align-items:center;gap:12px;padding:10px 14px;font-size:12px;display:flex}.nUhMVa_diagSummaryItem{color:var(--dsw-alias-label-secondary,#6b7280);white-space:nowrap;align-items:center;gap:6px;display:inline-flex}.nUhMVa_diagSummaryMeta{color:var(--dsw-alias-label-tertiary,#9ca3af);text-overflow:ellipsis;white-space:nowrap;max-width:320px;font-family:ui-monospace,Menlo,monospace;font-size:11px;overflow:hidden}.nUhMVa_diagSection{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;flex-direction:column;gap:8px;padding:12px 14px;display:flex}.nUhMVa_diagSection h3{color:var(--dsw-alias-label-primary,#1f2328);margin:0;font-size:13px;font-weight:600}.nUhMVa_diagCount{color:var(--dsw-alias-label-tertiary,#9ca3af);font-size:11px;font-weight:400}.nUhMVa_diagEmpty{color:var(--dsw-alias-label-secondary,#9ca3af);padding:8px 0;font-size:12px}.nUhMVa_diagBundle{border-top:1px solid var(--dsw-alias-border-l2,#f0f1f3);flex-direction:column;gap:6px;padding-top:8px;display:flex}.nUhMVa_diagBundle:first-of-type{border-top:none;padding-top:0}.nUhMVa_diagRow{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;font-size:12px;line-height:18px;display:flex}.nUhMVa_diagMeta{align-items:baseline;gap:8px;min-width:0;font-size:12px;display:flex}.nUhMVa_diagKey{color:var(--dsw-alias-label-tertiary,#9ca3af);flex-shrink:0;min-width:64px;font-size:11px}.nUhMVa_diagVal{color:var(--dsw-alias-label-primary,#1f2328);overflow-wrap:anywhere;min-width:0;font-family:ui-monospace,Menlo,monospace;font-size:12px;font-weight:500}.nUhMVa_diagIndex{background:var(--dsw-alias-bg-layer-2,#f3f4f6);min-width:18px;height:18px;color:var(--dsw-alias-label-secondary,#6b7280);border-radius:9px;flex-shrink:0;justify-content:center;align-items:center;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_diagArrow{color:var(--dsw-alias-label-tertiary,#9ca3af);flex-shrink:0;font-size:12px}.nUhMVa_diagBadgeOfficial{background:var(--dsw-alias-button-primary-fill,var(--dsw-alias-brand-primary,#4f6ef7));height:18px;color:var(--dsw-alias-label-primary-foreground,#fff);border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_diagBadgeCommunity{background:var(--dsw-alias-bg-layer-2,#f3f4f6);height:18px;color:var(--dsw-alias-label-secondary,#6b7280);border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;display:inline-flex}.nUhMVa_diagBadgeShadow{background:var(--dsw-alias-state-error-primary,#dc2626);height:18px;color:var(--dsw-alias-label-primary-foreground,#fff);border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_diagBadgeWarn{background:var(--dsw-alias-state-warn-primary,#b45309);height:18px;color:var(--dsw-alias-label-primary-foreground,#fff);white-space:nowrap;border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_diagBadgeInfo{background:var(--dsw-alias-bg-layer-2,#f3f4f6);height:18px;color:var(--dsw-alias-label-secondary,#6b7280);white-space:nowrap;border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;display:inline-flex}.nUhMVa_diagList{flex-direction:column;gap:6px;display:flex}.nUhMVa_sectionOverview{color:var(--dsw-alias-label-tertiary,#8b93a1);text-overflow:ellipsis;white-space:nowrap;max-width:100%;padding:2px 0 6px;font-size:12px;line-height:18px;overflow:hidden}.nUhMVa_diagAlert{color:var(--dsw-alias-state-warn-primary,#b45309)}.nUhMVa_ovRow{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;flex-wrap:wrap;align-items:center;gap:8px;min-width:0;padding:6px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_ovArrow{color:var(--dsw-alias-label-tertiary,#9ca3af);flex-shrink:0;font-size:12px}.nUhMVa_ovByTag{background:var(--dsw-alias-button-primary-fill,var(--dsw-alias-brand-primary,#4f6ef7));height:18px;color:var(--dsw-alias-label-primary-foreground,#fff);text-overflow:ellipsis;white-space:nowrap;border-radius:9px;flex-shrink:0;align-items:center;max-width:260px;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex;overflow:hidden}.nUhMVa_ovFrom{color:var(--dsw-alias-label-secondary,#6b7280);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:12px;overflow:hidden}.nUhMVa_orphRow{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;flex-wrap:wrap;align-items:center;gap:8px;min-width:0;padding:6px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_orphBadge{background:var(--dsw-alias-state-warn-primary,#b45309);height:18px;color:var(--dsw-alias-label-primary-foreground,#fff);white-space:nowrap;border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_dragHandle{width:20px;height:20px;color:var(--dsw-alias-label-tertiary,#9ca3af);cursor:grab;-webkit-user-select:none;user-select:none;flex-shrink:0;justify-content:center;align-items:center;font-size:12px;line-height:20px;display:inline-flex}.nUhMVa_dragOver{outline:2px dashed var(--dsw-alias-brand-primary,#4f6ef7);outline-offset:2px;background:var(--dsw-alias-bg-layer-2,#f0f2f8);border-radius:8px}.nUhMVa_dragging{opacity:.45;background:var(--dsw-alias-bg-layer-2,#f3f4f6)}.nUhMVa_collapseHead{font:inherit;color:var(--dsw-alias-label-primary,#1f2328);cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:8px;width:100%;padding:0;font-size:13px;font-weight:600;display:flex}.nUhMVa_collapseIcon{color:var(--dsw-alias-label-secondary,#6b7280);flex-shrink:0;display:inline-flex}.nUhMVa_collapseTitle{flex:1;min-width:0}.nUhMVa_collapseBody{border-top:1px solid var(--dsw-alias-border-l2,#f0f1f3);overflow-wrap:anywhere;flex-direction:column;gap:10px;min-width:0;margin-top:8px;padding-top:10px;display:flex}.nUhMVa_orderPanel{flex-direction:column;gap:10px;min-width:0;display:flex}.nUhMVa_panelNote{color:var(--dsw-alias-label-secondary,#6b7280);margin:0;font-size:12px;line-height:18px}.nUhMVa_panelActions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.nUhMVa_presetList{flex-direction:column;gap:6px;min-width:0;display:flex}.nUhMVa_presetRow{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;flex-direction:column;align-items:stretch;gap:6px;min-width:0;max-width:100%;padding:8px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_presetName{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;font-weight:600;overflow:hidden}.nUhMVa_snapList{flex-direction:column;gap:6px;min-width:0;display:flex}.nUhMVa_snapRow{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;flex-direction:column;align-items:stretch;gap:8px;padding:10px 12px;font-size:12px;line-height:18px;display:flex}.nUhMVa_snapMeta{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.nUhMVa_snapConfirmText{color:var(--dsw-alias-state-warn-primary,#b45309);margin:0;font-size:12px;line-height:18px}.nUhMVa_confirmRow{flex-wrap:wrap;align-items:center;gap:6px;display:inline-flex}.nUhMVa_fixFallback{flex-direction:column;gap:6px;margin:8px 0;display:flex}.nUhMVa_fixFallbackText,.nUhMVa_envEditor{box-sizing:border-box;width:100%;color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-bg-layer-2,#f3f4f6);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);resize:vertical;white-space:pre-wrap;word-break:break-all;border-radius:6px;padding:8px 10px;font-family:ui-monospace,Menlo,monospace;font-size:11px;line-height:16px}.nUhMVa_setCard{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-3,#fff);border-radius:12px;list-style:none;transition:border-color .16s,background .16s}.nUhMVa_setCard:hover{border-color:var(--dsw-alias-label-dimmed,#c8ccd4)}.nUhMVa_setCardOpen{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-color:var(--dsw-alias-label-dimmed,#c8ccd4)}.nUhMVa_setHeader{-webkit-appearance:none;appearance:none;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:12px;align-items:center;gap:12px;padding:14px 16px;display:flex}.nUhMVa_setHeader:focus-visible{outline:2px solid var(--dsw-alias-brand-primary,#4f6ef7);outline-offset:-2px}.nUhMVa_setHeadText{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.nUhMVa_setName{color:var(--dsw-alias-label-primary,#1f2328);font-size:15px;font-weight:600;line-height:1.4}.nUhMVa_setDesc{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:13px;line-height:1.5}.nUhMVa_setChevron{color:var(--dsw-alias-label-tertiary,#8b93a1);flex:none;transition:transform .16s;display:inline-flex}.nUhMVa_setChevronOpen{transform:rotate(180deg)}.nUhMVa_setBody{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb);margin:0 16px;padding-bottom:8px}.nUhMVa_setRow{align-items:center;gap:12px;padding:12px 0;display:flex}.nUhMVa_setRow+.nUhMVa_setRow{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb)}.nUhMVa_setLabelBox{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.nUhMVa_setLabel{font-size:13px;line-height:20px}.nUhMVa_setHint{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:12px;line-height:18px}.nUhMVa_setConfirm{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb);flex-direction:column;gap:8px;padding:12px 0 4px;display:flex}.nUhMVa_setCheck{cursor:pointer;align-items:center;gap:8px;font-size:12px;line-height:18px;display:flex}.nUhMVa_setActions{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb);justify-content:flex-end;align-items:center;gap:8px;padding:12px 0 4px;display:flex}.nUhMVa_setInlineActions{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:6px;display:flex}.nUhMVa_setProxyEditor{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb);flex-wrap:wrap;align-items:flex-end;gap:10px;padding:12px 0;display:flex}.nUhMVa_setProxyLabel{min-width:180px;color:var(--dsw-alias-label-secondary,#6b7280);flex-direction:column;flex:1;gap:5px;font-size:12px;line-height:18px;display:flex}.nUhMVa_setProxyInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,#d1d5db);background:var(--dsw-alias-bg-layer-3,#fff);width:100%;min-width:0;color:var(--dsw-alias-label-primary,#1f2328);font:inherit;border-radius:7px;padding:6px 8px;font-size:12px;line-height:18px}.nUhMVa_setProxyInput:focus{border-color:var(--dsw-alias-brand-primary,#4f6ef7);outline:2px solid color-mix(in srgb,var(--dsw-alias-brand-primary,#4f6ef7) 18%,transparent)}.nUhMVa_setDanger{color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_setSeg{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;flex-shrink:0;gap:2px;padding:2px;display:inline-flex}.nUhMVa_setSegBtn{font:inherit;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:3px 10px;font-size:12px;line-height:18px}.nUhMVa_setSegBtn:disabled{cursor:default;opacity:.5}.nUhMVa_setSegOn{background:var(--dsw-alias-bg-layer-2,#eef0f4);color:var(--dsw-alias-label-primary,#1f2328);font-weight:600}.nUhMVa_setBetaTag{background:var(--dsw-alias-bg-module-platform,#eef0f4);color:var(--dsw-alias-label-secondary,#6b7280);border-radius:9px;margin-left:6px;padding:0 6px;font-size:11px;font-weight:600;line-height:17px}.nUhMVa_commentsLink{cursor:pointer;white-space:nowrap;color:var(--dsw-alias-label-secondary,#9ca3af);background:0 0;border:0;padding:0;font-size:11px;line-height:16px}.nUhMVa_commentsLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_footActions{flex-shrink:0;align-items:center;gap:8px;display:inline-flex}.nUhMVa_favoriteBtn{cursor:pointer;color:var(--dsw-alias-label-secondary,#9ca3af);background:0 0;border:0;align-items:center;padding:0;display:inline-flex}.nUhMVa_favoriteBtn:hover,.nUhMVa_favoriteOn{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_commentsNote{color:var(--dsw-alias-label-secondary,#9ca3af);margin:0 0 8px;font-size:11px;line-height:16px}.nUhMVa_commentsGithubPrompt{border:1px solid color-mix(in srgb,var(--dsw-alias-brand-primary,#4f6ef7) 24%,transparent);background:color-mix(in srgb,var(--dsw-alias-brand-primary,#4f6ef7) 6%,transparent);border-radius:8px;margin:0 0 10px;padding:10px}.nUhMVa_commentsGithubHint{color:var(--dsw-alias-label-primary,#1f2328);margin:0 0 8px;font-size:12px;line-height:17px}.nUhMVa_commentsGithubAction{box-sizing:border-box;border:1px solid var(--dsw-alias-brand-primary,#4f6ef7);min-height:28px;color:var(--dsw-alias-brand-primary,#4f6ef7);border-radius:6px;justify-content:center;align-items:center;padding:5px 10px;font-size:12px;font-weight:600;line-height:16px;text-decoration:none;display:inline-flex}.nUhMVa_commentsGithubAction:hover{background:color-mix(in srgb,var(--dsw-alias-brand-primary,#4f6ef7) 9%,transparent)}.nUhMVa_commentsStatus{color:var(--dsw-alias-label-secondary,#9ca3af);margin:0;font-size:12px}.nUhMVa_commentsStatus:empty{display:none}.nUhMVa_commentsError{color:var(--dsw-alias-label-primary,#1f2328);margin:0 0 8px;font-size:12px}.nUhMVa_commentsFail{flex-direction:column;align-items:flex-start;gap:8px;padding:12px 0;display:flex}.nUhMVa_commentsMount{width:100%;min-height:240px;max-height:56vh;overflow:auto}.nUhMVa_commentsMount iframe{width:100%}.nUhMVa_notesLink{font:inherit;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;text-align:left;background:0 0;border:none;margin:2px 0 0;padding:0;font-size:12px;line-height:18px;display:block}.nUhMVa_notesLink:hover{color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_notesModalWide{width:min(640px,92vw);max-width:min(640px,92vw)}.nUhMVa_notesBody{overscroll-behavior:contain;flex-direction:column;flex:0 auto;gap:10px;min-width:0;max-height:min(60vh,520px);padding:0 2px 8px 0;display:flex;overflow-y:auto}.nUhMVa_notesRange{align-items:center;gap:8px;margin-bottom:4px;font-size:12px;line-height:18px;display:flex}.nUhMVa_notesArrow{color:var(--dsw-alias-label-tertiary,#8b93a1)}.nUhMVa_notesMeta{letter-spacing:.02em;text-transform:uppercase;color:var(--dsw-alias-label-secondary,#6b7280);flex-wrap:wrap;align-items:baseline;gap:6px;margin-top:4px;font-size:12px;line-height:18px;display:flex}.nUhMVa_notesBody>.nUhMVa_notesMeta:first-child{margin-top:0}.nUhMVa_notesPre{white-space:pre-wrap;word-break:break-word;background:var(--dsw-alias-bg-layer-2,#eef0f4);border-radius:8px;max-height:40vh;margin:0;padding:10px 12px;font-size:13px;line-height:20px;overflow:auto}.nUhMVa_notesRendered{flex-direction:column;gap:8px;min-width:0;display:flex}.nUhMVa_notesImg{border-radius:6px;max-width:100%;height:auto;margin:4px 0;display:block}.nUhMVa_notesH{margin-top:4px;font-size:13px;font-weight:650;line-height:20px}.nUhMVa_notesP{font-size:13px;line-height:20px}.nUhMVa_notesQuote{border-left:3px solid var(--dsw-alias-border-l3,#d9dde3);background:var(--dsw-alias-bg-layer-2,#f7f8fa);color:var(--dsw-alias-label-primary,#1f2328);border-radius:0 6px 6px 0;margin:0;padding:8px 10px;font-size:13px;line-height:20px}.nUhMVa_notesFence{background:var(--dsw-alias-bg-layer-2,#eef0f4);font-family:var(--dsw-alias-font-mono,ui-monospace,Menlo,monospace);white-space:pre;border-radius:8px;margin:0;padding:10px 12px;font-size:12px;line-height:18px;overflow-x:auto}.nUhMVa_notesFence code{font:inherit;background:0 0;padding:0}.nUhMVa_notesBullets{flex-direction:column;gap:4px;margin:0;padding-left:18px;font-size:13px;line-height:20px;display:flex}.nUhMVa_notesA{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:none}.nUhMVa_notesA:hover{text-decoration:underline}.nUhMVa_notesCode{font-family:var(--dsw-alias-font-mono,ui-monospace,monospace);background:var(--dsw-alias-bg-layer-2,#eef0f4);border-radius:5px;padding:1px 5px;font-size:12px}.nUhMVa_notesList{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.nUhMVa_notesRow{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);align-items:baseline;gap:12px;padding:6px 0;display:flex}.nUhMVa_notesRow:last-child{border-bottom:none}.nUhMVa_notesDate{color:var(--dsw-alias-label-tertiary,#8b93a1);font-variant-numeric:tabular-nums;flex-shrink:0;font-size:12px}.nUhMVa_notesMsg{word-break:break-word;word-break:break-word;-webkit-line-clamp:3;-webkit-box-orient:vertical;min-width:0;font-size:13px;line-height:20px;display:-webkit-box;overflow:hidden}.nUhMVa_notesSha{color:var(--dsw-alias-label-secondary,#6b7280);font-variant-numeric:tabular-nums;flex-shrink:0;margin-left:auto;font-size:12px;text-decoration:none}.nUhMVa_recoverySummary{color:var(--dsw-alias-state-error-primary,#dc2626);word-break:break-word;align-items:flex-start;gap:8px;margin-bottom:8px;font-size:12px;display:flex}.nUhMVa_recoveryHint{color:var(--dsw-alias-label-secondary,#6b7280);margin:8px 0;font-size:12px}.nUhMVa_recoveryList{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;flex-direction:column;max-height:320px;display:flex;overflow-x:hidden;overflow-y:auto}.nUhMVa_recoveryRow{border-top:1px solid var(--dsw-alias-border-l2,#eef0f4);align-items:flex-start;gap:8px;padding:6px 10px;font-size:12px;display:flex}.nUhMVa_recoveryRow:first-child{border-top:none}.nUhMVa_recoveryBlamed{box-shadow:inset 3px 0 0 var(--dsw-alias-state-error-primary,#dc2626);background:#dc262612}.nUhMVa_recoveryMuted{opacity:.6}.nUhMVa_recoveryName{word-break:break-word;flex-direction:column;gap:2px;min-width:0;display:flex}.nUhMVa_recoveryReason{color:var(--dsw-alias-state-error-primary,#dc2626);word-break:break-word;font-size:11px}.nUhMVa_recoveryNote{color:var(--dsw-alias-label-tertiary,#8b93a1);word-break:break-word;margin-top:8px;font-size:11px}.nUhMVa_recoveryBadge{background:var(--dsw-alias-bg-layer-2,#eef0f4);color:var(--dsw-alias-label-secondary,#6b7280);border-radius:5px;margin-left:6px;padding:0 5px;font-size:10px}.nUhMVa_recoveryLog{color:var(--dsw-alias-label-secondary,#6b7280);margin:4px 0 8px;font-size:11px}.nUhMVa_recoveryLog pre{white-space:pre-wrap;word-break:break-word;max-height:180px;margin:6px 0 0;overflow:auto}.nUhMVa_notesSha:hover{color:var(--dsw-alias-label-primary,#1f2328);text-decoration:underline}.nUhMVa_notesVer{color:inherit;font-weight:600;text-decoration:none}.nUhMVa_notesVer:hover{text-decoration:underline}.nUhMVa_migrationSources{flex-direction:column;gap:8px;margin-top:4px;display:flex}.nUhMVa_migrationSource{border:1px solid var(--dsw-alias-border-default,#e5e7eb);border-radius:8px;flex-direction:column;gap:4px;padding:10px 12px;display:flex}.nUhMVa_migrationSource code{overflow-wrap:anywhere;font-family:ui-monospace,Menlo,monospace;font-size:12px}.nUhMVa_migrationLabel{color:var(--dsw-alias-label-secondary,#9ca3af);font-size:11px}.nUhMVa_migrationArrow{text-align:center;color:var(--dsw-alias-label-secondary,#9ca3af)}.nUhMVa_migrationWarning{color:var(--dsw-alias-state-warn-primary,#b45309);align-items:flex-start;gap:6px;margin:12px 0 0;font-size:12px;line-height:18px;display:flex}";
2848
+ 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_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}";
2759
2849
  const tagId = "dshmarket/Market.module.css";
2760
2850
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
2761
2851
  const tag = document.createElement("style");
@@ -2785,12 +2875,19 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
2785
2875
  "bar": "nUhMVa_bar",
2786
2876
  "barFill": "nUhMVa_barFill",
2787
2877
  "barWave": "nUhMVa_barWave",
2878
+ "blockedBarName": "nUhMVa_blockedBarName",
2879
+ "blockedBarRow": "nUhMVa_blockedBarRow",
2880
+ "blockedBarUndo": "nUhMVa_blockedBarUndo",
2881
+ "blockedMissing": "nUhMVa_blockedMissing",
2882
+ "blockedTabHint": "nUhMVa_blockedTabHint",
2788
2883
  "body": "nUhMVa_body",
2789
2884
  "brokenPluginItem": "nUhMVa_brokenPluginItem",
2790
2885
  "brokenPluginNotice": "nUhMVa_brokenPluginNotice",
2791
2886
  "brokenPluginText": "nUhMVa_brokenPluginText",
2792
2887
  "byline": "nUhMVa_byline",
2793
2888
  "capCaveat": "nUhMVa_capCaveat",
2889
+ "capCaveatAt": "nUhMVa_capCaveatAt",
2890
+ "capCaveatNote": "nUhMVa_capCaveatNote",
2794
2891
  "capChip": "nUhMVa_capChip",
2795
2892
  "capFact": "nUhMVa_capFact",
2796
2893
  "capMuted": "nUhMVa_capMuted",
@@ -2800,6 +2897,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
2800
2897
  "cardAction": "nUhMVa_cardAction",
2801
2898
  "cardBlocked": "nUhMVa_cardBlocked",
2802
2899
  "cardBlockedMark": "nUhMVa_cardBlockedMark",
2900
+ "cardMore": "nUhMVa_cardMore",
2803
2901
  "cardShot": "nUhMVa_cardShot",
2804
2902
  "cardShots": "nUhMVa_cardShots",
2805
2903
  "cats": "nUhMVa_cats",
@@ -2829,7 +2927,26 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
2829
2927
  "commentsMount": "nUhMVa_commentsMount",
2830
2928
  "commentsNote": "nUhMVa_commentsNote",
2831
2929
  "commentsStatus": "nUhMVa_commentsStatus",
2930
+ "confirmBody": "nUhMVa_confirmBody",
2931
+ "confirmCmd": "nUhMVa_confirmCmd",
2932
+ "confirmContent": "nUhMVa_confirmContent",
2933
+ "confirmCopied": "nUhMVa_confirmCopied",
2934
+ "confirmCopy": "nUhMVa_confirmCopy",
2935
+ "confirmDesc": "nUhMVa_confirmDesc",
2936
+ "confirmFineprint": "nUhMVa_confirmFineprint",
2937
+ "confirmFold": "nUhMVa_confirmFold",
2938
+ "confirmModal": "nUhMVa_confirmModal",
2939
+ "confirmPanel": "nUhMVa_confirmPanel",
2940
+ "confirmPanelBody": "nUhMVa_confirmPanelBody",
2941
+ "confirmPanelChevron": "nUhMVa_confirmPanelChevron",
2942
+ "confirmPanelIcon": "nUhMVa_confirmPanelIcon",
2943
+ "confirmPanelRow": "nUhMVa_confirmPanelRow",
2944
+ "confirmPanelTitle": "nUhMVa_confirmPanelTitle",
2832
2945
  "confirmRow": "nUhMVa_confirmRow",
2946
+ "confirmTags": "nUhMVa_confirmTags",
2947
+ "confirmTerminalDot": "nUhMVa_confirmTerminalDot",
2948
+ "confirmTerminalIcon": "nUhMVa_confirmTerminalIcon",
2949
+ "confirmTerminalPrompt": "nUhMVa_confirmTerminalPrompt",
2833
2950
  "conflictBody": "nUhMVa_conflictBody",
2834
2951
  "conflictDetailsToggle": "nUhMVa_conflictDetailsToggle",
2835
2952
  "conflictHead": "nUhMVa_conflictHead",
@@ -2844,6 +2961,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
2844
2961
  "deprecate": "nUhMVa_deprecate",
2845
2962
  "desc": "nUhMVa_desc",
2846
2963
  "descClamp": "nUhMVa_descClamp",
2964
+ "descClamp3": "nUhMVa_descClamp3",
2965
+ "descMore": "nUhMVa_descMore",
2847
2966
  "descTight": "nUhMVa_descTight",
2848
2967
  "descToggle": "nUhMVa_descToggle",
2849
2968
  "diagAlert": "nUhMVa_diagAlert",
@@ -2919,13 +3038,31 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
2919
3038
  "hostRequirementBad": "nUhMVa_hostRequirementBad",
2920
3039
  "inlineInput": "nUhMVa_inlineInput",
2921
3040
  "installBtn": "nUhMVa_installBtn",
3041
+ "installCaution": "nUhMVa_installCaution",
3042
+ "installCautionBody": "nUhMVa_installCautionBody",
3043
+ "installCautionFoot": "nUhMVa_installCautionFoot",
3044
+ "installCautionHead": "nUhMVa_installCautionHead",
3045
+ "installCautionLabel": "nUhMVa_installCautionLabel",
3046
+ "installCautionLink": "nUhMVa_installCautionLink",
3047
+ "installCautionMark": "nUhMVa_installCautionMark",
2922
3048
  "irow": "nUhMVa_irow",
2923
3049
  "irowActions": "nUhMVa_irowActions",
2924
- "irowDevTag": "nUhMVa_irowDevTag",
3050
+ "irowDesc": "nUhMVa_irowDesc",
2925
3051
  "irowHead": "nUhMVa_irowHead",
3052
+ "irowMenu": "nUhMVa_irowMenu",
3053
+ "irowMeta": "nUhMVa_irowMeta",
2926
3054
  "irowMissing": "nUhMVa_irowMissing",
2927
3055
  "irowName": "nUhMVa_irowName",
2928
3056
  "irowNameText": "nUhMVa_irowNameText",
3057
+ "irowPath": "nUhMVa_irowPath",
3058
+ "irowPathCopy": "nUhMVa_irowPathCopy",
3059
+ "irowPathIcon": "nUhMVa_irowPathIcon",
3060
+ "irowStatus": "nUhMVa_irowStatus",
3061
+ "irowStatusAction": "nUhMVa_irowStatusAction",
3062
+ "irowStatusFact": "nUhMVa_irowStatusFact",
3063
+ "irowStatusIcon": "nUhMVa_irowStatusIcon",
3064
+ "irowStatusPart": "nUhMVa_irowStatusPart",
3065
+ "irowStatusSep": "nUhMVa_irowStatusSep",
2929
3066
  "irowTrailing": "nUhMVa_irowTrailing",
2930
3067
  "lightbox": "nUhMVa_lightbox",
2931
3068
  "lightboxClose": "nUhMVa_lightboxClose",
@@ -2946,7 +3083,6 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
2946
3083
  "meta": "nUhMVa_meta",
2947
3084
  "metaInline": "nUhMVa_metaInline",
2948
3085
  "metaTag": "nUhMVa_metaTag",
2949
- "metaTagAction": "nUhMVa_metaTagAction",
2950
3086
  "metaTagOk": "nUhMVa_metaTagOk",
2951
3087
  "migrationArrow": "nUhMVa_migrationArrow",
2952
3088
  "migrationLabel": "nUhMVa_migrationLabel",
@@ -2957,8 +3093,10 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
2957
3093
  "nameLink": "nUhMVa_nameLink",
2958
3094
  "nm": "nUhMVa_nm",
2959
3095
  "nmLink": "nUhMVa_nmLink",
2960
- "noteAction": "nUhMVa_noteAction",
3096
+ "noteAdd": "nUhMVa_noteAdd",
3097
+ "noteCount": "nUhMVa_noteCount",
2961
3098
  "noteEdit": "nUhMVa_noteEdit",
3099
+ "noteEditBar": "nUhMVa_noteEditBar",
2962
3100
  "noteInput": "nUhMVa_noteInput",
2963
3101
  "noteMine": "nUhMVa_noteMine",
2964
3102
  "noteRow": "nUhMVa_noteRow",
@@ -3593,15 +3731,19 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
3593
3731
  function summarize(list) {
3594
3732
  let running = 0;
3595
3733
  let queued = 0;
3734
+ let blocked = 0;
3596
3735
  let attention = 0;
3597
3736
  let settled = 0;
3598
3737
  for (const record of list) if (record.state === "running") running += 1;
3599
- else if (record.state === "queued") queued += 1;
3600
- else if (needsUser(record)) attention += 1;
3738
+ else if (record.state === "queued") {
3739
+ queued += 1;
3740
+ if ((record.blockedBy?.length ?? 0) > 0) blocked += 1;
3741
+ } else if (needsUser(record)) attention += 1;
3601
3742
  else settled += 1;
3602
3743
  return {
3603
3744
  running,
3604
3745
  queued,
3746
+ blocked,
3605
3747
  attention,
3606
3748
  settled,
3607
3749
  total: running + queued + settled,
@@ -3804,7 +3946,11 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
3804
3946
  /** The one-line status under a record's name; the bucket carries the rest. */
3805
3947
  function statusLine(t, lang, record, ahead) {
3806
3948
  switch (record.state) {
3807
- case "queued": return ahead === null || ahead === 0 ? t("opQueued") : `${t("opQueued")} · ${t("opQueuedAhead")} ${String(ahead)}`;
3949
+ case "queued": {
3950
+ const blockers = record.blockedBy?.length ?? 0;
3951
+ if (blockers > 0) return `${t("opQueued")} · ${t("opQueuedWaitingAgents").replace("{0}", String(blockers))}`;
3952
+ return ahead === null || ahead === 0 ? t("opQueued") : `${t("opQueued")} · ${t("opQueuedAhead")} ${String(ahead)}`;
3953
+ }
3808
3954
  case "running": return record.detail ?? t("opRunning");
3809
3955
  case "input": return t("opNeedsChoice");
3810
3956
  case "failed": return record.reason !== void 0 ? localizeBilingual(record.reason, lang) : t("installFail");
@@ -3834,7 +3980,9 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
3834
3980
  document.removeEventListener("mousedown", onPointer);
3835
3981
  };
3836
3982
  }, [open, setOpen]);
3837
- const label = busy ? `${t("opInstalling")} ${String(summary.progressed)}/${String(summary.total)}` : summary.attention > 0 ? `${String(summary.attention)} ${t("opNeedsYou")}` : t("opTitle");
3983
+ const waitingOnAgents = summary.running === 0 && summary.blocked > 0;
3984
+ const batchLabel = waitingOnAgents ? t("opWaitingAgents").replace("{0}", String(summary.blocked)) : `${t("opInstalling")} ${String(summary.progressed)}/${String(summary.total)}`;
3985
+ const label = busy ? batchLabel : summary.attention > 0 ? `${String(summary.attention)} ${t("opNeedsYou")}` : t("opTitle");
3838
3986
  const quiet = records.length === 0 && !open;
3839
3987
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
3840
3988
  className: Market_module_css_default.opWrap,
@@ -3885,15 +4033,9 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
3885
4033
  children: [
3886
4034
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3887
4035
  className: Market_module_css_default.opAggregateTop,
3888
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: [
3889
- t("opInstalling"),
3890
- " ",
3891
- summary.progressed,
3892
- "/",
3893
- summary.total
3894
- ] })
4036
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: batchLabel })
3895
4037
  }),
3896
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
4038
+ !waitingOnAgents && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3897
4039
  className: Market_module_css_default.bar,
3898
4040
  children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3899
4041
  className: Market_module_css_default.barFill,
@@ -3902,7 +4044,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
3902
4044
  }),
3903
4045
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
3904
4046
  className: Market_module_css_default.opAggregateHint,
3905
- children: t("opLeaveHint")
4047
+ children: waitingOnAgents ? t("opLeaveHintAgents") : t("opLeaveHint")
3906
4048
  })
3907
4049
  ]
3908
4050
  }),
@@ -6875,26 +7017,48 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
6875
7017
  * actually overflows the clamp: a two-line description has nothing to
6876
7018
  * "expand", so no button beats a button that does nothing.
6877
7019
  */
6878
- function CardDesc({ text, t }) {
7020
+ function CardDesc({ text, t, lines = 5, className, textClassName }) {
6879
7021
  const ref = (0, react.useRef)(null);
6880
7022
  const [expanded, setExpanded] = (0, react.useState)(false);
6881
7023
  const [canExpand, setCanExpand] = (0, react.useState)(false);
7024
+ const base = textClassName === void 0 ? Market_module_css_default.desc : `${Market_module_css_default.desc} ${textClassName}`;
7025
+ const clamp = lines === 3 ? Market_module_css_default.descClamp3 : Market_module_css_default.descClamp;
6882
7026
  (0, react.useLayoutEffect)(() => {
6883
7027
  const el = ref.current;
6884
7028
  if (el === null) return;
6885
- setCanExpand(el.scrollHeight > el.clientHeight + 1);
6886
- }, [text]);
6887
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6888
- ref,
6889
- className: expanded ? Market_module_css_default.desc : `${Market_module_css_default.desc} ${Market_module_css_default.descClamp}`,
6890
- children: text
6891
- }), canExpand && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6892
- type: "button",
6893
- className: Market_module_css_default.descToggle,
6894
- "aria-label": expanded ? t("descCollapse") : t("descExpand"),
6895
- onClick: () => setExpanded((e) => !e),
6896
- children: expanded ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronUpOutline14, { size: 14 }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronDownOutline14, { size: 14 })
6897
- })] });
7029
+ const measure = () => {
7030
+ if (!el.classList.contains(clamp)) return;
7031
+ setCanExpand(el.scrollHeight > el.clientHeight + 1);
7032
+ };
7033
+ measure();
7034
+ if (typeof ResizeObserver === "undefined") return;
7035
+ const observer = new ResizeObserver(measure);
7036
+ observer.observe(el);
7037
+ return () => observer.disconnect();
7038
+ }, [text, clamp]);
7039
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7040
+ className,
7041
+ children: [
7042
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7043
+ ref,
7044
+ className: expanded ? base : `${base} ${clamp}`,
7045
+ children: text
7046
+ }),
7047
+ canExpand && lines === 3 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
7048
+ type: "button",
7049
+ className: Market_module_css_default.descMore,
7050
+ onClick: () => setExpanded((e) => !e),
7051
+ 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 })]
7052
+ }),
7053
+ canExpand && lines === 5 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7054
+ type: "button",
7055
+ className: Market_module_css_default.descToggle,
7056
+ "aria-label": expanded ? t("descCollapse") : t("descExpand"),
7057
+ onClick: () => setExpanded((e) => !e),
7058
+ children: expanded ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronUpOutline14, { size: 14 }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronDownOutline14, { size: 14 })
7059
+ })
7060
+ ]
7061
+ });
6898
7062
  }
6899
7063
  /**
6900
7064
  * Full-bleed image preview, opened from a card thumbnail or a dialog's
@@ -7111,6 +7275,227 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
7111
7275
  })
7112
7276
  });
7113
7277
  }
7278
+ /** Circle with a question mark, in the same dark badge and light glyph as the
7279
+ * terminal mark below it. */
7280
+ function ConfirmCapabilityIcon() {
7281
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
7282
+ className: Market_module_css_default.confirmTerminalIcon,
7283
+ viewBox: "0 0 16 16",
7284
+ width: 16,
7285
+ height: 16,
7286
+ "aria-hidden": "true",
7287
+ focusable: "false",
7288
+ children: [
7289
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
7290
+ cx: "8",
7291
+ cy: "8",
7292
+ r: "8",
7293
+ fill: "currentColor"
7294
+ }),
7295
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
7296
+ className: Market_module_css_default.confirmTerminalPrompt,
7297
+ d: "M6.2 6.25a1.8 1.8 0 1 1 2.7 1.55C8.35 8.1 8 8.5 8 9.05",
7298
+ fill: "none",
7299
+ strokeWidth: "1.4",
7300
+ strokeLinecap: "round"
7301
+ }),
7302
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
7303
+ className: Market_module_css_default.confirmTerminalDot,
7304
+ cx: "8",
7305
+ cy: "11.2",
7306
+ r: "0.75"
7307
+ })
7308
+ ]
7309
+ });
7310
+ }
7311
+ /** Design-spec terminal mark for the install-command fold: dark rounded
7312
+ * square with a light `>_` prompt. Host ui-primitives has no matching glyph. */
7313
+ function ConfirmTerminalIcon() {
7314
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
7315
+ className: Market_module_css_default.confirmTerminalIcon,
7316
+ viewBox: "0 0 16 16",
7317
+ width: 16,
7318
+ height: 16,
7319
+ "aria-hidden": "true",
7320
+ focusable: "false",
7321
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("rect", {
7322
+ width: "16",
7323
+ height: "16",
7324
+ rx: "3.5",
7325
+ fill: "currentColor"
7326
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
7327
+ className: Market_module_css_default.confirmTerminalPrompt,
7328
+ d: "M4.25 5.25 L7.25 8 L4.25 10.75 M8.25 10.75 H12",
7329
+ fill: "none",
7330
+ strokeWidth: "1.4",
7331
+ strokeLinecap: "round",
7332
+ strokeLinejoin: "round"
7333
+ })]
7334
+ });
7335
+ }
7336
+ /** execCommand only succeeds inside the click. writeText rejects later, after
7337
+ * Chrome has already dropped the user activation, so the textarea copy has
7338
+ * to happen before that promise. The field stays inside the dialog; removing
7339
+ * a focused node outside it would drop the keyboard onto document.body. */
7340
+ function copyInstallCommandNow(text, anchor) {
7341
+ const area = document.createElement("textarea");
7342
+ area.value = text;
7343
+ area.setAttribute("readonly", "");
7344
+ area.setAttribute("aria-hidden", "true");
7345
+ area.tabIndex = -1;
7346
+ area.style.position = "fixed";
7347
+ area.style.top = "0";
7348
+ area.style.left = "-9999px";
7349
+ (anchor.parentElement ?? document.body).appendChild(area);
7350
+ area.select();
7351
+ let ok = false;
7352
+ try {
7353
+ ok = document.execCommand("copy");
7354
+ } catch {
7355
+ ok = false;
7356
+ }
7357
+ area.remove();
7358
+ anchor.focus();
7359
+ return ok;
7360
+ }
7361
+ function writeInstallCommand(text, anchor) {
7362
+ const copiedNow = copyInstallCommandNow(text, anchor);
7363
+ const write = navigator.clipboard?.writeText;
7364
+ if (typeof write !== "function") return copiedNow ? Promise.resolve() : Promise.reject(/* @__PURE__ */ new Error("copy failed"));
7365
+ return write.call(navigator.clipboard, text).then(() => void 0, () => {
7366
+ if (copiedNow) return;
7367
+ throw new Error("copy failed");
7368
+ });
7369
+ }
7370
+ /** Copy control for the install command. Success shows 「已复制」 beside the
7371
+ * icon; the command stays selectable if both copy paths fail. */
7372
+ function ConfirmCopyButton({ text, label, copiedLabel }) {
7373
+ const [copied, setCopied] = (0, react.useState)(false);
7374
+ const timer = (0, react.useRef)(null);
7375
+ (0, react.useEffect)(() => () => {
7376
+ if (timer.current !== null) clearTimeout(timer.current);
7377
+ }, []);
7378
+ const markCopied = () => {
7379
+ setCopied(true);
7380
+ if (timer.current !== null) clearTimeout(timer.current);
7381
+ timer.current = setTimeout(() => setCopied(false), 1500);
7382
+ };
7383
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [copied && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7384
+ className: Market_module_css_default.confirmCopied,
7385
+ role: "status",
7386
+ children: copiedLabel
7387
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
7388
+ type: "button",
7389
+ className: Market_module_css_default.confirmCopy,
7390
+ "aria-label": copied ? copiedLabel : label,
7391
+ onClick: (event) => {
7392
+ writeInstallCommand(text, event.currentTarget).then(markCopied, () => {});
7393
+ },
7394
+ children: copied ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCheckOutline16, { size: 14 }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCopyOutline16, { size: 14 })
7395
+ })] });
7396
+ }
7397
+ /** Stroke glyphs the host primitives do not ship. They inherit the text colour. */
7398
+ function IconPlus({ size = 14 }) {
7399
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("svg", {
7400
+ viewBox: "0 0 16 16",
7401
+ width: size,
7402
+ height: size,
7403
+ "aria-hidden": "true",
7404
+ focusable: "false",
7405
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
7406
+ d: "M8 3v10M3 8h10",
7407
+ fill: "none",
7408
+ stroke: "currentColor",
7409
+ strokeWidth: "1.3",
7410
+ strokeLinecap: "round"
7411
+ })
7412
+ });
7413
+ }
7414
+ /** Reminders off (Lucide `bell-off` geometry): the body breaks where the slash crosses it. */
7415
+ function IconBellOff({ size = 16 }) {
7416
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
7417
+ viewBox: "0 0 24 24",
7418
+ width: size,
7419
+ height: size,
7420
+ fill: "none",
7421
+ stroke: "currentColor",
7422
+ strokeWidth: "1.75",
7423
+ strokeLinecap: "round",
7424
+ strokeLinejoin: "round",
7425
+ "aria-hidden": "true",
7426
+ focusable: "false",
7427
+ children: [
7428
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "M10.268 21a2 2 0 0 0 3.464 0" }),
7429
+ /* @__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" }),
7430
+ /* @__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" }),
7431
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", { d: "m2 2 20 20" })
7432
+ ]
7433
+ });
7434
+ }
7435
+ /** Design-spec warning mark: filled amber triangle, same visual size as the
7436
+ * terminal badge above it. Title stays body ink. */
7437
+ function ConfirmWarnIcon() {
7438
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("svg", {
7439
+ className: Market_module_css_default.installCautionMark,
7440
+ viewBox: "0 0 16 16",
7441
+ width: 16,
7442
+ height: 16,
7443
+ "aria-hidden": "true",
7444
+ focusable: "false",
7445
+ children: [
7446
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
7447
+ fill: "#f8b428",
7448
+ 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"
7449
+ }),
7450
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("path", {
7451
+ d: "M8 6.05v3.15",
7452
+ fill: "none",
7453
+ stroke: "#fff",
7454
+ strokeWidth: "1.25",
7455
+ strokeLinecap: "round"
7456
+ }),
7457
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("circle", {
7458
+ cx: "8",
7459
+ cy: "11.15",
7460
+ r: "0.68",
7461
+ fill: "#fff"
7462
+ })
7463
+ ]
7464
+ });
7465
+ }
7466
+ /** Install-dialog fold (#739). A gray block, not an outlined frame: the icon
7467
+ * stays on the left and the chevron stays on the right, open or closed. */
7468
+ function ConfirmFold({ icon, title, open, onToggle, children }) {
7469
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
7470
+ className: Market_module_css_default.confirmPanel,
7471
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
7472
+ type: "button",
7473
+ className: Market_module_css_default.confirmPanelRow,
7474
+ "aria-expanded": open,
7475
+ onClick: onToggle,
7476
+ children: [
7477
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7478
+ className: Market_module_css_default.confirmPanelIcon,
7479
+ children: icon
7480
+ }),
7481
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
7482
+ className: Market_module_css_default.confirmPanelTitle,
7483
+ children: title
7484
+ }),
7485
+ open ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronUpOutline14, {
7486
+ size: 14,
7487
+ className: Market_module_css_default.confirmPanelChevron
7488
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronRightOutline14, {
7489
+ size: 14,
7490
+ className: Market_module_css_default.confirmPanelChevron
7491
+ })
7492
+ ]
7493
+ }), open && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
7494
+ className: Market_module_css_default.confirmPanelBody,
7495
+ children
7496
+ })]
7497
+ });
7498
+ }
7114
7499
  /** Catalog npm latest, omitted for github-only and not-yet-backfilled rows. */
7115
7500
  function CatalogVersionMark({ version, tip }) {
7116
7501
  if (typeof version !== "string" || version.length === 0) return null;
@@ -7199,6 +7584,36 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
7199
7584
  const names = Object.keys(left);
7200
7585
  return names.length === Object.keys(right).length && names.every((name) => left[name] === right[name]);
7201
7586
  }
7587
+ /** Same cap as `MAX_NOTE` in hot.ts; the server trims anything longer. */
7588
+ const NOTE_MAX = 200;
7589
+ /** `latest` is a semver for npm installs and a commit sha for github ones. */
7590
+ function displayLatest(latest) {
7591
+ if (/^\d/.test(latest)) return "v" + latest;
7592
+ if (/^[0-9a-f]{12,40}$/i.test(latest)) return latest.slice(0, 7);
7593
+ return latest;
7594
+ }
7595
+ /** The tail of a local checkout path; the full path stays in the title and the copy button. */
7596
+ function shortLocalPath(path) {
7597
+ const parts = path.replace(/[\\/]+$/, "").split(/[\\/]/).filter(Boolean);
7598
+ return parts.length <= 2 ? path : "…/" + parts.slice(-2).join("/");
7599
+ }
7600
+ /** A relative spec is resolved against the profile directory, so copying it elsewhere is meaningless. */
7601
+ function isAbsoluteLocalPath(path) {
7602
+ return /^(?:\/|~[\\/]|[A-Za-z]:[\\/]|\\\\)/.test(path);
7603
+ }
7604
+ /** `file:///abs` keeps one leading slash, like `file:/abs`. */
7605
+ function localPathOf(spec) {
7606
+ const match = /^(?:link|file):(?:\/\/(?=\/))?(.+)$/i.exec(spec);
7607
+ return match !== null ? match[1] : null;
7608
+ }
7609
+ /**
7610
+ * A development checkout or local package. A generation is the desktop host's
7611
+ * own install (#497) and is never one, even though its spec is a link:.
7612
+ */
7613
+ function isLocalDev(spec, status) {
7614
+ if (status?.kind === "generation" || isGenerationSpec(spec)) return false;
7615
+ return /^(?:link|file):/i.test(spec) || status?.kind === "linked";
7616
+ }
7202
7617
  /**
7203
7618
  * Whether one installed plugin has a pending update (either an ordinary
7204
7619
  * upgrade via npm/git/restore, or a host-managed generation release), and has
@@ -7270,6 +7685,21 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
7270
7685
  label: "timeYear"
7271
7686
  }
7272
7687
  ];
7688
+ /**
7689
+ * The sessions a host 409 named as blocking (#752).
7690
+ *
7691
+ * The agent guard refuses before it touches pnpm and answers with the sessions
7692
+ * that are running. Keeping them on the record is what lets a queued row say
7693
+ * WHY it is not moving: a queue entry with no reason reads as an operation
7694
+ * that is merely last in line, and "it never starts" is what the user reports.
7695
+ *
7696
+ * @returns the session names, or undefined when the host named none.
7697
+ */
7698
+ function blockedSessions(body) {
7699
+ if (!Array.isArray(body.runningAgents)) return void 0;
7700
+ const names = body.runningAgents.map(String).filter((name) => name !== "");
7701
+ return names.length === 0 ? void 0 : names;
7702
+ }
7273
7703
  function MarketSection(props) {
7274
7704
  const t = props.t;
7275
7705
  const initialWebdav = (0, react.useMemo)(savedWebdav, []);
@@ -7509,6 +7939,16 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
7509
7939
  const [favoriteError, setFavoriteError] = (0, react.useState)(null);
7510
7940
  /** Ignores out-of-order /dsh-market/favorite responses after a newer toggle. */
7511
7941
  const favoriteOpGen = (0, react.useRef)(0);
7942
+ const [blockError, setBlockError] = (0, react.useState)(null);
7943
+ const [updateExemptError, setUpdateExemptError] = (0, react.useState)(null);
7944
+ const [updateExemptNotice, setUpdateExemptNotice] = (0, react.useState)(null);
7945
+ const updateExemptOpGen = (0, react.useRef)(0);
7946
+ /** Shown once a hide sticks, so the card vanishing has a place to look. */
7947
+ const [blockNotice, setBlockNotice] = (0, react.useState)(null);
7948
+ /** Ignores out-of-order /dsh-market/block responses after a newer toggle. */
7949
+ const blockOpGen = (0, react.useRef)(0);
7950
+ const [pluginMenuUrl, setPluginMenuUrl] = (0, react.useState)(null);
7951
+ const [installedMenuName, setInstalledMenuName] = (0, react.useState)(null);
7512
7952
  const [clearingStale, setClearingStale] = (0, react.useState)(false);
7513
7953
  const [compatibilityNotice, setCompatibilityNotice] = (0, react.useState)(null);
7514
7954
  const [rollingBack, setRollingBack] = (0, react.useState)(false);
@@ -7529,6 +7969,10 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
7529
7969
  * reset the Toast's auto-dismiss timer on every parent re-render. */
7530
7970
  const exportToastDone = (0, react.useCallback)(() => setExportState("idle"), []);
7531
7971
  const favoriteErrorDone = (0, react.useCallback)(() => setFavoriteError(null), []);
7972
+ const blockErrorDone = (0, react.useCallback)(() => setBlockError(null), []);
7973
+ const blockNoticeDone = (0, react.useCallback)(() => setBlockNotice(null), []);
7974
+ const updateExemptErrorDone = (0, react.useCallback)(() => setUpdateExemptError(null), []);
7975
+ const updateExemptNoticeDone = (0, react.useCallback)(() => setUpdateExemptNotice(null), []);
7532
7976
  const [updates, setUpdates] = (0, react.useState)({});
7533
7977
  /** Update reminders dismissed for this host boot. The Installed tab still
7534
7978
  * shows these plugins and their update actions; only proactive prompts use
@@ -7605,6 +8049,9 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
7605
8049
  const [notes, setNotes] = (0, react.useState)({});
7606
8050
  /** Catalog URLs bookmarked for later install (#414). */
7607
8051
  const [favoriteUrls, setFavoriteUrls] = (0, react.useState)([]);
8052
+ /** Package names the user hid from Discover (#657). */
8053
+ const [blockedNames, setBlockedNames] = (0, react.useState)([]);
8054
+ const [updateExemptNames, setUpdateExemptNames] = (0, react.useState)([]);
7608
8055
  /** Rows the user asked to show the AUTHOR's description on, despite a note. */
7609
8056
  const [showTheirs, setShowTheirs] = (0, react.useState)([]);
7610
8057
  /** The row whose note is being edited, and the text in the box. */
@@ -7695,6 +8142,26 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
7695
8142
  */
7696
8143
  const [brokenPlugins, setBrokenPlugins] = (0, react.useState)({});
7697
8144
  const brokenPluginNames = (0, react.useMemo)(() => Object.keys(brokenPlugins), [brokenPlugins]);
8145
+ const [dismissBrokenError, setDismissBrokenError] = (0, react.useState)(null);
8146
+ /**
8147
+ * Per plugin, not one counter for the panel (#763 review).
8148
+ *
8149
+ * A shared generation made a second plugin's success swallow the first one's
8150
+ * FAILURE, so a notice the server still had stayed hidden on screen with no
8151
+ * error — the panel claimed a state the server did not have. Each name
8152
+ * carries its own counter, so only a LATER click on the SAME plugin can
8153
+ * supersede this one, and a different plugin's reply never can.
8154
+ */
8155
+ const dismissBrokenGen = (0, react.useRef)(/* @__PURE__ */ new Map());
8156
+ /**
8157
+ * Bumped by every authoritative `/installed` read. A dismiss whose reply
8158
+ * arrives after one was overtaken by that read: the panel is already showing
8159
+ * the server's truth, and rolling this failure back would put back a record
8160
+ * the read has since settled.
8161
+ */
8162
+ const installedReadGen = (0, react.useRef)(0);
8163
+ /** Rows with a dismiss in flight, so one row cannot queue two. */
8164
+ const [dismissingBroken, setDismissingBroken] = (0, react.useState)(() => /* @__PURE__ */ new Set());
7698
8165
  const [envFixing, setEnvFixing] = (0, react.useState)(false);
7699
8166
  const [envFailed, setEnvFailed] = (0, react.useState)(false);
7700
8167
  const [bootId, setBootId] = (0, react.useState)(null);
@@ -7773,6 +8240,10 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
7773
8240
  /** Install-command disclosure inside the confirm dialog. */
7774
8241
  const [cmdOpen, setCmdOpen] = (0, react.useState)(false);
7775
8242
  const [capsOpen, setCapsOpen] = (0, react.useState)(false);
8243
+ (0, react.useEffect)(() => {
8244
+ setCapsOpen(false);
8245
+ setCmdOpen(false);
8246
+ }, [confirming]);
7776
8247
  /** Per-row "why is it not live" disclosure (installed tab). */
7777
8248
  const [whyOpen, setWhyOpen] = (0, react.useState)(null);
7778
8249
  /** Restore-confirm dialog (replaces window.confirm). */
@@ -7823,10 +8294,13 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
7823
8294
  if (body.groups && typeof body.groups === "object") setGroups(body.groups);
7824
8295
  if (Array.isArray(body.groupOrder)) setGroupOrder(body.groupOrder);
7825
8296
  if (Array.isArray(body.favorites)) setFavoriteUrls(body.favorites.filter((url) => typeof url === "string"));
8297
+ if (Array.isArray(body.blocked)) setBlockedNames(body.blocked.filter((name) => typeof name === "string"));
8298
+ if (Array.isArray(body.updateExempt)) setUpdateExemptNames(body.updateExempt.filter((name) => typeof name === "string"));
7826
8299
  setInstalledBundles(Array.isArray(body.bundles) ? body.bundles.filter((name) => typeof name === "string") : []);
7827
8300
  if (body.activation && typeof body.activation === "object") setActivations(body.activation);
7828
8301
  const findings = body.diagnostics?.schema === "dsh-market/diagnostics/v1" && Array.isArray(body.diagnostics.findings) ? body.diagnostics.findings.filter(isHostDependencyFinding) : [];
7829
8302
  setBrokenPlugins(isRecordOfRecords(body.brokenPlugins) ? body.brokenPlugins : {});
8303
+ installedReadGen.current += 1;
7830
8304
  setHostDependencyFindings(findings);
7831
8305
  }).catch(() => {});
7832
8306
  fetch(api("/dsh-market/updates") + (force === true ? "?force=1" : ""), { cache: "no-store" }).then((res) => res.json()).then((body) => setUpdates(body.updates || {})).catch(() => {});
@@ -7835,6 +8309,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
7835
8309
  const catalogInstalled = (0, react.useMemo)(() => installedForCatalog(installed, installedBundles), [installed, installedBundles]);
7836
8310
  (0, react.useMemo)(() => new Set(disabledNames), [disabledNames]);
7837
8311
  const favoriteUrlSet = (0, react.useMemo)(() => new Set(favoriteUrls), [favoriteUrls]);
8312
+ const blockedNameSet = (0, react.useMemo)(() => new Set(blockedNames), [blockedNames]);
8313
+ const updateExemptSet = (0, react.useMemo)(() => new Set(updateExemptNames), [updateExemptNames]);
7838
8314
  /** Effective switch state: market disable list ∪ user-patch-layer disables. */
7839
8315
  const effectiveDisabledSet = (0, react.useMemo)(() => /* @__PURE__ */ new Set([
7840
8316
  ...disabledNames,
@@ -8172,7 +8648,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
8172
8648
  qInstalled,
8173
8649
  installedView
8174
8650
  ]);
8175
- const plugins = (0, react.useMemo)(() => data === null ? [] : visiblePlugins(data.plugins, {
8651
+ const pluginsAll = (0, react.useMemo)(() => data === null ? [] : visiblePlugins(data.plugins, {
8176
8652
  category: cat,
8177
8653
  query: q,
8178
8654
  lang,
@@ -8192,6 +8668,24 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
8192
8668
  hostCompatibility,
8193
8669
  compatibleWithHost
8194
8670
  ]);
8671
+ const pluginBlocked = (plugin) => blockAliases(plugin, matchInstalledName(plugin, installed, repoIdentities, data?.plugins, repoHints)).some((name) => blockedNameSet.has(name));
8672
+ const installedBlocked = (name) => {
8673
+ if (blockedNameSet.has(name)) return true;
8674
+ if (data === null) return false;
8675
+ const spec = installed[name];
8676
+ if (spec === void 0) return false;
8677
+ const entry = catalogEntryForInstalled(data.plugins, name, String(spec), repoIdentities[name], repoHints[name]);
8678
+ return entry !== void 0 && blockAliases(entry, name).some((alias) => blockedNameSet.has(alias));
8679
+ };
8680
+ const blockToggleName = (aliases) => aliases.find((name) => blockedNameSet.has(name)) ?? aliases[0];
8681
+ const plugins = (0, react.useMemo)(() => pluginsAll.filter((plugin) => !pluginBlocked(plugin)), [
8682
+ pluginsAll,
8683
+ blockedNameSet,
8684
+ installed,
8685
+ repoIdentities,
8686
+ data,
8687
+ repoHints
8688
+ ]);
8195
8689
  const { currentPage, totalPages, pageSize, goToPage, changePageSize } = usePagination(plugins.length, [
8196
8690
  q,
8197
8691
  cat,
@@ -8220,7 +8714,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
8220
8714
  loadHostCompatibility
8221
8715
  ]);
8222
8716
  const loadedHostPackages = allHostPackages.reduce((count, name) => count + (hostCompatibility[name] === void 0 ? 0 : 1), 0);
8223
- const themePlugins$1 = (0, react.useMemo)(() => data === null ? [] : visiblePlugins(data.plugins, {
8717
+ const themePluginsAll = (0, react.useMemo)(() => data === null ? [] : visiblePlugins(data.plugins, {
8224
8718
  category: "theme",
8225
8719
  query: qThemes,
8226
8720
  lang,
@@ -8235,6 +8729,32 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
8235
8729
  themeSortDir,
8236
8730
  themeTimeRange
8237
8731
  ]);
8732
+ const themePlugins$1 = (0, react.useMemo)(() => themePluginsAll.filter((plugin) => !pluginBlocked(plugin)), [
8733
+ themePluginsAll,
8734
+ blockedNameSet,
8735
+ installed,
8736
+ repoIdentities,
8737
+ data,
8738
+ repoHints
8739
+ ]);
8740
+ const blockedPlugins = (0, react.useMemo)(() => data === null ? [] : data.plugins.filter((plugin) => pluginBlocked(plugin)), [
8741
+ data,
8742
+ blockedNameSet,
8743
+ installed,
8744
+ repoIdentities,
8745
+ repoHints
8746
+ ]);
8747
+ const blockedMissing = (0, react.useMemo)(() => {
8748
+ const covered = new Set(blockedPlugins.flatMap((plugin) => blockAliases(plugin, matchInstalledName(plugin, installed, repoIdentities, data?.plugins, repoHints))));
8749
+ return blockedNames.filter((name) => !covered.has(name));
8750
+ }, [
8751
+ blockedNames,
8752
+ blockedPlugins,
8753
+ installed,
8754
+ repoIdentities,
8755
+ data,
8756
+ repoHints
8757
+ ]);
8238
8758
  const themePagination = usePagination(themePlugins$1.length, [
8239
8759
  qThemes,
8240
8760
  themeSortField,
@@ -8411,7 +8931,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
8411
8931
  if (body.agentsBusy === true) {
8412
8932
  setRecords((list) => patch(list, recordId, {
8413
8933
  state: "queued",
8414
- reason: t("agentBusyQueued")
8934
+ reason: t("agentBusyQueued"),
8935
+ blockedBy: blockedSessions(body)
8415
8936
  }));
8416
8937
  setOperationsOpen(true);
8417
8938
  return;
@@ -8741,7 +9262,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
8741
9262
  if (body.agentsBusy === true) {
8742
9263
  setRecords((list) => patch(list, updateRecordId, {
8743
9264
  state: "queued",
8744
- reason: t("agentBusyUpdateQueued")
9265
+ reason: t("agentBusyUpdateQueued"),
9266
+ blockedBy: blockedSessions(body)
8745
9267
  }));
8746
9268
  setOperationsOpen(true);
8747
9269
  return;
@@ -9009,6 +9531,180 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9009
9531
  favoriteUrls,
9010
9532
  t
9011
9533
  ]);
9534
+ const toggleBlock = (0, react.useCallback)((name) => {
9535
+ const gen = ++blockOpGen.current;
9536
+ const nextBlocked = !blockedNameSet.has(name);
9537
+ const previous = blockedNames;
9538
+ setBlockError(null);
9539
+ setBlockedNames((list) => {
9540
+ if (nextBlocked) return list.includes(name) ? list : [...list, name];
9541
+ return list.filter((entry) => entry !== name);
9542
+ });
9543
+ fetch(api("/dsh-market/block"), {
9544
+ method: "POST",
9545
+ headers: { "content-type": "application/json" },
9546
+ body: JSON.stringify({
9547
+ name,
9548
+ blocked: nextBlocked
9549
+ })
9550
+ }).then(async (res) => {
9551
+ const text = await res.text();
9552
+ let body = null;
9553
+ if (text !== "") try {
9554
+ body = JSON.parse(text);
9555
+ } catch {}
9556
+ return {
9557
+ status: res.status,
9558
+ body
9559
+ };
9560
+ }).then(({ status, body }) => {
9561
+ if (gen !== blockOpGen.current) return;
9562
+ if (status === 200 && body?.ok === true && Array.isArray(body.blocked)) {
9563
+ setBlockedNames(body.blocked.filter((entry) => typeof entry === "string"));
9564
+ if (nextBlocked) setBlockNotice(t("blockMoved"));
9565
+ return;
9566
+ }
9567
+ setBlockedNames(previous);
9568
+ setBlockError(typeof body?.error === "string" ? body.error : t("blockFailed"));
9569
+ }).catch((error) => {
9570
+ if (gen !== blockOpGen.current) return;
9571
+ setBlockedNames(previous);
9572
+ setBlockError(String(error));
9573
+ });
9574
+ }, [
9575
+ blockedNameSet,
9576
+ blockedNames,
9577
+ t
9578
+ ]);
9579
+ const toggleUpdateExempt = (0, react.useCallback)((name) => {
9580
+ const gen = ++updateExemptOpGen.current;
9581
+ const nextExempt = !updateExemptSet.has(name);
9582
+ const previous = updateExemptNames;
9583
+ setUpdateExemptError(null);
9584
+ setUpdateExemptNames((list) => {
9585
+ if (nextExempt) return list.includes(name) ? list : [...list, name];
9586
+ return list.filter((entry) => entry !== name);
9587
+ });
9588
+ fetch(api("/dsh-market/update-exempt"), {
9589
+ method: "POST",
9590
+ headers: { "content-type": "application/json" },
9591
+ body: JSON.stringify({
9592
+ name,
9593
+ exempt: nextExempt
9594
+ })
9595
+ }).then(async (res) => {
9596
+ const text = await res.text();
9597
+ let body = null;
9598
+ if (text !== "") try {
9599
+ body = JSON.parse(text);
9600
+ } catch {}
9601
+ return {
9602
+ status: res.status,
9603
+ body
9604
+ };
9605
+ }).then(({ status, body }) => {
9606
+ if (gen !== updateExemptOpGen.current) return;
9607
+ if (status === 200 && body?.ok === true && Array.isArray(body.updateExempt)) {
9608
+ setUpdateExemptNames(body.updateExempt.filter((entry) => typeof entry === "string"));
9609
+ setUpdateExemptNotice(t(nextExempt ? "updateExemptOn" : "updateExemptOff"));
9610
+ return;
9611
+ }
9612
+ setUpdateExemptNames(previous);
9613
+ setUpdateExemptError(typeof body?.error === "string" ? body.error : t("updateExemptFailed"));
9614
+ }).catch((error) => {
9615
+ if (gen !== updateExemptOpGen.current) return;
9616
+ setUpdateExemptNames(previous);
9617
+ setUpdateExemptError(String(error));
9618
+ });
9619
+ }, [
9620
+ updateExemptSet,
9621
+ updateExemptNames,
9622
+ t
9623
+ ]);
9624
+ /**
9625
+ * Stop showing one removed-declaration notice (#763).
9626
+ *
9627
+ * The notice is durable on purpose — it is the only thing left that says why
9628
+ * a plugin vanished — but the reporter's plugin was no longer in the catalog,
9629
+ * so the search it offered found nothing and the banner outlived every other
9630
+ * action. Hiding it says nothing about the plugin: the declaration stays
9631
+ * dropped and the directory stays where it is.
9632
+ *
9633
+ * Every step touches THIS name and nothing else, in both directions:
9634
+ *
9635
+ * - success removes this key and ignores the reply's map. That map is a
9636
+ * snapshot from when the request ran, so adopting it wholesale would
9637
+ * resurrect a notice another click had already dismissed, and would drop a
9638
+ * record an `/installed` read reported while this was in flight — including
9639
+ * one written by a failed update (#663), which is the one thing the notice
9640
+ * exists for.
9641
+ * - failure puts THIS key back, and only if no `/installed` read has landed
9642
+ * since: that read is the server's current truth and outranks a rollback
9643
+ * built from what the panel happened to be showing.
9644
+ *
9645
+ * A dismiss that silently did nothing is worse than having no button: the
9646
+ * user would go on believing they had been told the truth about their profile.
9647
+ */
9648
+ const dismissBrokenPlugin = (0, react.useCallback)((name) => {
9649
+ const record = brokenPlugins[name];
9650
+ if (record === void 0) return;
9651
+ const gens = dismissBrokenGen.current;
9652
+ const gen = (gens.get(name) ?? 0) + 1;
9653
+ gens.set(name, gen);
9654
+ const readAtRequest = installedReadGen.current;
9655
+ setDismissBrokenError(null);
9656
+ setDismissingBroken((current) => new Set(current).add(name));
9657
+ setBrokenPlugins((current) => {
9658
+ if (current[name] === void 0) return current;
9659
+ const next = { ...current };
9660
+ delete next[name];
9661
+ return next;
9662
+ });
9663
+ /** This request's own failure, applied to this one name only. */
9664
+ const restore = (reason) => {
9665
+ if (dismissBrokenGen.current.get(name) !== gen) return;
9666
+ if (installedReadGen.current === readAtRequest) setBrokenPlugins((current) => current[name] === void 0 ? {
9667
+ ...current,
9668
+ [name]: record
9669
+ } : current);
9670
+ setDismissBrokenError(reason);
9671
+ };
9672
+ fetch(api("/dsh-market/dismiss-broken"), {
9673
+ method: "POST",
9674
+ headers: { "content-type": "application/json" },
9675
+ body: JSON.stringify({ name })
9676
+ }).then(async (res) => {
9677
+ const text = await res.text();
9678
+ let body = null;
9679
+ if (text !== "") try {
9680
+ body = JSON.parse(text);
9681
+ } catch {}
9682
+ return {
9683
+ status: res.status,
9684
+ body
9685
+ };
9686
+ }).then(({ status, body }) => {
9687
+ if (status === 200 && body?.ok === true) {
9688
+ if (dismissBrokenGen.current.get(name) !== gen) return;
9689
+ setBrokenPlugins((current) => {
9690
+ if (current[name] === void 0) return current;
9691
+ const next = { ...current };
9692
+ delete next[name];
9693
+ return next;
9694
+ });
9695
+ return;
9696
+ }
9697
+ restore(typeof body?.error === "string" ? body.error : t("toggleFail"));
9698
+ }).catch((error) => {
9699
+ restore(String(error));
9700
+ }).finally(() => {
9701
+ setDismissingBroken((current) => {
9702
+ const next = new Set(current);
9703
+ next.delete(name);
9704
+ return next;
9705
+ });
9706
+ });
9707
+ }, [brokenPlugins, t]);
9012
9708
  const clearStaleFavorites = (0, react.useCallback)(() => {
9013
9709
  if (favoriteStale.length === 0) return;
9014
9710
  const gen = ++favoriteOpGen.current;
@@ -9086,7 +9782,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9086
9782
  if (status === 409 && body.agentsBusy === true) {
9087
9783
  setRecords((list) => patch(list, uninstallRecordId, {
9088
9784
  state: "queued",
9089
- reason: t("agentBusyUninstallQueued")
9785
+ reason: t("agentBusyUninstallQueued"),
9786
+ blockedBy: blockedSessions(body)
9090
9787
  }));
9091
9788
  setOperationsOpen(true);
9092
9789
  return;
@@ -9189,10 +9886,18 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9189
9886
  }, []);
9190
9887
  /** A queued record's "run now": retry immediately instead of waiting for idle. */
9191
9888
  const runQueuedNow = (0, react.useCallback)((record) => {
9889
+ const blockers = statusRef.current.runningAgents;
9890
+ if (blockers.length > 0) {
9891
+ setInstallError(t("queuedRunBlocked").replace("{0}", String(blockers.length)));
9892
+ setOperationsOpen(true);
9893
+ return;
9894
+ }
9192
9895
  if (record.kind === "install") {
9193
9896
  const plugin = data?.plugins.find((candidate) => candidate.url === record.url);
9194
9897
  if (plugin === void 0) {
9195
9898
  setRecords((prev) => drop(prev, record.id));
9899
+ setInstallError(t("queuedInstallGone"));
9900
+ setOperationsOpen(true);
9196
9901
  return;
9197
9902
  }
9198
9903
  setRecords((prev) => drop(prev, record.id));
@@ -9208,7 +9913,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9208
9913
  data,
9209
9914
  doInstall,
9210
9915
  doUpdate,
9211
- doUninstall
9916
+ doUninstall,
9917
+ t
9212
9918
  ]);
9213
9919
  /** Live enable/disable of one installed plugin (#60). `reload` opts the
9214
9920
  * card-level theme flow into a page refresh so the visual result lands
@@ -9420,9 +10126,10 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9420
10126
  const updatableNames = Object.keys(installed).filter((name) => name !== selfName && !effectiveDisabledSet.has(name) && isPluginUpdatable(name, String(installed[name]), updates[name], updatedNames));
9421
10127
  const batchUpdatableNames = updatableNames.filter((name) => updates[name]?.restoreRequired !== true);
9422
10128
  const ignoredUpdateSet = (0, react.useMemo)(() => new Set(ignoredUpdateNames), [ignoredUpdateNames]);
9423
- const reminderUpdatableNames = updatableNames.filter((name) => !ignoredUpdateSet.has(name));
9424
- const reminderBatchUpdatableNames = batchUpdatableNames.filter((name) => !ignoredUpdateSet.has(name));
9425
- const reminderUpdateNames = [...updates[selfName]?.updateAvailable === true && !updatedNames.includes(selfName) ? [selfName] : [], ...updatableNames].filter((name) => !ignoredUpdateSet.has(name));
10129
+ const quietUpdateSet = (0, react.useMemo)(() => /* @__PURE__ */ new Set([...ignoredUpdateNames, ...updateExemptNames]), [ignoredUpdateNames, updateExemptNames]);
10130
+ const reminderUpdatableNames = updatableNames.filter((name) => !quietUpdateSet.has(name) && !installedBlocked(name));
10131
+ const reminderBatchUpdatableNames = batchUpdatableNames.filter((name) => !quietUpdateSet.has(name) && !installedBlocked(name));
10132
+ const reminderUpdateNames = [...updates[selfName]?.updateAvailable === true && !updatedNames.includes(selfName) ? [selfName] : [], ...updatableNames].filter((name) => !quietUpdateSet.has(name) && !installedBlocked(name));
9426
10133
  const installedOtherCount = Object.keys(installed).filter((name) => name !== selfName).length;
9427
10134
  const ignoreUpdateNotices = (0, react.useCallback)((names) => {
9428
10135
  if (bootId === null || names.length === 0) return;
@@ -9437,6 +10144,19 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9437
10144
  return next;
9438
10145
  });
9439
10146
  }, [bootId]);
10147
+ const unignoreUpdateNotice = (0, react.useCallback)((name) => {
10148
+ if (bootId === null) return;
10149
+ setIgnoredUpdateNames((current) => {
10150
+ const next = current.filter((n) => n !== name);
10151
+ try {
10152
+ sessionStorage.setItem(IGNORED_UPDATES_SESSION_KEY, JSON.stringify({
10153
+ boot: bootId,
10154
+ names: next
10155
+ }));
10156
+ } catch {}
10157
+ return next;
10158
+ });
10159
+ }, [bootId]);
9440
10160
  const doUpdateAll = (0, react.useCallback)(() => {
9441
10161
  const names = reminderBatchUpdatableNames.slice();
9442
10162
  setUpdatingAll(true);
@@ -9684,30 +10404,40 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9684
10404
  ...installed
9685
10405
  };
9686
10406
  /**
9687
- * Installed entries ordered for the list view.
10407
+ * Installed entries ordered for the list view: enabled plugins first
10408
+ * (#745), then rows with a pending update, then manifest order — a stable
10409
+ * sort, so each of those groups keeps its own order.
9688
10410
  *
9689
10411
  * The order settles once and then holds, so rows never reshuffle under a
9690
- * pointer that is already aiming at one (#631). The single moment that has
9691
- * to reorder is when the update check lands: `/installed` is a local read
10412
+ * pointer that is already aiming at one (#631). Two moments are allowed to
10413
+ * move it. One is when the update check lands: `/installed` is a local read
9692
10414
  * and `/updates` is a network probe over every package, so the list is
9693
10415
  * always rendered BEFORE the answer exists — freezing on the view alone
9694
10416
  * would leave it in manifest order forever. `updatesLoaded` is therefore
9695
10417
  * the one part of `updates` allowed in, as a boolean: it flips once when
9696
10418
  * the result arrives, and every later change (a newer check, a row the user
9697
- * just updated) leaves the boolean and the order alone.
10419
+ * just updated) leaves the boolean and the order alone. The other is the
10420
+ * disable set changing: when the snapshot first arrives, or when a switch
10421
+ * the user flipped settles — and in the switch case the toggled row is the
10422
+ * only one that crosses the enabled/disabled line, so every other row
10423
+ * stays where it was.
9698
10424
  */
9699
10425
  const isInstalledListActive = tab === "installed" && installedView === "list";
9700
10426
  const updatesLoaded = Object.keys(updates).length > 0;
9701
10427
  const orderedInstalledEntries = (0, react.useMemo)(() => {
9702
10428
  return Object.entries(displayedInstalled).filter(([name]) => name !== selfName).sort(([nameA, specA], [nameB, specB]) => {
9703
- const aUp = isPluginUpdatable(nameA, String(specA), updates[nameA], updatedNames, ignoredUpdateSet) ? 1 : 0;
9704
- return (isPluginUpdatable(nameB, String(specB), updates[nameB], updatedNames, ignoredUpdateSet) ? 1 : 0) - aUp;
10429
+ const aOn = effectiveDisabledSet.has(nameA) ? 0 : 1;
10430
+ const bOn = effectiveDisabledSet.has(nameB) ? 0 : 1;
10431
+ if (aOn !== bOn) return bOn - aOn;
10432
+ const aUp = isPluginUpdatable(nameA, String(specA), updates[nameA], updatedNames, quietUpdateSet) ? 1 : 0;
10433
+ return (isPluginUpdatable(nameB, String(specB), updates[nameB], updatedNames, quietUpdateSet) ? 1 : 0) - aUp;
9705
10434
  });
9706
10435
  }, [
9707
10436
  isInstalledListActive,
9708
10437
  displayedInstalled,
9709
10438
  selfName,
9710
- updatesLoaded
10439
+ updatesLoaded,
10440
+ effectiveDisabledSet
9711
10441
  ]);
9712
10442
  const missingRestoreCount = Object.keys(pendingDependencies).filter((name) => !installedFiles.includes(name)).length;
9713
10443
  const hasUpdates = reminderUpdatableNames.length > 0;
@@ -9736,6 +10466,97 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9736
10466
  })
9737
10467
  });
9738
10468
  };
10469
+ const renderPluginMenu = (plugin) => {
10470
+ const aliases = blockAliases(plugin, matchInstalledName(plugin, installed, repoIdentities, data?.plugins, repoHints));
10471
+ const hidden = aliases.some((name) => blockedNameSet.has(name));
10472
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
10473
+ open: pluginMenuUrl === plugin.url,
10474
+ onClose: () => setPluginMenuUrl(null),
10475
+ onSelect: (id) => {
10476
+ setPluginMenuUrl(null);
10477
+ if (id === "block") toggleBlock(blockToggleName(aliases));
10478
+ },
10479
+ align: "end",
10480
+ portal: true,
10481
+ anchor: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
10482
+ type: "button",
10483
+ className: Market_module_css_default.cardMore,
10484
+ "aria-label": t("groupMore"),
10485
+ "aria-expanded": pluginMenuUrl === plugin.url,
10486
+ onClick: () => setPluginMenuUrl((open) => open === plugin.url ? null : plugin.url),
10487
+ children: "···"
10488
+ }),
10489
+ items: [{
10490
+ id: "block",
10491
+ label: hidden ? t("blockRemove") : t("blockAdd")
10492
+ }]
10493
+ });
10494
+ };
10495
+ const renderInstalledBlockMenu = (name) => {
10496
+ const entry = data === null ? void 0 : catalogEntryForInstalled(data.plugins, name, String(installed[name] ?? ""), repoIdentities[name], repoHints[name]);
10497
+ const aliases = entry === void 0 ? [name] : blockAliases(entry, name);
10498
+ const hidden = aliases.some((alias) => blockedNameSet.has(alias));
10499
+ const removing = removingName === name;
10500
+ const uninstallBusy = removingName !== null || busyUrl !== null || updatingName !== null;
10501
+ const spec = String(installed[name] ?? "");
10502
+ const status = updates[name];
10503
+ const localDev = isLocalDev(spec, status);
10504
+ const exempt = updateExemptSet.has(name);
10505
+ const updatable = isPluginUpdatable(name, spec, status, updatedNames);
10506
+ const showExempt = !localDev || exempt || updatable;
10507
+ const showBootIgnore = bootId !== null && !exempt && !ignoredUpdateSet.has(name) && updatable;
10508
+ const showRestore = localDev && !(status?.updateAvailable === true && status.restoreRequired === true);
10509
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
10510
+ open: installedMenuName === name,
10511
+ onClose: () => setInstalledMenuName(null),
10512
+ onSelect: (id) => {
10513
+ setInstalledMenuName(null);
10514
+ if (id === "restore-online" && data !== null && !uninstallBusy) askRestore(name);
10515
+ if (id === "block") toggleBlock(blockToggleName(aliases));
10516
+ if (id === "update-exempt") toggleUpdateExempt(name);
10517
+ if (id === "ignore-boot") ignoreUpdateNotices([name]);
10518
+ if (id === "uninstall" && !uninstallBusy) setRemoveConfirm(name);
10519
+ },
10520
+ align: "end",
10521
+ portal: true,
10522
+ anchor: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
10523
+ variant: "ghost",
10524
+ size: "sm",
10525
+ "aria-label": t("groupMore"),
10526
+ onClick: () => setInstalledMenuName((open) => open === name ? null : name),
10527
+ children: "···"
10528
+ }),
10529
+ items: [
10530
+ ...showRestore ? [{
10531
+ id: "restore-online",
10532
+ label: t("restoreOnline"),
10533
+ disabled: data === null || uninstallBusy
10534
+ }] : [],
10535
+ {
10536
+ id: "block",
10537
+ label: hidden ? t("blockRemove") : t("blockAdd")
10538
+ },
10539
+ ...showBootIgnore ? [{
10540
+ id: "ignore-boot",
10541
+ label: t("ignoreUpdateNotice")
10542
+ }] : [],
10543
+ ...showExempt ? [{
10544
+ id: "update-exempt",
10545
+ label: exempt ? t("updateExemptRemove") : t("updateExemptAdd")
10546
+ }] : [],
10547
+ {
10548
+ type: "separator",
10549
+ id: "uninstall-sep"
10550
+ },
10551
+ {
10552
+ id: "uninstall",
10553
+ label: removing ? t("uninstalling") : t("uninstall"),
10554
+ danger: true,
10555
+ disabled: uninstallBusy
10556
+ }
10557
+ ]
10558
+ });
10559
+ };
9739
10560
  /**
9740
10561
  * Chip label for one capability name, or the scanner's own name.
9741
10562
  *
@@ -9811,45 +10632,42 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
9811
10632
  size: 14,
9812
10633
  className: Market_module_css_default.bannerIcon
9813
10634
  }), " " + redLineLabel(line)]
9814
- }, line)), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
9815
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconQuestionOutline14, { size: 16 }),
10635
+ }, line)), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(ConfirmFold, {
10636
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConfirmCapabilityIcon, {}),
9816
10637
  title: t("capabilityTitle"),
9817
10638
  open: capsOpen,
9818
- expandable: true,
9819
- expandOnRowClick: true,
9820
10639
  onToggle: () => setCapsOpen((o) => !o),
9821
- children: [
9822
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
9823
- className: Market_module_css_default.caps,
9824
- children: [p.capabilities === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
9825
- className: Market_module_css_default.capMuted,
9826
- "data-state": "unchecked",
9827
- children: t("capabilityUnchecked")
9828
- }) : p.capabilities.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
9829
- className: Market_module_css_default.capMuted,
9830
- "data-state": "none",
9831
- children: t("capabilityNone")
9832
- }) : p.capabilities.map((name) => HostTag !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(HostTag, {
9833
- tone: "outline",
9834
- className: Market_module_css_default.capChip,
9835
- children: capabilityLabel(name)
9836
- }, name) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
9837
- className: Market_module_css_default.capChip,
9838
- children: capabilityLabel(name)
9839
- }, name)), redLines.filter((line) => !redLineIsUrgent(line)).map((line) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
9840
- className: Market_module_css_default.capFact,
9841
- children: redLineLabel(line)
9842
- }, line))]
9843
- }),
9844
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
9845
- className: Market_module_css_default.capCaveat,
10640
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10641
+ className: Market_module_css_default.caps,
10642
+ children: [p.capabilities === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10643
+ className: Market_module_css_default.capMuted,
10644
+ "data-state": "unchecked",
10645
+ children: t("capabilityUnchecked")
10646
+ }) : p.capabilities.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10647
+ className: Market_module_css_default.capMuted,
10648
+ "data-state": "none",
10649
+ children: t("capabilityNone")
10650
+ }) : p.capabilities.map((name) => HostTag !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(HostTag, {
10651
+ tone: "outline",
10652
+ className: Market_module_css_default.capChip,
10653
+ children: capabilityLabel(name)
10654
+ }, name) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10655
+ className: Market_module_css_default.capChip,
10656
+ children: capabilityLabel(name)
10657
+ }, name)), redLines.filter((line) => !redLineIsUrgent(line)).map((line) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10658
+ className: Market_module_css_default.capFact,
10659
+ children: redLineLabel(line)
10660
+ }, line))]
10661
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
10662
+ className: Market_module_css_default.capCaveat,
10663
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10664
+ className: Market_module_css_default.capCaveatNote,
9846
10665
  children: t("capabilityNote")
9847
- }),
9848
- typeof p.capabilityCheckedAt === "string" && p.capabilityCheckedAt.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
9849
- className: Market_module_css_default.capCaveat,
10666
+ }), typeof p.capabilityCheckedAt === "string" && p.capabilityCheckedAt.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10667
+ className: Market_module_css_default.capCaveatAt,
9850
10668
  children: t("capabilityScannedAt").replace("{0}", p.capabilityCheckedAt.slice(0, 10))
9851
- })
9852
- ]
10669
+ })]
10670
+ })]
9853
10671
  })] });
9854
10672
  };
9855
10673
  /**
@@ -10033,12 +10851,16 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
10033
10851
  }, category))]
10034
10852
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
10035
10853
  className: Market_module_css_default.footActions,
10036
- children: [renderFavoriteControl(p.url), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
10037
- type: "button",
10038
- className: Market_module_css_default.commentsLink,
10039
- onClick: () => setCommentsFor(p),
10040
- children: t("comments")
10041
- })]
10854
+ children: [
10855
+ renderFavoriteControl(p.url),
10856
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
10857
+ type: "button",
10858
+ className: Market_module_css_default.commentsLink,
10859
+ onClick: () => setCommentsFor(p),
10860
+ children: t("comments")
10861
+ }),
10862
+ renderPluginMenu(p)
10863
+ ]
10042
10864
  })]
10043
10865
  }),
10044
10866
  busy && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
@@ -10175,9 +10997,9 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
10175
10997
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10176
10998
  className: Market_module_css_default.themeCardFooter,
10177
10999
  children: [
10178
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11000
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
10179
11001
  className: Market_module_css_default.footActions,
10180
- children: renderFavoriteControl(p.url)
11002
+ children: [renderFavoriteControl(p.url), renderPluginMenu(p)]
10181
11003
  }),
10182
11004
  instName === null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10183
11005
  className: Market_module_css_default.themeLifecycle,
@@ -10476,7 +11298,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
10476
11298
  (() => {
10477
11299
  const self = installed["dshmarket"] !== void 0 ? "dshmarket" : "dsh-market";
10478
11300
  const status = updates[self];
10479
- return status && status.updateAvailable && !updatedNames.includes(self) && !ignoredUpdateSet.has(self) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
11301
+ return status && status.updateAvailable && !updatedNames.includes(self) && !quietUpdateSet.has(self) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
10480
11302
  variant: "primary",
10481
11303
  size: "sm",
10482
11304
  disabled: updatingName !== null || busyUrl !== null,
@@ -10559,6 +11381,11 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
10559
11381
  className: Market_module_css_default.dot
10560
11382
  })]
10561
11383
  }),
11384
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
11385
+ className: tab === "blocked" ? `${Market_module_css_default.tab} ${Market_module_css_default.on}` : Market_module_css_default.tab,
11386
+ onClick: () => setTab("blocked"),
11387
+ children: t("tabBlocked") + (blockedNames.length > 0 ? " (" + blockedNames.length + ")" : "")
11388
+ }),
10562
11389
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
10563
11390
  className: tab === "backup" || tab === "diagnostics" ? `${Market_module_css_default.tab} ${Market_module_css_default.on}` : Market_module_css_default.tab,
10564
11391
  onClick: () => {
@@ -10771,24 +11598,41 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
10771
11598
  findings: hostDependencyFindings,
10772
11599
  t
10773
11600
  }),
10774
- tab === "installed" && brokenPluginNames.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
11601
+ tab === "installed" && brokenPluginNames.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10775
11602
  className: Market_module_css_default.brokenPluginNotice,
10776
- children: brokenPluginNames.map((name) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11603
+ children: [brokenPluginNames.map((name) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10777
11604
  className: Market_module_css_default.brokenPluginItem,
10778
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11605
+ children: [
11606
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11607
+ className: Market_module_css_default.brokenPluginText,
11608
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: t("brokenPluginTitle").replace("{0}", name) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("brokenPluginBody") })]
11609
+ }),
11610
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
11611
+ variant: "outline",
11612
+ size: "sm",
11613
+ onClick: () => {
11614
+ setCat("all");
11615
+ setQ(name);
11616
+ setTab("discover");
11617
+ },
11618
+ children: t("brokenPluginAction")
11619
+ }),
11620
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
11621
+ variant: "ghost",
11622
+ size: "sm",
11623
+ disabled: dismissingBroken.has(name),
11624
+ onClick: () => dismissBrokenPlugin(name),
11625
+ children: t("brokenPluginDismiss")
11626
+ })
11627
+ ]
11628
+ }, name)), dismissBrokenError !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
11629
+ className: Market_module_css_default.brokenPluginItem,
11630
+ role: "alert",
11631
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10779
11632
  className: Market_module_css_default.brokenPluginText,
10780
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: t("brokenPluginTitle").replace("{0}", name) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("brokenPluginBody") })]
10781
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
10782
- variant: "outline",
10783
- size: "sm",
10784
- onClick: () => {
10785
- setCat("all");
10786
- setQ(name);
10787
- setTab("discover");
10788
- },
10789
- children: t("brokenPluginAction")
10790
- })]
10791
- }, name))
11633
+ children: dismissBrokenError
11634
+ })
11635
+ })]
10792
11636
  })
10793
11637
  ]
10794
11638
  }),
@@ -11226,7 +12070,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
11226
12070
  }),
11227
12071
  plugins.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
11228
12072
  className: Market_module_css_default.empty,
11229
- children: t("empty")
12073
+ children: pluginsAll.length > 0 ? t("blockedFilteredEmpty") : t("empty")
11230
12074
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(Masonry, {
11231
12075
  items: pagePlugins,
11232
12076
  render: pluginCard
@@ -11391,7 +12235,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
11391
12235
  children: t("themeEmpty")
11392
12236
  }) : themePlugins$1.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
11393
12237
  className: Market_module_css_default.empty,
11394
- children: t("empty")
12238
+ children: themePluginsAll.length > 0 ? t("blockedFilteredEmpty") : t("empty")
11395
12239
  }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
11396
12240
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
11397
12241
  className: Market_module_css_default.themeResultBar,
@@ -11410,7 +12254,44 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
11410
12254
  t
11411
12255
  })
11412
12256
  ] })
11413
- ] }) : tab === "diagnostics" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Diagnostics, { t }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
12257
+ ] }) : tab === "diagnostics" ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Diagnostics, { t }) : tab === "blocked" ? data === null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12258
+ className: Market_module_css_default.loading,
12259
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12260
+ className: Market_module_css_default.logoMark,
12261
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(MarketLogo, {
12262
+ size: 26,
12263
+ animated: true
12264
+ })
12265
+ }), t("loading")]
12266
+ }) : blockedNames.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12267
+ className: Market_module_css_default.empty,
12268
+ children: t("blockedEmpty")
12269
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
12270
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12271
+ className: Market_module_css_default.blockedTabHint,
12272
+ children: t("blockedTabHint")
12273
+ }),
12274
+ blockedPlugins.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(Masonry, {
12275
+ items: blockedPlugins,
12276
+ render: pluginCard
12277
+ }),
12278
+ blockedMissing.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12279
+ className: Market_module_css_default.blockedMissing,
12280
+ children: blockedMissing.map((name) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12281
+ className: Market_module_css_default.blockedBarRow,
12282
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12283
+ className: Market_module_css_default.blockedBarName,
12284
+ title: name,
12285
+ children: name
12286
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12287
+ type: "button",
12288
+ className: Market_module_css_default.blockedBarUndo,
12289
+ onClick: () => toggleBlock(name),
12290
+ children: t("blockRemove")
12291
+ })]
12292
+ }, name))
12293
+ })
12294
+ ] }) : /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
11414
12295
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11415
12296
  className: Market_module_css_default.viewBar,
11416
12297
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
@@ -11757,12 +12638,13 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
11757
12638
  const entry = data === null ? void 0 : catalogEntryForInstalled(data.plugins, name, String(spec), repoIdentities[name], repoHints[name]);
11758
12639
  const status = updates[name];
11759
12640
  const generation = status?.kind === "generation" || isGenerationSpec(String(spec));
11760
- const localDev = !generation && (/^(?:link|file):/i.test(String(spec)) || status?.kind === "linked");
12641
+ const localDev = isLocalDev(String(spec), status);
11761
12642
  const act = activations[name];
11762
12643
  const meta = act !== void 0 ? activationMeta(act.state, t, act.dependencyOf) : null;
11763
12644
  const version = status && status.version ? "v" + status.version : "";
11764
12645
  const specText = String(spec);
11765
12646
  const specRedundant = version !== "" && /^[\^~]?\d/.test(specText);
12647
+ const localPath = localPathOf(specText);
11766
12648
  const ghSpec = /^github:([A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+?)(?:#|$)/.exec(specText);
11767
12649
  const repoUrl = entry !== void 0 ? entry.url : ghSpec !== null ? "https://github.com/" + ghSpec[1] : null;
11768
12650
  const off = effectiveDisabledSet.has(name);
@@ -11776,74 +12658,103 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
11776
12658
  className: Market_module_css_default.irowHead,
11777
12659
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11778
12660
  className: `${Market_module_css_default.nm} ${Market_module_css_default.irowName}`,
11779
- children: [
11780
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11781
- className: Market_module_css_default.irowNameText,
11782
- children: repoUrl !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
11783
- className: Market_module_css_default.nameLink,
11784
- href: repoUrl + "#readme",
11785
- target: "_blank",
11786
- rel: "noreferrer",
11787
- title: name,
11788
- "aria-label": `${name} — ${t("readme")}`,
11789
- children: name
11790
- }) : name
11791
- }),
11792
- entry?.deprecated === true && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11793
- className: Market_module_css_default.depBadge,
11794
- children: t("deprecatedBadge")
11795
- }),
11796
- version && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11797
- className: Market_module_css_default.owner,
11798
- title: version,
11799
- children: version
11800
- })
11801
- ]
11802
- }), localDev && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11803
- className: Market_module_css_default.irowDevTag,
11804
- title: t("linkedDev"),
11805
- role: "status",
11806
- children: t("linkedDev")
12661
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12662
+ className: Market_module_css_default.irowNameText,
12663
+ children: repoUrl !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
12664
+ className: Market_module_css_default.nameLink,
12665
+ href: repoUrl + "#readme",
12666
+ target: "_blank",
12667
+ rel: "noreferrer",
12668
+ title: name,
12669
+ "aria-label": `${name} — ${t("readme")}`,
12670
+ children: name
12671
+ }) : name
12672
+ }), entry?.deprecated === true && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12673
+ className: Market_module_css_default.depBadge,
12674
+ children: t("deprecatedBadge")
12675
+ })]
12676
+ }), !missing && name !== "dsh-market" && name !== "dshmarket" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12677
+ className: Market_module_css_default.irowMenu,
12678
+ children: renderInstalledBlockMenu(name)
11807
12679
  })]
11808
12680
  }),
11809
- specRedundant ? null : repoUrl !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
11810
- className: `${Market_module_css_default.spec} ${Market_module_css_default.src}`,
11811
- href: repoUrl,
11812
- target: "_blank",
11813
- rel: "noreferrer",
11814
- children: specText
11815
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
11816
- className: Market_module_css_default.spec,
11817
- children: specText
12681
+ (version !== "" || localDev) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12682
+ className: Market_module_css_default.irowMeta,
12683
+ children: [version, localDev ? t("linkedDev") : ""].filter(Boolean).join(" · ")
11818
12684
  }),
11819
- notingName === name ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11820
- className: Market_module_css_default.noteEdit,
12685
+ specRedundant ? null : localPath !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12686
+ className: Market_module_css_default.irowPath,
11821
12687
  children: [
11822
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Input, {
11823
- className: Market_module_css_default.noteInput,
11824
- value: noteDraft,
11825
- maxLength: 200,
11826
- autoFocus: true,
11827
- placeholder: t("notePlaceholder"),
11828
- onChange: (e) => setNoteDraft(e.target.value),
11829
- onKeyDown: (e) => {
11830
- if (e.key === "Enter") saveNote(name, noteDraft);
11831
- if (e.key === "Escape") setNotingName(null);
11832
- }
12688
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12689
+ className: Market_module_css_default.irowPathIcon,
12690
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconFolderOpen16, { size: 14 })
11833
12691
  }),
11834
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
11835
- variant: "outline",
11836
- size: "sm",
11837
- onClick: () => saveNote(name, noteDraft),
11838
- children: t("noteSave")
12692
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12693
+ className: Market_module_css_default.spec,
12694
+ title: localPath,
12695
+ children: shortLocalPath(localPath)
11839
12696
  }),
11840
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
11841
- variant: "ghost",
11842
- size: "sm",
11843
- onClick: () => setNotingName(null),
11844
- children: t("cancel")
12697
+ isAbsoluteLocalPath(localPath) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12698
+ className: Market_module_css_default.irowPathCopy,
12699
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConfirmCopyButton, {
12700
+ text: localPath,
12701
+ label: t("copyPath"),
12702
+ copiedLabel: t("pathCopied")
12703
+ })
11845
12704
  })
11846
12705
  ]
12706
+ }) : repoUrl !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12707
+ className: Market_module_css_default.irowPath,
12708
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12709
+ className: Market_module_css_default.irowPathIcon,
12710
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconLinkOutline14, { size: 14 })
12711
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
12712
+ className: `${Market_module_css_default.spec} ${Market_module_css_default.src}`,
12713
+ href: repoUrl,
12714
+ target: "_blank",
12715
+ rel: "noreferrer",
12716
+ children: specText
12717
+ })]
12718
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12719
+ className: Market_module_css_default.spec,
12720
+ children: specText
12721
+ }),
12722
+ notingName === name ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12723
+ className: Market_module_css_default.noteEdit,
12724
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Input, {
12725
+ className: Market_module_css_default.noteInput,
12726
+ value: noteDraft,
12727
+ maxLength: NOTE_MAX,
12728
+ autoFocus: true,
12729
+ placeholder: t("notePlaceholder"),
12730
+ onChange: (e) => setNoteDraft(e.target.value),
12731
+ onKeyDown: (e) => {
12732
+ if (e.nativeEvent.isComposing || e.keyCode === 229) return;
12733
+ if (e.key === "Enter") saveNote(name, noteDraft);
12734
+ if (e.key === "Escape") setNotingName(null);
12735
+ }
12736
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12737
+ className: Market_module_css_default.noteEditBar,
12738
+ children: [
12739
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12740
+ className: Market_module_css_default.noteCount,
12741
+ "aria-hidden": "true",
12742
+ children: `${noteDraft.length}/${NOTE_MAX}`
12743
+ }),
12744
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
12745
+ variant: "ghost",
12746
+ size: "sm",
12747
+ onClick: () => setNotingName(null),
12748
+ children: t("cancel")
12749
+ }),
12750
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
12751
+ variant: "primary",
12752
+ size: "sm",
12753
+ onClick: () => saveNote(name, noteDraft),
12754
+ children: t("noteSave")
12755
+ })
12756
+ ]
12757
+ })]
11847
12758
  }) : (() => {
11848
12759
  const note = notes[name];
11849
12760
  const authored = entry?.description && (entry.description[lang] || entry.description.en) || "";
@@ -11852,10 +12763,13 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
11852
12763
  return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11853
12764
  className: `${Market_module_css_default.desc} ${Market_module_css_default.descTight} ${Market_module_css_default.noteRow}`,
11854
12765
  children: [
11855
- shown !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11856
- className: note !== void 0 && !theirs ? Market_module_css_default.noteMine : void 0,
11857
- children: shown
11858
- }),
12766
+ shown !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CardDesc, {
12767
+ text: shown,
12768
+ t,
12769
+ lines: 3,
12770
+ className: Market_module_css_default.irowDesc,
12771
+ textClassName: note !== void 0 && !theirs ? Market_module_css_default.noteMine : void 0
12772
+ }, shown),
11859
12773
  note !== void 0 && authored !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
11860
12774
  type: "button",
11861
12775
  className: Market_module_css_default.noteToggle,
@@ -11864,38 +12778,79 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
11864
12778
  onClick: () => setShowTheirs((list) => theirs ? list.filter((n) => n !== name) : list.concat(name)),
11865
12779
  children: theirs ? t("noteMine") : t("noteTheirs")
11866
12780
  }),
11867
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12781
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
11868
12782
  type: "button",
11869
- className: `${Market_module_css_default.noteToggle} ${Market_module_css_default.noteAction}`,
11870
- title: note === void 0 ? t("noteAdd") : t("noteEdit"),
11871
- "aria-label": note === void 0 ? t("noteAdd") : t("noteEdit"),
12783
+ className: Market_module_css_default.noteAdd,
11872
12784
  onClick: () => {
11873
12785
  setNoteDraft(note ?? "");
11874
12786
  setNotingName(name);
11875
12787
  },
11876
- children: note === void 0 ? t("noteAdd") : t("noteEdit")
12788
+ children: [note === void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconPlus, { size: 14 }), note === void 0 ? t("noteAdd") : t("noteEdit")]
11877
12789
  })
11878
12790
  ]
11879
12791
  });
11880
12792
  })(),
11881
- isPluginUpdatable(name, String(spec), status, []) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11882
- className: Market_module_css_default.noteRow,
11883
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
11884
- type: "button",
11885
- className: Market_module_css_default.notesLink,
11886
- onClick: () => openNotes(name, status.current ?? null, status.latest ?? null, repoUrl),
11887
- children: `▸ ${t("notesLink")}`
11888
- }), bootId !== null && (ignoredUpdateSet.has(name) ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11889
- className: Market_module_css_default.metaInline,
11890
- children: t("updateNoticeIgnored")
11891
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
11892
- type: "button",
11893
- className: Market_module_css_default.noteToggle,
11894
- "aria-label": `${t("ignoreUpdateNotice")} ${name}`,
11895
- onClick: () => ignoreUpdateNotices([name]),
11896
- children: t("ignoreUpdateNotice")
11897
- }))]
11898
- }),
12793
+ (() => {
12794
+ const updatable = isPluginUpdatable(name, String(spec), status, updatedNames);
12795
+ const exempt = updateExemptSet.has(name);
12796
+ if (!updatable && !exempt) return null;
12797
+ const ignored = !exempt && bootId !== null && ignoredUpdateSet.has(name);
12798
+ const sep = /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12799
+ className: Market_module_css_default.irowStatusSep,
12800
+ "aria-hidden": "true",
12801
+ children: "·"
12802
+ });
12803
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [updatable && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12804
+ className: Market_module_css_default.irowStatus,
12805
+ children: [!generation && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
12806
+ className: Market_module_css_default.irowStatusPart,
12807
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12808
+ className: Market_module_css_default.irowStatusFact,
12809
+ children: status?.latest != null ? t("hostUpdateReady").replace("{0}", displayLatest(status.latest)) : t("updateAvailableShort")
12810
+ }), sep]
12811
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12812
+ type: "button",
12813
+ className: Market_module_css_default.notesLink,
12814
+ onClick: () => openNotes(name, status?.current ?? null, status?.latest ?? null, repoUrl),
12815
+ children: `${t("notesLink")} ›`
12816
+ })]
12817
+ }), (exempt || ignored) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12818
+ className: Market_module_css_default.irowStatus,
12819
+ children: [
12820
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12821
+ className: Market_module_css_default.irowStatusIcon,
12822
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconBellOff, { size: 16 })
12823
+ }),
12824
+ exempt ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12825
+ className: Market_module_css_default.metaInline,
12826
+ title: t("updateExemptHint"),
12827
+ role: "status",
12828
+ children: t("updateExemptMark")
12829
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12830
+ className: Market_module_css_default.metaInline,
12831
+ role: "status",
12832
+ children: t("updateNoticeIgnored")
12833
+ }),
12834
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12835
+ className: Market_module_css_default.irowStatusAction,
12836
+ children: exempt ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12837
+ type: "button",
12838
+ className: Market_module_css_default.noteToggle,
12839
+ title: t("updateExemptHint"),
12840
+ "aria-label": `${t("updateExemptRestore")} ${name}`,
12841
+ onClick: () => toggleUpdateExempt(name),
12842
+ children: t("updateExemptRestore")
12843
+ }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12844
+ type: "button",
12845
+ className: Market_module_css_default.noteToggle,
12846
+ "aria-label": `${t("updateExemptRestore")} ${name}`,
12847
+ onClick: () => unignoreUpdateNotice(name),
12848
+ children: t("updateExemptRestore")
12849
+ })
12850
+ })
12851
+ ]
12852
+ })] });
12853
+ })(),
11899
12854
  !off && act !== void 0 && meta !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11900
12855
  className: Market_module_css_default.act,
11901
12856
  children: [meta.dot !== "done" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
@@ -12034,33 +12989,15 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
12034
12989
  else doUpdate(name);
12035
12990
  },
12036
12991
  children: status.restoreRequired === true ? t("restoreOnline") : t("update")
12037
- }) : localDev ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12038
- type: "button",
12039
- className: Market_module_css_default.metaTagAction,
12040
- title: `${t("restore")} — ${t("restoreOnline")}`,
12041
- "aria-label": t("restore"),
12042
- disabled: data === null || removingName !== null || busyUrl !== null || updatingName !== null,
12043
- onClick: () => askRestore(name),
12044
- children: t("restore")
12045
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12992
+ }) : localDev ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12046
12993
  className: Market_module_css_default.metaTag,
12047
12994
  title: t("upToDate"),
12048
12995
  children: t("upToDate")
12049
12996
  }),
12050
- !missing && name !== "dsh-market" && name !== "dshmarket" && (removingName === name ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
12051
- variant: "outline",
12052
- size: "sm",
12053
- className: Market_module_css_default.dangerBtn,
12054
- disabled: true,
12997
+ removingName === name && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12998
+ className: Market_module_css_default.metaTag,
12055
12999
  children: t("uninstalling")
12056
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
12057
- variant: "outline",
12058
- size: "sm",
12059
- className: Market_module_css_default.dangerBtn,
12060
- disabled: removingName !== null || busyUrl !== null || updatingName !== null,
12061
- onClick: () => setRemoveConfirm(name),
12062
- children: t("uninstall")
12063
- }))
13000
+ })
12064
13001
  ]
12065
13002
  })
12066
13003
  ]
@@ -12260,131 +13197,141 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
12260
13197
  })
12261
13198
  });
12262
13199
  })(),
12263
- confirming !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
13200
+ confirming !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
12264
13201
  open: true,
12265
- onClose: () => {
12266
- setConfirming(null);
12267
- setCmdOpen(false);
12268
- },
13202
+ className: Market_module_css_default.confirmModal,
13203
+ contentClassName: Market_module_css_default.confirmContent,
13204
+ onClose: () => setConfirming(null),
12269
13205
  title: t("confirmTitle") + " " + confirming.name + "?",
12270
13206
  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, {
12271
13207
  variant: "ghost",
12272
- onClick: () => {
12273
- setConfirming(null);
12274
- setCmdOpen(false);
12275
- },
13208
+ onClick: () => setConfirming(null),
12276
13209
  children: t("cancel")
12277
13210
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
12278
13211
  variant: "primary",
12279
13212
  onClick: () => doInstall(confirming),
12280
13213
  children: t("confirmInstall")
12281
13214
  })] }),
12282
- children: [
12283
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12284
- className: Market_module_css_default.byline,
12285
- children: [
12286
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OwnerAvatar, {
12287
- name: confirming.name,
12288
- owner: confirming.owner || ""
12289
- }),
12290
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12291
- className: Market_module_css_default.owner,
12292
- title: confirming.owner,
12293
- children: confirming.owner
12294
- }),
12295
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CatalogVersionMark, {
12296
- version: confirming.version,
12297
- tip: catalogVersionTip
12298
- }),
12299
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DownloadCount, {
12300
- plugin: confirming,
12301
- t
12302
- }),
12303
- typeof confirming.stars === "number" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
12304
- label: String(confirming.stars),
12305
- side: "top",
12306
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
13215
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
13216
+ className: Market_module_css_default.confirmBody,
13217
+ children: [
13218
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
13219
+ className: Market_module_css_default.byline,
13220
+ children: [
13221
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OwnerAvatar, {
13222
+ name: confirming.name,
13223
+ owner: confirming.owner || ""
13224
+ }),
13225
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
13226
+ className: Market_module_css_default.owner,
13227
+ title: confirming.owner,
13228
+ children: confirming.owner
13229
+ }),
13230
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CatalogVersionMark, {
13231
+ version: confirming.version,
13232
+ tip: catalogVersionTip
13233
+ }),
13234
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DownloadCount, {
13235
+ plugin: confirming,
13236
+ t
13237
+ }),
13238
+ typeof confirming.stars === "number" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12307
13239
  className: Market_module_css_default.star,
12308
13240
  children: "· ★ " + formatCount(confirming.stars)
13241
+ }),
13242
+ confirming.added && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
13243
+ className: Market_module_css_default.star,
13244
+ title: t("published"),
13245
+ children: `· ${confirming.added}`
12309
13246
  })
12310
- }),
12311
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: Market_module_css_default.grow }),
12312
- pluginCategories(confirming).map((category) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
13247
+ ]
13248
+ }),
13249
+ pluginCategories(confirming).length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
13250
+ className: Market_module_css_default.confirmTags,
13251
+ children: pluginCategories(confirming).map((category) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12313
13252
  className: Market_module_css_default.tag,
12314
13253
  children: data.categories[category] && (data.categories[category][lang] || data.categories[category].en) || category
12315
13254
  }, category))
12316
- ]
12317
- }),
12318
- confirming.added && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12319
- className: Market_module_css_default.metaInline,
12320
- children: t("published") + " " + confirming.added
12321
- }),
12322
- downloadStatsText(confirming, t) !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12323
- className: Market_module_css_default.metaInline,
12324
- children: downloadStatsText(confirming, t)
12325
- }),
12326
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CardDesc, {
12327
- text: confirming.description && (confirming.description[lang] || confirming.description.en) || "",
12328
- t
12329
- }),
12330
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ScreenshotStrip, {
12331
- plugin: confirming,
12332
- onOpen: openLightbox
12333
- }),
12334
- capabilityDetail(confirming),
12335
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
12336
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCodeOutline16, { size: 16 }),
12337
- title: t("cmdDetails"),
12338
- open: cmdOpen,
12339
- expandable: true,
12340
- expandOnRowClick: true,
12341
- onToggle: () => setCmdOpen((o) => !o),
12342
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12343
- className: Market_module_css_default.cmd,
12344
- children: confirming.install
13255
+ }),
13256
+ (() => {
13257
+ const text = confirming.description && (confirming.description[lang] || confirming.description.en) || "";
13258
+ return text === "" ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
13259
+ className: Market_module_css_default.confirmDesc,
13260
+ children: text
13261
+ });
13262
+ })(),
13263
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ScreenshotStrip, {
13264
+ plugin: confirming,
13265
+ onOpen: openLightbox
13266
+ }),
13267
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
13268
+ className: Market_module_css_default.confirmFold,
13269
+ children: [capabilityDetail(confirming), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConfirmFold, {
13270
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConfirmTerminalIcon, {}),
13271
+ title: t("cmdDetails"),
13272
+ open: cmdOpen,
13273
+ onToggle: () => setCmdOpen((o) => !o),
13274
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
13275
+ className: Market_module_css_default.confirmCmd,
13276
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
13277
+ className: Market_module_css_default.cmd,
13278
+ children: confirming.install
13279
+ }), typeof confirming.install === "string" && confirming.install !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConfirmCopyButton, {
13280
+ text: confirming.install,
13281
+ label: t("cmdCopy"),
13282
+ copiedLabel: t("cmdCopied")
13283
+ })]
13284
+ })
13285
+ })]
13286
+ }),
13287
+ (looksTerminal(confirming, lang) || confirming.deprecated === true) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
13288
+ className: Market_module_css_default.installCaution,
13289
+ children: [
13290
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
13291
+ className: Market_module_css_default.installCautionLabel,
13292
+ children: t("installCaution")
13293
+ }),
13294
+ looksTerminal(confirming, lang) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [
13295
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
13296
+ className: Market_module_css_default.installCautionHead,
13297
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConfirmWarnIcon, {}), t("terminalCautionTitle")]
13298
+ }),
13299
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
13300
+ className: Market_module_css_default.installCautionBody,
13301
+ children: t("terminalCautionBody")
13302
+ }),
13303
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
13304
+ className: Market_module_css_default.installCautionFoot,
13305
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("terminalCautionStartup") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
13306
+ className: Market_module_css_default.installCautionLink,
13307
+ href: confirming.url + "#readme",
13308
+ target: "_blank",
13309
+ rel: "noreferrer",
13310
+ children: t("terminalCautionLink")
13311
+ })]
13312
+ })
13313
+ ] }),
13314
+ confirming.deprecated === true && (() => {
13315
+ const replacement = replacementOf(confirming);
13316
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
13317
+ className: Market_module_css_default.installCautionBody,
13318
+ children: [t("deprecatedWarn"), replacement !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [" ", /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
13319
+ className: Market_module_css_default.src,
13320
+ href: replacement.url,
13321
+ target: "_blank",
13322
+ rel: "noreferrer",
13323
+ children: t("replacementHint") + " " + replacement.name
13324
+ })] })]
13325
+ });
13326
+ })()
13327
+ ]
13328
+ }),
13329
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
13330
+ className: Market_module_css_default.confirmFineprint,
13331
+ children: t("confirmWarn")
12345
13332
  })
12346
- }),
12347
- looksTerminal(confirming, lang) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
12348
- className: Market_module_css_default.warnLine,
12349
- children: [
12350
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconWarningOutline16, {
12351
- size: 14,
12352
- className: Market_module_css_default.bannerIcon
12353
- }),
12354
- " " + t("terminalWarn") + " ",
12355
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
12356
- className: Market_module_css_default.src,
12357
- href: confirming.url + "#readme",
12358
- target: "_blank",
12359
- rel: "noreferrer",
12360
- children: t("readme")
12361
- })
12362
- ]
12363
- }),
12364
- confirming.deprecated === true && (() => {
12365
- const replacement = replacementOf(confirming);
12366
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12367
- className: Market_module_css_default.deprecate,
12368
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12369
- className: Market_module_css_default.depLine,
12370
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: ["⚠️ ", t("deprecatedWarn")] }), replacement !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
12371
- className: Market_module_css_default.src,
12372
- href: replacement.url,
12373
- target: "_blank",
12374
- rel: "noreferrer",
12375
- children: t("replacementHint") + " " + replacement.name
12376
- })]
12377
- })
12378
- });
12379
- })(),
12380
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
12381
- className: Market_module_css_default.modalNote,
12382
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconWarningOutline16, {
12383
- size: 14,
12384
- className: Market_module_css_default.bannerIcon
12385
- }), " " + t("confirmWarn")]
12386
- })
12387
- ]
13333
+ ]
13334
+ })
12388
13335
  }),
12389
13336
  recovery !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RecoveryPanel, {
12390
13337
  open: recoveryOpen,
@@ -12776,6 +13723,24 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
12776
13723
  icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconWarningOutline16, { size: 14 }),
12777
13724
  onDone: favoriteErrorDone
12778
13725
  }),
13726
+ blockError !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
13727
+ text: localizeBilingual(blockError, lang),
13728
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconWarningOutline16, { size: 14 }),
13729
+ onDone: blockErrorDone
13730
+ }),
13731
+ blockNotice !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
13732
+ text: blockNotice,
13733
+ onDone: blockNoticeDone
13734
+ }),
13735
+ updateExemptError !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
13736
+ text: localizeBilingual(updateExemptError, lang),
13737
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconWarningOutline16, { size: 14 }),
13738
+ onDone: updateExemptErrorDone
13739
+ }),
13740
+ updateExemptNotice !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
13741
+ text: updateExemptNotice,
13742
+ onDone: updateExemptNoticeDone
13743
+ }),
12779
13744
  toggled !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
12780
13745
  text: toggled.name + " " + t(toggled.enabled ? "toastToggledOn" : "toastToggledOff"),
12781
13746
  icon: toggled.enabled ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCheckOutline16, { size: 14 }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconWarningOutline16, { size: 14 }),