dshmarket 1.7.0 → 1.8.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
@@ -454,6 +454,97 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
454
454
  pick(["--dsw-alias-label-primary"]) || (dark ? "#e5e7eb" : "#1f2328")
455
455
  ];
456
456
  }
457
+ /**
458
+ * Image hosts screenshots may load from (#61) — GitHub's own hosting only.
459
+ * Any other host is dropped BEFORE an <img> is created: a screenshot URL is
460
+ * a request carrying the user's IP, so registry data and README content are
461
+ * both treated as untrusted here, matching the upstream build gate.
462
+ */
463
+ const SCREENSHOT_HOSTS = /* @__PURE__ */ new Set([
464
+ "raw.githubusercontent.com",
465
+ "user-images.githubusercontent.com",
466
+ "camo.githubusercontent.com",
467
+ "github.com"
468
+ ]);
469
+ const MAX_SCREENSHOTS = 6;
470
+ /** Keep only https URLs on allowlisted image hosts; SVG dropped (logos/badges). */
471
+ function safeScreenshots(urls) {
472
+ if (!Array.isArray(urls)) return [];
473
+ const safe = [];
474
+ for (const value of urls) {
475
+ if (typeof value !== "string") continue;
476
+ let parsed = null;
477
+ try {
478
+ parsed = new URL(value);
479
+ } catch {
480
+ continue;
481
+ }
482
+ if (parsed.protocol !== "https:" || !SCREENSHOT_HOSTS.has(parsed.hostname)) continue;
483
+ if (/\.svg$/i.test(parsed.pathname)) continue;
484
+ if (!safe.includes(value)) safe.push(value);
485
+ if (safe.length >= MAX_SCREENSHOTS) break;
486
+ }
487
+ return safe;
488
+ }
489
+ /**
490
+ * Image URLs extracted from a repo README, in document order — the fallback
491
+ * when an entry has no curated screenshots (#61). Markdown and <img> forms;
492
+ * relative paths resolve against the README's directory on
493
+ * raw.githubusercontent.com; badges fall out naturally (shields.io etc. are
494
+ * not allowlisted) and SVG is skipped as logo/badge noise.
495
+ */
496
+ function extractReadmeImages(markdown, owner, repo, subpath) {
497
+ const base = `https://raw.githubusercontent.com/${owner}/${repo}/HEAD/${subpath === null ? "" : subpath + "/"}`;
498
+ const found = [];
499
+ const push = (raw) => {
500
+ const src = raw.trim().replace(/^<|>$/g, "");
501
+ if (src === "" || src.startsWith("data:")) return;
502
+ let absolute;
503
+ if (/^https?:\/\//i.test(src)) absolute = src;
504
+ else if (src.startsWith("/")) absolute = `https://raw.githubusercontent.com/${owner}/${repo}/HEAD${src}`;
505
+ else try {
506
+ absolute = new URL(src, base).href;
507
+ } catch {
508
+ return;
509
+ }
510
+ found.push(absolute);
511
+ };
512
+ for (const m of markdown.matchAll(/!\[[^\]]*\]\(\s*([^)\s]+)(?:\s+"[^"]*")?\s*\)|<img[^>]*\ssrc=["']([^"']+)["']/gi)) push(m[1] ?? m[2]);
513
+ return safeScreenshots(found);
514
+ }
515
+ const readmeShotsCache = /* @__PURE__ */ new Map();
516
+ /**
517
+ * Screenshots for a plugin: the registry's curated list when present,
518
+ * otherwise lazily extracted from the repo README. Only ever called AFTER
519
+ * the user opens the detail dialog — browsing the list must make zero
520
+ * external requests. Failures resolve to [] (silent degradation).
521
+ */
522
+ function pluginScreenshots(plugin) {
523
+ const curated = safeScreenshots(plugin.screenshots);
524
+ if (curated.length > 0) return Promise.resolve(curated);
525
+ const m = /^https:\/\/github\.com\/([^/]+)\/([^/]+?)(?:\/tree\/[^/]+\/(.+?))?\/?$/.exec(plugin.url);
526
+ if (m === null) return Promise.resolve([]);
527
+ const [, owner, repo, subpath = null] = m;
528
+ const cacheKey = plugin.url;
529
+ const cached = readmeShotsCache.get(cacheKey);
530
+ if (cached !== void 0) return cached;
531
+ const fetchReadme = async (path) => {
532
+ try {
533
+ const res = await fetch(`https://raw.githubusercontent.com/${owner}/${repo}/HEAD/${path === null ? "" : path + "/"}README.md`);
534
+ return res.ok ? await res.text() : null;
535
+ } catch {
536
+ return null;
537
+ }
538
+ };
539
+ const task = (async () => {
540
+ const sub = subpath === null ? null : await fetchReadme(subpath);
541
+ if (sub !== null) return extractReadmeImages(sub, owner, repo, subpath);
542
+ const root = await fetchReadme(null);
543
+ return root === null ? [] : extractReadmeImages(root, owner, repo, null);
544
+ })().catch(() => []);
545
+ readmeShotsCache.set(cacheKey, task);
546
+ return task;
547
+ }
457
548
  //#endregion
458
549
  //#region src/client/InstallToast.tsx
459
550
  /**
@@ -482,7 +573,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
482
573
  }
483
574
  //#endregion
484
575
  //#region \0dsh-css:/home/runner/work/dsh-market/dsh-market/src/client/Market.module.css.mjs
485
- 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_irowMissing{filter:grayscale();opacity:.5}.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}.eGUBIq_backupGrid{grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px;display:grid}.eGUBIq_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}.eGUBIq_backupCard h3{margin:0;font-size:14px}.eGUBIq_backupCard p{color:var(--dsw-alias-label-secondary,#6b7280);margin:0;font-size:12px;line-height:18px}.eGUBIq_backupActions{flex-wrap:wrap;gap:8px;display:flex}.eGUBIq_backupButton{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);color:var(--dsw-alias-label-primary,#1f2328);cursor:pointer;border-radius:6px;align-items:center;padding:4px 10px;font-size:12px;line-height:18px;text-decoration:none;display:inline-flex;position:relative}.eGUBIq_backupButton[aria-disabled=true]{opacity:.5;pointer-events:none}.eGUBIq_backupButton input{opacity:0;width:1px;height:1px;position:absolute}.eGUBIq_backupPrimary{background:var(--dsw-alias-brand-primary,#4f6ef7);border-color:var(--dsw-alias-brand-primary,#4f6ef7);color:#fff}.eGUBIq_backupInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#fff);width:100%;color:var(--dsw-alias-label-primary,#1f2328);font:inherit;border-radius:8px;padding:7px 9px;font-size:12px}.eGUBIq_backupCheck{cursor:pointer;align-items:center;gap:6px;font-size:12px;display:flex}.eGUBIq_backupWarn{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-state-warn-primary,#b45309)!important}.eGUBIq_backupMessage{color:var(--dsw-alias-label-secondary,#6b7280);grid-column:1/-1;font-size:12px}";
576
+ 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_shots{-webkit-overflow-scrolling:touch;scrollbar-width:thin;gap:8px;margin:0 0 8px;padding:2px 0 6px;display:flex;overflow-x:auto}.eGUBIq_shot{object-fit:cover;border:1px solid var(--dsw-alias-border-default,#e5e7eb);background:var(--dsw-alias-bg-layer-2,#f3f4f6);border-radius:8px;flex:none;max-width:260px;height:150px}.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_irowMissing{filter:grayscale();opacity:.5}.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}.eGUBIq_backupGrid{grid-template-columns:repeat(auto-fit,minmax(280px,1fr));gap:12px;display:grid}.eGUBIq_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}.eGUBIq_backupCard h3{margin:0;font-size:14px}.eGUBIq_backupCard p{color:var(--dsw-alias-label-secondary,#6b7280);margin:0;font-size:12px;line-height:18px}.eGUBIq_backupActions{flex-wrap:wrap;gap:8px;display:flex}.eGUBIq_backupButton{border:1px solid var(--dsw-alias-border-l2,#e5e7eb);color:var(--dsw-alias-label-primary,#1f2328);cursor:pointer;border-radius:6px;align-items:center;padding:4px 10px;font-size:12px;line-height:18px;text-decoration:none;display:inline-flex;position:relative}.eGUBIq_backupButton[aria-disabled=true]{opacity:.5;pointer-events:none}.eGUBIq_backupButton input{opacity:0;width:1px;height:1px;position:absolute}.eGUBIq_backupPrimary{background:var(--dsw-alias-brand-primary,#4f6ef7);border-color:var(--dsw-alias-brand-primary,#4f6ef7);color:#fff}.eGUBIq_backupInput{box-sizing:border-box;border:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-bg-layer-1,#fff);width:100%;color:var(--dsw-alias-label-primary,#1f2328);font:inherit;border-radius:8px;padding:7px 9px;font-size:12px}.eGUBIq_backupCheck{cursor:pointer;align-items:center;gap:6px;font-size:12px;display:flex}.eGUBIq_backupWarn{margin:0;font-size:12px;line-height:18px;color:var(--dsw-alias-state-warn-primary,#b45309)!important}.eGUBIq_backupMessage{color:var(--dsw-alias-label-secondary,#6b7280);grid-column:1/-1;font-size:12px}";
486
577
  const tagId = "dshmarket/Market.module.css";
487
578
  if (typeof document !== "undefined" && document.querySelector("style[data-plugin-css=" + JSON.stringify(tagId) + "]") === null) {
488
579
  const tag = document.createElement("style");
@@ -493,95 +584,97 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
493
584
  }
494
585
  var Market_module_css_default = {
495
586
  "actLive": "eGUBIq_actLive",
496
- "searchInline": "eGUBIq_searchInline",
497
- "backupCard": "eGUBIq_backupCard",
498
- "pageInfo": "eGUBIq_pageInfo",
499
- "title": "eGUBIq_title",
500
- "backupButton": "eGUBIq_backupButton",
501
- "descTight": "eGUBIq_descTight",
502
- "err": "eGUBIq_err",
503
- "sp": "eGUBIq_sp",
504
- "catsRow": "eGUBIq_catsRow",
505
- "warnLine": "eGUBIq_warnLine",
506
- "src": "eGUBIq_src",
507
- "actWhy": "eGUBIq_actWhy",
508
- "filterGroup": "eGUBIq_filterGroup",
509
- "actBroken": "eGUBIq_actBroken",
510
- "empty": "eGUBIq_empty",
511
- "sizeOn": "eGUBIq_sizeOn",
512
- "dangerBtn": "eGUBIq_dangerBtn",
513
- "backupMessage": "eGUBIq_backupMessage",
514
- "owner": "eGUBIq_owner",
515
- "tabs": "eGUBIq_tabs",
516
- "cancelBtn": "eGUBIq_cancelBtn",
517
- "pager": "eGUBIq_pager",
518
- "card": "eGUBIq_card",
587
+ "okState": "eGUBIq_okState",
519
588
  "filterWrap": "eGUBIq_filterWrap",
520
- "row1": "eGUBIq_row1",
521
- "dot": "eGUBIq_dot",
522
589
  "foot": "eGUBIq_foot",
523
- "filterPanel": "eGUBIq_filterPanel",
524
- "backupPrimary": "eGUBIq_backupPrimary",
525
- "cats": "eGUBIq_cats",
526
- "sub": "eGUBIq_sub",
527
- "spec": "eGUBIq_spec",
528
- "restart": "eGUBIq_restart",
529
- "catsToggle": "eGUBIq_catsToggle",
530
- "titleRow": "eGUBIq_titleRow",
531
- "sizeBtn": "eGUBIq_sizeBtn",
532
- "barFill": "eGUBIq_barFill",
533
- "okState": "eGUBIq_okState",
534
- "av": "eGUBIq_av",
535
- "desc": "eGUBIq_desc",
590
+ "tab": "eGUBIq_tab",
591
+ "tabs": "eGUBIq_tabs",
536
592
  "loading": "eGUBIq_loading",
593
+ "barFill": "eGUBIq_barFill",
594
+ "searchInline": "eGUBIq_searchInline",
595
+ "pageBtn": "eGUBIq_pageBtn",
596
+ "sub": "eGUBIq_sub",
597
+ "tag": "eGUBIq_tag",
598
+ "backupGrid": "eGUBIq_backupGrid",
599
+ "dangerBtn": "eGUBIq_dangerBtn",
600
+ "barWave": "eGUBIq_barWave",
537
601
  "pct": "eGUBIq_pct",
538
- "bar": "eGUBIq_bar",
539
- "filterBtn": "eGUBIq_filterBtn",
540
- "grow": "eGUBIq_grow",
541
- "on": "eGUBIq_on",
542
- "themesGrid": "eGUBIq_themesGrid",
543
- "dshmSlide": "eGUBIq_dshmSlide",
544
- "irowMissing": "eGUBIq_irowMissing",
545
- "filterOption": "eGUBIq_filterOption",
602
+ "filterPanel": "eGUBIq_filterPanel",
546
603
  "filterTitle": "eGUBIq_filterTitle",
547
- "cmdSummary": "eGUBIq_cmdSummary",
548
- "tag": "eGUBIq_tag",
549
- "cmd": "eGUBIq_cmd",
550
- "head": "eGUBIq_head",
551
- "root": "eGUBIq_root",
552
- "sect": "eGUBIq_sect",
553
- "progress": "eGUBIq_progress",
554
- "pagerSize": "eGUBIq_pagerSize",
604
+ "desc": "eGUBIq_desc",
605
+ "actWarn": "eGUBIq_actWarn",
555
606
  "sizeLabel": "eGUBIq_sizeLabel",
556
- "backupGrid": "eGUBIq_backupGrid",
557
- "body": "eGUBIq_body",
558
- "pageBtn": "eGUBIq_pageBtn",
559
- "pageOn": "eGUBIq_pageOn",
560
- "pageEllipsis": "eGUBIq_pageEllipsis",
607
+ "sp": "eGUBIq_sp",
608
+ "sizeBtn": "eGUBIq_sizeBtn",
609
+ "backupCard": "eGUBIq_backupCard",
610
+ "head": "eGUBIq_head",
611
+ "src": "eGUBIq_src",
612
+ "empty": "eGUBIq_empty",
613
+ "on": "eGUBIq_on",
614
+ "av": "eGUBIq_av",
615
+ "pager": "eGUBIq_pager",
616
+ "backupButton": "eGUBIq_backupButton",
561
617
  "backupInput": "eGUBIq_backupInput",
562
- "backupActions": "eGUBIq_backupActions",
618
+ "swatches": "eGUBIq_swatches",
619
+ "sect": "eGUBIq_sect",
620
+ "filterBtn": "eGUBIq_filterBtn",
621
+ "catsWrap": "eGUBIq_catsWrap",
622
+ "root": "eGUBIq_root",
623
+ "top": "eGUBIq_top",
624
+ "title": "eGUBIq_title",
563
625
  "backupCheck": "eGUBIq_backupCheck",
564
626
  "irow": "eGUBIq_irow",
565
- "cmdDetails": "eGUBIq_cmdDetails",
627
+ "filterOption": "eGUBIq_filterOption",
628
+ "grow": "eGUBIq_grow",
629
+ "cancelBtn": "eGUBIq_cancelBtn",
630
+ "pagerSize": "eGUBIq_pagerSize",
566
631
  "modalNote": "eGUBIq_modalNote",
567
- "backupWarn": "eGUBIq_backupWarn",
632
+ "dshmSlide": "eGUBIq_dshmSlide",
633
+ "filterGroup": "eGUBIq_filterGroup",
634
+ "card": "eGUBIq_card",
635
+ "catsCollapsed": "eGUBIq_catsCollapsed",
636
+ "body": "eGUBIq_body",
637
+ "cmdSummary": "eGUBIq_cmdSummary",
638
+ "actWhy": "eGUBIq_actWhy",
639
+ "star": "eGUBIq_star",
640
+ "cats": "eGUBIq_cats",
641
+ "bar": "eGUBIq_bar",
642
+ "irowMissing": "eGUBIq_irowMissing",
643
+ "sizeOn": "eGUBIq_sizeOn",
644
+ "backupPrimary": "eGUBIq_backupPrimary",
645
+ "backupActions": "eGUBIq_backupActions",
568
646
  "nm": "eGUBIq_nm",
647
+ "warnBtn": "eGUBIq_warnBtn",
648
+ "pageEllipsis": "eGUBIq_pageEllipsis",
649
+ "warnLine": "eGUBIq_warnLine",
650
+ "spec": "eGUBIq_spec",
651
+ "staleAction": "eGUBIq_staleAction",
569
652
  "grid": "eGUBIq_grid",
570
- "actWarn": "eGUBIq_actWarn",
571
- "swatches": "eGUBIq_swatches",
572
- "barWave": "eGUBIq_barWave",
573
- "dangerArmed": "eGUBIq_dangerArmed",
653
+ "descTight": "eGUBIq_descTight",
654
+ "dot": "eGUBIq_dot",
655
+ "shot": "eGUBIq_shot",
656
+ "backupMessage": "eGUBIq_backupMessage",
574
657
  "filterBtnOn": "eGUBIq_filterBtnOn",
658
+ "cmdDetails": "eGUBIq_cmdDetails",
659
+ "pageOn": "eGUBIq_pageOn",
660
+ "restart": "eGUBIq_restart",
661
+ "backupWarn": "eGUBIq_backupWarn",
662
+ "themesGrid": "eGUBIq_themesGrid",
663
+ "owner": "eGUBIq_owner",
664
+ "pageInfo": "eGUBIq_pageInfo",
665
+ "catsRow": "eGUBIq_catsRow",
575
666
  "act": "eGUBIq_act",
576
- "warnBtn": "eGUBIq_warnBtn",
577
- "top": "eGUBIq_top",
578
- "staleAction": "eGUBIq_staleAction",
579
- "catsWrap": "eGUBIq_catsWrap",
580
- "tab": "eGUBIq_tab",
667
+ "catsToggle": "eGUBIq_catsToggle",
581
668
  "spin": "eGUBIq_spin",
669
+ "progress": "eGUBIq_progress",
670
+ "err": "eGUBIq_err",
582
671
  "pagerPages": "eGUBIq_pagerPages",
583
- "star": "eGUBIq_star",
584
- "catsCollapsed": "eGUBIq_catsCollapsed"
672
+ "dangerArmed": "eGUBIq_dangerArmed",
673
+ "shots": "eGUBIq_shots",
674
+ "row1": "eGUBIq_row1",
675
+ "titleRow": "eGUBIq_titleRow",
676
+ "actBroken": "eGUBIq_actBroken",
677
+ "cmd": "eGUBIq_cmd"
585
678
  };
586
679
  //#endregion
587
680
  //#region src/client/MarketSection.tsx
@@ -639,6 +732,41 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
639
732
  });
640
733
  }
641
734
  /**
735
+ * AppStore-style screenshot strip in the install detail dialog (#61).
736
+ * Curated registry screenshots win; otherwise images are extracted from the
737
+ * repo README. Requests start only once the dialog opens; failures — no
738
+ * README, no images, broken links — degrade to rendering nothing at all.
739
+ */
740
+ function ScreenshotStrip({ plugin }) {
741
+ const [shots, setShots] = (0, react.useState)([]);
742
+ const [broken, setBroken] = (0, react.useState)([]);
743
+ (0, react.useEffect)(() => {
744
+ let live = true;
745
+ setShots([]);
746
+ setBroken([]);
747
+ pluginScreenshots(plugin).then((list) => {
748
+ if (live) setShots(list);
749
+ });
750
+ return () => {
751
+ live = false;
752
+ };
753
+ }, [plugin]);
754
+ const visible = shots.filter((src) => !broken.includes(src));
755
+ if (visible.length === 0) return null;
756
+ return /* @__PURE__ */ (0, react_jsx_runtime.jsx)("div", {
757
+ className: Market_module_css_default.shots,
758
+ children: visible.map((src) => /* @__PURE__ */ (0, react_jsx_runtime.jsx)("img", {
759
+ className: Market_module_css_default.shot,
760
+ src,
761
+ alt: "",
762
+ loading: "lazy",
763
+ decoding: "async",
764
+ referrerPolicy: "no-referrer",
765
+ onError: () => setBroken((prev) => prev.includes(src) ? prev : prev.concat(src))
766
+ }, src))
767
+ });
768
+ }
769
+ /**
642
770
  * Official-style market glyph: the shared block-grid brand mark converted to
643
771
  * the official monochrome icon form (16×16, fill="currentColor") so it
644
772
  * follows the active theme. Mirrors the settings-nav glyph used for the
@@ -2334,6 +2462,7 @@ window.__ModuleLoader__.load({ id: "dshmarket", factory: (require) => {
2334
2462
  children: t("confirm")
2335
2463
  })] }),
2336
2464
  children: [
2465
+ /* @__PURE__ */ (0, react_jsx_runtime.jsx)(ScreenshotStrip, { plugin: confirming }),
2337
2466
  /* @__PURE__ */ (0, react_jsx_runtime.jsxs)("details", {
2338
2467
  className: Market_module_css_default.cmdDetails,
2339
2468
  children: [/* @__PURE__ */ (0, react_jsx_runtime.jsx)("summary", {