dshmarket 1.66.5 → 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 +948 -293
- package/lib/check.js +81 -1
- package/lib/dsh-install.js +43 -0
- package/lib/hot.js +17 -4
- package/lib/registry.js +144 -9
- package/lib/routes.js +142 -4
- package/lib/types/dsh-install.d.ts +32 -0
- package/lib/types/hot.d.ts +15 -0
- package/package.json +1 -1
- package/src/check.ts +77 -1
- package/src/client/Market.module.css +99 -19
- package/src/client/MarketSection.tsx +695 -125
- package/src/client/icons.ts +2 -0
- package/src/client/locales.ts +54 -12
- package/src/dsh-install.ts +42 -0
- package/src/hot.ts +34 -4
- package/src/registry.ts +160 -9
- package/src/routes.ts +139 -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: "清除搜索",
|
|
@@ -310,7 +317,12 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
310
317
|
restartHintSupervised: "本进程是 {0} 服务的主进程,重启交给它负责——市场自己重启会连带杀掉 cgroup 里的接管进程,服务将起不来。请执行 systemctl restart <你的 unit>。确认你的配置能承受市场自行重启(如 KillMode=process),可在本插件配置里手动打开「允许重启」。",
|
|
311
318
|
restartHintDebugged: "当前 dsh 进程正被调试器连接。请从 IDE 或终端停止该进程后重新启动,市场不能从界面里结束正在调试的 dsh。",
|
|
312
319
|
confirmTitle: "安装",
|
|
313
|
-
confirmWarn: "
|
|
320
|
+
confirmWarn: "社区第三方插件,构建脚本默认不运行。",
|
|
321
|
+
installCaution: "安装前请注意",
|
|
322
|
+
terminalCautionTitle: "可能不适用于网页版",
|
|
323
|
+
terminalCautionBody: "这是终端插件,网页版里可能用不了。",
|
|
324
|
+
terminalCautionStartup: "也可能让 DeepSeek Harness 起不来。",
|
|
325
|
+
terminalCautionLink: "先看使用说明 ↗",
|
|
314
326
|
cancel: "取消",
|
|
315
327
|
empty: "没有匹配的插件",
|
|
316
328
|
installedEmpty: "尚未安装社区插件,可前往「发现」页浏览",
|
|
@@ -376,7 +388,6 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
376
388
|
migrateWarning: "该 npm 包可能由其他人发布,并非同一插件;确认可信后再继续。",
|
|
377
389
|
migrateContinue: "确认换用",
|
|
378
390
|
migrateFail: "换用来源失败",
|
|
379
|
-
restore: "恢复",
|
|
380
391
|
restoreOnline: "换用线上版本",
|
|
381
392
|
restoreHint: "将卸载本地版本并安装线上版本,之后照常检查更新。此操作无法撤销。",
|
|
382
393
|
hostIncompatibleTitle: "这个新版本要求更新的 DSH",
|
|
@@ -421,7 +432,6 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
421
432
|
commentsError: "评论加载失败。请检查网络连接后重试。",
|
|
422
433
|
commentsRetry: "重试",
|
|
423
434
|
commentsOnGitHub: "在 GitHub 登录并参与讨论",
|
|
424
|
-
terminalWarn: "这看起来是终端/命令行插件:安装到网页版 profile 可能不会生效,甚至导致 DeepSeek Harness 无法启动。建议先阅读其使用说明,并按说明安装到对应的 profile。",
|
|
425
435
|
conflictTitle: "无法安装:与已安装的插件冲突",
|
|
426
436
|
conflictBody: "和已安装的插件冲突,只能留一个:",
|
|
427
437
|
conflictReverted: "已自动撤销,未改动任何插件",
|
|
@@ -474,6 +484,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
474
484
|
confirm: "确认",
|
|
475
485
|
confirmInstall: "确认安装",
|
|
476
486
|
cmdDetails: "安装命令",
|
|
487
|
+
cmdCopy: "复制安装命令",
|
|
488
|
+
cmdCopied: "已复制",
|
|
477
489
|
catsMore: "更多分类",
|
|
478
490
|
catsLess: "收起",
|
|
479
491
|
filter: "筛选",
|
|
@@ -523,9 +535,20 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
523
535
|
updateAll: "全部更新",
|
|
524
536
|
heldReleaseNotice: "已安装,但不是最新版:这个 profile 的 minimumReleaseAge 挡住了 {0},安装的是 {1}。",
|
|
525
537
|
heldReleaseAction: "仍安装 {0}",
|
|
526
|
-
ignoreUpdateNotice: "
|
|
527
|
-
ignoreAllUpdateNotices: "
|
|
528
|
-
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: "已复制",
|
|
529
552
|
tabThemes: "主题",
|
|
530
553
|
tabBackup: "备份与恢复",
|
|
531
554
|
backupLocal: "本地文件",
|
|
@@ -639,6 +662,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
639
662
|
brokenPluginTitle: "{0} 更新失败后被移除了",
|
|
640
663
|
brokenPluginBody: "DSH 正在运行时无法更新,而更新前的版本也已经损坏。为避免下次启动卡住,市场把它从 profile 里移除。插件目录还在原处,退出 DSH 后重新安装即可。",
|
|
641
664
|
brokenPluginAction: "查找这个插件",
|
|
665
|
+
brokenPluginDismiss: "不再显示这条",
|
|
642
666
|
viewReplacement: "查看替代品",
|
|
643
667
|
installReplacement: "安装替代品",
|
|
644
668
|
replacementHint: "目录建议改用",
|
|
@@ -909,6 +933,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
909
933
|
submitPlugin: "Submit a plugin ↗",
|
|
910
934
|
descExpand: "Show more",
|
|
911
935
|
descCollapse: "Show less",
|
|
936
|
+
descMore: "Show all",
|
|
912
937
|
searchPh: "Search plugins: notify, terminal, memory…",
|
|
913
938
|
searchFavoritesPh: "Search favorites…",
|
|
914
939
|
clearSearch: "Clear search",
|
|
@@ -973,7 +998,12 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
973
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.",
|
|
974
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.",
|
|
975
1000
|
confirmTitle: "Install",
|
|
976
|
-
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 ↗",
|
|
977
1007
|
cancel: "Cancel",
|
|
978
1008
|
empty: "No plugins match",
|
|
979
1009
|
installedEmpty: "No community plugins yet — browse the Discover tab",
|
|
@@ -1039,7 +1069,6 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1039
1069
|
migrateWarning: "The npm package may be published by someone else and not be the same plugin. Continue only if you trust it.",
|
|
1040
1070
|
migrateContinue: "Confirm switch",
|
|
1041
1071
|
migrateFail: "Source switch failed",
|
|
1042
|
-
restore: "Restore",
|
|
1043
1072
|
restoreOnline: "Use online version",
|
|
1044
1073
|
restoreHint: "This uninstalls the local version and installs the online version. Update checks continue as usual. This cannot be undone.",
|
|
1045
1074
|
hostIncompatibleTitle: "This release needs a newer DSH",
|
|
@@ -1084,7 +1113,6 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1084
1113
|
commentsError: "Comments could not be loaded. Check your connection and try again.",
|
|
1085
1114
|
commentsRetry: "Try again",
|
|
1086
1115
|
commentsOnGitHub: "Sign in and join on GitHub",
|
|
1087
|
-
terminalWarn: "This looks like a terminal/CLI plugin: installing it into the web profile may do nothing, or even break DeepSeek Harness startup. Read its README and install it into the profile it targets.",
|
|
1088
1116
|
conflictTitle: "Cannot install: conflicts with an installed plugin",
|
|
1089
1117
|
conflictBody: "It conflicts with an installed plugin — only one can stay:",
|
|
1090
1118
|
conflictReverted: "Reverted automatically; nothing was changed",
|
|
@@ -1137,6 +1165,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1137
1165
|
confirm: "Confirm",
|
|
1138
1166
|
confirmInstall: "Confirm install",
|
|
1139
1167
|
cmdDetails: "Install command",
|
|
1168
|
+
cmdCopy: "Copy install command",
|
|
1169
|
+
cmdCopied: "Copied",
|
|
1140
1170
|
catsMore: "More categories",
|
|
1141
1171
|
catsLess: "Fewer categories",
|
|
1142
1172
|
filter: "Filter",
|
|
@@ -1186,9 +1216,20 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1186
1216
|
updateAll: "Update all",
|
|
1187
1217
|
heldReleaseNotice: "Installed, but not the newest: this profile's minimumReleaseAge held {0} back, so {1} was installed.",
|
|
1188
1218
|
heldReleaseAction: "Install {0} anyway",
|
|
1189
|
-
ignoreUpdateNotice: "
|
|
1190
|
-
ignoreAllUpdateNotices: "
|
|
1191
|
-
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",
|
|
1192
1233
|
tabThemes: "Themes",
|
|
1193
1234
|
tabBackup: "Backup & Restore",
|
|
1194
1235
|
backupLocal: "Local file",
|
|
@@ -1302,6 +1343,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
1302
1343
|
brokenPluginTitle: "{0} was removed after a failed update",
|
|
1303
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.",
|
|
1304
1345
|
brokenPluginAction: "Find this plugin",
|
|
1346
|
+
brokenPluginDismiss: "Stop showing this",
|
|
1305
1347
|
viewReplacement: "View replacement",
|
|
1306
1348
|
installReplacement: "Install replacement",
|
|
1307
1349
|
replacementHint: "Catalog suggests",
|
|
@@ -2803,7 +2845,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
2803
2845
|
const HostCheckbox = optionalComponent("Checkbox");
|
|
2804
2846
|
//#endregion
|
|
2805
2847
|
//#region \0dsh-css:src/client/Market.module.css.mjs
|
|
2806
|
-
const css = ".nUhMVa_root{min-width:0;height:100%;color:var(--dsw-alias-label-primary,#1f2328);flex-direction:column;display:flex;position:relative;container-type:inline-size}.nUhMVa_head{flex-direction:column;gap:12px;padding:4px 4px 6px;display:flex}.nUhMVa_title{margin:0;font-size:16px;font-weight:500;line-height:24px}.nUhMVa_sub{color:var(--dsw-alias-label-tertiary,#8b93a1);align-items:center;gap:8px;margin:0;font-size:12px;line-height:18px;display:flex}.nUhMVa_submitLink{color:var(--dsw-alias-label-tertiary,#8b93a1);white-space:nowrap;font-size:11px;line-height:18px;text-decoration:none}.nUhMVa_submitLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:underline}.nUhMVa_tabs{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);align-items:flex-end;gap:2px;display:flex}.nUhMVa_tab{font:inherit;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-bottom:2px solid #0000;padding:7px 12px;font-size:13px}.nUhMVa_tab.nUhMVa_on{color:var(--dsw-alias-brand-primary,#4f6ef7);border-bottom-color:var(--dsw-alias-brand-primary,#4f6ef7);font-weight:600}.nUhMVa_subTabs{align-items:flex-end;gap:2px;margin:-4px 0 4px;display:flex}.nUhMVa_banner{background:var(--dsw-alias-bg-layer-2,#fdf3e3);border:1px solid var(--dsw-alias-border-l2,#f3e3c3);border-radius:8px;align-items:center;gap:8px;margin:0;padding:8px 12px;font-size:12px;display:flex}.nUhMVa_bannerIcon{color:var(--dsw-alias-label-secondary,#6b7280);flex-shrink:0}.nUhMVa_bannerHint{color:var(--dsw-alias-label-tertiary,#8b93a1);cursor:help;display:inline-flex}.nUhMVa_body{overflow-anchor:none;flex:1;padding:12px 4px 24px;overflow-x:hidden;overflow-y:auto}.nUhMVa_stickyHead{z-index:5;background:var(--dsw-alias-bg-layer-2,#f7f8fa);position:sticky;top:-1px}.nUhMVa_stickyHead:before{content:\"\";background:inherit;pointer-events:none;height:14px;position:absolute;bottom:100%;left:0;right:0}.nUhMVa_cats{margin:0 -4px 2px;padding:12px 4px 4px}.nUhMVa_catsRow{align-items:flex-start;gap:8px;display:flex;position:relative}.nUhMVa_star{color:var(--dsw-alias-label-secondary,#9ca3af);white-space:nowrap;flex:none;font-size:11px}.nUhMVa_top{z-index:20;background:var(--dsw-alias-bg-layer-1,#fff);box-shadow:var(--dsw-shadow-lv1,0 4px 12px #1f232814);border-radius:99px;display:inline-flex;position:absolute;bottom:18px;right:18px}.nUhMVa_topBtn{border-radius:99px;width:38px;height:38px;padding:0}.nUhMVa_tag{border:1px solid var(--dsw-alias-border-l3,#d9dde3);color:var(--dsw-alias-label-secondary,#6b7280);border-radius:4px;flex-shrink:0;padding:1px 6px;font-size:11px;line-height:16px}.nUhMVa_hostRequirement{border:1px solid var(--dsw-alias-border-l3,#d9dde3);color:var(--dsw-alias-label-secondary,#6b7280);text-overflow:ellipsis;white-space:nowrap;border-radius:4px;min-width:0;max-width:100%;padding:1px 6px;font-size:11px;line-height:16px;overflow:hidden}.nUhMVa_hostRequirementBad{border-color:var(--dsw-alias-state-error-primary,#dc2626);color:var(--dsw-alias-state-error-primary,#dc2626);background:#dc262614}.nUhMVa_hostFilterNote{color:var(--dsw-alias-label-tertiary,#8b93a1);margin-top:6px;font-size:11px;line-height:16px}.nUhMVa_okState{color:var(--dsw-alias-state-success-primary,#16a34a);white-space:nowrap;font-size:12px;font-weight:600}.nUhMVa_catsWrap{flex-wrap:wrap;flex:1;align-items:center;gap:6px;min-width:0;display:flex}.nUhMVa_catsCollapsed{max-height:62px;overflow:hidden}.nUhMVa_catsToggle.nUhMVa_catsToggle{height:26px;min-height:26px;color:var(--dsw-alias-label-secondary,#6b7280);padding:0 6px}.nUhMVa_shots{-webkit-overflow-scrolling:touch;scrollbar-width:thin;gap:8px;margin:6px 0 8px;padding:2px 0 6px;display:flex;overflow-x:auto}.nUhMVa_shot{object-fit:cover;border:1px solid var(--dsw-alias-border-default,#e5e7eb);background:var(--dsw-alias-bg-layer-2,#f3f4f6);cursor:pointer;border-radius:8px;flex:none;width:220px;height:150px}.nUhMVa_cardShots{-webkit-overflow-scrolling:touch;scrollbar-width:thin;gap:6px;margin:0 0 6px;padding:0 0 2px;display:flex;overflow-x:auto}.nUhMVa_cardShot{object-fit:contain;border:1px solid var(--dsw-alias-border-default,#e5e7eb);background:var(--dsw-alias-bg-layer-2,#f3f4f6);cursor:pointer;border-radius:8px;flex:none;width:132px;height:88px;display:block}.nUhMVa_lightbox{z-index:10000;cursor:zoom-out;background:#000000d9;justify-content:center;align-items:center;display:flex;position:fixed;top:0;bottom:0;left:0;right:0}.nUhMVa_lightboxImg{object-fit:contain;cursor:default;border-radius:4px;max-width:90vw;max-height:85vh}.nUhMVa_lightboxClose{color:#fff;cursor:pointer;background:#ffffff1f;border:none;border-radius:99px;place-items:center;width:36px;height:36px;font-size:22px;line-height:1;display:grid;position:absolute;top:16px;right:16px}.nUhMVa_lightboxClose:hover{background:#ffffff38}.nUhMVa_lightboxNav{color:#fff;cursor:pointer;background:#ffffff1f;border:none;border-radius:99px;place-items:center;width:44px;height:44px;display:grid;position:absolute;top:50%;transform:translateY(-50%)}.nUhMVa_lightboxNav:hover{background:#ffffff38}.nUhMVa_lightboxPrev{left:16px}.nUhMVa_lightboxNext{right:16px}.nUhMVa_lightboxDots{gap:8px;display:flex;position:absolute;bottom:20px;left:50%;transform:translate(-50%)}.nUhMVa_lightboxDot{cursor:pointer;background:#fff6;border-radius:99px;width:7px;height:7px}.nUhMVa_lightboxDotOn{background:#fff}.nUhMVa_cmd{background:var(--dsw-alias-bg-layer-2,#f3f4f6);word-break:break-all;border-radius:6px;margin:8px 0 0;padding:8px 10px;font-family:ui-monospace,Menlo,monospace;font-size:11px;line-height:18px}.nUhMVa_warnLine{color:var(--dsw-alias-state-warn-primary,#b45309);flex-wrap:wrap;align-items:center;gap:4px;margin:0;font-size:12px;font-weight:600;line-height:18px;display:flex}.nUhMVa_modalNote{color:var(--dsw-alias-label-tertiary,#8b93a1);align-items:center;gap:4px;margin:12px 0 0;font-size:12px;line-height:18px;display:flex}.nUhMVa_grid{grid-template-columns:repeat(2,minmax(0,1fr));align-items:start;gap:10px;display:grid}.nUhMVa_masonry{align-items:flex-start;gap:10px;display:flex}.nUhMVa_masonryCol{flex-direction:column;flex:1;gap:10px;min-width:0;display:flex}.nUhMVa_masonry>.nUhMVa_masonryCol>*{align-self:stretch;min-width:0}@media (max-width:680px){.nUhMVa_masonry{flex-direction:column}.nUhMVa_masonryCol{width:100%}.nUhMVa_grid{grid-template-columns:minmax(0,1fr)}}.nUhMVa_swatches{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;gap:0;height:34px;display:flex;overflow:hidden}.nUhMVa_themesGrid{margin-bottom:12px}.nUhMVa_swatches i{flex:1}.nUhMVa_themeToolbar{grid-template-columns:minmax(0,1fr) auto;align-items:center;gap:8px;padding:0 4px 12px;display:grid}.nUhMVa_themeSearch{box-sizing:border-box;width:100%;min-width:0}.nUhMVa_themeToolbarActions{justify-content:flex-end;align-items:center;gap:8px;display:flex}.nUhMVa_themeFullscreenBtn.nUhMVa_themeFullscreenBtn{width:28px;min-width:28px;padding:0}.nUhMVa_themeResultBar{min-height:24px;color:var(--dsw-alias-label-tertiary,#8b93a1);align-items:center;padding:0 4px 8px;font-size:12px;line-height:18px;display:flex}.nUhMVa_favoritesSectionHead{color:var(--dsw-alias-label-primary,#1f2328);margin:16px 0 8px;padding:0 4px;font-size:13px;font-weight:600;line-height:20px}.nUhMVa_favoritesSectionHead:first-of-type{margin-top:0}.nUhMVa_brokenPluginNotice{flex-direction:column;gap:8px;margin:0 0 8px;display:flex}.nUhMVa_brokenPluginItem{border:1px solid var(--dsw-alias-state-warn-tertiary,#b4530933);background:var(--dsw-alias-state-warn-tertiary,#b453090f);color:var(--dsw-alias-state-warn-primary,#b45309);border-radius:8px;flex-wrap:wrap;justify-content:space-between;align-items:flex-start;gap:10px;padding:8px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_brokenPluginText{flex-direction:column;gap:2px;min-width:0;display:flex}.nUhMVa_favoritesStaleBar{border:1px solid var(--dsw-alias-state-warn-tertiary,#b4530933);background:var(--dsw-alias-state-warn-tertiary,#b453090f);color:var(--dsw-alias-state-warn-primary,#b45309);border-radius:8px;flex-wrap:wrap;justify-content:space-between;align-items:center;gap:8px;margin:0 0 8px;padding:8px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_favoritesStaleOnly{flex-direction:column;align-items:flex-start;gap:10px;display:flex}.nUhMVa_themeGallery{grid-template-columns:repeat(4,minmax(0,1fr));align-items:stretch;gap:10px;display:grid}.nUhMVa_themeCard{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#fff);border-radius:8px;flex-direction:column;min-width:0;transition:border-color .16s cubic-bezier(.16,1,.3,1),box-shadow .16s cubic-bezier(.16,1,.3,1),transform .16s cubic-bezier(.16,1,.3,1);display:flex;overflow:hidden}.nUhMVa_themeCard:hover{border-color:var(--dsw-alias-border-l3,#d9dde3);box-shadow:var(--dsw-shadow-lv1,0 4px 12px #1f232814);transform:translateY(-1px)}.nUhMVa_themeCover{aspect-ratio:16/10;border:0;border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-2,#f3f4f6);width:100%;color:var(--dsw-alias-label-secondary,#6b7280);cursor:zoom-in;border-radius:0;padding:0;display:block;position:relative;overflow:hidden}.nUhMVa_themeCover img{object-fit:contain;background:var(--dsw-alias-bg-layer-2,#f3f4f6);width:100%;height:100%;transition:transform .18s cubic-bezier(.16,1,.3,1);display:block}.nUhMVa_themeCover:hover img{transform:scale(1.012)}.nUhMVa_themeCover:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4f6ef7);outline-offset:-3px}.nUhMVa_themeCoverEmpty{cursor:default;color:var(--dsw-alias-label-tertiary,#8b93a1);flex-direction:column;justify-content:center;align-items:center;gap:8px;font-size:12px;line-height:18px;display:flex}.nUhMVa_themePreviewAction,.nUhMVa_themePreviewCount{color:#fff;-webkit-backdrop-filter:blur(8px);background:#14181fc7;border:1px solid #ffffff57;border-radius:4px;align-items:center;height:24px;padding:0 8px;font-size:11px;line-height:16px;display:inline-flex;position:absolute;bottom:8px}.nUhMVa_themePreviewAction{gap:4px;right:8px}.nUhMVa_themePreviewCount{left:8px}.nUhMVa_themeCardBody{flex-direction:column;flex:1;gap:8px;padding:12px;display:flex}.nUhMVa_themeCardHead{align-items:flex-start;gap:8px;min-width:0;display:flex}.nUhMVa_themeIdentity{flex:1;min-width:0}.nUhMVa_themeStatus,.nUhMVa_themeStatusMuted{white-space:nowrap;border-radius:4px;flex:none;align-items:center;min-height:22px;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_themeStatus{background:var(--dsw-alias-state-success-tertiary,#16a34a1a);color:var(--dsw-alias-state-success-primary,#15803d)}.nUhMVa_themeStatusMuted{background:var(--dsw-alias-bg-layer-2,#f3f4f6);color:var(--dsw-alias-label-secondary,#6b7280)}.nUhMVa_themeDescription{min-height:36px;color:var(--dsw-alias-label-tertiary,#8b93a1);-webkit-line-clamp:3;-webkit-box-orient:vertical;margin:0;font-size:12px;line-height:18px;display:-webkit-box;overflow:hidden}.nUhMVa_themeCardFooter{justify-content:space-between;align-items:center;gap:8px;margin-top:auto;padding-top:4px;display:flex}.nUhMVa_themeLifecycle{min-width:0;color:var(--dsw-alias-label-tertiary,#8b93a1);text-overflow:ellipsis;white-space:nowrap;font-size:11px;line-height:18px;overflow:hidden}.nUhMVa_themeActions{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:8px;margin-left:auto;display:flex}@container (width<=900px){.nUhMVa_themeGallery{grid-template-columns:repeat(3,minmax(0,1fr))}}@container (width<=680px){.nUhMVa_themeGallery{grid-template-columns:repeat(2,minmax(0,1fr))}}@container (width<=460px){.nUhMVa_themeGallery{grid-template-columns:minmax(0,1fr)}}@container (width<=420px){.nUhMVa_sub{grid-template-columns:minmax(0,1fr) auto;align-items:start;gap:2px 8px;display:grid}.nUhMVa_sub>span:first-child{grid-area:1/1}.nUhMVa_sub>.nUhMVa_grow{display:none}.nUhMVa_submitLink{grid-area:2/1}.nUhMVa_exportLogBtn{flex-shrink:0;grid-area:1/2/span 2}.nUhMVa_themeToolbar{grid-template-columns:minmax(0,1fr)}.nUhMVa_themeCardHead{flex-wrap:wrap}.nUhMVa_themeStatus,.nUhMVa_themeStatusMuted{order:3}}@container (width<=280px){.nUhMVa_themeCardFooter{flex-direction:column;align-items:flex-start}.nUhMVa_themeActions{justify-content:flex-start;width:100%;margin-left:0}}@media (max-width:560px){[role=dialog]:has([data-dsh-market-root])>nav{display:none}[role=dialog]:has([data-dsh-market-root])>div{flex:100%;width:100%;min-width:0}}[role=dialog]:has([data-dsh-market-fullscreen=true]){border-radius:0;width:100vw;max-width:none;height:100vh;max-height:none;position:fixed;top:0;bottom:0;left:0;right:0}@media (prefers-reduced-motion:reduce){.nUhMVa_themeCard,.nUhMVa_themeCover img{transition:none}.nUhMVa_themeCard:hover{transform:none}}.nUhMVa_card{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;flex-direction:column;align-self:start;gap:12px;padding:12px 14px;display:flex}.nUhMVa_row1{align-items:flex-start;gap:10px;min-width:0;display:flex}.nUhMVa_cardAction{flex-shrink:0;align-items:center;display:inline-flex}.nUhMVa_installBtn.nUhMVa_installBtn{min-width:64px}.nUhMVa_av{width:16px;height:16px;color:var(--dsw-alias-label-primary,#1f2328);object-fit:cover;background:var(--dsw-alias-bg-layer-2,#f3f4f6);border-radius:50%;flex-shrink:0;place-items:center;font-size:9px;font-weight:700;display:grid}.nUhMVa_nm{text-overflow:ellipsis;white-space:nowrap;font-size:15px;font-weight:600;line-height:22px;overflow:hidden}.nUhMVa_nmLink{color:inherit;text-decoration:none;display:block}.nUhMVa_nmLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:underline}.nUhMVa_repoMark{color:var(--dsw-alias-label-secondary,#6b7280);vertical-align:-1px;flex-shrink:0;margin-left:5px;display:inline-block}.nUhMVa_nmLink:hover .nUhMVa_repoMark{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_byline{flex-wrap:wrap;align-items:center;gap:6px;min-width:0;margin-top:2px;display:flex}.nUhMVa_meta{color:var(--dsw-alias-label-secondary,#9ca3af);margin-top:2px;font-size:11px}.nUhMVa_metaInline{color:var(--dsw-alias-label-secondary,#9ca3af);font-size:11px}.nUhMVa_owner{color:var(--dsw-alias-label-secondary,#9ca3af);text-overflow:ellipsis;white-space:nowrap;flex:0 auto;min-width:44px;font-size:11px;overflow:hidden}.nUhMVa_desc{color:var(--dsw-alias-label-tertiary,#8b93a1);margin:0;font-size:12px;line-height:18px}.nUhMVa_descClamp{-webkit-line-clamp:5;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.nUhMVa_descToggle{width:20px;height:16px;color:var(--dsw-alias-label-tertiary,#8b93a1);cursor:pointer;background:0 0;border:none;justify-content:center;align-items:center;margin-top:2px;padding:0;display:flex}.nUhMVa_descToggle:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_foot{flex-wrap:nowrap;align-items:flex-end;gap:8px;display:flex}.nUhMVa_foot .nUhMVa_metaInline,.nUhMVa_foot .nUhMVa_src{white-space:nowrap}.nUhMVa_footTags{flex-wrap:wrap;flex:1 1 0;align-items:center;gap:8px;min-width:0;display:flex}.nUhMVa_grow{flex:1}.nUhMVa_titleRow{align-items:center;gap:10px;display:flex}.nUhMVa_version{color:var(--dsw-alias-label-tertiary,#8b93a1);font-variant-numeric:tabular-nums;flex-shrink:0;font-size:12px;line-height:20px}.nUhMVa_repoLink{color:var(--dsw-alias-label-tertiary,#8b93a1);flex-shrink:0;font-size:12px;line-height:20px;text-decoration:none}.nUhMVa_repoLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_noteRow{flex-wrap:wrap;align-items:baseline;gap:6px;min-width:0;display:flex}.nUhMVa_desc.nUhMVa_noteRow,.nUhMVa_desc.nUhMVa_noteRow+.nUhMVa_noteRow,.nUhMVa_noteEdit+.nUhMVa_noteRow{margin-top:6px}.nUhMVa_noteMine{color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_noteToggle{font:inherit;color:var(--dsw-alias-label-tertiary,#8b93a1);cursor:pointer;white-space:nowrap;background:0 0;border:none;flex-shrink:0;padding:0;font-size:11px;line-height:16px}.nUhMVa_noteToggle:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:underline}.nUhMVa_noteAction{color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-bg-layer-2,#f3f4f6);border:1px solid var(--dsw-alias-border-l3,#d9dde3);border-radius:4px;align-items:center;padding:0 5px;font-weight:600;text-decoration:none;display:inline-flex}.nUhMVa_noteAction:hover{color:var(--dsw-alias-label-primary,#1f2328);border-color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:none}.nUhMVa_noteEdit{flex-wrap:wrap;align-items:center;gap:6px;min-width:0;margin-top:6px;display:flex}.nUhMVa_noteInput{flex:1;min-width:160px}.nUhMVa_descTight{min-height:0}.nUhMVa_src{color:var(--dsw-alias-label-secondary,#9ca3af);font-size:11px;text-decoration:none}.nUhMVa_src:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_dot{vertical-align:2px;margin-left:5px}.nUhMVa_act{flex-wrap:wrap;align-items:center;gap:6px;margin-top:6px;font-size:11px;display:flex}.nUhMVa_actLive{color:var(--dsw-alias-state-success-primary,#16a34a);align-items:center;gap:4px;font-weight:600;display:inline-flex}.nUhMVa_actWarn{color:var(--dsw-alias-state-warn-primary,#b45309);align-items:center;gap:4px;font-weight:600;display:inline-flex}.nUhMVa_actBroken{color:var(--dsw-alias-state-error-primary,#dc2626);align-items:center;gap:4px;font-weight:600;display:inline-flex}.nUhMVa_actWhy{color:var(--dsw-alias-label-secondary,#6b7280);margin-top:2px}.nUhMVa_loading{color:var(--dsw-alias-label-secondary,#9ca3af);flex-direction:column;align-items:center;gap:12px;padding:48px;font-size:13px;display:flex}.nUhMVa_spin{color:var(--dsw-alias-brand-primary,#4f6ef7);flex-shrink:0;animation:.8s linear infinite nUhMVa_sp;display:inline-flex}.nUhMVa_logoMark{color:var(--dsw-alias-brand-primary,#4f6ef7);flex-shrink:0;display:inline-flex}.nUhMVa_logoPlug{transform-box:fill-box;transform-origin:50%;animation:1.5s cubic-bezier(.4,0,.2,1) infinite nUhMVa_dshmPlug}@keyframes nUhMVa_dshmPlug{0%,12%{transform:rotate(9deg)}45%,62%{transform:translate(-1.28px,1.27px)rotate(0)}95%,to{transform:rotate(9deg)}}@media (prefers-reduced-motion:reduce){.nUhMVa_logoPlug,.nUhMVa_spin{animation:1.5s ease-in-out infinite nUhMVa_dshmPlugFade}}@keyframes nUhMVa_dshmPlugFade{0%,to{opacity:1}50%{opacity:.35}}@keyframes nUhMVa_sp{to{transform:rotate(360deg)}}.nUhMVa_progress{background:var(--dsw-alias-bg-layer-2,#f3f4f6);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);color:var(--dsw-alias-label-secondary,#6b7280);border-radius:8px;flex-wrap:wrap;align-items:center;gap:9px;margin:0;padding:8px 12px;font-size:12px;display:flex}.nUhMVa_bar{background:var(--dsw-alias-border-l1,#e5e7eb);border-radius:99px;width:100%;height:4px;overflow:hidden}.nUhMVa_barFill{background:var(--dsw-alias-brand-primary,#4f6ef7);border-radius:99px;height:100%;transition:width .6s}.nUhMVa_barWave{width:30%;animation:1.2s ease-in-out infinite nUhMVa_dshmSlide}@keyframes nUhMVa_dshmSlide{0%{margin-left:-30%}to{margin-left:100%}}.nUhMVa_irow .nUhMVa_progress{margin-top:8px}.nUhMVa_progress code{text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,Menlo,monospace;font-size:11px;overflow:hidden}.nUhMVa_empty{color:var(--dsw-alias-label-secondary,#9ca3af);text-align:center;padding:32px;font-size:13px}.nUhMVa_err{color:var(--dsw-alias-state-error-primary,#dc2626);white-space:pre-wrap;word-break:break-all;margin:8px 0;font-size:12px}.nUhMVa_cardBlocked{border-color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_conflictHead{align-items:flex-start;gap:8px;display:flex}.nUhMVa_conflictIcon{color:var(--dsw-alias-state-error-primary,#dc2626);flex-shrink:0;margin-top:1px}.nUhMVa_conflictTitle{color:var(--dsw-alias-state-error-primary,#dc2626);font-size:13px;font-weight:600;line-height:18px}.nUhMVa_conflictBody{margin:0;font-size:12px;line-height:19px}.nUhMVa_roster{background:var(--dsw-alias-border-l2,#e5e7eb);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;flex-direction:column;gap:1px;display:flex;overflow:hidden}.nUhMVa_rosterRow{background:var(--dsw-alias-bg-layer-1,#fff);align-items:center;gap:8px;padding:7px 10px;display:flex}.nUhMVa_rosterMain{flex-direction:column;min-width:0;display:flex}.nUhMVa_rosterName{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:12px;font-weight:600;overflow:hidden}.nUhMVa_rosterAuthor{color:var(--dsw-alias-label-secondary,#9ca3af);text-overflow:ellipsis;white-space:nowrap;font-size:10.5px;overflow:hidden}.nUhMVa_rosterTag{border-radius:4px;flex-shrink:0;margin-left:auto;padding:1px 6px;font-size:10.5px;font-weight:600}.nUhMVa_rosterTagKeep{color:var(--dsw-alias-state-success-primary,#16a34a);background:#16a34a1f}.nUhMVa_rosterTagDrop{color:var(--dsw-alias-state-error-primary,#dc2626);background:#dc26261f}.nUhMVa_rosterRowOut .nUhMVa_rosterName{text-decoration:line-through}.nUhMVa_rosterRowOut{opacity:.62}.nUhMVa_rosterSplit{background:var(--dsw-alias-border-l2,#e5e7eb);height:1px}.nUhMVa_reassure{color:var(--dsw-alias-label-secondary,#6b7280);align-items:center;gap:5px;margin:0;font-size:11.5px;line-height:17px;display:flex}.nUhMVa_reassureOk{color:var(--dsw-alias-state-success-primary,#16a34a);flex-shrink:0}.nUhMVa_conflictWhy{color:var(--dsw-alias-label-tertiary,#8b93a1);overflow-wrap:anywhere;margin-top:2px;font-family:ui-monospace,Menlo,monospace;font-size:11px;line-height:17px}.nUhMVa_conflictWhyText{margin-top:5px;font-family:-apple-system,BlinkMacSystemFont,PingFang SC,sans-serif}.nUhMVa_choices{flex-direction:column;gap:7px;display:flex}.nUhMVa_choice{text-align:left;font:inherit;cursor:pointer;background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l3,#d9dde3);border-radius:9px;align-items:flex-start;gap:9px;padding:9px 11px;display:flex}.nUhMVa_choice:has(input:disabled){cursor:default;opacity:.6}.nUhMVa_choiceOn{border-color:var(--dsw-alias-brand-primary,#4f6ef7);background:var(--dsw-alias-bg-layer-2,#f5f7ff)}.nUhMVa_choiceRadio{width:13px;height:13px;accent-color:var(--dsw-alias-brand-primary,#4f6ef7);flex-shrink:0;margin:2px 0 0}.nUhMVa_choiceMain{flex-direction:column;gap:3px;min-width:0;display:flex}.nUhMVa_choiceTitle{font-size:12px;font-weight:600;line-height:17px}.nUhMVa_choiceNote{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:11px;line-height:16px}.nUhMVa_choiceSafe{color:var(--dsw-alias-state-success-primary,#16a34a)}.nUhMVa_stateTag{white-space:nowrap;background:var(--dsw-alias-bg-layer-2,#f3f4f6);min-height:20px;color:var(--dsw-alias-label-secondary,#6b7280);border-radius:5px;flex-shrink:0;align-items:center;gap:5px;padding:1px 7px;font-size:11px;line-height:16px;display:inline-flex}.nUhMVa_stateTag[data-on=true]{color:var(--dsw-alias-state-success-primary,#16a34a);background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#16a34a) 10%, transparent)}.nUhMVa_stateDot{background:var(--dsw-alias-label-tertiary,#8b93a1);border-radius:999px;flex:none;width:6px;height:6px}.nUhMVa_stateDot[data-on=true]{background:var(--dsw-alias-state-success-primary,#16a34a)}.nUhMVa_metaTag{text-overflow:ellipsis;white-space:nowrap;background:var(--dsw-alias-bg-layer-2,#f3f4f6);min-width:0;max-width:100%;min-height:20px;color:var(--dsw-alias-label-tertiary,#8b93a1);border-radius:5px;flex-shrink:1;padding:1px 7px;font-size:11px;line-height:18px;display:inline-block;overflow:hidden}.nUhMVa_metaTagOk{color:var(--dsw-alias-state-success-primary,#16a34a);background:color-mix(in srgb, var(--dsw-alias-state-success-primary,#16a34a) 10%, transparent)}.nUhMVa_metaTagAction{font-family:inherit;font-size:11px;line-height:18px;font-weight:inherit;cursor:pointer;background:var(--dsw-alias-bg-layer-2,#f3f4f6);color:var(--dsw-alias-label-secondary,#6b7280);border:none;border-radius:5px;flex-shrink:0;padding:1px 7px}.nUhMVa_metaTagAction:hover:not(:disabled){color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_metaTagAction:disabled{opacity:.5;cursor:default}.nUhMVa_irowHead{align-items:flex-start;gap:8px;min-width:0;display:flex}.nUhMVa_irowHead .nUhMVa_irowName{flex:1 1 0;min-width:0}.nUhMVa_irowDevTag{letter-spacing:.02em;white-space:nowrap;cursor:default;-webkit-user-select:none;user-select:none;color:var(--dsw-alias-label-tertiary,#8b93a1);background:color-mix(in srgb, var(--dsw-alias-brand-primary,#4f6ef7) 9%, var(--dsw-alias-bg-layer-2,#f3f4f6));border-radius:99px;flex-shrink:0;padding:2px 8px;font-size:10px;font-weight:600;line-height:14px}.nUhMVa_nameLink{color:inherit;text-decoration:none}.nUhMVa_irowName{text-overflow:clip;flex-wrap:wrap;align-items:baseline;gap:6px;min-width:0;display:flex;overflow:visible}.nUhMVa_irowNameText{overflow-wrap:anywhere;white-space:normal;min-width:0}.nUhMVa_irowName>.nUhMVa_owner{flex:none}.nUhMVa_nameLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:underline}.nUhMVa_opWrap{flex-shrink:0;margin-bottom:6px;display:inline-flex;position:relative}.nUhMVa_opEntry{font:inherit;cursor:pointer;white-space:nowrap;color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l3,#d9dde3);border-radius:7px;align-items:center;gap:6px;padding:4px 10px;font-size:12px;display:inline-flex;position:relative}.nUhMVa_opEntryQuiet{color:var(--dsw-alias-label-secondary,#6b7280);background:0 0;border-color:#0000}.nUhMVa_opEntryAlert{border-color:var(--dsw-alias-state-error-primary,#dc2626);color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_opDot{background:var(--dsw-alias-state-error-primary,#dc2626);border-radius:99px;width:8px;height:8px;position:absolute;top:-3px;right:-3px}.nUhMVa_opPanel{z-index:40;background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l3,#d9dde3);border-radius:12px;width:460px;max-width:86vw;max-height:70vh;position:absolute;top:calc(100% + 6px);right:0;overflow-y:auto;box-shadow:0 20px 52px #00000047}.nUhMVa_opHead{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);align-items:center;gap:8px;padding:9px 14px;display:flex}.nUhMVa_opPanelTitle{font-size:12.5px;font-weight:600}.nUhMVa_opCloseBtn.nUhMVa_opCloseBtn{min-width:0;color:var(--dsw-alias-label-secondary,#6b7280);padding:0 6px}.nUhMVa_opAggregate{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-2,#f7f8fa);padding:9px 14px}.nUhMVa_opAggregateTop{font-variant-numeric:tabular-nums;font-size:12px;font-weight:600}.nUhMVa_opAggregateHint{color:var(--dsw-alias-label-tertiary,#8b93a1);margin-top:4px;font-size:10.5px}.nUhMVa_opRow{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);align-items:flex-start;gap:9px;padding:9px 14px;display:flex}.nUhMVa_opRow:last-child{border-bottom:none}.nUhMVa_opRowAlert{background:#dc26260f}.nUhMVa_opIcon{flex-shrink:0;place-items:center;width:14px;margin-top:1px;display:grid}.nUhMVa_opQueuedIcon{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:12px}.nUhMVa_opMain{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.nUhMVa_opTop{align-items:baseline;gap:6px;min-width:0;display:flex}.nUhMVa_opVerb{color:var(--dsw-alias-label-secondary,#6b7280);flex-shrink:0;font-size:12px}.nUhMVa_opName{text-overflow:ellipsis;white-space:nowrap;font-size:12px;font-weight:600;overflow:hidden}.nUhMVa_opStatus{color:var(--dsw-alias-label-tertiary,#8b93a1);overflow-wrap:anywhere;font-size:10.5px;line-height:16px}.nUhMVa_opStatusBad{color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_opActions{flex-shrink:0;align-items:center;gap:6px;margin-top:1px;display:flex}.nUhMVa_opDecision{border-top:1px dashed var(--dsw-alias-border-l2,#e5e7eb);flex-direction:column;gap:8px;margin-top:8px;padding-top:8px;display:flex}.nUhMVa_opDecisionFoot{align-items:center;gap:8px;display:flex}.nUhMVa_conflictDetailsToggle{font:inherit;cursor:pointer;color:var(--dsw-alias-label-tertiary,#8b93a1);background:0 0;border:none;align-items:center;gap:4px;padding:2px 0;font-size:11px;display:inline-flex}.nUhMVa_conflictDetailsToggle:hover{color:var(--dsw-alias-label-secondary,#6b7280)}.nUhMVa_opEmpty{text-align:center;color:var(--dsw-alias-label-secondary,#6b7280);padding:30px 14px;font-size:12px}.nUhMVa_opEmptyHint{color:var(--dsw-alias-label-tertiary,#8b93a1);margin-top:4px;font-size:11px}.nUhMVa_cardBlockedMark{font:inherit;cursor:pointer;color:var(--dsw-alias-state-error-primary,#dc2626);border:1px solid var(--dsw-alias-state-error-primary,#dc2626);background:#dc262614;border-radius:7px;align-items:center;gap:5px;padding:4px 9px;font-size:11px;display:inline-flex}.nUhMVa_dangerBtn.nUhMVa_dangerBtn{color:var(--dsw-alias-state-error-primary,#dc2626);border-color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_dangerBtn.nUhMVa_dangerBtn:hover:not(:disabled){background:var(--dsw-alias-state-error-primary,#dc2626);color:#fff}.nUhMVa_dangerArmed.nUhMVa_dangerArmed{background:var(--dsw-alias-state-error-primary,#dc2626);border-color:var(--dsw-alias-state-error-primary,#dc2626);color:var(--dsw-alias-label-primary-foreground,#fff)}.nUhMVa_retryBtn{margin-top:4px}.nUhMVa_irow{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:10px;flex-direction:column;gap:10px;min-width:0;padding:12px 14px;display:flex}.nUhMVa_irowActions{flex-wrap:wrap;justify-content:flex-start;align-items:center;gap:8px;min-width:0;display:flex}.nUhMVa_irowTrailing{flex-wrap:nowrap;flex-shrink:0;align-items:center;gap:8px;min-width:0;display:inline-flex}.nUhMVa_irowTrailing .nUhMVa_metaTag{flex-shrink:1;min-width:0}.nUhMVa_irowTrailing .nUhMVa_metaTagAction{flex-shrink:0}.nUhMVa_irowMissing{filter:grayscale();opacity:.5}.nUhMVa_irow>.nUhMVa_src,.nUhMVa_irow>.nUhMVa_owner,.nUhMVa_irow button{white-space:nowrap;flex-shrink:0}.nUhMVa_tabSearchRow{align-items:center;gap:8px;padding:0 4px 12px;display:flex}.nUhMVa_tabSearch{flex:1;min-width:0}.nUhMVa_caps{flex-wrap:wrap;align-items:center;gap:4px;min-width:0;padding:0 2px 6px;font-size:11px;line-height:1.5;display:flex}.nUhMVa_capsTitle{color:var(--dsw-alias-label-secondary,#8b949e);cursor:help}.nUhMVa_capChip{border:1px solid var(--dsw-alias-border-l2,#30363d);color:var(--dsw-alias-label-primary,#c9d1d9);white-space:nowrap;border-radius:999px;padding:0 6px}.nUhMVa_capMuted{border:1px dashed var(--dsw-alias-border-l2,#30363d);color:var(--dsw-alias-label-secondary,#8b949e);white-space:nowrap;border-radius:999px;padding:0 6px}.nUhMVa_capFact{color:var(--dsw-alias-label-secondary,#8b949e)}.nUhMVa_capCaveat{color:var(--dsw-alias-label-tertiary,#8b93a1);margin:6px 0 0;font-size:11px;line-height:16px}.nUhMVa_searchField{box-sizing:border-box;min-width:0;position:relative}.nUhMVa_searchInput.nUhMVa_searchInput{box-sizing:border-box;width:100%;min-width:0;padding-right:34px}.nUhMVa_searchClear{width:24px;height:24px;color:var(--dsw-alias-label-secondary,#59636e);font:inherit;cursor:pointer;background:0 0;border:0;border-radius:4px;justify-content:center;align-items:center;padding:0;font-size:20px;line-height:1;display:flex;position:absolute;top:50%;right:5px;transform:translateY(-50%)}.nUhMVa_searchClear:hover{background:var(--dsw-alias-bg-layer-2,#f3f4f6);color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_searchClear:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#4f6ef7);outline-offset:1px}.nUhMVa_spec{color:var(--dsw-alias-label-secondary,#9ca3af);overflow-wrap:anywhere;min-width:0;font-family:ui-monospace,Menlo,monospace;font-size:11px}.nUhMVa_specTag{white-space:nowrap;border-radius:4px;flex-shrink:0;align-items:center;height:16px;padding:0 5px;font-size:10px;font-weight:600;display:inline-flex}.nUhMVa_specTagGit{color:var(--dsw-alias-state-business-primary,#0b7285);background:#12a3c41f}.nUhMVa_specTagFile{color:var(--dsw-alias-state-warn-primary,#b07d1b);background:#f0b42924}.nUhMVa_backupCheckList .nUhMVa_grow{white-space:nowrap;text-overflow:ellipsis;flex:70%;min-width:0;overflow:hidden}.nUhMVa_backupCheckList .nUhMVa_spec{text-align:right;white-space:nowrap;text-overflow:ellipsis;flex:0 30%;max-width:30%;overflow:hidden}.nUhMVa_staleAction{word-break:normal;flex-wrap:wrap;align-items:center;gap:8px;margin-top:8px;display:flex}.nUhMVa_pct{color:var(--dsw-alias-label-secondary,#6b7280);flex-shrink:0;font-size:11px;font-weight:600}.nUhMVa_pager{flex-wrap:nowrap;justify-content:space-between;align-items:center;gap:8px;margin:16px 0 4px;display:flex}.nUhMVa_pagerPages{flex-wrap:nowrap;flex:1;justify-content:center;align-items:center;gap:4px;min-width:0;display:flex}.nUhMVa_pagerMeta{flex-wrap:nowrap;flex-shrink:0;align-items:center;gap:6px;display:flex}.nUhMVa_pagerPages button,.nUhMVa_pagerMeta button{min-width:0;padding:0 8px}.nUhMVa_pageEllipsis{color:var(--dsw-alias-label-secondary,#9ca3af);padding:0 1px;font-size:12px}.nUhMVa_pageInfo{color:var(--dsw-alias-label-secondary,#6b7280);white-space:nowrap;font-size:12px}@container (width<=544px){.nUhMVa_pager{flex-wrap:wrap;justify-content:center;gap:8px}.nUhMVa_pagerPages{flex-basis:100%}}.nUhMVa_depBadge{border:1px solid var(--dsw-alias-state-warn-primary,#b45309);color:var(--dsw-alias-state-warn-primary,#b45309);white-space:nowrap;border-radius:4px;flex-shrink:0;margin-left:6px;padding:1px 6px;font-size:11px;font-weight:600;line-height:16px}.nUhMVa_deprecate{color:var(--dsw-alias-state-warn-primary,#b45309);background:var(--dsw-alias-bg-layer-2,#fdf3e3);border:1px solid var(--dsw-alias-border-l2,#f3e3c3);border-radius:8px;margin:0;padding:8px 10px;font-size:12px;line-height:18px}.nUhMVa_deprecate a{color:var(--dsw-alias-state-warn-primary,#b45309);text-decoration:underline}.nUhMVa_deprecate .nUhMVa_src{margin-left:8px}.nUhMVa_depLine{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.nUhMVa_switch{border:1px solid var(--dsw-alias-border-l2,#d9dde3);background:var(--dsw-alias-bg-layer-2,#e5e7eb);cursor:pointer;border-radius:99px;flex-shrink:0;width:38px;height:22px;padding:0;transition:background .15s,border-color .15s;position:relative}.nUhMVa_switchOn{background:var(--dsw-alias-state-success-primary,#16a34a);border-color:var(--dsw-alias-state-success-primary,#16a34a)}.nUhMVa_switchMixed{background:var(--dsw-alias-state-warn-primary,#b45309);border-color:var(--dsw-alias-state-warn-primary,#b45309)}.nUhMVa_switchKnob{background:#fff;border-radius:99px;width:16px;height:16px;transition:left .15s;position:absolute;top:2px;left:2px;box-shadow:0 1px 2px #00000040}.nUhMVa_switchOn .nUhMVa_switchKnob,.nUhMVa_switchMixed .nUhMVa_switchKnob{left:18px}.nUhMVa_switch:disabled{opacity:.5;cursor:default}.nUhMVa_viewBar{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;align-items:center;gap:2px;width:fit-content;margin-bottom:12px;padding:2px;display:flex}.nUhMVa_viewBtn{font:inherit;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;white-space:nowrap;background:0 0;border:none;border-radius:6px;padding:4px 10px;font-size:12px;line-height:18px}.nUhMVa_viewBtn:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_viewOn{background:var(--dsw-alias-bg-layer-2,#eef0f4);color:var(--dsw-alias-label-primary,#1f2328);font-weight:600}.nUhMVa_groupRow{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;margin-bottom:10px;padding:12px 14px}.nUhMVa_groupHead{flex-wrap:wrap;align-items:center;gap:10px;min-width:0;display:flex}.nUhMVa_groupCollapse{width:22px;height:22px;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;background:0 0;border:none;border-radius:6px;flex-shrink:0;justify-content:center;align-items:center;padding:0;display:inline-flex}.nUhMVa_groupCollapse:hover{background:var(--dsw-alias-bg-layer-2,#eef0f4);color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_groupTitle{flex-direction:column;flex:auto;gap:1px;min-width:0;display:flex}.nUhMVa_groupTitle .nUhMVa_groupHint{margin-top:0}.nUhMVa_groupName{text-overflow:ellipsis;white-space:nowrap;font-size:13px;font-weight:600;line-height:20px;overflow:hidden}.nUhMVa_groupMeta{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:11px;line-height:16px}.nUhMVa_groupActions{flex-wrap:wrap;flex-shrink:0;align-items:center;gap:6px;margin-left:auto;display:flex}.nUhMVa_groupMembers{flex-direction:column;gap:6px;margin-top:10px;display:flex}.nUhMVa_groupMember{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;align-items:center;gap:8px;min-width:0;padding:6px 8px;font-size:12px;line-height:18px;display:flex}.nUhMVa_groupMember .nUhMVa_nm{flex:1;min-width:0;font-size:12px}.nUhMVa_memberName{flex:auto;align-items:center;gap:6px;min-width:0;display:flex}.nUhMVa_memberName .nUhMVa_nm{flex:0 auto;min-width:0}.nUhMVa_memberKind{color:var(--dsw-alias-label-tertiary,#8b93a1);white-space:nowrap;flex:none;font-size:11px;line-height:16px}.nUhMVa_themeSlot{box-shadow:inset 0 -1px 0 var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px 8px 0 0;margin-bottom:4px}.nUhMVa_groupMember>.nUhMVa_switch,.nUhMVa_groupMember>button{flex-shrink:0}.nUhMVa_groupMemberAction{flex:none;margin-left:auto}.nUhMVa_groupMemberAction button{white-space:nowrap}.nUhMVa_groupAddPanel{border-top:1px dashed var(--dsw-alias-border-l2,#e5e7eb);flex-direction:column;gap:6px;margin-top:10px;padding-top:10px;display:flex}.nUhMVa_groupAddModalBody{flex-direction:column;gap:10px;min-width:0;display:flex}.nUhMVa_groupAddFilters{flex-wrap:wrap;gap:6px;display:flex}.nUhMVa_groupAddModalList{flex-direction:column;gap:6px;max-height:min(50vh,360px);padding-right:2px;display:flex;overflow-y:auto}.nUhMVa_groupAddModalHint{color:var(--dsw-alias-label-secondary,#6b7280);margin:0;font-size:12px;line-height:18px}.nUhMVa_groupAddPick{background:var(--dsw-alias-bg-layer-2,#f7f8fa);cursor:pointer;border-radius:8px;align-items:center;gap:8px;min-width:0;padding:8px 10px;display:flex}.nUhMVa_groupAddPick:hover{background:var(--dsw-alias-bg-layer-2,#eef0f4)}.nUhMVa_groupAddPick input{flex-shrink:0;margin:0}.nUhMVa_groupAddPick .nUhMVa_nm{text-overflow:ellipsis;white-space:nowrap;flex:1;min-width:0;font-size:12px;overflow:hidden}.nUhMVa_groupAddFooterMeta{color:var(--dsw-alias-label-secondary,#6b7280);align-self:center;margin-right:auto;font-size:12px;line-height:18px}.nUhMVa_groupOrgHint{color:var(--dsw-alias-label-tertiary,#8b93a1);margin:4px 0 0;font-size:11px;line-height:16px}.nUhMVa_groupRenameField{flex-direction:column;gap:6px;min-width:min(100%,320px);display:flex}.nUhMVa_groupRenameField label{color:var(--dsw-alias-label-secondary,#6b7280);font-size:12px;line-height:18px}.nUhMVa_groupRenameField .nUhMVa_inlineInput{width:100%}.nUhMVa_groupCreate{align-items:center;gap:8px;margin-bottom:10px;display:flex}.nUhMVa_groupCreateInline{flex-shrink:0;align-items:center;gap:8px;display:flex}.nUhMVa_groupCreateInline .nUhMVa_inlineInput{flex:none;width:160px}.nUhMVa_inlineInput{flex:1;min-width:120px}.nUhMVa_ungroupedRow{flex-wrap:nowrap}.nUhMVa_ungroupedRow>.nUhMVa_nm{flex:0 auto;max-width:42%;font-size:12px;line-height:18px}.nUhMVa_ungroupedState{flex:0 auto;align-items:center;min-width:0;max-width:46%;margin:0;display:inline-flex}.nUhMVa_ungroupedState>span{text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.nUhMVa_ungroupedDesc{text-overflow:ellipsis;white-space:nowrap;min-width:0;color:var(--dsw-alias-label-tertiary,#8b93a1);flex:1 1 0;font-size:12px;line-height:18px;overflow:hidden}.nUhMVa_ungroupedDesc.nUhMVa_noteMine{color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_groupHint{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:11px}.nUhMVa_sect{color:var(--dsw-alias-label-secondary,#6b7280);margin:14px 2px 8px;font-size:12px;font-weight:600}.nUhMVa_sectAction{color:var(--dsw-alias-label-secondary,#6b7280);align-items:center;gap:8px;margin:14px 2px 8px;font-size:12px;font-weight:600;display:flex}.nUhMVa_backupGrid{grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px;display:grid}.nUhMVa_backupCard{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;flex-direction:column;gap:10px;padding:16px;display:flex}.nUhMVa_backupCard h3{margin:0;font-size:14px}.nUhMVa_backupCard p{color:var(--dsw-alias-label-secondary,#6b7280);margin:0;font-size:12px;line-height:18px}.nUhMVa_backupActions{flex-wrap:wrap;gap:8px;display:flex;position:relative}.nUhMVa_hiddenFile{opacity:0;pointer-events:none;width:1px;height:1px;position:absolute}.nUhMVa_backupInput{box-sizing:border-box;width:100%}.nUhMVa_backupCheck{cursor:pointer;align-items:center;gap:6px;font-size:12px;display:flex}.nUhMVa_backupWarn{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-state-warn-primary,#b45309)!important}.nUhMVa_backupMessage{color:var(--dsw-alias-label-secondary,#6b7280);grid-column:1/-1;font-size:12px}.nUhMVa_backupCheckList{flex-direction:column;gap:6px;max-height:260px;margin:10px 0 4px;padding-right:4px;display:flex;overflow-y:auto}.nUhMVa_backupCheckList .nUhMVa_backupCheck{justify-content:space-between;gap:8px}.nUhMVa_diagPage{flex-direction:column;gap:12px;height:100%;min-height:0;display:flex;overflow-y:auto}.nUhMVa_diagSummary{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;flex-wrap:wrap;align-items:center;gap:12px;padding:10px 14px;font-size:12px;display:flex}.nUhMVa_diagSummaryItem{color:var(--dsw-alias-label-secondary,#6b7280);white-space:nowrap;align-items:center;gap:6px;display:inline-flex}.nUhMVa_diagSummaryMeta{color:var(--dsw-alias-label-tertiary,#9ca3af);text-overflow:ellipsis;white-space:nowrap;max-width:320px;font-family:ui-monospace,Menlo,monospace;font-size:11px;overflow:hidden}.nUhMVa_diagSection{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;flex-direction:column;gap:8px;padding:12px 14px;display:flex}.nUhMVa_diagSection h3{color:var(--dsw-alias-label-primary,#1f2328);margin:0;font-size:13px;font-weight:600}.nUhMVa_diagCount{color:var(--dsw-alias-label-tertiary,#9ca3af);font-size:11px;font-weight:400}.nUhMVa_diagEmpty{color:var(--dsw-alias-label-secondary,#9ca3af);padding:8px 0;font-size:12px}.nUhMVa_diagBundle{border-top:1px solid var(--dsw-alias-border-l2,#f0f1f3);flex-direction:column;gap:6px;padding-top:8px;display:flex}.nUhMVa_diagBundle:first-of-type{border-top:none;padding-top:0}.nUhMVa_diagRow{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;font-size:12px;line-height:18px;display:flex}.nUhMVa_diagMeta{align-items:baseline;gap:8px;min-width:0;font-size:12px;display:flex}.nUhMVa_diagKey{color:var(--dsw-alias-label-tertiary,#9ca3af);flex-shrink:0;min-width:64px;font-size:11px}.nUhMVa_diagVal{color:var(--dsw-alias-label-primary,#1f2328);overflow-wrap:anywhere;min-width:0;font-family:ui-monospace,Menlo,monospace;font-size:12px;font-weight:500}.nUhMVa_diagIndex{background:var(--dsw-alias-bg-layer-2,#f3f4f6);min-width:18px;height:18px;color:var(--dsw-alias-label-secondary,#6b7280);border-radius:9px;flex-shrink:0;justify-content:center;align-items:center;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_diagArrow{color:var(--dsw-alias-label-tertiary,#9ca3af);flex-shrink:0;font-size:12px}.nUhMVa_diagBadgeOfficial{background:var(--dsw-alias-button-primary-fill,var(--dsw-alias-brand-primary,#4f6ef7));height:18px;color:var(--dsw-alias-label-primary-foreground,#fff);border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_diagBadgeCommunity{background:var(--dsw-alias-bg-layer-2,#f3f4f6);height:18px;color:var(--dsw-alias-label-secondary,#6b7280);border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;display:inline-flex}.nUhMVa_diagBadgeShadow{background:var(--dsw-alias-state-error-primary,#dc2626);height:18px;color:var(--dsw-alias-label-primary-foreground,#fff);border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_diagBadgeWarn{background:var(--dsw-alias-state-warn-primary,#b45309);height:18px;color:var(--dsw-alias-label-primary-foreground,#fff);white-space:nowrap;border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_diagBadgeInfo{background:var(--dsw-alias-bg-layer-2,#f3f4f6);height:18px;color:var(--dsw-alias-label-secondary,#6b7280);white-space:nowrap;border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;display:inline-flex}.nUhMVa_diagList{flex-direction:column;gap:6px;display:flex}.nUhMVa_sectionOverview{color:var(--dsw-alias-label-tertiary,#8b93a1);text-overflow:ellipsis;white-space:nowrap;max-width:100%;padding:2px 0 6px;font-size:12px;line-height:18px;overflow:hidden}.nUhMVa_diagAlert{color:var(--dsw-alias-state-warn-primary,#b45309)}.nUhMVa_ovRow{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;flex-wrap:wrap;align-items:center;gap:8px;min-width:0;padding:6px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_ovArrow{color:var(--dsw-alias-label-tertiary,#9ca3af);flex-shrink:0;font-size:12px}.nUhMVa_ovByTag{background:var(--dsw-alias-button-primary-fill,var(--dsw-alias-brand-primary,#4f6ef7));height:18px;color:var(--dsw-alias-label-primary-foreground,#fff);text-overflow:ellipsis;white-space:nowrap;border-radius:9px;flex-shrink:0;align-items:center;max-width:260px;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex;overflow:hidden}.nUhMVa_ovFrom{color:var(--dsw-alias-label-secondary,#6b7280);text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:12px;overflow:hidden}.nUhMVa_orphRow{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;flex-wrap:wrap;align-items:center;gap:8px;min-width:0;padding:6px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_orphBadge{background:var(--dsw-alias-state-warn-primary,#b45309);height:18px;color:var(--dsw-alias-label-primary-foreground,#fff);white-space:nowrap;border-radius:9px;flex-shrink:0;align-items:center;padding:0 8px;font-size:11px;font-weight:600;display:inline-flex}.nUhMVa_dragHandle{width:20px;height:20px;color:var(--dsw-alias-label-tertiary,#9ca3af);cursor:grab;-webkit-user-select:none;user-select:none;flex-shrink:0;justify-content:center;align-items:center;font-size:12px;line-height:20px;display:inline-flex}.nUhMVa_dragOver{outline:2px dashed var(--dsw-alias-brand-primary,#4f6ef7);outline-offset:2px;background:var(--dsw-alias-bg-layer-2,#f0f2f8);border-radius:8px}.nUhMVa_dragging{opacity:.45;background:var(--dsw-alias-bg-layer-2,#f3f4f6)}.nUhMVa_collapseHead{font:inherit;color:var(--dsw-alias-label-primary,#1f2328);cursor:pointer;text-align:left;background:0 0;border:none;align-items:center;gap:8px;width:100%;padding:0;font-size:13px;font-weight:600;display:flex}.nUhMVa_collapseIcon{color:var(--dsw-alias-label-secondary,#6b7280);flex-shrink:0;display:inline-flex}.nUhMVa_collapseTitle{flex:1;min-width:0}.nUhMVa_collapseBody{border-top:1px solid var(--dsw-alias-border-l2,#f0f1f3);overflow-wrap:anywhere;flex-direction:column;gap:10px;min-width:0;margin-top:8px;padding-top:10px;display:flex}.nUhMVa_orderPanel{flex-direction:column;gap:10px;min-width:0;display:flex}.nUhMVa_panelNote{color:var(--dsw-alias-label-secondary,#6b7280);margin:0;font-size:12px;line-height:18px}.nUhMVa_panelActions{flex-wrap:wrap;align-items:center;gap:8px;display:flex}.nUhMVa_presetList{flex-direction:column;gap:6px;min-width:0;display:flex}.nUhMVa_presetRow{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;flex-direction:column;align-items:stretch;gap:6px;min-width:0;max-width:100%;padding:8px 10px;font-size:12px;line-height:18px;display:flex}.nUhMVa_presetName{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;font-weight:600;overflow:hidden}.nUhMVa_snapList{flex-direction:column;gap:6px;min-width:0;display:flex}.nUhMVa_snapRow{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-radius:8px;flex-direction:column;align-items:stretch;gap:8px;padding:10px 12px;font-size:12px;line-height:18px;display:flex}.nUhMVa_snapMeta{flex-wrap:wrap;align-items:center;gap:8px;min-width:0;display:flex}.nUhMVa_snapConfirmText{color:var(--dsw-alias-state-warn-primary,#b45309);margin:0;font-size:12px;line-height:18px}.nUhMVa_confirmRow{flex-wrap:wrap;align-items:center;gap:6px;display:inline-flex}.nUhMVa_fixFallback{flex-direction:column;gap:6px;margin:8px 0;display:flex}.nUhMVa_fixFallbackText,.nUhMVa_envEditor{box-sizing:border-box;width:100%;color:var(--dsw-alias-label-primary,#1f2328);background:var(--dsw-alias-bg-layer-2,#f3f4f6);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);resize:vertical;white-space:pre-wrap;word-break:break-all;border-radius:6px;padding:8px 10px;font-family:ui-monospace,Menlo,monospace;font-size:11px;line-height:16px}.nUhMVa_setCard{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-3,#fff);border-radius:12px;list-style:none;transition:border-color .16s,background .16s}.nUhMVa_setCard:hover{border-color:var(--dsw-alias-label-dimmed,#c8ccd4)}.nUhMVa_setCardOpen{background:var(--dsw-alias-bg-layer-2,#f7f8fa);border-color:var(--dsw-alias-label-dimmed,#c8ccd4)}.nUhMVa_setHeader{-webkit-appearance:none;appearance:none;width:100%;font:inherit;color:inherit;text-align:left;cursor:pointer;background:0 0;border:0;border-radius:12px;align-items:center;gap:12px;padding:14px 16px;display:flex}.nUhMVa_setHeader:focus-visible{outline:2px solid var(--dsw-alias-brand-primary,#4f6ef7);outline-offset:-2px}.nUhMVa_setHeadText{flex-direction:column;flex:1;gap:4px;min-width:0;display:flex}.nUhMVa_setName{color:var(--dsw-alias-label-primary,#1f2328);font-size:15px;font-weight:600;line-height:1.4}.nUhMVa_setDesc{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:13px;line-height:1.5}.nUhMVa_setChevron{color:var(--dsw-alias-label-tertiary,#8b93a1);flex:none;transition:transform .16s;display:inline-flex}.nUhMVa_setChevronOpen{transform:rotate(180deg)}.nUhMVa_setBody{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb);margin:0 16px;padding-bottom:8px}.nUhMVa_setRow{align-items:center;gap:12px;padding:12px 0;display:flex}.nUhMVa_setRow+.nUhMVa_setRow{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb)}.nUhMVa_setLabelBox{flex-direction:column;flex:1;gap:3px;min-width:0;display:flex}.nUhMVa_setLabel{font-size:13px;line-height:20px}.nUhMVa_setHint{color:var(--dsw-alias-label-tertiary,#8b93a1);font-size:12px;line-height:18px}.nUhMVa_setConfirm{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb);flex-direction:column;gap:8px;padding:12px 0 4px;display:flex}.nUhMVa_setCheck{cursor:pointer;align-items:center;gap:8px;font-size:12px;line-height:18px;display:flex}.nUhMVa_setActions{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb);justify-content:flex-end;align-items:center;gap:8px;padding:12px 0 4px;display:flex}.nUhMVa_setInlineActions{flex-wrap:wrap;justify-content:flex-end;align-items:center;gap:6px;display:flex}.nUhMVa_setProxyEditor{border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb);flex-wrap:wrap;align-items:flex-end;gap:10px;padding:12px 0;display:flex}.nUhMVa_setProxyLabel{min-width:180px;color:var(--dsw-alias-label-secondary,#6b7280);flex-direction:column;flex:1;gap:5px;font-size:12px;line-height:18px;display:flex}.nUhMVa_setProxyInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,#d1d5db);background:var(--dsw-alias-bg-layer-3,#fff);width:100%;min-width:0;color:var(--dsw-alias-label-primary,#1f2328);font:inherit;border-radius:7px;padding:6px 8px;font-size:12px;line-height:18px}.nUhMVa_setProxyInput:focus{border-color:var(--dsw-alias-brand-primary,#4f6ef7);outline:2px solid color-mix(in srgb,var(--dsw-alias-brand-primary,#4f6ef7) 18%,transparent)}.nUhMVa_setDanger{color:var(--dsw-alias-state-error-primary,#dc2626)}.nUhMVa_setSeg{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;flex-shrink:0;gap:2px;padding:2px;display:inline-flex}.nUhMVa_setSegBtn{font:inherit;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;background:0 0;border:none;border-radius:6px;padding:3px 10px;font-size:12px;line-height:18px}.nUhMVa_setSegBtn:disabled{cursor:default;opacity:.5}.nUhMVa_setSegOn{background:var(--dsw-alias-bg-layer-2,#eef0f4);color:var(--dsw-alias-label-primary,#1f2328);font-weight:600}.nUhMVa_setBetaTag{background:var(--dsw-alias-bg-module-platform,#eef0f4);color:var(--dsw-alias-label-secondary,#6b7280);border-radius:9px;margin-left:6px;padding:0 6px;font-size:11px;font-weight:600;line-height:17px}.nUhMVa_commentsLink{cursor:pointer;white-space:nowrap;color:var(--dsw-alias-label-secondary,#9ca3af);background:0 0;border:0;padding:0;font-size:11px;line-height:16px}.nUhMVa_commentsLink:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_footActions{flex-shrink:0;align-items:center;gap:8px;display:inline-flex}.nUhMVa_favoriteBtn{cursor:pointer;color:var(--dsw-alias-label-secondary,#9ca3af);background:0 0;border:0;align-items:center;padding:0;display:inline-flex}.nUhMVa_favoriteBtn:hover,.nUhMVa_favoriteOn{color:var(--dsw-alias-brand-primary,#4f6ef7)}.nUhMVa_cardMore{cursor:pointer;font:inherit;letter-spacing:1px;color:var(--dsw-alias-label-secondary,#9ca3af);background:0 0;border:0;padding:0 2px;font-size:14px;line-height:16px}.nUhMVa_cardMore:hover{color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_blockedTabHint{color:var(--dsw-alias-label-secondary,#9ca3af);margin:0 0 12px;font-size:12px;line-height:18px}.nUhMVa_blockedMissing{flex-direction:column;gap:4px;margin-top:8px;display:flex}.nUhMVa_blockedBarRow{justify-content:space-between;align-items:center;gap:8px;min-width:0;display:flex}.nUhMVa_blockedBarName{text-overflow:ellipsis;white-space:nowrap;min-width:0;font-size:13px;line-height:20px;overflow:hidden}.nUhMVa_blockedBarUndo{cursor:pointer;font:inherit;color:var(--dsw-alias-brand-primary,#4f6ef7);background:0 0;border:0;padding:0;font-size:12px;line-height:18px}.nUhMVa_commentsNote{color:var(--dsw-alias-label-secondary,#9ca3af);margin:0 0 8px;font-size:11px;line-height:16px}.nUhMVa_commentsGithubPrompt{border:1px solid color-mix(in srgb,var(--dsw-alias-brand-primary,#4f6ef7) 24%,transparent);background:color-mix(in srgb,var(--dsw-alias-brand-primary,#4f6ef7) 6%,transparent);border-radius:8px;margin:0 0 10px;padding:10px}.nUhMVa_commentsGithubHint{color:var(--dsw-alias-label-primary,#1f2328);margin:0 0 8px;font-size:12px;line-height:17px}.nUhMVa_commentsGithubAction{box-sizing:border-box;border:1px solid var(--dsw-alias-brand-primary,#4f6ef7);min-height:28px;color:var(--dsw-alias-brand-primary,#4f6ef7);border-radius:6px;justify-content:center;align-items:center;padding:5px 10px;font-size:12px;font-weight:600;line-height:16px;text-decoration:none;display:inline-flex}.nUhMVa_commentsGithubAction:hover{background:color-mix(in srgb,var(--dsw-alias-brand-primary,#4f6ef7) 9%,transparent)}.nUhMVa_commentsStatus{color:var(--dsw-alias-label-secondary,#9ca3af);margin:0;font-size:12px}.nUhMVa_commentsStatus:empty{display:none}.nUhMVa_commentsError{color:var(--dsw-alias-label-primary,#1f2328);margin:0 0 8px;font-size:12px}.nUhMVa_commentsFail{flex-direction:column;align-items:flex-start;gap:8px;padding:12px 0;display:flex}.nUhMVa_commentsMount{width:100%;min-height:240px;max-height:56vh;overflow:auto}.nUhMVa_commentsMount iframe{width:100%}.nUhMVa_notesLink{font:inherit;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;text-align:left;background:0 0;border:none;margin:2px 0 0;padding:0;font-size:12px;line-height:18px;display:block}.nUhMVa_notesLink:hover{color:var(--dsw-alias-label-primary,#1f2328)}.nUhMVa_notesModalWide{width:min(640px,92vw);max-width:min(640px,92vw)}.nUhMVa_notesBody{overscroll-behavior:contain;flex-direction:column;flex:0 auto;gap:10px;min-width:0;max-height:min(60vh,520px);padding:0 2px 8px 0;display:flex;overflow-y:auto}.nUhMVa_notesRange{align-items:center;gap:8px;margin-bottom:4px;font-size:12px;line-height:18px;display:flex}.nUhMVa_notesArrow{color:var(--dsw-alias-label-tertiary,#8b93a1)}.nUhMVa_notesMeta{letter-spacing:.02em;text-transform:uppercase;color:var(--dsw-alias-label-secondary,#6b7280);flex-wrap:wrap;align-items:baseline;gap:6px;margin-top:4px;font-size:12px;line-height:18px;display:flex}.nUhMVa_notesBody>.nUhMVa_notesMeta:first-child{margin-top:0}.nUhMVa_notesPre{white-space:pre-wrap;word-break:break-word;background:var(--dsw-alias-bg-layer-2,#eef0f4);border-radius:8px;max-height:40vh;margin:0;padding:10px 12px;font-size:13px;line-height:20px;overflow:auto}.nUhMVa_notesRendered{flex-direction:column;gap:8px;min-width:0;display:flex}.nUhMVa_notesImg{border-radius:6px;max-width:100%;height:auto;margin:4px 0;display:block}.nUhMVa_notesH{margin-top:4px;font-size:13px;font-weight:650;line-height:20px}.nUhMVa_notesP{font-size:13px;line-height:20px}.nUhMVa_notesQuote{border-left:3px solid var(--dsw-alias-border-l3,#d9dde3);background:var(--dsw-alias-bg-layer-2,#f7f8fa);color:var(--dsw-alias-label-primary,#1f2328);border-radius:0 6px 6px 0;margin:0;padding:8px 10px;font-size:13px;line-height:20px}.nUhMVa_notesFence{background:var(--dsw-alias-bg-layer-2,#eef0f4);font-family:var(--dsw-alias-font-mono,ui-monospace,Menlo,monospace);white-space:pre;border-radius:8px;margin:0;padding:10px 12px;font-size:12px;line-height:18px;overflow-x:auto}.nUhMVa_notesFence code{font:inherit;background:0 0;padding:0}.nUhMVa_notesBullets{flex-direction:column;gap:4px;margin:0;padding-left:18px;font-size:13px;line-height:20px;display:flex}.nUhMVa_notesA{color:var(--dsw-alias-brand-primary,#4f6ef7);text-decoration:none}.nUhMVa_notesA:hover{text-decoration:underline}.nUhMVa_notesCode{font-family:var(--dsw-alias-font-mono,ui-monospace,monospace);background:var(--dsw-alias-bg-layer-2,#eef0f4);border-radius:5px;padding:1px 5px;font-size:12px}.nUhMVa_notesList{flex-direction:column;margin:0;padding:0;list-style:none;display:flex}.nUhMVa_notesRow{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);align-items:baseline;gap:12px;padding:6px 0;display:flex}.nUhMVa_notesRow:last-child{border-bottom:none}.nUhMVa_notesDate{color:var(--dsw-alias-label-tertiary,#8b93a1);font-variant-numeric:tabular-nums;flex-shrink:0;font-size:12px}.nUhMVa_notesMsg{word-break:break-word;word-break:break-word;-webkit-line-clamp:3;-webkit-box-orient:vertical;min-width:0;font-size:13px;line-height:20px;display:-webkit-box;overflow:hidden}.nUhMVa_notesSha{color:var(--dsw-alias-label-secondary,#6b7280);font-variant-numeric:tabular-nums;flex-shrink:0;margin-left:auto;font-size:12px;text-decoration:none}.nUhMVa_recoverySummary{color:var(--dsw-alias-state-error-primary,#dc2626);word-break:break-word;align-items:flex-start;gap:8px;margin-bottom:8px;font-size:12px;display:flex}.nUhMVa_recoveryHint{color:var(--dsw-alias-label-secondary,#6b7280);margin:8px 0;font-size:12px}.nUhMVa_recoveryList{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;flex-direction:column;max-height:320px;display:flex;overflow-x:hidden;overflow-y:auto}.nUhMVa_recoveryRow{border-top:1px solid var(--dsw-alias-border-l2,#eef0f4);align-items:flex-start;gap:8px;padding:6px 10px;font-size:12px;display:flex}.nUhMVa_recoveryRow:first-child{border-top:none}.nUhMVa_recoveryBlamed{box-shadow:inset 3px 0 0 var(--dsw-alias-state-error-primary,#dc2626);background:#dc262612}.nUhMVa_recoveryMuted{opacity:.6}.nUhMVa_recoveryName{word-break:break-word;flex-direction:column;gap:2px;min-width:0;display:flex}.nUhMVa_recoveryReason{color:var(--dsw-alias-state-error-primary,#dc2626);word-break:break-word;font-size:11px}.nUhMVa_recoveryNote{color:var(--dsw-alias-label-tertiary,#8b93a1);word-break:break-word;margin-top:8px;font-size:11px}.nUhMVa_recoveryBadge{background:var(--dsw-alias-bg-layer-2,#eef0f4);color:var(--dsw-alias-label-secondary,#6b7280);border-radius:5px;margin-left:6px;padding:0 5px;font-size:10px}.nUhMVa_recoveryLog{color:var(--dsw-alias-label-secondary,#6b7280);margin:4px 0 8px;font-size:11px}.nUhMVa_recoveryLog pre{white-space:pre-wrap;word-break:break-word;max-height:180px;margin:6px 0 0;overflow:auto}.nUhMVa_notesSha:hover{color:var(--dsw-alias-label-primary,#1f2328);text-decoration:underline}.nUhMVa_notesVer{color:inherit;font-weight:600;text-decoration:none}.nUhMVa_notesVer:hover{text-decoration:underline}.nUhMVa_migrationSources{flex-direction:column;gap:8px;margin-top:4px;display:flex}.nUhMVa_migrationSource{border:1px solid var(--dsw-alias-border-default,#e5e7eb);border-radius:8px;flex-direction:column;gap:4px;padding:10px 12px;display:flex}.nUhMVa_migrationSource code{overflow-wrap:anywhere;font-family:ui-monospace,Menlo,monospace;font-size:12px}.nUhMVa_migrationLabel{color:var(--dsw-alias-label-secondary,#9ca3af);font-size:11px}.nUhMVa_migrationArrow{text-align:center;color:var(--dsw-alias-label-secondary,#9ca3af)}.nUhMVa_migrationWarning{color:var(--dsw-alias-state-warn-primary,#b45309);align-items:flex-start;gap:6px;margin:12px 0 0;font-size:12px;line-height:18px;display:flex}";
|
|
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}";
|
|
2807
2849
|
const tagId = "dshmarket/Market.module.css";
|
|
2808
2850
|
if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
|
|
2809
2851
|
const tag = document.createElement("style");
|
|
@@ -2844,6 +2886,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
2844
2886
|
"brokenPluginText": "nUhMVa_brokenPluginText",
|
|
2845
2887
|
"byline": "nUhMVa_byline",
|
|
2846
2888
|
"capCaveat": "nUhMVa_capCaveat",
|
|
2889
|
+
"capCaveatAt": "nUhMVa_capCaveatAt",
|
|
2890
|
+
"capCaveatNote": "nUhMVa_capCaveatNote",
|
|
2847
2891
|
"capChip": "nUhMVa_capChip",
|
|
2848
2892
|
"capFact": "nUhMVa_capFact",
|
|
2849
2893
|
"capMuted": "nUhMVa_capMuted",
|
|
@@ -2883,7 +2927,26 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
2883
2927
|
"commentsMount": "nUhMVa_commentsMount",
|
|
2884
2928
|
"commentsNote": "nUhMVa_commentsNote",
|
|
2885
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",
|
|
2886
2945
|
"confirmRow": "nUhMVa_confirmRow",
|
|
2946
|
+
"confirmTags": "nUhMVa_confirmTags",
|
|
2947
|
+
"confirmTerminalDot": "nUhMVa_confirmTerminalDot",
|
|
2948
|
+
"confirmTerminalIcon": "nUhMVa_confirmTerminalIcon",
|
|
2949
|
+
"confirmTerminalPrompt": "nUhMVa_confirmTerminalPrompt",
|
|
2887
2950
|
"conflictBody": "nUhMVa_conflictBody",
|
|
2888
2951
|
"conflictDetailsToggle": "nUhMVa_conflictDetailsToggle",
|
|
2889
2952
|
"conflictHead": "nUhMVa_conflictHead",
|
|
@@ -2898,6 +2961,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
2898
2961
|
"deprecate": "nUhMVa_deprecate",
|
|
2899
2962
|
"desc": "nUhMVa_desc",
|
|
2900
2963
|
"descClamp": "nUhMVa_descClamp",
|
|
2964
|
+
"descClamp3": "nUhMVa_descClamp3",
|
|
2965
|
+
"descMore": "nUhMVa_descMore",
|
|
2901
2966
|
"descTight": "nUhMVa_descTight",
|
|
2902
2967
|
"descToggle": "nUhMVa_descToggle",
|
|
2903
2968
|
"diagAlert": "nUhMVa_diagAlert",
|
|
@@ -2973,13 +3038,31 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
2973
3038
|
"hostRequirementBad": "nUhMVa_hostRequirementBad",
|
|
2974
3039
|
"inlineInput": "nUhMVa_inlineInput",
|
|
2975
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",
|
|
2976
3048
|
"irow": "nUhMVa_irow",
|
|
2977
3049
|
"irowActions": "nUhMVa_irowActions",
|
|
2978
|
-
"
|
|
3050
|
+
"irowDesc": "nUhMVa_irowDesc",
|
|
2979
3051
|
"irowHead": "nUhMVa_irowHead",
|
|
3052
|
+
"irowMenu": "nUhMVa_irowMenu",
|
|
3053
|
+
"irowMeta": "nUhMVa_irowMeta",
|
|
2980
3054
|
"irowMissing": "nUhMVa_irowMissing",
|
|
2981
3055
|
"irowName": "nUhMVa_irowName",
|
|
2982
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",
|
|
2983
3066
|
"irowTrailing": "nUhMVa_irowTrailing",
|
|
2984
3067
|
"lightbox": "nUhMVa_lightbox",
|
|
2985
3068
|
"lightboxClose": "nUhMVa_lightboxClose",
|
|
@@ -3000,7 +3083,6 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
3000
3083
|
"meta": "nUhMVa_meta",
|
|
3001
3084
|
"metaInline": "nUhMVa_metaInline",
|
|
3002
3085
|
"metaTag": "nUhMVa_metaTag",
|
|
3003
|
-
"metaTagAction": "nUhMVa_metaTagAction",
|
|
3004
3086
|
"metaTagOk": "nUhMVa_metaTagOk",
|
|
3005
3087
|
"migrationArrow": "nUhMVa_migrationArrow",
|
|
3006
3088
|
"migrationLabel": "nUhMVa_migrationLabel",
|
|
@@ -3011,8 +3093,10 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
3011
3093
|
"nameLink": "nUhMVa_nameLink",
|
|
3012
3094
|
"nm": "nUhMVa_nm",
|
|
3013
3095
|
"nmLink": "nUhMVa_nmLink",
|
|
3014
|
-
"
|
|
3096
|
+
"noteAdd": "nUhMVa_noteAdd",
|
|
3097
|
+
"noteCount": "nUhMVa_noteCount",
|
|
3015
3098
|
"noteEdit": "nUhMVa_noteEdit",
|
|
3099
|
+
"noteEditBar": "nUhMVa_noteEditBar",
|
|
3016
3100
|
"noteInput": "nUhMVa_noteInput",
|
|
3017
3101
|
"noteMine": "nUhMVa_noteMine",
|
|
3018
3102
|
"noteRow": "nUhMVa_noteRow",
|
|
@@ -6933,26 +7017,48 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
6933
7017
|
* actually overflows the clamp: a two-line description has nothing to
|
|
6934
7018
|
* "expand", so no button beats a button that does nothing.
|
|
6935
7019
|
*/
|
|
6936
|
-
function CardDesc({ text, t }) {
|
|
7020
|
+
function CardDesc({ text, t, lines = 5, className, textClassName }) {
|
|
6937
7021
|
const ref = (0, react.useRef)(null);
|
|
6938
7022
|
const [expanded, setExpanded] = (0, react.useState)(false);
|
|
6939
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;
|
|
6940
7026
|
(0, react.useLayoutEffect)(() => {
|
|
6941
7027
|
const el = ref.current;
|
|
6942
7028
|
if (el === null) return;
|
|
6943
|
-
|
|
6944
|
-
|
|
6945
|
-
|
|
6946
|
-
|
|
6947
|
-
|
|
6948
|
-
|
|
6949
|
-
|
|
6950
|
-
|
|
6951
|
-
|
|
6952
|
-
|
|
6953
|
-
|
|
6954
|
-
|
|
6955
|
-
|
|
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
|
+
});
|
|
6956
7062
|
}
|
|
6957
7063
|
/**
|
|
6958
7064
|
* Full-bleed image preview, opened from a card thumbnail or a dialog's
|
|
@@ -7169,6 +7275,227 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
7169
7275
|
})
|
|
7170
7276
|
});
|
|
7171
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
|
+
}
|
|
7172
7499
|
/** Catalog npm latest, omitted for github-only and not-yet-backfilled rows. */
|
|
7173
7500
|
function CatalogVersionMark({ version, tip }) {
|
|
7174
7501
|
if (typeof version !== "string" || version.length === 0) return null;
|
|
@@ -7257,6 +7584,36 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
7257
7584
|
const names = Object.keys(left);
|
|
7258
7585
|
return names.length === Object.keys(right).length && names.every((name) => left[name] === right[name]);
|
|
7259
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
|
+
}
|
|
7260
7617
|
/**
|
|
7261
7618
|
* Whether one installed plugin has a pending update (either an ordinary
|
|
7262
7619
|
* upgrade via npm/git/restore, or a host-managed generation release), and has
|
|
@@ -7583,6 +7940,9 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
7583
7940
|
/** Ignores out-of-order /dsh-market/favorite responses after a newer toggle. */
|
|
7584
7941
|
const favoriteOpGen = (0, react.useRef)(0);
|
|
7585
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);
|
|
7586
7946
|
/** Shown once a hide sticks, so the card vanishing has a place to look. */
|
|
7587
7947
|
const [blockNotice, setBlockNotice] = (0, react.useState)(null);
|
|
7588
7948
|
/** Ignores out-of-order /dsh-market/block responses after a newer toggle. */
|
|
@@ -7611,6 +7971,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
7611
7971
|
const favoriteErrorDone = (0, react.useCallback)(() => setFavoriteError(null), []);
|
|
7612
7972
|
const blockErrorDone = (0, react.useCallback)(() => setBlockError(null), []);
|
|
7613
7973
|
const blockNoticeDone = (0, react.useCallback)(() => setBlockNotice(null), []);
|
|
7974
|
+
const updateExemptErrorDone = (0, react.useCallback)(() => setUpdateExemptError(null), []);
|
|
7975
|
+
const updateExemptNoticeDone = (0, react.useCallback)(() => setUpdateExemptNotice(null), []);
|
|
7614
7976
|
const [updates, setUpdates] = (0, react.useState)({});
|
|
7615
7977
|
/** Update reminders dismissed for this host boot. The Installed tab still
|
|
7616
7978
|
* shows these plugins and their update actions; only proactive prompts use
|
|
@@ -7689,6 +8051,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
7689
8051
|
const [favoriteUrls, setFavoriteUrls] = (0, react.useState)([]);
|
|
7690
8052
|
/** Package names the user hid from Discover (#657). */
|
|
7691
8053
|
const [blockedNames, setBlockedNames] = (0, react.useState)([]);
|
|
8054
|
+
const [updateExemptNames, setUpdateExemptNames] = (0, react.useState)([]);
|
|
7692
8055
|
/** Rows the user asked to show the AUTHOR's description on, despite a note. */
|
|
7693
8056
|
const [showTheirs, setShowTheirs] = (0, react.useState)([]);
|
|
7694
8057
|
/** The row whose note is being edited, and the text in the box. */
|
|
@@ -7779,6 +8142,26 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
7779
8142
|
*/
|
|
7780
8143
|
const [brokenPlugins, setBrokenPlugins] = (0, react.useState)({});
|
|
7781
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());
|
|
7782
8165
|
const [envFixing, setEnvFixing] = (0, react.useState)(false);
|
|
7783
8166
|
const [envFailed, setEnvFailed] = (0, react.useState)(false);
|
|
7784
8167
|
const [bootId, setBootId] = (0, react.useState)(null);
|
|
@@ -7857,6 +8240,10 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
7857
8240
|
/** Install-command disclosure inside the confirm dialog. */
|
|
7858
8241
|
const [cmdOpen, setCmdOpen] = (0, react.useState)(false);
|
|
7859
8242
|
const [capsOpen, setCapsOpen] = (0, react.useState)(false);
|
|
8243
|
+
(0, react.useEffect)(() => {
|
|
8244
|
+
setCapsOpen(false);
|
|
8245
|
+
setCmdOpen(false);
|
|
8246
|
+
}, [confirming]);
|
|
7860
8247
|
/** Per-row "why is it not live" disclosure (installed tab). */
|
|
7861
8248
|
const [whyOpen, setWhyOpen] = (0, react.useState)(null);
|
|
7862
8249
|
/** Restore-confirm dialog (replaces window.confirm). */
|
|
@@ -7908,10 +8295,12 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
7908
8295
|
if (Array.isArray(body.groupOrder)) setGroupOrder(body.groupOrder);
|
|
7909
8296
|
if (Array.isArray(body.favorites)) setFavoriteUrls(body.favorites.filter((url) => typeof url === "string"));
|
|
7910
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"));
|
|
7911
8299
|
setInstalledBundles(Array.isArray(body.bundles) ? body.bundles.filter((name) => typeof name === "string") : []);
|
|
7912
8300
|
if (body.activation && typeof body.activation === "object") setActivations(body.activation);
|
|
7913
8301
|
const findings = body.diagnostics?.schema === "dsh-market/diagnostics/v1" && Array.isArray(body.diagnostics.findings) ? body.diagnostics.findings.filter(isHostDependencyFinding) : [];
|
|
7914
8302
|
setBrokenPlugins(isRecordOfRecords(body.brokenPlugins) ? body.brokenPlugins : {});
|
|
8303
|
+
installedReadGen.current += 1;
|
|
7915
8304
|
setHostDependencyFindings(findings);
|
|
7916
8305
|
}).catch(() => {});
|
|
7917
8306
|
fetch(api("/dsh-market/updates") + (force === true ? "?force=1" : ""), { cache: "no-store" }).then((res) => res.json()).then((body) => setUpdates(body.updates || {})).catch(() => {});
|
|
@@ -7921,6 +8310,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
7921
8310
|
(0, react.useMemo)(() => new Set(disabledNames), [disabledNames]);
|
|
7922
8311
|
const favoriteUrlSet = (0, react.useMemo)(() => new Set(favoriteUrls), [favoriteUrls]);
|
|
7923
8312
|
const blockedNameSet = (0, react.useMemo)(() => new Set(blockedNames), [blockedNames]);
|
|
8313
|
+
const updateExemptSet = (0, react.useMemo)(() => new Set(updateExemptNames), [updateExemptNames]);
|
|
7924
8314
|
/** Effective switch state: market disable list ∪ user-patch-layer disables. */
|
|
7925
8315
|
const effectiveDisabledSet = (0, react.useMemo)(() => /* @__PURE__ */ new Set([
|
|
7926
8316
|
...disabledNames,
|
|
@@ -9186,6 +9576,135 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
9186
9576
|
blockedNames,
|
|
9187
9577
|
t
|
|
9188
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]);
|
|
9189
9708
|
const clearStaleFavorites = (0, react.useCallback)(() => {
|
|
9190
9709
|
if (favoriteStale.length === 0) return;
|
|
9191
9710
|
const gen = ++favoriteOpGen.current;
|
|
@@ -9607,9 +10126,10 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
9607
10126
|
const updatableNames = Object.keys(installed).filter((name) => name !== selfName && !effectiveDisabledSet.has(name) && isPluginUpdatable(name, String(installed[name]), updates[name], updatedNames));
|
|
9608
10127
|
const batchUpdatableNames = updatableNames.filter((name) => updates[name]?.restoreRequired !== true);
|
|
9609
10128
|
const ignoredUpdateSet = (0, react.useMemo)(() => new Set(ignoredUpdateNames), [ignoredUpdateNames]);
|
|
9610
|
-
const
|
|
9611
|
-
const
|
|
9612
|
-
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));
|
|
9613
10133
|
const installedOtherCount = Object.keys(installed).filter((name) => name !== selfName).length;
|
|
9614
10134
|
const ignoreUpdateNotices = (0, react.useCallback)((names) => {
|
|
9615
10135
|
if (bootId === null || names.length === 0) return;
|
|
@@ -9624,6 +10144,19 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
9624
10144
|
return next;
|
|
9625
10145
|
});
|
|
9626
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]);
|
|
9627
10160
|
const doUpdateAll = (0, react.useCallback)(() => {
|
|
9628
10161
|
const names = reminderBatchUpdatableNames.slice();
|
|
9629
10162
|
setUpdatingAll(true);
|
|
@@ -9896,8 +10429,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
9896
10429
|
const aOn = effectiveDisabledSet.has(nameA) ? 0 : 1;
|
|
9897
10430
|
const bOn = effectiveDisabledSet.has(nameB) ? 0 : 1;
|
|
9898
10431
|
if (aOn !== bOn) return bOn - aOn;
|
|
9899
|
-
const aUp = isPluginUpdatable(nameA, String(specA), updates[nameA], updatedNames,
|
|
9900
|
-
return (isPluginUpdatable(nameB, String(specB), updates[nameB], updatedNames,
|
|
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;
|
|
9901
10434
|
});
|
|
9902
10435
|
}, [
|
|
9903
10436
|
isInstalledListActive,
|
|
@@ -9965,12 +10498,23 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
9965
10498
|
const hidden = aliases.some((alias) => blockedNameSet.has(alias));
|
|
9966
10499
|
const removing = removingName === name;
|
|
9967
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);
|
|
9968
10509
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Menu, {
|
|
9969
10510
|
open: installedMenuName === name,
|
|
9970
10511
|
onClose: () => setInstalledMenuName(null),
|
|
9971
10512
|
onSelect: (id) => {
|
|
9972
10513
|
setInstalledMenuName(null);
|
|
10514
|
+
if (id === "restore-online" && data !== null && !uninstallBusy) askRestore(name);
|
|
9973
10515
|
if (id === "block") toggleBlock(blockToggleName(aliases));
|
|
10516
|
+
if (id === "update-exempt") toggleUpdateExempt(name);
|
|
10517
|
+
if (id === "ignore-boot") ignoreUpdateNotices([name]);
|
|
9974
10518
|
if (id === "uninstall" && !uninstallBusy) setRemoveConfirm(name);
|
|
9975
10519
|
},
|
|
9976
10520
|
align: "end",
|
|
@@ -9983,10 +10527,23 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
9983
10527
|
children: "···"
|
|
9984
10528
|
}),
|
|
9985
10529
|
items: [
|
|
10530
|
+
...showRestore ? [{
|
|
10531
|
+
id: "restore-online",
|
|
10532
|
+
label: t("restoreOnline"),
|
|
10533
|
+
disabled: data === null || uninstallBusy
|
|
10534
|
+
}] : [],
|
|
9986
10535
|
{
|
|
9987
10536
|
id: "block",
|
|
9988
10537
|
label: hidden ? t("blockRemove") : t("blockAdd")
|
|
9989
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
|
+
}] : [],
|
|
9990
10547
|
{
|
|
9991
10548
|
type: "separator",
|
|
9992
10549
|
id: "uninstall-sep"
|
|
@@ -10075,45 +10632,42 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
10075
10632
|
size: 14,
|
|
10076
10633
|
className: Market_module_css_default.bannerIcon
|
|
10077
10634
|
}), " " + redLineLabel(line)]
|
|
10078
|
-
}, line)), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(
|
|
10079
|
-
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, {}),
|
|
10080
10637
|
title: t("capabilityTitle"),
|
|
10081
10638
|
open: capsOpen,
|
|
10082
|
-
expandable: true,
|
|
10083
|
-
expandOnRowClick: true,
|
|
10084
10639
|
onToggle: () => setCapsOpen((o) => !o),
|
|
10085
|
-
children: [
|
|
10086
|
-
|
|
10087
|
-
|
|
10088
|
-
|
|
10089
|
-
|
|
10090
|
-
|
|
10091
|
-
|
|
10092
|
-
|
|
10093
|
-
|
|
10094
|
-
|
|
10095
|
-
|
|
10096
|
-
|
|
10097
|
-
|
|
10098
|
-
|
|
10099
|
-
|
|
10100
|
-
|
|
10101
|
-
|
|
10102
|
-
|
|
10103
|
-
|
|
10104
|
-
|
|
10105
|
-
|
|
10106
|
-
|
|
10107
|
-
|
|
10108
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("
|
|
10109
|
-
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,
|
|
10110
10665
|
children: t("capabilityNote")
|
|
10111
|
-
}),
|
|
10112
|
-
|
|
10113
|
-
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,
|
|
10114
10668
|
children: t("capabilityScannedAt").replace("{0}", p.capabilityCheckedAt.slice(0, 10))
|
|
10115
|
-
})
|
|
10116
|
-
]
|
|
10669
|
+
})]
|
|
10670
|
+
})]
|
|
10117
10671
|
})] });
|
|
10118
10672
|
};
|
|
10119
10673
|
/**
|
|
@@ -10744,7 +11298,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
10744
11298
|
(() => {
|
|
10745
11299
|
const self = installed["dshmarket"] !== void 0 ? "dshmarket" : "dsh-market";
|
|
10746
11300
|
const status = updates[self];
|
|
10747
|
-
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, {
|
|
10748
11302
|
variant: "primary",
|
|
10749
11303
|
size: "sm",
|
|
10750
11304
|
disabled: updatingName !== null || busyUrl !== null,
|
|
@@ -11044,24 +11598,41 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
11044
11598
|
findings: hostDependencyFindings,
|
|
11045
11599
|
t
|
|
11046
11600
|
}),
|
|
11047
|
-
tab === "installed" && brokenPluginNames.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.
|
|
11601
|
+
tab === "installed" && brokenPluginNames.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11048
11602
|
className: Market_module_css_default.brokenPluginNotice,
|
|
11049
|
-
children: brokenPluginNames.map((name) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11603
|
+
children: [brokenPluginNames.map((name) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
11050
11604
|
className: Market_module_css_default.brokenPluginItem,
|
|
11051
|
-
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", {
|
|
11052
11632
|
className: Market_module_css_default.brokenPluginText,
|
|
11053
|
-
children:
|
|
11054
|
-
})
|
|
11055
|
-
|
|
11056
|
-
size: "sm",
|
|
11057
|
-
onClick: () => {
|
|
11058
|
-
setCat("all");
|
|
11059
|
-
setQ(name);
|
|
11060
|
-
setTab("discover");
|
|
11061
|
-
},
|
|
11062
|
-
children: t("brokenPluginAction")
|
|
11063
|
-
})]
|
|
11064
|
-
}, name))
|
|
11633
|
+
children: dismissBrokenError
|
|
11634
|
+
})
|
|
11635
|
+
})]
|
|
11065
11636
|
})
|
|
11066
11637
|
]
|
|
11067
11638
|
}),
|
|
@@ -12067,12 +12638,13 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
12067
12638
|
const entry = data === null ? void 0 : catalogEntryForInstalled(data.plugins, name, String(spec), repoIdentities[name], repoHints[name]);
|
|
12068
12639
|
const status = updates[name];
|
|
12069
12640
|
const generation = status?.kind === "generation" || isGenerationSpec(String(spec));
|
|
12070
|
-
const localDev =
|
|
12641
|
+
const localDev = isLocalDev(String(spec), status);
|
|
12071
12642
|
const act = activations[name];
|
|
12072
12643
|
const meta = act !== void 0 ? activationMeta(act.state, t, act.dependencyOf) : null;
|
|
12073
12644
|
const version = status && status.version ? "v" + status.version : "";
|
|
12074
12645
|
const specText = String(spec);
|
|
12075
12646
|
const specRedundant = version !== "" && /^[\^~]?\d/.test(specText);
|
|
12647
|
+
const localPath = localPathOf(specText);
|
|
12076
12648
|
const ghSpec = /^github:([A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+?)(?:#|$)/.exec(specText);
|
|
12077
12649
|
const repoUrl = entry !== void 0 ? entry.url : ghSpec !== null ? "https://github.com/" + ghSpec[1] : null;
|
|
12078
12650
|
const off = effectiveDisabledSet.has(name);
|
|
@@ -12086,74 +12658,103 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
12086
12658
|
className: Market_module_css_default.irowHead,
|
|
12087
12659
|
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
12088
12660
|
className: `${Market_module_css_default.nm} ${Market_module_css_default.irowName}`,
|
|
12089
|
-
children: [
|
|
12090
|
-
|
|
12091
|
-
|
|
12092
|
-
|
|
12093
|
-
|
|
12094
|
-
|
|
12095
|
-
|
|
12096
|
-
|
|
12097
|
-
|
|
12098
|
-
|
|
12099
|
-
|
|
12100
|
-
|
|
12101
|
-
|
|
12102
|
-
|
|
12103
|
-
|
|
12104
|
-
|
|
12105
|
-
|
|
12106
|
-
|
|
12107
|
-
className: Market_module_css_default.owner,
|
|
12108
|
-
title: version,
|
|
12109
|
-
children: version
|
|
12110
|
-
})
|
|
12111
|
-
]
|
|
12112
|
-
}), localDev && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
12113
|
-
className: Market_module_css_default.irowDevTag,
|
|
12114
|
-
title: t("linkedDev"),
|
|
12115
|
-
role: "status",
|
|
12116
|
-
children: t("linkedDev")
|
|
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)
|
|
12117
12679
|
})]
|
|
12118
12680
|
}),
|
|
12119
|
-
|
|
12120
|
-
className:
|
|
12121
|
-
|
|
12122
|
-
target: "_blank",
|
|
12123
|
-
rel: "noreferrer",
|
|
12124
|
-
children: specText
|
|
12125
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
12126
|
-
className: Market_module_css_default.spec,
|
|
12127
|
-
children: specText
|
|
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(" · ")
|
|
12128
12684
|
}),
|
|
12129
|
-
|
|
12130
|
-
className: Market_module_css_default.
|
|
12685
|
+
specRedundant ? null : localPath !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
12686
|
+
className: Market_module_css_default.irowPath,
|
|
12131
12687
|
children: [
|
|
12132
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
12133
|
-
className: Market_module_css_default.
|
|
12134
|
-
|
|
12135
|
-
maxLength: 200,
|
|
12136
|
-
autoFocus: true,
|
|
12137
|
-
placeholder: t("notePlaceholder"),
|
|
12138
|
-
onChange: (e) => setNoteDraft(e.target.value),
|
|
12139
|
-
onKeyDown: (e) => {
|
|
12140
|
-
if (e.key === "Enter") saveNote(name, noteDraft);
|
|
12141
|
-
if (e.key === "Escape") setNotingName(null);
|
|
12142
|
-
}
|
|
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 })
|
|
12143
12691
|
}),
|
|
12144
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
12145
|
-
|
|
12146
|
-
|
|
12147
|
-
|
|
12148
|
-
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)
|
|
12149
12696
|
}),
|
|
12150
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
12151
|
-
|
|
12152
|
-
|
|
12153
|
-
|
|
12154
|
-
|
|
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
|
+
})
|
|
12155
12704
|
})
|
|
12156
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
|
+
})]
|
|
12157
12758
|
}) : (() => {
|
|
12158
12759
|
const note = notes[name];
|
|
12159
12760
|
const authored = entry?.description && (entry.description[lang] || entry.description.en) || "";
|
|
@@ -12162,10 +12763,13 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
12162
12763
|
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
12163
12764
|
className: `${Market_module_css_default.desc} ${Market_module_css_default.descTight} ${Market_module_css_default.noteRow}`,
|
|
12164
12765
|
children: [
|
|
12165
|
-
shown !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(
|
|
12166
|
-
|
|
12167
|
-
|
|
12168
|
-
|
|
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),
|
|
12169
12773
|
note !== void 0 && authored !== "" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
|
|
12170
12774
|
type: "button",
|
|
12171
12775
|
className: Market_module_css_default.noteToggle,
|
|
@@ -12174,38 +12778,79 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
12174
12778
|
onClick: () => setShowTheirs((list) => theirs ? list.filter((n) => n !== name) : list.concat(name)),
|
|
12175
12779
|
children: theirs ? t("noteMine") : t("noteTheirs")
|
|
12176
12780
|
}),
|
|
12177
|
-
/* @__PURE__ */ (0, react_jsx_runtime.
|
|
12781
|
+
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
|
|
12178
12782
|
type: "button",
|
|
12179
|
-
className:
|
|
12180
|
-
title: note === void 0 ? t("noteAdd") : t("noteEdit"),
|
|
12181
|
-
"aria-label": note === void 0 ? t("noteAdd") : t("noteEdit"),
|
|
12783
|
+
className: Market_module_css_default.noteAdd,
|
|
12182
12784
|
onClick: () => {
|
|
12183
12785
|
setNoteDraft(note ?? "");
|
|
12184
12786
|
setNotingName(name);
|
|
12185
12787
|
},
|
|
12186
|
-
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")]
|
|
12187
12789
|
})
|
|
12188
12790
|
]
|
|
12189
12791
|
});
|
|
12190
12792
|
})(),
|
|
12191
|
-
|
|
12192
|
-
|
|
12193
|
-
|
|
12194
|
-
|
|
12195
|
-
|
|
12196
|
-
|
|
12197
|
-
|
|
12198
|
-
|
|
12199
|
-
|
|
12200
|
-
|
|
12201
|
-
|
|
12202
|
-
|
|
12203
|
-
|
|
12204
|
-
|
|
12205
|
-
|
|
12206
|
-
|
|
12207
|
-
|
|
12208
|
-
|
|
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
|
+
})(),
|
|
12209
12854
|
!off && act !== void 0 && meta !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
12210
12855
|
className: Market_module_css_default.act,
|
|
12211
12856
|
children: [meta.dot !== "done" && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
|
|
@@ -12344,15 +12989,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
12344
12989
|
else doUpdate(name);
|
|
12345
12990
|
},
|
|
12346
12991
|
children: status.restoreRequired === true ? t("restoreOnline") : t("update")
|
|
12347
|
-
}) : localDev ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("
|
|
12348
|
-
type: "button",
|
|
12349
|
-
className: Market_module_css_default.metaTagAction,
|
|
12350
|
-
title: `${t("restore")} — ${t("restoreOnline")}`,
|
|
12351
|
-
"aria-label": t("restore"),
|
|
12352
|
-
disabled: data === null || removingName !== null || busyUrl !== null || updatingName !== null,
|
|
12353
|
-
onClick: () => askRestore(name),
|
|
12354
|
-
children: t("restore")
|
|
12355
|
-
}) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
12992
|
+
}) : localDev ? null : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
12356
12993
|
className: Market_module_css_default.metaTag,
|
|
12357
12994
|
title: t("upToDate"),
|
|
12358
12995
|
children: t("upToDate")
|
|
@@ -12360,8 +12997,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
12360
12997
|
removingName === name && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
12361
12998
|
className: Market_module_css_default.metaTag,
|
|
12362
12999
|
children: t("uninstalling")
|
|
12363
|
-
})
|
|
12364
|
-
!missing && name !== "dsh-market" && name !== "dshmarket" && renderInstalledBlockMenu(name)
|
|
13000
|
+
})
|
|
12365
13001
|
]
|
|
12366
13002
|
})
|
|
12367
13003
|
]
|
|
@@ -12561,131 +13197,141 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
12561
13197
|
})
|
|
12562
13198
|
});
|
|
12563
13199
|
})(),
|
|
12564
|
-
confirming !== null && /* @__PURE__ */ (0, react_jsx_runtime.
|
|
13200
|
+
confirming !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
|
|
12565
13201
|
open: true,
|
|
12566
|
-
|
|
12567
|
-
|
|
12568
|
-
|
|
12569
|
-
},
|
|
13202
|
+
className: Market_module_css_default.confirmModal,
|
|
13203
|
+
contentClassName: Market_module_css_default.confirmContent,
|
|
13204
|
+
onClose: () => setConfirming(null),
|
|
12570
13205
|
title: t("confirmTitle") + " " + confirming.name + "?",
|
|
12571
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, {
|
|
12572
13207
|
variant: "ghost",
|
|
12573
|
-
onClick: () =>
|
|
12574
|
-
setConfirming(null);
|
|
12575
|
-
setCmdOpen(false);
|
|
12576
|
-
},
|
|
13208
|
+
onClick: () => setConfirming(null),
|
|
12577
13209
|
children: t("cancel")
|
|
12578
13210
|
}), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
|
|
12579
13211
|
variant: "primary",
|
|
12580
13212
|
onClick: () => doInstall(confirming),
|
|
12581
13213
|
children: t("confirmInstall")
|
|
12582
13214
|
})] }),
|
|
12583
|
-
children:
|
|
12584
|
-
|
|
12585
|
-
|
|
12586
|
-
|
|
12587
|
-
|
|
12588
|
-
|
|
12589
|
-
|
|
12590
|
-
|
|
12591
|
-
|
|
12592
|
-
|
|
12593
|
-
|
|
12594
|
-
|
|
12595
|
-
|
|
12596
|
-
|
|
12597
|
-
|
|
12598
|
-
|
|
12599
|
-
|
|
12600
|
-
|
|
12601
|
-
|
|
12602
|
-
|
|
12603
|
-
|
|
12604
|
-
|
|
12605
|
-
|
|
12606
|
-
|
|
12607
|
-
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", {
|
|
12608
13239
|
className: Market_module_css_default.star,
|
|
12609
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}`
|
|
12610
13246
|
})
|
|
12611
|
-
|
|
12612
|
-
|
|
12613
|
-
|
|
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", {
|
|
12614
13252
|
className: Market_module_css_default.tag,
|
|
12615
13253
|
children: data.categories[category] && (data.categories[category][lang] || data.categories[category].en) || category
|
|
12616
13254
|
}, category))
|
|
12617
|
-
|
|
12618
|
-
|
|
12619
|
-
|
|
12620
|
-
|
|
12621
|
-
|
|
12622
|
-
|
|
12623
|
-
|
|
12624
|
-
|
|
12625
|
-
|
|
12626
|
-
|
|
12627
|
-
|
|
12628
|
-
|
|
12629
|
-
|
|
12630
|
-
|
|
12631
|
-
|
|
12632
|
-
|
|
12633
|
-
|
|
12634
|
-
|
|
12635
|
-
|
|
12636
|
-
|
|
12637
|
-
|
|
12638
|
-
|
|
12639
|
-
|
|
12640
|
-
|
|
12641
|
-
|
|
12642
|
-
|
|
12643
|
-
|
|
12644
|
-
|
|
12645
|
-
|
|
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")
|
|
12646
13332
|
})
|
|
12647
|
-
|
|
12648
|
-
|
|
12649
|
-
className: Market_module_css_default.warnLine,
|
|
12650
|
-
children: [
|
|
12651
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconWarningOutline16, {
|
|
12652
|
-
size: 14,
|
|
12653
|
-
className: Market_module_css_default.bannerIcon
|
|
12654
|
-
}),
|
|
12655
|
-
" " + t("terminalWarn") + " ",
|
|
12656
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
|
|
12657
|
-
className: Market_module_css_default.src,
|
|
12658
|
-
href: confirming.url + "#readme",
|
|
12659
|
-
target: "_blank",
|
|
12660
|
-
rel: "noreferrer",
|
|
12661
|
-
children: t("readme")
|
|
12662
|
-
})
|
|
12663
|
-
]
|
|
12664
|
-
}),
|
|
12665
|
-
confirming.deprecated === true && (() => {
|
|
12666
|
-
const replacement = replacementOf(confirming);
|
|
12667
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
|
|
12668
|
-
className: Market_module_css_default.deprecate,
|
|
12669
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
|
|
12670
|
-
className: Market_module_css_default.depLine,
|
|
12671
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: ["⚠️ ", t("deprecatedWarn")] }), replacement !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
|
|
12672
|
-
className: Market_module_css_default.src,
|
|
12673
|
-
href: replacement.url,
|
|
12674
|
-
target: "_blank",
|
|
12675
|
-
rel: "noreferrer",
|
|
12676
|
-
children: t("replacementHint") + " " + replacement.name
|
|
12677
|
-
})]
|
|
12678
|
-
})
|
|
12679
|
-
});
|
|
12680
|
-
})(),
|
|
12681
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
|
|
12682
|
-
className: Market_module_css_default.modalNote,
|
|
12683
|
-
children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconWarningOutline16, {
|
|
12684
|
-
size: 14,
|
|
12685
|
-
className: Market_module_css_default.bannerIcon
|
|
12686
|
-
}), " " + t("confirmWarn")]
|
|
12687
|
-
})
|
|
12688
|
-
]
|
|
13333
|
+
]
|
|
13334
|
+
})
|
|
12689
13335
|
}),
|
|
12690
13336
|
recovery !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(RecoveryPanel, {
|
|
12691
13337
|
open: recoveryOpen,
|
|
@@ -13086,6 +13732,15 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
|
|
|
13086
13732
|
text: blockNotice,
|
|
13087
13733
|
onDone: blockNoticeDone
|
|
13088
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
|
+
}),
|
|
13089
13744
|
toggled !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Toast, {
|
|
13090
13745
|
text: toggled.name + " " + t(toggled.enabled ? "toastToggledOn" : "toastToggledOff"),
|
|
13091
13746
|
icon: toggled.enabled ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCheckOutline16, { size: 14 }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconWarningOutline16, { size: 14 }),
|