TooltipManager
A tooltip manager class for the UI of the editor.
Note: Most likely you do not have to use the TooltipManager API listed below in order to display tooltips. Popular UI components support tooltips out-of-the-box via observable properties (see tooltip and tooltipPosition).
Displaying tooltips
To display a tooltip, set data-cke-tooltip-text attribute on any DOM element:
domElement.dataset.ckeTooltipText = 'My tooltip';Copy codeThe tooltip will show up whenever the user moves the mouse over the element or the element gets focus in DOM.
Positioning tooltips
To change the position of the tooltip, use the data-cke-tooltip-position attribute (s, se, sw, n, e, or w):
domElement.dataset.ckeTooltipText = 'Tooltip to the north';
domElement.dataset.ckeTooltipPosition = 'n';Copy codeDisabling tooltips
In order to disable the tooltip temporarily, use the data-cke-tooltip-disabled attribute:
domElement.dataset.ckeTooltipText = 'Disabled. For now.';
domElement.dataset.ckeTooltipDisabled = 'true';Copy codeInstant tooltips
To remove the delay before showing or hiding the tooltip, use the data-cke-tooltip-instant attribute:
domElement.dataset.ckeTooltipInstant = 'true';Copy codeStyling tooltips
By default, the tooltip has .ck-tooltip class and its text inner .ck-tooltip__text.
If your tooltip requires custom styling, using data-cke-tooltip-class attribute will add additional class to the balloon displaying the tooltip:
domElement.dataset.ckeTooltipText = 'Tooltip with a red text';
domElement.dataset.ckeTooltipClass = 'my-class';Copy code.ck.ck-tooltip.my-class { color: red }Copy codeNote: This class is a singleton. All editor instances re-use the same instance loaded by EditorUI of the first editor.
Properties
balloonPanelView: BalloonPanelViewreadonlymodule:ui/tooltipmanager~TooltipManager#balloonPanelViewThe instance of the balloon panel that renders and positions the tooltip.
tooltipTextView: View<HTMLElement> & objectreadonlymodule:ui/tooltipmanager~TooltipManager#tooltipTextViewThe view rendering text of the tooltip.
_bodyCollectionByTree: Map<Document | ShadowRoot, BodyCollection>privatemodule:ui/tooltipmanager~TooltipManager#_bodyCollectionByTreeMaps each DOM tree (the document or a shadow root) that hosts tooltip-bearing UI to the body collection the shared tooltip balloon should be pinned into for targets in that tree. Rebuilt from
_registrationsby_rebuild._currentElementWithTooltip: HTMLElement | nullprivatemodule:ui/tooltipmanager~TooltipManager#_currentElementWithTooltipStores the reference to the DOM element the tooltip is attached to.
nullwhen there's no tooltip in the UI._currentTooltipPosition: TooltipPosition | nullprivatemodule:ui/tooltipmanager~TooltipManager#_currentTooltipPositionStores the current tooltip position.
nullwhen there's no tooltip in the UI._mutationObserver: MutationObserverWrapper | nullprivatemodule:ui/tooltipmanager~TooltipManager#_mutationObserverAn instance of the mutation observer that keeps track on target element attributes changes.
_pinTooltipDebounced: DebouncedFunc<( targetDomElement: HTMLElement, data: TooltipData ) => void>privatemodule:ui/tooltipmanager~TooltipManager#_pinTooltipDebouncedA debounced version of
_pinTooltip. Tooltips show with a delay to avoid flashing and to improve the UX._refCount: numberprivatemodule:ui/tooltipmanager~TooltipManager#_refCountThe number of holders (editors and features) currently using the singleton, so it is destroyed only when the last one releases it.
_shadowRoots: Set<ShadowRoot>privatemodule:ui/tooltipmanager~TooltipManager#_shadowRootsShadow roots the manager currently has listeners attached to.
_unpinTooltipDebounced: DebouncedFunc<VoidFunction>privatemodule:ui/tooltipmanager~TooltipManager#_unpinTooltipDebouncedA debounced version of
_unpinTooltip. Tooltips hide with a delay to allow hovering of their titles._watchdogExcluded: trueprivatereadonlymodule:ui/tooltipmanager~TooltipManager#_watchdogExcluded
Static properties
defaultBalloonPositions: Record<string, PositioningFunction>staticmodule:ui/tooltipmanager~TooltipManager.defaultBalloonPositionsA set of default positioning functions used by the
TooltipManagerto pin tooltips in different positions._instance: TooltipManager | nullprivatestaticmodule:ui/tooltipmanager~TooltipManager._instanceA reference to the
TooltipManagerinstance. The class is a singleton and as such, successive attempts at creating instances should return this instance._registrations: Map<BodyCollection, BodyCollectionRegistration>privatestaticmodule:ui/tooltipmanager~TooltipManager._registrationsThe body collections the shared tooltip balloon may be pinned into, each with the sources describing where its tooltip-bearing UI lives: an optional
ShadowRootRegistry(the shadow roots its out-of-collection UI occupies) and an optional emitter whoseupdateevent should reposition a pinned tooltip.
Methods
constructor( locale )privatemodule:ui/tooltipmanager~TooltipManager#constructordelegate( events ) → EmitterMixinDelegateChaininheritedmodule:ui/tooltipmanager~TooltipManager#delegateDelegates selected events to another
Emitter. For instance:
Copy codeemitterA.delegate( 'eventX' ).to( emitterB ); emitterA.delegate( 'eventX', 'eventY' ).to( emitterC );then
eventXis delegated (fired by)emitterBandemitterCalong withdata:
Copy codeemitterA.fire( 'eventX', data );and
eventYis delegated (fired by)emitterCalong withdata:
Copy codeemitterA.fire( 'eventY', data );Parameters
events: Array<string>Event names that will be delegated to another emitter.
Returns
fire( eventOrInfo, args ) → GetEventInfo<TEvent>[ 'return' ]inheritedmodule:ui/tooltipmanager~TooltipManager#fireFires an event, executing all callbacks registered for it.
The first parameter passed to callbacks is an
EventInfoobject, followed by the optionalargsprovided in thefire()method call.Type parameters
Parameters
eventOrInfo: GetNameOrEventInfo<TEvent>The name of the event or
EventInfoobject if event is delegated.args: TEvent[ 'args' ]Additional arguments to be passed to the callbacks.
Returns
GetEventInfo<TEvent>[ 'return' ]By default the method returns
undefined. However, the return value can be changed by listeners through modification of theevt.return's property (the event info is the first param of every callback).
listenTo( emitter, event, callback, options? ) → voidinheritedmodule:ui/tooltipmanager~TooltipManager#listenTo:DOM_EMITTERRegisters a callback function to be executed when an event is fired in a specific (emitter) object.
Events can be grouped in namespaces using
:. When namespaced event is fired, it additionally fires all callbacks for that namespace.
Copy code// myEmitter.on( ... ) is a shorthand for myEmitter.listenTo( myEmitter, ... ). myEmitter.on( 'myGroup', genericCallback ); myEmitter.on( 'myGroup:myEvent', specificCallback ); // genericCallback is fired. myEmitter.fire( 'myGroup' ); // both genericCallback and specificCallback are fired. myEmitter.fire( 'myGroup:myEvent' ); // genericCallback is fired even though there are no callbacks for "foo". myEmitter.fire( 'myGroup:foo' );An event callback can stop the event and set the return value of the
firemethod.Type parameters
Parameters
emitter: EmitterThe object that fires the event.
event: TEvent[ 'name' ]The name of the event.
callback: GetCallback<TEvent>The function to be called on event.
options?: CallbackOptionsAdditional options.
Returns
void
listenTo( emitter, event, callback, options? ) → voidinheritedmodule:ui/tooltipmanager~TooltipManager#listenTo:BASE_EMITTERRegisters a callback function to be executed when an event is fired in a specific (emitter) object.
Events can be grouped in namespaces using
:. When namespaced event is fired, it additionally fires all callbacks for that namespace.
Copy code// myEmitter.on( ... ) is a shorthand for myEmitter.listenTo( myEmitter, ... ). myEmitter.on( 'myGroup', genericCallback ); myEmitter.on( 'myGroup:myEvent', specificCallback ); // genericCallback is fired. myEmitter.fire( 'myGroup' ); // both genericCallback and specificCallback are fired. myEmitter.fire( 'myGroup:myEvent' ); // genericCallback is fired even though there are no callbacks for "foo". myEmitter.fire( 'myGroup:foo' );An event callback can stop the event and set the return value of the
firemethod.Type parameters
Parameters
emitter: EmitterThe object that fires the event.
event: TEvent[ 'name' ]The name of the event.
callback: GetCallback<TEvent>The function to be called on event.
options?: GetCallbackOptions<TEvent>Additional options.
Returns
void
listenTo( emitter, event, callback, options? ) → voidinheritedmodule:ui/tooltipmanager~TooltipManager#listenTo:HTML_EMITTERRegisters a callback function to be executed when an event is fired in a specific Emitter or DOM Node. It is backwards compatible with
listenTo.Type parameters
K: extends keyof DomEventMap
Parameters
emitter: Window | EventTarget | NodeThe object that fires the event.
event: KThe name of the event.
callback: ( this: this, ev: EventInfo, event: DomEventMap[ K ] ) => voidThe function to be called on event.
options?: CallbackOptions & objectAdditional options.
Returns
void
off( event, callback ) → voidinheritedmodule:ui/tooltipmanager~TooltipManager#offStops executing the callback on the given event. Shorthand for
this.stopListening( this, event, callback ).Parameters
event: stringThe name of the event.
callback: FunctionThe function to stop being called.
Returns
void
on( event, callback, options? ) → voidinheritedmodule:ui/tooltipmanager~TooltipManager#onRegisters a callback function to be executed when an event is fired.
Shorthand for
this.listenTo( this, event, callback, options )(it makes the emitter listen on itself).Type parameters
Parameters
event: TEvent[ 'name' ]The name of the event.
callback: GetCallback<TEvent>The function to be called on event.
options?: GetCallbackOptions<TEvent>Additional options.
Returns
void
once( event, callback, options? ) → voidinheritedmodule:ui/tooltipmanager~TooltipManager#onceRegisters a callback function to be executed on the next time the event is fired only. This is similar to calling
onfollowed byoffin the callback.Type parameters
Parameters
event: TEvent[ 'name' ]The name of the event.
callback: GetCallback<TEvent>The function to be called on event.
options?: GetCallbackOptions<TEvent>Additional options.
Returns
void
registerBodyCollection( bodyCollection, options ) → voidmodule:ui/tooltipmanager~TooltipManager#registerBodyCollectionRegisters a body collection the shared tooltip balloon may be pinned into, so that a tooltip triggered inside its DOM tree is hosted there instead of an unrelated one – keeping it in the same shadow tree, not clipped by or mis-styled across a boundary. Editors register their own body collection; features that render floating UI in their own body collection register it too, which is what lets them display tooltips without an editor.
Parameters
bodyCollection: BodyCollectionThe body collection to register.
options: BodyCollectionRegistrationAdditional sources describing where this collection's tooltip-bearing UI lives.
Defaults to
{}
Returns
void
release() → voidmodule:ui/tooltipmanager~TooltipManager#releaseMarks one holder as done with the singleton (see
for). When the last holder releases it, the singleton unpins the tooltip, destroys the shared balloon and drops every listener.Returns
void
stopDelegating( event?, emitter? ) → voidinheritedmodule:ui/tooltipmanager~TooltipManager#stopDelegatingStops delegating events. It can be used at different levels:
- To stop delegating all events.
- To stop delegating a specific event to all emitters.
- To stop delegating a specific event to a specific emitter.
Parameters
event?: stringThe name of the event to stop delegating. If omitted, stops it all delegations.
emitter?: Emitter(requires
event) The object to stop delegating a particular event to. If omitted, stops delegation ofeventto all emitters.
Returns
void
stopListening( emitter?, event?, callback? ) → voidinheritedmodule:ui/tooltipmanager~TooltipManager#stopListening:BASE_STOPStops listening for events. It can be used at different levels:
- To stop listening to a specific callback.
- To stop listening to a specific event.
- To stop listening to all events fired by a specific object.
- To stop listening to all events fired by all objects.
Parameters
emitter?: EmitterThe object to stop listening to. If omitted, stops it for all objects.
event?: string(Requires the
emitter) The name of the event to stop listening to. If omitted, stops it for all events fromemitter.callback?: Function(Requires the
event) The function to be removed from the call list for the givenevent.
Returns
void
stopListening( emitter?, event?, callback? ) → voidinheritedmodule:ui/tooltipmanager~TooltipManager#stopListening:DOM_STOPStops listening for events. It can be used at different levels: It is backwards compatible with
listenTo.- To stop listening to a specific callback.
- To stop listening to a specific event.
- To stop listening to all events fired by a specific object.
- To stop listening to all events fired by all objects.
Parameters
emitter?: Window | EventTarget | Node | EmitterThe object to stop listening to. If omitted, stops it for all objects.
event?: string(Requires the
emitter) The name of the event to stop listening to. If omitted, stops it for all events fromemitter.callback?: Function(Requires the
event) The function to be removed from the call list for the givenevent.
Returns
void
unregisterBodyCollection( bodyCollection ) → voidmodule:ui/tooltipmanager~TooltipManager#unregisterBodyCollectionReverts
registerBodyCollection: stops hosting the shared balloon in the given collection and drops the listeners set up for it. Pulls the shared balloon out first, so it never dangles in a collection that is going away.Parameters
bodyCollection: BodyCollectionThe body collection to unregister.
Returns
void
_getConnectedBodyCollection( targetDomElement ) → BodyCollection | nullprivatemodule:ui/tooltipmanager~TooltipManager#_getConnectedBodyCollectionReturns the body collection the shared tooltip balloon should be pinned into. The balloon is a singleton, but each registered body collection can live in a different DOM tree (a shadow root, or a configured
ui.overlayContainer). To keep the tooltip in the tree of the hovered element — so it is styled by that tree's sheets and not clipped by another root — the tree is looked up in_bodyCollectionByTree, which maps every tree hosting tooltip-bearing UI (a collection's own mount tree, and an editor's editable, toolbar or menu bar trees) to the collection that should host it.A body collection is mounted lazily and unmounted when its host leaves the document, and a configured
ui.overlayContainermay be detached — a body in either state would render the balloon outside the document and hide tooltips, so the mount target must be connected, not merely set. When no connected body collection hosts the hovered element's tree, it falls back to the first connected registrant, then to the first registered one, and tonullwhen nothing is registered at all.Parameters
targetDomElement: HTMLElementThe element the tooltip is being pinned to.
Returns
BodyCollection | null
_getUpdateEmitters() → Set<Emitter>privatemodule:ui/tooltipmanager~TooltipManager#_getUpdateEmittersReturns the distinct
updateemitters of all registered body collections.Deduplicated, because an emitter can be shared by several registrations (an editor and a feature hosting its own overlay layer both follow the editor's UI update) while listeners are attached per emitter, not per registration – listening once per registration would reposition a pinned tooltip several times per update.
Returns
Set<Emitter>
_moveBalloonToConnectedBodyCollection( targetDomElement ) → booleanprivatemodule:ui/tooltipmanager~TooltipManager#_moveBalloonToConnectedBodyCollectionMoves the shared tooltip balloon into the body collection returned by
_getConnectedBodyCollection, first removing it from any registered body collection that previously hosted it. The balloon is a singleton shared by every registrant, so it must belong to exactly one collection at a time; otherwise unregistering one collection would detach the shared element while another registrant still references it.Parameters
targetDomElement: HTMLElementThe element the tooltip is being pinned to, used to prefer the body collection that hosts its DOM tree.
Returns
booleantrueif a host body collection was found (and the balloon moved into it),falsewhen none is registered and the tooltip therefore cannot be shown.
_onEnterOrFocus( evt, domEvent ) → voidprivatemodule:ui/tooltipmanager~TooltipManager#_onEnterOrFocusHandles displaying tooltips on
mouseenterandfocusin DOM.Parameters
evt: EventInfoAn object containing information about the fired event.
domEvent: anyThe DOM event.
Returns
void
_onKeyDown( evt, domEvent ) → voidprivatemodule:ui/tooltipmanager~TooltipManager#_onKeyDownHandles hiding tooltips on
keydownin DOM.Parameters
evt: EventInfoAn object containing information about the fired event.
domEvent: KeyboardEventThe DOM event.
Returns
void
_onLeaveOrBlur( evt, domEvent ) → voidprivatemodule:ui/tooltipmanager~TooltipManager#_onLeaveOrBlurHandles hiding tooltips on
mouseleaveandblurin DOM.Parameters
evt: EventInfoAn object containing information about the fired event.
domEvent: anyThe DOM event.
Returns
void
_onScroll( evt, domEvent ) → voidprivatemodule:ui/tooltipmanager~TooltipManager#_onScrollHandles hiding tooltips on
scrollin DOM.Parameters
evt: unknownAn object containing information about the fired event.
domEvent: anyThe DOM event.
Returns
void
_pinTooltip( targetDomElement, options ) → voidprivatemodule:ui/tooltipmanager~TooltipManager#_pinTooltipPins the tooltip to a specific DOM element.
Parameters
targetDomElement: HTMLElementElement to be pinned to.
options: TooltipDataOptions for the tooltip.
Returns
void
_rebuild() → voidprivatemodule:ui/tooltipmanager~TooltipManager#_rebuildRebuilds
_bodyCollectionByTreefrom_registrations: every registered collection claims the DOM tree it is mounted in, and – for editors – every shadow root its registry reports (ancestor-inclusive, so nested and decoupled trees resolve too). Then re-syncs the per-shadow-root listeners.Returns
void
_resyncShadowRootListeners() → voidprivatemodule:ui/tooltipmanager~TooltipManager#_resyncShadowRootListenersAttaches or detaches listeners on shadow roots so they match the shadow roots that host tooltip-bearing UI exactly, i.e. the shadow-root keys of
_bodyCollectionByTree.The listeners duplicate the ones on
documentfor two different reasons:mouseenter,mouseleaveandscrollare notcomposed, so their event path ends at the shadow root they originated in and thedocumentlisteners never see them at all. Here the per-root listener is what delivers the event.focusandblurarecomposed, so the capturingdocumentlisteners do see them (the capture phase walks the whole composed path even though these events do not bubble) — but withtargetretargeted to the shadow host, which is useless forgetDescendantWithTooltip(). Here the per-root listener is what provides the real target. It cannot be replaced by readingcomposedPath()[0]ondocument, because that path is truncated at the boundary of aclosedroot.
Since the capture phase runs outwards-in, the
documentlistener fires before these; see theisShadowHostOf()guards in_onEnterOrFocusand_onLeaveOrBlur, which make the outer listeners step aside for the innermost one.Returns
void
_unpinTooltip() → voidprivatemodule:ui/tooltipmanager~TooltipManager#_unpinTooltip_updateTooltipPosition() → voidprivatemodule:ui/tooltipmanager~TooltipManager#_updateTooltipPositionUpdates the position of the tooltip so it stays in sync with the element it is pinned to.
Hides the tooltip when the element is no longer visible in DOM or the tooltip text was removed.
Returns
void
Static methods
for( locale ) → TooltipManagerstaticmodule:ui/tooltipmanager~TooltipManager.forReturns the shared
TooltipManagersingleton, creating it – with the given locale – on first use, and marks one more holder as using it. Every caller must laterreleaseit, so the singleton is destroyed once the last holder is gone.Editors and features obtain the manager this way and then register the body collection their tooltip-bearing UI renders into. A feature therefore does not need an editor reference to display tooltips – it attaches to the same singleton directly.
Parameters
locale: LocaleThe locale used to create the tooltip views on first use.
Returns
getPositioningFunctions( position ) → Array<PositioningFunction>staticmodule:ui/tooltipmanager~TooltipManager.getPositioningFunctionsReturns
balloonPanelViewpositioning functions for a given position name.Parameters
position: TooltipPositionName of the position (
s,se,sw,n,e, orw).
Returns
Array<PositioningFunction>Positioning functions to be used by the
balloonPanelView.