You're right. Slate, Quill.js and ProseMirror-based use contenteditable. Hacking browser for custom cursor (similarly as Zoho Docs does [0]) is quite hacky and often leads to more problems than advantages it provides.
[0]: I suggest you to take a look in Chrome debugger how it works. Quite funny piece of code. It is written in jQuery + vanilla JS, so it will be very easy to spot the whole algorithm.
https://developer.mozilla.org/en-US/docs/Web/Guide/HTML/Edit...