dshmarket 1.4.1 → 1.5.0

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
@@ -64,9 +64,23 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
64
64
  cmdDetails: "安装命令",
65
65
  catsMore: "更多分类",
66
66
  catsLess: "收起",
67
- sortHot: "最热",
68
- sortNew: "最新",
69
- sortOld: "最早",
67
+ filter: "筛选",
68
+ filterSort: "排序字段",
69
+ filterDir: "排序方向",
70
+ filterTime: "发布时间范围",
71
+ sortStars: "Star 数",
72
+ sortAdded: "发布时间",
73
+ sortDesc: "降序",
74
+ sortAsc: "升序",
75
+ sortNewest: "最新",
76
+ sortOldest: "最旧",
77
+ timeAll: "全部时间",
78
+ timeDay: "最近 1 天",
79
+ timeWeek: "最近 7 天",
80
+ timeMonth: "最近 30 天",
81
+ timeQuarter: "最近 90 天",
82
+ timeYear: "最近 1 年",
83
+ published: "发布于",
70
84
  prevPage: "上一页",
71
85
  nextPage: "下一页",
72
86
  firstPage: "首页",
@@ -82,7 +96,20 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
82
96
  progressHint: "首次安装需要下载与解析依赖,大插件可能要 1-3 分钟",
83
97
  toastReady: "已装好并已生效",
84
98
  toastTheme: "已启用。到 设置 → 插件市场 → 主题 可随时切换",
85
- gotIt: "知道了"
99
+ gotIt: "知道了",
100
+ stateLive: "已生效(热加载)",
101
+ stateRestart: "已安装,重启后生效",
102
+ stateInert: "已安装但未成为 profile 层",
103
+ stateBroken: "安装完成但校验失败",
104
+ phaseResolving: "解析依赖",
105
+ phaseDownloading: "下载中",
106
+ phaseLinking: "链接依赖",
107
+ phaseBuilding: "运行构建脚本",
108
+ cancelling: "正在取消…",
109
+ packagesDone: "已处理 {0} 个包",
110
+ updatedLive: "✓ 已更新,已生效",
111
+ partialNote: "已取消,部分变更已写入",
112
+ actWhy: "为什么未生效?"
86
113
  };
87
114
  const en = {
88
115
  nav: "Plugin Market",
@@ -139,9 +166,23 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
139
166
  cmdDetails: "Install command",
140
167
  catsMore: "More",
141
168
  catsLess: "Less",
142
- sortHot: "Top",
143
- sortNew: "New",
144
- sortOld: "Oldest",
169
+ filter: "Filter",
170
+ filterSort: "Sort field",
171
+ filterDir: "Order",
172
+ filterTime: "Released within",
173
+ sortStars: "Stars",
174
+ sortAdded: "Release date",
175
+ sortDesc: "Descending",
176
+ sortAsc: "Ascending",
177
+ sortNewest: "Newest",
178
+ sortOldest: "Oldest",
179
+ timeAll: "Any time",
180
+ timeDay: "Last day",
181
+ timeWeek: "Last 7 days",
182
+ timeMonth: "Last 30 days",
183
+ timeQuarter: "Last 90 days",
184
+ timeYear: "Last year",
185
+ published: "released",
145
186
  prevPage: "Previous",
146
187
  nextPage: "Next",
147
188
  firstPage: "First",
@@ -157,7 +198,20 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
157
198
  progressHint: "First installs download and resolve dependencies — large plugins can take 1-3 minutes",
158
199
  toastReady: "installed and live",
159
200
  toastTheme: "is now active. Switch any time in Settings → Plugin Market → Themes",
160
- gotIt: "Got it"
201
+ gotIt: "Got it",
202
+ stateLive: "Live (hot-loaded)",
203
+ stateRestart: "Installed — restart to apply",
204
+ stateInert: "Installed but not a profile-layer plugin",
205
+ stateBroken: "Installed but failed validation",
206
+ phaseResolving: "Resolving dependencies",
207
+ phaseDownloading: "Downloading",
208
+ phaseLinking: "Linking",
209
+ phaseBuilding: "Running build scripts",
210
+ cancelling: "Cancelling…",
211
+ packagesDone: "{0} packages processed",
212
+ updatedLive: "✓ Updated — live",
213
+ partialNote: "Cancelled — some changes were applied",
214
+ actWhy: "Why not live?"
161
215
  };
162
216
  //#endregion
163
217
  //#region src/client/market-data.ts
@@ -178,22 +232,40 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
178
232
  const desc = plugin.description && (plugin.description[lang] || plugin.description.en) || "";
179
233
  return /\b(tui|cli|tty|terminal)\b|终端|命令行/i.test(plugin.name + " " + desc);
180
234
  }
235
+ /** Days per TimeRange (`all` has no cutoff and is handled by the caller). */
236
+ const TIME_RANGE_DAYS = {
237
+ day: 1,
238
+ week: 7,
239
+ month: 30,
240
+ quarter: 90,
241
+ year: 365
242
+ };
243
+ /** True when `added` is a date within the last `days` days (inclusive). */
244
+ function withinDays(added, days) {
245
+ if (added === void 0 || added === "") return false;
246
+ const time = Date.parse(added);
247
+ if (Number.isNaN(time)) return false;
248
+ const age = Date.now() - time;
249
+ return age >= 0 && age <= days * 864e5;
250
+ }
181
251
  /**
182
- * The discover list: category filter, then search across name / owner /
183
- * localized description, then the selected sort. Pure — the section renders
184
- * exactly this.
252
+ * The discover list: category filter, then the published-within window, then
253
+ * search across name / owner / localized description, then the selected sort.
254
+ * Pure — the section renders exactly this.
185
255
  */
186
256
  function visiblePlugins(plugins, options) {
187
257
  const query = options.query.trim().toLowerCase();
188
258
  const list = plugins.filter((p) => {
189
259
  if (options.category !== "all" && p.category !== options.category) return false;
260
+ if (options.sinceDays !== void 0 && !withinDays(p.added, options.sinceDays)) return false;
190
261
  if (query === "") return true;
191
262
  const desc = p.description && (p.description[options.lang] || p.description.en) || "";
192
263
  return p.name.toLowerCase().includes(query) || p.owner.toLowerCase().includes(query) || desc.toLowerCase().includes(query);
193
264
  });
194
- if (options.sort === "hot") return [...list].sort((a, b) => (b.stars ?? -1) - (a.stars ?? -1));
195
- if (options.sort === "new") return [...list].sort((a, b) => String(b.added).localeCompare(String(a.added)));
196
- if (options.sort === "old") return [...list].sort((a, b) => String(a.added).localeCompare(String(b.added)));
265
+ if (options.sort === "stars-desc") return [...list].sort((a, b) => (b.stars ?? -1) - (a.stars ?? -1));
266
+ if (options.sort === "stars-asc") return [...list].sort((a, b) => (a.stars ?? -1) - (b.stars ?? -1));
267
+ if (options.sort === "added-desc") return [...list].sort((a, b) => String(b.added).localeCompare(String(a.added)));
268
+ if (options.sort === "added-asc") return [...list].sort((a, b) => String(a.added).localeCompare(String(b.added)));
197
269
  return list;
198
270
  }
199
271
  /** The themes tab listing: theme category only, most-starred first. */
@@ -320,7 +392,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
320
392
  }
321
393
  //#endregion
322
394
  //#region \0dsh-css:/home/runner/work/dsh-market/dsh-market/src/client/Market.module.css.mjs
