dsh-wisp 1.34.0 → 1.34.1
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/README.md +33 -0
- package/lib/client.js +36 -34
- package/lib/client.template.js +36 -34
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -448,6 +448,39 @@ node tools/audit-log.mjs --confirm <manifest> # 生成后:并入代理登
|
|
|
448
448
|
|
|
449
449
|
## 变更
|
|
450
450
|
|
|
451
|
+
### 1.34.1
|
|
452
|
+
|
|
453
|
+
**菜单改成紧凑刻度。** 上一版样式好看但**占地太大** —— 对陪伴插件的浮层来说不合适,
|
|
454
|
+
它不该占掉屏幕的观感重心。
|
|
455
|
+
|
|
456
|
+
压缩是分两轮做的,因为**高度**才是占屏幕的主因(宽度只是一部分):
|
|
457
|
+
|
|
458
|
+
| | 1.34.0 | 1.34.1 |
|
|
459
|
+
|---|---|---|
|
|
460
|
+
| 面板宽 | 188px | **174px** |
|
|
461
|
+
| 行高 | 8×10 padding | **4×6** |
|
|
462
|
+
| 字号 | 12.5px | **11px** |
|
|
463
|
+
| 圆角 | 14px | **9px** |
|
|
464
|
+
| 分隔线外边距 | 6px 8px | **3px 4px** |
|
|
465
|
+
| 摘要胶囊 | 9.5px / 15px 行高 | **9px / 13px** |
|
|
466
|
+
| 开关 | 30×16 | **22×12** |
|
|
467
|
+
| 滑块轨 / 旋钮 | 18 / 13px | **12 / 9px** |
|
|
468
|
+
| 角落键帽 | 7×4 padding | **3×3** |
|
|
469
|
+
| 子面板宽 | 164px | **150px** |
|
|
470
|
+
| 字形槽 | 14px | **12px** |
|
|
471
|
+
|
|
472
|
+
实测(真浏览器截图裁剪框):**452×500 → 363×334**,即**宽 −20%、高 −33%**。
|
|
473
|
+
字号到 11px 就停 —— 再小在这个尺寸的浮层上就不叫可读了。
|
|
474
|
+
|
|
475
|
+
**顺带一个副作用**:面板变窄之后,她在屏幕**右下角**时子面板已经能放在右侧
|
|
476
|
+
(以前放不下要翻到左边)。定位算式用的是"菜单宽度 + 面板宽度",所以宽度一变它自己就跟上了 ——
|
|
477
|
+
这也是那条"四角几何"检查的意义:它每次都验一遍真实关系。
|
|
478
|
+
|
|
479
|
+
`MENU_W` / `SUBMENU_W` 两个估算常量跟着更新(前者用于菜单夹取,后者必须等于 CSS 宽度 ——
|
|
480
|
+
定位算式的正确性依赖这一点)。
|
|
481
|
+
|
|
482
|
+
### 1.34.0
|
|
483
|
+
|
|
451
484
|
### 1.34.0
|
|
452
485
|
|
|
453
486
|
**菜单样式重做。** 这一轮先把"菜单拍下来"这一步补上 —— 样式改动光看代码看不出来。
|
package/lib/client.js
CHANGED
|
@@ -51,7 +51,7 @@ window.__ModuleLoader__.load({
|
|
|
51
51
|
var exports = module.exports
|
|
52
52
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })
|
|
53
53
|
|
|
54
|
-
const VERSION = '1.34.
|
|
54
|
+
const VERSION = '1.34.1'
|
|
55
55
|
|
|
56
56
|
/* 每一版一句话。**必须写当前版本** —— 预检里有一条断言盯着它,
|
|
57
57
|
忘了更新就会红,不会静默过期。 */
|
|
@@ -77,6 +77,7 @@ const WHATS_NEW = {
|
|
|
77
77
|
'1.33.1': '修子菜单位置算错、会压住主菜单的问题。',
|
|
78
78
|
'1.33.2': '修她在屏幕四角时子菜单跟着偏的问题。',
|
|
79
79
|
'1.34.0': '菜单样式重做:摘要做成胶囊、每行都有图标位、键盘焦点看得见。',
|
|
80
|
+
'1.34.1': '菜单改成紧凑刻度,占屏幕小了三成。',
|
|
80
81
|
}
|
|
81
82
|
|
|
82
83
|
/* 更新这件事**这个插件自己做不到**,如实写在代码里,免得以后有人以为能:
|
|
@@ -695,49 +696,50 @@ body[data-ds-dark-theme] .wisp-layer{--wisp-say-fg:#eaf2f8;--wisp-say-bg:rgba(20
|
|
|
695
696
|
.wisp-root[data-mood="attn"] .wisp-body{animation-name:wisp-nudge;animation-duration:1.5s;animation-iteration-count:4}
|
|
696
697
|
@keyframes wisp-nudge{0%,100%{transform:translate3d(0,0,0)}25%{transform:translate3d(-7px,0,0)}75%{transform:translate3d(7px,0,0)}}
|
|
697
698
|
@keyframes wisp-hop{0%,100%{transform:translate3d(0,0,0)}45%{transform:translate3d(0,-16px,0)}}
|
|
698
|
-
/* 菜单与级联子面板共用一套外观变量 —— 面板是菜单的"上一层",只改阴影与浮起量。
|
|
699
|
-
|
|
700
|
-
.wisp-menu-
|
|
699
|
+
/* 菜单与级联子面板共用一套外观变量 —— 面板是菜单的"上一层",只改阴影与浮起量。
|
|
700
|
+
尺寸走**紧凑刻度**:这是陪伴插件的浮层,不该占掉屏幕的观感重心。 */
|
|
701
|
+
.wisp-menu{--wisp-surface:var(--dsw-alias-bg-overlay,var(--wisp-say-bg));--wisp-line:var(--dsw-alias-border-l1,var(--wisp-say-line));--wisp-hover:var(--dsw-alias-bg-layer-2,rgba(120,170,255,.2));--wisp-accent:var(--dsw-alias-brand-primary,#4a7cf7);position:absolute;min-width:164px;max-width:196px;padding:4px;border-radius:9px;font-size:11px;line-height:1.2;color:var(--dsw-alias-label-primary,var(--wisp-say-fg));background:var(--wisp-surface);border:1px solid var(--wisp-line);box-shadow:0 10px 28px rgba(0,0,0,.3);-webkit-backdrop-filter:blur(16px) saturate(160%);backdrop-filter:blur(16px) saturate(160%);pointer-events:auto;animation:wisp-menu .13s ease}
|
|
702
|
+
.wisp-menu-item{display:block;width:100%;padding:4px 6px;border:0;border-radius:6px;background:none;color:inherit;font:inherit;text-align:left;cursor:pointer;white-space:nowrap;transition:background .1s ease,box-shadow .1s ease}
|
|
701
703
|
.wisp-menu-item:hover{background:var(--wisp-hover,rgba(120,170,255,.2))}
|
|
702
704
|
.wisp-menu-item:active{background:var(--wisp-hover,rgba(120,170,255,.2));box-shadow:inset 0 1px 2px rgba(0,0,0,.12)}
|
|
703
705
|
/* 键盘焦点必须是**看得见**的:这些行都是 border:0 的按钮,浏览器默认轮廓很弱。 */
|
|
704
|
-
.wisp-menu-item:focus-visible,.wisp-corner:focus-visible,.wisp-
|
|
705
|
-
.wisp-menu-head{padding:
|
|
706
|
-
.wisp-menu-title{font-size:
|
|
707
|
-
.wisp-menu-sub{
|
|
708
|
-
.wisp-menu-
|
|
709
|
-
.wisp-menu-
|
|
710
|
-
.wisp-menu-
|
|
711
|
-
.wisp-menu-row{display:flex;align-items:center;justify-content:space-between;gap:10px}
|
|
706
|
+
.wisp-menu-item:focus-visible,.wisp-corner:focus-visible,.wisp-slider:focus-visible{outline:2px solid var(--wisp-accent,#4a7cf7);outline-offset:-2px}
|
|
707
|
+
.wisp-menu-head{padding:1px 6px 4px}
|
|
708
|
+
.wisp-menu-title{font-size:11.5px;font-weight:600;letter-spacing:.01em}
|
|
709
|
+
.wisp-menu-sub{font-size:9px;opacity:.6;margin-top:0}
|
|
710
|
+
.wisp-menu-sep{height:1px;margin:3px 4px;background:var(--wisp-line,var(--wisp-say-line));opacity:.5}
|
|
711
|
+
.wisp-menu-hint{padding:4px 6px 0;font-size:9px;opacity:.5;border-top:1px solid var(--wisp-line,var(--wisp-say-line));margin-top:3px}
|
|
712
|
+
.wisp-menu-row{display:flex;align-items:center;justify-content:space-between;gap:8px}
|
|
712
713
|
/* 摘要做成胶囊:收起状态也要能一眼扫到"现在是什么",纯淡字太弱。 */
|
|
713
|
-
.wisp-menu-sum{flex:0 1 auto;min-width:0;padding:
|
|
714
|
+
.wisp-menu-sum{flex:0 1 auto;min-width:0;padding:0 4px;border-radius:999px;background:var(--wisp-hover,rgba(120,170,255,.2));font-size:9px;line-height:13px;opacity:.85;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
714
715
|
/* 主操作(专注):淡色底 + 左侧强调条 + 字形,一眼看出"这是主要动作"。 */
|
|
715
716
|
.wisp-menu-item[data-accent="true"]{position:relative;font-weight:600;color:var(--wisp-accent,inherit);background:linear-gradient(90deg,var(--wisp-hover,rgba(120,170,255,.2)),transparent 88%)}
|
|
716
|
-
.wisp-menu-item[data-accent="true"]::before{content:"";position:absolute;left:
|
|
717
|
+
.wisp-menu-item[data-accent="true"]::before{content:"";position:absolute;left:2px;top:50%;width:2px;height:11px;margin-top:-5.5px;border-radius:1px;background:var(--wisp-accent,#4a7cf7)}
|
|
717
718
|
.wisp-menu-item[data-accent="true"]:hover{background:linear-gradient(90deg,var(--wisp-hover,rgba(120,170,255,.32)),transparent 92%)}
|
|
718
719
|
.wisp-menu-item[data-muted="true"]{opacity:.8}
|
|
719
|
-
|
|
720
|
+
/* 字形槽:每行都留等宽位,标签左边线才对得齐 */
|
|
721
|
+
.wisp-menu-glyph{display:inline-block;width:12px;margin-right:4px;text-align:center;font-size:10.5px;opacity:.72;font-weight:400}
|
|
720
722
|
.wisp-menu-item[data-accent="true"] .wisp-menu-glyph{opacity:1}
|
|
721
|
-
.wisp-menu-caret{opacity:.5;font-size:
|
|
722
|
-
.wisp-switch{flex:0 0 auto;width:
|
|
723
|
-
.wisp-switch[data-on="true"]{background:var(--wisp-accent,#4a7cf7);box-shadow:0 0 0
|
|
724
|
-
.wisp-switch i{position:absolute;top:2px;left:2px;width:
|
|
725
|
-
.wisp-switch[data-on="true"] i{transform:translateX(
|
|
726
|
-
.wisp-slider-row{padding:
|
|
727
|
-
.wisp-slider-top{display:flex;justify-content:space-between;align-items:baseline;font-size:
|
|
723
|
+
.wisp-menu-caret{opacity:.5;font-size:8px;flex:0 0 auto}
|
|
724
|
+
.wisp-switch{flex:0 0 auto;width:22px;height:12px;border-radius:6px;background:rgba(140,160,190,.4);position:relative;transition:background .16s ease}
|
|
725
|
+
.wisp-switch[data-on="true"]{background:var(--wisp-accent,#4a7cf7);box-shadow:0 0 0 2px rgba(74,124,247,.14)}
|
|
726
|
+
.wisp-switch i{position:absolute;top:2px;left:2px;width:8px;height:8px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.28);transition:transform .16s ease}
|
|
727
|
+
.wisp-switch[data-on="true"] i{transform:translateX(10px)}
|
|
728
|
+
.wisp-slider-row{padding:3px 6px 5px}
|
|
729
|
+
.wisp-slider-top{display:flex;justify-content:space-between;align-items:baseline;font-size:9.5px;opacity:.85;margin-bottom:1px}
|
|
728
730
|
.wisp-slider-value{font-variant-numeric:tabular-nums;opacity:.75}
|
|
729
|
-
.wisp-slider{position:relative;height:
|
|
730
|
-
.wisp-slider-track{position:absolute;left:0;right:0;top:
|
|
731
|
-
.wisp-slider-fill{position:absolute;left:0;top:
|
|
732
|
-
.wisp-slider-knob{position:absolute;top:
|
|
733
|
-
.wisp-slider:hover .wisp-slider-knob{transform:scale(1.
|
|
734
|
-
.wisp-slider:active .wisp-slider-knob{transform:scale(1.
|
|
731
|
+
.wisp-slider{position:relative;height:12px;cursor:pointer;outline:none;touch-action:none}
|
|
732
|
+
.wisp-slider-track{position:absolute;left:0;right:0;top:5px;height:2px;border-radius:1px;background:rgba(140,160,190,.4)}
|
|
733
|
+
.wisp-slider-fill{position:absolute;left:0;top:5px;height:2px;border-radius:1px;background:var(--wisp-accent,#4a7cf7)}
|
|
734
|
+
.wisp-slider-knob{position:absolute;top:1px;width:9px;height:9px;margin-left:-5px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.35);transition:transform .1s ease}
|
|
735
|
+
.wisp-slider:hover .wisp-slider-knob{transform:scale(1.15)}
|
|
736
|
+
.wisp-slider:active .wisp-slider-knob{transform:scale(1.25)}
|
|
735
737
|
/* 四个角落做成"键帽":方位是空间的,控件也该长得像方位键。 */
|
|
736
|
-
.wisp-grid2{display:grid;grid-template-columns:1fr 1fr;gap:
|
|
737
|
-
.wisp-grid2 button,.wisp-corner{display:flex;align-items:center;justify-content:center;gap:
|
|
738
|
+
.wisp-grid2{display:grid;grid-template-columns:1fr 1fr;gap:3px;padding:1px 4px 3px}
|
|
739
|
+
.wisp-grid2 button,.wisp-corner{display:flex;align-items:center;justify-content:center;gap:3px;padding:3px 3px;border:1px solid var(--wisp-line,var(--wisp-say-line));border-radius:5px;background:var(--wisp-hover,rgba(120,170,255,.12));color:inherit;font:inherit;font-size:9.5px;cursor:pointer;transition:background .1s ease,border-color .1s ease}
|
|
738
740
|
.wisp-grid2 button:hover,.wisp-corner:hover{background:var(--wisp-hover,rgba(120,170,255,.26))}
|
|
739
741
|
.wisp-grid2 button[data-current="true"],.wisp-corner[data-current="true"]{border-color:var(--wisp-accent,#4a7cf7);color:var(--wisp-accent,inherit);font-weight:600;box-shadow:0 0 0 1px var(--wisp-accent,#4a7cf7) inset}
|
|
740
|
-
.wisp-corner-glyph{font-size:
|
|
742
|
+
.wisp-corner-glyph{font-size:10px;opacity:.7}
|
|
741
743
|
.wisp-root[data-hidden="true"]{display:none}
|
|
742
744
|
.wisp-tab{position:absolute;width:56px;height:56px;padding:0;display:flex;align-items:center;justify-content:center;overflow:hidden;border-radius:16px;border:1px solid var(--dsw-alias-border-l1,var(--wisp-say-line));background:var(--dsw-alias-bg-overlay,var(--wisp-say-bg));box-shadow:0 6px 18px rgba(0,0,0,.22);cursor:pointer;pointer-events:auto;animation:wisp-menu .16s ease;transition:transform .16s ease}
|
|
743
745
|
.wisp-tab:hover{transform:translateY(-2px)}
|
|
@@ -748,7 +750,7 @@ body[data-ds-dark-theme] .wisp-layer{--wisp-say-fg:#eaf2f8;--wisp-say-bg:rgba(20
|
|
|
748
750
|
.wisp-menu-caret{opacity:.55;font-size:10px;flex:0 0 auto}
|
|
749
751
|
/* 级联子菜单:浮在行的**右侧**(放不下时翻到左侧),不把下面的内容推下去。
|
|
750
752
|
与父行顶部对齐、允许轻微重叠 —— 指针从行斜着移到面板上时不会穿出"同一区域"。 */
|
|
751
|
-
.wisp-submenu{--wisp-surface:var(--dsw-alias-bg-overlay,var(--wisp-say-bg));--wisp-line:var(--dsw-alias-border-l1,var(--wisp-say-line));--wisp-hover:var(--dsw-alias-bg-layer-2,rgba(120,170,255,.2));--wisp-accent:var(--dsw-alias-brand-primary,#4a7cf7);position:absolute;box-sizing:border-box;width:
|
|
753
|
+
.wisp-submenu{--wisp-surface:var(--dsw-alias-bg-overlay,var(--wisp-say-bg));--wisp-line:var(--dsw-alias-border-l1,var(--wisp-say-line));--wisp-hover:var(--dsw-alias-bg-layer-2,rgba(120,170,255,.2));--wisp-accent:var(--dsw-alias-brand-primary,#4a7cf7);position:absolute;box-sizing:border-box;width:150px;padding:4px;border-radius:9px;font-size:11px;line-height:1.2;color:var(--dsw-alias-label-primary,var(--wisp-say-fg));background:var(--dsw-alias-bg-overlay,var(--wisp-say-bg));border:1px solid var(--dsw-alias-border-l1,var(--wisp-say-line));box-shadow:0 16px 40px rgba(0,0,0,.34),0 2px 6px rgba(0,0,0,.18);-webkit-backdrop-filter:blur(18px) saturate(170%);backdrop-filter:blur(18px) saturate(170%);pointer-events:auto;animation:wisp-fade .12s ease}
|
|
752
754
|
@keyframes wisp-fade{0%{opacity:0}100%{opacity:1}}
|
|
753
755
|
.wisp-menu-sub{padding-left:10px}
|
|
754
756
|
.wisp-menu-sub .wisp-menu-item{padding-left:12px;opacity:.94}
|
|
@@ -2030,7 +2032,7 @@ body[data-ds-dark-theme] .wisp-layer{--wisp-say-fg:#eaf2f8;--wisp-say-bg:rgba(20
|
|
|
2030
2032
|
/* ---- 右键 = 叫回原位 ----
|
|
2031
2033
|
她大了之后很容易被拖到看不见的地方,而"恢复位置"原先只能开 Console。
|
|
2032
2034
|
现在右键她本体弹出菜单,归位只是其中一项。 */
|
|
2033
|
-
const MENU_W =
|
|
2035
|
+
const MENU_W = 164
|
|
2034
2036
|
const MENU_ITEM_H = 30
|
|
2035
2037
|
const MENU_PAD = 10
|
|
2036
2038
|
let menuEl = null
|
|
@@ -2231,7 +2233,7 @@ body[data-ds-dark-theme] .wisp-layer{--wisp-say-fg:#eaf2f8;--wisp-say-bg:rgba(20
|
|
|
2231
2233
|
延迟是 hover intent:鼠标只是路过一行,不该弹出东西。 */
|
|
2232
2234
|
const HOVER_OPEN_MS = 140
|
|
2233
2235
|
const HOVER_CLOSE_MS = 260
|
|
2234
|
-
const SUBMENU_W =
|
|
2236
|
+
const SUBMENU_W = 150
|
|
2235
2237
|
let flyoutName = ''
|
|
2236
2238
|
let flyoutEl = null
|
|
2237
2239
|
let flyoutRow = null
|
package/lib/client.template.js
CHANGED
|
@@ -51,7 +51,7 @@ window.__ModuleLoader__.load({
|
|
|
51
51
|
var exports = module.exports
|
|
52
52
|
Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' })
|
|
53
53
|
|
|
54
|
-
const VERSION = '1.34.
|
|
54
|
+
const VERSION = '1.34.1'
|
|
55
55
|
|
|
56
56
|
/* 每一版一句话。**必须写当前版本** —— 预检里有一条断言盯着它,
|
|
57
57
|
忘了更新就会红,不会静默过期。 */
|
|
@@ -77,6 +77,7 @@ const WHATS_NEW = {
|
|
|
77
77
|
'1.33.1': '修子菜单位置算错、会压住主菜单的问题。',
|
|
78
78
|
'1.33.2': '修她在屏幕四角时子菜单跟着偏的问题。',
|
|
79
79
|
'1.34.0': '菜单样式重做:摘要做成胶囊、每行都有图标位、键盘焦点看得见。',
|
|
80
|
+
'1.34.1': '菜单改成紧凑刻度,占屏幕小了三成。',
|
|
80
81
|
}
|
|
81
82
|
|
|
82
83
|
/* 更新这件事**这个插件自己做不到**,如实写在代码里,免得以后有人以为能:
|
|
@@ -644,49 +645,50 @@ body[data-ds-dark-theme] .wisp-layer{--wisp-say-fg:#eaf2f8;--wisp-say-bg:rgba(20
|
|
|
644
645
|
.wisp-root[data-mood="attn"] .wisp-body{animation-name:wisp-nudge;animation-duration:1.5s;animation-iteration-count:4}
|
|
645
646
|
@keyframes wisp-nudge{0%,100%{transform:translate3d(0,0,0)}25%{transform:translate3d(-7px,0,0)}75%{transform:translate3d(7px,0,0)}}
|
|
646
647
|
@keyframes wisp-hop{0%,100%{transform:translate3d(0,0,0)}45%{transform:translate3d(0,-16px,0)}}
|
|
647
|
-
/* 菜单与级联子面板共用一套外观变量 —— 面板是菜单的"上一层",只改阴影与浮起量。
|
|
648
|
-
|
|
649
|
-
.wisp-menu-
|
|
648
|
+
/* 菜单与级联子面板共用一套外观变量 —— 面板是菜单的"上一层",只改阴影与浮起量。
|
|
649
|
+
尺寸走**紧凑刻度**:这是陪伴插件的浮层,不该占掉屏幕的观感重心。 */
|
|
650
|
+
.wisp-menu{--wisp-surface:var(--dsw-alias-bg-overlay,var(--wisp-say-bg));--wisp-line:var(--dsw-alias-border-l1,var(--wisp-say-line));--wisp-hover:var(--dsw-alias-bg-layer-2,rgba(120,170,255,.2));--wisp-accent:var(--dsw-alias-brand-primary,#4a7cf7);position:absolute;min-width:164px;max-width:196px;padding:4px;border-radius:9px;font-size:11px;line-height:1.2;color:var(--dsw-alias-label-primary,var(--wisp-say-fg));background:var(--wisp-surface);border:1px solid var(--wisp-line);box-shadow:0 10px 28px rgba(0,0,0,.3);-webkit-backdrop-filter:blur(16px) saturate(160%);backdrop-filter:blur(16px) saturate(160%);pointer-events:auto;animation:wisp-menu .13s ease}
|
|
651
|
+
.wisp-menu-item{display:block;width:100%;padding:4px 6px;border:0;border-radius:6px;background:none;color:inherit;font:inherit;text-align:left;cursor:pointer;white-space:nowrap;transition:background .1s ease,box-shadow .1s ease}
|
|
650
652
|
.wisp-menu-item:hover{background:var(--wisp-hover,rgba(120,170,255,.2))}
|
|
651
653
|
.wisp-menu-item:active{background:var(--wisp-hover,rgba(120,170,255,.2));box-shadow:inset 0 1px 2px rgba(0,0,0,.12)}
|
|
652
654
|
/* 键盘焦点必须是**看得见**的:这些行都是 border:0 的按钮,浏览器默认轮廓很弱。 */
|
|
653
|
-
.wisp-menu-item:focus-visible,.wisp-corner:focus-visible,.wisp-
|
|
654
|
-
.wisp-menu-head{padding:
|
|
655
|
-
.wisp-menu-title{font-size:
|
|
656
|
-
.wisp-menu-sub{
|
|
657
|
-
.wisp-menu-
|
|
658
|
-
.wisp-menu-
|
|
659
|
-
.wisp-menu-
|
|
660
|
-
.wisp-menu-row{display:flex;align-items:center;justify-content:space-between;gap:10px}
|
|
655
|
+
.wisp-menu-item:focus-visible,.wisp-corner:focus-visible,.wisp-slider:focus-visible{outline:2px solid var(--wisp-accent,#4a7cf7);outline-offset:-2px}
|
|
656
|
+
.wisp-menu-head{padding:1px 6px 4px}
|
|
657
|
+
.wisp-menu-title{font-size:11.5px;font-weight:600;letter-spacing:.01em}
|
|
658
|
+
.wisp-menu-sub{font-size:9px;opacity:.6;margin-top:0}
|
|
659
|
+
.wisp-menu-sep{height:1px;margin:3px 4px;background:var(--wisp-line,var(--wisp-say-line));opacity:.5}
|
|
660
|
+
.wisp-menu-hint{padding:4px 6px 0;font-size:9px;opacity:.5;border-top:1px solid var(--wisp-line,var(--wisp-say-line));margin-top:3px}
|
|
661
|
+
.wisp-menu-row{display:flex;align-items:center;justify-content:space-between;gap:8px}
|
|
661
662
|
/* 摘要做成胶囊:收起状态也要能一眼扫到"现在是什么",纯淡字太弱。 */
|
|
662
|
-
.wisp-menu-sum{flex:0 1 auto;min-width:0;padding:
|
|
663
|
+
.wisp-menu-sum{flex:0 1 auto;min-width:0;padding:0 4px;border-radius:999px;background:var(--wisp-hover,rgba(120,170,255,.2));font-size:9px;line-height:13px;opacity:.85;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}
|
|
663
664
|
/* 主操作(专注):淡色底 + 左侧强调条 + 字形,一眼看出"这是主要动作"。 */
|
|
664
665
|
.wisp-menu-item[data-accent="true"]{position:relative;font-weight:600;color:var(--wisp-accent,inherit);background:linear-gradient(90deg,var(--wisp-hover,rgba(120,170,255,.2)),transparent 88%)}
|
|
665
|
-
.wisp-menu-item[data-accent="true"]::before{content:"";position:absolute;left:
|
|
666
|
+
.wisp-menu-item[data-accent="true"]::before{content:"";position:absolute;left:2px;top:50%;width:2px;height:11px;margin-top:-5.5px;border-radius:1px;background:var(--wisp-accent,#4a7cf7)}
|
|
666
667
|
.wisp-menu-item[data-accent="true"]:hover{background:linear-gradient(90deg,var(--wisp-hover,rgba(120,170,255,.32)),transparent 92%)}
|
|
667
668
|
.wisp-menu-item[data-muted="true"]{opacity:.8}
|
|
668
|
-
|
|
669
|
+
/* 字形槽:每行都留等宽位,标签左边线才对得齐 */
|
|
670
|
+
.wisp-menu-glyph{display:inline-block;width:12px;margin-right:4px;text-align:center;font-size:10.5px;opacity:.72;font-weight:400}
|
|
669
671
|
.wisp-menu-item[data-accent="true"] .wisp-menu-glyph{opacity:1}
|
|
670
|
-
.wisp-menu-caret{opacity:.5;font-size:
|
|
671
|
-
.wisp-switch{flex:0 0 auto;width:
|
|
672
|
-
.wisp-switch[data-on="true"]{background:var(--wisp-accent,#4a7cf7);box-shadow:0 0 0
|
|
673
|
-
.wisp-switch i{position:absolute;top:2px;left:2px;width:
|
|
674
|
-
.wisp-switch[data-on="true"] i{transform:translateX(
|
|
675
|
-
.wisp-slider-row{padding:
|
|
676
|
-
.wisp-slider-top{display:flex;justify-content:space-between;align-items:baseline;font-size:
|
|
672
|
+
.wisp-menu-caret{opacity:.5;font-size:8px;flex:0 0 auto}
|
|
673
|
+
.wisp-switch{flex:0 0 auto;width:22px;height:12px;border-radius:6px;background:rgba(140,160,190,.4);position:relative;transition:background .16s ease}
|
|
674
|
+
.wisp-switch[data-on="true"]{background:var(--wisp-accent,#4a7cf7);box-shadow:0 0 0 2px rgba(74,124,247,.14)}
|
|
675
|
+
.wisp-switch i{position:absolute;top:2px;left:2px;width:8px;height:8px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.28);transition:transform .16s ease}
|
|
676
|
+
.wisp-switch[data-on="true"] i{transform:translateX(10px)}
|
|
677
|
+
.wisp-slider-row{padding:3px 6px 5px}
|
|
678
|
+
.wisp-slider-top{display:flex;justify-content:space-between;align-items:baseline;font-size:9.5px;opacity:.85;margin-bottom:1px}
|
|
677
679
|
.wisp-slider-value{font-variant-numeric:tabular-nums;opacity:.75}
|
|
678
|
-
.wisp-slider{position:relative;height:
|
|
679
|
-
.wisp-slider-track{position:absolute;left:0;right:0;top:
|
|
680
|
-
.wisp-slider-fill{position:absolute;left:0;top:
|
|
681
|
-
.wisp-slider-knob{position:absolute;top:
|
|
682
|
-
.wisp-slider:hover .wisp-slider-knob{transform:scale(1.
|
|
683
|
-
.wisp-slider:active .wisp-slider-knob{transform:scale(1.
|
|
680
|
+
.wisp-slider{position:relative;height:12px;cursor:pointer;outline:none;touch-action:none}
|
|
681
|
+
.wisp-slider-track{position:absolute;left:0;right:0;top:5px;height:2px;border-radius:1px;background:rgba(140,160,190,.4)}
|
|
682
|
+
.wisp-slider-fill{position:absolute;left:0;top:5px;height:2px;border-radius:1px;background:var(--wisp-accent,#4a7cf7)}
|
|
683
|
+
.wisp-slider-knob{position:absolute;top:1px;width:9px;height:9px;margin-left:-5px;border-radius:50%;background:#fff;box-shadow:0 1px 2px rgba(0,0,0,.35);transition:transform .1s ease}
|
|
684
|
+
.wisp-slider:hover .wisp-slider-knob{transform:scale(1.15)}
|
|
685
|
+
.wisp-slider:active .wisp-slider-knob{transform:scale(1.25)}
|
|
684
686
|
/* 四个角落做成"键帽":方位是空间的,控件也该长得像方位键。 */
|
|
685
|
-
.wisp-grid2{display:grid;grid-template-columns:1fr 1fr;gap:
|
|
686
|
-
.wisp-grid2 button,.wisp-corner{display:flex;align-items:center;justify-content:center;gap:
|
|
687
|
+
.wisp-grid2{display:grid;grid-template-columns:1fr 1fr;gap:3px;padding:1px 4px 3px}
|
|
688
|
+
.wisp-grid2 button,.wisp-corner{display:flex;align-items:center;justify-content:center;gap:3px;padding:3px 3px;border:1px solid var(--wisp-line,var(--wisp-say-line));border-radius:5px;background:var(--wisp-hover,rgba(120,170,255,.12));color:inherit;font:inherit;font-size:9.5px;cursor:pointer;transition:background .1s ease,border-color .1s ease}
|
|
687
689
|
.wisp-grid2 button:hover,.wisp-corner:hover{background:var(--wisp-hover,rgba(120,170,255,.26))}
|
|
688
690
|
.wisp-grid2 button[data-current="true"],.wisp-corner[data-current="true"]{border-color:var(--wisp-accent,#4a7cf7);color:var(--wisp-accent,inherit);font-weight:600;box-shadow:0 0 0 1px var(--wisp-accent,#4a7cf7) inset}
|
|
689
|
-
.wisp-corner-glyph{font-size:
|
|
691
|
+
.wisp-corner-glyph{font-size:10px;opacity:.7}
|
|
690
692
|
.wisp-root[data-hidden="true"]{display:none}
|
|
691
693
|
.wisp-tab{position:absolute;width:56px;height:56px;padding:0;display:flex;align-items:center;justify-content:center;overflow:hidden;border-radius:16px;border:1px solid var(--dsw-alias-border-l1,var(--wisp-say-line));background:var(--dsw-alias-bg-overlay,var(--wisp-say-bg));box-shadow:0 6px 18px rgba(0,0,0,.22);cursor:pointer;pointer-events:auto;animation:wisp-menu .16s ease;transition:transform .16s ease}
|
|
692
694
|
.wisp-tab:hover{transform:translateY(-2px)}
|
|
@@ -697,7 +699,7 @@ body[data-ds-dark-theme] .wisp-layer{--wisp-say-fg:#eaf2f8;--wisp-say-bg:rgba(20
|
|
|
697
699
|
.wisp-menu-caret{opacity:.55;font-size:10px;flex:0 0 auto}
|
|
698
700
|
/* 级联子菜单:浮在行的**右侧**(放不下时翻到左侧),不把下面的内容推下去。
|
|
699
701
|
与父行顶部对齐、允许轻微重叠 —— 指针从行斜着移到面板上时不会穿出"同一区域"。 */
|
|
700
|
-
.wisp-submenu{--wisp-surface:var(--dsw-alias-bg-overlay,var(--wisp-say-bg));--wisp-line:var(--dsw-alias-border-l1,var(--wisp-say-line));--wisp-hover:var(--dsw-alias-bg-layer-2,rgba(120,170,255,.2));--wisp-accent:var(--dsw-alias-brand-primary,#4a7cf7);position:absolute;box-sizing:border-box;width:
|
|
702
|
+
.wisp-submenu{--wisp-surface:var(--dsw-alias-bg-overlay,var(--wisp-say-bg));--wisp-line:var(--dsw-alias-border-l1,var(--wisp-say-line));--wisp-hover:var(--dsw-alias-bg-layer-2,rgba(120,170,255,.2));--wisp-accent:var(--dsw-alias-brand-primary,#4a7cf7);position:absolute;box-sizing:border-box;width:150px;padding:4px;border-radius:9px;font-size:11px;line-height:1.2;color:var(--dsw-alias-label-primary,var(--wisp-say-fg));background:var(--dsw-alias-bg-overlay,var(--wisp-say-bg));border:1px solid var(--dsw-alias-border-l1,var(--wisp-say-line));box-shadow:0 16px 40px rgba(0,0,0,.34),0 2px 6px rgba(0,0,0,.18);-webkit-backdrop-filter:blur(18px) saturate(170%);backdrop-filter:blur(18px) saturate(170%);pointer-events:auto;animation:wisp-fade .12s ease}
|
|
701
703
|
@keyframes wisp-fade{0%{opacity:0}100%{opacity:1}}
|
|
702
704
|
.wisp-menu-sub{padding-left:10px}
|
|
703
705
|
.wisp-menu-sub .wisp-menu-item{padding-left:12px;opacity:.94}
|
|
@@ -1979,7 +1981,7 @@ body[data-ds-dark-theme] .wisp-layer{--wisp-say-fg:#eaf2f8;--wisp-say-bg:rgba(20
|
|
|
1979
1981
|
/* ---- 右键 = 叫回原位 ----
|
|
1980
1982
|
她大了之后很容易被拖到看不见的地方,而"恢复位置"原先只能开 Console。
|
|
1981
1983
|
现在右键她本体弹出菜单,归位只是其中一项。 */
|
|
1982
|
-
const MENU_W =
|
|
1984
|
+
const MENU_W = 164
|
|
1983
1985
|
const MENU_ITEM_H = 30
|
|
1984
1986
|
const MENU_PAD = 10
|
|
1985
1987
|
let menuEl = null
|
|
@@ -2180,7 +2182,7 @@ body[data-ds-dark-theme] .wisp-layer{--wisp-say-fg:#eaf2f8;--wisp-say-bg:rgba(20
|
|
|
2180
2182
|
延迟是 hover intent:鼠标只是路过一行,不该弹出东西。 */
|
|
2181
2183
|
const HOVER_OPEN_MS = 140
|
|
2182
2184
|
const HOVER_CLOSE_MS = 260
|
|
2183
|
-
const SUBMENU_W =
|
|
2185
|
+
const SUBMENU_W = 150
|
|
2184
2186
|
let flyoutName = ''
|
|
2185
2187
|
let flyoutEl = null
|
|
2186
2188
|
let flyoutRow = null
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "dsh-wisp",
|
|
3
|
-
"version": "1.34.
|
|
3
|
+
"version": "1.34.1",
|
|
4
4
|
"description": "DeepSeek娘 — an unofficial floating desktop companion for the DeepSeek Harness UI. Zero dependencies; sprites inlined as data URIs; schedules on the Client timer service instead of the trapped browser timer globals.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "lib/index.js",
|