Skip to content

dsh-fullscreen-input 1.2.3

Choose a tag to compare

@AL-Yichen AL-Yichen released this 07 Oct 09:24
· 10 commits to main since this release

The mask's blur stopping at a host container, a white-on-white switch on the light theme, and AGENTS.md out of the package.

Fixed

  • The mask covered the conversation column but not the sidebar, on one machine. The
    first reading of the report was a geometry problem, and the fix was built for that.
    Field data said otherwise: the layer and the scrim both measured the full viewport at
    0,0
    with a zero delta, and a hit test in the sidebar landed on the layer — so size
    and stacking were never wrong. What was wrong is where the effect appeared: the mask
    fill is transparent by default, so what the eye reads as the mask is the
    backdrop-filter blur, and the blur stopped at a host row box while the layer still
    measured the whole screen.
    • The cause is container-type: inline-size on a host element between the slot and
      body. Its implied contain: layout makes it a containing-block candidate and cuts
      backdrop-filter sampling short. It also explains why the symptom tracked the machine
      rather than the browser: that viewport made the host lay the column out with that row.
    • The layer now probes its ancestors once mounted and, on a hit, portals itself to
      body
      — above which fixed necessarily means the viewport and backdrop-filter is
      no longer truncated.
    • The probe covers seven causes: transform, filter, backdrop-filter, perspective,
      contain, container-type, will-change. It counts a value only when the engine
      actually returned one — none, auto, normal and the empty string all count as
      unset. (container-type defaults to normal, so missing that check would make the
      probe permanently true.)
    • It escapes only on a hit: with no hit, the DOM position and structure are unchanged.
      If react-dom cannot be resolved, it does not throw — it simply stays put, which is the
      previous behaviour rather than a failed load.
  • On the light theme, a switch in its off state was a solid white block. The dark theme
    was fine. The neutral tint under our own controls came from --dsw-alias-bg-layer-2, a
    surface token, which resolves to white on the light theme — so a white knob on a white
    track on a white pane had no readable state at all. It is now derived from
    --dsw-alias-label-primary (color-mix at 18%): a neutral built from the label
    colour inverts with the theme by construction, so there is no second set of literals
    to maintain. The slider track, hover fills and reference chips share it.
    • Scoped to the panel and the settings dialog, so the host's own use of that token is
      untouched. Each rule still names the same token, so where color-mix is unsupported the
      old appearance returns.

Packaging

  • AGENTS.md is no longer published. It is maintainer instruction ("the seven
    constraints you must not break", "rebuild after touching src/"), and once the package
    sits in node_modules, DSH's dsh-agent-instructions folds it into sessions as
    workspace instruction as soon as an agent touches that directory — its candidate file
    names are literally ['AGENTS.md', 'CLAUDE.md']. So every user who merely installed the
    plugin was having a few KB of "how to modify this library" injected into their sessions.
    • The fix is to remove it from package.json's files, not to rename or delete it:
      in the repository it is wanted, because an agent working there really is modifying the
      plugin. That is why the file stays.
    • The published package is 11 files now instead of 12. src/ and build-client.mjs
      remain, because link: installs rebuild from them.

Compatibility

The bundle patch and the dsh manifest are untouched, so existing profiles keep working and a
disable row written against row id fullscreen-input still applies. Settings stored by
earlier versions read back with identical behaviour.

npm shasum (SHA1)  70947b1a47a02e80e339871cec87df351a07d857
install            dsh plugin --profile web add dsh-fullscreen-input

遮罩的模糊止步于宿主容器、浅色主题下白底白开关,以及把 AGENTS.md 移出发布包。

修复

  • 在一台机器上,遮罩盖住了对话区,却没盖住侧边栏。 报告最初读起来像几何问题,修复也是照着那个方向做的。现场数据推翻了它:.dshfs-layer 与 .dshfs-scrim 都量到完整视口、位于 0,0,与视口差值全为 0;在侧边栏位置做指针命中,命中的正是这一层——所以尺寸与层叠从来没错。错的是效果出现的位置:遮罩底色默认全透明,肉眼读作「遮罩」的其实是 backdrop-filter 的模糊,而模糊止步于宿主某个行的盒子,层本身仍然量到整屏。
    • 成因是槽位与 body 之间一个宿主元素上的 container-type: inline-size。它隐含的 contain: layout 既让它成为包含块候选,又截断了 backdrop-filter 的采样。这也解释了为什么症状跟着机器走而不是跟着浏览器走:那台机器的视口让宿主用上了带这一行的那种布局。
    • 现在挂载后向上探测一次祖先链,命中就把整层 portal 到 body —— body 之上 fixed 必然等于视口,backdrop-filter 也不再被截断。
    • 探测覆盖七类成因:transform、filter、backdrop-filter、perspective、contain、container-type、will-change。判定只认引擎真的返回了值:none、auto、normal 与空串一律算未设置。(container-type 的默认值正是 normal,漏掉这一条探测会恒为真。)
    • 只有命中才逃逸:没有命中时 DOM 位置与结构完全不变。react-dom 取不到时不抛错,只是原地不动 —— 那是旧行为,而不是加载失败。
  • 浅色主题下,关闭状态的开关是一整块白色。 深色主题正常。我们自绘控件下面的那层中性底色取自 --dsw-alias-bg-layer-2,而它是表面 token,浅色主题下解析成白色 —— 于是「白色滑块 + 白色轨道 + 白色面板」糊成一块,既看不出是开关、也看不出当前是开还是关。现在改为从 --dsw-alias-label-primary 派生(color-mix 取 18%):由文字色推导的中性底色,会按构造随主题翻转,不必再维护两套字面量。滑条轨道、hover 底色、引用 chip 底色共用它。
    • 作用域限定在面板与设置对话框,宿主自己对同一 token 的使用不受影响。每条规则写的仍然是那个 token,所以 color-mix 不被支持时旧外观照旧回来。

打包

  • AGENTS.md 不再随包发布。 它是给维护者的指令("七条不能碰的约束""改完 src/ 必须重建");而一旦这个包躺在 node_modules 里,DSH 的 dsh-agent-instructions 就会在 agent 触碰该目录时把它当作工作区指令折进会话 —— 它的候选文件名正是 ['AGENTS.md', 'CLAUDE.md']。于是每一个只是安装了插件的人,会话里都会被塞进几 KB 的"怎么改这个库"。
    • 做法是把它移出 package.json 的 files,不是改名也不是删除:在仓库里它是需要的,因为在那里工作的 agent 确实是在改这个插件。所以文件留着。
    • 发布包因此从 12 个文件变成 11 个。src/ 与 build-client.mjs 继续保留 —— link: 安装要用它们重建。

兼容性

组合包补丁与 dsh manifest 均未改动,所以现有 profile 照常工作,针对 row id fullscreen-input 写的禁用行仍然有效。更早版本存下的设置读回来行为完全一致。