323
- const css = ".eGUBIq_root{min-width:0;height:100%;color:var(--dsw-alias-label-primary,#1f2328);flex-direction:column;display:flex;position:relative}.eGUBIq_head{flex-direction:column;gap:12px;padding:4px 4px 12px;display:flex}.eGUBIq_title{margin:0;font-size:16px;font-weight:500;line-height:24px}.eGUBIq_sub{color:var(--dsw-alias-label-tertiary,#8b93a1);margin:0;font-size:14px;line-height:22px}.eGUBIq_searchInline{flex-shrink:0;width:200px;margin-bottom:6px}.eGUBIq_tabs{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);align-items:flex-end;gap:2px;display:flex}.eGUBIq_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}.eGUBIq_tab.eGUBIq_on{color:var(--dsw-alias-brand-primary,#4f6ef7);border-bottom-color:var(--dsw-alias-brand-primary,#4f6ef7);font-weight:600}.eGUBIq_restart{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}.eGUBIq_body{flex:1;padding:12px 4px 24px;overflow-x:hidden;overflow-y:auto}.eGUBIq_cats{z-index:5;background:var(--dsw-alias-bg-layer-2,#f7f8fa);margin:-12px -4px 2px;padding:12px 4px 4px;position:sticky;top:-13px}.eGUBIq_catsRow{align-items:flex-start;gap:8px;display:flex;position:relative}.eGUBIq_sort{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l1,#e5e7eb);border-radius:8px;flex-shrink:0;gap:2px;padding:2px;display:flex}.eGUBIq_sort button{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}.eGUBIq_sort button.eGUBIq_on{background:var(--dsw-alias-bg-layer-1,#fff);color:var(--dsw-alias-label-primary,#1f2328);font-weight:600;box-shadow:0 1px 3px #00000014}.eGUBIq_star{color:var(--dsw-alias-label-secondary,#9ca3af);font-size:11px}.eGUBIq_top{z-index:20;border:1px solid var(--dsw-alias-border-l1,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#fff);width:38px;height:38px;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;border-radius:99px;font-size:16px;position:absolute;bottom:18px;right:18px;box-shadow:0 4px 14px #0000001f}.eGUBIq_top:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.eGUBIq_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}.eGUBIq_okState{color:var(--dsw-alias-state-success-primary,#16a34a);white-space:nowrap;font-size:12px;font-weight:600}.eGUBIq_dangerBtn.eGUBIq_dangerBtn{border-color:var(--dsw-alias-state-error-primary,#dc2626);color:var(--dsw-alias-state-error-primary,#dc2626)}.eGUBIq_dangerArmed.eGUBIq_dangerArmed{background:var(--dsw-alias-state-error-primary,#dc2626);color:#fff}.eGUBIq_warnBtn.eGUBIq_warnBtn{background:var(--dsw-alias-state-warn-primary,#ea580c);color:#fff}.eGUBIq_catsWrap{flex-wrap:wrap;flex:1;align-items:center;gap:6px;min-width:0;display:flex}.eGUBIq_catsCollapsed{max-height:62px;overflow:hidden}.eGUBIq_catsToggle.eGUBIq_catsToggle{height:26px;min-height:26px;color:var(--dsw-alias-label-secondary,#6b7280);padding:0 6px}.eGUBIq_cmdDetails{margin:0}.eGUBIq_cmdSummary{cursor:pointer;width:fit-content;color:var(--dsw-alias-label-secondary,#6b7280);border-radius:6px;align-items:center;gap:6px;margin-left:-4px;padding:2px 4px;font-size:12px;font-weight:500;line-height:18px;list-style:none;display:flex}.eGUBIq_cmdSummary::-webkit-details-marker{display:none}.eGUBIq_cmdSummary:before{content:\"\";border-bottom:1.5px solid;border-right:1.5px solid;width:5px;height:5px;transition:transform .12s;transform:rotate(-45deg)translate(-1px,-1px)}.eGUBIq_cmdDetails[open]>.eGUBIq_cmdSummary:before{transform:rotate(45deg)translate(-1px,-1px)}.eGUBIq_cmdSummary:hover{color:var(--dsw-alias-label-primary,#1f2328)}.eGUBIq_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}.eGUBIq_warnLine{color:var(--dsw-alias-state-warn-primary,#b45309);margin:0;font-size:12px;font-weight:600;line-height:18px}.eGUBIq_modalNote{color:var(--dsw-alias-label-tertiary,#8b93a1);margin:12px 0 0;font-size:12px;line-height:18px}.eGUBIq_grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;display:grid}.eGUBIq_sect{color:var(--dsw-alias-label-secondary,#6b7280);margin:14px 2px 8px;font-size:12px;font-weight:600}.eGUBIq_sect:first-child{margin-top:2px}.eGUBIq_swatches{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;gap:0;height:34px;display:flex;overflow:hidden}.eGUBIq_themesGrid{margin-bottom:12px}.eGUBIq_swatches i{flex:1}.eGUBIq_card{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;flex-direction:column;gap:12px;padding:12px 14px;display:flex}.eGUBIq_row1{align-items:center;gap:10px;min-width:0;display:flex}.eGUBIq_av{color:#fff;object-fit:cover;background:var(--dsw-alias-bg-layer-2,#f3f4f6);border-radius:8px;flex-shrink:0;place-items:center;width:32px;height:32px;font-size:14px;font-weight:700;display:grid}.eGUBIq_nm{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:500;line-height:22px;overflow:hidden}.eGUBIq_owner{color:var(--dsw-alias-label-secondary,#9ca3af);font-size:11px}.eGUBIq_desc{color:var(--dsw-alias-label-tertiary,#8b93a1);min-height:36px;margin:0;font-size:12px;line-height:18px}.eGUBIq_foot{align-items:center;gap:8px;margin-top:auto;display:flex}.eGUBIq_grow{flex:1}.eGUBIq_titleRow{align-items:center;gap:10px;display:flex}.eGUBIq_descTight{min-height:0}.eGUBIq_src{color:var(--dsw-alias-label-secondary,#9ca3af);font-size:11px;text-decoration:none}.eGUBIq_src:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.eGUBIq_dot{vertical-align:2px;margin-left:5px}.eGUBIq_loading{color:var(--dsw-alias-label-secondary,#9ca3af);flex-direction:column;align-items:center;gap:12px;padding:48px;font-size:13px;display:flex}.eGUBIq_spin{border:3px solid var(--dsw-alias-border-l1,#e5e7eb);border-top-color:var(--dsw-alias-brand-primary,#4f6ef7);border-radius:99px;width:22px;height:22px;animation:.8s linear infinite eGUBIq_sp}@keyframes eGUBIq_sp{to{transform:rotate(360deg)}}.eGUBIq_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}.eGUBIq_bar{background:var(--dsw-alias-border-l1,#e5e7eb);border-radius:99px;width:100%;height:4px;overflow:hidden}.eGUBIq_barFill{background:var(--dsw-alias-brand-primary,#4f6ef7);border-radius:99px;height:100%;transition:width .6s}.eGUBIq_barWave{width:30%;animation:1.2s ease-in-out infinite eGUBIq_dshmSlide}@keyframes eGUBIq_dshmSlide{0%{margin-left:-30%}to{margin-left:100%}}.eGUBIq_irow .eGUBIq_progress{margin-top:8px}.eGUBIq_progress .eGUBIq_spin{border-width:2px;flex-shrink:0;width:14px;height:14px}.eGUBIq_progress code{text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,Menlo,monospace;font-size:11px;overflow:hidden}.eGUBIq_empty{color:var(--dsw-alias-label-secondary,#9ca3af);text-align:center;padding:32px;font-size:13px}.eGUBIq_err{color:var(--dsw-alias-state-error-primary,#dc2626);white-space:pre-wrap;word-break:break-all;margin:8px 0;font-size:12px}.eGUBIq_irow{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;align-items:center;gap:10px;margin-bottom:8px;padding:12px 14px;display:flex}.eGUBIq_irow>.eGUBIq_src,.eGUBIq_irow>.eGUBIq_owner,.eGUBIq_dangerBtn.eGUBIq_dangerBtn,.eGUBIq_warnBtn.eGUBIq_warnBtn,.eGUBIq_dangerArmed.eGUBIq_dangerArmed{white-space:nowrap;flex-shrink:0}.eGUBIq_spec{color:var(--dsw-alias-label-secondary,#9ca3af);font-family:ui-monospace,Menlo,monospace;font-size:11px}.eGUBIq_staleAction{margin-top:8px}.eGUBIq_pct{color:var(--dsw-alias-label-secondary,#6b7280);flex-shrink:0;font-size:11px;font-weight:600}.eGUBIq_cancelBtn{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#fff);color:var(--dsw-alias-label-secondary,#6b7280);font:inherit;cursor:pointer;white-space:nowrap;border-radius:6px;flex-shrink:0;padding:2px 10px;font-size:11px;line-height:16px}.eGUBIq_cancelBtn:hover{color:var(--dsw-alias-state-error-primary,#dc2626);border-color:var(--dsw-alias-state-error-primary,#dc2626)}.eGUBIq_pager{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;margin:16px 0 4px;display:flex}.eGUBIq_pagerPages{flex-wrap:wrap;flex:1;justify-content:center;align-items:center;gap:6px;min-width:0;display:flex}.eGUBIq_pagerSize{flex-shrink:0;align-items:center;gap:4px;display:flex}.eGUBIq_sizeLabel{color:var(--dsw-alias-label-secondary,#6b7280);font-size:12px}.eGUBIq_sizeBtn{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#fff);color:var(--dsw-alias-label-secondary,#6b7280);font:inherit;cursor:pointer;border-radius:6px;padding:3px 8px;font-size:12px;line-height:18px}.eGUBIq_sizeBtn:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);border-color:var(--dsw-alias-brand-primary,#4f6ef7)}.eGUBIq_sizeOn{background:var(--dsw-alias-brand-primary,#4f6ef7);border-color:var(--dsw-alias-brand-primary,#4f6ef7);color:#fff;font-weight:600}.eGUBIq_pageBtn{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#fff);color:var(--dsw-alias-label-secondary,#6b7280);font:inherit;cursor:pointer;border-radius:6px;min-width:28px;padding:4px 10px;font-size:12px;line-height:18px}.eGUBIq_pageBtn:hover:not(:disabled){color:var(--dsw-alias-brand-primary,#4f6ef7);border-color:var(--dsw-alias-brand-primary,#4f6ef7)}.eGUBIq_pageBtn:disabled{opacity:.45;cursor:default}.eGUBIq_pageOn{background:var(--dsw-alias-brand-primary,#4f6ef7);border-color:var(--dsw-alias-brand-primary,#4f6ef7);color:#fff;font-weight:600}.eGUBIq_pageEllipsis{color:var(--dsw-alias-label-secondary,#9ca3af);padding:0 2px;font-size:12px}.eGUBIq_pageInfo{color:var(--dsw-alias-label-secondary,#6b7280);white-space:nowrap;font-size:12px}";
395
+ const css = ".eGUBIq_root{min-width:0;height:100%;color:var(--dsw-alias-label-primary,#1f2328);flex-direction:column;display:flex;position:relative}.eGUBIq_head{flex-direction:column;gap:12px;padding:4px 4px 12px;display:flex}.eGUBIq_title{margin:0;font-size:16px;font-weight:500;line-height:24px}.eGUBIq_sub{color:var(--dsw-alias-label-tertiary,#8b93a1);margin:0;font-size:14px;line-height:22px}.eGUBIq_searchInline{flex-shrink:0;width:200px;margin-bottom:6px}.eGUBIq_tabs{border-bottom:1px solid var(--dsw-alias-border-l2,#e5e7eb);align-items:flex-end;gap:2px;display:flex}.eGUBIq_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}.eGUBIq_tab.eGUBIq_on{color:var(--dsw-alias-brand-primary,#4f6ef7);border-bottom-color:var(--dsw-alias-brand-primary,#4f6ef7);font-weight:600}.eGUBIq_restart{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}.eGUBIq_body{flex:1;padding:12px 4px 24px;overflow-x:hidden;overflow-y:auto}.eGUBIq_cats{z-index:5;background:var(--dsw-alias-bg-layer-2,#f7f8fa);margin:-12px -4px 2px;padding:12px 4px 4px;position:sticky;top:-13px}.eGUBIq_catsRow{align-items:flex-start;gap:8px;display:flex;position:relative}.eGUBIq_filterWrap{flex-shrink:0;position:relative}.eGUBIq_filterBtn{border:1px solid var(--dsw-alias-border-l1,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#fff);color:var(--dsw-alias-label-primary,#1f2328);font:inherit;cursor:pointer;white-space:nowrap;border-radius:8px;align-items:center;gap:5px;padding:5px 11px;font-size:12px;line-height:18px;display:flex}.eGUBIq_filterBtn:hover,.eGUBIq_filterBtnOn{color:var(--dsw-alias-brand-primary,#4f6ef7);border-color:var(--dsw-alias-brand-primary,#4f6ef7)}.eGUBIq_filterPanel{z-index:30;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;width:250px;padding:8px;display:flex;position:absolute;top:calc(100% + 6px);right:0;box-shadow:0 8px 28px #00000024}.eGUBIq_filterGroup{flex-direction:column;gap:2px;display:flex}.eGUBIq_filterTitle{color:var(--dsw-alias-label-secondary,#6b7280);padding:4px 8px 2px;font-size:11px;font-weight:600}.eGUBIq_filterOption{cursor:pointer;color:var(--dsw-alias-label-primary,#1f2328);border-radius:6px;align-items:center;gap:8px;padding:5px 8px;font-size:12px;line-height:18px;display:flex}.eGUBIq_filterOption:hover{background:var(--dsw-alias-bg-layer-2,#f3f4f6)}.eGUBIq_filterOption input{margin:0}.eGUBIq_star{color:var(--dsw-alias-label-secondary,#9ca3af);font-size:11px}.eGUBIq_top{z-index:20;border:1px solid var(--dsw-alias-border-l1,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#fff);width:38px;height:38px;color:var(--dsw-alias-label-secondary,#6b7280);cursor:pointer;border-radius:99px;font-size:16px;position:absolute;bottom:18px;right:18px;box-shadow:0 4px 14px #0000001f}.eGUBIq_top:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.eGUBIq_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}.eGUBIq_okState{color:var(--dsw-alias-state-success-primary,#16a34a);white-space:nowrap;font-size:12px;font-weight:600}.eGUBIq_dangerBtn.eGUBIq_dangerBtn{border-color:var(--dsw-alias-state-error-primary,#dc2626);color:var(--dsw-alias-state-error-primary,#dc2626)}.eGUBIq_dangerArmed.eGUBIq_dangerArmed{background:var(--dsw-alias-state-error-primary,#dc2626);color:#fff}.eGUBIq_warnBtn.eGUBIq_warnBtn{background:var(--dsw-alias-state-warn-primary,#ea580c);color:#fff}.eGUBIq_catsWrap{flex-wrap:wrap;flex:1;align-items:center;gap:6px;min-width:0;display:flex}.eGUBIq_catsCollapsed{max-height:62px;overflow:hidden}.eGUBIq_catsToggle.eGUBIq_catsToggle{height:26px;min-height:26px;color:var(--dsw-alias-label-secondary,#6b7280);padding:0 6px}.eGUBIq_cmdDetails{margin:0}.eGUBIq_cmdSummary{cursor:pointer;width:fit-content;color:var(--dsw-alias-label-secondary,#6b7280);border-radius:6px;align-items:center;gap:6px;margin-left:-4px;padding:2px 4px;font-size:12px;font-weight:500;line-height:18px;list-style:none;display:flex}.eGUBIq_cmdSummary::-webkit-details-marker{display:none}.eGUBIq_cmdSummary:before{content:\"\";border-bottom:1.5px solid;border-right:1.5px solid;width:5px;height:5px;transition:transform .12s;transform:rotate(-45deg)translate(-1px,-1px)}.eGUBIq_cmdDetails[open]>.eGUBIq_cmdSummary:before{transform:rotate(45deg)translate(-1px,-1px)}.eGUBIq_cmdSummary:hover{color:var(--dsw-alias-label-primary,#1f2328)}.eGUBIq_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}.eGUBIq_warnLine{color:var(--dsw-alias-state-warn-primary,#b45309);margin:0;font-size:12px;font-weight:600;line-height:18px}.eGUBIq_modalNote{color:var(--dsw-alias-label-tertiary,#8b93a1);margin:12px 0 0;font-size:12px;line-height:18px}.eGUBIq_grid{grid-template-columns:repeat(auto-fill,minmax(280px,1fr));gap:12px;display:grid}.eGUBIq_sect{color:var(--dsw-alias-label-secondary,#6b7280);margin:14px 2px 8px;font-size:12px;font-weight:600}.eGUBIq_sect:first-child{margin-top:2px}.eGUBIq_swatches{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:8px;gap:0;height:34px;display:flex;overflow:hidden}.eGUBIq_themesGrid{margin-bottom:12px}.eGUBIq_swatches i{flex:1}.eGUBIq_card{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;flex-direction:column;gap:12px;padding:12px 14px;display:flex}.eGUBIq_row1{align-items:center;gap:10px;min-width:0;display:flex}.eGUBIq_av{color:#fff;object-fit:cover;background:var(--dsw-alias-bg-layer-2,#f3f4f6);border-radius:8px;flex-shrink:0;place-items:center;width:32px;height:32px;font-size:14px;font-weight:700;display:grid}.eGUBIq_nm{text-overflow:ellipsis;white-space:nowrap;font-size:14px;font-weight:500;line-height:22px;overflow:hidden}.eGUBIq_owner{color:var(--dsw-alias-label-secondary,#9ca3af);font-size:11px}.eGUBIq_desc{color:var(--dsw-alias-label-tertiary,#8b93a1);min-height:36px;margin:0;font-size:12px;line-height:18px}.eGUBIq_foot{align-items:center;gap:8px;margin-top:auto;display:flex}.eGUBIq_grow{flex:1}.eGUBIq_titleRow{align-items:center;gap:10px;display:flex}.eGUBIq_descTight{min-height:0}.eGUBIq_src{color:var(--dsw-alias-label-secondary,#9ca3af);font-size:11px;text-decoration:none}.eGUBIq_src:hover{color:var(--dsw-alias-brand-primary,#4f6ef7)}.eGUBIq_dot{vertical-align:2px;margin-left:5px}.eGUBIq_act{flex-wrap:wrap;align-items:center;gap:6px;margin-top:6px;font-size:11px;display:flex}.eGUBIq_actLive{color:var(--dsw-alias-state-success-primary,#16a34a);align-items:center;gap:4px;font-weight:600;display:inline-flex}.eGUBIq_actWarn{color:var(--dsw-alias-state-warn-primary,#b45309);align-items:center;gap:4px;font-weight:600;display:inline-flex}.eGUBIq_actBroken{color:var(--dsw-alias-state-error-primary,#dc2626);align-items:center;gap:4px;font-weight:600;display:inline-flex}.eGUBIq_actWhy{margin:0}.eGUBIq_actWhy summary{cursor:pointer;color:var(--dsw-alias-label-secondary,#6b7280);font-size:11px}.eGUBIq_loading{color:var(--dsw-alias-label-secondary,#9ca3af);flex-direction:column;align-items:center;gap:12px;padding:48px;font-size:13px;display:flex}.eGUBIq_spin{border:3px solid var(--dsw-alias-border-l1,#e5e7eb);border-top-color:var(--dsw-alias-brand-primary,#4f6ef7);border-radius:99px;width:22px;height:22px;animation:.8s linear infinite eGUBIq_sp}@keyframes eGUBIq_sp{to{transform:rotate(360deg)}}.eGUBIq_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}.eGUBIq_bar{background:var(--dsw-alias-border-l1,#e5e7eb);border-radius:99px;width:100%;height:4px;overflow:hidden}.eGUBIq_barFill{background:var(--dsw-alias-brand-primary,#4f6ef7);border-radius:99px;height:100%;transition:width .6s}.eGUBIq_barWave{width:30%;animation:1.2s ease-in-out infinite eGUBIq_dshmSlide}@keyframes eGUBIq_dshmSlide{0%{margin-left:-30%}to{margin-left:100%}}.eGUBIq_irow .eGUBIq_progress{margin-top:8px}.eGUBIq_progress .eGUBIq_spin{border-width:2px;flex-shrink:0;width:14px;height:14px}.eGUBIq_progress code{text-overflow:ellipsis;white-space:nowrap;font-family:ui-monospace,Menlo,monospace;font-size:11px;overflow:hidden}.eGUBIq_empty{color:var(--dsw-alias-label-secondary,#9ca3af);text-align:center;padding:32px;font-size:13px}.eGUBIq_err{color:var(--dsw-alias-state-error-primary,#dc2626);white-space:pre-wrap;word-break:break-all;margin:8px 0;font-size:12px}.eGUBIq_irow{background:var(--dsw-alias-bg-layer-1,#fff);border:1px solid var(--dsw-alias-border-l2,#e5e7eb);border-radius:12px;align-items:center;gap:10px;margin-bottom:8px;padding:12px 14px;display:flex}.eGUBIq_irow>.eGUBIq_src,.eGUBIq_irow>.eGUBIq_owner,.eGUBIq_dangerBtn.eGUBIq_dangerBtn,.eGUBIq_warnBtn.eGUBIq_warnBtn,.eGUBIq_dangerArmed.eGUBIq_dangerArmed{white-space:nowrap;flex-shrink:0}.eGUBIq_spec{color:var(--dsw-alias-label-secondary,#9ca3af);font-family:ui-monospace,Menlo,monospace;font-size:11px}.eGUBIq_staleAction{margin-top:8px}.eGUBIq_pct{color:var(--dsw-alias-label-secondary,#6b7280);flex-shrink:0;font-size:11px;font-weight:600}.eGUBIq_cancelBtn{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#fff);color:var(--dsw-alias-label-secondary,#6b7280);font:inherit;cursor:pointer;white-space:nowrap;border-radius:6px;flex-shrink:0;padding:2px 10px;font-size:11px;line-height:16px}.eGUBIq_cancelBtn:hover{color:var(--dsw-alias-state-error-primary,#dc2626);border-color:var(--dsw-alias-state-error-primary,#dc2626)}.eGUBIq_pager{flex-wrap:wrap;justify-content:space-between;align-items:center;gap:12px;margin:16px 0 4px;display:flex}.eGUBIq_pagerPages{flex-wrap:wrap;flex:1;justify-content:center;align-items:center;gap:6px;min-width:0;display:flex}.eGUBIq_pagerSize{flex-shrink:0;align-items:center;gap:4px;display:flex}.eGUBIq_sizeLabel{color:var(--dsw-alias-label-secondary,#6b7280);font-size:12px}.eGUBIq_sizeBtn{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#fff);color:var(--dsw-alias-label-secondary,#6b7280);font:inherit;cursor:pointer;border-radius:6px;padding:3px 8px;font-size:12px;line-height:18px}.eGUBIq_sizeBtn:hover{color:var(--dsw-alias-brand-primary,#4f6ef7);border-color:var(--dsw-alias-brand-primary,#4f6ef7)}.eGUBIq_sizeOn{background:var(--dsw-alias-brand-primary,#4f6ef7);border-color:var(--dsw-alias-brand-primary,#4f6ef7);color:#fff;font-weight:600}.eGUBIq_pageBtn{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#fff);color:var(--dsw-alias-label-secondary,#6b7280);font:inherit;cursor:pointer;border-radius:6px;min-width:28px;padding:4px 10px;font-size:12px;line-height:18px}.eGUBIq_pageBtn:hover:not(:disabled){color:var(--dsw-alias-brand-primary,#4f6ef7);border-color:var(--dsw-alias-brand-primary,#4f6ef7)}.eGUBIq_pageBtn:disabled{opacity:.45;cursor:default}.eGUBIq_pageOn{background:var(--dsw-alias-brand-primary,#4f6ef7);border-color:var(--dsw-alias-brand-primary,#4f6ef7);color:#fff;font-weight:600}.eGUBIq_pageEllipsis{color:var(--dsw-alias-label-secondary,#9ca3af);padding:0 2px;font-size:12px}.eGUBIq_pageInfo{color:var(--dsw-alias-label-secondary,#6b7280);white-space:nowrap;font-size:12px}";
324
396
  const tagId = "dshmarket/Market.module.css";
