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 CHANGED
@@ -67,6 +67,11 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
67
67
  "IconCodeOutlineRegular",
68
68
  "IconCodeOutline16"
69
69
  ],
70
+ [
71
+ "IconCopyOutline16",
72
+ "IconCopyOutlineRegular",
73
+ "IconCopyOutline16"
74
+ ],
70
75
  [
71
76
  "IconCordisPluginOutline14",
72
77
  "IconCordisPluginOutlineRegular",
@@ -176,7 +181,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
176
181
  const IconChevronLeftOutline14 = pickIcon("IconChevronLeftOutlineRegular", "IconChevronLeftOutline14");
177
182
  const IconChevronRightOutline14 = pickIcon("IconChevronRightOutlineRegular", "IconChevronRightOutline14");
178
183
  const IconChevronUpOutline14 = pickIcon("IconChevronUpOutlineRegular", "IconChevronUpOutline14");
179
- const IconCodeOutline16 = pickIcon("IconCodeOutlineRegular", "IconCodeOutline16");
184
+ pickIcon("IconCodeOutlineRegular", "IconCodeOutline16");
185
+ const IconCopyOutline16 = pickIcon("IconCopyOutlineRegular", "IconCopyOutline16");
180
186
  const IconCordisPluginOutline14 = pickIcon("IconCordisPluginOutlineRegular", "IconCordisPluginOutline14");
181
187
  const IconDownloadOutline16 = pickIcon("IconDownloadOutlineRegular", "IconDownloadOutline16");
182
188
  const IconFolderOpen16 = pickIcon("IconFolderOpenRegular", "IconFolderOpen16");
@@ -245,6 +251,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
245
251
  submitPlugin: "申请收录插件 ↗",
246
252
  descExpand: "展开",
247
253
  descCollapse: "收起",
254
+ descMore: "展开全部",
248
255
  searchPh: "搜索插件,例如:通知、终端、记忆…",
249
256
  searchFavoritesPh: "搜索收藏…",
250
257
  clearSearch: "清除搜索",
@@ -310,7 +317,12 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
310
317
  restartHintSupervised: "本进程是 {0} 服务的主进程,重启交给它负责——市场自己重启会连带杀掉 cgroup 里的接管进程,服务将起不来。请执行 systemctl restart <你的 unit>。确认你的配置能承受市场自行重启(如 KillMode=process),可在本插件配置里手动打开「允许重启」。",
311
318
  restartHintDebugged: "当前 dsh 进程正被调试器连接。请从 IDE 或终端停止该进程后重新启动,市场不能从界面里结束正在调试的 dsh。",
312
319
  confirmTitle: "安装",
313
- confirmWarn: "插件是社区第三方代码。安装即表示你信任该来源;构建脚本默认不会运行。",
320
+ confirmWarn: "社区第三方插件,构建脚本默认不运行。",
321
+ installCaution: "安装前请注意",
322
+ terminalCautionTitle: "可能不适用于网页版",
323
+ terminalCautionBody: "这是终端插件,网页版里可能用不了。",
324
+ terminalCautionStartup: "也可能让 DeepSeek Harness 起不来。",
325
+ terminalCautionLink: "先看使用说明 ↗",
314
326
  cancel: "取消",
315
327
  empty: "没有匹配的插件",
316
328
  installedEmpty: "尚未安装社区插件,可前往「发现」页浏览",
@@ -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 &lt;your unit&gt;. 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: "Plugins are third-party community code. Installing means you trust the source. Build scripts do not run by default.",
1001
+ confirmWarn: "Community third-party plugin. Build scripts do not run by default.",
1002
+ installCaution: "Before you install",
1003
+ terminalCautionTitle: "May not work in the web app",
1004
+ terminalCautionBody: "This is a terminal plugin. It may not work in the web version.",
1005
+ terminalCautionStartup: "It can stop DeepSeek Harness from starting.",
1006
+ terminalCautionLink: "Read its instructions first ↗",
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: "Ignore until restart",
1190
- ignoreAllUpdateNotices: "Ignore all until restart",
1191
- updateNoticeIgnored: "Reminder ignored for this boot",
1219
+ ignoreUpdateNotice: "Don't remind until restart",
1220
+ ignoreAllUpdateNotices: "Don't remind any until restart",
1221
+ updateNoticeIgnored: "No reminders until restart",
1222
+ updateExemptAdd: "Never remind about updates",
1223
+ updateExemptRemove: "Resume update reminders",
1224
+ updateExemptMark: "Reminders off",
1225
+ updateExemptRestore: "Remind again",
1226
+ updateExemptHint: "New versions stay listed. Only the reminder stops.",
1227
+ updateExemptOn: "Update reminders are off. New versions stay listed.",
1228
+ updateExemptOff: "Update reminders are back on.",
1229
+ updateExemptFailed: "Couldn't save that. Try again.",
1230
+ updateAvailableShort: "New version",
1231
+ copyPath: "Copy path",
1232
+ pathCopied: "Copied",
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
- "irowDevTag": "nUhMVa_irowDevTag",
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
- "noteAction": "nUhMVa_noteAction",
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
- setCanExpand(el.scrollHeight > el.clientHeight + 1);
6944
- }, [text]);
6945
- return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
6946
- ref,
6947
- className: expanded ? Market_module_css_default.desc : `${Market_module_css_default.desc} ${Market_module_css_default.descClamp}`,
6948
- children: text
6949
- }), canExpand && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
6950
- type: "button",
6951
- className: Market_module_css_default.descToggle,
6952
- "aria-label": expanded ? t("descCollapse") : t("descExpand"),
6953
- onClick: () => setExpanded((e) => !e),
6954
- children: expanded ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronUpOutline14, { size: 14 }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconChevronDownOutline14, { size: 14 })
6955
- })] });
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 reminderUpdatableNames = updatableNames.filter((name) => !ignoredUpdateSet.has(name) && !installedBlocked(name));
9611
- const reminderBatchUpdatableNames = batchUpdatableNames.filter((name) => !ignoredUpdateSet.has(name) && !installedBlocked(name));
9612
- const reminderUpdateNames = [...updates[selfName]?.updateAvailable === true && !updatedNames.includes(selfName) ? [selfName] : [], ...updatableNames].filter((name) => !ignoredUpdateSet.has(name) && !installedBlocked(name));
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, ignoredUpdateSet) ? 1 : 0;
9900
- return (isPluginUpdatable(nameB, String(specB), updates[nameB], updatedNames, ignoredUpdateSet) ? 1 : 0) - aUp;
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)(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
10079
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconQuestionOutline14, { size: 16 }),
10635
+ }, line)), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(ConfirmFold, {
10636
+ icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConfirmCapabilityIcon, {}),
10080
10637
  title: t("capabilityTitle"),
10081
10638
  open: capsOpen,
10082
- expandable: true,
10083
- expandOnRowClick: true,
10084
10639
  onToggle: () => setCapsOpen((o) => !o),
10085
- children: [
10086
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
10087
- className: Market_module_css_default.caps,
10088
- children: [p.capabilities === void 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10089
- className: Market_module_css_default.capMuted,
10090
- "data-state": "unchecked",
10091
- children: t("capabilityUnchecked")
10092
- }) : p.capabilities.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10093
- className: Market_module_css_default.capMuted,
10094
- "data-state": "none",
10095
- children: t("capabilityNone")
10096
- }) : p.capabilities.map((name) => HostTag !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(HostTag, {
10097
- tone: "outline",
10098
- className: Market_module_css_default.capChip,
10099
- children: capabilityLabel(name)
10100
- }, name) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10101
- className: Market_module_css_default.capChip,
10102
- children: capabilityLabel(name)
10103
- }, name)), redLines.filter((line) => !redLineIsUrgent(line)).map((line) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
10104
- className: Market_module_css_default.capFact,
10105
- children: redLineLabel(line)
10106
- }, line))]
10107
- }),
10108
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
10109
- className: Market_module_css_default.capCaveat,
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
- typeof p.capabilityCheckedAt === "string" && p.capabilityCheckedAt.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("p", {
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) && !ignoredUpdateSet.has(self) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
11301
+ return status && status.updateAvailable && !updatedNames.includes(self) && !quietUpdateSet.has(self) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
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.jsx)("div", {
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: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11605
+ children: [
11606
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
11607
+ className: Market_module_css_default.brokenPluginText,
11608
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: t("brokenPluginTitle").replace("{0}", name) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("brokenPluginBody") })]
11609
+ }),
11610
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
11611
+ variant: "outline",
11612
+ size: "sm",
11613
+ onClick: () => {
11614
+ setCat("all");
11615
+ setQ(name);
11616
+ setTab("discover");
11617
+ },
11618
+ children: t("brokenPluginAction")
11619
+ }),
11620
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
11621
+ variant: "ghost",
11622
+ size: "sm",
11623
+ disabled: dismissingBroken.has(name),
11624
+ onClick: () => dismissBrokenPlugin(name),
11625
+ children: t("brokenPluginDismiss")
11626
+ })
11627
+ ]
11628
+ }, name)), dismissBrokenError !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
11629
+ className: Market_module_css_default.brokenPluginItem,
11630
+ role: "alert",
11631
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
11052
11632
  className: Market_module_css_default.brokenPluginText,
