`widget_host/input.rs` was 882 lines, over the project's documented
800-line ceiling. Split the `impl WidgetHostNative` block into two
files along a natural boundary:
input.rs (417 lines — pointer / wheel / pan / cursor-move /
release + drag-commit helpers)
keyboard.rs (481 lines — text / backspace / delete / duplicate /
nudge / send / escape / click routing)
Both `impl WidgetHostNative` blocks share the same type, and Rust
allows multiple impl blocks for one type in the same crate so the
public method surface is preserved verbatim. No behavior changes —
every method moved verbatim with its full body + doc-comment.
Module wiring:
crates/openpencil-shell-native/src/widget_host.rs:
`mod keyboard;` registered between `input_tests` and `paint`
in the alphabetical mod list.
Imports adjusted: keyboard.rs picks up only the symbols its
methods reference (PropertyFocus, AIChatHit / AIChatPlaceholder /
LayerPanel / LayoutCx / Toolbar / Widget + TOOLBAR_WIDTH +
TOP_BAR_HEIGHT, Point2D + Rect, TOOLBAR_INSET_X/Y from helpers).
input.rs drops the now-unused imports of those symbols.
Tests: 54 desktop + 250+ shell-core + 20 shell-native all pass.
File-cap check:
input.rs 417 (was 882, well under 800)
keyboard.rs 481 (new, well under 800)
main.rs still pending — Task #55 follow-up (804 lines today, 4 over).