325
397
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
326
398
  const tag = document.createElement("style");
@@ -330,75 +402,86 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
330
402
  document.head.appendChild(tag);
331
403
  }
332
404
  var Market_module_css_default = {
405
+ "spec": "eGUBIq_spec",
406
+ "spin": "eGUBIq_spin",
407
+ "tag": "eGUBIq_tag",
408
+ "src": "eGUBIq_src",
409
+ "okState": "eGUBIq_okState",
410
+ "cats": "eGUBIq_cats",
333
411
  "staleAction": "eGUBIq_staleAction",
334
- "sizeOn": "eGUBIq_sizeOn",
335
- "av": "eGUBIq_av",
336
- "dangerBtn": "eGUBIq_dangerBtn",
337
- "head": "eGUBIq_head",
338
- "bar": "eGUBIq_bar",
339
- "cmdDetails": "eGUBIq_cmdDetails",
412
+ "filterTitle": "eGUBIq_filterTitle",
413
+ "filterBtn": "eGUBIq_filterBtn",
414
+ "owner": "eGUBIq_owner",
340
415
  "sect": "eGUBIq_sect",
341
- "cmd": "eGUBIq_cmd",
342
- "barWave": "eGUBIq_barWave",
343
- "foot": "eGUBIq_foot",
344
- "spec": "eGUBIq_spec",
345
- "empty": "eGUBIq_empty",
346
- "pageEllipsis": "eGUBIq_pageEllipsis",
347
- "title": "eGUBIq_title",
348
- "star": "eGUBIq_star",
349
- "searchInline": "eGUBIq_searchInline",
350
- "warnLine": "eGUBIq_warnLine",
416
+ "err": "eGUBIq_err",
417
+ "catsToggle": "eGUBIq_catsToggle",
418
+ "card": "eGUBIq_card",
419
+ "catsWrap": "eGUBIq_catsWrap",
351
420
  "warnBtn": "eGUBIq_warnBtn",
421
+ "root": "eGUBIq_root",
352
422
  "catsRow": "eGUBIq_catsRow",
353
- "dangerArmed": "eGUBIq_dangerArmed",
354
- "cats": "eGUBIq_cats",
355
- "grow": "eGUBIq_grow",
356
423
  "dot": "eGUBIq_dot",
357
- "nm": "eGUBIq_nm",
358
- "top": "eGUBIq_top",
424
+ "swatches": "eGUBIq_swatches",
425
+ "loading": "eGUBIq_loading",
426
+ "act": "eGUBIq_act",
427
+ "catsCollapsed": "eGUBIq_catsCollapsed",
428
+ "actWarn": "eGUBIq_actWarn",
429
+ "body": "eGUBIq_body",
359
430
  "cmdSummary": "eGUBIq_cmdSummary",
431
+ "barWave": "eGUBIq_barWave",
432
+ "star": "eGUBIq_star",
433
+ "dangerBtn": "eGUBIq_dangerBtn",
434
+ "title": "eGUBIq_title",
435
+ "actWhy": "eGUBIq_actWhy",
360
436
  "progress": "eGUBIq_progress",
361
- "spin": "eGUBIq_spin",
362
- "pagerSize": "eGUBIq_pagerSize",
363
- "src": "eGUBIq_src",
364
- "err": "eGUBIq_err",
365
- "row1": "eGUBIq_row1",
366
- "desc": "eGUBIq_desc",
367
- "pageBtn": "eGUBIq_pageBtn",
368
- "pct": "eGUBIq_pct",
437
+ "on": "eGUBIq_on",
438
+ "restart": "eGUBIq_restart",
439
+ "dangerArmed": "eGUBIq_dangerArmed",
440
+ "foot": "eGUBIq_foot",
369
441
  "grid": "eGUBIq_grid",
370
- "catsToggle": "eGUBIq_catsToggle",
371
- "sizeLabel": "eGUBIq_sizeLabel",
372
- "catsCollapsed": "eGUBIq_catsCollapsed",
373
- "cancelBtn": "eGUBIq_cancelBtn",
374
- "pagerPages": "eGUBIq_pagerPages",
375
- "barFill": "eGUBIq_barFill",
376
- "sp": "eGUBIq_sp",
377
- "tag": "eGUBIq_tag",
378
442
  "tabs": "eGUBIq_tabs",
379
- "tab": "eGUBIq_tab",
443
+ "empty": "eGUBIq_empty",
444
+ "warnLine": "eGUBIq_warnLine",
445
+ "sp": "eGUBIq_sp",
380
446
  "dshmSlide": "eGUBIq_dshmSlide",
381
- "themesGrid": "eGUBIq_themesGrid",
447
+ "sizeBtn": "eGUBIq_sizeBtn",
448
+ "pageEllipsis": "eGUBIq_pageEllipsis",
382
449
  "pageInfo": "eGUBIq_pageInfo",
383
- "body": "eGUBIq_body",
384
- "pageOn": "eGUBIq_pageOn",
385
- "pager": "eGUBIq_pager",
386
- "root": "eGUBIq_root",
387
- "on": "eGUBIq_on",
388
- "okState": "eGUBIq_okState",
389
- "catsWrap": "eGUBIq_catsWrap",
450
+ "pct": "eGUBIq_pct",
451
+ "desc": "eGUBIq_desc",
452
+ "pageBtn": "eGUBIq_pageBtn",
453
+ "filterWrap": "eGUBIq_filterWrap",
454
+ "sizeLabel": "eGUBIq_sizeLabel",
455
+ "cmd": "eGUBIq_cmd",
456
+ "actLive": "eGUBIq_actLive",
457
+ "themesGrid": "eGUBIq_themesGrid",
458
+ "pagerSize": "eGUBIq_pagerSize",
459
+ "irow": "eGUBIq_irow",
460
+ "filterPanel": "eGUBIq_filterPanel",
461
+ "filterGroup": "eGUBIq_filterGroup",
462
+ "titleRow": "eGUBIq_titleRow",
463
+ "searchInline": "eGUBIq_searchInline",
464
+ "barFill": "eGUBIq_barFill",
465
+ "cmdDetails": "eGUBIq_cmdDetails",
466
+ "filterOption": "eGUBIq_filterOption",
467
+ "nm": "eGUBIq_nm",
468
+ "pagerPages": "eGUBIq_pagerPages",
390
469
  "modalNote": "eGUBIq_modalNote",
391
- "sort": "eGUBIq_sort",
392
- "swatches": "eGUBIq_swatches",
393
- "card": "eGUBIq_card",
470
+ "grow": "eGUBIq_grow",
471
+ "pager": "eGUBIq_pager",
472
+ "row1": "eGUBIq_row1",
473
+ "head": "eGUBIq_head",
394
474
  "descTight": "eGUBIq_descTight",
395
- "loading": "eGUBIq_loading",
396
- "irow": "eGUBIq_irow",
397
- "restart": "eGUBIq_restart",
475
+ "tab": "eGUBIq_tab",
476
+ "bar": "eGUBIq_bar",
398
477
  "sub": "eGUBIq_sub",
399
- "owner": "eGUBIq_owner",
400
- "sizeBtn": "eGUBIq_sizeBtn",
401
- "titleRow": "eGUBIq_titleRow"
478
+ "av": "eGUBIq_av",
479
+ "actBroken": "eGUBIq_actBroken",
480
+ "top": "eGUBIq_top",
481
+ "pageOn": "eGUBIq_pageOn",
482
+ "sizeOn": "eGUBIq_sizeOn",
483
+ "cancelBtn": "eGUBIq_cancelBtn",
484
+ "filterBtnOn": "eGUBIq_filterBtnOn"
402
485
  };
