vtseditor
Version:
98 lines (82 loc) • 2.82 kB
text/typescript
import './Tooltip.css';
import {EditorIcons} from './EditorIcons.js';
/**
* Tooltip
*/
export class Tooltip {
/**
* div wrapper
* @protected
*/
protected _divWrapper: HTMLDivElement;
/**
* div info content
* @protected
*/
protected _divInfoContent: HTMLDivElement;
/**
* Constructor
*/
public constructor() {
this._divWrapper = document.createElement('div');
this._divWrapper.classList.add(...['info-tooltip-icon-wrapper']);
const iconInfo = document.createElement('span');
iconInfo.classList.add('info-tooltip-icon');
iconInfo.textContent = EditorIcons.info;
this._divWrapper.appendChild(iconInfo);
this._divInfoContent = document.createElement('div');
this._divInfoContent.classList.add('info-tooltip');
this._divWrapper.appendChild(this._divInfoContent);
this._divWrapper.addEventListener('mousemove', (e) => {
const dialogParent = this._divWrapper.closest('dialog');
if (dialogParent) {
const rect = dialogParent.getBoundingClientRect();
const scrollTop = dialogParent.scrollTop;
const scrollLeft = dialogParent.scrollLeft;
this._divInfoContent.style.left = `${e.clientX - rect.left + scrollLeft - 90 - 14}px`;
this._divInfoContent.style.top = `${e.clientY - rect.top + scrollTop + 22}px`;
} else {
this._divInfoContent.style.left = `${e.clientX - 14}px`;
this._divInfoContent.style.top = `${e.clientY + 22}px`;
}
});
this._divWrapper.addEventListener('mouseenter', (e) => {
this._divInfoContent.style.display = 'block';
this._divInfoContent.style.visibility = 'visible';
this._divInfoContent.style.opacity = '1';
this._divInfoContent.style.position = 'fixed';
this._divInfoContent.style.zIndex = '100000';
});
this._divWrapper.addEventListener('mouseleave', () => {
this._divInfoContent.style.display = 'none';
this._divInfoContent.style.visibility = 'hidden';
this._divInfoContent.style.opacity = '0';
});
}
/**
* Return the element
* @return {HTMLDivElement}
*/
public getElement(): HTMLDivElement {
return this._divWrapper;
}
/**
* Show
*/
public show(): void {
this._divWrapper.style.display = '';
}
/**
* Hide
*/
public hide(): void {
this._divWrapper.style.display = 'none';
}
/**
* Set the content
* @param {string} content
*/
public setContent(content: string): void {
this._divInfoContent.textContent = content;
}
}