maplibre-gl
Version:
BSD licensed community fork of mapbox-gl, a WebGL interactive maps library
87 lines (75 loc) • 2.49 kB
text/typescript
import {DOM} from '../../util/dom';
import type {Map} from '../map';
import type {ControlPosition, IControl} from './control';
/**
* The {@link LogoControl} options object
*/
type LogoControlOptions = {
/**
* If `true`, force a compact logo.
* If `false`, force the full logo. The default is a responsive logo that collapses when the map is less than 640 pixels wide.
*/
compact?: boolean;
};
/**
* A `LogoControl` is a control that adds the watermark.
*
* @group Markers and Controls
*
* @example
* ```ts
* map.addControl(new LogoControl({compact: false}));
* ```
**/
export class LogoControl implements IControl {
options: LogoControlOptions;
_map: Map;
_compact: boolean;
_container: HTMLElement;
/**
* @param options - the control's options
*/
constructor(options: LogoControlOptions = {}) {
this.options = options;
}
getDefaultPosition(): ControlPosition {
return 'bottom-left';
}
/** {@inheritDoc IControl.onAdd} */
onAdd(map: Map) {
this._map = map;
this._compact = this.options && this.options.compact;
this._container = DOM.create('div', 'maplibregl-ctrl');
const anchor = DOM.create('a', 'maplibregl-ctrl-logo');
anchor.target = '_blank';
anchor.rel = 'noopener nofollow';
anchor.href = 'https://maplibre.org/';
anchor.setAttribute('aria-label', this._map._getUIString('LogoControl.Title'));
anchor.setAttribute('rel', 'noopener nofollow');
this._container.appendChild(anchor);
this._container.style.display = 'block';
this._map.on('resize', this._updateCompact);
this._updateCompact();
return this._container;
}
/** {@inheritDoc IControl.onRemove} */
onRemove() {
DOM.remove(this._container);
this._map.off('resize', this._updateCompact);
this._map = undefined;
this._compact = undefined;
}
_updateCompact = () => {
const containerChildren = this._container.children;
if (containerChildren.length) {
const anchor = containerChildren[0];
if (this._map.getCanvasContainer().offsetWidth <= 640 || this._compact) {
if (this._compact !== false) {
anchor.classList.add('maplibregl-compact');
}
} else {
anchor.classList.remove('maplibregl-compact');
}
}
};
}