403
486
  //#endregion
404
487
  //#region src/client/MarketSection.tsx
@@ -407,6 +490,35 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
407
490
  * /dsh-market/* host routes, with install/update/uninstall flows and the
408
491
  * pending-restart bookkeeping in sessionStorage.
409
492
  */
493
+ /** The state label + dot for one activation result (P0-2). */
494
+ function activationMeta(state, t) {
495
+ if (state === "live") return {
496
+ label: t("stateLive"),
497
+ dot: "done"
498
+ };
499
+ if (state === "restart") return {
500
+ label: t("stateRestart"),
501
+ dot: "warning"
502
+ };
503
+ if (state === "inert") return {
504
+ label: t("stateInert"),
505
+ dot: "warning"
506
+ };
507
+ if (state === "broken") return {
508
+ label: t("stateBroken"),
509
+ dot: "error"
510
+ };
511
+ return {
512
+ label: "—",
513
+ dot: "warning"
514
+ };
515
+ }
516
+ function phaseLabel(phase, t) {
517
+ if (phase === "resolving") return t("phaseResolving");
518
+ if (phase === "downloading") return t("phaseDownloading");
519
+ if (phase === "linking") return t("phaseLinking");
520
+ return t("phaseBuilding");
521
+ }
410
522
  /**
411
523
  * Card avatar: the plugin owner's GitHub avatar (no API, browser-cached),
412
524
  * falling back to the initial-letter tile when it can't load.
@@ -465,17 +577,43 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
465
577
  96
466
578
  ];
467
579
  const DEFAULT_PAGE_SIZE = 24;
468
- /** Sort orders offered by the Discover toolbar, in display order. */
469
- const SORT_KEYS = [
470
- "hot",
471
- "new",
472
- "old"
580
+ /** Sort field choices in the filter panel. */
581
+ const SORT_FIELD_OPTIONS = [{
582
+ key: "stars",
583
+ label: "sortStars"
584
+ }, {
585
+ key: "added",
586
+ label: "sortAdded"
587
+ }];
588
+ /** Sort direction choices in the filter panel (labels depend on the field). */
589
+ const SORT_DIR_OPTIONS = ["desc", "asc"];
590
+ /** Published-within choices in the filter panel. */
591
+ const TIME_OPTIONS = [
592
+ {
593
+ key: "all",
594
+ label: "timeAll"
595
+ },
596
+ {
597
+ key: "day",
598
+ label: "timeDay"
599
+ },
600
+ {
601
+ key: "week",
602
+ label: "timeWeek"
603
+ },
604
+ {
605
+ key: "month",
606
+ label: "timeMonth"
607
+ },
608
+ {
609
+ key: "quarter",
610
+ label: "timeQuarter"
611
+ },
612
+ {
613
+ key: "year",
614
+ label: "timeYear"
615
+ }
473
616
  ];
474
- const SORT_LABELS = {
475
- hot: "sortHot",
476
- new: "sortNew",
477
- old: "sortOld"
478
- };
479
617
  function MarketSection(props) {
480
618
  const t = props.t;
481
619
  const localeSnap = (0, react.useSyncExternalStore)((cb) => props.locale.subscribe(cb), () => props.locale.getSnapshot());
@@ -518,6 +656,15 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
518
656
  const [hotUrls, setHotUrls] = (0, react.useState)([]);
519
657
  const [hotNames, setHotNames] = (0, react.useState)([]);
520
658
  const [progressLine, setProgressLine] = (0, react.useState)(null);
659
+ /** Per-package activation states from /dsh-market/installed + operations. */
660
+ const [activations, setActivations] = (0, react.useState)({});
661
+ /** Structured progress from pnpm ndjson (P1-6). */
662
+ const [progressPhase, setProgressPhase] = (0, react.useState)(null);
663
+ const [progressCurrent, setProgressCurrent] = (0, react.useState)(null);
664
+ const [progressDone, setProgressDone] = (0, react.useState)(0);
665
+ const [cancelling, setCancelling] = (0, react.useState)(false);
666
+ /** Non-live activation results from the last operation, shown as a banner. */
667
+ const [activationWarnings, setActivationWarnings] = (0, react.useState)([]);
521
668
  const [removeArmed, setRemoveArmed] = (0, react.useState)(null);
522
669
  const [removingName, setRemovingName] = (0, react.useState)(null);
523
670
  const [removedCount, setRemovedCount] = (0, react.useState)(0);
@@ -530,7 +677,13 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
530
677
  const [restarting, setRestarting] = (0, react.useState)(false);
531
678
  const [showTop, setShowTop] = (0, react.useState)(false);
532
679
  const bodyRef = (0, react.useRef)(null);
533
- const [sort, setSort] = (0, react.useState)("hot");
680
+ const [sortField, setSortField] = (0, react.useState)("stars");
681
+ const [sortDir, setSortDir] = (0, react.useState)("desc");
682
+ /** Direction labels adapt to the field: stars → asc/desc, added → oldest/newest. */
683
+ const sortDirLabel = (dir) => sortField === "added" ? dir === "desc" ? "sortNewest" : "sortOldest" : dir === "desc" ? "sortDesc" : "sortAsc";
684
+ const [timeRange, setTimeRange] = (0, react.useState)("all");
685
+ const [filterOpen, setFilterOpen] = (0, react.useState)(false);
686
+ const filterWrapRef = (0, react.useRef)(null);
534
687
  const [catsOpen, setCatsOpen] = (0, react.useState)(false);
535
688
  const [visibleCats, setVisibleCats] = (0, react.useState)(null);
536
689
  const catsWrapRef = (0, react.useRef)(null);
@@ -538,6 +691,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
538
691
  fetch("/dsh-market/installed", { cache: "no-store" }).then((res) => res.json()).then((body) => {
539
692
  setInstalled(body.installed || {});
540
693
  setSkins(body.live || []);
694
+ if (body.activation && typeof body.activation === "object") setActivations(body.activation);
541
695
  }).catch(() => {});
542
696
  fetch("/dsh-market/updates" + (force === true ? "?force=1" : ""), { cache: "no-store" }).then((res) => res.json()).then((body) => setUpdates(body.updates || {})).catch(() => {});
543
697
  }, []);
