Better Rich Text Buy licence

0002 Inline content invariant

Every caret position is a TextPoint (text leaf id + UTF-16 offset). To make that true, a textblock's children are text leaves and inline atoms where adjacent leaves never share identical marks, and leaves are non-empty except designated caret leaves: the sole child of an empty textblock, and a leaf before a leading atom, after a trailing atom, or between two adjacent atoms. The renderer gives empty caret leaves a view-only sentinel so browsers can place the caret there.