Skip to content

linux: work-666 - #986

Merged
fizzy-pm[bot] merged 2 commits into
mainfrom
linux/work-666
Oct 28, 2026
Merged

fizzy-pm[bot] merged 2 commits into
mainfrom
linux/work-666

Conversation

@fizzy-linux

@fizzy-linux fizzy-linux Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Part of fizzyedit/work#666
Rework: work#671

In plain words

Phone users can keep typing with their text field visible above the on-screen keyboard. Safari and Firefox now receive keyboard coverage information too, and opening the keyboard keeps the drawing surface steady. Pages containing several editors adjust only the editor being used.

What you will notice

Search, settings, rename and save fields move into view when focused or when the keyboard opens. Embedded editors account for where they sit on the page.

How this serves fizzy

Goal: phone typing (plans#115 K-4); the same usable typing experience across browsers serves the vision's one-codebase/every-platform and respect-the-person principles.

Goal

Part of fizzyedit/work#666. Answer the supplied reviews of PR #986 at de18bc1. Suggested public title: web: keep phone text fields above the keyboard.

What changed and why

Install keyboard inset reporting in both browser execution paths, clamp the hidden input, measure overlap against each canvas, and check focus ownership. Preserve the focused canvas height on resizes-content pages and omit unchanged worker size messages. Finish shared text entries through a lifecycle helper that closes their internal scroll area before revealing the field in its enclosing area. Remove a one-line getter and clarify spring units and test-global writers.

The notch findings concern unchanged code already merged in parent #971, so they are declined rather than reverting that separate change. FIXES.md answers every supplied finding; the harness supplies the final commit and posts the single FIXES response.

How it was verified

Node keyboard and embed tests exercise visualViewport, VirtualKeyboard, two-copy ownership, canvas-relative overlap, CSS height preservation, main-thread wasm delivery and worker resize suppression. Removing the main-thread listener makes the embed regression fail. The Zig regression uses a real multiline TextEntry and the production cleanup path, checking its bottom after keyboard opening and growth. Removing the production scroll call makes that test fail; restoring it passes the filtered integration gate (100/100 steps, 18/18 tests). Gate details are in GATES.md.

Not done / follow-ups

No physical phone/browser recording was available in this sandbox; browser evidence uses a fake DOM and Zig evidence uses the headless layout harness. The external console composer must adopt the same text-entry cleanup lifecycle. Publishing, title changes and the final FIXES comment are handled by the harness; no commit, push or GitHub calls were made here.

Changes (19 files, +354/-13)
 app/settings/PluginSettingsPane.zig |   4 +-
 build/web.zig                       |   1 +
 core/core.zig                       |   2 +
 core/keyboard.zig                   | 108 ++++++++++++++++++++++++++++++++++++
 core/platform.zig                   |   5 ++
 core/sizing_tests.zig               |   2 +
 core/widgets.zig                    |  12 +++-
 plugins/workbench/src/files.zig     |   2 +-
 scripts/test-web-text-input.sh      |   2 +
 src/backend/backend_web.zig         |   6 ++
 src/editor/CommandPalette.zig       |   2 +-
 src/editor/Editor.zig               |   3 +-
 src/editor/dialogs/WebSaveAs.zig    |   2 +-
 web/AGENTS.md                       |   6 ++
 web/fizzy-worker.js                 |   5 ++
 web/fizzy.js                        |  93 +++++++++++++++++++++++++++++--
 web/tests/embed.test.mjs            |  39 +++++++++++++
 web/tests/keyboard-inset.test.mjs   |  71 ++++++++++++++++++++++++
 web/tests/pointer-input.test.mjs    |   2 +-
 19 files changed, 354 insertions(+), 13 deletions(-)
Gates: 6 of 6 passed

scripts/check-fmt.sh (exit 0)

check-fmt: listing tracked files
check-fmt: checking 570 files

scripts/zb build --summary all (exit 0)

... (earlier output omitted)
|     +- compile lib tree-sitter debug native (reused)
|     +- compile lib freetype debug native (reused)
|     +- compile lib tree-sitter debug native (reused)
|     +- options (reused)
|     +- options (reused)
|     +- translate-c dvui-c cached
|     |  +- compile exe translate-c debug native (+21 more reused dependencies)
|     +- options cached
|     +- options cached
+- install text cached
|  +- compile lib text debug native cached 12ms MaxRSS:35M
|     +- WriteFile plugin_root.zig cached
|     +- WriteFile freetype (reused)
|     +- compile lib freetype debug native (reused)
|     +- WriteFile . (reused)
|     +- compile lib tree-sitter debug native (reused)
|     +- compile lib freetype debug native (reused)
|     +- compile lib tree-sitter debug native (reused)
|     +- options (reused)
|     +- translate-c dvui-c (+1 more reused dependencies)
|     +- options (reused)
|     +- options (reused)
+- install markdown cached
|  +- compile lib markdown debug native cached 12ms MaxRSS:39M
|     +- WriteFile plugin_root.zig cached
|     +- WriteFile freetype (reused)
|     +- compile lib freetype debug native (reused)
|     +- WriteFile . (reused)
|     +- compile lib tree-sitter debug native (reused)
|     +- compile lib freetype debug native (reused)
|     +- compile lib tree-sitter debug native (reused)
|     +- options (reused)
|     +- translate-c dvui-c (+1 more reused dependencies)
|     +- options (reused)
|     +- options (reused)
|     +- translate-c (reused)
+- install image cached
   +- compile lib image debug native cached 12ms MaxRSS:39M
      +- WriteFile plugin_root.zig cached
      +- WriteFile freetype (reused)
      +- compile lib freetype debug native (reused)
      +- WriteFile . (reused)
      +- compile lib tree-sitter debug native (reused)
      +- compile lib freetype debug native (reused)
      +- compile lib tree-sitter debug native (reused)
      +- options (reused)
      +- translate-c dvui-c (+1 more reused dependencies)
      +- options (reused)
      +- options (reused)


scripts/zb build test --summary all (exit 0)

... (earlier output omitted)
      +- WriteFile freetype cached
      +- compile lib freetype debug native cached 12ms MaxRSS:38M
      +- WriteFile . cached
      +- compile lib tree-sitter debug native cached 11ms MaxRSS:35M
      +- compile lib freetype debug native (reused)
      +- compile lib tree-sitter debug native (reused)
      +- translate-c dvui-c cached
      |  +- compile exe translate-c debug native cached 6ms MaxRSS:39M
      |     +- options cached
      |     +- options cached
      |     +- options cached
      |     +- run exe generate-def (aarch64.zig) cached
      |     |  +- compile exe generate-def debug native cached 6ms MaxRSS:38M
      |     +- run exe generate-def (amdgcn.zig) cached
      |     |  +- compile exe generate-def debug native (reused)
      |     +- run exe generate-def (arm.zig) cached
      |     |  +- compile exe generate-def debug native (reused)
      |     +- run exe generate-def (bpf.zig) cached
      |     |  +- compile exe generate-def debug native (reused)
      |     +- run exe generate-def (common.zig) cached
      |     |  +- compile exe generate-def debug native (reused)
      |     +- run exe generate-def (hexagon.zig) cached
      |     |  +- compile exe generate-def debug native (reused)
      |     +- run exe generate-def (loongarch.zig) cached
      |     |  +- compile exe generate-def debug native (reused)
      |     +- run exe generate-def (mips.zig) cached
      |     |  +- compile exe generate-def debug native (reused)
      |     +- run exe generate-def (neon.zig) cached
      |     |  +- compile exe generate-def debug native (reused)
      |     +- run exe generate-def (nvptx.zig) cached
      |     |  +- compile exe generate-def debug native (reused)
      |     +- run exe generate-def (powerpc.zig) cached
      |     |  +- compile exe generate-def debug native (reused)
      |     +- run exe generate-def (riscv.zig) cached
      |     |  +- compile exe generate-def debug native (reused)
      |     +- run exe generate-def (s390x.zig) cached
      |     |  +- compile exe generate-def debug native (reused)
      |     +- run exe generate-def (ve.zig) cached
      |     |  +- compile exe generate-def debug native (reused)
      |     +- run exe generate-def (wasm.zig) cached
      |     |  +- compile exe generate-def debug native (reused)
      |     +- run exe generate-def (x86_64.zig) cached
      |     |  +- compile exe generate-def debug native (reused)
      |     +- run exe generate-def (x86.zig) cached
      |     |  +- compile exe generate-def debug native (reused)
      |     +- run exe generate-def (xcore.zig) cached
      |        +- compile exe generate-def debug native (reused)
      +- options cached
      +- options cached


scripts/zb build test-integration --summary all (exit 0)

... (earlier output omitted)
|     +- options (reused)
+- run test fizzy-plugin-loader-tests cached
|  +- compile test fizzy-plugin-loader-tests debug native cached 11ms MaxRSS:39M
|     +- WriteFile freetype (reused)
|     +- compile lib freetype debug native (reused)
|     +- WriteFile . (reused)
|     +- compile lib tree-sitter debug native (reused)
|     +- compile lib freetype debug native (reused)
|     +- compile lib tree-sitter debug native (reused)
|     +- translate-c dvui-c (+1 more reused dependencies)
|     +- options (reused)
|     +- options (reused)
+- run test fizzy-text-plugin-tests cached
|  +- compile test fizzy-text-plugin-tests debug native cached 14ms MaxRSS:34M
|     +- options (reused)
|     +- WriteFile freetype (reused)
|     +- compile lib freetype debug native (reused)
|     +- WriteFile . (reused)
|     +- compile lib tree-sitter debug native (reused)
|     +- compile lib freetype debug native (reused)
|     +- compile lib tree-sitter debug native (reused)
|     +- translate-c dvui-c (+1 more reused dependencies)
|     +- options (reused)
|     +- options (reused)
+- run test fizzy-dashboard-plugin-tests cached
|  +- compile test fizzy-dashboard-plugin-tests debug native cached 14ms MaxRSS:39M
|     +- options (reused)
|     +- WriteFile freetype (reused)
|     +- compile lib freetype debug native (reused)
|     +- WriteFile . (reused)
|     +- compile lib tree-sitter debug native (reused)
|     +- compile lib freetype debug native (reused)
|     +- compile lib tree-sitter debug native (reused)
|     +- translate-c dvui-c (+1 more reused dependencies)
|     +- options (reused)
|     +- options (reused)
+- run test fizzy-workbench-plugin-tests cached
   +- compile test fizzy-workbench-plugin-tests debug native cached 15ms MaxRSS:39M
      +- options (reused)
      +- options (reused)
      +- WriteFile freetype (reused)
      +- compile lib freetype debug native (reused)
      +- WriteFile . (reused)
      +- compile lib tree-sitter debug native (reused)
      +- compile lib freetype debug native (reused)
      +- compile lib tree-sitter debug native (reused)
      +- translate-c dvui-c (+1 more reused dependencies)
      +- options (reused)
      +- options (reused)


scripts/zb build check-web --summary all (exit 0)

... (earlier output omitted)
|  |     |  +- compile exe generate-def debug native (reused)
|  |     +- run exe generate-def (arm.zig) cached
|  |     |  +- compile exe generate-def debug native (reused)
|  |     +- run exe generate-def (bpf.zig) cached
|  |     |  +- compile exe generate-def debug native (reused)
|  |     +- run exe generate-def (common.zig) cached
|  |     |  +- compile exe generate-def debug native (reused)
|  |     +- run exe generate-def (hexagon.zig) cached
|  |     |  +- compile exe generate-def debug native (reused)
|  |     +- run exe generate-def (loongarch.zig) cached
|  |     |  +- compile exe generate-def debug native (reused)
|  |     +- run exe generate-def (mips.zig) cached
|  |     |  +- compile exe generate-def debug native (reused)
|  |     +- run exe generate-def (neon.zig) cached
|  |     |  +- compile exe generate-def debug native (reused)
|  |     +- run exe generate-def (nvptx.zig) cached
|  |     |  +- compile exe generate-def debug native (reused)
|  |     +- run exe generate-def (powerpc.zig) cached
|  |     |  +- compile exe generate-def debug native (reused)
|  |     +- run exe generate-def (riscv.zig) cached
|  |     |  +- compile exe generate-def debug native (reused)
|  |     +- run exe generate-def (s390x.zig) cached
|  |     |  +- compile exe generate-def debug native (reused)
|  |     +- run exe generate-def (ve.zig) cached
|  |     |  +- compile exe generate-def debug native (reused)
|  |     +- run exe generate-def (wasm.zig) cached
|  |     |  +- compile exe generate-def debug native (reused)
|  |     +- run exe generate-def (x86_64.zig) cached
|  |     |  +- compile exe generate-def debug native (reused)
|  |     +- run exe generate-def (x86.zig) cached
|  |     |  +- compile exe generate-def debug native (reused)
|  |     +- run exe generate-def (xcore.zig) cached
|  |        +- compile exe generate-def debug native (reused)
|  +- options cached
|  +- options cached
|  +- options cached
|  +- options cached
|  +- options cached
|  +- options cached
|  +- options cached
|  +- options cached
|  +- options cached
|  +- options cached
|  +- options cached
|  +- translate-c cached 3ms MaxRSS:33M
+- compile obj rehome-fixture-web debug wasm32-freestanding cached 6ms MaxRSS:35M
   +- translate-c dvui-c (+1 more reused dependencies)
   +- options (reused)
   +- options (reused)


scripts/zb build test-sdk-version --summary all (exit 0)

... (earlier output omitted)
   +- WriteFile . cached
   +- compile lib tree-sitter debug native cached 10ms MaxRSS:34M
   +- compile lib freetype debug native (reused)
   +- compile lib tree-sitter debug native (reused)
   +- options cached
   +- options cached
   +- translate-c dvui-c cached
   |  +- compile exe translate-c debug native cached 5ms MaxRSS:39M
   |     +- options cached
   |     +- options cached
   |     +- options cached
   |     +- run exe generate-def (aarch64.zig) cached
   |     |  +- compile exe generate-def debug native cached 5ms MaxRSS:34M
   |     +- run exe generate-def (amdgcn.zig) cached
   |     |  +- compile exe generate-def debug native (reused)
   |     +- run exe generate-def (arm.zig) cached
   |     |  +- compile exe generate-def debug native (reused)
   |     +- run exe generate-def (bpf.zig) cached
   |     |  +- compile exe generate-def debug native (reused)
   |     +- run exe generate-def (common.zig) cached
   |     |  +- compile exe generate-def debug native (reused)
   |     +- run exe generate-def (hexagon.zig) cached
   |     |  +- compile exe generate-def debug native (reused)
   |     +- run exe generate-def (loongarch.zig) cached
   |     |  +- compile exe generate-def debug native (reused)
   |     +- run exe generate-def (mips.zig) cached
   |     |  +- compile exe generate-def debug native (reused)
   |     +- run exe generate-def (neon.zig) cached
   |     |  +- compile exe generate-def debug native (reused)
   |     +- run exe generate-def (nvptx.zig) cached
   |     |  +- compile exe generate-def debug native (reused)
   |     +- run exe generate-def (powerpc.zig) cached
   |     |  +- compile exe generate-def debug native (reused)
   |     +- run exe generate-def (riscv.zig) cached
   |     |  +- compile exe generate-def debug native (reused)
   |     +- run exe generate-def (s390x.zig) cached
   |     |  +- compile exe generate-def debug native (reused)
   |     +- run exe generate-def (ve.zig) cached
   |     |  +- compile exe generate-def debug native (reused)
   |     +- run exe generate-def (wasm.zig) cached
   |     |  +- compile exe generate-def debug native (reused)
   |     +- run exe generate-def (x86_64.zig) cached
   |     |  +- compile exe generate-def debug native (reused)
   |     +- run exe generate-def (x86.zig) cached
   |     |  +- compile exe generate-def debug native (reused)
   |     +- run exe generate-def (xcore.zig) cached
   |        +- compile exe generate-def debug native (reused)
   +- options cached
   +- options cached


The soft keyboard now reaches the app as a bottom inset (virtualKeyboard
geometrychange, or visualViewport on iOS) rather than a canvas resize. The root
lays out above a spring-followed inset, and a focused field scrolls itself above
it when it gains focus, the inset moves or it grows. The hidden input is clamped
above the keyboard so the browser does not pan the page.

Agent-Team: linux
Worker: claude

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@fizzy-pm

fizzy-pm Bot commented Oct 28, 2026

Copy link
Copy Markdown
Contributor

PM note: how this PR will be handled

What it is for: linux: work-666
Issue #666: web: the keyboard opening flashes and jumps the layout, and a growing field slides behind it (K-4: inset instead of resize; scroll the field into view)
Done when (from the issue): tests above; PR body explains the two causes; the phone check is the PM's (foxnne's cards).