@@ -605,20 +759,40 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
605
759
  (0, react.useEffect)(() => {
606
760
  if (busyUrl === null && updatingName === null) {
607
761
  setProgressLine(null);
762
+ setProgressPhase(null);
763
+ setProgressCurrent(null);
764
+ setProgressDone(0);
765
+ setCancelling(false);
608
766
  return;
609
767
  }
610
768
  const timer = setInterval(() => {
611
769
  fetch("/dsh-market/status", { cache: "no-store" }).then((res) => res.json()).then((status) => {
612
770
  if (status.active) {
613
- setProgressLine((status.lastLine || "…") + " (" + status.seconds + "s)");
614
- const m = /resolved (\d+), reused (\d+), downloaded (\d+), added (\d+)/.exec(status.lastLine || "");
615
- if (m !== null && Number(m[1]) > 0) {
616
- const done = Number(m[2]) + Number(m[3]) + Number(m[4]);
617
- setProgressPct(Math.max(4, Math.min(96, Math.round(done / Number(m[1]) * 100))));
771
+ setCancelling(status.cancelling === true);
772
+ if (status.phase !== null && status.phase !== void 0) {
773
+ setProgressPhase(status.phase);
774
+ setProgressCurrent(status.currentPackage ?? null);
775
+ setProgressDone(status.done ?? 0);
776
+ setProgressLine(null);
777
+ if (typeof status.size === "number" && status.size > 0 && typeof status.downloaded === "number") setProgressPct(Math.max(4, Math.min(96, Math.round(status.downloaded / status.size * 100))));
778
+ } else {
779
+ setProgressLine((status.lastLine || "…") + " (" + status.seconds + "s)");
780
+ setProgressPhase(null);
781
+ setProgressCurrent(null);
782
+ setProgressDone(0);
783
+ const m = /resolved (\d+), reused (\d+), downloaded (\d+), added (\d+)/.exec(status.lastLine || "");
784
+ if (m !== null && Number(m[1]) > 0) {
785
+ const done = Number(m[2]) + Number(m[3]) + Number(m[4]);
786
+ setProgressPct(Math.max(4, Math.min(96, Math.round(done / Number(m[1]) * 100))));
787
+ }
618
788
  }
619
789
  } else {
620
790
  setProgressLine(null);
621
791
  setProgressPct(null);
792
+ setProgressPhase(null);
793
+ setProgressCurrent(null);
794
+ setProgressDone(0);
795
+ setCancelling(false);
622
796
  setInstalled(status.installed || {});
623
797
  if (readSession("dshm-pending") !== null && busyUrl !== null) {
624
798
  if (data !== null && data.plugins.some((p) => p.url === busyUrl && isInstalled(p, status.installed || {}))) {
@@ -646,21 +820,34 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
646
820
  category: cat,
647
821
  query: q,
648
822
  lang,
649
- sort
823
+ sort: `${sortField}-${sortDir}`,
824
+ sinceDays: timeRange === "all" ? void 0 : TIME_RANGE_DAYS[timeRange]
650
825
  }), [
651
826
  data,
652
827
  q,
653
828
  cat,
654
829
  lang,
655
- sort
830
+ sortField,
831
+ sortDir,
832
+ timeRange
656
833
  ]);
657
834
  (0, react.useEffect)(() => {
658
835
  setPage(1);
659
836
  }, [
660
837
  q,
661
838
  cat,
662
- sort
839
+ sortField,
840
+ sortDir,
841
+ timeRange
663
842
  ]);
843
+ (0, react.useEffect)(() => {
844
+ if (!filterOpen) return;
845
+ const onDown = (event) => {
846
+ if (filterWrapRef.current !== null && !filterWrapRef.current.contains(event.target)) setFilterOpen(false);
847
+ };
848
+ document.addEventListener("mousedown", onDown);
849
+ return () => document.removeEventListener("mousedown", onDown);
850
+ }, [filterOpen]);
664
851
  const totalPages = Math.max(1, Math.ceil(plugins.length / pageSize));
665
852
  const currentPage = Math.min(page, totalPages);
666
853
  const pagePlugins = plugins.slice((currentPage - 1) * pageSize, currentPage * pageSize);
@@ -687,6 +874,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
687
874
  setBuildsSkipped(null);
688
875
  setConfirming(null);
689
876
  setInstallError(null);
877
+ setActivationWarnings([]);
690
878
  setBusyUrl(plugin.url);
691
879
  sessionStorage.setItem("dshm-pending", JSON.stringify({ url: plugin.url }));
692
880
  fetch("/dsh-market/install", {
@@ -706,10 +894,22 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
706
894
  }
707
895
  if (body.cancelled === true) {
708
896
  refreshInstalled();
897
+ if (body.partial === true) setInstallError(t("partialNote"));
709
898
  return;
710
899
  }
711
900
  if (status === 200 && body.ok) {
712
901
  sessionStorage.setItem("dshm-tab", "installed");
902
+ if (body.activation && typeof body.activation === "object") {
903
+ setActivations((prev) => ({
904
+ ...prev,
905
+ ...body.activation
906
+ }));
907
+ const warns = Object.entries(body.activation).filter(([, info]) => info.state !== "live" && info.state !== "missing").map(([name, info]) => ({
908
+ name,
909
+ info
910
+ }));
911
+ setActivationWarnings(warns);
912
+ }
713
913
  if (body.hot) {
714
914
  setHotUrls((urls) => urls.includes(plugin.url) ? urls : urls.concat(plugin.url));
715
915
  setHotNames((names) => names.includes(plugin.name) ? names : names.concat(plugin.name));
@@ -794,6 +994,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
794
994
  }, []);
795
995
  const doUpdate = (0, react.useCallback)((name, force = false) => {
796
996
  setInstallError(null);
997
+ setActivationWarnings([]);
797
998
  setStaleName(null);
798
999
  setUpdatingName(name);
799
1000
  return fetch("/dsh-market/update", {
@@ -809,10 +1010,15 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
809
1010
  }))).then(({ status, body }) => {
810
1011
  if (body.cancelled === true) {
811
1012
  refreshInstalled();
1013
+ if (body.partial === true) setInstallError(t("partialNote"));
812
1014
  return;
813
1015
  }
814
1016
  if (status === 200 && body.ok) {
815
1017
  setUpdatedNames((names) => names.concat(name));
1018
+ if (body.activation && typeof body.activation === "object") setActivations((prev) => ({
1019
+ ...prev,
1020
+ ...body.activation
1021
+ }));
816
1022
  refreshInstalled();
817
1023
  } else {
818
1024
  if (status === 409) {
@@ -847,6 +1053,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
847
1053
  const doUninstall = (0, react.useCallback)((name) => {
848
1054
  setRemoveArmed(null);
849
1055
  setInstallError(null);
1056
+ setActivationWarnings([]);
850
1057
  setRemovingName(name);
851
1058
  return fetch("/dsh-market/uninstall", {
852
1059
  method: "POST",
@@ -860,6 +1067,11 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
860
1067
  if (!body.hot) setRemovedCount((n) => n + 1);
861
1068
  refreshInstalled();
862
1069
  } else {
1070
+ if (body.cancelled === true) {
1071
+ refreshInstalled();
1072
+ if (body.partial === true) setInstallError(t("partialNote"));
1073
+ return;
1074
+ }
863
1075
  const text = (v) => typeof v === "string" ? v : v && typeof v.text === "string" ? v.text : v == null ? "" : JSON.stringify(v);
864
1076
  setInstallError((text(body.error) || text(body.stderr) || "error").trim().slice(-600));
865
1077
  }
@@ -882,6 +1094,9 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
882
1094
  }, [updatableNames, doUpdate]);
883
1095
  const pendingRestart = doneUrls.length + updatedNames.length + removedCount;
884
1096
  const hasUpdates = Object.keys(installed).some((name) => !updatedNames.includes(name) && updates[name] && updates[name].updateAvailable);
1097
+ /** Live status line: structured phase, or the human-line fallback. */
1098
+ const phasePart = progressPhase != null ? phaseLabel(progressPhase, t) + (progressCurrent !== null ? " · " + progressCurrent : "") + (progressDone > 0 ? " · " + t("packagesDone").replace("{0}", String(progressDone)) : "") : progressLine || t("progressHint");
1099
+ const progressText = cancelling ? t("cancelling") + " · " + phasePart : phasePart;
885
1100
  const themePlugins$1 = data === null ? [] : themePlugins(data.plugins);
886
1101
  const pluginCard = (p) => {
887
1102
  const desc = p.description && (p.description[lang] || p.description.en) || "";
@@ -905,10 +1120,17 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
905
1120
  children: p.name
906
1121
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
907
1122
  className: Market_module_css_default.owner,
908
- children: [p.owner, typeof p.stars === "number" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
909
- className: Market_module_css_default.star,
910
- children: " · " + p.stars
911
- })]
1123
+ children: [
1124
+ p.owner,
1125
+ typeof p.stars === "number" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1126
+ className: Market_module_css_default.star,
1127
+ children: " · ★ " + p.stars
1128
+ }),
1129
+ p.added && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1130
+ className: Market_module_css_default.star,
1131
+ children: " · " + t("published") + " " + p.added
1132
+ })
1133
+ ]
912
1134
  })]
913
1135
  }),
914
1136
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: Market_module_css_default.grow }),
@@ -963,7 +1185,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
963
1185
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: Market_module_css_default.spin }),
964
1186
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("code", {
965
1187
  className: Market_module_css_default.grow,
966
- children: progressLine || t("progressHint")
1188
+ children: progressText
967
1189
  }),
