Paragraph indents, in millimetres, on every paragraph the selection touches.
Paragraph properties, not character ones, so they go through the paragraph counterpart of
apply_run_overrides_in_chain rather than through applyToSelection — that one splits character
runs at the selection boundaries, which is exactly the wrong thing here: an indent belongs to a
whole paragraph and there is nothing to split.
A bare caret is enough. Nobody selects text to change an indent, and the canvas side takes the
caret's own paragraph when there is no selection.
Pass only the keys being changed. The canvas merges them into whatever the paragraph already
carries, so setting a left indent does not silently clear a first-line one.
Paragraph indents, in millimetres, on every paragraph the selection touches.
Paragraph properties, not character ones, so they go through the paragraph counterpart of apply_run_overrides_in_chain rather than through applyToSelection — that one splits character runs at the selection boundaries, which is exactly the wrong thing here: an indent belongs to a whole paragraph and there is nothing to split.
A bare caret is enough. Nobody selects text to change an indent, and the canvas side takes the caret's own paragraph when there is no selection.
Pass only the keys being changed. The canvas merges them into whatever the paragraph already carries, so setting a left indent does not silently clear a first-line one.