Sign up (with export icon)

OverlayHost

Api-class iconclass

Keeps a feature's floating UI – its balloons, dialogs, panels and the tooltips inside them – in the right DOM tree, and keeps it there as the feature moves.

For a feature that renders its UI outside an editor, in a container the integrator may put anywhere, including inside a shadow root. An editor's own floating UI needs none of this: it is mounted in the root the editor lives in and stays there.

Why it is needed

Floating UI is mounted through a BodyCollection, and it has to go into the same tree as the feature it belongs to. Anywhere else it loses the styles scoped to that tree, and its tooltips come out clipped or mis-styled across the shadow boundary.

Doing that by hand means re-mounting the collection whenever the container moves, unmounting it while the container is detached, registering and unregistering it with the shared TooltipManager, tracking the shadow roots of the inline UI so that tooltips and click-outside detection reach across boundaries, and tearing it all down in the right order. This class does all of it, behind resolvers that say where the feature's UI currently is.

How to use it

const host = new OverlayHost( locale, {
	resolveMountTarget: () => getOverlayMountRoot( featureContainer ),
	resolveInlineContainer: () => featureContainer
} );

host.sync();
host.bodyCollection.add( balloonPanelView );
Copy code

Add the feature's floating views to bodyCollection. Call sync whenever the container may have moved – right before showing a panel, for instance – and destroy once the feature goes away. It re-syncs on its own too: whenever a view is added to the collection, and on every update event of an updateEmitter, if one is given.

An editor's EditorUI uses this class as well, lending it the body collection and shadow root registry it already has.

Properties

Methods

  • Chevron-right icon

    constructor( locale, options )

    Creates the host: the bodyCollection (unless a borrowed one is given) and its registration in the shared TooltipManager. The collection is not mounted in the DOM yet – call sync for that.

    Parameters

    locale: Locale

    The locale of the feature (used by the body collection and the tooltip views).

    options: OverlayHostOptions

    The resolvers describing where the feature UI lives.

  • Chevron-right icon

    delegate( events ) → EmitterMixinDelegateChain
    inherited

    Delegates selected events to another Emitter. For instance:

    emitterA.delegate( 'eventX' ).to( emitterB );
    emitterA.delegate( 'eventX', 'eventY' ).to( emitterC );
    Copy code

    then eventX is delegated (fired by) emitterB and emitterC along with data:

    emitterA.fire( 'eventX', data );
    Copy code

    and eventY is delegated (fired by) emitterC along with data:

    emitterA.fire( 'eventY', data );
    Copy code

    Parameters

    events: Array<string>

    Event names that will be delegated to another emitter.

    Returns

    EmitterMixinDelegateChain
  • Chevron-right icon

    destroy() → void

    Destroys the host: stops hosting tooltips in the bodyCollection, releases the shared TooltipManager (so it is destroyed with its last holder) and destroys the collection together with its views and the shadowRootRegistry – except the borrowed ones, which their owners destroy. Safe to call more than once.

    Returns

    void
  • Chevron-right icon

    fire( eventOrInfo, args ) → GetEventInfo<TEvent>[ 'return' ]
    inherited

    Fires an event, executing all callbacks registered for it.

    The first parameter passed to callbacks is an EventInfo object, followed by the optional args provided in the fire() method call.

    Type parameters

    TEvent: extends BaseEvent

    The type describing the event. See BaseEvent.

    Parameters

    eventOrInfo: GetNameOrEventInfo<TEvent>

    The name of the event or EventInfo object 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 the evt.return's property (the event info is the first param of every callback).

  • Chevron-right icon

    listenTo( emitter, event, callback, options? ) → void
    inherited

    Registers 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.

    // 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' );
    Copy code

    An event callback can stop the event and set the return value of the fire method.

    Type parameters

    TEvent: extends BaseEvent

    The type describing the event. See BaseEvent.

    Parameters

    emitter: Emitter

    The 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
  • Chevron-right icon

    off( event, callback ) → void
    inherited

    Stops executing the callback on the given event. Shorthand for this.stopListening( this, event, callback ).

    Parameters

    event: string

    The name of the event.

    callback: Function

    The function to stop being called.

    Returns

    void
  • Chevron-right icon

    on( event, callback, options? ) → void
    inherited

    Registers 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

    TEvent: extends BaseEvent

    The type descibing the event. See BaseEvent.

    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
  • Chevron-right icon

    once( event, callback, options? ) → void
    inherited

    Registers a callback function to be executed on the next time the event is fired only. This is similar to calling on followed by off in the callback.

    Type parameters

    TEvent: extends BaseEvent

    The type descibing the event. See BaseEvent.

    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
  • Chevron-right icon

    stopDelegating( event?, emitter? ) → void
    inherited

    Stops 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?: string

    The 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 of event to all emitters.

    Returns

    void
  • Chevron-right icon

    stopListening( emitter?, event?, callback? ) → void
    inherited

    Stops 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?: Emitter

    The 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 from emitter.

    callback?: Function

    (Requires the event) The function to be removed from the call list for the given event.

    Returns

    void
  • Chevron-right icon

    sync() → void

    Brings the host up to date with the resolved targets:

    • keeps the bodyCollection mounted in the target resolved by resolveMountTarget (re-mounting only when the target changes, unmounting on null);
    • keeps the inline UI container tracked for tooltips, re-resolving its shadow root in case a detached container has become connected.

    Idempotent – call it whenever the targets may have changed: after attaching the feature to a container, right before showing a floating panel (an editor's UI may be mounted lazily), or on any relevant layout change.

    Returns

    void