// Copyright 2022 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
/**
* @fileoverview Provides common shared tooltip behavior used in various
* settings pages.
*/
import type {CrTooltipElement} from 'chrome://resources/cr_elements/cr_tooltip/cr_tooltip.js';
import type {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
import {dedupingMixin} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js';
type Constructor<T> = new (...args: any[]) => T;
export interface TooltipMixinInterface {
showTooltipAtTarget(tooltip: CrTooltipElement, target: Element): void;
}
export const TooltipMixin = dedupingMixin(
<T extends Constructor<PolymerElement>>(superClass: T): T&
Constructor<TooltipMixinInterface> => {
class TooltipMixin extends superClass {
showTooltipAtTarget(tooltip: CrTooltipElement, target: Element) {
if (!tooltip.for) {
// In the case that the tooltip and target are not associated with
// the for property, manually set the target of the tooltip and
// update its position.
tooltip.target = target;
tooltip.updatePosition();
}
const hide = () => {
tooltip.hide();
target.removeEventListener('mouseleave', hide);
target.removeEventListener('blur', hide);
target.removeEventListener('click', hide);
tooltip.removeEventListener('mouseenter', hide);
};
target.addEventListener('mouseleave', hide);
target.addEventListener('blur', hide);
target.addEventListener('click', hide);
tooltip.addEventListener('mouseenter', hide);
tooltip.show();
}
}
return TooltipMixin;
});