dsh-m 0.9.71 → 0.9.73
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/CHANGELOG.md +26 -0
- package/lib/client.js +46 -12
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -8,6 +8,19 @@ The full release history of dsh-m, maintained bilingually: **Chinese first, Engl
|
|
|
8
8
|
|
|
9
9
|
## 中文
|
|
10
10
|
|
|
11
|
+
### 0.9.73 修复:详情截图条统一瓷砖——「大小不一 + 预览图盖住左右邻图」(flex 收缩外溢根治)
|
|
12
|
+
|
|
13
|
+
- **根因(主人详情弹窗实拍:缩略图大小参差,图片压在左右邻图上)**:两处机制缺陷叠加——① `.dsvm-shotbox` 无固定几何(盒 min 120×84 / img max 220×130),跟着图片固有比例走,16:9、4:3、竖图、小原图各渲各的,「大的大小的小」;②盒子显式 `min-width:120px` 顶掉了 flex 的 automatic minimum size——8 张截图自然总宽(~1.7k px)远超弹窗内容宽(~688px)触发 flex 收缩时,盒子被压到 120px 地板而盒内 `<img>`(替换元素)不受盒宽约束保持固有宽度,加上盒子 `overflow:visible`,图片居中外溢每侧盖住邻图 ~44px——且发生在滚动条出现之前,两症状同屏;加载完成瞬间行高还随最高图 84→130px 跳变(CLS)。
|
|
14
|
+
- **修复(统一瓷砖)**:盒子 `flex:0 0 auto`(几何与图片数量/加载态无关,永不收缩)+ 固定 176×110 + `overflow:hidden`(外溢兜底双保险);img 改 `width/height:100%` + `object-fit:cover` + `object-position:top center`(顶锚定保住截图标题栏,裁切只发生在底部,竖图/方图露上半段,全图看灯箱);行加 `scroll-snap-type:x proximity` + 盒 `scroll-snap-align:start`(横滚翻页手感)。灯箱、走链、坏图剔除、键盘导航语义零变化。
|
|
15
|
+
- **验证**:1332 项测试全绿(新增截图条瓷砖 CSS 源锚 2 用例:统一瓷砖形态 + 旧病灶负向锚)、typecheck 零错误;构建产物含新规则逐字锚。方案对比 mock(现状复刻 + cover/contain/网格三案实况)先行经主人选型(A 案 cover)。
|
|
16
|
+
|
|
17
|
+
### 0.9.72 修复:设置页滚轮黑洞——操作记录滚动区/横幅的 contain 改为「可滚才挂」(Chrome 144 规范对齐暴露)
|
|
18
|
+
|
|
19
|
+
- **根因(主人设置页实拍:操作记录条数少、滚动条尚未出现时,鼠标悬停该区域滚轮无法翻页)**:`.dshm-ops-scroll` 恒挂 `overscroll-behavior:contain`(0.9.64 随 220px 滚动区引入)。`overflow-y:auto` 使元素无论内容多少都是滚动容器,而规范口径「没有可滚溢出的滚动容器恒在滚动边界」+ contain「到边界禁止向祖先链滚」→ 内容不满时整块区域吞掉滚轮。Chrome 144 起「Respect overscroll-behavior on non-scrollable scroll containers」落地(此前引擎仅真可滚才执行 contain,病灶被宽容掩盖),潜伏缺陷被引擎升级激活;错误/提示横幅 `.dshm-banner-text`(限高滚动时代引入的同款恒挂)同病。
|
|
20
|
+
- **修复(意图精确化:有得滚才断链)**:新增 `useScrollableContain(dep)`——实测 `scrollHeight > clientHeight`(+1 容亚像素取整)才挂 `.is-scrollable`(= contain),容器与首子元素入 ResizeObserver,改宽折行/注记增删引起的可滚性翻转自动复检,SSR/Node(ResizeObserver 缺席)安全跳过;操作记录滚动区、重启横幅、toast 三处接线。钢人结论:0.9.64 每个局部决策(限高滚动区/50 条上限/清除钉底/contain 自身的嵌套滚动卫生)都成立,错的只是「静态 CSS 事实表达了动态适用前提」——日志不满限时滚轮还给页面,日志实滚时边界断链照旧。
|
|
21
|
+
- **顺带**:滚动区补 `tabIndex=0` + aria-label(0.9.45 U8 键盘可达纪律延续,50 条记录此前键盘用户无法滚动);布局契约不动(通栏/220px/钉底照旧);布局 mock 同步(`.opscroll` 双规则 + 样本标注实滚类)。
|
|
22
|
+
- **验证**:1330 项测试全绿(新增 `client-scroll-contain` 结构锚 4 用例:恒挂形态退役/条件规则在/hook 守卫/三处接线)、typecheck 零错误。
|
|
23
|
+
|
|
11
24
|
### 0.9.71 功能:设置类操作记录——社区目录开关与清单源变更入账(DESIGN §2.6 修订)
|
|
12
25
|
|
|
13
26
|
- **背景**:设置页「社区目录开关」与「校验并应用 / 恢复默认」(清单源)的变更此前不入操作记录,事后无法回看「何时改的、从哪改到哪」——而 agent 供给面(`dshm_search` 可见目录规模 20 余精选 ↔ 4,000+ 社区)与信任根(自定义清单源)恰恰挂在这两个开关上。
|
|
@@ -525,6 +538,19 @@ The full release history of dsh-m, maintained bilingually: **Chinese first, Engl
|
|
|
525
538
|
|
|
526
539
|
## English
|
|
527
540
|
|
|
541
|
+
### Fix in 0.9.73 — detail screenshot strip unified tiles: inconsistent sizes and previews overlapping neighboring thumbnails (flex-shrink overflow fixed at the root)
|
|
542
|
+
|
|
543
|
+
- **Root cause (owner screenshot: jagged thumbnails with images spilling over their left/right neighbors)**: two defects stacked — ① `.dsvm-shotbox` had no fixed geometry (box min 120×84 / img max 220×130) and followed each image's intrinsic aspect ratio, so 16:9, 4:3, portrait and small originals all rendered at their own size; ② the explicit `min-width:120px` overrode the flex automatic minimum size — with eight screenshots' natural total width (~1.7k px) far exceeding the modal content width (~688px), flex-shrink squeezed each box to its 120px floor while the inner `<img>` (a replaced element) kept its intrinsic width, and with `overflow:visible` on the box each image spilled out centered, covering ~44px of each neighbor — all before the scrollbar even appeared; the row height also jumped 84→130px when the tallest image loaded (CLS).
|
|
544
|
+
- **Fix (unified tiles)**: boxes get `flex:0 0 auto` (geometry independent of image count/load state, never shrinks) + fixed 176×110 + `overflow:hidden` (belt-and-braces against spill); images switch to `width/height:100%` + `object-fit:cover` + `object-position:top center` (top-anchored so screenshot title bars survive; cropping only trims the bottom — portrait/square shots show their upper half, the full image lives in the lightbox); the row gains `scroll-snap-type:x proximity` and boxes `scroll-snap-align:start`. Lightbox, image chain, broken-shot eviction, and keyboard navigation semantics unchanged.
|
|
545
|
+
- **Verification**: 1332 tests green (new screenshot-strip tile CSS source anchors, 2 cases: unified-tile shape + negative anchors on the retired defect forms), typecheck clean; the built bundle carries the new rules verbatim. A standalone comparison mock (current-bug reproduction + cover/contain/grid variants) was reviewed by the owner beforehand (variant A: cover chosen).
|
|
546
|
+
|
|
547
|
+
### Fix in 0.9.72 — settings-page wheel black hole: ops scroll region and banner now apply contain only when actually scrollable (exposed by Chrome 144 spec alignment)
|
|
548
|
+
|
|
549
|
+
- **Root cause (owner screenshot: with few operation records and no scrollbar yet, wheeling over the scroll region does nothing)**: `.dshm-ops-scroll` carried a permanent `overscroll-behavior:contain` (introduced with the 220px region in 0.9.64). `overflow-y:auto` makes the element a scroll container no matter how little content it has, and per spec a scroll container without scrollable overflow is always at its scroll boundary — with contain forbidding chaining, the whole area swallows the wheel. Chrome 144's "Respect overscroll-behavior on non-scrollable scroll containers" made engines honor this unconditionally (previously contain only applied when actually scrollable), activating the latent defect; the banner text (`.dshm-banner-text`, same permanent contain from the capped-banner era) shares the disease.
|
|
550
|
+
- **Fix (intent made precise: block chaining only when scrollable)**: new `useScrollableContain(dep)` — attaches `.is-scrollable` (= contain) only when `scrollHeight > clientHeight` (+1 for sub-pixel rounding), with the container and first child in a ResizeObserver so wrap/note changes re-check, and a safe skip when ResizeObserver is absent (SSR/Node); wired into the ops scroll region, restart banner, and toast. Steelman verdict: every 0.9.64 decision stands (capped region / 50-record cap / pinned clear button / contain's own nested-scroll hygiene); the only flaw was a static CSS fact expressing a dynamic precondition — short logs now hand the wheel back to the page, long logs keep boundary containment.
|
|
551
|
+
- **Also**: the scroll region gains `tabIndex=0` + aria-label (keyboard-reachability discipline from 0.9.45 U8); the layout contract is untouched; the layout mock is synced.
|
|
552
|
+
- **Verification**: 1330 tests green (new client-scroll-contain structural anchors, 4 cases), typecheck clean.
|
|
553
|
+
|
|
528
554
|
### Feature in 0.9.71 — settings-class operation records: community catalog toggle and registry source changes are now logged (DESIGN §2.6 revision)
|
|
529
555
|
|
|
530
556
|
- **Background**: changes made via the settings page's community catalog toggle and the registry source actions (apply / restore default) never appeared in the operations panel, leaving no answer to "when was it changed, and from what" — even though the agent-facing supply surface (`dshm_search` scope: ~20 curated vs 4,000+ community entries) and the trust root (custom registry source) hang exactly on these two switches.
|
package/lib/client.js
CHANGED
|
@@ -2492,9 +2492,18 @@ var CSS = `
|
|
|
2492
2492
|
.dsvm-cmdrow{display:flex;align-items:center;gap:8px;margin-top:6px;flex-wrap:wrap}
|
|
2493
2493
|
.dsvm-code{background:rgba(127,127,127,.12);padding:3px 8px;border-radius:6px;font-size:11px;overflow-wrap:anywhere}
|
|
2494
2494
|
.dsvm-modalactions{display:flex;justify-content:flex-end;gap:8px}
|
|
2495
|
-
.
|
|
2496
|
-
|
|
2497
|
-
|
|
2495
|
+
/* 0.9.73 \u8BE6\u60C5\u622A\u56FE\u6761\u7EDF\u4E00\u74F7\u7816\uFF1A\u4E24\u75C5\u7076\u2014\u2014\u2460\u76D2\u5B50\u65E0\u56FA\u5B9A\u51E0\u4F55\uFF08min 120\xD784 \u76D2 / img max 220\xD7130\uFF09\u8DDF\u7740
|
|
2496
|
+
\u56FE\u7247\u56FA\u6709\u6BD4\u4F8B\u8D70\uFF0C\u6574\u6761\u53C2\u5DEE\uFF08\u300C\u5927\u7684\u5927\u5C0F\u7684\u5C0F\u300D\uFF09\uFF1B\u2461shotbox \u663E\u5F0F min-width:120px \u9876\u6389 flex \u7684
|
|
2497
|
+
automatic minimum size\uFF0CN \u5F20\u56FE\u81EA\u7136\u603B\u5BBD\u8D85\u884C\uFF088\xD7220px \u226B \u5F39\u7A97\u5185\u5BB9\u5BBD ~688px\uFF09\u89E6\u53D1 flex \u6536\u7F29\u65F6\uFF0C
|
|
2498
|
+
\u76D2\u5B50\u88AB\u538B\u5230 120px \u5730\u677F\u800C\u76D2\u5185 img\uFF08\u66FF\u6362\u5143\u7D20\uFF09\u4E0D\u53D7\u76D2\u5BBD\u7EA6\u675F\u4FDD\u6301\u56FA\u6709\u5BBD\u5EA6\u3001\u76D2\u5B50 overflow:visible
|
|
2499
|
+
\u2014\u2014\u56FE\u7247\u5C45\u4E2D\u5916\u6EA2\u76D6\u4F4F\u5DE6\u53F3\u90BB\u56FE\uFF08\u53D1\u751F\u5728\u6EDA\u52A8\u6761\u51FA\u73B0\u4E4B\u524D\uFF0C\u4E24\u75C7\u72B6\u540C\u5C4F\uFF09\uFF1B\u52A0\u8F7D\u5B8C\u6210\u77AC\u95F4\u884C\u9AD8\u8FD8\u88AB
|
|
2500
|
+
\u6491\u9AD8\u4E00\u6B21\uFF08\u884C\u9AD8\u968F\u6700\u9AD8\u56FE 84\u2192130px \u8DF3\u53D8\uFF0CCLS\uFF09\u3002\u4FEE\u590D = \u7EDF\u4E00\u74F7\u7816 176\xD7110 + flex:0 0 auto
|
|
2501
|
+
\uFF08\u6C38\u4E0D\u6536\u7F29\uFF0C\u51E0\u4F55\u4E0E\u56FE\u7247\u591A\u5C11/\u52A0\u8F7D\u6001\u65E0\u5173\uFF09+ overflow:hidden\uFF08\u5916\u6EA2\u515C\u5E95\u53CC\u4FDD\u9669\uFF09\uFF0Cimg \u6539
|
|
2502
|
+
width/height:100% + object-fit:cover + object-position:top\uFF08\u9876\u951A\u5B9A\u4FDD\u4F4F\u622A\u56FE\u6807\u9898\u680F\uFF0C\u88C1\u5207\u53EA
|
|
2503
|
+
\u53D1\u751F\u5728\u5E95\u90E8\uFF0C\u7AD6\u56FE/\u65B9\u56FE\u9732\u4E0A\u534A\u6BB5\uFF0C\u5168\u56FE\u770B\u706F\u7BB1\uFF09\uFF1Bscroll-snap proximity \u7ED9\u6A2A\u6EDA\u7FFB\u9875\u624B\u611F\u3002 */
|
|
2504
|
+
.dsvm-shotrow{display:flex;gap:6px;overflow-x:auto;padding:2px 0;scroll-snap-type:x proximity}
|
|
2505
|
+
.dsvm-shotbox{flex:0 0 auto;width:176px;height:110px;overflow:hidden;display:flex;align-items:center;justify-content:center;background:rgba(127,127,127,.08);border-radius:6px;cursor:zoom-in;border:1px solid var(--dsw-alias-border-l2,rgba(127,127,127,.25));scroll-snap-align:start}
|
|
2506
|
+
.dsvm-shot{width:100%;height:100%;object-fit:cover;object-position:top center;border-radius:6px;display:block}
|
|
2498
2507
|
/* \u706F\u7BB1 v2\uFF080.9.60\uFF09\uFF1A\u7EC4\u4EF6 createPortal \u6302 body\uFF08\u9003\u51FA\u9762\u677F backdrop-filter \u5305\u542B\u5757\uFF09\uFF0C
|
|
2499
2508
|
\u63A7\u4EF6\u5168\u90E8\u7EDD\u5BF9\u5B9A\u4F4D\u8D34\u89C6\u53E3\u8FB9\u2014\u2014\u2715 \u5E38\u9A7B\u53F3\u4E0A\u3001\u2039\u203A \u4E24\u4FA7\u5C45\u4E2D\u3001\u5E95\u90E8\u8BA1\u6570+\u5706\u70B9 pill\uFF0C
|
|
2500
2509
|
\u4EFB\u4F55\u9762\u677F\u72B6\u6001/\u4EFB\u610F\u56FE\u7247\u9AD8\u5EA6\u4E0B\u90FD\u4E0D\u4F1A\u88AB\u6324\u51FA\u5C4F\u5E55\uFF1B\u56FE\u7247\u964D\u5230 74vh \u7ED9\u5E95\u90E8\u63A7\u4EF6\u7559\u4F4D\u3002
|
|
@@ -2550,7 +2559,10 @@ var CSS = `
|
|
|
2550
2559
|
.dsvm-btn{border:1px solid rgba(255,255,255,.35);background:rgba(255,255,255,.14);color:#fff;border-radius:8px;padding:5px 14px;font:inherit;font-size:13px;cursor:pointer}
|
|
2551
2560
|
.dsvm-btn:hover{background:rgba(255,255,255,.24)}
|
|
2552
2561
|
.dsvm-ops-caption{font-size:11px;color:var(--dsw-alias-label-caption,#9ca3af);margin:2px 0 -3px}
|
|
2553
|
-
.
|
|
2562
|
+
/* 0.9.72 \u6EDA\u8F6E\u6CBB\u7406\uFF08useScrollableContain\uFF09\uFF1Acontain \u53EA\u5728\u771F\u7684\u53EF\u6EDA\u65F6\u6302\u2014\u2014Chrome 144+ \u5BF9
|
|
2563
|
+
\u300C\u65E0\u53EF\u6EDA\u6EA2\u51FA\u7684\u6EDA\u52A8\u5BB9\u5668\u300D\u4E5F\u6267\u884C contain\uFF0C\u6052\u6302\u4F1A\u628A\u4E0D\u6EE1\u9AD8\u7684\u6EDA\u52A8\u533A\u53D8\u6210\u6EDA\u8F6E\u9ED1\u6D1E */
|
|
2564
|
+
.dshm-ops-scroll{max-height:220px;overflow-y:auto}
|
|
2565
|
+
.dshm-ops-scroll.is-scrollable{overscroll-behavior:contain}
|
|
2554
2566
|
.dshm-ops-scroll::-webkit-scrollbar{width:8px}
|
|
2555
2567
|
.dshm-ops-scroll::-webkit-scrollbar-thumb{background:rgba(127,127,127,.28);border-radius:4px}
|
|
2556
2568
|
.dshm-ops-scroll::-webkit-scrollbar-thumb:hover{background:rgba(127,127,127,.45)}
|
|
@@ -2598,7 +2610,9 @@ button.dshm-badge:hover{filter:brightness(.95)}
|
|
|
2598
2610
|
.dshm-actions{display:flex;gap:6px;flex-wrap:wrap;margin-top:4px}
|
|
2599
2611
|
.dshm-banner{display:flex;align-items:center;gap:10px;padding:10px 14px;border-top:1px solid var(--dsw-alias-border-l2,#e5e7eb);background:var(--dsw-alias-state-warn-tertiary,#fffbeb);color:var(--dsw-alias-state-warn-primary,#b45309);font-size:12px}
|
|
2600
2612
|
.dshm-banner.err{background:rgba(239,68,68,.13);color:var(--dsw-alias-state-error-primary,#b91c1c)}
|
|
2601
|
-
.
|
|
2613
|
+
/* 0.9.72 \u540C\u6B3E\u6EDA\u8F6E\u6CBB\u7406\uFF08\u89C1 dshm-ops-scroll \u6CE8\uFF09\uFF1A\u6A2A\u5E45\u6587\u672C\u4E0D\u6EE1 140px \u65F6\u4E0D\u5F97\u541E\u6EDA\u8F6E */
|
|
2614
|
+
.dshm-banner .dshm-banner-text{flex:1;max-height:140px;overflow:auto;white-space:pre-wrap;word-break:break-word;line-height:18px}
|
|
2615
|
+
.dshm-banner .dshm-banner-text.is-scrollable{overscroll-behavior:contain}
|
|
2602
2616
|
.dshm-row{display:flex;align-items:center;gap:8px}
|
|
2603
2617
|
.dshm-kv{display:grid;grid-template-columns:96px 1fr;gap:6px 10px;font-size:12px;align-items:baseline}
|
|
2604
2618
|
.dshm-kv .k{color:var(--dsw-alias-label-caption,#6b7280);font-size:11px}
|
|
@@ -2967,14 +2981,12 @@ function RestartBanner({ note, onDone, desktop, onRestarted }) {
|
|
|
2967
2981
|
setErr(String(e && e.message || e));
|
|
2968
2982
|
}
|
|
2969
2983
|
}, [onDone, onRestarted]);
|
|
2984
|
+
const text = phase === "restarting" ? lookup("restart.doing") : phase === "waiting" ? lookup("restart.waiting") : err ? lookup("restart.failed", { err }) : note || lookup("banner.done");
|
|
2985
|
+
const [textRef, textScrollCls] = useScrollableContain(text);
|
|
2970
2986
|
return h(
|
|
2971
2987
|
"div",
|
|
2972
2988
|
{ className: "dshm-banner" },
|
|
2973
|
-
h(
|
|
2974
|
-
"span",
|
|
2975
|
-
{ className: "dshm-banner-text" },
|
|
2976
|
-
phase === "restarting" ? lookup("restart.doing") : phase === "waiting" ? lookup("restart.waiting") : err ? lookup("restart.failed", { err }) : note || lookup("banner.done")
|
|
2977
|
-
),
|
|
2989
|
+
h("span", { className: `dshm-banner-text${textScrollCls}`, ref: textRef }, text),
|
|
2978
2990
|
phase === "idle" && !err && !desktop ? h("button", { className: "dshm-btn primary sm", onClick: restart }, lookup("restart.now")) : null,
|
|
2979
2991
|
phase === "restarting" || phase === "waiting" ? Spin() : null,
|
|
2980
2992
|
phase === "idle" && err ? h("button", { className: "dshm-btn sm", onClick: () => onDone(false) }, lookup("common.ok")) : null,
|
|
@@ -4659,10 +4671,26 @@ var OP_STATUS_CLS = {
|
|
|
4659
4671
|
failed: "err",
|
|
4660
4672
|
superseded: "sup"
|
|
4661
4673
|
};
|
|
4674
|
+
function useScrollableContain(dep) {
|
|
4675
|
+
const ref = useRef(null);
|
|
4676
|
+
const [scrollable, setScrollable] = useState(false);
|
|
4677
|
+
useEffect(() => {
|
|
4678
|
+
const el = ref.current;
|
|
4679
|
+
if (!el || typeof ResizeObserver === "undefined") return;
|
|
4680
|
+
const check = () => setScrollable(el.scrollHeight > el.clientHeight + 1);
|
|
4681
|
+
check();
|
|
4682
|
+
const ro = new ResizeObserver(check);
|
|
4683
|
+
ro.observe(el);
|
|
4684
|
+
if (el.firstElementChild) ro.observe(el.firstElementChild);
|
|
4685
|
+
return () => ro.disconnect();
|
|
4686
|
+
}, [dep]);
|
|
4687
|
+
return [ref, scrollable ? " is-scrollable" : ""];
|
|
4688
|
+
}
|
|
4662
4689
|
function OperationsCard({ records, onClearFinished, onRemove }) {
|
|
4663
4690
|
const active = records.filter((r) => r.status === "queued" || r.status === "running" || r.status === "input");
|
|
4664
4691
|
const finished = records.filter((r) => active.indexOf(r) < 0).slice(-50);
|
|
4665
4692
|
const clearable = records.some((r) => TERMINAL_CLEARABLE2.has(r.status));
|
|
4693
|
+
const [scrollRef, scrollCls] = useScrollableContain(finished.length);
|
|
4666
4694
|
const targetText = (r) => r.kind === "community-toggle" && r.meta && typeof r.meta.on === "boolean" ? lookup(r.meta.on ? "op.state.on" : "op.state.off") : r.target;
|
|
4667
4695
|
const row = (r) => h(
|
|
4668
4696
|
"div",
|
|
@@ -4689,7 +4717,12 @@ function OperationsCard({ records, onClearFinished, onRemove }) {
|
|
|
4689
4717
|
) : null,
|
|
4690
4718
|
finished.length ? h(
|
|
4691
4719
|
"div",
|
|
4692
|
-
{
|
|
4720
|
+
{
|
|
4721
|
+
className: `dshm-ops-scroll${scrollCls}`,
|
|
4722
|
+
ref: scrollRef,
|
|
4723
|
+
tabIndex: 0,
|
|
4724
|
+
"aria-label": lookup("settings.ops")
|
|
4725
|
+
},
|
|
4693
4726
|
h(
|
|
4694
4727
|
"div",
|
|
4695
4728
|
{ className: "dsvm-opgroup done" },
|
|
@@ -5115,6 +5148,7 @@ function MarketPanel({ onClose }) {
|
|
|
5115
5148
|
const outdatedCount = installedUpdateStats2(mergedItems || []).outdatedCount;
|
|
5116
5149
|
const [banner, setBanner] = useState(null);
|
|
5117
5150
|
const [toast, setToast] = useState(null);
|
|
5151
|
+
const [toastTextRef, toastScrollCls] = useScrollableContain(toast ? toast.text : "");
|
|
5118
5152
|
useEffect(() => {
|
|
5119
5153
|
const onKey = (e) => {
|
|
5120
5154
|
if (e.key === "Escape" && dsvmModalDepth === 0 && onClose) onClose();
|
|
@@ -5234,7 +5268,7 @@ function MarketPanel({ onClose }) {
|
|
|
5234
5268
|
toast ? h(
|
|
5235
5269
|
"div",
|
|
5236
5270
|
{ className: toast.kind === "err" ? "dshm-banner err" : "dshm-banner" },
|
|
5237
|
-
h("span", { className:
|
|
5271
|
+
h("span", { className: `dshm-banner-text${toastScrollCls}`, ref: toastTextRef }, toast.text)
|
|
5238
5272
|
) : null,
|
|
5239
5273
|
banner ? h(RestartBanner, { note: banner.text, onDone: () => setBanner(null), desktop: banner.desktop === true, onRestarted: reloadPing }) : null
|
|
5240
5274
|
)
|