Skip to content

Releases

v1.5.6 — 修复 hover 预览闪现回归(issue #4 重开)

Choose a tag to compare

@huangfuren huangfuren released this 03 Nov 17:18

修复

  • 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.js 9 例:快照引用稳定性 5 例
    • effect 结构断言 4 例,含「立即调用必须是 syncActive() 而非 onScroll()」与「清预览必须在 scrollTop
      真实变化之后」)。

完整说明见 CHANGELOG。

v1.5.5 — 停用代码就地注释保留,逐段标注原因(无行为变更)

Choose a tag to compare

@huangfuren huangfuren released this 03 Nov 15:55

变更

  • 已停用的右侧刻度条与右上角胶囊代码,就地注释保留并逐段标注原因。这不是功能改动,运行时行为与 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)、触屏拖拽与窄窗口几何

Choose a tag to compare

@huangfuren huangfuren released this 03 Nov 15:04

修复

  • 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 — 修复窗口变窄后面板跑出视口

Choose a tag to compare

@huangfuren huangfuren released this 03 Nov 06:18

修复

  • 窗口变窄后,拖拽过坐标的面板会整块跑到视口外,表现为点击「历史提问大纲」按钮没有任何反应,窗口最大化后又正常。
    根因是持久化的 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 — 换档生长方向按面板位置决定

Choose a tag to compare

@huangfuren huangfuren released this 03 Nov 05:44

修复

  • 换档(紧凑 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

Choose a tag to compare

@huangfuren huangfuren released this 02 Nov 15:43

合并 #2(@XHR666):

  • 标题栏「大纲」按钮 icon-only 收窄(复用宿主原生 @container 540px 条件,不再与相邻按钮重叠)
  • 空 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

Choose a tag to compare

@huangfuren huangfuren released this 02 Nov 13:42
dsh-conversation v1.4.0:面板背景透明度可调 + 槽位注册三通道兜底

v1.3.2

Choose a tag to compare

@huangfuren huangfuren released this 02 Nov 09:34
fix(client): 修面板首帧 hook 顺序漂移导致的 TypeError 崩溃