968
1190
  progressPct !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
969
1191
  className: Market_module_css_default.pct,
@@ -972,8 +1194,9 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
972
1194
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
973
1195
  type: "button",
974
1196
  className: Market_module_css_default.cancelBtn,
1197
+ disabled: cancelling,
975
1198
  onClick: doCancel,
976
- children: t("cancelOp")
1199
+ children: cancelling ? t("cancelling") : t("cancelOp")
977
1200
  }),
978
1201
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
979
1202
  className: Market_module_css_default.bar,
@@ -1011,10 +1234,17 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
1011
1234
  children: p.name
1012
1235
  }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1013
1236
  className: Market_module_css_default.owner,
1014
- children: [p.owner, typeof p.stars === "number" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1015
- className: Market_module_css_default.star,
1016
- children: " · " + p.stars
1017
- })]
1237
+ children: [
1238
+ p.owner,
1239
+ typeof p.stars === "number" && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1240
+ className: Market_module_css_default.star,
1241
+ children: " · ★ " + p.stars
1242
+ }),
1243
+ p.added && /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1244
+ className: Market_module_css_default.star,
1245
+ children: " · " + t("published") + " " + p.added
1246
+ })
1247
+ ]
1018
1248
  })]
1019
1249
  }),
1020
1250
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: Market_module_css_default.grow }),
@@ -1284,6 +1514,25 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
1284
1514
  children: restarting ? t("restarting") : t("restartNow")
