Cell Widget Pointer and Scroll
Pointer, keyboard, scroll, editor viewport, and Canvas boundary contracts.
HEAD a63778e| Read this page when | A widget pointer, keyboard, scroll, editor viewport, or Canvas boundary changes. |
|---|---|
| First answer | Which Cell Widget contract owns this decision? |
| Follow-up | Use 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 展开与 Radioselect-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 和复制结果一致。