Rotate panel names

The new name reflects the purpose of the panel better:

- panelParent → correctionPanel: This is our (0, 0) positioned <div>
  inside which most of the magic happens. We do need it to be able to
  position it's child properly.

- correctionPanel → scrollPanel: This is a <div> which size and
  placement should exactly match the hostElement. We need it to provide
  a scrollable (hence the name) viewport for our canvas.
This commit is contained in:
Simon Rozman 2025-02-28 11:02:04 +01:00
parent acd7ac1a2b
commit 9c7c967039
2 changed files with 21 additions and 19 deletions

View File

@ -840,21 +840,21 @@ class BesService {
* Creates auxiliary DOM elements for text adornments. * Creates auxiliary DOM elements for text adornments.
*/ */
createCorrectionPanel() { createCorrectionPanel() {
this.panelParent = document.createElement('div')
this.panelParent.classList.add('bes-correction-panel-parent')
this.correctionPanel = document.createElement('div') this.correctionPanel = document.createElement('div')
this.correctionPanel.classList.add('bes-correction-panel') this.correctionPanel.classList.add('bes-correction-panel')
this.scrollPanel = document.createElement('div')
this.scrollPanel.classList.add('bes-scroll-panel')
this.canvasPanel = document.createElement('canvas') this.canvasPanel = document.createElement('canvas')
this.canvasPanel.classList.add('bes-canvas') this.canvasPanel.classList.add('bes-canvas')
this.ctx = this.canvasPanel.getContext('2d') this.ctx = this.canvasPanel.getContext('2d')
this.ctx.scale(1, 1) this.ctx.scale(1, 1)
this.panelParent.appendChild(this.correctionPanel) this.correctionPanel.appendChild(this.scrollPanel)
this.correctionPanel.appendChild(this.canvasPanel) this.scrollPanel.appendChild(this.canvasPanel)
this.textElement.parentElement.insertBefore( this.textElement.parentElement.insertBefore(
this.panelParent, this.correctionPanel,
this.textElement this.textElement
) )
this.setCorrectionPanelSize() this.setCorrectionPanelSize()
@ -864,7 +864,7 @@ class BesService {
* Clears auxiliary DOM elements for text adornments. * Clears auxiliary DOM elements for text adornments.
*/ */
clearCorrectionPanel() { clearCorrectionPanel() {
this.panelParent.remove() this.correctionPanel.remove()
} }
/** /**
@ -875,12 +875,12 @@ class BesService {
const styles = window.getComputedStyle(this.hostElement) const styles = window.getComputedStyle(this.hostElement)
const hostRect = this.hostElement.getBoundingClientRect() const hostRect = this.hostElement.getBoundingClientRect()
// Sync margins one by one. Firefox is not happy when syncing all at once. // Sync margins one by one. Firefox is not happy when syncing all at once.
this.correctionPanel.style.marginLeft = styles.marginLeft this.scrollPanel.style.marginLeft = styles.marginLeft
this.correctionPanel.style.marginTop = styles.marginTop this.scrollPanel.style.marginTop = styles.marginTop
this.correctionPanel.style.marginRight = styles.marginRight this.scrollPanel.style.marginRight = styles.marginRight
this.correctionPanel.style.marginBottom = styles.marginBottom this.scrollPanel.style.marginBottom = styles.marginBottom
this.correctionPanel.style.boxSizing = styles.boxSizing this.scrollPanel.style.boxSizing = styles.boxSizing
this.correctionPanel.style.scrollBehavior = styles.scrollBehavior this.scrollPanel.style.scrollBehavior = styles.scrollBehavior
this.canvasPanel.style.width = `${this.hostElement.scrollWidth}px` this.canvasPanel.style.width = `${this.hostElement.scrollWidth}px`
this.canvasPanel.style.height = `${this.hostElement.scrollHeight}px` this.canvasPanel.style.height = `${this.hostElement.scrollHeight}px`
const dpr = window.devicePixelRatio const dpr = window.devicePixelRatio
@ -902,11 +902,11 @@ class BesService {
parseFloat(styles.width) + parseFloat(styles.width) +
parseFloat(styles.marginRight) + parseFloat(styles.marginRight) +
parseFloat(styles.paddingRight) parseFloat(styles.paddingRight)
this.correctionPanel.style.width = `${totalWidth}px` this.scrollPanel.style.width = `${totalWidth}px`
this.correctionPanel.style.height = styles.height this.scrollPanel.style.height = styles.height
} else { } else {
this.correctionPanel.style.width = `${hostRect.width}px` this.scrollPanel.style.width = `${hostRect.width}px`
this.correctionPanel.style.height = `${hostRect.height}px` this.scrollPanel.style.height = `${hostRect.height}px`
} }
this.enableMutationObserver() this.enableMutationObserver()
} }
@ -1357,6 +1357,7 @@ class BesTreeService extends BesService {
const source = event?.detail !== 1 ? event?.detail : event const source = event?.detail !== 1 ? event?.detail : event
const el = this.getBlockParent(source.targetElement || source.target) const el = this.getBlockParent(source.targetElement || source.target)
if (!el) return if (!el) return
// TODO: Adjust source.clientX and source.clientY for scrolling offset.
const pointsInRect = [] const pointsInRect = []
for (let result of this.results) { for (let result of this.results) {
for (let m of result.matches) { for (let m of result.matches) {
@ -2021,6 +2022,7 @@ class BesPlainTextService extends BesService {
const source = event?.detail !== 1 ? event?.detail : event const source = event?.detail !== 1 ? event?.detail : event
const el = source.targetElement || source.target || this.hostElement const el = source.targetElement || source.target || this.hostElement
if (!el) return if (!el) return
// TODO: Adjust source.clientX and source.clientY for scrolling offset.
const pointsInRect = [] const pointsInRect = []
for (let result of this.results) { for (let result of this.results) {
for (let m of result.matches) { for (let m of result.matches) {

View File

@ -23,7 +23,7 @@
} }
/* Styles required to ensure full functionality and optimal user experience. */ /* Styles required to ensure full functionality and optimal user experience. */
.bes-correction-panel-parent { .bes-correction-panel {
position: relative; position: relative;
overflow: visible; overflow: visible;
float: left; float: left;
@ -34,7 +34,7 @@
z-index: 1; z-index: 1;
} }
.bes-correction-panel { .bes-scroll-panel {
position: relative; position: relative;
overflow: hidden; overflow: hidden;
border-color: transparent; border-color: transparent;