1285
1515
  })
1286
1516
  ]
1517
+ }),
1518
+ activationWarnings.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1519
+ className: Market_module_css_default.restart,
1520
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: "⚠️" }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1521
+ className: Market_module_css_default.grow,
1522
+ children: activationWarnings.map(({ name, info }) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", { children: [
1523
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)("b", { children: name }),
1524
+ " — ",
1525
+ activationMeta(info.state, t).label,
1526
+ info.reasons.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
1527
+ className: Market_module_css_default.spec,
1528
+ children: [
1529
+ "(",
1530
+ info.reasons.join(" / "),
1531
+ ")"
1532
+ ]
1533
+ })
1534
+ ] }, name))
1535
+ })]
1287
1536
  })
1288
1537
  ]
1289
1538
  }),
@@ -1368,13 +1617,64 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
1368
1617
  })
1369
1618
  ] });
1370
1619
  })()
1371
- }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1372
- className: Market_module_css_default.sort,
1373
- children: SORT_KEYS.map((key) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1374
- className: sort === key ? Market_module_css_default.on : "",
1375
- onClick: () => setSort(key),
1376
- children: t(SORT_LABELS[key])
1377
- }, key))
1620
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1621
+ className: Market_module_css_default.filterWrap,
1622
+ ref: filterWrapRef,
1623
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("button", {
1624
+ type: "button",
1625
+ className: filterOpen ? `${Market_module_css_default.filterBtn} ${Market_module_css_default.filterBtnOn}` : Market_module_css_default.filterBtn,
1626
+ onClick: () => setFilterOpen((o) => !o),
1627
+ children: [t("filter"), filterOpen ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronUpOutline14, { size: 14 }) : /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.IconChevronDownOutline14, { size: 14 })]
1628
+ }), filterOpen && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1629
+ className: Market_module_css_default.filterPanel,
1630
+ children: [
1631
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1632
+ className: Market_module_css_default.filterGroup,
1633
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1634
+ className: Market_module_css_default.filterTitle,
1635
+ children: t("filterSort")
1636
+ }), SORT_FIELD_OPTIONS.map((opt) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
1637
+ className: Market_module_css_default.filterOption,
1638
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1639
+ type: "radio",
1640
+ name: "dshm-sort-field",
1641
+ checked: sortField === opt.key,
1642
+ onChange: () => setSortField(opt.key)
1643
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t(opt.label) })]
1644
+ }, opt.key))]
1645
+ }),
1646
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1647
+ className: Market_module_css_default.filterGroup,
1648
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1649
+ className: Market_module_css_default.filterTitle,
1650
+ children: t("filterDir")
1651
+ }), SORT_DIR_OPTIONS.map((dir) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
1652
+ className: Market_module_css_default.filterOption,
1653
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1654
+ type: "radio",
1655
+ name: "dshm-sort-dir",
1656
+ checked: sortDir === dir,
1657
+ onChange: () => setSortDir(dir)
1658
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t(sortDirLabel(dir)) })]
1659
+ }, dir))]
1660
+ }),
1661
+ /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1662
+ className: Market_module_css_default.filterGroup,
1663
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1664
+ className: Market_module_css_default.filterTitle,
1665
+ children: t("filterTime")
1666
+ }), TIME_OPTIONS.map((opt) => /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("label", {
1667
+ className: Market_module_css_default.filterOption,
1668
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("input", {
1669
+ type: "radio",
1670
+ name: "dshm-time",
1671
+ checked: timeRange === opt.key,
1672
+ onChange: () => setTimeRange(opt.key)
1673
+ }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { children: t(opt.label) })]
1674
+ }, opt.key))]
1675
+ })
1676
+ ]
1677
+ })]
1378
1678
  })]
