gapVisibleIndex property
Visible-order index of the resolved slot's leading edge: the make-room gap opens BEFORE the row at this index.
Derived from the resolved slot (parentKey + indexInFinalList), NOT from targetKey, so the previewed gap and the committed position cannot disagree. They differ whenever the resolved slot is not visually adjacent to the hovered row, which happens when a DropZoneResolver.canAcceptDrop veto or a cycle disables the below-on-expanded-parent rule over a row that has a visible subtree.
Valid range is [0, visibleNodeCount] INCLUSIVE. The terminal value
means "after every visible row", which is the correct answer for
appending at the very end.
Implementation
final int gapVisibleIndex;