is-cursor-near-edge.ts 1.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243
  1. import { EditorView } from '@codemirror/view'
  2. const TOP_EDGE_THRESHOLD = 100
  3. const BOTTOM_EDGE_THRESHOLD = 200
  4. export function isCursorNearViewportEdge(view: EditorView, pos: number) {
  5. return (
  6. isCursorNearViewportTop(view, pos) || isCursorNearViewportBottom(view, pos)
  7. )
  8. }
  9. export function isCursorNearViewportTop(
  10. view: EditorView,
  11. pos: number,
  12. threshold = TOP_EDGE_THRESHOLD
  13. ) {
  14. const cursorCoords = view.coordsAtPos(pos)
  15. if (!cursorCoords) {
  16. return false
  17. }
  18. const scrollInfo = view.scrollDOM.getBoundingClientRect()
  19. return Math.abs(cursorCoords.bottom - scrollInfo.top) <= threshold
  20. }
  21. export function isCursorNearViewportBottom(
  22. view: EditorView,
  23. pos: number,
  24. threshold = BOTTOM_EDGE_THRESHOLD
  25. ) {
  26. const cursorCoords = view.coordsAtPos(pos)
  27. if (!cursorCoords) {
  28. return false
  29. }
  30. const scrollInfo = view.scrollDOM.getBoundingClientRect()
  31. const viewportHeight = view.scrollDOM.clientHeight
  32. const viewportBottom = scrollInfo.top + viewportHeight
  33. return Math.abs(cursorCoords.bottom - viewportBottom) <= threshold
  34. }