/** * Tooltip concern for the desktop UI plugin. * * Owns `addTooltip` (attaches a lazily-evaluated hover tooltip to a button) * and `wireTooltips` (calls `addTooltip` for every control-bar button). * * Integration: `DesktopUiPlugin.use()` calls `wireTooltips(...)` after * `buildDom()` has created all the button refs. * * NOTE: prev/next tooltips read pre-resolved `item.title` directly — no token * resolver is involved here. */ import type { IVideoPlayer, VideoPlaylistItem } from '../../../index.js'; import type { SliderBarRefs } from './progressBar.js'; export interface TooltipButtonRefs { playBtn: HTMLButtonElement; rewindBtn: HTMLButtonElement; forwardBtn: HTMLButtonElement; volBtn: HTMLButtonElement; aspectRatioBtn: HTMLButtonElement; theaterBtn: HTMLButtonElement; pipBtn: HTMLButtonElement; speedBtn: HTMLButtonElement; subsBtn: HTMLButtonElement; audioBtn: HTMLButtonElement; qualityBtn: HTMLButtonElement; playlistBtn: HTMLButtonElement; settingsBtn: HTMLButtonElement; fsBtn: HTMLButtonElement; prevBtn: HTMLButtonElement; nextBtn: HTMLButtonElement; chapBackBtn: HTMLButtonElement; chapFwdBtn: HTMLButtonElement; } /** * Attach a hover tooltip to a button. * * `getText` is evaluated lazily on each hover so dynamic labels (next chapter * title, next item title) stay current. The tooltip appears after 500 ms and * is dismissed on click or mouseleave. It is clamped so it never escapes the * player container's left/right edge. * * `listen` must be the plugin's managed listener registrar so that tooltips * are cleaned up on dispose without a separate teardown pass. * `getTooltipToken` / `setTooltipToken` give the caller control over the * debounce timer so all tooltips share one token slot. */ export declare function addTooltip(btn: HTMLButtonElement, getText: () => string, listen: (target: EventTarget, event: string, fn: (event: Event) => void) => void, sliderRefs: SliderBarRefs, container: HTMLElement, getTooltipToken: () => number | null, setTooltipToken: (token: number | null) => void, scheduleTimeout: (fn: () => void, ms: number) => number): void; /** * Clamp a tooltip horizontally so it never escapes the slider-bar bounds. * Uses the slider-bar's bounding rect as the horizontal fence — same as the * slider-pop scrubbing preview. */ export declare function clampTooltip(tip: HTMLSpanElement, btn: HTMLButtonElement, sliderRefs: SliderBarRefs, container: HTMLElement): void; /** * Attach tooltips to every control-bar button. * * Prev/next/chapter tooltips show the resolved `item.title` from the queue * directly — no token resolver. */ export declare function wireTooltips(player: IVideoPlayer, refs: TooltipButtonRefs, sliderRefs: SliderBarRefs, listen: (target: EventTarget, event: string, fn: (event: Event) => void) => void, getTooltipToken: () => number | null, setTooltipToken: (token: number | null) => void, scheduleTimeout: (fn: () => void, ms: number) => number, translate: (key: string, params?: Record) => string, safeCurrentIndex: () => number): void;