dsh-notify-me 1.9.1 → 1.9.3
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 +23 -0
- package/README.en.md +3 -3
- package/README.md +3 -3
- package/lib/client.js +150 -21
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -2,6 +2,29 @@
|
|
|
2
2
|
|
|
3
3
|
All notable changes to **dsh-notify-me** are documented here.
|
|
4
4
|
|
|
5
|
+
## [1.9.3] — 2026-10-20
|
|
6
|
+
|
|
7
|
+
### 变更
|
|
8
|
+
|
|
9
|
+
- **悬浮提示只在行标题上触发**:之前整行(右侧开关、滑块、下拉都算)都是触发区,鼠标扫过控件也会弹方框;现在指针停在标题文字上才出现,开关和滑块保持干净。
|
|
10
|
+
- 渐显 320 ms、跟随指针、靠边翻转、滚动收起这些行为不变;读屏隐藏副本不受影响。
|
|
11
|
+
|
|
12
|
+
### 测试
|
|
13
|
+
|
|
14
|
+
- 冒烟测试新增四条结构断言:带说明的行必须把提示挂在 `.dnm-rowLabel` 上,该节点持有 `data-dnm-tip` 与三个 hover 处理函数,任何整行节点都不再是提示目标。`npm test` 两套件通过。
|
|
15
|
+
|
|
16
|
+
## [1.9.2] — 2026-10-20
|
|
17
|
+
|
|
18
|
+
### 变更
|
|
19
|
+
|
|
20
|
+
- **设置页的说明文字改成悬浮提示**:每行只留标题,鼠标移上去约 0.3 秒后在指针旁边弹出小方框显示原来的说明;靠近视口右侧/底部自动翻到另一边,滚动即收起。页面因此短了很多,一屏能扫完所有开关。
|
|
21
|
+
- 读屏仍能读到完整说明(每行保留视觉隐藏的 `.dnm-srOnly` 文本);音量百分比、权限提示、外部推送说明这类状态信息仍常显。
|
|
22
|
+
- README(中英)与设置页预览截图同步更新;徽章 bundle 尺寸更新为 ~164 KiB。
|
|
23
|
+
|
|
24
|
+
### 测试
|
|
25
|
+
|
|
26
|
+
- `npm test` 两套件通过;另在无头 Chromium 里用真 bundle + 假设置外壳验证悬浮出现/跟随/右缘翻转的坐标(`box=544,827 270x50 vw=900` 未越界)与中英两版截图。
|
|
27
|
+
|
|
5
28
|
## [1.9.1] — 2026-10-20
|
|
6
29
|
|
|
7
30
|
### 新增
|
package/README.en.md
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
[](https://www.npmjs.com/package/dsh-notify-me)
|
|
14
14
|
[](LICENSE)
|
|
15
15
|
[](#installation)
|
|
16
|
-
[](lib/client.js)
|
|
17
17
|
[](#compatibility)
|
|
18
18
|
[](https://awesome-dsh-plugin.com)
|
|
19
19
|
|
|
@@ -47,7 +47,7 @@ A notification plugin for DSH Web / Desktop, so you can keep full access off wit
|
|
|
47
47
|
|
|
48
48
|

|
|
49
49
|
|
|
50
|
-
The real settings component (v1.9.
|
|
50
|
+
The real settings component (v1.9.2 defaults) rendered as the content column in a standalone demo shell. Row explanations now live in a hover tooltip that appears when the pointer rests on a title, which is why only the titles show here.
|
|
51
51
|
</details>
|
|
52
52
|
|
|
53
53
|
## Installation
|
|
@@ -116,7 +116,7 @@ dsh-notify-me decouples **supervision** from **sitting in front of the screen**:
|
|
|
116
116
|
|
|
117
117
|
## Configure it from DSH Settings
|
|
118
118
|
|
|
119
|
-
Open **Settings → Notify me**. The page runs as how you get told, when to alert, and a try-it block; the knobs you rarely touch fold into **Advanced** at the bottom.
|
|
119
|
+
Open **Settings → Notify me**. The page runs as how you get told, when to alert, and a try-it block; the knobs you rarely touch fold into **Advanced** at the bottom. Rows show titles only — the explanation pops up next to the pointer once it rests on the title text (hovering a switch does nothing), with a hidden copy kept for screen readers.
|
|
120
120
|
|
|
121
121
|
### How you get told
|
|
122
122
|
|
package/README.md
CHANGED
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
[](https://www.npmjs.com/package/dsh-notify-me)
|
|
14
14
|
[](LICENSE)
|
|
15
15
|
[](#安装)
|
|
16
|
-
[](lib/client.js)
|
|
17
17
|
[](#兼容性)
|
|
18
18
|
[](https://awesome-dsh-plugin.com)
|
|
19
19
|
|
|
@@ -47,7 +47,7 @@ DSH Web / Desktop 的通知插件,让你敢不开完整访问,也不必一
|
|
|
47
47
|
|
|
48
48
|

|
|
49
49
|
|
|
50
|
-
真实插件设置组件(v1.9.
|
|
50
|
+
真实插件设置组件(v1.9.2 默认配置)在独立演示环境里按内容列整页渲染;每行的说明改成鼠标停在标题文字上才出现的小方框,所以这里只看到标题。
|
|
51
51
|
</details>
|
|
52
52
|
|
|
53
53
|
## 安装
|
|
@@ -112,7 +112,7 @@ dsh-notify-me 把「监督」和「守在屏幕前」解耦:只在真的出现
|
|
|
112
112
|
|
|
113
113
|
## 在 DSH 设置里改配置
|
|
114
114
|
|
|
115
|
-
打开 **设置 → 通知提醒**。页面按「提醒方式 → 什么时候提醒 →
|
|
115
|
+
打开 **设置 → 通知提醒**。页面按「提醒方式 → 什么时候提醒 → 试一试」三段排开,不常改的收进底部「高级设置」,点一下展开。每行只写标题,具体说明在鼠标移上去时弹出的小方框里(触屏或键盘操作时留一份隐藏文本给读屏)。
|
|
116
116
|
|
|
117
117
|
### 提醒方式
|
|
118
118
|
|
package/lib/client.js
CHANGED
|
@@ -1937,7 +1937,7 @@
|
|
|
1937
1937
|
});
|
|
1938
1938
|
} catch (e) {}
|
|
1939
1939
|
// keep in sync with package.json "version" on every release
|
|
1940
|
-
api.version = "1.9.
|
|
1940
|
+
api.version = "1.9.3";
|
|
1941
1941
|
api.setConfig = function (patch) { return setConfigLocal(patch); };
|
|
1942
1942
|
api.resetConfig = function () {
|
|
1943
1943
|
try {
|
|
@@ -2450,6 +2450,13 @@
|
|
|
2450
2450
|
".dnm-advToggle:focus-visible{outline:2px solid var(--dsw-alias-state-business-primary,#3b82f6);outline-offset:2px}" +
|
|
2451
2451
|
".dnm-advRight{display:flex;align-items:center;gap:8px;flex:none;font-weight:400;color:var(--dsw-alias-label-tertiary,rgba(120,120,120,.9))}" +
|
|
2452
2452
|
".dnm-advChev{font-size:10px;translate:0 1px;transition:transform .15s ease}" +
|
|
2453
|
+
".dnm-rowLabel.dnm-rowTip{cursor:help}" +
|
|
2454
|
+
".dnm-rowValue{font-size:12px;line-height:18px;color:var(--dsw-alias-label-tertiary,rgba(120,120,120,.9))}" +
|
|
2455
|
+
// The long explanation lives in a tooltip next to the pointer, so a
|
|
2456
|
+
// row is one line tall. Screen readers still get the text.
|
|
2457
|
+
".dnm-srOnly{position:absolute;width:1px;height:1px;margin:-1px;padding:0;overflow:hidden;clip:rect(0 0 0 0);white-space:nowrap;border:0}" +
|
|
2458
|
+
".dnm-tip{position:fixed;left:-9999px;top:-9999px;z-index:2147483001;max-width:270px;box-sizing:border-box;padding:7px 10px;border-radius:8px;border:1px solid var(--dsw-alias-border-l2,rgba(128,128,128,.35));background:var(--dsw-alias-bg-layer-3,#26282c);color:var(--dsw-alias-label-secondary,rgba(90,90,90,.9));font-size:12px;line-height:17px;box-shadow:0 6px 18px rgba(0,0,0,.35);pointer-events:none;opacity:0;transition:opacity .12s ease}" +
|
|
2459
|
+
".dnm-tip.on{opacity:1}" +
|
|
2453
2460
|
".dnm-advChev.open{transform:rotate(180deg)}";
|
|
2454
2461
|
(function injectStyle() {
|
|
2455
2462
|
try {
|
|
@@ -2464,11 +2471,131 @@
|
|
|
2464
2471
|
} catch (e) {}
|
|
2465
2472
|
})();
|
|
2466
2473
|
|
|
2474
|
+
// Hover hints: a row keeps one line of text; its explanation shows up in a
|
|
2475
|
+
// small box beside the pointer after a short delay. One shared node, so
|
|
2476
|
+
// nothing has to be cleaned up per row.
|
|
2477
|
+
var TIP_ID = "dsh-notify-me-tip";
|
|
2478
|
+
var tipEl = null;
|
|
2479
|
+
var tipTimer = null;
|
|
2480
|
+
var tipShown = false;
|
|
2481
|
+
var tipX = 0;
|
|
2482
|
+
var tipY = 0;
|
|
2483
|
+
function tipNode() {
|
|
2484
|
+
try {
|
|
2485
|
+
if (tipEl && tipEl.parentNode) return tipEl;
|
|
2486
|
+
if (typeof document === "undefined" || !document.body) return null;
|
|
2487
|
+
var node = document.createElement("div");
|
|
2488
|
+
node.id = TIP_ID;
|
|
2489
|
+
node.className = "dnm-tip";
|
|
2490
|
+
node.setAttribute("role", "tooltip");
|
|
2491
|
+
document.body.appendChild(node);
|
|
2492
|
+
tipEl = node;
|
|
2493
|
+
return node;
|
|
2494
|
+
} catch (e) { return null; }
|
|
2495
|
+
}
|
|
2496
|
+
function hideTip() {
|
|
2497
|
+
if (tipTimer) { clearTimeout(tipTimer); tipTimer = null; }
|
|
2498
|
+
if (!tipShown) return;
|
|
2499
|
+
tipShown = false;
|
|
2500
|
+
if (tipEl) tipEl.className = "dnm-tip";
|
|
2501
|
+
}
|
|
2502
|
+
// Keep the box on screen: flip left of the pointer near the right edge,
|
|
2503
|
+
// flip above it near the bottom.
|
|
2504
|
+
function placeTip() {
|
|
2505
|
+
var node = tipEl;
|
|
2506
|
+
if (!node || !tipShown) return;
|
|
2507
|
+
var pad = 12;
|
|
2508
|
+
var rect = node.getBoundingClientRect();
|
|
2509
|
+
var vw = window.innerWidth || 0;
|
|
2510
|
+
var vh = window.innerHeight || 0;
|
|
2511
|
+
var x = tipX + 14;
|
|
2512
|
+
if (x + rect.width + pad > vw) x = tipX - rect.width - 14;
|
|
2513
|
+
if (x < pad) x = pad;
|
|
2514
|
+
var y = tipY + 18;
|
|
2515
|
+
if (y + rect.height + pad > vh) y = tipY - rect.height - 12;
|
|
2516
|
+
if (y < pad) y = pad;
|
|
2517
|
+
node.style.left = Math.round(x) + "px";
|
|
2518
|
+
node.style.top = Math.round(y) + "px";
|
|
2519
|
+
}
|
|
2520
|
+
function showTip(text) {
|
|
2521
|
+
var node = tipNode();
|
|
2522
|
+
if (!node) return;
|
|
2523
|
+
node.textContent = text;
|
|
2524
|
+
tipShown = true;
|
|
2525
|
+
node.className = "dnm-tip on";
|
|
2526
|
+
placeTip();
|
|
2527
|
+
}
|
|
2528
|
+
function tipHandlers(text) {
|
|
2529
|
+
return {
|
|
2530
|
+
onMouseEnter: function (e) {
|
|
2531
|
+
tipX = e.clientX;
|
|
2532
|
+
tipY = e.clientY;
|
|
2533
|
+
if (tipTimer) clearTimeout(tipTimer);
|
|
2534
|
+
tipTimer = setTimeout(function () { tipTimer = null; showTip(text); }, 320);
|
|
2535
|
+
},
|
|
2536
|
+
onMouseMove: function (e) {
|
|
2537
|
+
tipX = e.clientX;
|
|
2538
|
+
tipY = e.clientY;
|
|
2539
|
+
if (tipShown) placeTip();
|
|
2540
|
+
},
|
|
2541
|
+
onMouseLeave: hideTip
|
|
2542
|
+
};
|
|
2543
|
+
}
|
|
2544
|
+
// Attach the tooltip to the label text only. Hovering the switch or the
|
|
2545
|
+
// slider on the right of a row should not pop an explanation.
|
|
2546
|
+
function tipTarget(node, hintText) {
|
|
2547
|
+
if (!node || typeof node !== "object") return node;
|
|
2548
|
+
var props = node.props || {};
|
|
2549
|
+
var className = String(props.className || "");
|
|
2550
|
+
// React keeps children in props.children; the smoke harness keeps them on
|
|
2551
|
+
// the node itself, so look in both places.
|
|
2552
|
+
var kids = props.children;
|
|
2553
|
+
if (kids === undefined && node.children) kids = node.children.length === 1 ? node.children[0] : node.children;
|
|
2554
|
+
if (className.indexOf("dnm-rowLabel") >= 0) {
|
|
2555
|
+
var handlers = tipHandlers(hintText);
|
|
2556
|
+
var merged = {};
|
|
2557
|
+
for (var k in props) merged[k] = props[k];
|
|
2558
|
+
merged.className = className + " dnm-rowTip";
|
|
2559
|
+
merged["data-dnm-tip"] = hintText;
|
|
2560
|
+
merged.onMouseEnter = handlers.onMouseEnter;
|
|
2561
|
+
merged.onMouseMove = handlers.onMouseMove;
|
|
2562
|
+
merged.onMouseLeave = handlers.onMouseLeave;
|
|
2563
|
+
return h(node.type, merged, kids);
|
|
2564
|
+
}
|
|
2565
|
+
if (Array.isArray(kids)) {
|
|
2566
|
+
var changed = false;
|
|
2567
|
+
var next = [];
|
|
2568
|
+
for (var i = 0; i < kids.length; i++) {
|
|
2569
|
+
var mapped = tipTarget(kids[i], hintText);
|
|
2570
|
+
if (mapped !== kids[i]) changed = true;
|
|
2571
|
+
next.push(mapped);
|
|
2572
|
+
}
|
|
2573
|
+
return changed ? h(node.type, props, next) : node;
|
|
2574
|
+
}
|
|
2575
|
+
var single = tipTarget(kids, hintText);
|
|
2576
|
+
return single === kids ? node : h(node.type, props, single);
|
|
2577
|
+
}
|
|
2578
|
+
// A row that has an explanation: single-line label, text in the tooltip.
|
|
2579
|
+
function tipRow(className, hintText, children) {
|
|
2580
|
+
if (!hintText) return h("div", { className: className }, children);
|
|
2581
|
+
var kids = Array.isArray(children)
|
|
2582
|
+
? children.map(function (child) { return tipTarget(child, hintText); })
|
|
2583
|
+
: tipTarget(children, hintText);
|
|
2584
|
+
return h("div", { className: className }, kids);
|
|
2585
|
+
}
|
|
2586
|
+
// Read-screen-only copy of the tooltip text.
|
|
2587
|
+
function srOnly(text) {
|
|
2588
|
+
return text ? h("span", { className: "dnm-srOnly" }, text) : null;
|
|
2589
|
+
}
|
|
2590
|
+
(function tipDismissOnScroll() {
|
|
2591
|
+
try { window.addEventListener("scroll", hideTip, true); } catch (e) {}
|
|
2592
|
+
})();
|
|
2593
|
+
|
|
2467
2594
|
function rowSwitch(key, labelText, hintText, checked, onChange) {
|
|
2468
|
-
return
|
|
2595
|
+
return tipRow("dnm-row", hintText, [
|
|
2469
2596
|
h("div", { className: "dnm-rowText" }, [
|
|
2470
2597
|
h("div", { className: "dnm-rowLabel" }, labelText),
|
|
2471
|
-
|
|
2598
|
+
srOnly(hintText)
|
|
2472
2599
|
]),
|
|
2473
2600
|
h("button", {
|
|
2474
2601
|
type: "button",
|
|
@@ -2541,7 +2668,7 @@
|
|
|
2541
2668
|
h("div", { className: "dnm-row" }, [
|
|
2542
2669
|
h("div", { className: "dnm-rowText" }, [
|
|
2543
2670
|
h("div", { className: "dnm-rowLabel" }, labelText),
|
|
2544
|
-
h("div", { className: "dnm-
|
|
2671
|
+
h("div", { className: "dnm-rowValue" }, note)
|
|
2545
2672
|
]),
|
|
2546
2673
|
h("div", { className: "dnm-btnRow" }, [
|
|
2547
2674
|
h("select", {
|
|
@@ -2569,11 +2696,12 @@
|
|
|
2569
2696
|
])
|
|
2570
2697
|
];
|
|
2571
2698
|
if (mode !== "custom") return rows;
|
|
2572
|
-
|
|
2699
|
+
var pickNote = (rec ? Math.round((rec.size || 0) / 1024) + " KB · " : t("soundNone") + " · ")
|
|
2700
|
+
+ "≤" + Math.round(SOUND_MAX_BYTES / 1024) + " KB";
|
|
2701
|
+
rows.push(tipRow("dnm-row", pickNote, [
|
|
2573
2702
|
h("div", { className: "dnm-rowText" }, [
|
|
2574
2703
|
h("div", { className: "dnm-rowLabel" }, t("soundPick")),
|
|
2575
|
-
|
|
2576
|
-
+ "≤" + Math.round(SOUND_MAX_BYTES / 1024) + " KB")
|
|
2704
|
+
srOnly(pickNote)
|
|
2577
2705
|
]),
|
|
2578
2706
|
h("div", { className: "dnm-btnRow" }, [
|
|
2579
2707
|
h("input", {
|
|
@@ -2726,6 +2854,7 @@
|
|
|
2726
2854
|
var permOK = ("Notification" in window) ? Notification.permission === "granted" : false;
|
|
2727
2855
|
var resolvedLang = effectiveLang();
|
|
2728
2856
|
var resolvedLangName = resolvedLang === "en" ? t("langEn") : t("langZh");
|
|
2857
|
+
var langNote = resolvedLangName + (cfg.language === "auto" ? t("langAutoNote") : "");
|
|
2729
2858
|
// The environment row states what detection saw whenever the manual
|
|
2730
2859
|
// choice disagrees with it — the override exists for hosts where the
|
|
2731
2860
|
// protocol read comes out wrong, so the divergence must be visible.
|
|
@@ -2755,10 +2884,10 @@
|
|
|
2755
2884
|
var advState = React.useState(false);
|
|
2756
2885
|
var advancedOpen = advState[0];
|
|
2757
2886
|
var setAdvancedOpen = advState[1];
|
|
2758
|
-
var testRow =
|
|
2887
|
+
var testRow = tipRow("dnm-row dnm-rowStack", t("testHint"), [
|
|
2759
2888
|
h("div", { className: "dnm-rowText" }, [
|
|
2760
2889
|
h("div", { className: "dnm-rowLabel" }, t("testTitle")),
|
|
2761
|
-
|
|
2890
|
+
srOnly(t("testHint"))
|
|
2762
2891
|
]),
|
|
2763
2892
|
h("div", { className: "dnm-btnRow" }, [
|
|
2764
2893
|
h("button", { type: "button", className: "dnm-btn", disabled: !cfg.enabled, onClick: function () { runTest("attention"); } }, t("testAttention")),
|
|
@@ -2784,10 +2913,10 @@
|
|
|
2784
2913
|
}),
|
|
2785
2914
|
rowSwitch("toast", t("toast"), toastHintText(), cfg.toast, function (v) { patch({ toast: v }); }),
|
|
2786
2915
|
rowSwitch("overlay", t("overlay"), t("overlayHint"), cfg.overlay, function (v) { patch({ overlay: v }); }),
|
|
2787
|
-
cfg.overlay ?
|
|
2916
|
+
cfg.overlay ? tipRow("dnm-row dnm-rowSub", t("overlayCornerHint"), [
|
|
2788
2917
|
h("div", { className: "dnm-rowText" }, [
|
|
2789
2918
|
h("div", { className: "dnm-rowLabel" }, t("overlayCorner")),
|
|
2790
|
-
|
|
2919
|
+
srOnly(t("overlayCornerHint"))
|
|
2791
2920
|
]),
|
|
2792
2921
|
h("select", {
|
|
2793
2922
|
className: "dnm-select",
|
|
@@ -2880,10 +3009,10 @@
|
|
|
2880
3009
|
[rowSwitch("externalEnabled", t("externalEnable"), t("externalEnableHint"), cfg.externalEnabled, function (v) { patch({ externalEnabled: v }); })],
|
|
2881
3010
|
[rowSwitch("externalAttention", t("externalAttentionLabel"), t("externalAttentionHint"), cfg.externalAttention, function (v) { patch({ externalAttention: v }); })],
|
|
2882
3011
|
[rowSwitch("externalDone", t("externalDoneLabel"), t("externalDoneHint"), cfg.externalDone, function (v) { patch({ externalDone: v }); })],
|
|
2883
|
-
[
|
|
3012
|
+
[tipRow("dnm-row", t("externalTargetsHint"), [
|
|
2884
3013
|
h("div", { className: "dnm-rowText" }, [
|
|
2885
3014
|
h("div", { className: "dnm-rowLabel" }, t("externalTargetsLabel")),
|
|
2886
|
-
|
|
3015
|
+
srOnly(t("externalTargetsHint"))
|
|
2887
3016
|
])
|
|
2888
3017
|
])],
|
|
2889
3018
|
externalRows(),
|
|
@@ -2902,10 +3031,10 @@
|
|
|
2902
3031
|
}, t("externalAdd"))
|
|
2903
3032
|
])
|
|
2904
3033
|
])],
|
|
2905
|
-
[
|
|
3034
|
+
[tipRow("dnm-row", t("externalTestHint"), [
|
|
2906
3035
|
h("div", { className: "dnm-rowText" }, [
|
|
2907
3036
|
h("div", { className: "dnm-rowLabel" }, t("externalTestLabel")),
|
|
2908
|
-
|
|
3037
|
+
srOnly(t("externalTestHint"))
|
|
2909
3038
|
]),
|
|
2910
3039
|
h("div", { className: "dnm-btnRow" }, [
|
|
2911
3040
|
h("button", {
|
|
@@ -2920,10 +3049,10 @@
|
|
|
2920
3049
|
)),
|
|
2921
3050
|
secTitle(t("secDiag")),
|
|
2922
3051
|
card([
|
|
2923
|
-
|
|
3052
|
+
tipRow("dnm-row", envHint, [
|
|
2924
3053
|
h("div", { className: "dnm-rowText" }, [
|
|
2925
3054
|
h("div", { className: "dnm-rowLabel" }, t("hostEnv")),
|
|
2926
|
-
|
|
3055
|
+
srOnly(envHint)
|
|
2927
3056
|
]),
|
|
2928
3057
|
h("select", {
|
|
2929
3058
|
className: "dnm-select",
|
|
@@ -2936,10 +3065,10 @@
|
|
|
2936
3065
|
h("option", { value: "web" }, t("hostEnvWeb"))
|
|
2937
3066
|
])
|
|
2938
3067
|
]),
|
|
2939
|
-
|
|
3068
|
+
tipRow("dnm-row", langNote, [
|
|
2940
3069
|
h("div", { className: "dnm-rowText" }, [
|
|
2941
3070
|
h("div", { className: "dnm-rowLabel" }, t("language")),
|
|
2942
|
-
|
|
3071
|
+
srOnly(langNote)
|
|
2943
3072
|
]),
|
|
2944
3073
|
h("select", {
|
|
2945
3074
|
className: "dnm-select",
|
|
@@ -2952,10 +3081,10 @@
|
|
|
2952
3081
|
h("option", { value: "en" }, t("langEn"))
|
|
2953
3082
|
])
|
|
2954
3083
|
]),
|
|
2955
|
-
|
|
3084
|
+
tipRow("dnm-row", t("resetHint"), [
|
|
2956
3085
|
h("div", { className: "dnm-rowText" }, [
|
|
2957
3086
|
h("div", { className: "dnm-rowLabel" }, t("reset")),
|
|
2958
|
-
|
|
3087
|
+
srOnly(t("resetHint"))
|
|
2959
3088
|
]),
|
|
2960
3089
|
h("button", { type: "button", className: "dnm-btn", onClick: function () {
|
|
2961
3090
|
// api.resetConfig() also drops the picked cue files, which are
|
package/package.json
CHANGED