Rules that apply: touches build scripts; changes agent rules or guides.
Reviews needed: 2, from two different kinds.
Needs the maintainer's explicit yes before merge: yes

Things to watch (checked by rule):

  • the body names its work issue (Part of fizzyedit/work#N)
  • size within 800 lines outside tests and docs (166)
  • a gates section with what was run

What happens next:

  1. Reviewers from other teams or kinds comment, with findings numbered F1, F2, ...
  2. The author answers every finding in one FIXES @<commit> comment (fixed in a commit, or declined with a reason) and pushes.
  3. Reviewers re-review the new commit on their own.
  4. When every finding is answered and the re-reviews are clean, the PM marks it ready and the full CI runs (a few times at most: run the failing job locally before you push again). Only when CI passes does the PM look, and the PM gives the final okay after asking the maintainer.

A living status comment below is kept current. Nothing here is a merge decision.

@fizzy-pm

fizzy-pm Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

Where this PR stands

Stage: Waiting for the maintainer
Next: Maintainer should say yes or no when the PM asks

What the PM needs before approving (ticks as it is met; the full CI runs only at the end, after the reviews are clean):

  • The body names its basis (Part of fizzyedit/work#N or a plan step)
  • Within the size limit: 249 of 800 lines outside tests and docs
  • The body shows which gates the author ran
  • No open findings at this commit
  • Every earlier finding was answered in a FIXES comment (15 answered)
  • Clean reviews at this commit from 2 different kinds: macos/agy, macos/claude (has 2)
  • Marked ready, which starts the full CI (the PM does this the moment the items above are met)
  • The full CI passes at this commit (CI is green)
  • The maintainer's explicit yes (rules)
  • The PM's final okay (pm-approval)

Rules that apply: touches build scripts; changes agent rules or guides.

Reviews at the current commit (4ebcf48):

Reviewer Verdict Findings
macos/agy clean 3
macos/claude clean 5

3 earlier reviews are for older commits and will be redone.

Latest fixes comment: https://github.com/fizzyedit/work/issues/668#issuecomment-6479286917 (15 findings answered)

Updated 2026-10-28 21:27 UTC by the PM. This comment is edited in place.

@fizzy-macos fizzy-macos Bot added reviewing:macos-agy a macos/agy review is running reviewing:macos-claude a macos/claude review is running and removed reviewing:macos-agy a macos/agy review is running reviewing:macos-claude a macos/claude review is running labels Oct 28, 2026
@fizzy-linux fizzy-linux Bot added the reviewing:linux-codex a linux/codex review is running label Oct 28, 2026
@fizzy-macos fizzy-macos Bot added reviewing:macos-claude a macos/claude review is running reviewing:macos-agy a macos/agy review is running labels Oct 28, 2026
@fizzy-linux fizzy-linux Bot removed the reviewing:linux-codex a linux/codex review is running label Oct 28, 2026
@fizzy-macos fizzy-macos Bot removed reviewing:macos-claude a macos/claude review is running reviewing:macos-agy a macos/agy review is running labels Oct 28, 2026
Agent-Team: linux

Worker: codex
@fizzy-macos fizzy-macos Bot added reviewing:macos-agy a macos/agy review is running reviewing:macos-claude a macos/claude review is running and removed reviewing:macos-claude a macos/claude review is running reviewing:macos-agy a macos/agy review is running labels Oct 28, 2026
@fizzy-pm
fizzy-pm Bot marked this pull request as ready for review October 28, 2026 20:41
@fizzy-pm
fizzy-pm Bot added this pull request to the merge queue Oct 28, 2026
@fizzy-windows fizzy-windows Bot added reviewing:windows-codex a windows/codex review is running and removed reviewing:windows-codex a windows/codex review is running labels Oct 28, 2026
Merged via the queue into main with commit 3649264 Oct 28, 2026
27 checks passed
@fizzy-pm
fizzy-pm Bot deleted the linux/work-666 branch October 28, 2026 21:40
@fizzy-linux fizzy-linux Bot mentioned this pull request Oct 28, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

0 participants