Repository navigation
Releases
Releases · huangfuren/dsh-conversation
v1.5.6 — 修复 hover 预览闪现回归(issue #4 重开)
修复
- hover 预览闪现约 45ms 就消失(v1.5.4 起的回归,#4 重开)。
之前的行为:v1.5.4 为「正文滚动后预览留在旧位置」加了滚动清预览,并把它放进「阅读位置跟随」effect
挂载时的立即调用里;而getState()每次调用都新造对象,依赖state的 effect 于是每轮渲染都重跑 ——
任何本地重渲染(hover 自己、搜索输入、透明度拖动)都会在下一帧把刚出现的预览清掉。实测预览插入后
~45ms 即被移出 DOM,指针停在行内也不再复活。现在的行为分三层:
①OutlineManager.getState()改为快照缓存 —— 同一次变更周期内返回同一引用,只有notify()
(以及不走 notify 的revealNode落空分支、performSearch)才失效,依赖state的 effect 只在
真实数据/会话变化时重跑,顺带消掉了每轮渲染的 O(全树)flattenVisible现算与滚动监听器拆除重挂;
② effect 挂载时的立即调用拆出syncActive(),只同步阅读位置,绝不碰预览;
③ 滚动回调里的清预览加 scrollTop 真实变化守卫(基准存 ref 跨重跑保留,effect 重跑时重建基线)——
「收到 scroll 事件」不等于「真滚动了」,位置没动就不清。
说明
- 真实滚动、mouseleave、Enter 跳转、Escape 四条清预览路径全部保持;滚动清预览的原始动机(滚轮滚动时
鼠标不动、浏览器不补发mouseleave)仍然被覆盖。 - 定位回归修复方式与 #4 报告者的 A/B 结论
一致:变体 B(去掉立即调用)验证过的「真实滚动仍能清」由此保留。 - README(中英)安装示例 tag 随本版升到
v1.5.6。
测试
node --check通过;全量 97/97 通过(新增test/preview-flash.test.js9 例:快照引用稳定性 5 例- effect 结构断言 4 例,含「立即调用必须是
syncActive()而非onScroll()」与「清预览必须在 scrollTop
真实变化之后」)。
- effect 结构断言 4 例,含「立即调用必须是
完整说明见 CHANGELOG。
v1.5.5 — 停用代码就地注释保留,逐段标注原因(无行为变更)
变更
- 已停用的右侧刻度条与右上角胶囊代码,就地注释保留并逐段标注原因。这不是功能改动,运行时行为与 v1.5.4 完全一致。
这两套 UI 自7a525af「remove duplicate rail」起就不再挂载(面板收起态的唯一入口是标题栏按钮),
但代码一直留在原处:CSS 两段约 100 行、SessionRail与HistoryOutlineRailWrapper两个组件 71 行、
六条文案、一个 store 字段。留着又不加说明,读代码的人会以为功能只是被关掉了。
现在每段都带「停用保留」说明块,写清四件事:失效原因(渲染点在哪个 commit 移除、当前有无可达路径)、
保留原因(留待功能重启时复用,只注释不删除,便于原地恢复)、恢复方式(去掉注释标记并恢复
组件与槽位注册)、停用日期。 - 顺带处理同一来源的残留:中文词典里错放的两条英文(
panel.railHide/panel.railShow,英文词典中
并不存在同名键)、prefers-reduced-motion里指向这两个已不存在的 class 的两个选择器
(同时把.dsh-conv-panel *,改成.dsh-conv-panel * {,否则悬空逗号会让整条规则失效)、
以及槽位文档里描述刻度条的第 3 条。 - 刻度条组件用逐行注释符而非块注释:
HistoryOutlineRailWrapper内部已有块注释,外层再套一层会提前截断,
把后半段代码变回活代码。
说明
- 老 localStorage 中的
rail键不会被清除,只是不再读取;恢复正常化那一行即可继续复用旧值。 client.js从 3978 行增至 4015 行,净增 37 行 —— 注释说明的代价,换来的是「这段为什么在这儿」不再需要翻 git 历史。
测试
node --check通过;全量 88/88 通过(本版无新增用例,行为未变)。- 另做结构校验:CSS 注释标记 16/16 平衡、花括号 103/103 平衡,生效选择器中含
rail/fab的为 0 条
(这些名字只出现在注释内部)。
完整说明见 CHANGELOG。
v1.5.4 — 修复 hover 预览被裁(issue #4)、触屏拖拽与窄窗口几何
修复
- hover 大纲行看不到预览浮层(1.4.0 起的回归,#4 A)。
1.4.0 把背景模糊写在.dsh-conv-panel本体上,按 CSS 规范backdrop-filter != none会让元素成为
position: fixed后代的包含块,面板内的.dsh-conv-preview不再相对视口定位、而是按面板原点偏移,
再被面板的overflow: hidden裁掉 —— 元素在 DOM 里、内容也对,用户就是看不见。
现在模糊与底色一起挪到.dsh-conv-panel::before(inset: 0/border-radius: inherit/
z-index: -1/pointer-events: none),面板本体只留background: transparent;伪元素不参与包含块判定,
浮层重新以视口为包含块,也不再被裁剪,玻璃观感保持不变(无头 Chromium 截图确认背后条纹仍是糊的)。 - 预览浮层在窄窗口下算出负坐标:落点
left: min(x + 20, innerWidth - 380)在窗口不足 380px 时为负,
top完全没有约束、靠底悬停会越出下沿。现在抽成previewPlacement(),右侧放不下往左夹、底部放不下上移,
最小边距 8px;视口未知时保持原始偏移。 - 预览翻到左侧时压住行首 10px:行内先算「让出 340 + 8」、
previewPlacement()又加一次 20,
净结果是右侧间距 28px、左侧反压 10px。现在行内只给「行的哪一条边」,间距统一由previewPlacement()加;
翻侧判据也从事先的「行在不在窗口右半边」换成previewSideFor()(右缘 + 间距 + 浮层宽是否还放得下)。 - 正文滚动后预览浮层留在旧位置:浮层只由
mouseleave收起,而滚轮滚动时鼠标没动、行自己滑走了,
浏览器不会补发mouseleave。现在正文滚动的 rAF 节流那一拍里顺手清掉预览。 - 触屏 / 触控笔拖不动面板,且会把
pointermove永久留在window上:标题栏缺touch-action
被浏览器判成滚动手势,中途发pointercancel,而代码只监听pointerup,监听器既不解除也不写库。
现在标题栏声明touch-action: none,同时收pointercancel(还原内联left/top/right、不写 localStorage),
组件卸载时也会回收未结束的拖拽。 - 停靠态在窄窗口下整块从左边溢出:
clampPlacementToViewport()只处理有left的拖拽态,
停靠态用right: 16,窗口比「面板宽 + 边距」还窄时左缘算成负值(720 档落在 700 宽窗口 ⇒left = -36)。
现在右锚点折算成left: 0并去掉right,贴住左缘;窗口够宽时仍走右锚点。
变更
- 透明度滑杆文案与真实语义对齐(#4 B,行为未变、只改文案):
标签「面板透明度」→「背景不透明度」,tooltip 写明 40–100% 的取值范围、只影响背景不动文字、
数值越低背景越透且背后模糊越强,英文同步为Background opacity。模糊强度按不透明度反向派生是设计使然,
这条说明同时写进了 README(中英)。 - README(中英)删掉 1.3.1 起已停用、但文档仍在宣称的三样东西:右侧刻度条、右上角胶囊兜底、
底栏刻度条开关;改为说明「收起态唯一入口是标题栏按钮」。另删掉三档宽度行尾误挂的Alt+↑/↓
(那是节点跳转快捷键,不是换档)。
测试
- 新增
test/glass.test.js(17 例):源码级断言(面板本体无backdrop-filter、::before承担模糊与底色)
加真实渲染下的浮层定位行为。 test/placement.test.js补至 20 例:停靠态窄窗口、previewSideFor()翻侧判据。- 全量 88/88 通过。
完整说明见 CHANGELOG。
v1.5.2 — 修复窗口变窄后面板跑出视口
修复
- 窗口变窄后,拖拽过坐标的面板会整块跑到视口外,表现为点击「历史提问大纲」按钮没有任何反应,窗口最大化后又正常。
根因是持久化的left取自更宽的窗口(实测left=1386),当前视口 1080 时 320px 面板的右缘落在 1706,position: fixed的元素被甩出可视区。这个 bug 在 1.5.1 之前就存在,与换档方向无关。 - 新增
clampPlacementToViewport():left夹进[0, innerWidth - width],top保证至少露出 80px 标题栏(够拖回来)。只作用于渲染,不回写持久化值 —— 窗口拉回去后位置还在原处。 - 新增
useViewportTick():窗口 resize 时用 rAF 节流重渲染一次,拖拽窗口过程中不会停在旧坐标。 - 钳制统一放在
panelSurfaceStyle()里,首屏占位与真面板仍走同一入口,位置不会先跳一下。
测试
- 补 5 例:真实事故坐标(
left=1386/ 视口 1080 / 宽 320 → 渲染left=760且持久化值仍为 1386)、top越界、停靠态不受影响、渲染链路、全屏档窄窗口。 - 全量 70/70 通过。
v1.5.1 — 换档生长方向按面板位置决定
修复
- 换档(紧凑 320 / 加宽 480 / 全屏 720)时的横向生长方向按面板位置决定:贴左向右长、贴右向左长、拖到中间则两侧对称;居中时若某一侧空间不够,差额全部转给另一侧(左只剩 100、需要长 400 ⇒ 左扩 100、右扩 300),而不是只长一半再把面板推回窗口内。
- 之前的行为:拖拽过的面板固定
left,宽度只向右长,连点两档后右缘顶出窗口、被position: fixed裁掉并压住右侧栏;缩窄到紧凑档时又回不到原来的停靠位。 - 贴边判定用「面板离窗口边缘 ≤ 32px」,覆盖默认停靠的 16px 边距与拖拽松手的抖动;贴右时锚原右缘(不是窗口右缘),所以不会白撑 16px。
测试
- 新增
test/placement.test.js(14 例):三种锚定、居中单向不足时的补位、连续换档、已越界坐标、窗口窄于面板、脏left,以及「点按钮 → localStorage → 重新渲染」全链路。 - 全量 65/65 通过。
v1.5.0
- 标题栏「大纲」按钮 icon-only 收窄(复用宿主原生
@container540px 条件,不再与相邻按钮重叠) - 空 props 下改从
sessions/uiSession服务取会话快照,面板不再永远空态 - 首屏占位:会话未就绪先渲染占位外壳,最长 2 秒后照常挂载
- 一次性诊断日志(快照形状 + 宿主 DOM 契约),每次加载最多各一条
- 修复:legacy
chat.{order,nodes}快照下的无限重渲染、槽位 hook 顺序、宿主 getter 抛错降级 - 修复:首屏占位的背景透明度与面板一致
dsh plugin --profile web add github:huangfuren/dsh-conversation#v1.5.0完整说明见 CHANGELOG。
v1.4.0
dsh-conversation v1.4.0:面板背景透明度可调 + 槽位注册三通道兜底
v1.3.2
fix(client): 修面板首帧 hook 顺序漂移导致的 TypeError 崩溃