UNPKG

maplair

Version:

JavaScript library for mobile-friendly interactive maps

117 lines (116 loc) • 3.55 kB
import { Point } from "../../geometry/Point.js"; import { off, on, stop } from "../../dom/DomEvent.js"; import { Handler } from "../../core/Handler.js"; //#region src/map/handler/KeyboardHandler.js var KeyboardHandler = class KeyboardHandler extends Handler { static keyCodes = { left: ["ArrowLeft"], right: ["ArrowRight"], down: ["ArrowDown"], up: ["ArrowUp"], zoomIn: [ "Equal", "NumpadAdd", "BracketRight" ], zoomOut: [ "Minus", "NumpadSubtract", "Digit6", "Slash" ] }; constructor(map) { super(map); this._setPanDelta(map.options.keyboardPanDelta); this._setZoomDelta(map.options.zoomDelta); this.callInitHooks(KeyboardHandler); } addHooks() { const container = this._map._container; if (container.tabIndex <= 0) container.tabIndex = "0"; container.ariaKeyShortcuts = Object.values(KeyboardHandler.keyCodes).flat().join(" "); on(container, { focus: this._onFocus, blur: this._onBlur, pointerdown: this._onPointerDown }, this); this._map.on({ focus: this._addHooks, blur: this._removeHooks }, this); } removeHooks() { this._removeHooks(); off(this._map._container, { focus: this._onFocus, blur: this._onBlur, pointerdown: this._onPointerDown }, this); this._map.off({ focus: this._addHooks, blur: this._removeHooks }, this); } _onPointerDown() { if (this._focused) return; const body = document.body, docEl = document.documentElement, top = body.scrollTop || docEl.scrollTop, left = body.scrollLeft || docEl.scrollLeft; this._map._container.focus(); window.scrollTo(left, top); } _onFocus() { this._focused = true; this._map.fire("focus"); } _onBlur() { this._focused = false; this._map.fire("blur"); } _setPanDelta(panDelta) { const keys = this._panKeys = {}, codes = KeyboardHandler.keyCodes; for (const code of codes.left) keys[code] = [-1 * panDelta, 0]; for (const code of codes.right) keys[code] = [panDelta, 0]; for (const code of codes.down) keys[code] = [0, panDelta]; for (const code of codes.up) keys[code] = [0, -1 * panDelta]; } _setZoomDelta(zoomDelta) { const keys = this._zoomKeys = {}, codes = KeyboardHandler.keyCodes; for (const code of codes.zoomIn) keys[code] = zoomDelta; for (const code of codes.zoomOut) keys[code] = -zoomDelta; } _addHooks() { on(document, "keydown", this._onKeyDown, this); } _removeHooks() { off(document, "keydown", this._onKeyDown, this); } _onKeyDown(e) { if (e.altKey || e.ctrlKey || e.metaKey) return; const key = e.code, map = this._map; let offset; if (key in this._panKeys) { if (!map._panAnim || !map._panAnim._inProgress) { offset = this._panKeys[key]; if (e.shiftKey) offset = new Point(offset).multiplyBy(3); if (map.options.maxBounds) offset = map._limitOffset(new Point(offset), map.options.maxBounds); if (map.options.worldCopyJump) { const newLatLng = map.wrapLatLng(map.unproject(map.project(map.getCenter()).add(offset))); map.panTo(newLatLng); } else map.panBy(offset); } } else if (key in this._zoomKeys) map.setZoom(map.getZoom() + (e.shiftKey ? 3 : 1) * this._zoomKeys[key]); else if (key === "Escape" && map._popup && map._popup.options.closeOnEscapeKey) map.closePopup(); else return; stop(e); } static register(MaplairMap) { MaplairMap.mergeOptions({ keyboard: true, keyboardPanDelta: 80 }); MaplairMap.addInitHook("addHandler", "keyboard", KeyboardHandler); } }; //#endregion export { KeyboardHandler }; //# sourceMappingURL=KeyboardHandler.js.map