docs/solutions/best-practices/2026-05-09-lexical-tab-node-harvest-rows-need-clipboard-browser-proof-boundaries.md
Lexical TabNode tests look like one portable tab feature, but they cover
several different owners: plain-text clipboard fallback, Google Docs HTML paste,
keyboard indentation, command-level tab insertion, node serialization, and
selection around a TabNode class. Slate only owns the literal tab/newline paste
behavior in this slice.
Apple-tab-span paste needed browser proof in the paste-html
example.tx.nodes.insert to tx.fragment.insert removed an empty
paragraph for the tab fixture but flattened existing nested-list paste rows.TabNode class as a Slate model target. Slate stores
literal tabs as normal text.Split the source rows by owner:
slate-dom clipboard package row for text/plain
hello\tworld\nhello\tworld;Apple-tab-span HTML;Hello\tworld, not the total paragraph count;The copied behavior is not "Slate should have a TabNode." The useful invariant is that editor paste paths preserve literal tab characters while honoring line boundaries. Package clipboard proof covers model fallback; Playwright covers the browser HTML parser path.
Keeping the paste-html importer on its existing insertion path also preserves the already-proved nested-list corpus. A cleaner insertion API might be possible later, but it needs the full paste-html browser file as the first proof, not one new tab row.
tx.fragment.insert as paste-like policy only after checking existing
list/table corpus behavior.