110 lines
3.1 KiB
TypeScript
110 lines
3.1 KiB
TypeScript
import { describe, expect, it } from 'vitest'
|
|
import {
|
|
isWithinBlockNoteHandleHoverBridge,
|
|
shouldSuppressBlockNoteHandleHoverUpdate,
|
|
} from './blockNoteSideMenuHoverGuard'
|
|
|
|
function rect(left: number, top: number, width: number, height: number) {
|
|
return DOMRect.fromRect({ x: left, y: top, width, height })
|
|
}
|
|
|
|
function setRect(element: HTMLElement, nextRect: DOMRect) {
|
|
element.getBoundingClientRect = () => nextRect
|
|
}
|
|
|
|
describe('blockNoteSideMenuHoverGuard', () => {
|
|
it('treats the side-menu gutter as part of the hover bridge', () => {
|
|
expect(
|
|
isWithinBlockNoteHandleHoverBridge(
|
|
{ x: 228, y: 118 },
|
|
rect(240, 90, 420, 32),
|
|
rect(190, 96, 32, 24),
|
|
),
|
|
).toBe(true)
|
|
})
|
|
|
|
it('ignores points outside the side-menu bridge band', () => {
|
|
expect(
|
|
isWithinBlockNoteHandleHoverBridge(
|
|
{ x: 228, y: 150 },
|
|
rect(240, 90, 420, 32),
|
|
rect(190, 96, 32, 24),
|
|
),
|
|
).toBe(false)
|
|
})
|
|
|
|
it('suppresses hover updates when the pointer is already over the side menu', () => {
|
|
const container = document.createElement('div')
|
|
const editor = document.createElement('div')
|
|
editor.className = 'bn-editor'
|
|
container.appendChild(editor)
|
|
document.body.appendChild(container)
|
|
|
|
const sideMenu = document.createElement('div')
|
|
sideMenu.className = 'bn-side-menu'
|
|
const sideMenuButton = document.createElement('button')
|
|
sideMenu.appendChild(sideMenuButton)
|
|
document.body.appendChild(sideMenu)
|
|
|
|
setRect(editor, rect(240, 90, 420, 32))
|
|
setRect(sideMenu, rect(190, 96, 32, 24))
|
|
|
|
expect(
|
|
shouldSuppressBlockNoteHandleHoverUpdate({
|
|
eventTarget: sideMenuButton,
|
|
point: { x: 200, y: 110 },
|
|
container,
|
|
doc: document,
|
|
}),
|
|
).toBe(true)
|
|
})
|
|
|
|
it('suppresses hover updates while the pointer crosses the handle bridge', () => {
|
|
const container = document.createElement('div')
|
|
const editor = document.createElement('div')
|
|
editor.className = 'bn-editor'
|
|
container.appendChild(editor)
|
|
document.body.appendChild(container)
|
|
|
|
const sideMenu = document.createElement('div')
|
|
sideMenu.className = 'bn-side-menu'
|
|
document.body.appendChild(sideMenu)
|
|
|
|
setRect(editor, rect(240, 90, 420, 32))
|
|
setRect(sideMenu, rect(190, 96, 32, 24))
|
|
|
|
expect(
|
|
shouldSuppressBlockNoteHandleHoverUpdate({
|
|
eventTarget: document.body,
|
|
point: { x: 226, y: 116 },
|
|
container,
|
|
doc: document,
|
|
}),
|
|
).toBe(true)
|
|
})
|
|
|
|
it('leaves unrelated pointer movement alone', () => {
|
|
const container = document.createElement('div')
|
|
const editor = document.createElement('div')
|
|
editor.className = 'bn-editor'
|
|
container.appendChild(editor)
|
|
document.body.appendChild(container)
|
|
|
|
const sideMenu = document.createElement('div')
|
|
sideMenu.className = 'bn-side-menu'
|
|
document.body.appendChild(sideMenu)
|
|
|
|
setRect(editor, rect(240, 90, 420, 32))
|
|
setRect(sideMenu, rect(190, 96, 32, 24))
|
|
|
|
expect(
|
|
shouldSuppressBlockNoteHandleHoverUpdate({
|
|
eventTarget: document.body,
|
|
point: { x: 360, y: 160 },
|
|
container,
|
|
doc: document,
|
|
}),
|
|
).toBe(false)
|
|
})
|
|
})
|