toolbar.ts 854 B

12345678910111213141516171819202122232425262728
  1. import { Editor, Range } from 'slate';
  2. export function calcToolbarPosition(editor: Editor, el: HTMLDivElement, blockRect: DOMRect) {
  3. const { selection } = editor;
  4. if (!selection || Range.isCollapsed(selection) || Editor.string(editor, selection) === '') {
  5. return;
  6. }
  7. const domSelection = window.getSelection();
  8. let domRange;
  9. if (domSelection?.rangeCount === 0) {
  10. domRange = document.createRange();
  11. domRange.setStart(el, domSelection?.anchorOffset);
  12. domRange.setEnd(el, domSelection?.anchorOffset);
  13. } else {
  14. domRange = domSelection?.getRangeAt(0);
  15. }
  16. const rect = domRange?.getBoundingClientRect() || { top: 0, left: 0, width: 0, height: 0 };
  17. const top = `${-el.offsetHeight - 5}px`;
  18. const left = `${rect.left - blockRect.left - el.offsetWidth / 2 + rect.width / 2}px`;
  19. return {
  20. top,
  21. left,
  22. }
  23. }