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 +1304 -339
- package/lib/check.js +81 -1
- package/lib/dsh-install.js +43 -0
- package/lib/hot.js +28 -1
- package/lib/registry.js +144 -9
- package/lib/routes.js +206 -4
- package/lib/types/dsh-install.d.ts +32 -0
- package/lib/types/hot.d.ts +33 -0
- package/package.json +1 -1
- package/src/check.ts +77 -1
- package/src/client/Market.module.css +106 -19
- package/src/client/MarketSection.tsx +952 -158
- package/src/client/OperationsPanel.tsx +37 -12
- package/src/client/icons.ts +2 -0
- package/src/client/locales.ts +80 -12
- package/src/client/market-data.ts +26 -0
- package/src/client/operations.ts +24 -2
- package/src/dsh-install.ts +42 -0
- package/src/hot.ts +63 -1
- package/src/registry.ts +160 -9
- package/src/routes.ts +200 -3
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
|
-
|
|
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 <your unit>. 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: "
|
|
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: "
|
|
1164
|
-
ignoreAllUpdateNotices: "
|
|
1165
|
-
updateNoticeIgnored: "
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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")
|
|
3600
|
-
|
|
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":
|
|
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
|
|
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.
|
|
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
|
-
|
|
6886
|
-
|
|
6887
|
-
|
|
6888
|
-
|
|
6889
|
-
|
|
6890
|
-
|
|
6891
|
-
|
|
6892
|
-
|
|
6893
|
-
|
|
6894
|
-
|
|
6895
|
-
|
|
6896
|
-
|
|
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
|
|
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
|
|
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
|
|
9424
|
-
const
|
|
9425
|
-
const
|
|
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).
|
|
9691
|
-
*
|
|
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
|
|
9704
|
-
|
|
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)(
|
|
9815
|
-
icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
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
|
-
|
|
9823
|
-
|
|
9824
|
-
|
|
9825
|
-
|
|
9826
|
-
|
|
9827
|
-
|
|
9828
|
-
|
|
9829
|
-
|
|
9830
|
-
|
|
9831
|
-
|
|
9832
|
-
|
|
9833
|
-
|
|
9834
|
-
|
|
9835
|
-
|
|
9836
|
-
|
|
9837
|
-
|
|
9838
|
-
|
|
9839
|
-
|
|
9840
|
-
|
|
9841
|
-
|
|
9842
|
-
|
|
9843
|
-
|
|
9844
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("
|
|
9845
|
-
className: Market_module_css_default.
|
|
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
|
-
|
|
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: [
|
|
10037
|
-
|
|
10038
|
-
|
|
10039
|
-
|
|
10040
|
-
|
|
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.
|
|
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) && !
|
|
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.
|
|
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: [
|
|
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:
|
|
10781
|
-
})
|
|
10782
|
-
|
|
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)(
|
|
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 =
|
|
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
|
-
|
|
11781
|
-
|
|
11782
|
-
|
|
11783
|
-
|
|
11784
|
-
|
|
11785
|
-
|
|
11786
|
-
|
|
11787
|
-
|
|
11788
|
-
|
|
11789
|
-
|
|
11790
|
-
|
|
11791
|
-
|
|
11792
|
-
|
|
11793
|
-
|
|
11794
|
-
|
|
11795
|
-
|
|
11796
|
-
|
|
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
|
-
|
|
11810
|
-
className:
|
|
11811
|
-
|
|
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
|
-
|
|
11820
|
-
className: Market_module_css_default.
|
|
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)(
|
|
11823
|
-
className: Market_module_css_default.
|
|
11824
|
-
|
|
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)(
|
|
11835
|
-
|
|
11836
|
-
|
|
11837
|
-
|
|
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)(
|
|
11841
|
-
|
|
11842
|
-
|
|
11843
|
-
|
|
11844
|
-
|
|
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)(
|
|
11856
|
-
|
|
11857
|
-
|
|
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.
|
|
12781
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
11868
12782
|
type: "button",
|
|
11869
|
-
className:
|
|
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
|
-
|
|
11882
|
-
|
|
11883
|
-
|
|
11884
|
-
|
|
11885
|
-
|
|
11886
|
-
|
|
11887
|
-
|
|
11888
|
-
|
|
11889
|
-
|
|
11890
|
-
|
|
11891
|
-
|
|
11892
|
-
|
|
11893
|
-
|
|
11894
|
-
|
|
11895
|
-
|
|
11896
|
-
|
|
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)("
|
|
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
|
-
|
|
12051
|
-
|
|
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
|
-
})
|
|
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.
|
|
13200
|
+
confirming !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
|
|
12264
13201
|
open: true,
|
|
12265
|
-
|
|
12266
|
-
|
|
12267
|
-
|
|
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
|
-
|
|
12284
|
-
|
|
12285
|
-
|
|
12286
|
-
|
|
12287
|
-
|
|
12288
|
-
|
|
12289
|
-
|
|
12290
|
-
|
|
12291
|
-
|
|
12292
|
-
|
|
12293
|
-
|
|
12294
|
-
|
|
12295
|
-
|
|
12296
|
-
|
|
12297
|
-
|
|
12298
|
-
|
|
12299
|
-
|
|
12300
|
-
|
|
12301
|
-
|
|
12302
|
-
|
|
12303
|
-
|
|
12304
|
-
|
|
12305
|
-
|
|
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
|
-
|
|
12312
|
-
|
|
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
|
-
|
|
12319
|
-
|
|
12320
|
-
|
|
12321
|
-
|
|
12322
|
-
|
|
12323
|
-
|
|
12324
|
-
|
|
12325
|
-
|
|
12326
|
-
|
|
12327
|
-
|
|
12328
|
-
|
|
12329
|
-
|
|
12330
|
-
|
|
12331
|
-
|
|
12332
|
-
|
|
12333
|
-
|
|
12334
|
-
|
|
12335
|
-
|
|
12336
|
-
|
|
12337
|
-
|
|
12338
|
-
|
|
12339
|
-
|
|
12340
|
-
|
|
12341
|
-
|
|
12342
|
-
|
|
12343
|
-
|
|
12344
|
-
|
|
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
|
-
|
|
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 }),
|