CharDesk Docs

Cell Widget Pointer and Scroll

Pointer, keyboard, scroll, editor viewport, and Canvas boundary contracts.

HEAD a63778e
Read this page whenA widget pointer, keyboard, scroll, editor viewport, or Canvas boundary changes.
First answerWhich Cell Widget contract owns this decision?
Follow-upUse the linked source and verification evidence after selecting the contract.

Pointer 与 Scroll

  • Surface 的基础 Canvas 与 Overlay Canvas 由同一呈现节点注册表拥有;hover、pointer、wheel 共用归属判断。Canvas 事件只接受当前 Surface 的呈现节点;真实编辑 textarea 的 pointer down 经同一 Scene 命中校验后进入 Canvas 的 Cell 拖选流程,不交给原生指针选区;其他 DOM 目标不进入 Cell 指针命令。textarea 仍负责键盘、输入法、复制粘贴与无障碍焦点,非指针的原生选区变化同步回 Cell 状态。Widget、clip 与 modal scope 由 Scene 判定。所有层使用基础 Canvas 原点和共享 Cell metrics,浮层可以超出基础 viewport。浮层提交、scroll 与 resize 会重新计算静止鼠标的命中。

  • pointer down 定位焦点;Button、SelectTrigger、SelectItem、ComboboxItem、Checkbox、Toggle、RadioItem、ListItem、MenuItem、TreeItem、Tab、GridCell 移出时撤去按压、移回时恢复,pointer up 仍命中原目标才激活。drag winner、cancel、capture loss 或 blur 永久取消本轮 press。

  • Button、Checkbox、Toggle、RadioItem 与 SelectItem 接受 activate 后,在物理释放后播放 activationBlinkCount 次完整确认;AT 直接激活立即播放,0 立即完成。SelectTrigger 展开与 Radio select-radio 导航不闪烁。SelectItem 等待释放及播放期间锁定导航、选择和滚动;控制器完成后执行一次 dismiss。反馈会话契约拥有阶段时长和呈现确认。

  • SelectItem/MenuItem pointer hover 同步临时焦点;ComboboxItem hover 同步 active descendant;均不提交选择或执行动作。随后 Enter 确认临时目标。其他组件的 hover 不派发业务命令。

  • Tab/Shift+Tab 在当前焦点 scope 内遍历可用控件;RadioGroup 折叠为已选可用项或首个可用项一个入口,到 Surface 边界交还浏览器。

  • Grid 导航与入口选择由 grid-navigation.ts 拥有,FocusManager 仅保存每个 Grid 的目标 ID,卸载清理。禁用/删除焦点按入口规则收敛,不改写业务选择;全部 disabled 时跳过。Semantic DOM 保留 Surface 管理的程序化焦点,不维护另一套 Tab 顺序。Cell Range 与 Grid selection 独立,范围拖动不激活格子,复制包含可见 ✓ 和边框。

  • 嵌套 ScrollArea 的 wheel 从内向外寻找可滚动的 viewport;最外层到边界后仍消费 wheel。区域外页面可滚动,Ctrl+wheel 留给浏览器。父级只把内层 ScrollArea 的 viewport 计入自身内容尺寸;内容收缩后钳制 offset 并发出 scroll 命令同步受控状态。焦点命令的 reveal 保留最近一层,跨层时 reveals 按内到外列出全部目标和 offset。useCellScrollState 按 ID 保存双轴 offset 与全部焦点 reveal;固定高度区域仍须处理真实溢出。

  • 横纵 scrollbar 可相互缩小 viewport;轨道占位随布局重算,自然高度 ScrollArea 只在需要横向轨道时增高。测量和 Runtime 共用此布局结果。rail 始终保留 Cell 与命中区域,默认不绘制;悬停最近滚动容器、键盘焦点、滚动或拖拽时显现,滚动结束 1.2 秒后隐藏。内容 viewport 保留 padding,rail 独立延伸到边框内侧(无框时为表面边缘),端点 thumb 不留空 Cell;双轴交角由 rail 共享。thumb 使用半 Cell 精度,drag 以按下时 offset/range/track 为锚。

  • text 的竖向 rail 显现时使用 Unicode 🮐 轨道、🮑/🮒 半格 thumb 边缘,轨道复用 thumb 解析后的前景色;横向 rail 在 rich/text 均为空白 owner Cell,仅以 ━ 和半格 ╺/╸ 绘制 thumb,空白轨道仍可点击翻页。共享 painter 按实际 Cell 背景解析颜色,焦点 TextArea 的竖向轨道和 thumb 同随反色文字。显现时 thumb 与边缘保留为可复制的 Cell.text。

  • scrolling 不改变 selection;Virtual List 只在 focused row 离开 viewport 时把 focus 收敛到可见可用项。

编辑视口与 Canvas 边界

  • CellSurface.viewport 始终表示逻辑内容区;浏览器 Canvas 四周额外保留 1 Cell 绘制 guard。guard 不进入 Cell buffer、Probe 文本或复制结果;基础层、浮层、光标、隐藏 textarea 和 pointer 坐标共用同一 guard 偏移。hosted Surface 的 guard 透明,浮层以可见 Cell 边界定位、贴合和判断外部点击;字形仍可跨 Cell 绘制,物理画布边界不裁掉内容区首尾 Cell 的墨迹。
  • TextArea 可显示双轴 rail;TextInput 与 ComboboxInput 固定为 1 Cell 高且隐藏 rail,但保留横向 offset。编辑器和 ScrollArea 共用 scroll geometry,不复制 offset state。
  • 文本 layout、clip、Cursor、selection、hit 与隐藏 textarea 定位消费同一个 Scene viewport;手动 scroll 不修改 document/history。
  • Cell Range 修饰键优先于文本 selection gesture;只读编辑器可滚动,disabled 不新增交互。
  • 所有 border、block、thumb 与内容都保留为 Cell.text 字符;Canvas 字体路径、Probe 和复制结果一致。