import { html, LitElement } from '@lion/core';
import { OverlayMixin } from '@lion/overlays';
export class LionTooltip extends OverlayMixin(LitElement) {
constructor() {
super();
this._mouseActive = false;
this._keyActive = false;
this.__setupRepositionCompletePromise();
}
connectedCallback() {
super.connectedCallback();
this._overlayContentNode.setAttribute('role', 'tooltip');
}
firstUpdated(...args) {
super.firstUpdated(...args);
this.__setupArrowElement();
}
render() {
return html`
`;
}
__setupArrowElement() {
this.__arrowElement = this.querySelector('[slot=arrow]');
if (!this.__arrowElement) {
return;
}
this.__arrowElement.setAttribute('x-arrow', true);
this._overlayContentNodeWrapper.appendChild(this.__arrowElement);
}
// eslint-disable-next-line class-methods-use-this
_defineOverlayConfig() {
return {
placementMode: 'local',
elementToFocusAfterHide: null,
hidesOnEsc: true,
popperConfig: {
placement: 'top', // default
modifiers: {
keepTogether: {
enabled: true,
},
arrow: {
enabled: true,
},
},
onCreate: data => {
this.__syncFromPopperState(data);
},
onUpdate: data => {
this.__syncFromPopperState(data);
},
},
};
}
__setupRepositionCompletePromise() {
this.repositionComplete = new Promise(resolve => {
this.__repositionCompleteResolver = resolve;
});
}
__syncFromPopperState(data) {
if (!data) {
return;
}
if (this.__arrowElement && data.placement !== this.__arrowElement.placement) {
this.__arrowElement.placement = data.placement;
this.__repositionCompleteResolver(data.placement);
this.__setupRepositionCompletePromise();
}
}
_setupOpenCloseListeners() {
super._setupOpenCloseListeners();
this.__resetActive = this.__resetActive.bind(this);
this._overlayCtrl.addEventListener('hide', this.__resetActive);
this.addEventListener('mouseenter', this._showMouse);
this.addEventListener('mouseleave', this._hideMouse);
this._showKey = this._showKey.bind(this);
this._overlayInvokerNode.addEventListener('focusin', this._showKey);
this._hideKey = this._hideKey.bind(this);
this._overlayInvokerNode.addEventListener('focusout', this._hideKey);
}
_teardownOpenCloseListeners() {
super._teardownOpenCloseListeners();
this._overlayCtrl.removeEventListener('hide', this.__resetActive);
this.removeEventListener('mouseenter', this._showMouse);
this.removeEventListener('mouseleave', this._hideMouse);
this._overlayInvokerNode.removeEventListener('focusin', this._showKey);
this._overlayInvokerNode.removeEventListener('focusout', this._hideKey);
}
__resetActive() {
this._mouseActive = false;
this._keyActive = false;
}
_showMouse() {
if (!this._keyActive) {
this._mouseActive = true;
this.opened = true;
}
}
_hideMouse() {
if (!this._keyActive) {
this.opened = false;
}
}
_showKey() {
if (!this._mouseActive) {
this._keyActive = true;
this.opened = true;
}
}
_hideKey() {
if (!this._mouseActive) {
this.opened = false;
}
}
}