11053
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: t("brokenPluginTitle").replace("{0}", name) }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t("brokenPluginBody") })]
11054
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
11055
- variant: "outline",
11056
- size: "sm",
11057
- onClick: () => {
11058
- setCat("all");
11059
- setQ(name);
11060
- setTab("discover");
11061
- },
11062
- children: t("brokenPluginAction")
11063
- })]
11064
- }, name))
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 = !generation && (/^(?:link|file):/i.test(String(spec)) || status?.kind === "linked");
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
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12091
- className: Market_module_css_default.irowNameText,
12092
- children: repoUrl !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
12093
- className: Market_module_css_default.nameLink,
12094
- href: repoUrl + "#readme",
12095
- target: "_blank",
12096
- rel: "noreferrer",
12097
- title: name,
12098
- "aria-label": `${name} — ${t("readme")}`,
12099
- children: name
12100
- }) : name
12101
- }),
12102
- entry?.deprecated === true && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12103
- className: Market_module_css_default.depBadge,
12104
- children: t("deprecatedBadge")
12105
- }),
12106
- version && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12107
- className: Market_module_css_default.owner,
12108
- title: version,
12109
- children: version
12110
- })
12111
- ]
12112
- }), localDev && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12113
- className: Market_module_css_default.irowDevTag,
12114
- title: t("linkedDev"),
12115
- role: "status",
12116
- children: t("linkedDev")
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
- specRedundant ? null : repoUrl !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
12120
- className: `${Market_module_css_default.spec} ${Market_module_css_default.src}`,
12121
- href: repoUrl,
12122
- target: "_blank",
12123
- rel: "noreferrer",
12124
- children: specText
12125
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12126
- className: Market_module_css_default.spec,
12127
- children: specText
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
- notingName === name ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12130
- className: Market_module_css_default.noteEdit,
12685
+ specRedundant ? null : localPath !== null ? /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12686
+ className: Market_module_css_default.irowPath,
12131
12687
  children: [
12132
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Input, {
12133
- className: Market_module_css_default.noteInput,
12134
- value: noteDraft,
12135
- maxLength: 200,
12136
- autoFocus: true,
12137
- placeholder: t("notePlaceholder"),
12138
- onChange: (e) => setNoteDraft(e.target.value),
12139
- onKeyDown: (e) => {
12140
- if (e.key === "Enter") saveNote(name, noteDraft);
12141
- if (e.key === "Escape") setNotingName(null);
12142
- }
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)(_deepseek_ai_dsh_client_ui_primitives.Button, {
12145
- variant: "outline",
12146
- size: "sm",
12147
- onClick: () => saveNote(name, noteDraft),
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)(_deepseek_ai_dsh_client_ui_primitives.Button, {
12151
- variant: "ghost",
12152
- size: "sm",
12153
- onClick: () => setNotingName(null),
12154
- children: t("cancel")
12697
+ isAbsoluteLocalPath(localPath) && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12698
+ className: Market_module_css_default.irowPathCopy,
12699
+ children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ConfirmCopyButton, {
12700
+ text: localPath,
12701
+ label: t("copyPath"),
12702
+ copiedLabel: t("pathCopied")
12703
+ })
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)("span", {
12166
- className: note !== void 0 && !theirs ? Market_module_css_default.noteMine : void 0,
12167
- children: shown
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.jsx)("button", {
12781
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
12178
12782
  type: "button",
12179
- className: `${Market_module_css_default.noteToggle} ${Market_module_css_default.noteAction}`,
12180
- title: note === void 0 ? t("noteAdd") : t("noteEdit"),
12181
- "aria-label": note === void 0 ? t("noteAdd") : t("noteEdit"),
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
- isPluginUpdatable(name, String(spec), status, []) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12192
- className: Market_module_css_default.noteRow,
12193
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12194
- type: "button",
12195
- className: Market_module_css_default.notesLink,
12196
- onClick: () => openNotes(name, status.current ?? null, status.latest ?? null, repoUrl),
12197
- children: `▸ ${t("notesLink")}`
12198
- }), bootId !== null && (ignoredUpdateSet.has(name) ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12199
- className: Market_module_css_default.metaInline,
12200
- children: t("updateNoticeIgnored")
12201
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
12202
- type: "button",
12203
- className: Market_module_css_default.noteToggle,
12204
- "aria-label": `${t("ignoreUpdateNotice")} ${name}`,
12205
- onClick: () => ignoreUpdateNotices([name]),
12206
- children: t("ignoreUpdateNotice")
12207
- }))]
12208
- }),
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)("button", {
12348
- type: "button",
12349
- className: Market_module_css_default.metaTagAction,
12350
- title: `${t("restore")} — ${t("restoreOnline")}`,
12351
- "aria-label": t("restore"),
12352
- disabled: data === null || removingName !== null || busyUrl !== null || updatingName !== null,
12353
- onClick: () => askRestore(name),
12354
- children: t("restore")
12355
- }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
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.jsxs)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
13200
+ confirming !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Modal, {
12565
13201
  open: true,
12566
- onClose: () => {
12567
- setConfirming(null);
12568
- setCmdOpen(false);
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
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12585
- className: Market_module_css_default.byline,
12586
- children: [
12587
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(OwnerAvatar, {
12588
- name: confirming.name,
12589
- owner: confirming.owner || ""
12590
- }),
12591
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
12592
- className: Market_module_css_default.owner,
12593
- title: confirming.owner,
12594
- children: confirming.owner
12595
- }),
12596
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CatalogVersionMark, {
12597
- version: confirming.version,
12598
- tip: catalogVersionTip
12599
- }),
12600
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(DownloadCount, {
12601
- plugin: confirming,
12602
- t
12603
- }),
12604
- typeof confirming.stars === "number" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Tooltip, {
12605
- label: String(confirming.stars),
12606
- side: "top",
12607
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
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
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: Market_module_css_default.grow }),
12613
- pluginCategories(confirming).map((category) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
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
- confirming.added && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12620
- className: Market_module_css_default.metaInline,
12621
- children: t("published") + " " + confirming.added
12622
- }),
12623
- downloadStatsText(confirming, t) !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12624
- className: Market_module_css_default.metaInline,
12625
- children: downloadStatsText(confirming, t)
12626
- }),
12627
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(CardDesc, {
12628
- text: confirming.description && (confirming.description[lang] || confirming.description.en) || "",
12629
- t
12630
- }),
12631
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ScreenshotStrip, {
12632
- plugin: confirming,
12633
- onOpen: openLightbox
12634
- }),
12635
- capabilityDetail(confirming),
12636
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.DisclosureRow, {
12637
- icon: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconCodeOutline16, { size: 16 }),
12638
- title: t("cmdDetails"),
12639
- open: cmdOpen,
12640
- expandable: true,
12641
- expandOnRowClick: true,
12642
- onToggle: () => setCmdOpen((o) => !o),
12643
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12644
- className: Market_module_css_default.cmd,
12645
- children: confirming.install
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
- looksTerminal(confirming, lang) && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
12649
- className: Market_module_css_default.warnLine,
12650
- children: [
12651
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconWarningOutline16, {
12652
- size: 14,
12653
- className: Market_module_css_default.bannerIcon
12654
- }),
12655
- " " + t("terminalWarn") + " ",
12656
- /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
12657
- className: Market_module_css_default.src,
12658
- href: confirming.url + "#readme",
12659
- target: "_blank",
12660
- rel: "noreferrer",
12661
- children: t("readme")
12662
- })
12663
- ]
12664
- }),
12665
- confirming.deprecated === true && (() => {
12666
- const replacement = replacementOf(confirming);
12667
- return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
12668
- className: Market_module_css_default.deprecate,
12669
- children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
12670
- className: Market_module_css_default.depLine,
12671
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", { children: ["⚠️ ", t("deprecatedWarn")] }), replacement !== void 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("a", {
12672
- className: Market_module_css_default.src,
12673
- href: replacement.url,
12674
- target: "_blank",
12675
- rel: "noreferrer",
12676
- children: t("replacementHint") + " " + replacement.name
12677
- })]
12678
- })
12679
- });
12680
- })(),
12681
- /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("p", {
12682
- className: Market_module_css_default.modalNote,
12683
- children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(IconWarningOutline16, {
12684
- size: 14,
12685
- className: Market_module_css_default.bannerIcon
12686
- }), " " + t("confirmWarn")]
12687
- })
12688
- ]
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 }),