docs/plans/2026-05-23-slate-v2-mobile-example-proof-fix.md
Make the document-state and multi-root-document mobile example proofs pass
without weakening the architecture claim.
document-state mobile rows fail because raw click() into inputs and
wrapped editor text places the caret in mobile-specific positions.multi-root-document mobile rows fail because raw clicks can hit mobile
chrome/status controls instead of the intended root, and clipboard API
permissions differ from desktop Chromium.document-state to explicit editor
selections.navigator.clipboard.writeText in mobile.bun build:nextPORT=3123 bun serve:playwrightPLAYWRIGHT_BASE_URL=http://localhost:3123 PLAYWRIGHT_RETRIES=0 bun run playwright playwright/integration/examples/document-state.test.ts playwright/integration/examples/multi-root-document.test.ts --project=mobile --workers=1document-state mobile rows use deterministic editor selection for editor
mutations and explicit input caret placement for title edits.multi-root-document keeps native pointer proof isolated, while root-editing
rows use SlateBrowserEditorHarness.rootAt(...) for deterministic mobile
semantic transport without reaching into browser-handle internals.Verified:
bun build:nextPLAYWRIGHT_BASE_URL=http://localhost:3123 PLAYWRIGHT_RETRIES=0 bun run playwright playwright/integration/examples/document-state.test.ts playwright/integration/examples/multi-root-document.test.ts --project=mobile --workers=1PLAYWRIGHT_BASE_URL=http://localhost:3123 PLAYWRIGHT_RETRIES=0 bun run playwright playwright/integration/examples/document-state.test.ts playwright/integration/examples/multi-root-document.test.ts --project=chromium --workers=1bun lint:fixbun --filter slate-browser buildbun --filter slate-browser typecheckbun typecheck:rootdocs/solutions/test-failures/2026-05-23-slate-v2-mobile-example-proofs-must-separate-native-pointer-from-semantic-editing.md
captures the reusable mobile proof rule.