1379
1679
  })
1380
1680
  }), plugins.length === 0 ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
@@ -1465,6 +1765,8 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
1465
1765
  }) : Object.entries(installed).map(([name, spec]) => {
1466
1766
  const entry = data === null ? void 0 : entryForDep(data.plugins, name, String(spec));
1467
1767
  const status = updates[name];
1768
+ const act = activations[name];
1769
+ const meta = act !== void 0 ? activationMeta(act.state, t) : null;
1468
1770
  const version = status && status.version ? "v" + status.version : "";
1469
1771
  const specText = String(spec);
1470
1772
  const ghSpec = /^github:([A-Za-z0-9_.-]+\/[A-Za-z0-9_.-]+?)(?:#|$)/.exec(specText);
@@ -1497,13 +1799,29 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
1497
1799
  className: `${Market_module_css_default.desc} ${Market_module_css_default.descTight}`,
1498
1800
  children: entry.description && (entry.description[lang] || entry.description.en) || ""
1499
1801
  }),
1802
+ act !== void 0 && meta !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1803
+ className: Market_module_css_default.act,
1804
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
1805
+ className: meta.dot === "done" ? Market_module_css_default.actLive : meta.dot === "error" ? Market_module_css_default.actBroken : Market_module_css_default.actWarn,
1806
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.StateDot, {
1807
+ state: meta.dot,
1808
+ size: 7
1809
+ }), meta.label]
1810
+ }), act.state !== "live" && act.reasons.length > 0 && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("details", {
1811
+ className: Market_module_css_default.actWhy,
1812
+ children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("summary", { children: t("actWhy") }), /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1813
+ className: Market_module_css_default.spec,
1814
+ children: act.reasons.join(" / ")
1815
+ })]
1816
+ })]
1817
+ }),
1500
1818
  updatingName === name && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("div", {
1501
1819
  className: Market_module_css_default.progress,
1502
1820
  children: [
1503
1821
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", { className: Market_module_css_default.spin }),
1504
1822
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("code", {
1505
1823
  className: Market_module_css_default.grow,
1506
- children: progressLine || t("progressHint")
1824
+ children: progressText
1507
1825
  }),
1508
1826
  progressPct !== null && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("span", {
1509
1827
  className: Market_module_css_default.pct,
@@ -1512,8 +1830,9 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
1512
1830
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("button", {
1513
1831
  type: "button",
1514
1832
  className: Market_module_css_default.cancelBtn,
1833
+ disabled: cancelling,
1515
1834
  onClick: doCancel,
1516
- children: t("cancelOp")
1835
+ children: cancelling ? t("cancelling") : t("cancelOp")
1517
1836
  }),
1518
1837
  /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
1519
1838
  className: Market_module_css_default.bar,
@@ -1536,7 +1855,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
1536
1855
  }),
1537
1856
  updatedNames.includes(name) ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
1538
1857
  className: Market_module_css_default.okState,
1539
- children: t("updated")
1858
+ children: act?.state === "live" ? t("updatedLive") : t("updated")
1540
1859
  }) : updatingName === name ? /* @__PURE__ */ (0, react_jsx_runtime.jsx)(_deepseek_ai_dsh_client_ui_primitives.Button, {
1541
1860
  variant: "primary",
1542
1861
  size: "sm",